Объекты события - часть 4
Последующие вызовы (с целью создания объекта с тем же именем) нового объекта не создадут, а всего лишь возвратят дескриптор, относящийся к уже существующему объекту события.
При использовании именованного объекта события совместно драйвером и приложением пользовательского режима следует создавать такой объект сначала в пользовательском приложении. Причина кроется в том, что пользовательские объекты события должны размещаться в директории объектов \BaseNamedObjects, которая создается после инициализации подсистемы Win32 и к моменту запуска драйвера, возможно, еще не существует. После этого, в результате IOCTL запроса (выступающего в роли команды) к драйверу, последний должен получить доступ к объекту события по заранее определенному имени либо должен получить некоторую дополнительную информацию из IOCTL запроса — имя или дескриптор созданного объекта события.
Таблица 10.30. Прототип вызовов IoCreateSynchronization(Notification)Event
PKEVENT IoCreateSynchronizationEvent PKEVENT IoCreateNotificationEvent |
IRQL == PASSIVE_LEVEL |
Параметры | Создает новый или получает доступ к существующему объекту события по имени |
IN PUNICODE_STRING EventName | Имя объекта, заканчивающаяся нулем строка широких (UNICODE) символов |
OUT PHANDLE EventHandle | Указатель, по которому будет возвращен дескриптор объекта. |
Возвращаемое значение |
Указатель на созданный или существующий объект события с данным именем либо NULL в случае ошибки. |
Для работы драйверу требуется указатель на объект события. Его можно получить из дескриптора существующего объекта следующим способом.
для того, чтобы уменьшить на единицу счетчик ссылок на объект, что, возможно, уничтожит его.
Эти вызовы могут быть выполнены только с уровня IRQL равного PASSIVE_LEVEL, что накладывает ограничения на то, где драйвер сможет их использовать.
В том случае, если драйвер получает от приложения дескриптор через IOCTL запрос, то этот дескриптор имеет силу, поскольку код драйвера (обработчика IOCTL запросов) работает в контексте пользовательского потока, обратившегося к драйверу.
Пример использования объекта события для синхронизации работы приложения и драйвера можно найти в следующей главе.