fangshunbao
驱动牛犊
驱动牛犊
  • 注册日期2007-10-19
  • 最后登录2008-07-10
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望6点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1126回复:6

Read.ByteOffset.QuadPart 的值总是为0

楼主#
更多 发布于:2008-07-08 10:52
Read.ByteOffset.QuadPart 的值总是为0

最近根据咱们论坛的《WindowsNT 文件系统内幕 开发者指南》在学习文件过滤驱动开发,我的系统是:Windows XP SP2,以下是我的问题:

我根据书中第602页的方式取得文件偏移量和长度,发现:
Parameters.Read.ByteOffset.QuadPart、Parameters.Read.ByteOffset.LowPart、Parameters.Read.ByteOffset.HighPart 取得的值总是为0
Parameters.Read.Length 取得的长度为整个存放数据的Buffer的长度
我错在哪里,请各位大虾指点。

以下是我的代码,只摘录了读取函数:

NTSTATUS MF_Read(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp)
{
NTSTATUS status = STATUS_SUCCESS;
PIO_STACK_LOCATION pIrp = IoGetCurrentIrpStackLocation(Irp);
PUCHAR pchOldBuf = NULL;

KEVENT waitEvent;

PFILE_OBJECT pFileObj = pIrp->FileObject;
PFSRTL_COMMON_FCB_HEADER pFCBHead = pIrp->FileObject->FsContext;

ASSERT_IS_MY_DEVICE(DeviceObject, Irp);

KeInitializeEvent(&waitEvent, NotificationEvent, FALSE);

SF_LOG_PRINT(SFDEBUG_DISPLAY_SfRead,("----> sfilter!MF_Read data buffer Length = %d\n",
pIrp->Parameters.Read.Length));


IoCopyCurrentIrpStackLocationToNext(Irp);

IoSetCompletionRoutine(Irp, (PIO_COMPLETION_ROUTINE)F_ReadComplete, &waitEvent, TRUE, TRUE, TRUE);

status = IoCallDriver(((PSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->NLExtHeader.AttachedToDeviceObject,
Irp);

if(status != STATUS_PENDING)
{
SF_LOG_PRINT(SFDEBUG_DISPLAY_SfRead,("----> sfilter!MF_Read status != STATUS_PENDING =0x%X\n", status));
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return status;
}
status = KeWaitForSingleObject(&waitEvent,
Executive,
KernelMode,
FALSE,
NULL);
ASSERT(STATUS_SUCCESS == status);

SF_LOG_PRINT(SFDEBUG_DISPLAY_SfRead,("----> -2- sfilter!MF_Read data buffer Length = %d\n",
pIrp->Parameters.Read.Length));

// 此处输出结果均为 0,郁闷呀!
SF_LOG_PRINT(SFDEBUG_DISPLAY_SfRead,("----> -2- sfilter!MF_Read byteoffset LowPart = %d(0x%X), HighPart = %d(0x%X), QuadPart = %d(0x%X) \n",
pIrp->Parameters.Read.ByteOffset.LowPart, pIrp->Parameters.Read.ByteOffset.LowPart,
pIrp->Parameters.Read.ByteOffset.HighPart, pIrp->Parameters.Read.ByteOffset.HighPart,
pIrp->Parameters.Read.ByteOffset.QuadPart, pIrp->Parameters.Read.ByteOffset.QuadPart));

SF_LOG_PRINT(SFDEBUG_DISPLAY_SfRead,("----> sfilter!MF_Read AllocationSize = %d\n",
pFCBHead->AllocationSize));

SF_LOG_PRINT(SFDEBUG_DISPLAY_SfRead,("----> sfilter!MF_Read FileSize = %d\n",
pFCBHead->FileSize));

SF_LOG_PRINT(SFDEBUG_DISPLAY_SfRead,("----> sfilter!MF_Read ValidDataLength = %d\n",
pFCBHead->ValidDataLength));

if(Irp->MdlAddress != NULL)
{
pchOldBuf =(PUCHAR)MmGetSystemAddressForMdlSafe(Irp->MdlAddress, HighPagePriority);
}
else if(Irp->UserBuffer != NULL)
{
pchOldBuf = Irp->UserBuffer;
}
else
{
Irp->IoStatus.Status = STATUS_INVALID_USER_BUFFER;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_INVALID_USER_BUFFER;
}

IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
fangshunbao
驱动牛犊
驱动牛犊
  • 注册日期2007-10-19
  • 最后登录2008-07-10
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望6点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-07-08 11:20
有牛人吗?在线等待!
fangshunbao
驱动牛犊
驱动牛犊
  • 注册日期2007-10-19
  • 最后登录2008-07-10
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望6点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-07-08 13:01
有没有人哪?
mz_suya
驱动小牛
驱动小牛
  • 注册日期2008-06-13
  • 最后登录2010-08-01
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望648点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分1分
地板#
发布于:2008-07-08 14:32
pIrp->Parameters.Read.ByteOffset为文件起始位置开始的偏移
当然可以为0了
难道为哦就不可以吗?非得是非0  ?
fangshunbao
驱动牛犊
驱动牛犊
  • 注册日期2007-10-19
  • 最后登录2008-07-10
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望6点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-07-08 18:14
谢 mz_suya  达人赐教,但关键是读取一个文件的每一个IRP包都为 0 。郁闷呀!
microbe
驱动小牛
驱动小牛
  • 注册日期2007-12-10
  • 最后登录2011-01-17
  • 粉丝1
  • 关注0
  • 积分914分
  • 威望420点
  • 贡献值1点
  • 好评度88点
  • 原创分0分
  • 专家分1分
5楼#
发布于:2008-07-09 11:00
有时候是会有多个偏移为0的irp的,你用大文件试试,肯定有偏移不是0的
yandong_8212
驱动小牛
驱动小牛
  • 注册日期2006-07-28
  • 最后登录2011-02-11
  • 粉丝0
  • 关注0
  • 积分1046分
  • 威望464点
  • 贡献值1点
  • 好评度173点
  • 原创分0分
  • 专家分1分
6楼#
发布于:2008-07-09 19:13
1.你在CALLDRIVER之前,查看一下.
2.QUADPART要要用%I64d或%I64x来打印,否则会影响之后的参数,也就是说,下次打印的可能是上次的值.
商务MSN:YanDong_8212@163.com
游客

返回顶部