Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Драйвер может создать объект обратного вызова, с помощью которого другие драйверы могут запрашивать уведомления об условиях, определенных создаваемым драйвером. На следующем рисунке показаны шаги, связанные с определением объекта обратного вызова.
Перед созданием объекта драйвер вызывает InitializeObjectAttributes , чтобы задать его атрибуты. Объект обратного вызова должен иметь имя, которое не может соответствовать имени системного обратного вызова; он может иметь любые другие атрибуты, которые его создатель считает соответствующими, как правило, OBJ_CASE_INSENSITIVE. Далее драйвер вызывает ExCreateCallback, передавая указатель на инициализированные атрибуты и место для получения дескриптора объекта обратного вызова. Он также передает два булевых значения, указывая, должна ли система создавать объект обратного вызова, если такой именованный объект еще не существует, и должен ли объект разрешать более одной зарегистрированной процедуры обратного вызова.
Драйвер определяет условия, при которых он будет вызывать зарегистрированные обратные вызовы. Условия принимают форму двух аргументов, каждый из которых указывает на параметр, определенный драйвером, который создает обратный вызов. Эти условия следует задокументировать вместе с именем объекта обратного вызова и IRQL, по которому он запрашивает уведомление для клиентов драйвера.
При возникновении условия обратного вызова драйвер вызывает ExNotifyCallback, передав его дескриптор объекту обратного вызова и двум аргументам. Затем система вызывает все подпрограммы обратного вызова, зарегистрированные для объекта обратного вызова, в том порядке, в котором они были зарегистрированы, передав два аргумента и указатель на контекст, предоставленный при регистрации подпрограммы. Драйвер должен вызвать ExNotifyCallback в IRQL <= DISPATCH_LEVEL; система вызывает подпрограммы обратного вызова в том же IRQL, в котором драйвер сделал этот вызов.
После завершения всех операций с объектом обратного вызова драйвер, создавший обратный вызов, должен вызвать ObDereferenceObject для уменьшения его количества ссылок и убедиться, что объект удален.