kd> !analyze -v
*******************************************************************************
* *
* Bugcheck Analysis *
* *
*******************************************************************************
PAGE_FAULT_IN_NONPAGED_AREA (50)
Invalid system memory was referenced. This cannot be protected by try-except,
it must be protected by a Probe. Typically the address is just plain bad or it
is pointing at freed memory.
Arguments:
Arg1: fffff8800380a538, memory referenced.
Arg2: 0000000000000000, value 0 = read operation, 1 = write operation.
Arg3: fffff88002d203af, If non-zero, the instruction address which referenced the bad memory
address.
Arg4: 0000000000000000, (reserved)
Debugging Details:
READ_ADDRESS: fffff8800380a538
FAULTING_IP:
DllLoadCheck!t+1f [d:\2015\dllloadcheck\dllloadcheck\dllloadcheck.c @ 398]
fffff880`02d203af 488b5208 mov rdx,qword ptr [rdx+8]
MM_INTERNAL_CODE: 0
IMAGE_NAME: DllLoadCheck.sys
DEBUG_FLR_IMAGE_TIMESTAMP: 5690ccc0
MODULE_NAME: DllLoadCheck
FAULTING_MODULE: fffff88002d1f000 DllLoadCheck
DEFAULT_BUCKET_ID: VISTA_DRIVER_FAULT
BUGCHECK_STR: 0x50
PROCESS_NAME: System
CURRENT_IRQL: 2
TRAP_FRAME: fffff880036cdb40 – (.trap 0xfffff880036cdb40)
NOTE: The trap frame does not contain all registers.
Some register values may be zeroed or incorrect.
rax=0000000000000000 rbx=0000000000000000 rcx=9a78d654450f0000
rdx=fffff8800380a530 rsi=0000000000000000 rdi=0000000000000000
rip=fffff88002d203af rsp=fffff880036cdcd0 rbp=0000000000000080
r8=0000000000000065 r9=0000000000000003 r10=0000000000000000
r11=000000000000000c r12=0000000000000000 r13=0000000000000000
r14=0000000000000000 r15=0000000000000000
iopl=0 nv up ei ng nz na pe nc
DllLoadCheck!t+0x1f:
fffff88002d203af 488b5208 mov rdx,qword ptr [rdx+8] ds:0001:fffff880
0380a538=???
Resetting default scope
LAST_CONTROL_TRANSFER: from fffff80003f846d2 to fffff80003e86f60
STACK_TEXT:
fffff880036cd268 fffff800
03f846d2 : fffff8800380a538 fffffa80
0295a060 0000000000000065 fffff800
03ecd314 : nt!DbgBreakPointWithStatus
fffff880036cd270 fffff800
03f854be : fffff88000000003 fffff880
036cdb40 fffff80003ec9f30 fffff880
036cd8d0 : nt!KiBugCheckDebugBreak+0x12
fffff880036cd2d0 fffff800
03e8f004 : fffff80004007e80 fffff800
03e86f85 0000000000000010 00000000
00000291 : nt!KeBugCheck2+0x71e
fffff880036cd9a0 fffff800
03f0e1e4 : 0000000000000050 fffff880
0380a538 0000000000000000 fffff880
036cdb40 : nt!KeBugCheckEx+0x104
fffff880036cd9e0 fffff800
03e8cfee : 0000000000000000 fffffa80
0295a060 0000000000000000 00000000
00000000 : nt! ?? ::FNODOBFM::string'+0x42907 fffff880
036cdb40 fffff88002d203af : fffff880
02d23020 fffff8800380a530 fffffa80
00cd9278 0000000000000000 : nt!KiPageFault+0x16e fffff880
036cdcd0 fffff80004132166 : fffff880
0380a530 0000000000000000 00000000
00000000 0000000000000000 : DllLoadCheck!t+0x1f [d:\2015\dllloadcheck\dllloadcheck\dllloadcheck.c @ 398] fffff880
036cdd00 fffff80003e6d486 : fffff800
04007e80 fffffa800295a060 fffffa80
00daeb60 0000000000000206 : nt!PspSystemThreadStartup+0x5a fffff880
036cdd40 0000000000000000 : fffff880
036ce000 fffff880036c8000 fffff880
036cdd00 00000000`00000000 : nt!KxStartSystemThread+0x16
STACK_COMMAND: kb
FOLLOWUP_IP:
DllLoadCheck!t+1f [d:\2015\dllloadcheck\dllloadcheck\dllloadcheck.c @ 398]
fffff880`02d203af 488b5208 mov rdx,qword ptr [rdx+8]
FAULTING_SOURCE_CODE:
394: {
395: __try
396: {
397: DbgPrint(“img:%p\n”,pImage);
398: if(MzfGetFileFullPathPreCreate(pImage->fileobject,pImage->path))
399: {
400: MD5File(pImage->path,pImage->md5);
401: }
402:
403: }__except(1)
SYMBOL_STACK_INDEX: 6
SYMBOL_NAME: DllLoadCheck!t+1f
FOLLOWUP_NAME: MachineOwner
FAILURE_BUCKET_ID: X64_0x50_DllLoadCheck!t+1f
BUCKET_ID: X64_0x50_DllLoadCheck!t+1f
Followup: MachineOwner
kd> kp
Child-SP RetAddr Call Site
fffff880036cd268 fffff800
03f846d2 nt!DbgBreakPointWithStatus
fffff880036cd270 fffff800
03f854be nt!KiBugCheckDebugBreak+0x12
fffff880036cd2d0 fffff800
03e8f004 nt!KeBugCheck2+0x71e
fffff880036cd9a0 fffff800
03f0e1e4 nt!KeBugCheckEx+0x104
fffff880036cd9e0 fffff800
03e8cfee nt! ?? ::FNODOBFM::string'+0x42907 fffff880
036cdb40 fffff88002d203af nt!KiPageFault+0x16e fffff880
036cdcd0 fffff80004132166 DllLoadCheck!t(struct _IMAGEINFO_ \* pImage = 0xfffff880
0380a530)+0x1f [d:\2015\dllloadcheck\dllloadcheck\dllloadcheck.c @ 398]
fffff880036cdd00 fffff800
03e6d486 nt!PspSystemThreadStartup+0x5a
fffff880036cdd40 00000000
00000000 nt!KxStartSystemThread+0x16
kd> dd 0xfffff8800380a530 fffff880
0380a530 ??? ??? ??? ???
fffff8800380a540 ???????? ???????? ???????? ???????? fffff880
0380a550 ??? ??? ??? ???
fffff8800380a560 ???????? ???????? ???????? ???????? fffff880
0380a570 ??? ??? ??? ???
fffff8800380a580 ???????? ???????? ???????? ???????? fffff880
0380a590 ??? ??? ??? ???
fffff8800380a5a0 ???????? ???????? ???????? ???????? kd\> dd 0xfffff880
0380a538
fffff8800380a538 ???????? ???????? ???????? ???????? fffff880
0380a548 ??? ??? ??? ???
fffff8800380a558 ???????? ???????? ???????? ???????? fffff880
0380a568 ??? ??? ??? ???
fffff8800380a578 ???????? ???????? ???????? ???????? fffff880
0380a588 ??? ??? ??? ???
fffff8800380a598 ???????? ???????? ???????? ???????? fffff880
0380a5a8 ??? ??? ??? ???
code which created the thread:
// all local variables
UCHAR pMd5[33]={0};
UNICODE_STRING Path={0};
Image_Info imginfo;
//need check return
Path.Buffer = ExAllocatePool(NonPagedPool,1024);
Path.MaximumLength = 1024;
Path.Length = 0;
RtlZeroMemory(Path.Buffer,1024);
imginfo.path = &Path;
imginfo.md5 = &pMd5;
imginfo.fileobject = fileObject;
//need check return
PsCreateSystemThread(&hThread,THREAD_ALL_ACCESS,NULL,NULL,&cid,t,&imginfo);
PsLookupThreadByThreadId(cid.UniqueThread,&threadObj);
KeWaitForSingleObject(threadObj,Executive,KernelMode,TRUE,0);
ObDereferenceObject(threadObj);
ZwClose(hThread);
DbgPrint(“%wZ–%s\n”,&Path,pMd5);
ExFreePool(Path.Buffer);
thread code:
void t(Image_Info* pImage)
{
__try
{
DbgPrint(“img:%p\n”,pImage);
if(MzfGetFileFullPathPreCreate(pImage->fileobject,pImage->path))
{
MD5File(pImage->path,pImage->md5);
}
}__except(1)
{
DbgPrint(“except\n”);
}
PsTerminateSystemThread(STATUS_SUCCESS);
}
struct:
typedef struct IMAGEINFO
{
PFILE_OBJECT fileobject;
PUNICODE_STRING path;
PCHAR md5;
}Image_Info;
according to stack:
fffff880036cdcd0 fffff800
04132166 DllLoadCheck!t(struct IMAGEINFO * pImage = 0xfffff880`0380a530)+0x1f [d:\2015\dllloadcheck\dllloadcheck\dllloadcheck.c @ 398]
we can know , the pImage = 0xfffff8800380a530 , &pImage-\>path = 0xfffff880
0380a538
before calling MzfGetFileFullPathPreCreate , 0xfffff880`0380a530 (pImage) is already paged out.
I tried KeSetKernelStackSwapEnable , it did’nt work,got bugcheck too.
may be I should allocate nonpagedpool for struct Image_Info but not putting it in stack;
!analyze -v displays CURRENT_IRQL: 2 , why the system thread runs on IRQL 2 ? because of the “__try?”