同期ドライバー通知登録
同期ドライバー通知を使用するため、デバイス ドライバーは、ハードウェア パーティションに新しいを動的に追加するときにオペレーティング システムが呼び出すコールバック関数を実装します。 次のコード サンプルは、このようなコールバック関数のプロトタイプです。
// Prototype for the synchronous
// notification callback function
VOID
SyncProcessorCallback(
IN PVOID CallbackContext,
IN PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT ChangeContext,
IN PNTSTATUS OperationStatus
);
デバイス ドライバーは、KeRegisterProcessorChangeCallback 関数を呼び出して、同期ドライバー通知に登録します。 デバイス ドライバーは通常、その DriverEntry 関数内から KeRegisterProcessorChangeCallback 関数を呼び出します。 デバイス ドライバーが 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 関数を呼び出して各コールバック関数の登録を解除する必要があります。 デバイス ドライバーは通常、その Unload 関数内から KeDeregisterProcessorChangeCallback 関数を呼び出します。 次のコード サンプルは、コールバック関数の登録を解除する方法を示します。
// The driver's Unload routine
VOID
Unload(
IN PDRIVER_OBJECT DriverObject
);
{
...
// Unregister the callback function
KeDeregisterProcessorChangeCallback(
CallbackRegistrationHandle
);
...
}