BSOD 0x000000F4 — CRITICAL_OBJECT_TERMINATION

BSOD 0x000000F4 Описание ошибки

Эта ошибка возникает когда критический для системы процесс или поток неожиданно завершил свое выполнение. Примером такого критического процесса, может быть, например, процесс csrss.exe.

Параметры стоп-кода приведены в таблице ниже.

Параметр Описание
Arg1 Тип объект, который завершил выполнение: 0x3 – процесс, 0x6 – поток
Arg2 Объект
Arg3 Имя образа процесса
Arg4 Указатель на ASCII строку, которая содержит объяснение сообщения

Причины ошибки

Для того, чтобы лучше понять суть данной ошибки, выполним небольшой эксперимент. Вызовем нехватку памяти (подкачиваемого и не подкачиваемого пула) в режиме ядра. Это можно сделать с помощью утечки памяти (когда драйвер выделяет память и не возвращает ее системе), которая может быть реализована, уже рассмотренной нами утилитой NotMyFault. Запускаем программу, переходим во вкладку “Leak”, кликаем Leak Paged и Leak Nonpaged. В конечном счете система вызовет синий экран смерти. В моей тестовой системе, как раз возник BSOD 0x000000F4.

Давайте выполним анализ этого дампа с помощью Windbg (как это сделать, смотрите пост – анализ дампов после BSOD). Вот результат после анализа.

1: kd> .locale «.1251»
Locale: Russian_Russia.1251
1: kd> !analyze -v
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

CRITICAL_OBJECT_TERMINATION (f4)
A process or thread crucial to system operation has unexpectedly exited or been
terminated.
Several processes and threads are necessary for the operation of the
system; when they are terminated (for any reason), the system can no
longer function.
Arguments:
Arg1: 00000003, Process
Arg2: 898ba020, Terminating object
Arg3: 898ba194, Process image file name
Arg4: 805d2970, Explanatory message (ascii)

Debugging Details:
——————

unable to get nt!KiCurrentEtwBufferOffset
unable to get nt!KiCurrentEtwBufferBase

PROCESS_OBJECT: 898ba020

IMAGE_NAME:  hardware_disk

DEBUG_FLR_IMAGE_TIMESTAMP:  0

FAULTING_MODULE: 00000000

PROCESS_NAME:  csrss.exe

EXCEPTION_RECORD:  baa279d8 — (.exr 0xffffffffbaa279d8)
ExceptionAddress: 75b7b3b9
   ExceptionCode: c0000006 (In-page I/O error)
  ExceptionFlags: 00000000
NumberParameters: 3
   Parameter[0]: 00000008
   Parameter[1]: 75b7b3b9
   Parameter[2]: c000009a
Inpage operation failed at 75b7b3b9, due to I/O error c000009a

EXCEPTION_CODE: (NTSTATUS) 0xc0000006 — Инструкция по адресу «0x%08lx» обратилась к памяти по адресу «0x%08lx». Требуемые данные в память не помещены из-за ошибки ввода/вывода «0x%08lx».

CUSTOMER_CRASH_COUNT:  1

DEFAULT_BUCKET_ID:  DRIVER_FAULT

ERROR_CODE: (NTSTATUS) 0xc0000006 — Инструкция по адресу «0x%08lx» обратилась к памяти по адресу «0x%08lx». Требуемые данные в память не помещены из-за ошибки ввода/вывода «0x%08lx».

EXCEPTION_PARAMETER1:  00000008

EXCEPTION_PARAMETER2:  75b7b3b9

EXCEPTION_PARAMETER3:  c000009a

IO_ERROR: (NTSTATUS) 0xc000009a — Недостаточно системных ресурсов для завершения вызова API.

EXCEPTION_STR:  0xc0000006_c000009a

FAULTING_IP:
+2b72faf00ecdfc0
75b7b3b9 ??              ???

BUGCHECK_STR:  0xF4_IOERR_C000009A

STACK_TEXT: 
baa27520 805d1ab9 000000f4 00000003 898ba020 nt!KeBugCheckEx+0x1b
baa27544 805d2a1b 805d2970 898ba020 898ba194 nt!PspCatchCriticalBreak+0x75
baa27574 8054161c 898ba268 c0000006 baa279b0 nt!NtTerminateProcess+0x7d
baa27574 80501151 898ba268 c0000006 baa279b0 nt!KiFastCallEntry+0xfc
baa275f4 804fe806 ffffffff c0000006 baa279f8 nt!ZwTerminateProcess+0x11
baa279b0 805028bf baa279d8 00000000 baa27d64 nt!KiDispatchException+0x3a0
baa27d34 80544ee7 006cfbe8 006cfc08 00000000 nt!KiRaiseException+0x175
baa27d50 8054161c 006cfbe8 006cfc08 00000000 nt!NtRaiseException+0x33
baa27d50 75b7b3b9 006cfbe8 006cfc08 00000000 nt!KiFastCallEntry+0xfc
WARNING: Frame IP not in any known module. Following frames may be wrong.
006cfff4 00000000 00000000 00000000 00000000 0x75b7b3b9

STACK_COMMAND:  kb

FOLLOWUP_IP:
+2b72faf00ecdfc0
75b7b3b9 ??              ???

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: hardware_disk

FAILURE_BUCKET_ID:  0xF4_IOERR_C000009A_IMAGE_hardware_disk

BUCKET_ID:  0xF4_IOERR_C000009A_IMAGE_hardware_disk

Followup: MachineOwner
———

Обращаем внимание на следующее.

1. PROCESS_NAME: csrss.exe (Имя процесса который завершил свое выполнение). Завершение этого процесса и есть причина генерации BSOD ядром.

2. EXCEPTION_RECORD: – запись исключения. Используя запись исключения можно найти ошибку, которая привела к завершению процесса. У нас следующая информация.

EXCEPTION_RECORD: baa279d8 — (.exr 0xffffffffbaa279d8)
ExceptionAddress: 75b7b3b9
ExceptionCode: c0000006 (In-page I/O error)
ExceptionFlags: 00000000
NumberParameters: 3
Parameter[0]: 00000008
Parameter[1]: 75b7b3b9
Parameter[2]: c000009a
Inpage operation failed at 75b7b3b9, due to I/O error c000009a

Используйте команду .locale «.1251» для установки локали.

Далее мы можем увидеть, что windbg.exe отображает описание ошибки по id (если установлена локаль).

ERROR_CODE: (NTSTATUS) 0xc0000006 — Инструкция по адресу «0x%08lx» обратилась к памяти по адресу «0x%08lx». Требуемые данные в память не помещены из-за ошибки ввода/вывода «0x%08lx».

EXCEPTION_PARAMETER1: 00000008

EXCEPTION_PARAMETER2: 75b7b3b9

EXCEPTION_PARAMETER3: c000009a

IO_ERROR: (NTSTATUS) 0xc000009a — Недостаточно системных ресурсов для завершения вызова API.

Таким образом, причина BSOD заключается в том, что системный процесс csrss.exe не смог выделить память для своей работы из-за утечки, созданной программой NotMyFault. И ядро системы было вынуждено сгенерировать BSOD.

Способы устранения

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

Для устранения подобных ошибок необходимо использовать утилиту Driver Verifier. В параметрах выбора драйверов, необходимо выбрать “Автоматически выбирать неподписанные драйверы”. После получения следующего BSOD, необходимо выполнить анализ дампа. Может быть также ситуация, когда среди проблемных драйверов будут подписанные драйвера, тогда будет необходим последующий анализ.