tonyfirst1
驱动牛犊
驱动牛犊
  • 注册日期2008-02-26
  • 最后登录2010-08-06
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望138点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
阅读:1456回复:3

请教:关于filedisk读请求分配内存的问题。

楼主#
更多 发布于:2009-02-11 13:43
case IRP_MJ_READ:
                system_buffer = (PUCHAR) MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority);
                if (system_buffer == NULL)
                {
                    irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
                    irp->IoStatus.Information = 0;
                    break;
                }
                buffer = (PUCHAR) ExAllocatePool(PagedPool, io_stack->Parameters.Read.Length);                if (buffer == NULL)
                {
                    irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
                    irp->IoStatus.Information = 0;
                    break;
                }
                ZwReadFile(
                    device_extension->file_handle,
                    NULL,
                    NULL,
                    NULL,
                    &irp->IoStatus,
                    buffer,
                    io_stack->Parameters.Read.Length,
                    &io_stack->Parameters.Read.ByteOffset,
                    NULL
                    );
               RtlCopyMemory(system_buffer, buffer, io_stack->Parameters.Read.Length);                ExFreePool(buffer);
                break;


这里为什么要分配内存,而不直接使用system_buffer ,希望大家可以给出一个好的说法。
tonyfirst1
驱动牛犊
驱动牛犊
  • 注册日期2008-02-26
  • 最后登录2010-08-06
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望138点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-02-12 09:23
补充:如果不分配内存,会引起缓存管理器将读出来的数据,修改为脏页数据,将延迟写到磁盘上。
wanted999
驱动牛犊
驱动牛犊
  • 注册日期2006-03-28
  • 最后登录2012-08-13
  • 粉丝0
  • 关注0
  • 积分519分
  • 威望429点
  • 贡献值0点
  • 好评度48点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-02-20 21:07
这让做不仅安全,
速度也会比较快.
tonyfirst1
驱动牛犊
驱动牛犊
  • 注册日期2008-02-26
  • 最后登录2010-08-06
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望138点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
地板#
发布于:2009-02-26 10:32
我找到的答案:

直接调用ZwReadFile()会lock一个MDL出来,实际上这个buf已经是文件系统LOCK一次的了。两次lock一个buf就会导致数据被认为是脏页数据,回写到磁盘上。

解决:直接构造IRP call RAW这个驱动,相当于直接CALL物理磁盘驱动,这样就不会lock两次,问题得到解决。
游客

返回顶部