Использование объекта обратного вызова System-Defined
Система определяет три объекта обратного вызова для использования драйверами:
\Callback\SetSystemTime
\Callback\PowerState
\Callback\ProcessorAdd
Драйверы, использующие системное время (например, драйверы файловой системы), могут регистрироваться для объекта обратного вызова \Callback\SetSystemTime . Этот обратный вызов обеспечивает уведомление при изменении системного времени.
Объект обратного вызова \Callback\PowerState предоставляет уведомление при возникновении одного из следующих событий:
Система переключается с переменного тока на питание постоянного тока или наоборот.
Политика управления питанием системы изменяется в результате запроса пользователя или приложения.
Переход в состояние спящего режима или завершения работы системы неизбежен. Драйвер может запросить уведомление, чтобы он смог заблокировать код в памяти в ожидании завершения работы. Процедуры обратного вызова будут уведомлены до того, как диспетчер питания отправит IRP для настройки питания системы.
Обратный вызов \Callback\ProcessorAdd предоставляет уведомление при добавлении нового процессора в систему.
Чтобы использовать системный обратный вызов, драйвер инициализирует блок атрибутов, вызывая InitializeObjectAttributes с именем обратного вызова, а затем открывает объект обратного вызова (ExCreateCallback) так же, как и для обратного вызова, определенного драйвером. Драйвер не должен запрашивать создание объекта обратного вызова.
С дескриптором, возвращенным ExCreateCallback, драйвер вызывает ExRegisterCallback для регистрации процедуры уведомления, передавая указатель на произвольный контекст и указатель на ее подпрограмму. Драйвер может зарегистрировать свою процедуру обратного вызова в любое время. При возникновении указанного условия система вызывает зарегистрированную подпрограмму обратного вызова в IRQL<=DISPATCH_LEVEL.
Если драйвер больше не требует уведомления, он должен вызвать ExUnregisterCallback , чтобы удалить свою подпрограмму обратного вызова из списка зарегистрированных обратных вызовов и удалить ссылку на объект обратного вызова.