Регистрация для получения уведомлений синхронного драйвера
Чтобы использовать синхронное уведомление драйвера, драйвер устройства реализует функцию обратного вызова, которую операционная система вызывает при динамическом добавлении нового процессора в аппаратный раздел. Следующий пример кода является прототипом такой функции обратного вызова:
// Prototype for the synchronous
// notification callback function
VOID
SyncProcessorCallback(
IN PVOID CallbackContext,
IN PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT ChangeContext,
IN PNTSTATUS OperationStatus
);
Драйвер устройства регистрирует синхронное уведомление драйвера, вызывая функцию KeRegisterProcessorChangeCallback . Драйвер устройства обычно вызывает функцию KeRegisterProcessorChangeCallback из функции DriverEntry . Если драйвер устройства задает флаг KE_PROCESSOR_CHANGE_ADD_EXISTING, функция обратного вызова немедленно вызывается для каждого активного процессора, который в настоящее время существует в аппаратном разделе, а не при добавлении нового процессора в аппаратный раздел. В следующем примере кода показано, как зарегистрировать синхронные уведомления драйвера:
PVOID CallbackRegistrationHandle;
NTSTATUS CallbackStatus = STATUS_SUCCESS;
// The driver's DriverEntry routine
NTSTATUS DriverEntry(
PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegistryPath
)
{
...
// Register the callback function
CallbackRegistrationHandle =
KeRegisterProcessorChangeCallback(
SyncProcessorCallback,
&CallbackStatus,
KE_PROCESSOR_CHANGE_ADD_EXISTING
);
// Check the result
if (CallbackRegistrationHandle == NULL)
{
// Perform any necessary cleanup
...
// Check the callback status
if (CallbackStatus != STATUS_SUCCESS)
{
// Return the error status from the callback function
return CallbackStatus;
}
else
{
// Return a generic error status
return STATUS_UNSUCCESSFUL;
}
}
...
return STATUS_SUCCESS;
}
Когда драйвер устройства должен прекратить получать синхронные уведомления драйвера, например при выгрузке, он должен отменить регистрацию функции обратного вызова, вызвав функцию KeDeregisterProcessorChangeCallback . Драйвер устройства обычно вызывает функцию KeDeregisterProcessorChangeCallback из функции Unload . В следующем примере кода показано, как отменить регистрацию функции обратного вызова:
// The driver's Unload routine
VOID
Unload(
IN PDRIVER_OBJECT DriverObject
);
{
...
// Unregister the callback function
KeDeregisterProcessorChangeCallback(
CallbackRegistrationHandle
);
...
}