Доброе время суток! Я запускаю приложение используя длл в winlogon.exe, иногда бывает что система падает с ошибкой в win32k.sys. Проблема как я понимаю из за того что я делаю операции с графикой не дождавшись завершении инициализации графики. Вот и вопрос - как можно определить что графическая система до конца проинициализированная? Заранее спасибо!
Код (Text): MODULE_NAME: win32k FAULTING_MODULE: 804d7000 nt DEBUG_FLR_IMAGE_TIMESTAMP: 43446b4e FAULTING_IP: win32k!EngFreeUserMem+30d4 bf80e5ca ff7044 push dword ptr [eax+44h] EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffff) ExceptionAddress: bf80e5ca (win32k!EngFreeUserMem+0x000030d4) ExceptionCode: c0000005 (Access violation) ExceptionFlags: 00000008 NumberParameters: 2 Parameter[0]: 00000000 Parameter[1]: 00000044 Attempt to read from address 00000044 ERROR_CODE: (NTSTATUS) 0xc0000005 - The instruction at 0x%08lx referenced memory at 0x%08lx. The memory could not be %s. EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - The instruction at 0x%08lx referenced memory at 0x%08lx. The memory could not be %s. EXCEPTION_PARAMETER1: 00000000 EXCEPTION_PARAMETER2: 00000044 READ_ADDRESS: unable to get nt!MmSpecialPoolStart unable to get nt!MmSpecialPoolEnd unable to get nt!MmPoolCodeStart unable to get nt!MmPoolCodeEnd 00000044 FOLLOWUP_IP: win32k!EngFreeUserMem+30d4 bf80e5ca ff7044 push dword ptr [eax+44h] BUGCHECK_STR: ACCESS_VIOLATION DEFAULT_BUCKET_ID: NULL_CLASS_PTR_DEREFERENCE LAST_CONTROL_TRANSFER: from bf8af44b to bf80e5ca STACK_TEXT: WARNING: Stack unwind information not available. Following frames may be wrong. f804c288 bf8af44b 00000000 e16d2aa8 e168bdd8 win32k!EngFreeUserMem+0x30d4 f804c2c8 bf8aeb92 e168bdd8 f804c308 00000028 win32k!EngStretchBltROP+0x558d f804c318 bf8af9fa 00000000 f804c35c bf8b602b win32k!EngStretchBltROP+0x4cd4 f804c324 bf8b602b bc5101e0 82b8d9b8 e16d2aa8 win32k!EngStretchBltROP+0x5b3c f804c35c bf80f096 00000001 f804c384 bf80f15a win32k!EngMulDiv+0x128f f804c368 bf80f15a 82d2fa60 00000001 00000000 win32k!EngFreeUserMem+0x3ba0 f804c384 8056a1cf 82d2fa60 00000001 82a2d930 win32k!EngFreeUserMem+0x3c64 f804c430 80584d65 c0000005 f804c48c 804e60e9 nt!ObCloseHandle+0x30 f804c43c 804e60e9 82a2d930 f804c488 f804c47c nt!ExRundownCompleted+0x3b9 f804c48c 804de9dd 00000001 00000000 f804c4a4 nt!KeInitializeDpc+0x683 f804c524 8054ac38 00000007 0100027f 00250000 nt!ZwYieldExecution+0xd69 f804c528 00000000 0100027f 00250000 4ecdea8b nt!ExFreePoolWithTag+0x131 STACK_COMMAND: kb SYMBOL_STACK_INDEX: 0 SYMBOL_NAME: win32k!EngFreeUserMem+30d4 FOLLOWUP_NAME: MachineOwner IMAGE_NAME: win32k.sys BUCKET_ID: WRONG_SYMBOLS Followup: MachineOwner --------- Вот что есть.
Код (Text): PROCESS_NAME: MyExe.exe FAULTING_IP: win32k!HMFreeObject+7c bf80e5ca ff7044 push dword ptr [eax+44h] EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffff) ExceptionAddress: bf80e5ca (win32k!HMFreeObject+0x0000007c) ExceptionCode: c0000005 (Access violation) ExceptionFlags: 00000008 NumberParameters: 2 Parameter[0]: 00000000 Parameter[1]: 00000044 Attempt to read from address 00000044 ERROR_CODE: (NTSTATUS) 0xc0000005 - The instruction at 0x%08lx referenced memory at 0x%08lx. The memory could not be %s. EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - The instruction at 0x%08lx referenced memory at 0x%08lx. The memory could not be %s. EXCEPTION_PARAMETER1: 00000000 EXCEPTION_PARAMETER2: 00000044 READ_ADDRESS: 00000044 FOLLOWUP_IP: win32k!HMFreeObject+7c bf80e5ca ff7044 push dword ptr [eax+44h] BUGCHECK_STR: ACCESS_VIOLATION DEFAULT_BUCKET_ID: NULL_CLASS_PTR_DEREFERENCE LAST_CONTROL_TRANSFER: from bf8af44b to bf80e5ca STACK_TEXT: f803c288 bf8af44b 00000000 e16ceaa8 e16ae448 win32k!HMFreeObject+0x7c f803c2c8 bf8aeb92 e16ae448 f803c308 00000028 win32k!xxxFreeWindow+0x6b9 f803c318 bf8af9fa 00000000 f803c35c bf8b602b win32k!xxxDestroyWindow+0x42d f803c324 bf8b602b bc5101e0 82bc0f20 e16ceaa8 win32k!HMDestroyUnlockedObject+0x1c f803c338 bf8b67f9 82e79448 00000000 00000000 win32k!DestroyThreadsObjects+0x72 f803c35c bf80f096 00000001 f803c384 bf80f15a win32k!xxxDestroyThreadInfo+0x1cf f803c368 bf80f15a 82e79448 00000001 00000000 win32k!UserThreadCallout+0x4b f803c384 8056a1cf 82e79448 00000001 82bbfa30 win32k!W32pThreadCallout+0x3d f803c430 80584d64 c0000005 f803c48c 804e60e9 nt!PspExitThread+0x40b f803c43c 804e60e9 82bbfa30 f803c488 f803c47c nt!PsExitSpecialApc+0x22 f803c48c 804de9dd 00000001 00000000 f803c4a4 nt!KiDeliverApc+0x1af f803c48c 77d3b234 00000001 00000000 f803c4a4 nt!KiServiceExit2+0x39 0013f718 77d3b409 e16ae448 00000081 00000000 USER32!RealDefWindowProcWorker+0xd 0013f734 77d3b3a3 00010028 00000081 00000000 USER32!RealDefWindowProcW+0x47 0013f77c 0040491a 00010028 00000081 00000000 USER32!DefWindowProcW+0x72 0013f7a4 77d38744 00010028 00000081 00000000 MyExe!WndProc+0x1fa 0013f7d0 77d38826 00404720 00010028 00000081 USER32!InternalCallWinProc+0x28 0013f838 77d3b4d0 00000000 00404720 00010028 USER32!UserCallWinProcCheckWow+0x150 0013f88c 77d3fa73 e16ae448 00000081 00000000 USER32!DispatchClientMessage+0xa3 0013f8bc 7c90eae3 0013f8cc 00000060 00000060 USER32!__fnINLPCREATESTRUCT+0x8b 0013f8bc 804e2b1c 0013f8cc 00000060 00000060 ntdll!KiUserCallbackDispatcher+0x13 f803c758 80565fec f803c874 f803c878 f803c848 nt!KiCallUserMode+0x4 f803c7b4 bf83874a 0000000a f803c7dc 00000060 nt!KeUserModeCallback+0x87 f803cacc bf813fbd e16ae448 00000081 00000000 win32k!SfnINLPCREATESTRUCT+0x41f f803cb14 bf8141af 006ae448 00000081 00000000 win32k!xxxSendMessageToClient+0x176 f803cb60 bf80f598 e16ae448 00000081 00000000 win32k!xxxSendMessageTimeout+0x1a6 f803cb84 bf839384 e16ae448 00000081 00000000 win32k!xxxSendMessage+0x1b f803cc6c bf82fdef 00000088 00000000 e16bb798 win32k!xxxCreateWindowEx+0x993 f803cd20 804de7ec 00000088 f803ccec f803cce0 win32k!NtUserCreateWindowEx+0x1c1 f803cd20 7c90eb94 00000088 f803ccec f803cce0 nt!KiFastCallEntry+0xf8 0013f8bc 7c90eae3 0013f8cc 00000060 00000060 ntdll!KiFastSystemCallRet 0013f928 77d3fe88 77d3fe4e 00000088 0013fe50 ntdll!KiUserCallbackDispatcher+0x13 0013fdcc 77d3ff41 00000088 0013fe50 0013fe64 USER32!NtUserCreateWindowEx+0xc 0013fe78 77d3fccd 00000088 00414308 0013fe64 USER32!_CreateWindowEx+0x1ed 0013feb4 004046e7 00000088 00414308 004142f4 USER32!CreateWindowExW+0x33 0013feec 0040406f 00400000 00000000 003e3170 MyExe!InitInstance+0x57 0013ff30 00409e17 00400000 00000000 0016233a MyExe!WinMain+0x16f 0013ffc0 7c816f97 00000000 7c906274 7ffde000 MyExe!__tmainCRTStartup+0x113 [f:\dd\vctools\crt_bld\self_x86\crt\src\crt0.c @ 263] 0013fff0 00000000 00409e82 00000000 78746341 kernel32!BaseProcessStart+0x23 STACK_COMMAND: kb SYMBOL_STACK_INDEX: 0 SYMBOL_NAME: win32k!HMFreeObject+7c FOLLOWUP_NAME: MachineOwner MODULE_NAME: win32k IMAGE_NAME: win32k.sys DEBUG_FLR_IMAGE_TIMESTAMP: 43446b4e FAILURE_BUCKET_ID: ACCESS_VIOLATION_win32k!HMFreeObject+7c BUCKET_ID: ACCESS_VIOLATION_win32k!HMFreeObject+7c Followup: MachineOwner ---------
AntiB Нужно реверсить HMFreeObject() и смотреть какой указатель не валидный. Шадов работает, не искслючена возможность внутренних багов ядра. Вобщем ищите ошибку в кривых перехватах. В антивирях внедряться в чужие процессы не тру
AntiB >я делаю операции с графикой не дождавшись завершении инициализации графики Нам кажется, что это не должно приводить к бсоду. Т.е. вполне вероятно, что это некий баг винды. Можешь приложить сам малый дамп (C:\windows\minidump\*.dmp)? Если он не сгенерился для этой винды, то можно сделать его из полного\ядерного – ".dump /m smalldumpname.dmp". Кроме того, если ядерный\полный дамп в наличии, то имеет смысл посмотреть на состояние структуры окна – "dt win32k!tagWND e16ae448", а также в раскрытом виде ""dt -r win32k!tagWND e16ae448" (посколку в малом дампе таких данных нет). Если символ tagWND для этой винды не предоставляется, то можно просто сдампить в байтовом виде: "db e16ae448 L200". Ещё вопрос – в MyExe!WndProc выполняется какая-либо обработка для WM_NCDESTROY? Сейчас (предварительно) видно лишь, что ядро в процессе создания окна делает колл-аут в юзермод для доставки WM_NCCREATE, соответственно WndProc пытается делегировать обработку xxxDefWindowProc, однако в этот момент приходит Apc для терминации потока(?). Поток пытается очиститься перед терминацией и при освобождении какого-то элемента окна постфактум выяснеется, что этот элемент нулевой. (?)
минидамп не могу приложить. символ tagWND - не определен, поэтому: Код (Text): db e179f5e8 L200 e179f5e8 2c 00 01 00 00 00 00 00-58 8d 6d e1 00 00 00 00 ,.......X.m..... e179f5f8 00 00 00 00 00 00 04 80-00 07 00 00 88 00 00 00 ................ e179f608 00 00 00 84 00 00 40 00-00 00 00 80 00 00 00 00 ......@......... e179f618 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ e179f628 d4 00 00 00 86 00 00 00-2c 03 00 00 7a 02 00 00 ........,...z... e179f638 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ e179f648 47 d1 80 bf 00 00 00 00-00 00 00 00 00 00 00 00 G............... e179f658 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ e179f668 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ e179f678 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ e179f688 05 00 00 00 00 1a 14 00-16 04 cf 0c 4d 6d 53 74 ............MmSt e179f698 18 78 c3 82 8c 01 00 00-8c 01 00 00 00 00 00 00 .x.............. e179f6a8 00 c0 18 00 00 00 00 00-80 00 00 00 8c 01 00 00 ................ e179f6b8 00 00 00 00 00 00 00 00-00 00 00 00 28 0a ac 82 ............(... e179f6c8 00 00 00 00 d0 f6 79 e1-63 f1 6f 0a 63 01 86 0a ......y.c.o.c... e179f6d8 63 11 6c 0a 63 21 6a 0a-63 31 66 0a 63 41 68 0a c.l.c!j.c1f.cAh. e179f6e8 63 51 6c 0a 63 61 6a 0a-63 71 68 0a 63 81 6e 0a cQl.caj.cqh.c.n. e179f6f8 63 91 6e 0a 63 a1 78 0a-63 b1 76 0a 63 c1 78 0a c.n.c.x.c.v.c.x. e179f708 63 d1 70 0a 63 e1 68 0a-63 f1 5c 0a 63 01 5d 0a c.p.c.h.c.\.c.]. e179f718 63 11 65 0a 63 21 67 0a-63 31 6d 0a 63 41 61 0a c.e.c!g.c1m.cAa. e179f728 63 51 61 0a 63 61 61 0a-63 71 61 0a 63 81 6b 0a cQa.caa.cqa.c.k. e179f738 63 91 69 0a 63 a1 69 0a-63 b1 63 0a 63 c1 5f 0a c.i.c.i.c.c.c._. e179f748 63 d1 59 0a 63 e1 5d 0a-63 f1 71 0a 63 01 88 0a c.Y.c.].c.q.c... e179f758 63 11 6e 0a 63 21 6c 0a-63 31 68 0a 63 41 6a 0a c.n.c!l.c1h.cAj. e179f768 63 51 6e 0a 63 61 6c 0a-63 71 6a 0a 63 81 70 0a cQn.cal.cqj.c.p. e179f778 63 91 70 0a 63 a1 7a 0a-63 b1 78 0a 63 c1 7a 0a c.p.c.z.c.x.c.z. e179f788 63 d1 72 0a 63 e1 6a 0a-63 f1 5e 0a 63 01 5f 0a c.r.c.j.c.^.c._. e179f798 63 11 67 0a 63 21 69 0a-63 31 6f 0a 63 41 63 0a c.g.c!i.c1o.cAc. e179f7a8 63 51 63 0a 63 61 63 0a-63 71 63 0a 63 81 6d 0a cQc.cac.cqc.c.m. e179f7b8 63 91 6b 0a 63 a1 6b 0a-63 b1 65 0a 63 c1 61 0a c.k.c.k.c.e.c.a. e179f7c8 63 d1 5b 0a 63 e1 5f 0a-63 f1 73 0a 63 01 8a 0a c.[.c._.c.s.c... e179f7d8 63 11 70 0a 63 21 6e 0a-63 31 6a 0a 63 41 6c 0a c.p.c!n.c1j.cAl. >Ещё вопрос – в MyExe!WndProc выполняется какая-либо обработка для WM_NCDESTROY? нет
AntiB >минидамп не могу приложить. Хм. Может быть в пм? Он совсем малый – меньше 300k в незапакованном виде, зачастую 64k-128k. И в нём только текущие структуры _EPROCESS и _ETHREAD, часть ядерного стека, список загруженных драйверов, базовая дебажная информация о системе и по странице памяти на каждый адрес в регистрах на момент исключения – т.е. никакого бинарного кода или частной информации. При наличии минидампа мы по крайней мере могли бы определить версии win32k и ntoskrnl, что позволило бы подгрузить конкретные версии этих модулей с симсервера Майкрософт для исследования. Нет, мы не в праве настаивать, конечно – но просто мало кто сможет сказать что-либо не имея информации о ядерном стеке и версиях бинарников ядра в формате минидампа.
убрал задержку в виде создание thread-а который запускал процесс и получил следующий бсод: Код (Text): PROCESS_NAME: MyExe.exe FAULTING_IP: USER32!RealDefWindowProcWorker+d 77d3b234 8b06 mov eax,dword ptr [esi] EXCEPTION_RECORD: 0013f40c -- (.exr 0x13f40c) ExceptionAddress: 77d3b234 (USER32!RealDefWindowProcWorker+0x0000000d) ExceptionCode: c0000005 (Access violation) ExceptionFlags: 00000000 NumberParameters: 2 Parameter[0]: 00000000 Parameter[1]: e1741438 Attempt to read from address e1741438 ERROR_CODE: (NTSTATUS) 0xc0000005 - The instruction at 0x%08lx referenced memory at 0x%08lx. The memory could not be %s. EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - The instruction at 0x%08lx referenced memory at 0x%08lx. The memory could not be %s. EXCEPTION_PARAMETER1: 00000000 EXCEPTION_PARAMETER2: 00000044 READ_ADDRESS: e1741438 Paged pool FOLLOWUP_IP: USER32!RealDefWindowProcWorker+d 77d3b234 8b06 mov eax,dword ptr [esi] BUGCHECK_STR: ACCESS_VIOLATION DEFAULT_BUCKET_ID: NULL_CLASS_PTR_DEREFERENCE CONTEXT: 0013f428 -- (.cxr 0x13f428) eax=e1741438 ebx=00000000 ecx=00000081 edx=00000010 esi=e1741438 edi=0013f810 eip=77d3b234 esp=0013f6f4 ebp=0013f71c iopl=0 nv up ei pl nz na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010206 USER32!RealDefWindowProcWorker+0xd: 001b:77d3b234 8b06 mov eax,dword ptr [esi] ds:0023:e1741438=00010028 Resetting default scope LAST_CONTROL_TRANSFER: from 77d3b409 to 77d3b234 STACK_TEXT: 0013f71c 77d3b409 e1741438 00000081 00000000 USER32!RealDefWindowProcWorker+0xd 0013f738 77d3b3a3 00010028 00000081 00000000 USER32!RealDefWindowProcW+0x47 0013f780 0040491a 00010028 00000081 00000000 USER32!DefWindowProcW+0x72 0013f7a8 77d38744 00010028 00000081 00000000 MyExe!WndProc+0x1fa 0013f7d4 77d38826 00404720 00010028 00000081 USER32!InternalCallWinProc+0x28 0013f83c 77d3b4d0 00000000 00404720 00010028 USER32!UserCallWinProcCheckWow+0x150 0013f890 77d3fa73 e1741438 00000081 00000000 USER32!DispatchClientMessage+0xa3 0013f8c0 7c90eae3 0013f8d0 00000060 00000060 USER32!__fnINLPCREATESTRUCT+0x8b 0013f8c0 804e2b1c 0013f8d0 00000060 00000060 ntdll!KiUserCallbackDispatcher+0x13 f804c758 80565fec f804c874 f804c878 f804c848 nt!KiCallUserMode+0x4 f804c7b4 bf83874a 0000000a f804c7dc 00000060 nt!KeUserModeCallback+0x87 f804cacc bf813fbd e1741438 00000081 00000000 win32k!SfnINLPCREATESTRUCT+0x41f f804cb14 bf8141af 00741438 00000081 00000000 win32k!xxxSendMessageToClient+0x176 f804cb60 bf80f598 e1741438 00000081 00000000 win32k!xxxSendMessageTimeout+0x1a6 f804cb84 bf839384 e1741438 00000081 00000000 win32k!xxxSendMessage+0x1b f804cc6c bf82fdef 00000088 00000000 e16bc4e8 win32k!xxxCreateWindowEx+0x993 f804cd20 804de7ec 00000088 f804ccec f804cce0 win32k!NtUserCreateWindowEx+0x1c1 f804cd20 7c90eb94 00000088 f804ccec f804cce0 nt!KiFastCallEntry+0xf8 0013f8c0 7c90eae3 0013f8d0 00000060 00000060 ntdll!KiFastSystemCallRet 0013f92c 77d3fe88 77d3fe4e 00000088 0013fe54 ntdll!KiUserCallbackDispatcher+0x13 0013fdd0 77d3ff41 00000088 0013fe54 0013fe68 USER32!NtUserCreateWindowEx+0xc 0013fe7c 77d3fccd 00000088 00414308 0013fe68 USER32!_CreateWindowEx+0x1ed 0013feb8 004046e7 00000088 00414308 004142f4 USER32!CreateWindowExW+0x33 0013fef0 00404070 00400000 00000000 003e3050 MyExe!InitInstance+0x57 0013ff30 00409e17 00400000 00000000 0016233a MyExe!WinMain+0x170 0013ffc0 7c816f97 04050458 04570455 7ffd5000 MyExe!__tmainCRTStartup+0x113 [f:\dd\vctools\crt_bld\self_x86\crt\src\crt0.c @ 263] 0013fff0 00000000 00409e82 00000000 78746341 kernel32!BaseProcessStart+0x23 SYMBOL_STACK_INDEX: 0 SYMBOL_NAME: USER32!RealDefWindowProcWorker+d FOLLOWUP_NAME: MachineOwner MODULE_NAME: USER32 IMAGE_NAME: USER32.dll DEBUG_FLR_IMAGE_TIMESTAMP: 42260409 STACK_COMMAND: .cxr 0x13f428 ; kb FAILURE_BUCKET_ID: ACCESS_VIOLATION_USER32!RealDefWindowProcWorker+d BUCKET_ID: ACCESS_VIOLATION_USER32!RealDefWindowProcWorker+d Followup: MachineOwner --------- а почему вы думаете что графика проинициализированная? так как я запускаю приложение очень скоро, можно сказать как-только winlogon.exe запускается.
AntiB >а почему вы думаете что графика проинициализированная? Мы не знаем, проинициализирована графика или нет, потому что не представляем, на каком этапе она инициализируется. Но считаем, что бсода быть не должно. Последний "бсод" – это почти то же самое, что и в предыдущий. Но в последнем случае автоанализ ошибся. Нужно смотреть вручную. >0013f71c 77d3b409 e1741438 00000081 00000000 USER32!RealDefWindowProcWorker+0xd >USER32!RealDefWindowProcWorker+d >77d3b234 8b06 mov eax,dword ptr [esi] По какой-то причине закэшированная pwnd (Teb.Win32ClientInfo.CallbackWnd.pwnd) является адресом структуры окна в ядре, а не в клиенте. Соответственно, происходит исключение на первых инструкциях функции RealDefWindowProcWorker() – при попытке обращения к ядерной памяти. Далее ядро раскручивает исключение и в конце концов решает уничтожить поток(?). Структура окна каким-то образом повреждена – при освобождении одного из его элементов делается предположение что этот элемент не может быть нулевым. Нуль-дереференс -> бсод. AntiB Для того, чтобы разобраться, на какой точке инициализация идёт в сторону, можно запустить винду под отладчиком. Ключевые моменты: 1) Инициализация user32.dll – коннект к csrsss и заполнение структуры SharedInfo. Соответственно, точка входа user32.dll и функция win32k!NtUserProcessConnect(). 2) Создание окна и конретно посылка сообщения WM_NCREATE из этой процедуры. Соответственно, процедура win32k!xxxCreateWindowEx(). 3) Исключение в процедуре USER32!RealDefWindowProcWorker(). Посмотреть, что приводит к инициации терминации потока. 4) Момент освобождения окна – win32k!xxxFreeWindow(). Узнать, какой элемент полагается ненулевым. Ты, кстати, ни разу не сказал, что за версия системы. Судя по "kernel32!BaseProcessStart+0x23", это XP. Если это не последний сервиспак, можно попробовать обновиться. Также можно проверить всё на семёрке.