tianzh
驱动牛犊
驱动牛犊
  • 注册日期2005-01-24
  • 最后登录2005-02-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1412回复:3

IRP_MJ_READ 的问题

楼主#
更多 发布于:2005-01-24 12:11

最近找到一个将内存虚拟成硬盘的代码-- Ramdisk,估计有人知道的。
我想将内存换成一个文件,通过FileMapping来操作,本来一切看起来OK.

SectionHandle是在AddDevice的时候创建的,

在 IRP_MJ_WRITE的时候,ZwMapViewOfSection, 第二个参数传递的是NtCurrentProcess(), 一切OK


但是在IRP_MJ_READ的时候,ZwMapViewOfSection失败,返回STATUS_INVALID_HANDLE(0xC0000008L)。

通过PsGetCurrentProcessId,得知在IRP_MJ_WRITE时返回4(System),正常;但是在IRP_MJ_READ的时候返回的是236,是我的Explorer.exe的进程ID,为什么回到用户模式了?

有人知道吗?
zhangshengyu
驱动老牛
驱动老牛
  • 注册日期2003-10-03
  • 最后登录2016-07-26
  • 粉丝0
  • 关注0
  • 积分792分
  • 威望696点
  • 贡献值41点
  • 好评度499点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2005-01-26 17:24
FILEDISK 子类又不是磁盘驱动只是个普通的驱动只是处理了几个IRP而已,不可能在磁盘管理器中出现的。
---内核开发合作或提供基础技术服务QQ:22863668 ---
tianzh
驱动牛犊
驱动牛犊
  • 注册日期2005-01-24
  • 最后登录2005-02-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-01-26 16:31
前一个问题模仿filedisk,得到解决,也是启动了一个线程来单独相应IRP_MJ_WRITE 和 IRP_MJ_READ,现在也不明白为什么READ的时候会切换回用户模式。

但是由新问题,不知道哪里有问题,只能格式化成FAT和FAT32,不能格式化成NTFS,跟以前提到 FILEDISK 遇到问题的相反。但是在cmd窗口中,通过format命令缺不会报告错误,chkdsk也正常,但是访问不了,邪门!!!

我没有实现 IOCTL_DISK_GET_LENGTH_INFO,因为好像实现后,连FAT也格式不了。

我的系统是WINXP,why????

有什么办法能在磁盘管理器中显示???
tianzh
驱动牛犊
驱动牛犊
  • 注册日期2005-01-24
  • 最后登录2005-02-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-01-24 12:49
在FILEDISK的那个例子中,是通过一个 FileDiskThread的系统线程来实现所有的IO操作,这样应该一定是可以的,因为环境应该都是内核模式,但是为什么要这样多一个线程来处理?难道就是为了躲避 IRP_MJ_READ这个样的切换回用户态的问题?

在FILEDISK的例子中,在IRP_MJ_READ的时候为什么分配了一个临时的buffer缓冲,来读取数据,然后COPY。为什么不直接读取到输出缓冲区(system_buffer),难道ZwReadFile有可能将返回的数据强制页对齐之类的,害怕覆盖多于输出缓冲区的内容?

如果文件很大,使用Filemappingde方式是否回比通过ZwReadFile要快???
游客

返回顶部