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


Использование объекта обратного вызова System-Defined

Система определяет три объекта обратного вызова для использования драйверами:

\Callback\SetSystemTime

\Callback\PowerState

\Callback\ProcessorAdd

Драйверы, использующие системное время (например, драйверы файловой системы), могут регистрироваться для объекта обратного вызова \Callback\SetSystemTime . Этот обратный вызов обеспечивает уведомление при изменении системного времени.

Объект обратного вызова \Callback\PowerState предоставляет уведомление при возникновении одного из следующих событий:

  • Система переключается с переменного тока на питание постоянного тока или наоборот.

  • Политика управления питанием системы изменяется в результате запроса пользователя или приложения.

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

Обратный вызов \Callback\ProcessorAdd предоставляет уведомление при добавлении нового процессора в систему.

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

С дескриптором, возвращенным ExCreateCallback, драйвер вызывает ExRegisterCallback для регистрации процедуры уведомления, передавая указатель на произвольный контекст и указатель на ее подпрограмму. Драйвер может зарегистрировать свою процедуру обратного вызова в любое время. При возникновении указанного условия система вызывает зарегистрированную подпрограмму обратного вызова в IRQL<=DISPATCH_LEVEL.

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