다음을 통해 공유


동기 드라이버 알림 등록

동기 드라이버 알림을 사용하기 위해 디바이스 드라이버는 하드웨어 파티션에 새 프로세서를 동적으로 추가할 때 운영 체제에서 호출하는 콜백 함수를 구현합니다. 다음 코드 예제는 이러한 콜백 함수에 대한 프로토타입입니다.

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

  ...
}