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

Read.ByteOffset.QuadPart 的值总是为0

楼主#
更多 发布于:2008-07-08 10:36
最近根据咱们论坛的《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;
}
mz_suya
驱动小牛
驱动小牛
  • 注册日期2008-06-13
  • 最后登录2010-08-01
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望648点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分1分
沙发#
发布于:2008-07-08 14:17
Read.ByteOffset具体指代什么 有人规定不能为0 吗?
fatmouse527
驱动牛犊
驱动牛犊
  • 注册日期2006-12-27
  • 最后登录2009-04-10
  • 粉丝1
  • 关注0
  • 积分347分
  • 威望85点
  • 贡献值0点
  • 好评度81点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2008-07-08 16:10
Read.ByteOffset表示读的偏移,打印的时候不能用%x应该用%I64x才成
驱网无线,快乐无限
游客

返回顶部