windows 7 64位 PCIe驱动加载出现蓝屏

bmw_x16 bmw_x16 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
各位大神:
最近开发一个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;


...全文
评论 6
收藏 已收藏
分享
返回顶部
bmw_x16
驱动开发/核心开发 21,620 成员 21,709 内容