在windows中这个蓝屏也是常见蓝屏之一,这里记录下在工作中遇到的这个蓝屏的一个特别之处。UNEXPECTED_KERNEL_MODE_TRAP_M (1000007f)
在用户环境的产品中,隔三差五就会反馈这个蓝屏代码,完全是随机概率的,而且很容易出现在某几个特别的用户环境下,那倒了dump之后开始对这个dump进行分析,发现这个蓝屏的位置居然发生在了Minifilter的重入中,有意思的是这个重入不是常见文件操作引发的而是:
//发生在了PsLookupProcessByProcessId这里
if (NT_SUCCESS(PsLookupProcessByProcessId((HANDLE)ProcessID, &pPep)))
{
uXid = (ULONG64)pPep + (ULONG64)ProcessID*2 + PsGetProcessCreateTimeQuadPart(pPep);
ObDereferenceObject(pPep);
}
else
{
return callbackStatus;
}
居然是在查询EPROCESS的API PsLookupProcessByProcessId中,这个API在调用的时候触发了注册的PreCall操作,而这个操作里需要执行这个查询,然后又再次循环,导致堆栈耗尽崩溃。
不是很清楚到底发生了什么,于是跟踪了下这个链路:
PsLookupProcessByProcessId -> PspReferenceCidTableEntry
故障发生在 nt!PspReferenceCidTableEntry+0x51的位置,这里触发了nt!KiPageFault,看汇编代码:
kd> u nt!PspReferenceCidTableEntry l+50
nt!PspReferenceCidTableEntry:
fffff802`6d4bf410 48895c2408 mov qword ptr [rsp+8],rbx
fffff802`6d4bf415 48896c2410 mov qword ptr [rsp+10h],rbp
fffff802`6d4bf41a 4889742418 mov qword ptr [rsp+18h],rsi
fffff802`6d4bf41f 48897c2420 mov qword ptr [rsp+20h],rdi
fffff802`6d4bf424 4156 push r14
fffff802`6d4bf426 4883ec40 sub rsp,40h
fffff802`6d4bf42a 488b0527766400 mov rax,qword ptr [nt!PspCidTable (fffff802`6db06a58)]
fffff802`6d4bf431 0fb6ea movzx ebp,dl
fffff802`6d4bf434 f7c1fc030000 test ecx,3FCh
fffff802`6d4bf43a 0f8461010000 je nt!PspReferenceCidTableEntry+0x191 (fffff802`6d4bf5a1)
fffff802`6d4bf440 488bd1 mov rdx,rcx
fffff802`6d4bf443 488bc8 mov rcx,rax
fffff802`6d4bf446 e855730b00 call nt!ExpLookupHandleTableEntry (fffff802`6d5767a0)
fffff802`6d4bf44b 488bf0 mov rsi,rax
fffff802`6d4bf44e 4885c0 test rax,rax
fffff802`6d4bf451 0f844a010000 je nt!PspReferenceCidTableEntry+0x191 (fffff802`6d4bf5a1)
fffff802`6d4bf457 4c8b35fa756400 mov r14,qword ptr [nt!PspCidTable (fffff802`6db06a58)]
fffff802`6d4bf45e 0f0d08 prefetchw [rax]
fffff802`6d4bf461 488b08 mov rcx,qword ptr [rax] //这里引发了分页故障
fffff802`6d4bf464 48894c2420 mov qword ptr [rsp+20h],rcx
fffff802`6d4bf469 488b4808 mov rcx,qword ptr [rax+8]
fffff802`6d4bf46d 48894c2428 mov qword ptr [rsp+28h],rcx
fffff802`6d4bf472 488b7c2420 mov rdi,qword ptr [rsp+20h]
fffff802`6d4bf477 48f7c7feff0100 test rdi,1FFFEh
fffff802`6d4bf47e 7474 je nt!PspReferenceCidTableEntry+0xe4 (fffff802`6d4bf4f4)
fffff802`6d4bf480 40f6c701 test dil,1
fffff802`6d4bf484 0f8498a51c00 je nt!PspReferenceCidTableEntry+0x1ca612 (fffff802`6d689a22)
fffff802`6d4bf48a 488d5ffe lea rbx,[rdi-2]
fffff802`6d4bf48e 488bc7 mov rax,rdi
fffff802`6d4bf491 488bd1 mov rdx,rcx
fffff802`6d4bf494 f0480fc70e lock cmpxchg16b oword ptr [rsi]
fffff802`6d4bf499 488bf8 mov rdi,rax
fffff802`6d4bf49c 4889442420 mov qword ptr [rsp+20h],rax
fffff802`6d4bf4a1 488bca mov rcx,rdx
fffff802`6d4bf4a4 4889542428 mov qword ptr [rsp+28h],rdx
fffff802`6d4bf4a9 0f852b010000 jne nt!PspReferenceCidTableEntry+0x1ca (fffff802`6d4bf5da)
fffff802`6d4bf4af 488bc8 mov rcx,rax
fffff802`6d4bf4b2 48d1e9 shr rcx,1
fffff802`6d4bf4b5 6683f910 cmp cx,10h
fffff802`6d4bf4b9 0f842d010000 je nt!PspReferenceCidTableEntry+0x1dc (fffff802`6d4bf5ec)
fffff802`6d4bf4bf 48c1ff10 sar rdi,10h
fffff802`6d4bf4c3 4883e7f0 and rdi,0FFFFFFFFFFFFFFF0h
fffff802`6d4bf4c7 0fb607 movzx eax,byte ptr [rdi]
fffff802`6d4bf4ca 247f and al,7Fh
fffff802`6d4bf4cc 403ac5 cmp al,bpl
fffff802`6d4bf4cf 0f85c4000000 jne nt!PspReferenceCidTableEntry+0x189 (fffff802`6d4bf599)
fffff802`6d4bf4d5 488bc7 mov rax,rdi
fffff802`6d4bf4d8 488b5c2450 mov rbx,qword ptr [rsp+50h]
fffff802`6d4bf4dd 488b6c2458 mov rbp,qword ptr [rsp+58h]
fffff802`6d4bf4e2 488b742460 mov rsi,qword ptr [rsp+60h]
fffff802`6d4bf4e7 488b7c2468 mov rdi,qword ptr [rsp+68h]
fffff802`6d4bf4ec 4883c440 add rsp,40h
fffff802`6d4bf4f0 415e pop r14
fffff802`6d4bf4f2 c3 ret
fffff802`6d4bf4f3 cc int 3
fffff802`6d4bf4f4 488b0d5d756400 mov rcx,qword ptr [nt!PspCidTable (fffff802`6db06a58)]
fffff802`6d4bf4fb 488bd6 mov rdx,rsi
fffff802`6d4bf4fe 33db xor ebx,ebx
fffff802`6d4bf500 e8ffd1c9ff call nt!ExLockHandleTableEntry (fffff802`6d15c704)
fffff802`6d4bf505 84c0 test al,al
fffff802`6d4bf507 0f8494000000 je nt!PspReferenceCidTableEntry+0x191 (fffff802`6d4bf5a1)
fffff802`6d4bf50d 488b3e mov rdi,qword ptr [rsi]
fffff802`6d4bf510 48c1ff10 sar rdi,10h
fffff802`6d4bf514 4883e7f0 and rdi,0FFFFFFFFFFFFFFF0h
fffff802`6d4bf518 0fb607 movzx eax,byte ptr [rdi]
fffff802`6d4bf51b 247f and al,7Fh
fffff802`6d4bf51d 403ac5 cmp al,bpl
fffff802`6d4bf520 0f85b0000000 jne nt!PspReferenceCidTableEntry+0x1c6 (fffff802`6d4bf5d6)
fffff802`6d4bf526 4080fd03 cmp bpl,3
fffff802`6d4bf52a 747c je nt!PspReferenceCidTableEntry+0x198 (fffff802`6d4bf5a8)
fffff802`6d4bf52c 8b8760050000 mov eax,dword ptr [rdi+560h]
fffff802`6d4bf532 2403 and al,3
fffff802`6d4bf534 3c02 cmp al,2
fffff802`6d4bf536 750a jne nt!PspReferenceCidTableEntry+0x132 (fffff802`6d4bf542)
fffff802`6d4bf538 488bce mov rcx,rsi
fffff802`6d4bf53b e87057c4ff call nt!ExSlowReplenishHandleTableEntry (fffff802`6d104cb0)
fffff802`6d4bf540 8bd8 mov ebx,eax
fffff802`6d4bf542 448d4301 lea r8d,[rbx+1]
fffff802`6d4bf546 0f0d4fd0 prefetchw [rdi-30h]
fffff802`6d4bf54a 488b47d0 mov rax,qword ptr [rdi-30h]
发生故障的位置就在:
fffff802`6d4bf457 4c8b35fa756400 mov r14,qword ptr [nt!PspCidTable]
fffff802`6d4bf45e 0f0d08 prefetchw [rax]
fffff802`6d4bf461 488b08 mov rcx,qword ptr [rax] //这里引发了分页故障
看一下prefetchw汇编指令的说明:
汇编指令prefetch的作用是预取数据或指令到缓存中,以提高程序的执行效率,减少内存访问的延迟。prefetch指令主要是提示处理器提前将指定地址的数据或指令加载到缓存中,它只是发起一个预取请求,并不实际访问数据。
如果[rax]指向地址没有在当前的内存中,而是在分页文件上,那么这个预取操作就会触发分页故障,接下来就去进入到PageFile的读取流程中,如果没有过滤掉 FLTFL_OPERATION_REGISTRATION_SKIP_PAGING_IO ,那么就会引起上面的问题。
分析的过程受限于本人知识与经验,如有错误希望广大网友及时指出,感激不尽。