Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Чтобы использовать синхронное уведомление драйвера, драйвер устройства реализует функцию обратного вызова, которая вызывается операционной системой при динамическом добавлении нового процессора в раздел оборудования. Следующий пример кода является прототипом для такой функции обратного вызова:
// 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
);
...
}