Открытие event'ов ядра в юзермоде под Windows Vista, 7

Тема в разделе "WASM.NT.KERNEL", создана пользователем bolter, 5 сен 2011.

  1. bolter

    bolter New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2011
    Сообщения:
    4
    -----------------------------------------
    Код ядра:

    HANDLE hLockEvent = NULL;
    UNICODE_STRING uLockEvent;
    ::RtlInitUnicodeString(&uLockEvent, L"\\BaseNamedObjects\\evtname");

    ::IoCreateSynchronizationEvent(&uLockEvent, &hLockEvent);


    Ивент создаётся, в WinObj в каталоге BaseNamedObjects его видно.


    -----------------------------------------
    Код юзермода:

    ::OpenEvent(EVENT_MODIFY_STATE, FALSE, "evtname");


    Под Windows XP ивент открывается. Под Vista OpenEvent возращает NULL, а код ошибки ERROR_FILE_NOT_FOUND.

    До этого сталкивался с проблемой, что под Win 2008 mutex созданый сервисом не виден по имени процессу пользователя.

    Что делать?
     
  2. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Читать документацию.

    Sharing event objects between user mode and kernel mode requires care. There are two main methods for sharing event objects:

    The user-mode application creates the event object and passes a handle to the object to the driver by sending an IOCTL to the driver. The driver must handle the IOCTL in the context of the process that created the event object and must validate the handle by calling ObReferenceObjectByHandle. This method is the recommended method for sharing event objects between user and kernel modes.

    The driver creates a named event object in the \\BaseNamedObjects object directory. You can open a kernel-mode event named \\BaseNamedObjects\Xxx in user mode under the name Xxx. Note that security settings can prevent an application from opening the event. For more information, see the OpenEvent Fails in a Non-Administrator Account KB article. The \\BaseNamedObjects object directory is not created until the Microsoft Win32 subsystem initializes, so drivers that are loaded at boot time cannot create event objects in the \\BaseNamedObjects directory in their DriverEntry routines


    Выполняет эти условия?
     
  3. bolter

    bolter New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2011
    Сообщения:
    4
    Конечно. Всё под администратором. И тем более OpenEvent возращает не ERROR_ACCESS_DENIED, а ERROR_FILE_NOT_FOUND - оно просто не видит этого Event'а.
    То же самое происходит, если сервис создаёт mutex, а приложение юзермода его не видит опять же.
    Начинается это с новых ядер Vista, 2008, 7.
     
  4. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    bolter
    В каком месте создается EVENT ?

    Эвент лучше создовать в приложении и передовать хендел в драйвер.
     
  5. bolter

    bolter New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2011
    Сообщения:
    4
    shchetinin
    Создаёт драйвер. Win32 subsystem уже инициализирована. Если вопрос про это.

    Нужно именно в драйвере.
     
  6. rav

    rav New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2004
    Сообщения:
    159
    Адрес:
    Москва
    Потому что открывать надо с префиксом Global\.
     
  7. bolter

    bolter New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2011
    Сообщения:
    4
    rav
    Спасибо. Помогло.