mirror of
https://github.com/reactos/reactos.git
synced 2024-08-26 05:08:39 +00:00
![Timo Kreuzer](/assets/img/avatar_default.png)
* Add an NDK header to define INIT_FUNCTION/INIT_SECTION globally * Use _declspec(allocate(x)) and _declspec(code_seg(x)) on MSVC versions that support it * Use INIT_FUNCTION on functions only and INIT_SECTION on data only (required by MSVC) * Place INIT_FUNCTION before the return type (required by MSVC) * Make sure declarations and implementations share the same modifiers (required by MSVC) * Add a global linker option to suppress warnings about defined but unused INIT section * Merge INIT section into .text in freeldr
790 lines
19 KiB
C
790 lines
19 KiB
C
/*
|
|
* FILE: drivers/filesystems/fastfat/fastio.c
|
|
* PURPOSE: Fast IO routines.
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
* PROJECT: ReactOS kernel
|
|
* PROGRAMMER: Herve Poussineau (hpoussin@reactos.org)
|
|
* Pierre Schweitzer (pierre@reactos.org)
|
|
*/
|
|
|
|
#include "vfat.h"
|
|
|
|
#define NDEBUG
|
|
#include <debug.h>
|
|
|
|
#if defined(ALLOC_PRAGMA)
|
|
#pragma alloc_text(INIT, VfatInitFastIoRoutines)
|
|
#endif
|
|
|
|
static FAST_IO_CHECK_IF_POSSIBLE VfatFastIoCheckIfPossible;
|
|
|
|
static
|
|
BOOLEAN
|
|
NTAPI
|
|
VfatFastIoCheckIfPossible(
|
|
IN PFILE_OBJECT FileObject,
|
|
IN PLARGE_INTEGER FileOffset,
|
|
IN ULONG Length,
|
|
IN BOOLEAN Wait,
|
|
IN ULONG LockKey,
|
|
IN BOOLEAN CheckForReadOperation,
|
|
OUT PIO_STATUS_BLOCK IoStatus,
|
|
IN PDEVICE_OBJECT DeviceObject)
|
|
{
|
|
/* Prevent all Fast I/O requests */
|
|
DPRINT("VfatFastIoCheckIfPossible(): returning FALSE.\n");
|
|
|
|
UNREFERENCED_PARAMETER(FileObject);
|
|
UNREFERENCED_PARAMETER(FileOffset);
|
|
UNREFERENCED_PARAMETER(Length);
|
|
UNREFERENCED_PARAMETER(Wait);
|
|
UNREFERENCED_PARAMETER(LockKey);
|
|
UNREFERENCED_PARAMETER(CheckForReadOperation);
|
|
UNREFERENCED_PARAMETER(IoStatus);
|
|
UNREFERENCED_PARAMETER(DeviceObject);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static FAST_IO_READ VfatFastIoRead;
|
|
|
|
static
|
|
BOOLEAN
|
|
NTAPI
|
|
VfatFastIoRead(
|
|
IN PFILE_OBJECT FileObject,
|
|
IN PLARGE_INTEGER FileOffset,
|
|
IN ULONG Length,
|
|
IN BOOLEAN Wait,
|
|
IN ULONG LockKey,
|
|
OUT PVOID Buffer,
|
|
OUT PIO_STATUS_BLOCK IoStatus,
|
|
IN PDEVICE_OBJECT DeviceObject)
|
|
{
|
|
DPRINT("VfatFastIoRead()\n");
|
|
|
|
UNREFERENCED_PARAMETER(FileObject);
|
|
UNREFERENCED_PARAMETER(FileOffset);
|
|
UNREFERENCED_PARAMETER(Length);
|
|
UNREFERENCED_PARAMETER(Wait);
|
|
UNREFERENCED_PARAMETER(LockKey);
|
|
UNREFERENCED_PARAMETER(Buffer);
|
|
UNREFERENCED_PARAMETER(IoStatus);
|
|
UNREFERENCED_PARAMETER(DeviceObject);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static FAST_IO_WRITE VfatFastIoWrite;
|
|
|
|
static
|
|
BOOLEAN
|
|
NTAPI
|
|
VfatFastIoWrite(
|
|
IN PFILE_OBJECT FileObject,
|
|
IN PLARGE_INTEGER FileOffset,
|
|
IN ULONG Length,
|
|
IN BOOLEAN Wait,
|
|
IN ULONG LockKey,
|
|
OUT PVOID Buffer,
|
|
OUT PIO_STATUS_BLOCK IoStatus,
|
|
IN PDEVICE_OBJECT DeviceObject)
|
|
{
|
|
DPRINT("VfatFastIoWrite()\n");
|
|
|
|
UNREFERENCED_PARAMETER(FileObject);
|
|
UNREFERENCED_PARAMETER(FileOffset);
|
|
UNREFERENCED_PARAMETER(Length);
|
|
UNREFERENCED_PARAMETER(Wait);
|
|
UNREFERENCED_PARAMETER(LockKey);
|
|
UNREFERENCED_PARAMETER(Buffer);
|
|
UNREFERENCED_PARAMETER(IoStatus);
|
|
UNREFERENCED_PARAMETER(DeviceObject);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static FAST_IO_QUERY_BASIC_INFO VfatFastIoQueryBasicInfo;
|
|
|
|
static
|
|
BOOLEAN
|
|
NTAPI
|
|
VfatFastIoQueryBasicInfo(
|
|
IN PFILE_OBJECT FileObject,
|
|
IN BOOLEAN Wait,
|
|
OUT PFILE_BASIC_INFORMATION Buffer,
|
|
OUT PIO_STATUS_BLOCK IoStatus,
|
|
IN PDEVICE_OBJECT DeviceObject)
|
|
{
|
|
NTSTATUS Status;
|
|
PVFATFCB FCB = NULL;
|
|
BOOLEAN Success = FALSE;
|
|
ULONG BufferLength = sizeof(FILE_BASIC_INFORMATION);
|
|
|
|
DPRINT("VfatFastIoQueryBasicInfo()\n");
|
|
|
|
FCB = (PVFATFCB)FileObject->FsContext;
|
|
if (FCB == NULL)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
FsRtlEnterFileSystem();
|
|
|
|
if (!BooleanFlagOn(FCB->Flags, FCB_IS_PAGE_FILE))
|
|
{
|
|
if (!ExAcquireResourceSharedLite(&FCB->MainResource, Wait))
|
|
{
|
|
FsRtlExitFileSystem();
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
Status = VfatGetBasicInformation(FileObject,
|
|
FCB,
|
|
DeviceObject->DeviceExtension,
|
|
Buffer,
|
|
&BufferLength);
|
|
|
|
if (!BooleanFlagOn(FCB->Flags, FCB_IS_PAGE_FILE))
|
|
{
|
|
ExReleaseResourceLite(&FCB->MainResource);
|
|
}
|
|
|
|
if (NT_SUCCESS(Status))
|
|
{
|
|
IoStatus->Status = STATUS_SUCCESS;
|
|
IoStatus->Information = sizeof(FILE_BASIC_INFORMATION) - BufferLength;
|
|
Success = TRUE;
|
|
}
|
|
|
|
FsRtlExitFileSystem();
|
|
|
|
return Success;
|
|
}
|
|
|
|
static FAST_IO_QUERY_STANDARD_INFO VfatFastIoQueryStandardInfo;
|
|
|
|
static
|
|
BOOLEAN
|
|
NTAPI
|
|
VfatFastIoQueryStandardInfo(
|
|
IN PFILE_OBJECT FileObject,
|
|
IN BOOLEAN Wait,
|
|
OUT PFILE_STANDARD_INFORMATION Buffer,
|
|
OUT PIO_STATUS_BLOCK IoStatus,
|
|
IN PDEVICE_OBJECT DeviceObject)
|
|
{
|
|
NTSTATUS Status;
|
|
PVFATFCB FCB = NULL;
|
|
BOOLEAN Success = FALSE;
|
|
ULONG BufferLength = sizeof(FILE_STANDARD_INFORMATION);
|
|
|
|
DPRINT("VfatFastIoQueryStandardInfo()\n");
|
|
|
|
UNREFERENCED_PARAMETER(DeviceObject);
|
|
|
|
FCB = (PVFATFCB)FileObject->FsContext;
|
|
if (FCB == NULL)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
FsRtlEnterFileSystem();
|
|
|
|
if (!BooleanFlagOn(FCB->Flags, FCB_IS_PAGE_FILE))
|
|
{
|
|
if (!ExAcquireResourceSharedLite(&FCB->MainResource, Wait))
|
|
{
|
|
FsRtlExitFileSystem();
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
Status = VfatGetStandardInformation(FCB,
|
|
Buffer,
|
|
&BufferLength);
|
|
|
|
if (!BooleanFlagOn(FCB->Flags, FCB_IS_PAGE_FILE))
|
|
{
|
|
ExReleaseResourceLite(&FCB->MainResource);
|
|
}
|
|
|
|
if (NT_SUCCESS(Status))
|
|
{
|
|
IoStatus->Status = STATUS_SUCCESS;
|
|
IoStatus->Information = sizeof(FILE_STANDARD_INFORMATION) - BufferLength;
|
|
Success = TRUE;
|
|
}
|
|
|
|
FsRtlExitFileSystem();
|
|
|
|
return Success;
|
|
}
|
|
|
|
static FAST_IO_LOCK VfatFastIoLock;
|
|
|
|
static
|
|
BOOLEAN
|
|
NTAPI
|
|
VfatFastIoLock(
|
|
IN PFILE_OBJECT FileObject,
|
|
IN PLARGE_INTEGER FileOffset,
|
|
IN PLARGE_INTEGER Length,
|
|
PEPROCESS ProcessId,
|
|
ULONG Key,
|
|
BOOLEAN FailImmediately,
|
|
BOOLEAN ExclusiveLock,
|
|
OUT PIO_STATUS_BLOCK IoStatus,
|
|
IN PDEVICE_OBJECT DeviceObject)
|
|
{
|
|
DPRINT("VfatFastIoLock\n");
|
|
|
|
UNREFERENCED_PARAMETER(FileObject);
|
|
UNREFERENCED_PARAMETER(FileOffset);
|
|
UNREFERENCED_PARAMETER(Length);
|
|
UNREFERENCED_PARAMETER(ProcessId);
|
|
UNREFERENCED_PARAMETER(Key);
|
|
UNREFERENCED_PARAMETER(FailImmediately);
|
|
UNREFERENCED_PARAMETER(ExclusiveLock);
|
|
UNREFERENCED_PARAMETER(IoStatus);
|
|
UNREFERENCED_PARAMETER(DeviceObject);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static FAST_IO_UNLOCK_SINGLE VfatFastIoUnlockSingle;
|
|
|
|
static
|
|
BOOLEAN
|
|
NTAPI
|
|
VfatFastIoUnlockSingle(
|
|
IN PFILE_OBJECT FileObject,
|
|
IN PLARGE_INTEGER FileOffset,
|
|
IN PLARGE_INTEGER Length,
|
|
PEPROCESS ProcessId,
|
|
ULONG Key,
|
|
OUT PIO_STATUS_BLOCK IoStatus,
|
|
IN PDEVICE_OBJECT DeviceObject)
|
|
{
|
|
DPRINT("VfatFastIoUnlockSingle\n");
|
|
|
|
UNREFERENCED_PARAMETER(FileObject);
|
|
UNREFERENCED_PARAMETER(FileOffset);
|
|
UNREFERENCED_PARAMETER(Length);
|
|
UNREFERENCED_PARAMETER(ProcessId);
|
|
UNREFERENCED_PARAMETER(Key);
|
|
UNREFERENCED_PARAMETER(IoStatus);
|
|
UNREFERENCED_PARAMETER(DeviceObject);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static FAST_IO_UNLOCK_ALL VfatFastIoUnlockAll;
|
|
|
|
static
|
|
BOOLEAN
|
|
NTAPI
|
|
VfatFastIoUnlockAll(
|
|
IN PFILE_OBJECT FileObject,
|
|
PEPROCESS ProcessId,
|
|
OUT PIO_STATUS_BLOCK IoStatus,
|
|
IN PDEVICE_OBJECT DeviceObject)
|
|
{
|
|
DPRINT("VfatFastIoUnlockAll\n");
|
|
|
|
UNREFERENCED_PARAMETER(FileObject);
|
|
UNREFERENCED_PARAMETER(ProcessId);
|
|
UNREFERENCED_PARAMETER(IoStatus);
|
|
UNREFERENCED_PARAMETER(DeviceObject);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static FAST_IO_UNLOCK_ALL_BY_KEY VfatFastIoUnlockAllByKey;
|
|
|
|
static
|
|
BOOLEAN
|
|
NTAPI
|
|
VfatFastIoUnlockAllByKey(
|
|
IN PFILE_OBJECT FileObject,
|
|
PVOID ProcessId,
|
|
ULONG Key,
|
|
OUT PIO_STATUS_BLOCK IoStatus,
|
|
IN PDEVICE_OBJECT DeviceObject)
|
|
{
|
|
DPRINT("VfatFastIoUnlockAllByKey\n");
|
|
|
|
UNREFERENCED_PARAMETER(FileObject);
|
|
UNREFERENCED_PARAMETER(ProcessId);
|
|
UNREFERENCED_PARAMETER(Key);
|
|
UNREFERENCED_PARAMETER(IoStatus);
|
|
UNREFERENCED_PARAMETER(DeviceObject);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static FAST_IO_DEVICE_CONTROL VfatFastIoDeviceControl;
|
|
|
|
static
|
|
BOOLEAN
|
|
NTAPI
|
|
VfatFastIoDeviceControl(
|
|
IN PFILE_OBJECT FileObject,
|
|
IN BOOLEAN Wait,
|
|
IN PVOID InputBuffer OPTIONAL,
|
|
IN ULONG InputBufferLength,
|
|
OUT PVOID OutputBuffer OPTIONAL,
|
|
IN ULONG OutputBufferLength,
|
|
IN ULONG IoControlCode,
|
|
OUT PIO_STATUS_BLOCK IoStatus,
|
|
IN PDEVICE_OBJECT DeviceObject)
|
|
{
|
|
DPRINT("VfatFastIoDeviceControl\n");
|
|
|
|
UNREFERENCED_PARAMETER(FileObject);
|
|
UNREFERENCED_PARAMETER(Wait);
|
|
UNREFERENCED_PARAMETER(InputBuffer);
|
|
UNREFERENCED_PARAMETER(InputBufferLength);
|
|
UNREFERENCED_PARAMETER(OutputBuffer);
|
|
UNREFERENCED_PARAMETER(OutputBufferLength);
|
|
UNREFERENCED_PARAMETER(IoControlCode);
|
|
UNREFERENCED_PARAMETER(IoStatus);
|
|
UNREFERENCED_PARAMETER(DeviceObject);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static FAST_IO_ACQUIRE_FILE VfatAcquireFileForNtCreateSection;
|
|
|
|
static
|
|
VOID
|
|
NTAPI
|
|
VfatAcquireFileForNtCreateSection(
|
|
IN PFILE_OBJECT FileObject)
|
|
{
|
|
DPRINT("VfatAcquireFileForNtCreateSection\n");
|
|
UNREFERENCED_PARAMETER(FileObject);
|
|
}
|
|
|
|
static FAST_IO_RELEASE_FILE VfatReleaseFileForNtCreateSection;
|
|
|
|
static
|
|
VOID
|
|
NTAPI
|
|
VfatReleaseFileForNtCreateSection(
|
|
IN PFILE_OBJECT FileObject)
|
|
{
|
|
DPRINT("VfatReleaseFileForNtCreateSection\n");
|
|
UNREFERENCED_PARAMETER(FileObject);
|
|
}
|
|
|
|
static FAST_IO_DETACH_DEVICE VfatFastIoDetachDevice;
|
|
|
|
static
|
|
VOID
|
|
NTAPI
|
|
VfatFastIoDetachDevice(
|
|
IN PDEVICE_OBJECT SourceDevice,
|
|
IN PDEVICE_OBJECT TargetDevice)
|
|
{
|
|
DPRINT("VfatFastIoDetachDevice\n");
|
|
UNREFERENCED_PARAMETER(SourceDevice);
|
|
UNREFERENCED_PARAMETER(TargetDevice);
|
|
}
|
|
|
|
static FAST_IO_QUERY_NETWORK_OPEN_INFO VfatFastIoQueryNetworkOpenInfo;
|
|
|
|
static
|
|
BOOLEAN
|
|
NTAPI
|
|
VfatFastIoQueryNetworkOpenInfo(
|
|
IN PFILE_OBJECT FileObject,
|
|
IN BOOLEAN Wait,
|
|
OUT PFILE_NETWORK_OPEN_INFORMATION Buffer,
|
|
OUT PIO_STATUS_BLOCK IoStatus,
|
|
IN PDEVICE_OBJECT DeviceObject)
|
|
{
|
|
DPRINT("VfatFastIoQueryNetworkOpenInfo\n");
|
|
|
|
UNREFERENCED_PARAMETER(FileObject);
|
|
UNREFERENCED_PARAMETER(Wait);
|
|
UNREFERENCED_PARAMETER(Buffer);
|
|
UNREFERENCED_PARAMETER(IoStatus);
|
|
UNREFERENCED_PARAMETER(DeviceObject);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static FAST_IO_ACQUIRE_FOR_MOD_WRITE VfatAcquireForModWrite;
|
|
|
|
static
|
|
NTSTATUS
|
|
NTAPI
|
|
VfatAcquireForModWrite(
|
|
IN PFILE_OBJECT FileObject,
|
|
IN PLARGE_INTEGER EndingOffset,
|
|
OUT PERESOURCE* ResourceToRelease,
|
|
IN PDEVICE_OBJECT DeviceObject)
|
|
{
|
|
DPRINT("VfatAcquireForModWrite\n");
|
|
|
|
UNREFERENCED_PARAMETER(FileObject);
|
|
UNREFERENCED_PARAMETER(EndingOffset);
|
|
UNREFERENCED_PARAMETER(ResourceToRelease);
|
|
UNREFERENCED_PARAMETER(DeviceObject);
|
|
|
|
return STATUS_INVALID_DEVICE_REQUEST;
|
|
}
|
|
|
|
static FAST_IO_MDL_READ VfatMdlRead;
|
|
|
|
static
|
|
BOOLEAN
|
|
NTAPI
|
|
VfatMdlRead(
|
|
IN PFILE_OBJECT FileObject,
|
|
IN PLARGE_INTEGER FileOffset,
|
|
IN ULONG Length,
|
|
IN ULONG LockKey,
|
|
OUT PMDL* MdlChain,
|
|
OUT PIO_STATUS_BLOCK IoStatus,
|
|
IN PDEVICE_OBJECT DeviceObject)
|
|
{
|
|
DPRINT("VfatMdlRead\n");
|
|
|
|
UNREFERENCED_PARAMETER(FileObject);
|
|
UNREFERENCED_PARAMETER(FileOffset);
|
|
UNREFERENCED_PARAMETER(Length);
|
|
UNREFERENCED_PARAMETER(LockKey);
|
|
UNREFERENCED_PARAMETER(MdlChain);
|
|
UNREFERENCED_PARAMETER(IoStatus);
|
|
UNREFERENCED_PARAMETER(DeviceObject);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static FAST_IO_MDL_READ_COMPLETE VfatMdlReadComplete;
|
|
|
|
static
|
|
BOOLEAN
|
|
NTAPI
|
|
VfatMdlReadComplete(
|
|
IN PFILE_OBJECT FileObject,
|
|
IN PMDL MdlChain,
|
|
IN PDEVICE_OBJECT DeviceObject)
|
|
{
|
|
DPRINT("VfatMdlReadComplete\n");
|
|
|
|
UNREFERENCED_PARAMETER(FileObject);
|
|
UNREFERENCED_PARAMETER(MdlChain);
|
|
UNREFERENCED_PARAMETER(DeviceObject);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static FAST_IO_PREPARE_MDL_WRITE VfatPrepareMdlWrite;
|
|
|
|
static
|
|
BOOLEAN
|
|
NTAPI
|
|
VfatPrepareMdlWrite(
|
|
IN PFILE_OBJECT FileObject,
|
|
IN PLARGE_INTEGER FileOffset,
|
|
IN ULONG Length,
|
|
IN ULONG LockKey,
|
|
OUT PMDL* MdlChain,
|
|
OUT PIO_STATUS_BLOCK IoStatus,
|
|
IN PDEVICE_OBJECT DeviceObject)
|
|
{
|
|
DPRINT("VfatPrepareMdlWrite\n");
|
|
|
|
UNREFERENCED_PARAMETER(FileObject);
|
|
UNREFERENCED_PARAMETER(FileOffset);
|
|
UNREFERENCED_PARAMETER(Length);
|
|
UNREFERENCED_PARAMETER(LockKey);
|
|
UNREFERENCED_PARAMETER(MdlChain);
|
|
UNREFERENCED_PARAMETER(IoStatus);
|
|
UNREFERENCED_PARAMETER(DeviceObject);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static FAST_IO_MDL_WRITE_COMPLETE VfatMdlWriteComplete;
|
|
|
|
static
|
|
BOOLEAN
|
|
NTAPI
|
|
VfatMdlWriteComplete(
|
|
IN PFILE_OBJECT FileObject,
|
|
IN PLARGE_INTEGER FileOffset,
|
|
IN PMDL MdlChain,
|
|
IN PDEVICE_OBJECT DeviceObject)
|
|
{
|
|
DPRINT("VfatMdlWriteComplete\n");
|
|
|
|
UNREFERENCED_PARAMETER(FileObject);
|
|
UNREFERENCED_PARAMETER(FileOffset);
|
|
UNREFERENCED_PARAMETER(MdlChain);
|
|
UNREFERENCED_PARAMETER(DeviceObject);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static FAST_IO_READ_COMPRESSED VfatFastIoReadCompressed;
|
|
|
|
static
|
|
BOOLEAN
|
|
NTAPI
|
|
VfatFastIoReadCompressed(
|
|
IN PFILE_OBJECT FileObject,
|
|
IN PLARGE_INTEGER FileOffset,
|
|
IN ULONG Length,
|
|
IN ULONG LockKey,
|
|
OUT PVOID Buffer,
|
|
OUT PMDL* MdlChain,
|
|
OUT PIO_STATUS_BLOCK IoStatus,
|
|
OUT PCOMPRESSED_DATA_INFO CompressedDataInfo,
|
|
IN ULONG CompressedDataInfoLength,
|
|
IN PDEVICE_OBJECT DeviceObject)
|
|
{
|
|
DPRINT("VfatFastIoReadCompressed\n");
|
|
|
|
UNREFERENCED_PARAMETER(FileObject);
|
|
UNREFERENCED_PARAMETER(FileOffset);
|
|
UNREFERENCED_PARAMETER(Length);
|
|
UNREFERENCED_PARAMETER(LockKey);
|
|
UNREFERENCED_PARAMETER(Buffer);
|
|
UNREFERENCED_PARAMETER(MdlChain);
|
|
UNREFERENCED_PARAMETER(IoStatus);
|
|
UNREFERENCED_PARAMETER(CompressedDataInfo);
|
|
UNREFERENCED_PARAMETER(CompressedDataInfoLength);
|
|
UNREFERENCED_PARAMETER(DeviceObject);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static FAST_IO_WRITE_COMPRESSED VfatFastIoWriteCompressed;
|
|
|
|
static
|
|
BOOLEAN
|
|
NTAPI
|
|
VfatFastIoWriteCompressed(
|
|
IN PFILE_OBJECT FileObject,
|
|
IN PLARGE_INTEGER FileOffset,
|
|
IN ULONG Length,
|
|
IN ULONG LockKey,
|
|
IN PVOID Buffer,
|
|
OUT PMDL* MdlChain,
|
|
OUT PIO_STATUS_BLOCK IoStatus,
|
|
IN PCOMPRESSED_DATA_INFO CompressedDataInfo,
|
|
IN ULONG CompressedDataInfoLength,
|
|
IN PDEVICE_OBJECT DeviceObject)
|
|
{
|
|
DPRINT("VfatFastIoWriteCompressed\n");
|
|
|
|
UNREFERENCED_PARAMETER(FileObject);
|
|
UNREFERENCED_PARAMETER(FileOffset);
|
|
UNREFERENCED_PARAMETER(Length);
|
|
UNREFERENCED_PARAMETER(LockKey);
|
|
UNREFERENCED_PARAMETER(Buffer);
|
|
UNREFERENCED_PARAMETER(MdlChain);
|
|
UNREFERENCED_PARAMETER(IoStatus);
|
|
UNREFERENCED_PARAMETER(CompressedDataInfo);
|
|
UNREFERENCED_PARAMETER(CompressedDataInfoLength);
|
|
UNREFERENCED_PARAMETER(DeviceObject);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static FAST_IO_MDL_READ_COMPLETE_COMPRESSED VfatMdlReadCompleteCompressed;
|
|
|
|
static
|
|
BOOLEAN
|
|
NTAPI
|
|
VfatMdlReadCompleteCompressed(
|
|
IN PFILE_OBJECT FileObject,
|
|
IN PMDL MdlChain,
|
|
IN PDEVICE_OBJECT DeviceObject)
|
|
{
|
|
DPRINT("VfatMdlReadCompleteCompressed\n");
|
|
|
|
UNREFERENCED_PARAMETER(FileObject);
|
|
UNREFERENCED_PARAMETER(MdlChain);
|
|
UNREFERENCED_PARAMETER(DeviceObject);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED VfatMdlWriteCompleteCompressed;
|
|
|
|
static
|
|
BOOLEAN
|
|
NTAPI
|
|
VfatMdlWriteCompleteCompressed(
|
|
IN PFILE_OBJECT FileObject,
|
|
IN PLARGE_INTEGER FileOffset,
|
|
IN PMDL MdlChain,
|
|
IN PDEVICE_OBJECT DeviceObject)
|
|
{
|
|
DPRINT("VfatMdlWriteCompleteCompressed\n");
|
|
|
|
UNREFERENCED_PARAMETER(FileObject);
|
|
UNREFERENCED_PARAMETER(FileOffset);
|
|
UNREFERENCED_PARAMETER(MdlChain);
|
|
UNREFERENCED_PARAMETER(DeviceObject);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static FAST_IO_QUERY_OPEN VfatFastIoQueryOpen;
|
|
|
|
static
|
|
BOOLEAN
|
|
NTAPI
|
|
VfatFastIoQueryOpen(
|
|
IN PIRP Irp,
|
|
OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
|
|
IN PDEVICE_OBJECT DeviceObject)
|
|
{
|
|
DPRINT("VfatFastIoQueryOpen\n");
|
|
|
|
UNREFERENCED_PARAMETER(Irp);
|
|
UNREFERENCED_PARAMETER(NetworkInformation);
|
|
UNREFERENCED_PARAMETER(DeviceObject);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static FAST_IO_RELEASE_FOR_MOD_WRITE VfatReleaseForModWrite;
|
|
|
|
static
|
|
NTSTATUS
|
|
NTAPI
|
|
VfatReleaseForModWrite(
|
|
IN PFILE_OBJECT FileObject,
|
|
IN PERESOURCE ResourceToRelease,
|
|
IN PDEVICE_OBJECT DeviceObject)
|
|
{
|
|
DPRINT("VfatReleaseForModWrite\n");
|
|
|
|
UNREFERENCED_PARAMETER(FileObject);
|
|
UNREFERENCED_PARAMETER(ResourceToRelease);
|
|
UNREFERENCED_PARAMETER(DeviceObject);
|
|
|
|
return STATUS_INVALID_DEVICE_REQUEST;
|
|
}
|
|
|
|
static FAST_IO_ACQUIRE_FOR_CCFLUSH VfatAcquireForCcFlush;
|
|
|
|
static
|
|
NTSTATUS
|
|
NTAPI
|
|
VfatAcquireForCcFlush(
|
|
IN PFILE_OBJECT FileObject,
|
|
IN PDEVICE_OBJECT DeviceObject)
|
|
{
|
|
PVFATFCB Fcb = (PVFATFCB)FileObject->FsContext;
|
|
|
|
DPRINT("VfatAcquireForCcFlush\n");
|
|
|
|
UNREFERENCED_PARAMETER(DeviceObject);
|
|
|
|
/* Make sure it is not a volume lock */
|
|
ASSERT(!BooleanFlagOn(Fcb->Flags, FCB_IS_VOLUME));
|
|
|
|
/* Acquire the resource */
|
|
ExAcquireResourceExclusiveLite(&(Fcb->MainResource), TRUE);
|
|
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
static FAST_IO_RELEASE_FOR_CCFLUSH VfatReleaseForCcFlush;
|
|
|
|
static
|
|
NTSTATUS
|
|
NTAPI
|
|
VfatReleaseForCcFlush(
|
|
IN PFILE_OBJECT FileObject,
|
|
IN PDEVICE_OBJECT DeviceObject)
|
|
{
|
|
PVFATFCB Fcb = (PVFATFCB)FileObject->FsContext;
|
|
|
|
DPRINT("VfatReleaseForCcFlush\n");
|
|
|
|
UNREFERENCED_PARAMETER(DeviceObject);
|
|
|
|
/* Make sure it is not a volume lock */
|
|
ASSERT(!BooleanFlagOn(Fcb->Flags, FCB_IS_VOLUME));
|
|
|
|
/* Release the resource */
|
|
ExReleaseResourceLite(&(Fcb->MainResource));
|
|
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
BOOLEAN
|
|
NTAPI
|
|
VfatAcquireForLazyWrite(
|
|
IN PVOID Context,
|
|
IN BOOLEAN Wait)
|
|
{
|
|
PVFATFCB Fcb = (PVFATFCB)Context;
|
|
ASSERT(Fcb);
|
|
DPRINT("VfatAcquireForLazyWrite(): Fcb %p\n", Fcb);
|
|
|
|
if (!ExAcquireResourceExclusiveLite(&(Fcb->MainResource), Wait))
|
|
{
|
|
DPRINT("VfatAcquireForLazyWrite(): ExReleaseResourceLite failed.\n");
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
VOID
|
|
NTAPI
|
|
VfatReleaseFromLazyWrite(
|
|
IN PVOID Context)
|
|
{
|
|
PVFATFCB Fcb = (PVFATFCB)Context;
|
|
ASSERT(Fcb);
|
|
DPRINT("VfatReleaseFromLazyWrite(): Fcb %p\n", Fcb);
|
|
|
|
ExReleaseResourceLite(&(Fcb->MainResource));
|
|
}
|
|
|
|
INIT_FUNCTION
|
|
VOID
|
|
VfatInitFastIoRoutines(
|
|
PFAST_IO_DISPATCH FastIoDispatch)
|
|
{
|
|
FastIoDispatch->SizeOfFastIoDispatch = sizeof(FAST_IO_DISPATCH);
|
|
FastIoDispatch->FastIoCheckIfPossible = VfatFastIoCheckIfPossible;
|
|
FastIoDispatch->FastIoRead = VfatFastIoRead;
|
|
FastIoDispatch->FastIoWrite = VfatFastIoWrite;
|
|
FastIoDispatch->FastIoQueryBasicInfo = VfatFastIoQueryBasicInfo;
|
|
FastIoDispatch->FastIoQueryStandardInfo = VfatFastIoQueryStandardInfo;
|
|
FastIoDispatch->FastIoLock = VfatFastIoLock;
|
|
FastIoDispatch->FastIoUnlockSingle = VfatFastIoUnlockSingle;
|
|
FastIoDispatch->FastIoUnlockAll = VfatFastIoUnlockAll;
|
|
FastIoDispatch->FastIoUnlockAllByKey = VfatFastIoUnlockAllByKey;
|
|
FastIoDispatch->FastIoDeviceControl = VfatFastIoDeviceControl;
|
|
FastIoDispatch->AcquireFileForNtCreateSection = VfatAcquireFileForNtCreateSection;
|
|
FastIoDispatch->ReleaseFileForNtCreateSection = VfatReleaseFileForNtCreateSection;
|
|
FastIoDispatch->FastIoDetachDevice = VfatFastIoDetachDevice;
|
|
FastIoDispatch->FastIoQueryNetworkOpenInfo = VfatFastIoQueryNetworkOpenInfo;
|
|
FastIoDispatch->MdlRead = VfatMdlRead;
|
|
FastIoDispatch->MdlReadComplete = VfatMdlReadComplete;
|
|
FastIoDispatch->PrepareMdlWrite = VfatPrepareMdlWrite;
|
|
FastIoDispatch->MdlWriteComplete = VfatMdlWriteComplete;
|
|
FastIoDispatch->FastIoReadCompressed = VfatFastIoReadCompressed;
|
|
FastIoDispatch->FastIoWriteCompressed = VfatFastIoWriteCompressed;
|
|
FastIoDispatch->MdlReadCompleteCompressed = VfatMdlReadCompleteCompressed;
|
|
FastIoDispatch->MdlWriteCompleteCompressed = VfatMdlWriteCompleteCompressed;
|
|
FastIoDispatch->FastIoQueryOpen = VfatFastIoQueryOpen;
|
|
FastIoDispatch->AcquireForModWrite = VfatAcquireForModWrite;
|
|
FastIoDispatch->ReleaseForModWrite = VfatReleaseForModWrite;
|
|
FastIoDispatch->AcquireForCcFlush = VfatAcquireForCcFlush;
|
|
FastIoDispatch->ReleaseForCcFlush = VfatReleaseForCcFlush;
|
|
}
|