Руководствуясь статьей http://www.wasm.ru/article.php?article=drvw2k14 и примером из WDK \general\event) Я начал писать синхронизацию драйвера и юзермода. 1. В юзермод делаю так: Код (Text): var hEvent, hDriver:DWORD; begin hDriver := CreateFile('\\.\MyDev1', GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0); if hDriver<>INVALID_HANDLE_VALUE then begin hEvent:= CreateEvent( nil, FALSE, FALSE, nil); Memo1.Lines.Add('h_Event = '+inttostr(hEvent)); DeviceIoControl(hDriver, IOCTL_SET_NOTIFY, @hEvent, sizeof(hEvent), nil, 0, returned, nil ); Далее в драйвере у меня обработчик Код (Text): DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DriverDispatcher; Начало этого обработчика Код (Text): NTSTATUS DriverDispatcher( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { PIO_STACK_LOCATION irpStack; ULONG ioControlCode; NTSTATUS status ; LARGE_INTEGER liDelayTime; HANDLE h_Event; irpStack = IoGetCurrentIrpStackLocation (Irp); ioControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode; switch( irpStack->Parameters.DeviceIoControl.IoControlCode ) { case IOCTL_SET_NOTIFY: DPRINT("IOCTL_SET_NOTIFY"); if (irpStack->Parameters.DeviceIoControl.InputBufferLength >= sizeof(HANDLE)) { // СИГНАЛ НА УВЕДОМЛЕНИЕ if (g_fbNotifyRoutineSet == FALSE) {DPRINT("TRY TO --->>> _SET_NOTIFY"); h_Event = (HANDLE)Irp->AssociatedIrp.SystemBuffer; DPRINT("h_Event = %ld (%X)", h_Event, h_Event); status = ObReferenceObjectByHandle(h_Event, EVENT_MODIFY_STATE, *ExEventObjectType, UserMode, &g_pkEventObject, NULL ); DPRINT("status = %X", status); } Все хорошо, дебугпринт выводит что до этого куска кода мы дошли. Получаю что хендл в юзермоде создается, а тут мне выводится значение: h_event = -1982210680 (89D9DD88) Ну и соответсвтенно ObReferenceObjectByHandle мне дает ошибку С0000008, что означает что отсуствует хендл. Все логично. Но что я сделал ни так? Вот кусок кода из статьи ДРАВЙЕР: Код (Text): mov edx, [esi].AssociatedIrp.SystemBuffer mov edx, [edx] mov ecx, ExEventObjectType mov ecx, [ecx] mov ecx, [ecx] invoke ObReferenceObjectByHandle, edx, EVENT_MODIFY_STATE, ecx, \ UserMode, addr g_pkEventObject, NULL Тамошний Юзермод: Код (Text): invoke CreateFile, $CTA0("\\\\.\\ProcessMon"), \ GENERIC_READ + GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL .if eax != INVALID_HANDLE_VALUE mov g_hDevice, eax invoke DeleteService, g_hService invoke CreateEvent, NULL, FALSE, FALSE, NULL mov g_hEvent, eax and g_fbExitNow, FALSE push eax invoke CreateThread, NULL, 0, offset WaitForProcessData, g_hEvent, 0, esp pop ecx .if eax != NULL invoke CloseHandle, eax ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: invoke DeviceIoControl, g_hDevice, IOCTL_SET_NOTIFY, \ addr g_hEvent, sizeof g_hEvent, NULL, 0, addr dwBytesReturned, NULL .if eax != 0 .... Вот. Вроде у меня аналогично переписано в С Только в драйвентри у меня deviceObject->Flags |= DO_BUFFERED_IO; Чтобы можно было общаться через WriteFile/ReadFile Однако если закомментировать, то тоже самое получается.. Вот меня эти строки смущают, что у меня в коде они не так работают.. Код (Text): mov edx, [esi].AssociatedIrp.SystemBuffer mov edx, [edx] mov ecx, ExEventObjectType mov ecx, [ecx] mov ecx, [ecx] Первые 2 строки значат (в АСМЕ не оч. хорошо понимаю, могу ошибаться) 1. Записываем значение в регистр едх, 2. а потом в него же записывается значение по тому адресу? Вот в другом примере выглядит так: Код (Text): registerEvent = (PREGISTER_EVENT)Irp->AssociatedIrp.SystemBuffer; .. status = ObReferenceObjectByHandle(registerEvent->hEvent, SYNCHRONIZE, *ExEventObjectType, Irp->RequestorMode, ¬ifyRecord->Event, NULL ); .. typedef struct _REGISTER_EVENT { NOTIFY_TYPE Type; HANDLE hEvent; LARGE_INTEGER DueTime; // requested DueTime in 100-nanosecond units } REGISTER_EVENT , *PREGISTER_EVENT ; Запутался я с указателями, значениями на указатели и тд.. Помогите пожалуйста разобраться.. Я уже по всякому перепробовал... Спасибо.
SystemBuffer - указатель на буфер в котором лежит хендл. Д.б. так: Код (Text): h_Event = *(HANDLE*)Irp->AssociatedIrp.SystemBuffer; PS: Остальное не смотрел.