Критическая ошибка STOP 00000033 имеет символическое имя UNEXPECTED_INITIALIZATION_CALL (НЕПРЕДУСМОТРЕННЫЙ_СИСТЕМНЫЙ_ВЫЗОВ). По задумке разработчиков, данный системный сбой должен сообщать нам о некоем "неожиданном" системном вызове, который по идее, не должен был быть осуществлен в той ситуации (контекст работы, глобальные флаги и переменные), в которой он произошел. Как всегда у Microsoft с классификацией ошибок черт ногу сломит, и порой довольно сложно понять причину только лишь по символическому имени :) Иначе говоря, если вы видите останов STOP 00000033, то возникла ситуация, в которой в контексте (процесса/потока) ядра, был выполнен вызов внутренней функции одного из этапов инициализации и в этот самый момент ядро находилось в фазе, в которой оно в данный момент не должно было находиться. В общем то, как вы сможете увидеть далее в статье, символическое имя не лишено смысла, поскольку в некоторым алгоритмическим нюансам сложно бывает придумать внятное описание.
Входные параметры ошибки
Нижеследующие параметры можно наблюдать среди диагностической информации синего экрана смерти, либо в соответствующих полях дампа памяти.
Параметр | Описание |
---|---|
1 | Номер фазы инициализации ядра (Phase0/Phase1), в которой возник останов. |
2 | Не имеет значения (всегда 0) |
3 | Не имеет значения (всегда 0) |
4 | Не имеет значения (всегда 0) |
Низкий уровень
Все оказалось достаточно тривиально. Код ошибки 33h
был обнаружен при анализе исходного кода ядра (файл ntoskrnl.exe). Сбой STOP 00000033, судя по всему, возникает на ранних стадиях фаз инициализации ядра (фазы 0,1), и сейчас мы перечислим причины, а точнее места в коде, где мне посчастливилось встретить данную ошибку.
Причина №1:
В процедуре инициализации Диспетчера процессов/потоков (Process and Thread Manager):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
INIT:007AD7EA _PsInitSystem@8 proc near INIT:007AD7EA INIT:007AD7EA INIT:007AD7EA StartContext = dword ptr 8 INIT:007AD7EA INIT:007AD7EA mov edi, edi INIT:007AD7EC push ebp INIT:007AD7ED mov ebp, esp INIT:007AD7EF and esp, 0FFFFFFF8h INIT:007AD7F2 mov eax, _InitializationPhase INIT:007AD7F7 mov ecx, eax INIT:007AD7F9 xor edx, edx INIT:007AD7FB sub ecx, edx INIT:007AD7FD jz short loc_7AD817 INIT:007AD7FF dec ecx INIT:007AD800 jz short loc_7AD810 INIT:007AD802 push edx INIT:007AD803 push edx INIT:007AD804 push edx INIT:007AD805 push eax INIT:007AD806 push 1 INIT:007AD808 push 33h INIT:007AD80A call _KeBugCheck2@24 INIT:007AD80A ; --------------------------------------------------------------------------- INIT:007AD80F align 10h INIT:007AD810 INIT:007AD810 loc_7AD810: INIT:007AD810 call _PspInitPhase1@4 ; PspInitPhase1(x) INIT:007AD815 jmp short loc_7AD81F INIT:007AD817 ; --------------------------------------------------------------------------- INIT:007AD817 INIT:007AD817 loc_7AD817: INIT:007AD817 push [ebp+StartContext] INIT:007AD81A call _PspInitPhase0@4 INIT:007AD81F INIT:007AD81F loc_7AD81F: INIT:007AD81F mov esp, ebp INIT:007AD821 pop ebp INIT:007AD822 retn 4 INIT:007AD822 _PsInitSystem@8 endp |
по причине некорректного параметра InitializationPhase, содержащего номер текущей фазы инициализации ядра: значения, отличные от 0
и 1
считаются недопустимыми, поскольку существует всего две основных фазы: 0
и 1
.
Причина №2
При попытке создания ядром системного потока обслуживания DPC:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
PAGELK:00724B06 _KiInitializeDynamicProcessor@4 proc near PAGELK:00724B06 PAGELK:00724B06 PAGELK:00724B06 var_8 = dword ptr -8 PAGELK:00724B06 var_4 = byte ptr -4 PAGELK:00724B06 PAGELK:00724B06 mov edi, edi PAGELK:00724B08 push ebp PAGELK:00724B09 mov ebp, esp PAGELK:00724B0B sub esp, 0Ch PAGELK:00724B0E push ebx PAGELK:00724B0F lea eax, [ebp+var_8] PAGELK:00724B12 push eax PAGELK:00724B13 mov [ebp+var_8], esi PAGELK:00724B16 xor ebx, ebx PAGELK:00724B18 push offset _KiInitializeDynamicProcessorDpc@16 PAGELK:00724B1D mov [ebp+var_4], bl PAGELK:00724B20 call _KeGenericCallDpc@8 ; KeGenericCallDpc(x,x) PAGELK:00724B25 cmp ds:_KeThreadDpcEnable, ebx PAGELK:00724B2B jz short loc_724B43 PAGELK:00724B2D push esi ; ThreadHandle PAGELK:00724B2E call _KiStartDpcThread@4 ; KiStartDpcThread(x) PAGELK:00724B33 cmp eax, ebx PAGELK:00724B35 jge short loc_724B43 PAGELK:00724B37 push ebx ; BugCheckParameter4 PAGELK:00724B38 push ebx ; BugCheckParameter3 PAGELK:00724B39 push ebx ; BugCheckParameter2 PAGELK:00724B3A push eax ; BugCheckParameter1 PAGELK:00724B3B push 33h ; BugCheckCode PAGELK:00724B3D call _KeBugCheckEx@20 ; KeBugCheckEx(x,x,x,x,x) PAGELK:00724B3D ; --------------------------------------------------------------------------- PAGELK:00724B42 db 0CCh PAGELK:00724B43 ; --------------------------------------------------------------------------- PAGELK:00724B43 PAGELK:00724B43 loc_724B43: PAGELK:00724B43 PAGELK:00724B43 pop ebx PAGELK:00724B44 leave PAGELK:00724B45 retn PAGELK:00724B45 _KiInitializeDynamicProcessor@4 endp |
на выходе функции KiStartDpcThread
, при неудачном завершении функции создания системного потока обслуживания DPC.
Причина №3
В процедуре инициализации Диспетчера PnP (PnP Manager):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
INIT:007A0307 _PpInitSystem@0 proc near INIT:007A0307 INIT:007A0307 mov edi, edi INIT:007A0309 push ebp INIT:007A030A mov ebp, esp INIT:007A030C and esp, 0FFFFFFF8h INIT:007A030F mov eax, _InitializationPhase INIT:007A0314 mov ecx, eax INIT:007A0316 xor edx, edx INIT:007A0318 sub ecx, edx INIT:007A031A jz short loc_7A0331 INIT:007A031C dec ecx INIT:007A031D jz short loc_7A032D INIT:007A031F push edx INIT:007A0320 push edx INIT:007A0321 push edx INIT:007A0322 push eax INIT:007A0323 push 2 INIT:007A0325 push 33h INIT:007A0327 call _KeBugCheck2@24 INIT:007A0327 ; --------------------------------------------------------------------------- INIT:007A032C db 0CCh INIT:007A032D ; --------------------------------------------------------------------------- INIT:007A032D INIT:007A032D loc_7A032D: INIT:007A032D mov al, 1 INIT:007A032F jmp short loc_7A0336 INIT:007A0331 ; --------------------------------------------------------------------------- INIT:007A0331 INIT:007A0331 loc_7A0331: INIT:007A0331 call _PnpInitPhase0@0 ; PnpInitPhase0() INIT:007A0336 INIT:007A0336 loc_7A0336: INIT:007A0336 mov esp, ebp INIT:007A0338 pop ebp INIT:007A0339 retn INIT:007A0339 _PpInitSystem@0 endp |
по причине некорректного значения параметра InitializationPhase, содержащего номер текущей фазы инициализации ядра: значения, отличные от 0
и 1
считаются недопустимыми, поскольку существует всего две основных фазы: 0
и 1
.
Причина №4
В процедуре инициализации Библиотеки отладки (Debugger Library):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
INIT:007A039C _DbgkInitialize@0 proc near INIT:007A039C INIT:007A039C INIT:007A039C var_8 = word ptr -8 INIT:007A039C var_6 = word ptr -6 INIT:007A039C var_4 = dword ptr -4 INIT:007A039C INIT:007A039C mov edi, edi INIT:007A039E push ebp INIT:007A039F mov ebp, esp INIT:007A03A1 and esp, 0FFFFFFF8h INIT:007A03A4 push ecx INIT:007A03A5 push ecx INIT:007A03A6 mov eax, _InitializationPhase INIT:007A03AB mov ecx, eax INIT:007A03AD xor edx, edx INIT:007A03AF sub ecx, edx INIT:007A03B1 jz short loc_7A03E7 INIT:007A03B3 dec ecx INIT:007A03B4 jz short loc_7A03C4 INIT:007A03B6 push edx INIT:007A03B7 push edx INIT:007A03B8 push edx INIT:007A03B9 push eax INIT:007A03BA push 3 INIT:007A03BC push 33h INIT:007A03BE call _KeBugCheck2@24 INIT:007A03BE ; --------------------------------------------------------------------------- INIT:007A03C3 align 4 INIT:007A03C4 INIT:007A03C4 loc_7A03C4: INIT:007A03C4 push 46h INIT:007A03C6 pop eax INIT:007A03C7 push 48h INIT:007A03C9 mov [esp+0Ch+var_8], ax INIT:007A03CE pop eax INIT:007A03CF mov [esp+8+var_6], ax INIT:007A03D4 lea eax, [esp+8+var_8] INIT:007A03D7 push eax ; Object INIT:007A03D8 mov [esp+0Ch+var_4], offset aKernelobject_3 ; "\\KernelObjects\\SystemErrorPortReady" INIT:007A03E0 call _DbgkpCreateNotificationEvent@8 INIT:007A03E5 jmp short loc_7A03EC INIT:007A03E7 ; --------------------------------------------------------------------------- INIT:007A03E7 INIT:007A03E7 loc_7A03E7: INIT:007A03E7 call _DbgkpInitializePhase0@0 INIT:007A03EC INIT:007A03EC loc_7A03EC: INIT:007A03EC mov esp, ebp INIT:007A03EE pop ebp INIT:007A03EF retn INIT:007A03EF _DbgkInitialize@0 endp |
по причине некорректного значения параметра InitializationPhase.
Причина №5
В процедуре инициализации Подсистемы безопасности (Security Reference Monitor):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
INIT:007A04DD _SeInitSystem@0 proc near INIT:007A04DD INIT:007A04DD mov edi, edi INIT:007A04DF push ebp INIT:007A04E0 mov ebp, esp INIT:007A04E2 and esp, 0FFFFFFF8h INIT:007A04E5 mov eax, _InitializationPhase INIT:007A04EA mov ecx, eax INIT:007A04EC xor edx, edx INIT:007A04EE sub ecx, edx INIT:007A04F0 jz short loc_7A0509 INIT:007A04F2 dec ecx INIT:007A04F3 jz short loc_7A0502 INIT:007A04F5 push edx INIT:007A04F6 push edx INIT:007A04F7 push edx INIT:007A04F8 push eax INIT:007A04F9 push edx INIT:007A04FA push 33h INIT:007A04FC call _KeBugCheck2@24 INIT:007A04FC ; --------------------------------------------------------------------------- INIT:007A0501 align 2 INIT:007A0502 INIT:007A0502 loc_7A0502: INIT:007A0502 call _SepInitializationPhase1@0 INIT:007A0507 jmp short loc_7A050E INIT:007A0509 ; --------------------------------------------------------------------------- INIT:007A0509 INIT:007A0509 loc_7A0509: INIT:007A0509 call _SepInitializationPhase0@0 INIT:007A050E INIT:007A050E loc_7A050E: INIT:007A050E mov esp, ebp INIT:007A0510 pop ebp INIT:007A0511 retn INIT:007A0511 _SeInitSystem@0 endp |
Причина №6
В процедуре инициализации Подсистемы верификации (Verification Library):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
INIT:007A177B _VerifierInitSystem@4 proc near INIT:007A177B INIT:007A177B INIT:007A177B arg_0 = dword ptr 8 INIT:007A177B INIT:007A177B mov edi, edi INIT:007A177D push ebp INIT:007A177E mov ebp, esp INIT:007A1780 and esp, 0FFFFFFF8h INIT:007A1783 mov eax, _InitializationPhase INIT:007A1788 mov ecx, eax INIT:007A178A xor edx, edx INIT:007A178C sub ecx, edx INIT:007A178E jz short loc_7A17A8 INIT:007A1790 dec ecx INIT:007A1791 jz short loc_7A17A1 INIT:007A1793 push edx INIT:007A1794 push edx INIT:007A1795 push edx INIT:007A1796 push eax INIT:007A1797 push 4 INIT:007A1799 push 33h INIT:007A179B call _KeBugCheck2@24 INIT:007A179B ; --------------------------------------------------------------------------- INIT:007A17A0 db 0CCh INIT:007A17A1 ; --------------------------------------------------------------------------- INIT:007A17A1 INIT:007A17A1 loc_7A17A1: INIT:007A17A1 call _ViInitSystemPhase1@0 INIT:007A17A6 jmp short loc_7A17B0 INIT:007A17A8 ; --------------------------------------------------------------------------- INIT:007A17A8 INIT:007A17A8 loc_7A17A8: INIT:007A17A8 mov eax, [ebp+arg_0] INIT:007A17AB call _ViInitSystemPhase0@4 INIT:007A17B0 INIT:007A17B0 loc_7A17B0: INIT:007A17B0 mov esp, ebp INIT:007A17B2 pop ebp INIT:007A17B3 retn 4 INIT:007A17B3 _VerifierInitSystem@4 endp |
Причина №7
В процедуре инициализации Исполнительной подсистемы (Executive Support Library):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
INIT:007A1AFC _ExInitSystem@0 proc near INIT:007A1AFC INIT:007A1AFC mov edi, edi INIT:007A1AFE push ebp INIT:007A1AFF mov ebp, esp INIT:007A1B01 and esp, 0FFFFFFF8h INIT:007A1B04 mov eax, _InitializationPhase INIT:007A1B09 mov ecx, eax INIT:007A1B0B xor edx, edx INIT:007A1B0D sub ecx, edx INIT:007A1B0F jz short loc_7A1B29 INIT:007A1B11 dec ecx INIT:007A1B12 jz short loc_7A1B22 INIT:007A1B14 push edx INIT:007A1B15 push edx INIT:007A1B16 push edx INIT:007A1B17 push eax INIT:007A1B18 push 3 INIT:007A1B1A push 33h INIT:007A1B1C call _KeBugCheck2@24 INIT:007A1B1C ; --------------------------------------------------------------------------- INIT:007A1B21 align 2 INIT:007A1B22 INIT:007A1B22 loc_7A1B22: INIT:007A1B22 call _ExpInitSystemPhase1@0 INIT:007A1B27 jmp short loc_7A1B33 INIT:007A1B29 ; --------------------------------------------------------------------------- INIT:007A1B29 INIT:007A1B29 loc_7A1B29: INIT:007A1B29 call sub_79A8AF INIT:007A1B2E call _ExpInitSystemPhase0@0 INIT:007A1B33 INIT:007A1B33 loc_7A1B33: INIT:007A1B33 mov esp, ebp INIT:007A1B35 pop ebp INIT:007A1B36 retn INIT:007A1B36 _ExInitSystem@0 endp |
Судя по привиденным фрагментам кода, в последние три параметра (BugCheckParameter2
, BugCheckParameter3
, BugCheckParameter4
) всегда записываются нули (0), в общем то, абсолютно нивелируя какую-либо смысловую нагрузку. В первом параметре (BugCheckParameter1
) размещается номер текущей фазы инициализации ядра.
Прототип:
1 2 3 4 5 6 7 |
NTKERNELAPI VOID KeBugCheckEx( ULONG BugCheckCode, ULONG_PTR BugCheckParameter1, ULONG_PTR BugCheckParameter2, ULONG_PTR BugCheckParameter3, ULONG_PTR BugCheckParameter4 ); |
Общие варианты решения
Судя по тому, что на значение внутренней переменной ядра могут повлиять очень ограниченное количество факторов, могу предположить, что будут актуальны следующие причины и варианты решения:
- Аппаратные проблемы: повреждается содержимое страницы памяти, содержащей переменную InitializationPhase. Можно порекомендовать проверить оперативную память (иногда и прочее оборудование);
- Программные проблемы: сборка операционной системы изначально содержит нестандартное (кастомное) ядро, возможно содержащее какие-либо ошибки. Можно порекомендовать использовать официальную MSDN-версию системы или проверить систему на целостность кода;
- Программные проблемы: возможно, в следствии вирусного заражения, модифицирован код ядра (руткит, rootkit);