Поделиться через


Регистрация для уведомления о событиях ошибок оборудования

Чтобы зарегистрироваться для получения уведомлений о новых событиях ошибок оборудования, приложение создает подписку на все события, создаваемые каналом Microsoft-Windows-Kernel-WHEA/Errors .

Этот канал рекомендуется использовать для серверных сценариев. Хотя данные не доступны для чтения человеком, они являются определяемой ACPI или UEFI общей записью ошибки платформы (CPER). По сравнению с поставщиком Microsoft-Windows-WHEA-Logger этот формат предоставляет гораздо более подробные сведения о конкретных особенностях каждого события ошибки оборудования.

В следующем примере кода показано, как зарегистрироваться для уведомления о новых событиях ошибок оборудования.

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

Примечание

Все функции EvtXxx и типы данных EVT_XXX, которые использовались в предыдущих примерах, описаны в разделе Журнал событий Windows документации по Microsoft Windows SDK.