阅读:1005回复:2
一个关于MDL分割的问题
我的驱动程序里要处理大批量数据处理,所以用Direct I/O方式。程序为中间层驱动程序。操作系统及ddk均为win2k。
当我拿到Irp->MdlAddress后,我对MDL进行如下分割,请牛虫们帮我看看错在哪里了: 1.获取总的MDL的system virtual address。 PUCHAR pBuffer = (PUCHAR) MmGetSystemAddressForMdlSafe( Irp->MdlAddress, NormalPagePriority ); 2.分配一个小MDL。其中UnitLength为单次能处理的最大数据长度。 PMDL CurrentTransferMdl =IoAllocateMdl( pBuffer, UnitLength, FALSE, FALSE, NULL); if(CurrentTransferMdl == NULL){返回错误...} 3.总的MDL分割成小的MDL: IoBuildPartialMdl( Irp->MdlAddress, CurrentTransferMdl, pBuffer, UnitLength); 以上做法正确吗?主要是不知道怎么多次分割,以后的调用中,IoBuildPartialMdl的第三个参数(VirtualAddress)是不是一直设成pBuffer? 我在以上操作后,再: PUCHAR CurMdlVa = (PUCHAR) MmGetSystemAddressForMdlSafe( CurrentTransferMdl, NormalPagePriority ); if( CurMdlVa ==NULL ){错误处理} else { 读取CurMdlVa处的数据;// a } 程序运行到a处时,系统立即重新启动。恼火哦! |
|
沙发#
发布于:2003-03-03 14:13
1、最先要调用MmProbeAndLockPages(你的错误好象是由此产生的)
2、IoBuildPartialMdl的参数中虚拟地址和长度要小心,可能要4K的倍数。 |
|
|
板凳#
发布于:2003-03-11 19:56
1.我的是中间层驱动,按照ddk,应该是不用锁定,因为上层已经帮我锁定了。
2.这是对的,以前我没注意到这一点。这个问题由另外一个师兄解决了,好象我设的固定虚拟地址是错的,应该使该指针移动,即分割出一个小MDL,虚拟地址指针就往后移动一点。 谢谢你的回答! |
|