阅读:1124回复:2
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; } |
|
沙发#
发布于:2008-07-08 16:10
Read.ByteOffset表示读的偏移,打印的时候不能用%x应该用%I64x才成
|
|
|
板凳#
发布于:2008-07-08 14:17
Read.ByteOffset具体指代什么 有人规定不能为0 吗?
|
|