同期ドライバー通知登録

同期ドライバー通知を使用するため、デバイス ドライバーは、ハードウェア パーティションに新しいを動的に追加するときにオペレーティング システムが呼び出すコールバック関数を実装します。 次のコード サンプルは、このようなコールバック関数のプロトタイプです。

// 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
    );

  ...
}