Программирование драйверов Windows


Объекты события - часть 4


Последующие вызовы (с целью создания объекта с тем же именем) нового объекта не создадут, а всего лишь возвратят дескриптор, относящийся к уже существующему объекту события.

При использовании именованного объекта события совместно драйвером и приложением пользовательского режима следует создавать такой объект сначала в пользовательском приложении. Причина кроется в том, что пользовательские объекты события должны размещаться в директории объектов \BaseNamedObjects, которая создается после инициализации подсистемы Win32 и к моменту запуска драйвера, возможно, еще не существует. После этого, в результате IOCTL запроса (выступающего в роли команды) к драйверу, последний должен получить доступ к объекту события по заранее определенному имени либо должен получить некоторую дополнительную информацию из IOCTL запроса &#8212 имя или дескриптор созданного объекта события.

Таблица 10.30. Прототип вызовов IoCreateSynchronization(Notification)Event

PKEVENT IoCreateSynchronizationEvent

PKEVENT IoCreateNotificationEvent

IRQL == PASSIVE_LEVEL
Параметры Создает новый или получает доступ к существующему объекту события по имени
IN PUNICODE_STRING EventName Имя объекта, заканчивающаяся нулем строка широких (UNICODE) символов
OUT PHANDLE EventHandle Указатель, по которому будет возвращен дескриптор объекта.
Возвращаемое значение

Указатель на созданный или существующий объект события с данным именем либо NULL в случае ошибки.

Для работы драйверу требуется указатель на объект события. Его можно получить из дескриптора существующего объекта следующим способом.

  • Выполнить вызов ObReferenceObjectByHandle. Эта функция возвращает указатель на собственно объект и увеличивает на единицу число ссылок на данный объект.
  • Поскольку собственно дескриптор становится ненужным, необходимо вы полнить вызов ZwClose со значением дескриптора. Эта функция выполнит уменьшение на единицу счетчика ссылок на данный объект.
  • Когда объект события станет ненужным, необходимо выполнить вызов ObDereferenceObject

    для того, чтобы уменьшить на единицу счетчик ссылок на объект, что, возможно, уничтожит его.

Эти вызовы могут быть выполнены только с уровня IRQL равного PASSIVE_LEVEL, что накладывает ограничения на то, где драйвер сможет их использовать.

В том случае, если драйвер получает от приложения дескриптор через IOCTL запрос, то этот дескриптор имеет силу, поскольку код драйвера (обработчика IOCTL запросов) работает в контексте пользовательского потока, обратившегося к драйверу.

Пример использования объекта события для синхронизации работы приложения и драйвера можно найти в следующей главе.




Начало  Назад  Вперед