/* * PROJECT: ReactOS FAT file system driver * LICENSE: GNU GPLv3 as published by the Free Software Foundation * FILE: drivers/filesystems/fastfat/rw.c * PURPOSE: Read/write support * PROGRAMMERS: Aleksey Bragin (aleksey@reactos.org) */ /* INCLUDES *****************************************************************/ #define NDEBUG #include "fastfat.h" /* FUNCTIONS *****************************************************************/ NTSTATUS NTAPI FatiRead(PFAT_IRP_CONTEXT IrpContext) { ULONG NumberOfBytes; LARGE_INTEGER ByteOffset; PFILE_OBJECT FileObject; TYPE_OF_OPEN OpenType; PIO_STACK_LOCATION IrpSp = IrpContext->Stack; PFCB Fcb; PVCB Vcb; PCCB Ccb; PVOID Buffer; LONG BytesRead; FileObject = IrpSp->FileObject; NumberOfBytes = IrpSp->Parameters.Read.Length; ByteOffset = IrpSp->Parameters.Read.ByteOffset; if (NumberOfBytes == 0) { FatCompleteRequest(IrpContext, IrpContext->Irp, STATUS_SUCCESS); return STATUS_SUCCESS; } OpenType = FatDecodeFileObject(FileObject, &Vcb, &Fcb, &Ccb); DPRINT("FatiRead() Fcb %p, Name %wZ, Offset %d, Length %d, Handle %p\n", Fcb, &FileObject->FileName, ByteOffset.LowPart, NumberOfBytes, Fcb->FatHandle); /* Perform actual read */ if (IrpContext->MinorFunction & IRP_MN_MDL) { DPRINT1("MDL read\n"); } else { Buffer = FatMapUserBuffer(IrpContext->Irp); DPRINT("Normal cached read, buffer %p\n"); /* Set offset */ FF_Seek(Fcb->FatHandle, ByteOffset.LowPart, FF_SEEK_SET); /* Read */ BytesRead = FF_Read(Fcb->FatHandle, NumberOfBytes, 1, Buffer); DPRINT("Read %d bytes\n", BytesRead); /* Indicate we read requested amount of bytes */ IrpContext->Irp->IoStatus.Information = BytesRead; IrpContext->Irp->IoStatus.Status = STATUS_SUCCESS; } /* Complete the request */ FatCompleteRequest(IrpContext, IrpContext->Irp, STATUS_SUCCESS); return STATUS_SUCCESS; } NTSTATUS NTAPI FatRead(PDEVICE_OBJECT DeviceObject, PIRP Irp) { NTSTATUS Status; BOOLEAN TopLevel, CanWait; PFAT_IRP_CONTEXT IrpContext; CanWait = TRUE; TopLevel = FALSE; Status = STATUS_INVALID_DEVICE_REQUEST; /* Get CanWait flag */ if (IoGetCurrentIrpStackLocation(Irp)->FileObject != NULL) CanWait = IoIsOperationSynchronous(Irp); /* Enter FsRtl critical region */ FsRtlEnterFileSystem(); if (DeviceObject != FatGlobalData.DiskDeviceObject) { /* Set Top Level IRP if not set */ TopLevel = FatIsTopLevelIrp(Irp); /* Build an irp context */ IrpContext = FatBuildIrpContext(Irp, CanWait); /* Perform the actual read */ Status = FatiRead(IrpContext); /* Restore top level Irp */ if (TopLevel) IoSetTopLevelIrp(NULL); } /* Leave FsRtl critical region */ FsRtlExitFileSystem(); return Status; } NTSTATUS NTAPI FatWrite(PDEVICE_OBJECT DeviceObject, PIRP Irp) { DPRINT1("FatWrite()\n"); return STATUS_NOT_IMPLEMENTED; }