Freigeben über


Registrieren für die Benachrichtigung von Hardwarefehlerereignissen

Um sich zu registrieren, um über neue Hardwarefehlerereignisse benachrichtigt zu werden, erstellt eine Anwendung ein Abonnement für alle Ereignisse, die vom Kanal Microsoft-Windows-Kernel-WHEA/Errors ausgelöst werden.

Dieser Kanal wird für Serverszenarien empfohlen. Die Daten sind zwar nicht sofort lesbar, aber es handelt sich um einen durch ACPI/UEFI definierten Common Platform Error Record (CPER). Im Vergleich zum Microsoft-Windows-WHEA-Logger-Anbieter bietet dieses Format viel mehr Details zu den genauen Details der einzelnen Hardwarefehlerereignisse.

Im folgenden Codebeispiel wird gezeigt, wie Sie sich für die Benachrichtigung über neue Hardwarefehlerereignisse registrieren.

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

Hinweis

Alle EvtXxx-Funktionen und die EVT_XXX-Datentypen, die in den vorherigen Beispielen verwendet wurden, sind im Abschnitt Windows-Ereignisprotokoll in der Microsoft Windows SDK-Dokumentation dokumentiert.