“0x7c80168e” 指令引用的“0x00000000”内存,该内存不能为“written”

hushengqiang 2016-05-26 07:38:38
我写了一个驱动程序,在驱动程序里我使用IoAllocateMdl分配了一段内存空间,然后映射到应用程序。驱动程序我写完之后安装上了。然后我就开始运行应用程序,应用程序给驱动程序发送IO控制码,要求获得共享的内存地址(其他啥也没干)。但是这个时候就弹出一个错误提示框:


但是我看windbg中,驱动并没有发生错误。我猜想可能是我调用IoAllocateMdl这个方法用得不正确。IoAllocateMdl有一个起始地址,但是我直接给的是NULL。我不是很明白。下面是我的代码:
NTSTATUS DemoDevControl(IN PDEVICE_OBJECT DeviceObject,PIRP Irp){
NTSTATUS status = STATUS_SUCCESS;
PVOID pOutBuf = NULL ,pSysAddr = NULL,m_DMAMemory=NULL;
PMDL pMdl;
PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp);
ULONG uControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;
//PHYSICAL_ADDRESS maxPhysicalAddress,m_DMAPhysicalMemory;
DBGPRINT(("DemoDevControl\n"));
switch(uControlCode){
case IOCTL_SHARE_MEMORY:
pOutBuf = Irp->AssociatedIrp.SystemBuffer;
DBGPRINT((" before IoAllocateMdl\r\n"));
pMdl = IoAllocateMdl(pSysAddr,10,FALSE,FALSE,NULL);
if(pMdl == NULL){
DBGPRINT(("IoAllocateMdl Sorry Failed !\r\n"));
status = STATUS_UNSUCCESSFUL;
break;
}
DBGPRINT((" before MmBuildMdlForNonPagedPool\r\n"));
MmBuildMdlForNonPagedPool(pMdl);
DBGPRINT(("MmMapLockedPagesSpecifyCache\r\n"));
_try{
pOutBuf = MmMapLockedPagesSpecifyCache(
pMdl,
UserMode,
MmNonCached,
NULL,
FALSE,
NormalPagePriority
);
DBGPRINT(("is everything fine?\r\n"));
if(NULL == *(ULONG*)pOutBuf){
DBGPRINT(("Sorry Failed !\r\n"));
status = STATUS_UNSUCCESSFUL;
IoFreeMdl(pMdl);
break;
}
}_except(EXCEPTION_EXECUTE_HANDLER)
{
DBGPRINT(("MmMapLockedPagesSpecifyCache exception\n"));
}
break;
default:
break;
}
return status;
}

...全文
605 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
hd378 2016-06-22
  • 打赏
  • 举报
回复
楼主用法有误,能正常运行才怪。 IoAllocateMdl是给一个MDL分配空间,而不是分配一段内存。而MDL是用来描述一段内存的 你要先分配一段内存,比如用MmAllocateContiguousMemory(非分页内存) 这样会得到一个内核内存地址 然后用IoAllocateMdl分配一个MDL来描述这个地址(IoAllocateMdl起始地址填上面分配的那个地址) 然后再MmBuildMdlForNonPagedPool 最后才MmMapLockedPagesSpecifyCache映射到用户空间。 这是非分页内存。如果你想分配分页内存的话,那要用MmAllocatePagesForMdl 把分给我吧。还有什么问题,可以加我QQ511795070
hushengqiang 2016-05-29
  • 打赏
  • 举报
回复
貌似我都看不懂
赵4老师 2016-05-27
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止

21,619

社区成员

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

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