macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1784回复:13

文件内容到底在那?

楼主#
更多 发布于:2002-04-16 12:15
用户被禁言,该主题自动屏蔽!

最新喜欢:

lsq77lsq77 baoyibao99baoyib...
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-04-16 12:22
读的时候肯定要等到下层驱动程序把数据读出来才能够看到内容啊!
你可以调用
PIRP
IoBuildSynchronousFsdRequest(
  IN ULONG  MajorFunction,
  IN PDEVICE_OBJECT  DeviceObject,
  IN OUT PVOID  Buffer  OPTIONAL,
  IN ULONG  Length  OPTIONAL,
  IN PLARGE_INTEGER  StartingOffset  OPTIONAL,
  IN PKEVENT  Event,
  OUT PIO_STATUS_BLOCK  IoStatusBlock
  );
来建立IRP
第一个参数就是IRP_MJ_READ
第一个就是你要读写的盘符对应的设备对象
第三个是提供准备接受数据的缓冲区
第四个是要读写的饿长度,也就是你的缓冲区的大小啦
第五个是要读写的偏移,可以是以字节为偏移
第六个是事件,就是当请求完成之后通知你的的事件
第七个就是返回的状态
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-04-16 12:26
还有要注意的是在完成例程里面
if (Irp->PendingReturned) {
     IoMarkIrpPending(Irp); //下层驱动还没有把请求完成
}
macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-04-16 12:33
用户被禁言,该主题自动屏蔽!
macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2002-04-16 12:36
用户被禁言,该主题自动屏蔽!
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-04-16 14:10
呵呵!我以前做过基于文件系统之下的,扇区之上的
这也试过了,但还是不行,可能参数不对吧。
第二个参数我用filemonhookroutine例程里传过来的deviceobject.
这个不对,你应该用下层的设备对象,这个是你自己创建的设备对象,并且是钩挂在别的设备对象之上的,你应该用下一层的设备对象,也就是在钩挂的时候的你保存的下一层设备对象了!

第三
第四是PVOID Buffer = NULL;
ULONG Length = 1024;
Buffer是不是还要分配内存?
内存肯定是需要分配的,用IOALLOC就可以了!
第五个是0,
这个不能为NULL,因为当下层驱动还没有把IRP完成,也就是还在排队的时候,因为IOCALLDRIVER是异步函数,所以你在调用了该函数之后就要等待该事件了,下层驱动把该IRP完成了之后就会把这个事件设置为有效了,也就是信号态
第六个是IO_STATUS_BLOCK IoStatusBlock;
这个是下层驱动程序完成IRP的状态,是一个返回值
macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2002-04-16 15:48
用户被禁言,该主题自动屏蔽!
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-04-16 17:10
你的第二个参数不对,应该是
PHOOK_EXTENSION hookExt=DeviceObject->DeviceExtension
hookExt->FileSystem
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-04-16 17:24
这个是FILEMON例子的一个函数声明,我觉得应该是对的,不知道你哪里搞错了,我现在给你说一下吧
FilemonQueryFile(
    PDEVICE_OBJECT DeviceObject,
    PFILE_OBJECT FileObject,
    FILE_INFORMATION_CLASS FileInformationClass,
    PVOID FileQueryBuffer,
    ULONG FileQueryBufferLength
    )
DeviceObject
这个是hookExt->FileSystem,也就是自己钩挂的对象,注意,不是自己创建的对象是调用钩挂函数的时候返回来的对象
FileObject,这个是上面往下传的文件对象
FileInformationClass,类型
FileQueryBuffer,      输出缓冲区
FileQueryBufferLength   缓冲区长度
macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2002-04-16 18:58
用户被禁言,该主题自动屏蔽!
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-04-16 20:41
这个在读请求的时候就不叫这个了,你去看看IRP的结构吧!呵呵
里面有两项,一个是长度,一个是偏移
macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2002-04-17 11:02
用户被禁言,该主题自动屏蔽!
Supermi
驱动牛犊
驱动牛犊
  • 注册日期2001-10-20
  • 最后登录2014-06-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-04-18 16:14
Hi,macy:

你说得对,就在IRP_MJ_READ时加个完成例程就可以了。

只是在完成程例里,加入一些代码,你需要知道:
Irp->AssociatedIrp.SystemBuffer
当DeviceObject->Flags被置为DO_BUFFERED_IO时,该参数表明一个由系统提供的缓冲指针,读出的数据将放在这.如果他为NULL(即没有DO_BUFFERED_IO标志),看下文.

Irp->MdlAddress
一个MDL的地址,该MDL描述了读出的数据所在的内存页。该参数一般与Irp->UserBuffer 联合使用,如果他为NULL,但IRP请求又不是来自核心的话,你可以ALLOC一个MDL(把Irp->UserBuffer 作为第一个参数),然后诊断并锁定该MDL,然后查看里头的数据

Irp->UserBuffer
一个指向用户提供的缓冲的指针,该缓冲用于接受从文件读来的数据.但不能直接用,因为核态的内存空间,与用户态的内存空间描述不同.

IrpSp->Parameters.Read.Length
返回读取文件的字节数

其他的参数看着名字都该会吧,:)就不多说
如有描述不当之处,欢迎指正
macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2002-04-18 17:09
用户被禁言,该主题自动屏蔽!
游客

返回顶部