阅读:1565回复:7
怎么搞的,读一个文件这么难?还是关于文件过滤
我的驱动终于能转向了,并且可以读到数据给应用程序。可是利用cmd.txt type 一个文件时,系统会不停的调用read例程,并且传过来的起始地址和偏移量总是0、512,这样就进入死循环,不停地读文件的头512字节。可是我自己的测试应用程序使用readfile+setfilepointer
却很正常的读到了文件。 这是什么原因呢?请高手指教。 |
|
最新喜欢:aasa2 |
沙发#
发布于:2002-04-26 12:30
我的驱动终于能转向了,并且可以读到数据给应用程序。可是利用cmd.txt type 一个文件时,系统会不停的调用read例程,并且传过来的起始地址和偏移量总是0、512,这样就进入死循环,不停地读文件的头512字节。可是我自己的测试应用程序使用readfile+setfilepointer 不知你是怎样将你的转向请求会递下去的? 因为你的转向,低层文件系统所操作的是你转向后的文件,而不是原来的,因而在你的Filter返回之前,你要对被转向文件的CCB进行操作,以改变当前文件指针位置。 |
|
|
板凳#
发布于:2002-04-26 15:29
我的转向程序如下: PassThrough(PFILE_OBJECT NewFileObject) { NTSTATUS status; PDEVICE_OBJECT NewDeviceObject = NewFileObject->DeviceObject->Vpb->DeviceObject; PIO_STACK_LOCATION current = I.CurrentStackLocation(); PIO_STACK_LOCATION next = I.NextStackLocation(); I.CopyParametersDown(); next->DeviceObject = NewDeviceObject; next->FileObject = NewFileObject; I.SetCompletionRoutine(NULL, NULL, FALSE, FALSE, FALSE); __try { status = IoCallDriver(FileSystemObject, (PIRP)I); } __except (EXCEPTION_EXECUTE_HANDLER) { status = GetExceptionCode(); } return status; } 我的过滤器有必要改变文件的指针吗? |
|
地板#
发布于:2002-04-27 09:38
估计是你没有对被转向FileObject做指针偏移操作。因为你的这部分代码代码只显示了你直接用NewFileObject做了替代。
同时要保证此NewFileObject不会被其它程序所用,否则可能引起紊乱。 |
|
|
地下室#
发布于:2002-04-27 12:20
哦,
可是如何修改文件对象的偏移量呢?我找不到CCB的定义呀,帮帮忙吧 |
|
5楼#
发布于:2002-04-27 12:49
CCB是由文件系统Driver定义的,对系统来说是透明的。不过在实际应用中可能应用的是 FileObject->CurrentByteOffset。对这点我还不能肯定。
不过你可以试试修改 (PFILE_OBJECT) FileObject->CurrentByteOffset。 FileObject由OS来维护: typedef struct _FILE_OBJECT { CSHORT Type; CSHORT Size; PDEVICE_OBJECT DeviceObject; PVPB Vpb; PVOID FsContext; PVOID FsContext2; PSECTION_OBJECT_POINTERS SectionObjectPointer; PVOID PrivateCacheMap; NTSTATUS FinalStatus; struct _FILE_OBJECT *RelatedFileObject; BOOLEAN LockOperation; BOOLEAN DeletePending; BOOLEAN ReadAccess; BOOLEAN WriteAccess; BOOLEAN DeleteAccess; BOOLEAN SharedRead; BOOLEAN SharedWrite; BOOLEAN SharedDelete; ULONG Flags; UNICODE_STRING FileName; LARGE_INTEGER CurrentByteOffset; ULONG Waiters; ULONG Busy; PVOID LastLock; KEVENT Lock; KEVENT Event; PIO_COMPLETION_CONTEXT CompletionContext; } FILE_OBJECT; typedef struct _FILE_OBJECT *PFILE_OBJECT; // ntndis |
|
|
6楼#
发布于:2002-04-27 13:03
CCB是由文件系统Driver定义的,对系统来说是透明的。不过在实际应用中可能应用的是 FileObject->CurrentByteOffset。对这点我还不能肯定。 我确认了文件系统驱动,应是修改 FileObject->CurrentByteOffset 在文件系统Read-dispatch-routine中, 输入偏移:IoStackLocation->Parameters.Read.ByteOffset; 成功后: FileObject->CurrentByteOffset = IoStackLocation->Parameters.Read.ByteOffset + ActualBytesRead; 祝好运! |
|
|
7楼#
发布于:2002-04-28 09:33
FileObject->CurrentByteOffset 字段是由IOMANAGER 维护的, 自己修改时请多测试兼容性.
|
|
|