阅读:951回复:0
一个关于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处时,系统立即重新启动。恼火哦! |
|