windows 7 64位 PCIe驱动加载出现蓝屏
各位大神:
最近开发一个PCIe子卡的驱动,目标平台windows 7 64位。但是加载驱动出现蓝屏,通过windbg打印dump信息如下:
1: 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: fffff6fb415ffe90, memory referenced.
Arg2: 0000000000000000, value 0 = read operation, 1 = write operation.
Arg3: fffff80004081131, If non-zero, the instruction address which referenced the bad memory
address.
Arg4: 0000000000000002, (reserved)
Debugging Details:
------------------
READ_ADDRESS: fffff6fb415ffe90
FAULTING_IP:
nt!MmBuildMdlForNonPagedPool+81
fffff800`04081131 488b4500 mov rax,qword ptr [rbp]
MM_INTERNAL_CODE: 2
DEFAULT_BUCKET_ID: VISTA_DRIVER_FAULT
BUGCHECK_STR: 0x50
PROCESS_NAME: System
CURRENT_IRQL: 0
分析蓝屏原因是由于调用了MmBuildMdlForNonPagedPool接口导致,现附上关键代码,求大神相助:
status = WdfCommonBufferCreate(DevExt->DmaEnabler,
sizeof(GXPCI_QUEUE_STATUS_ARRAY),
WDF_NO_OBJECT_ATTRIBUTES,
&DevExt->QueueStatusArrayComBuf);
//TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP, "dma buffer for queue status=%d!", sizeof(GXPCI_QUEUE_STATUS_ARRAY));
if (!NT_SUCCESS(status))
{
TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP, "WdfCommonBufferCreate (read) failed %!STATUS!", status);
return status;
}
DevExt->PQueueStatusArrayComBufBase =
WdfCommonBufferGetAlignedVirtualAddress(DevExt->QueueStatusArrayComBuf);
DevExt->PQueueStatusArrayComBufBaseLa =
WdfCommonBufferGetAlignedLogicalAddress(DevExt->QueueStatusArrayComBuf);
DevExt->PMdlQueueStatusArray = IoAllocateMdl(DevExt->QueueStatusArrayComBuf, sizeof(GXPCI_QUEUE_STATUS_ARRAY), FALSE, FALSE, NULL);
DbgBreakPoint();
DbgPrint("DevExt->PMDlQueueStatusArray = %p\n", DevExt->PMdlQueueStatusArray);
if (!DevExt->PMdlQueueStatusArray)
{
TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
"IoAllocateMdl (read) failed");
status = STATUS_UNSUCCESSFUL;
return status;
}
RtlZeroMemory((void*)(DevExt->PQueueStatusArrayComBufBase), sizeof(GXPCI_QUEUE_STATUS_ARRAY));
DbgBreakPoint();
DbgPrint("DevExt = %p\n", DevExt);
DbgPrint("&DevExt->PMDlQueueStatusArray = %p\n",&DevExt->PMdlQueueStatusArray);
DbgPrint("DevExt->PMDlQueueStatusArray = %p\n", DevExt->PMdlQueueStatusArray);
DbgPrint("DevExt->PMDlQueueStatusArray->size = %d\n", DevExt->PMdlQueueStatusArray->Size);
MmBuildMdlForNonPagedPool(DevExt->PMdlQueueStatusArray);
DevExt->IsMappedQueueStatusArray = FALSE;