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

bmw_x16 2015-08-07 04:23:29
各位大神:
最近开发一个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;


...全文
688 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
curious_cat 2015-08-12
  • 打赏
  • 举报
回复
把COMMONBUFFER设置小点试试;
curious_cat 2015-08-10
  • 打赏
  • 举报
回复
大致思路: 1)先在32位系统下调试驱动(32位系统驱动程序不需要数字签名); 2)测试通过后,再编译64位版本, 然后在64位系统下测试。 仔细查看下文档,比如WDK里面的文档, 很多API都是有使用条件的。 按照过往经验,64位系统驱动搞起来确实很麻烦,有很多莫名其妙的问题。
曹大夯 2015-08-10
  • 打赏
  • 举报
回复
引用 楼主 bmw_x16 的回复:
DevExt->PMdlQueueStatusArray = IoAllocateMdl(DevExt->QueueStatusArrayComBuf, sizeof(GXPCI_QUEUE_STATUS_ARRAY), FALSE, FALSE, NULL);

是不是应该:

DevExt->PMdlQueueStatusArray = IoAllocateMdl(DevExt->PQueueStatusArrayComBufBase, sizeof(GXPCI_QUEUE_STATUS_ARRAY), FALSE, FALSE, NULL);
曹大夯 2015-08-10
  • 打赏
  • 举报
回复
引用 4 楼 bmw_x16 的回复:
在32位系统上系统上已做过验证,并可以正常使用。现移到64位,由于证书还没办法,所以现在是在禁止驱动签名模式下调试的。
如果32位系统是可以工作的,到64位系统下有这样的问题确实很奇怪. 也许你得对比32位系统看一下64位系统各个函数返回值, 分配内存的大小有什么区别没有.
bmw_x16 2015-08-10
  • 打赏
  • 举报
回复
在32位系统上系统上已做过验证,并可以正常使用。现移到64位,由于证书还没办法,所以现在是在禁止驱动签名模式下调试的。
夜鹰 2015-08-08
  • 打赏
  • 举报
回复
#由Windows版移至驱动开发版

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧