daor
驱动牛犊
驱动牛犊
  • 注册日期2001-05-16
  • 最后登录2018-04-15
  • 粉丝0
  • 关注0
  • 积分-25分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:951回复:0

一个关于MDL分割的问题

楼主#
更多 发布于:2003-02-28 17:43
我的驱动程序里要处理大批量数据处理,所以用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处时,系统立即重新启动。恼火哦!
游客

返回顶部