阅读:2972回复:6
DispatchCreate中读取文件问题
在sfilter的SfCreate例程中,我先复制了一个stream fileobject,
然后用此临时stream fileobject替代original fileobject,下发irp,等待下层处理完成返回,然后再用此stream fileobject构造irp进行读数据,为什么读数据不返回STATUS_END_OF_FILE,我的文件只有几十个字节。 因为我是在一个循环中读取数据的,每次读取512个字节,如果成功返回,并且结果不是STATUS_END_OF_FILE,就把Offset增加512,继续读取。否则跳出循环,现在的现象是Offset不停地增加,不停的读数据,不过缓冲区里面的数据不变。 肯请高手指点,谢谢。 代码片断如下: SfCreate(...) { StreamFileObject = IoCreateStreamFileObjectLite(FileObject, NULL); .... IrpSp->FileObject = StreamFileObject; ... SfForwardIrpSyncronously(...) // 开始根据StreamFileObject构造irp读写数据 SfIssueReadWriteIrpSynchronously(...) } NTSTATUS SfIssueReadWriteIrpSynchronously( IN PDEVICE_OBJECT NextDeviceObject, IN PFILE_OBJECT FileObject, IN PIO_STATUS_BLOCK IoStatus, IN PVOID Buffer, IN ULONG Length, IN PLARGE_INTEGER ByteOffset, IN BOOLEAN ReadIrp ) { PIRP Irp = NULL; PIO_STACK_LOCATION IrpSp = NULL; ULONG MajorFunction; KEVENT Event; NTSTATUS Status; if (ReadIrp) MajorFunction = IRP_MJ_READ; else MajorFunction = IRP_MJ_WRITE; KeInitializeEvent(&Event, NotificationEvent, FALSE); Irp = IoBuildSynchronousFsdRequest( MajorFunction, NextDeviceObject, Buffer, Length, ByteOffset, &Event, IoStatus ); if (!Irp) { return STATUS_INSUFFICIENT_RESOURCES; } Irp->Flags |= IRP_NOCACHE; IrpSp = IoGetNextIrpStackLocation(Irp); IrpSp->FileObject = FileObject; Status = IoCallDriver(NextDeviceObject, Irp); if (STATUS_PENDING == Status) { KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); } return IoStatus->Status; } |
|
最新喜欢:linshi... |
沙发#
发布于:2005-01-22 16:38
补充一下,读取数据,刚开始的时候很正常,但是超过了文件的有效数据长度以后,读取数据缓冲区的内容就不再更新了。
|
|
板凳#
发布于:2005-01-22 16:45
并且IoStatus.Information always 512
|
|
地板#
发布于:2005-01-22 19:14
不好意思,说错了,第一次读取的时候,IoStatus.Information等于文件中数据的大小,现在我加了判断
IoStatus.Information < 512就认为到了文件尾, 不过我不明白的是,我在读取偏移明显大于文件有效数据长度的时候,为什么不返回STATUS_END_OF_FILE或其他值 |
|
地下室#
发布于:2005-01-25 17:34
没记错的话,STATUS_END_OF_FILE是在你要求的偏移大于文件大小时才出的
|
|
5楼#
发布于:2005-01-26 09:27
谢谢关注,end_of_file在偏移大于文件长度时也没有出现,不过问题我已经解决了,每次发送读写irp的时候,把IoStatus.Information置0就可以了,在我的机器上,如果读写偏移大于文件有效数据长度,文件系统不会改写IoStatus.Information,并且返回成功
|
|
6楼#
发布于:2005-03-28 16:07
tooflat,你在create利用复制的流文件对象完成Create并且在随后利用这个文件对象读取文件内容,不知道是怎么实现的,能不能给个详细一点的说明阿,我现在也做基本相同的东西,基本思路已经出来了,可是细节的实现有问题,不能正确读取文件,而且常常bugcheck
|
|