阅读:987回复:6
如何在一个过滤系统中得到文件的position,(讨论一下)
我先说说经验:
我用的是filemon的框架, 用FilemonQueryFile函数构造Irp去请求文件信息。 对于standard信息,可以正常请求到。 但对于position信息却无法得到。 现在猜是FILE_SYNCHRONOUS_IO_NONALERT,标记的原因 在一文件系统中得到其指针的position 是在Create中加上此标记还是要 自己用ZwCreateFile打开再请求? |
|
|
沙发#
发布于:2007-11-08 12:29
同步的读写的时候:
if (((IrpSp->MajorFunction == IRP_MJ_READ) || (IrpSp->MajorFunction == IRP_MJ_WRITE)) && (IrpSp->FileObject != NULL) && FlagOn(IrpSp->FileObject->Flags, FO_SYNCHRONOUS_IO) && NT_SUCCESS(Irp->IoStatus.Status)) { IrpSp->FileObject->CurrentByteOffset.QuadPart = IrpSp->FileObject->CurrentByteOffset.QuadPart + Irp->IoStatus.Information; } |
|
板凳#
发布于:2007-11-05 15:45
回 3楼(yaolixing)的帖子
你的意思我也想过,但是我怕出现如下问题.你这个是用原始的0+后续读的长度,来标记offset 但是,如果这个读不是顺序性的,就会出现在至命的错误. |
|
|
地板#
发布于:2007-11-05 14:32
如果你的fileobject是同步的话 这个offset里面的值肯定是正确的,但是如果不是同步的话 就不保证了,应该io manager不知道保存在什么地方,同步的时候是文件系统来更新这个值的!fat系统的代码里有。
|
|
地下室#
发布于:2007-11-02 00:18
在读写例程中,IrpSp-> Parameters.ReadByteOffset.QuadPart依赖于上一次读成功的 Irp->IoStatus.Information的大小的累加。当然此次的irp->IoStatus.Information==0;
在读写完成里程中Irp->IoStatus.Information代表此次成功读写的数据量。FileObject-> CurrentByteOffset.QuadPart维护着当前读写到文件的位置,也就是说==IrpSp-> Parameters.ReadByteOffset.QuadPart+ Irp->IoStatus.Information. 太晚了,明天又要迟到了,简直是一定的,郁闷! |
|
5楼#
发布于:2007-09-25 12:57
这个问题还没有解决啊
帮你顶一下 |
|
6楼#
发布于:2007-09-25 10:38
这个其实就是如何在read时得到offset的问题。(好像蛮难的)
我在Create中相关函数的完成例程根据FileObject 自己设offset然后自己请求,可以得到。 但是请求系统的移动好像不行。 其相关参数,大多是0.(word中有时指针正常一次) |
|
|