stormjiang
驱动牛犊
驱动牛犊
  • 注册日期2003-01-22
  • 最后登录2005-01-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1072回复:1

MDL->Next

楼主#
更多 发布于:2004-11-01 14:07
我想把mdl捣鼓的大一些,但ifs-ddk上说缓存的长度是有限制的,可我确实要写入大于极限长度的数据块该咋办啊?

下面是我想出的两招:
1.多发个irp,好像会宕机
2.我发现mdl有个next字段,打了它好长时间的主意也没成功,这是不是形成mdl链的字段啊?

我的部分代码入下:

IRP_MJ_WRITE:
                
// 目标:把原有内容复制一份, 最加在后面

OriginBuffer = (PCHAR)MmGetSystemAddressForMdl( Irp->MdlAddress );
OriginSize = MmGetMdlByteCount( Irp->MdlAddress );

currentIrpStack->Parameters.Write.Length *= 2;
ReplaceSize   = OriginSize;

ReplaceBuffer1 = ExAllocatePool( NonPagedPool, ReplaceSize);
RtlZeroMemory( ReplaceBuffer1, ReplaceSize );

ReplaceBuffer2= ExAllocatePool( NonPagedPool, ReplaceSize);
RtlZeroMemory( ReplaceBuffer2, ReplaceSize );

RtlCopyMemory( ReplaceBuffer1, OriginBuffer, OriginSize );
RtlCopyMemory( ReplaceBuffer2, OriginBuffer, OriginSize );

Irp->MdlAddress = NULL;
ReplaceMdl1 = IoAllocateMdl( ReplaceBuffer1, OriginSize, FALSE, FALSE, Irp );
ReplaceMdl2 = IoAllocateMdl( ReplaceBuffer2, OriginSize, TRUE , FALSE, Irp );

MmBuildMdlForNonPagedPool( ReplaceMdl  );
MmBuildMdlForNonPagedPool( ReplaceMdl2 );

Irp->UserBuffer = MmGetMdlVirtualAddress( ReplaceMdl );

// 至此Irp->MdlAddress->Next已经有值, 但系统好像没写入Irp->MdlAddress->Next中的东东啊???

各路神仙帮帮我!!!
punk
驱动小牛
驱动小牛
  • 注册日期2001-04-07
  • 最后登录2018-06-01
  • 粉丝0
  • 关注0
  • 积分621分
  • 威望164点
  • 贡献值0点
  • 好评度60点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-11-01 14:39
我想把mdl捣鼓的大一些,但ifs-ddk上说缓存的长度是有限制的,可我确实要写入大于极限长度的数据块该咋办啊?

下面是我想出的两招:
1.多发个irp,好像会宕机
2.我发现mdl有个next字段,打了它好长时间的主意也没成功,这是不是形成mdl链的字段啊?

我的部分代码入下:

IRP_MJ_WRITE:
                
// 目标:把原有内容复制一份, 最加在后面

OriginBuffer = (PCHAR)MmGetSystemAddressForMdl( Irp->MdlAddress );
OriginSize = MmGetMdlByteCount( Irp->MdlAddress );

currentIrpStack->Parameters.Write.Length *= 2;
ReplaceSize   = OriginSize;

ReplaceBuffer1 = ExAllocatePool( NonPagedPool, ReplaceSize);
RtlZeroMemory( ReplaceBuffer1, ReplaceSize );

ReplaceBuffer2= ExAllocatePool( NonPagedPool, ReplaceSize);
RtlZeroMemory( ReplaceBuffer2, ReplaceSize );

RtlCopyMemory( ReplaceBuffer1, OriginBuffer, OriginSize );
RtlCopyMemory( ReplaceBuffer2, OriginBuffer, OriginSize );

Irp->MdlAddress = NULL;
ReplaceMdl1 = IoAllocateMdl( ReplaceBuffer1, OriginSize, FALSE, FALSE, Irp );
ReplaceMdl2 = IoAllocateMdl( ReplaceBuffer2, OriginSize, TRUE , FALSE, Irp );

MmBuildMdlForNonPagedPool( ReplaceMdl  );
MmBuildMdlForNonPagedPool( ReplaceMdl2 );

Irp->UserBuffer = MmGetMdlVirtualAddress( ReplaceMdl );

// 至此Irp->MdlAddress->Next已经有值, 但系统好像没写入Irp->MdlAddress->Next中的东东啊???

估计fsd根本不注意next字段;
ndis中next字段是有用的

各路神仙帮帮我!!!
 
不停学习
游客

返回顶部