Доброе время суток!
Я пишу HIPS, у меня возникла проблема: непредсказуемые BSODы при перехвате вызова
win32k!NtUserSetWindowsHookEx
например такой:
IRQL_NOT_LESS_OR_EQUAL (a)
...
Arguments:
Arg1: fac16000, memory referenced
Arg2: 0000001d, IRQL
Arg3: 00000000, value 0 = read operation, 1 = write operation
Arg4: 804ef4bd, address which referenced memory
Debugging Details:
------------------
READ_ADDRESS: fac16000
CURRENT_IRQL: 1d
FAULTING_IP:
nt!IopWriteTriageDump+297
804ef4bd f3a5 rep movsd
DEFAULT_BUCKET_ID: DRIVER_FAULT
BUGCHECK_STR: 0xA
LAST_CONTROL_TRANSFER: from 804f428c to 8051d4b0
STACK_TEXT:
fadca020 804f428c 00000003 fadca350 fac16000 nt!RtlpBreakWithStatusInstruction
fadca06c 804f4d11 00000003 fac16000 804ef4bd nt!KiBugCheckDebugBreak+0x19
fadca438 804f52af 0000000a fac16000 0000001d nt!KeBugCheck2+0x46d
fadca458 805331a1 0000000a fac16000 0000001d nt!KeBugCheckEx+0x19
fadca458 804ef4bd 0000000a fac16000 0000001d nt!KiTrap0E+0x2b5
fadca4f8 804ef8d5 00000dff f9458ecc fadca5d4 nt!IopWriteTriageDump+0x297
fadca5cc 804f5256 81206af8 00000000 00001000 nt!IoWriteCrashDump+0x380
fadca9b4 804f52af 0000000a fac1affc 000000ff nt!KeBugCheck2+0x9b2
fadca9d4 805331a1 0000000a fac1affc 000000ff nt!KeBugCheckEx+0x19
fadca9d4 8053451f 0000000a fac1affc 000000ff nt!KiTrap0E+0x2b5
fadcaa68 805343bb fadcaac4 8128c350 ffdff120 nt!SwapContext+0x6f
fadcaa7c 804fd59e 00000000 8128c350 811aac28 nt!KiSwapContext+0x2f
fadcaa8c 804f6044 804fa428 00000001 bf993bf8 nt!KiSwapThread+0x6a
fadcaac4 bf879a96 00000007 8128c298 00000001 nt!KeWaitForMultipleObjects+0x282
fadcad34 bf80ba70 fadba4e4 00000002 fadcad64 win32k!RawInputThread+0x454
fadcad44 bf874990 fadba4e4 fadcad64 006dfff4 win32k!xxxCreateSystemThreads+0x5e
fadcad54 805303c4 00000000 00000022 00000000 win32k!NtUserCallOneParam+0x20
fadcad54 7ffe0304 00000000 00000022 00000000 nt!KiSystemService+0xc9
006dffe0 75b64f9e 75b6c264 00000000 00000022 SharedUserData!SystemCallStub+0x4
006dffe0 00000000 75b6c264 00000000 00000022 winsrv!ConsoleWindowProc+0x1647
STACK_COMMAND: kb
FOLLOWUP_IP:
win32k!RawInputThread+454
bf879a96 392d349b99bf cmp [win32k!gdwUpdateKeyboard (bf999b34)],ebp
FAULTING_SOURCE_CODE:
SYMBOL_STACK_INDEX: e
FOLLOWUP_NAME: MachineOwner
SYMBOL_NAME: win32k!RawInputThread+454
MODULE_NAME: win32k
IMAGE_NAME: win32k.sys
DEBUG_FLR_IMAGE_TIMESTAMP: 3d6de5e5
FAILURE_BUCKET_ID: 0xA_win32k!RawInputThread+454
BUCKET_ID: 0xA_win32k!RawInputThread+454
Followup: MachineOwner
---------
Причем сбой
всегда возникает при следующем вызове после того, как в предыдущем вызове в перехватчик вернул 0 без выполнения оригинального вызова (т.е. запрет внедрения DLL в чужой процесс).
В анализе сбоя
всегда присутствует RawInputThread.
IRQL иногда равен IPI_LEVEL (как приведено выше), иногда — 000000ff (т.е. вообще запредельный)
Видимо как-то глючит переключение потоков.
Ищу хоть какую-нибудь зацепку, буду признателен за любую помощь
CO>Я пишу HIPS, у меня возникла проблема: непредсказуемые BSODы при перехвате вызова
Разобрался )
2 раза дереференсился объект потока, в результате глючил вызов SwapContext.
Жесткий глюк