NTSTATUS NTAPI NtfsFsdRead(PDEVICE_OBJECT DeviceObject, PIRP Irp) { PDEVICE_EXTENSION DeviceExt; PIO_STACK_LOCATION Stack; PFILE_OBJECT FileObject; PVOID Buffer; ULONG ReadLength; LARGE_INTEGER ReadOffset; ULONG ReturnedReadLength = 0; NTSTATUS Status = STATUS_SUCCESS; DPRINT("NtfsRead(DeviceObject %x, Irp %x)\n",DeviceObject,Irp); DeviceExt = DeviceObject->DeviceExtension; Stack = IoGetCurrentIrpStackLocation(Irp); FileObject = Stack->FileObject; ReadLength = Stack->Parameters.Read.Length; ReadOffset = Stack->Parameters.Read.ByteOffset; Buffer = MmGetSystemAddressForMdl(Irp->MdlAddress); Status = NtfsReadFile(DeviceExt, FileObject, Buffer, ReadLength, ReadOffset.u.LowPart, Irp->Flags, &ReturnedReadLength); if (NT_SUCCESS(Status)) { if (FileObject->Flags & FO_SYNCHRONOUS_IO) { FileObject->CurrentByteOffset.QuadPart = ReadOffset.QuadPart + ReturnedReadLength; } Irp->IoStatus.Information = ReturnedReadLength; } else { Irp->IoStatus.Information = 0; } Irp->IoStatus.Status = Status; IoCompleteRequest(Irp,IO_NO_INCREMENT); return Status; }
//Implementation of DeviceRead routine. static DWORD NtfsDeviceRead(__COMMON_OBJECT* pDrv,__COMMON_OBJECT* pDev,__DRCB* pDrcb) { __NTFS_FILE_OBJECT* pFileObject = NULL; BYTE* pBuffer = NULL; UINT_32 toReadSize = 0; UINT_32 ReadSize = 0; if((NULL == pDev) || (NULL == pDrcb)) { return 0; } pFileObject = (__NTFS_FILE_OBJECT*)((__DEVICE_OBJECT*)pDev)->lpDevExtension; toReadSize = pDrcb->dwOutputLen; pBuffer = (BYTE*)pDrcb->lpOutputBuffer; if(NtfsReadFile(pFileObject,pBuffer,toReadSize,&ReadSize,NULL)) { return ReadSize; } else { return 0; } }