Поделиться через


Определение объекта обратного вызова

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

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

Перед созданием объекта драйвер вызывает InitializeObjectAttributes , чтобы задать его атрибуты. Объект обратного вызова должен иметь имя, которое не может совпадать с именем системного обратного вызова; он может иметь любые другие атрибуты, которые его создатель считает подходящими, как правило, OBJ_CASE_INSENSITIVE. Затем драйвер вызывает ExCreateCallback, передав указатель на инициализированные атрибуты и расположение для получения дескриптора объекта обратного вызова. Он также передает два логических значения, указывая, должна ли система создать объект обратного вызова, если такой именованный объект еще не существует, и должен ли объект разрешать более одной зарегистрированной процедуры обратного вызова.

Драйвер определяет условия, для которых он будет вызывать зарегистрированные подпрограммы обратного вызова. Условия принимают форму двух аргументов, каждый из которых указывает на параметр, определенный драйвером, создающим обратный вызов. Необходимо задокументировать эти условия, а также имя объекта обратного вызова и IRQL, по которому он запрашивает уведомление, для клиентов драйвера.

При возникновении условия обратного вызова драйвер вызывает ExNotifyCallback, передавая свой дескриптор объекту обратного вызова и двум аргументам. Затем система вызывает все подпрограммы обратного вызова, зарегистрированные для объекта обратного вызова, в том порядке, в котором они были зарегистрированы, передавая два аргумента и указатель на контекст, указанный при регистрации подпрограммы. Драйвер должен вызвать ExNotifyCallback по адресу IRQL <= DISPATCH_LEVEL; система вызывает подпрограммы обратного вызова в том же IRQL, в котором драйвер сделал этот вызов.

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