Изменение обработки всплывающих окон с жесткой ошибкой в Windows

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

Исходная версия продукта: Windows
Исходный номер базы знаний: 128642

Сводка

Windows позволяет пользователю изменять обработку всплывающих окон с жесткими ошибками, которые возникают в результате ошибок приложения и системы. К таким ошибкам относятся отсутствие диска на диске и сбои общей защиты (GP).

Эти события приводят к отображению всплывающего окна с жесткой ошибкой, что требует вмешательства пользователя для отправки. Это поведение можно изменить, чтобы такие ошибки регистрировались в журнале событий Windows. Когда ошибка регистрируется в журнале событий, вмешательство пользователя не требуется, и система предоставляет обработчик по умолчанию для жесткой ошибки. Пользователь может просмотреть журнал событий, чтобы определить причину жесткой ошибки.

Запись реестра

Следующая запись реестра управляет обработкой всплывающих окон с жесткой ошибкой в Windows:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows\ErrorMode

Допустимые режимы

Ниже приведены допустимые значения для ErrorMode:

  • Режим 0

    Это режим работы по умолчанию, который сериализует ошибки и ожидает ответа.

  • Режим 1

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

  • Режим 2

    Это всегда записывает ошибку в журнал событий и возвращает ОК к жесткой ошибке. Всплывающие окна не видны.

Во всех режимах ошибки, возникшие системой, регистрируются в системном журнале. Чтобы запустить автоматический сервер, используйте режим 2.

Пример кода для изменения режима всплывающего окна с жесткой ошибкой

Следующая функция изменяет режим всплывающего окна с жесткой ошибкой. Если функция выполнена успешно, возвращаемое значение равно TRUE. Если функция завершается сбоем, возвращаемое значение равно FALSE.

BOOL SetGlobalErrorMode(
    DWORD dwErrorMode   // specifies new ErrorMode value
    )
{
    HKEY hKey;
    LONG lRetCode;

    // make sure the value passed isn't out-of-bounds
    if (dwErrorMode > 2)
        return FALSE;

    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                    "SYSTEM\\CurrentControlSet\\Control\\Windows",
                    0,
                    KEY_SET_VALUE,
                    &hKey) != ERROR_SUCCESS)
        return FALSE;

    lRetCode=RegSetValueEx(hKey,
                            "ErrorMode",
                            0,
                            REG_DWORD,
                            (CONST BYTE *) &dwErrorMode,
                            sizeof(DWORD));

    RegCloseKey(hKey);
    if (lRetCode != ERROR_SUCCESS)
        return FALSE;

    return TRUE;
}

Пример кода для получения режима всплывающего окна с жесткой ошибкой

Следующая функция получает режим всплывающего окна с жесткой ошибкой. Если функция выполнена успешно, возвращаемое значение равно TRUE. Если функция завершается сбоем, возвращаемое значение равно FALSE. Если функция выполнена успешно, dwErrorMode содержит режим всплывающего окна ошибки. dwErrorMode В противном случае значение не определено.

BOOL GetGlobalErrorMode(
    LPDWORD dwErrorMode // Pointer to a DWORD to place popup mode
    )
{
    HKEY hKey;
    LONG lRetCode;
    DWORD cbData=sizeof(DWORD);

    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                    "SYSTEM\\CurrentControlSet\\Control\\Windows",
                    0,
                    KEY_QUERY_VALUE,
                    &hKey) != ERROR_SUCCESS)
        return FALSE;

    lRetCode=RegQueryValueEx(hKey,
                            "ErrorMode",
                            0,
                            NULL,
                            (LPBYTE) dwErrorMode,
                            &cbData);

    RegCloseKey(hKey);
    if (lRetCode != ERROR_SUCCESS)
        return FALSE;

    return TRUE;
}