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

一个关于MDL分割的问题

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

Sunbeam
驱动小牛
驱动小牛
  • 注册日期2001-10-29
  • 最后登录2010-01-29
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-03-03 14:13
1、最先要调用MmProbeAndLockPages(你的错误好象是由此产生的)
2、IoBuildPartialMdl的参数中虚拟地址和长度要小心,可能要4K的倍数。
堂堂正正做人,明明白白做事
daor
驱动牛犊
驱动牛犊
  • 注册日期2001-05-16
  • 最后登录2018-04-15
  • 粉丝0
  • 关注0
  • 积分-25分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-03-11 19:56
1.我的是中间层驱动,按照ddk,应该是不用锁定,因为上层已经帮我锁定了。
2.这是对的,以前我没注意到这一点。这个问题由另外一个师兄解决了,好象我设的固定虚拟地址是错的,应该使该指针移动,即分割出一个小MDL,虚拟地址指针就往后移动一点。

谢谢你的回答!
游客

返回顶部