Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Чтобы использовать объект обратного вызова, определенный другим драйвером, драйвер открывает объект, а затем регистрирует подпрограмму для вызова при активации обратного вызова, как показано на следующем рисунке. Драйвер, запрашивающий уведомление, должен знать имя объекта обратного вызова и понимать семантику аргументов, переданных в подпрограмму обратного вызова.
Прежде чем он сможет открыть объект, драйвер должен вызвать InitializeObjectAttributes , чтобы создать блок атрибутов, указав имя объекта. После того как он имеет указатель на блок атрибутов, он вызывает ExCreateCallback, передав указатель атрибута, расположение для получения дескриптора обратного вызова и FALSE для параметра Create , указывающее, что для него требуется существующий объект обратного вызова.
Затем драйвер может вызвать ExRegisterCallback с возвращенным дескриптором для регистрации процедуры обратного вызова.
Подпрограмма обратного вызова имеет следующий прототип:
typedef VOID (*PCALLBACK_FUNCTION ) (
IN PVOID CallbackContext,
IN PVOID Argument1,
IN PVOID Argument2
);
Параметр CallbackContext — это указатель контекста, передаваемый в подпрограмму обратного вызова при каждом вызове. Как правило, этот параметр является указателем на блок данных контекста, который вызывающая функция должна выделить из нестраничного пула, если рутинная функция может быть вызвана на уровне DISPATCH_LEVEL. Два аргумента определяются компонентом, создающим обратный вызов. Как правило, аргументы предоставляют сведения об условиях, которые активировали обратный вызов.
Когда создатель обратного вызова активирует уведомление, система вызывает зарегистрированную подпрограмму, передавая указатель на контекст и два аргумента. Значения аргументов предоставляются компонентом, создающим обратный вызов. Подпрограмма обратного вызова вызывается на том же уровне IRQL, на котором драйвер, создающий событие, активирует уведомление, что всегда соответствует уровню IRQL <= DISPATCH_LEVEL.
В подпрограмме обратного вызова драйвер может выполнять все необходимые задачи для текущих условий.
Если драйвер больше не требует уведомления, он должен вызвать ExUnregisterCallback , чтобы удалить свою подпрограмму из списка зарегистрированных обратных вызовов и удалить ее ссылку на объект обратного вызова.