fkddn
驱动小牛
驱动小牛
  • 注册日期2002-03-28
  • 最后登录2005-11-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1565回复:7

怎么搞的,读一个文件这么难?还是关于文件过滤

楼主#
更多 发布于:2002-04-25 09:01
我的驱动终于能转向了,并且可以读到数据给应用程序。可是利用cmd.txt type 一个文件时,系统会不停的调用read例程,并且传过来的起始地址和偏移量总是0、512,这样就进入死循环,不停地读文件的头512字节。可是我自己的测试应用程序使用readfile+setfilepointer
却很正常的读到了文件。
这是什么原因呢?请高手指教。

最新喜欢:

aasa2aasa2
matt
驱动中牛
驱动中牛
  • 注册日期2001-07-24
  • 最后登录2016-02-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-04-26 12:30
我的驱动终于能转向了,并且可以读到数据给应用程序。可是利用cmd.txt type 一个文件时,系统会不停的调用read例程,并且传过来的起始地址和偏移量总是0、512,这样就进入死循环,不停地读文件的头512字节。可是我自己的测试应用程序使用readfile+setfilepointer
却很正常的读到了文件。
这是什么原因呢?请高手指教。


不知你是怎样将你的转向请求会递下去的?

因为你的转向,低层文件系统所操作的是你转向后的文件,而不是原来的,因而在你的Filter返回之前,你要对被转向文件的CCB进行操作,以改变当前文件指针位置。
System Internals http://sys.xiloo.com
fkddn
驱动小牛
驱动小牛
  • 注册日期2002-03-28
  • 最后登录2005-11-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-04-26 15:29


不知你是怎样将你的转向请求会递下去的?

因为你的转向,低层文件系统所操作的是你转向后的文件,而不是原来的,因而在你的Filter返回之前,你要对被转向文件的CCB进行操作,以改变当前文件指针位置。
 

我的转向程序如下:
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;
}

我的过滤器有必要改变文件的指针吗?
matt
驱动中牛
驱动中牛
  • 注册日期2001-07-24
  • 最后登录2016-02-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-04-27 09:38
估计是你没有对被转向FileObject做指针偏移操作。因为你的这部分代码代码只显示了你直接用NewFileObject做了替代。

同时要保证此NewFileObject不会被其它程序所用,否则可能引起紊乱。
System Internals http://sys.xiloo.com
fkddn
驱动小牛
驱动小牛
  • 注册日期2002-03-28
  • 最后登录2005-11-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-04-27 12:20
哦,
可是如何修改文件对象的偏移量呢?我找不到CCB的定义呀,帮帮忙吧
matt
驱动中牛
驱动中牛
  • 注册日期2001-07-24
  • 最后登录2016-02-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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

System Internals http://sys.xiloo.com
matt
驱动中牛
驱动中牛
  • 注册日期2001-07-24
  • 最后登录2016-02-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-04-27 13:03
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

 

我确认了文件系统驱动,应是修改 FileObject->CurrentByteOffset
                                                    
在文件系统Read-dispatch-routine中,

输入偏移:IoStackLocation->Parameters.Read.ByteOffset;

成功后:
FileObject->CurrentByteOffset =
IoStackLocation->Parameters.Read.ByteOffset + ActualBytesRead;

祝好运!
System Internals http://sys.xiloo.com
lu0
lu0
论坛版主
论坛版主
  • 注册日期2001-06-10
  • 最后登录2016-04-05
  • 粉丝2
  • 关注0
  • 积分-6311分
  • 威望21111点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-04-28 09:33
FileObject->CurrentByteOffset 字段是由IOMANAGER 维护的, 自己修改时请多测试兼容性.
Regards, Lu Lin Webmaster of Inside Programming http://www.lu0s1.com
游客

返回顶部