tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
阅读:2972回复:6

DispatchCreate中读取文件问题

楼主#
更多 发布于:2005-01-22 16:35
在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;
}

最新喜欢:

linshierlinshi...
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-01-22 16:38
补充一下,读取数据,刚开始的时候很正常,但是超过了文件的有效数据长度以后,读取数据缓冲区的内容就不再更新了。
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-01-22 16:45
并且IoStatus.Information always 512
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-01-22 19:14
不好意思,说错了,第一次读取的时候,IoStatus.Information等于文件中数据的大小,现在我加了判断
IoStatus.Information < 512就认为到了文件尾,

不过我不明白的是,我在读取偏移明显大于文件有效数据长度的时候,为什么不返回STATUS_END_OF_FILE或其他值
ttzwater
驱动小牛
驱动小牛
  • 注册日期2003-06-07
  • 最后登录2011-10-04
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望23点
  • 贡献值0点
  • 好评度22点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-01-25 17:34
没记错的话,STATUS_END_OF_FILE是在你要求的偏移大于文件大小时才出的
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-01-26 09:27
谢谢关注,end_of_file在偏移大于文件长度时也没有出现,不过问题我已经解决了,每次发送读写irp的时候,把IoStatus.Information置0就可以了,在我的机器上,如果读写偏移大于文件有效数据长度,文件系统不会改写IoStatus.Information,并且返回成功
joshua_yu
驱动小牛
驱动小牛
  • 注册日期2004-12-06
  • 最后登录2010-12-01
  • 粉丝0
  • 关注0
  • 积分428分
  • 威望54点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-03-28 16:07
tooflat,你在create利用复制的流文件对象完成Create并且在随后利用这个文件对象读取文件内容,不知道是怎么实现的,能不能给个详细一点的说明阿,我现在也做基本相同的东西,基本思路已经出来了,可是细节的实现有问题,不能正确读取文件,而且常常bugcheck
游客

返回顶部