Синхронизация драйвера и приложения

Тема в разделе "WASM.NT.KERNEL", создана пользователем 0x56, 5 янв 2008.

  1. 0x56

    0x56 New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2008
    Сообщения:
    63
    Помогите реализовать задуманное.

    Статью "Sharing Events Between Kernel and User Mode" прочитал.
    IoCreateNotificationEvent не подходит мне, потому как создает Event если приложение не создало его.
    В статье так же правильно подмечено, что создавать Event лучше в приложении, а открывать в ядре.

    Поэтому хотел реализовать такую схему, где программа создаёт Event, и тут же ожидает свободного состояния его.
    Драйвер открыл Event, сделал определенную работу, просигналил об этом программе, и тут же переходит в ожидающее состояние.
    После чего уже программа сигналит драйверу.

    Код (Text):
    1.         hInitEvent = CreateEvent(NULL, FALSE, FALSE, sInitEvent);      
    2.         if(hInitEvent)
    3.         {
    4.             dw=WaitForSingleObject(hInitEvent,10000); // 10 sec
    5.  
    6.             if(dw==WAIT_OBJECT_0)
    7.             {
    8.                                              ...........
    9.                                              ...........
    10.  
    11.                 SetEvent(hInitEvent);
    12.                 Sleep(1000);
    13.             }
    14.  
    15.             CloseHandle(hInitEvent);
    16.                       }
    Код (Text):
    1.              ...........
    2.              RtlAppendUnicodeToString(&usInitEvent, L"\\BaseNamedObjects\\");
    3.              ...........
    4.  
    5.              for(;;)
    6.              {
    7.  
    8.         InitializeObjectAttributes(&ObjectAttributes, &usInitEvent, OBJ_KERNEL_HANDLE, NULL, NULL);
    9.         ns = ZwOpenEvent(hInitEvent, SYNCHRONIZE | EVENT_MODIFY_STATE, &ObjectAttributes);
    10.  
    11.         if(ns == STATUS_SUCCESS)
    12.         {
    13.                                  ...........
    14.                                  ...........
    15.  
    16.             ZwSetEvent(hInitEvent, NULL);
    17.             KeWaitForSingleObject(&hInitEvent, Executive, KernelMode, FALSE, &TimeoutWaitUserThread);
    18.  
    19.                                  ...........
    20.                                  ...........
    21.  
    22.             ZwClose(hInitEvent);
    23.         }
    Результат такой:

     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Функция ZwOpenEvent открывает обьект "Событие" и возвращает его хэндл.
    У тебя hInitEvent=NULL, а должен быть указатель на переменную, принимающую хэндл.
    Поэтому и возникает исключение STATUS_ACCESS_VIOLATION.
     
  3. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Подобная схема реализуется с помощью механизма "inverted call".
    http://www.osronline.com/custom.cfm?name=articlePrint.cfm&id=94
     
  4. 0x56

    0x56 New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2008
    Сообщения:
    63
    Clerk точно
    Four-F спасибо за доп информацию