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:fffff8800380a538=????????????????
Resetting default scope
LAST_CONTROL_TRANSFER: from fffff80003f846d2 to fffff80003e86f60
STACK_TEXT:
fffff880036cd268 fffff80003f846d2 : fffff8800380a538 fffffa800295a060 0000000000000065 fffff80003ecd314 : nt!DbgBreakPointWithStatus
fffff880036cd270 fffff80003f854be : fffff88000000003 fffff880036cdb40 fffff80003ec9f30 fffff880036cd8d0 : nt!KiBugCheckDebugBreak+0x12
fffff880036cd2d0 fffff80003e8f004 : fffff80004007e80 fffff80003e86f85 0000000000000010 0000000000000291 : nt!KeBugCheck2+0x71e
fffff880036cd9a0 fffff80003f0e1e4 : 0000000000000050 fffff8800380a538 0000000000000000 fffff880036cdb40 : nt!KeBugCheckEx+0x104
fffff880036cd9e0 fffff80003e8cfee : 0000000000000000 fffffa800295a060 0000000000000000 0000000000000000 : nt! ?? ::FNODOBFM::string'+0x42907 fffff880036cdb40 fffff88002d203af : fffff88002d23020 fffff8800380a530 fffffa8000cd9278 0000000000000000 : nt!KiPageFault+0x16e fffff880036cdcd0 fffff80004132166 : fffff8800380a530 0000000000000000 0000000000000000 0000000000000000 : DllLoadCheck!t+0x1f [d:\2015\dllloadcheck\dllloadcheck\dllloadcheck.c @ 398] fffff880036cdd00 fffff80003e6d486 : fffff80004007e80 fffffa800295a060 fffffa8000daeb60 0000000000000206 : nt!PspSystemThreadStartup+0x5a fffff880036cdd40 0000000000000000 : fffff880036ce000 fffff880036c8000 fffff880036cdd00 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 fffff80003f846d2 nt!DbgBreakPointWithStatus
fffff880036cd270 fffff80003f854be nt!KiBugCheckDebugBreak+0x12
fffff880036cd2d0 fffff80003e8f004 nt!KeBugCheck2+0x71e
fffff880036cd9a0 fffff80003f0e1e4 nt!KeBugCheckEx+0x104
fffff880036cd9e0 fffff80003e8cfee nt! ?? ::FNODOBFM::string'+0x42907 fffff880036cdb40 fffff88002d203af nt!KiPageFault+0x16e fffff880036cdcd0 fffff80004132166 DllLoadCheck!t(struct _IMAGEINFO_ \* pImage = 0xfffff8800380a530)+0x1f [d:\2015\dllloadcheck\dllloadcheck\dllloadcheck.c @ 398]
fffff880036cdd00 fffff80003e6d486 nt!PspSystemThreadStartup+0x5a
fffff880036cdd40 0000000000000000 nt!KxStartSystemThread+0x16
kd> dd 0xfffff8800380a530 fffff8800380a530 ???????? ???????? ???????? ????????
fffff8800380a540 ???????? ???????? ???????? ???????? fffff8800380a550 ???????? ???????? ???????? ????????
fffff8800380a560 ???????? ???????? ???????? ???????? fffff8800380a570 ???????? ???????? ???????? ????????
fffff8800380a580 ???????? ???????? ???????? ???????? fffff8800380a590 ???????? ???????? ???????? ????????
fffff8800380a5a0 ???????? ???????? ???????? ???????? kd\> dd 0xfffff8800380a538
fffff8800380a538 ???????? ???????? ???????? ???????? fffff8800380a548 ???????? ???????? ???????? ????????
fffff8800380a558 ???????? ???????? ???????? ???????? fffff8800380a568 ???????? ???????? ???????? ????????
fffff8800380a578 ???????? ???????? ???????? ???????? fffff8800380a588 ???????? ???????? ???????? ????????
fffff8800380a598 ???????? ???????? ???????? ???????? fffff8800380a5a8 ???????? ???????? ???????? ????????
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 fffff80004132166 DllLoadCheck!t(struct IMAGEINFO * pImage = 0xfffff880`0380a530)+0x1f [d:\2015\dllloadcheck\dllloadcheck\dllloadcheck.c @ 398]
we can know , the pImage = 0xfffff8800380a530 , &pImage-\>path = 0xfffff8800380a538
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?"