Compartilhar via


Registrando-se para notificação de eventos de erro de hardware

Para se registrar para ser notificado sobre novos eventos de erro de hardware, um aplicativo cria uma assinatura para todos os eventos gerados pelo canal Microsoft-Windows-Kernel-WHEA/Errors .

Esse canal é recomendado para cenários de servidor. Embora os dados não sejam imediatamente legíveis por humanos, eles são um CPER (Registro de Erro de Plataforma Comum) definido por ACPI/UEFI. Em comparação com o provedor Microsoft-Windows-WHEA-Logger , esse formato fornece muito mais detalhes sobre as especificidades exatas de cada evento de erro de hardware.

O exemplo de código a seguir mostra como se registrar para a notificação de novos eventos de erro de hardware.

// Prototype for the notification callback function
DWORD WINAPI HwErrorEventCallback(
  EVT_SUBSCRIBE_NOTIFY_ACTION Action,
  PVOID Context,
  EVT_HANDLE EventHandle
  );

// Function to create a subscription to all hardware error
// events that are raised by the WHEA provider.
EVT_HANDLE SubscribeHwErrorEvents(VOID)
{
  EVT_HANDLE SubHandle;

  // Create a subscription to all events that are sent
  // to the WHEA channel.
#if (WINVER <= _WIN32_WINNT_LONGHORN)
  SubHandle =
    EvtSubscribe(
      NULL,
      NULL,
      L"Microsoft-Windows-Kernel-WHEA", 
      L"*",
      NULL,
      NULL,
      HwErrorEventCallback,
      EvtSubscribeToFutureEvents
      );
#else
  SubHandle =
    EvtSubscribe(
      NULL,
      NULL,
      L" Microsoft-Windows-Kernel-WHEA/Errors", 
      L"*",
      NULL,
      NULL,
      HwErrorEventCallback,
      EvtSubscribeToFutureEvents
      );
#endif

   // Return the subscription handle
   return SubHandle;
}

// Notification callback function
DWORD WINAPI HwErrorEventCallback(
  EVT_SUBSCRIBE_NOTIFY_ACTION Action,
  PVOID Context,
  EVT_HANDLE EventHandle
  )
{
  // Check the action
  if (Action == EvtSubscribeActionDeliver) {

    // Process the hardware error event
    ProcessHwErrorEvent(EventHandle);
  }

  // Return success status
  return ERROR_SUCCESS;
}

// Function to terminate the subscription
VOID UnsubscribeHwErrorEvents(EVT_HANDLE SubHandle)
{
  // Close the subscription handle
  EvtClose(SubHandle);
}

Observação

Todas as funções EvtXxx e os tipos de dados EVT_XXX usados nos exemplos anteriores estão documentados na seção Log de Eventos do Windows na documentação do SDK do Microsoft Windows.