阅读:1785回复:13
文件内容到底在那?用户被禁言,该主题自动屏蔽! |
|
沙发#
发布于: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 第一个就是你要读写的盘符对应的设备对象 第三个是提供准备接受数据的缓冲区 第四个是要读写的饿长度,也就是你的缓冲区的大小啦 第五个是要读写的偏移,可以是以字节为偏移 第六个是事件,就是当请求完成之后通知你的的事件 第七个就是返回的状态 |
|
板凳#
发布于:2002-04-16 12:26
还有要注意的是在完成例程里面
if (Irp->PendingReturned) { IoMarkIrpPending(Irp); //下层驱动还没有把请求完成 } |
|
地板#
发布于:2002-04-16 12:33
用户被禁言,该主题自动屏蔽! |
|
地下室#
发布于:2002-04-16 12:36
用户被禁言,该主题自动屏蔽! |
|
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的状态,是一个返回值 |
|
6楼#
发布于:2002-04-16 15:48
用户被禁言,该主题自动屏蔽! |
|
7楼#
发布于:2002-04-16 17:10
你的第二个参数不对,应该是
PHOOK_EXTENSION hookExt=DeviceObject->DeviceExtension hookExt->FileSystem |
|
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 缓冲区长度 |
|
9楼#
发布于:2002-04-16 18:58
用户被禁言,该主题自动屏蔽! |
|
10楼#
发布于:2002-04-16 20:41
这个在读请求的时候就不叫这个了,你去看看IRP的结构吧!呵呵
里面有两项,一个是长度,一个是偏移 |
|
11楼#
发布于:2002-04-17 11:02
用户被禁言,该主题自动屏蔽! |
|
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 返回读取文件的字节数 其他的参数看着名字都该会吧,:)就不多说 如有描述不当之处,欢迎指正 |
|
13楼#
发布于:2002-04-18 17:09
用户被禁言,该主题自动屏蔽! |
|