----------------------------------------- Код ядра: 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 созданый сервисом не виден по имени процессу пользователя. Что делать?
Читать документацию. 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 Выполняет эти условия?
Конечно. Всё под администратором. И тем более OpenEvent возращает не ERROR_ACCESS_DENIED, а ERROR_FILE_NOT_FOUND - оно просто не видит этого Event'а. То же самое происходит, если сервис создаёт mutex, а приложение юзермода его не видит опять же. Начинается это с новых ядер Vista, 2008, 7.
bolter В каком месте создается EVENT ? Эвент лучше создовать в приложении и передовать хендел в драйвер.
shchetinin Создаёт драйвер. Win32 subsystem уже инициализирована. Если вопрос про это. Нужно именно в драйвере.