Author: ekohl
Date: Thu Dec 12 13:51:50 2013
New Revision: 61261
URL:
http://svn.reactos.org/svn/reactos?rev=61261&view=rev
Log:
[FASTFAT]
Fix coding style and indentation in remaining files. No code changes!
Modified:
trunk/reactos/drivers/filesystems/fastfat/create.c
trunk/reactos/drivers/filesystems/fastfat/fsctl.c
trunk/reactos/drivers/filesystems/fastfat/misc.c
trunk/reactos/drivers/filesystems/fastfat/vfat.h
Modified: trunk/reactos/drivers/filesystems/fastfat/create.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfa…
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat/create.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat/create.c [iso-8859-1] Thu Dec 12 13:51:50
2013
@@ -272,7 +272,7 @@
return Status;
}
- while(TRUE)
+ while (TRUE)
{
Status = DeviceExt->GetNextDirEntry(&Context, &Page, Parent,
DirContext, First);
First = FALSE;
@@ -380,7 +380,7 @@
FALSE);
if (!NT_SUCCESS(Status))
{
- DPRINT ("Status %lx\n", Status);
+ DPRINT("Status %lx\n", Status);
*ParentFcb = NULL;
return Status;
}
@@ -395,14 +395,14 @@
DPRINT("Checking for existing FCB in memory\n");
Status = vfatGetFCBForFile(DeviceExt, ParentFcb, &Fcb, PathNameU);
- if (!NT_SUCCESS (Status))
+ if (!NT_SUCCESS(Status))
{
DPRINT ("Could not make a new FCB, status: %x\n", Status);
return Status;
}
if (Fcb->Flags & FCB_DELETE_PENDING)
{
- vfatReleaseFCB (DeviceExt, Fcb);
+ vfatReleaseFCB(DeviceExt, Fcb);
return STATUS_DELETE_PENDING;
}
@@ -418,7 +418,7 @@
Status = vfatAttachFCBToFileObject(DeviceExt, Fcb, FileObject);
if (!NT_SUCCESS(Status))
{
- vfatReleaseFCB (DeviceExt, Fcb);
+ vfatReleaseFCB(DeviceExt, Fcb);
}
return Status;
}
@@ -446,7 +446,7 @@
ULONG Attributes;
/* Unpack the various parameters. */
- Stack = IoGetCurrentIrpStackLocation (Irp);
+ Stack = IoGetCurrentIrpStackLocation(Irp);
RequestedDisposition = ((Stack->Parameters.Create.Options >> 24) &
0xff);
RequestedOptions = Stack->Parameters.Create.Options &
FILE_VALID_OPTION_FLAGS;
PagingFileCreate = (Stack->Flags & SL_OPEN_PAGING_FILE) ? TRUE : FALSE;
Modified: trunk/reactos/drivers/filesystems/fastfat/fsctl.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfa…
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat/fsctl.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat/fsctl.c [iso-8859-1] Thu Dec 12 13:51:50
2013
@@ -338,557 +338,578 @@
return Status;
}
-static NTSTATUS
-VfatMountDevice(PDEVICE_EXTENSION DeviceExt,
- PDEVICE_OBJECT DeviceToMount)
/*
* FUNCTION: Mounts the device
*/
+static
+NTSTATUS
+VfatMountDevice(
+ PDEVICE_EXTENSION DeviceExt,
+ PDEVICE_OBJECT DeviceToMount)
{
- NTSTATUS Status;
- BOOLEAN RecognizedFS;
-
- DPRINT("Mounting VFAT device...\n");
-
- Status = VfatHasFileSystem(DeviceToMount, &RecognizedFS,
&DeviceExt->FatInfo);
- if (!NT_SUCCESS(Status))
- {
- return(Status);
- }
- DPRINT("MountVfatdev %u, PAGE_SIZE = %d\n",
DeviceExt->FatInfo.BytesPerCluster, PAGE_SIZE);
-
-
- return(STATUS_SUCCESS);
+ NTSTATUS Status;
+ BOOLEAN RecognizedFS;
+
+ DPRINT("Mounting VFAT device...\n");
+
+ Status = VfatHasFileSystem(DeviceToMount, &RecognizedFS,
&DeviceExt->FatInfo);
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+ DPRINT("MountVfatdev %u, PAGE_SIZE = %d\n",
DeviceExt->FatInfo.BytesPerCluster, PAGE_SIZE);
+
+ return STATUS_SUCCESS;
}
-static NTSTATUS
-VfatMount (PVFAT_IRP_CONTEXT IrpContext)
/*
* FUNCTION: Mount the filesystem
*/
+static
+NTSTATUS
+VfatMount(
+ PVFAT_IRP_CONTEXT IrpContext)
{
- PDEVICE_OBJECT DeviceObject = NULL;
- PDEVICE_EXTENSION DeviceExt = NULL;
- BOOLEAN RecognizedFS;
- NTSTATUS Status;
- PVFATFCB Fcb = NULL;
- PVFATFCB VolumeFcb = NULL;
- PVFATCCB Ccb = NULL;
- PDEVICE_OBJECT DeviceToMount;
- PVPB Vpb;
- UNICODE_STRING NameU = RTL_CONSTANT_STRING(L"\\$$Fat$$");
- UNICODE_STRING VolumeNameU = RTL_CONSTANT_STRING(L"\\$$Volume$$");
- ULONG HashTableSize;
- ULONG eocMark;
- FATINFO FatInfo;
-
- DPRINT("VfatMount(IrpContext %p)\n", IrpContext);
-
- ASSERT(IrpContext);
-
- if (IrpContext->DeviceObject != VfatGlobalData->DeviceObject)
- {
- Status = STATUS_INVALID_DEVICE_REQUEST;
- goto ByeBye;
- }
-
- DeviceToMount = IrpContext->Stack->Parameters.MountVolume.DeviceObject;
- Vpb = IrpContext->Stack->Parameters.MountVolume.Vpb;
-
- Status = VfatHasFileSystem (DeviceToMount, &RecognizedFS, &FatInfo);
- if (!NT_SUCCESS(Status))
- {
- goto ByeBye;
- }
-
- if (RecognizedFS == FALSE)
- {
- DPRINT("VFAT: Unrecognized Volume\n");
- Status = STATUS_UNRECOGNIZED_VOLUME;
- goto ByeBye;
- }
-
- /* Use prime numbers for the table size */
- if (FatInfo.FatType == FAT12)
- {
- HashTableSize = 4099; // 4096 = 4 * 1024
- }
- else if (FatInfo.FatType == FAT16 ||
- FatInfo.FatType == FATX16)
- {
- HashTableSize = 16411; // 16384 = 16 * 1024
- }
- else
- {
- HashTableSize = 65537; // 65536 = 64 * 1024;
- }
- HashTableSize = FCB_HASH_TABLE_SIZE;
- DPRINT("VFAT: Recognized volume\n");
- Status = IoCreateDevice(VfatGlobalData->DriverObject,
- ROUND_UP(sizeof (DEVICE_EXTENSION), sizeof(ULONG)) +
sizeof(HASHENTRY*) * HashTableSize,
- NULL,
- FILE_DEVICE_DISK_FILE_SYSTEM,
- DeviceToMount->Characteristics,
- FALSE,
- &DeviceObject);
- if (!NT_SUCCESS(Status))
- {
- goto ByeBye;
- }
-
- DeviceObject->Flags = DeviceObject->Flags | DO_DIRECT_IO;
- DeviceExt = (PVOID) DeviceObject->DeviceExtension;
- RtlZeroMemory(DeviceExt, ROUND_UP(sizeof(DEVICE_EXTENSION), sizeof(ULONG)) +
sizeof(HASHENTRY*) * HashTableSize);
- DeviceExt->FcbHashTable = (HASHENTRY**)((ULONG_PTR)DeviceExt +
ROUND_UP(sizeof(DEVICE_EXTENSION), sizeof(ULONG)));
- DeviceExt->HashTableSize = HashTableSize;
-
- /* use same vpb as device disk */
- DeviceObject->Vpb = Vpb;
- DeviceToMount->Vpb = Vpb;
-
- Status = VfatMountDevice(DeviceExt, DeviceToMount);
- if (!NT_SUCCESS(Status))
- {
- /* FIXME: delete device object */
- goto ByeBye;
- }
-
- DPRINT("BytesPerSector: %u\n", DeviceExt->FatInfo.BytesPerSector);
- DPRINT("SectorsPerCluster: %u\n",
DeviceExt->FatInfo.SectorsPerCluster);
- DPRINT("FATCount: %u\n", DeviceExt->FatInfo.FATCount);
- DPRINT("FATSectors: %u\n", DeviceExt->FatInfo.FATSectors);
- DPRINT("RootStart: %u\n", DeviceExt->FatInfo.rootStart);
- DPRINT("DataStart: %u\n", DeviceExt->FatInfo.dataStart);
- if (DeviceExt->FatInfo.FatType == FAT32)
- {
- DPRINT("RootCluster: %u\n", DeviceExt->FatInfo.RootCluster);
- }
-
- switch (DeviceExt->FatInfo.FatType)
- {
- case FAT12:
- DeviceExt->GetNextCluster = FAT12GetNextCluster;
- DeviceExt->FindAndMarkAvailableCluster = FAT12FindAndMarkAvailableCluster;
- DeviceExt->WriteCluster = FAT12WriteCluster;
- DeviceExt->CleanShutBitMask = 0;
- break;
-
- case FAT16:
- case FATX16:
- DeviceExt->GetNextCluster = FAT16GetNextCluster;
- DeviceExt->FindAndMarkAvailableCluster = FAT16FindAndMarkAvailableCluster;
- DeviceExt->WriteCluster = FAT16WriteCluster;
- DeviceExt->CleanShutBitMask = 0x8000;
- break;
-
- case FAT32:
- case FATX32:
- DeviceExt->GetNextCluster = FAT32GetNextCluster;
- DeviceExt->FindAndMarkAvailableCluster = FAT32FindAndMarkAvailableCluster;
- DeviceExt->WriteCluster = FAT32WriteCluster;
- DeviceExt->CleanShutBitMask = 0x80000000;
- break;
- }
-
- if (DeviceExt->FatInfo.FatType == FATX16
- || DeviceExt->FatInfo.FatType == FATX32)
- {
- DeviceExt->Flags |= VCB_IS_FATX;
- DeviceExt->GetNextDirEntry = FATXGetNextDirEntry;
- DeviceExt->BaseDateYear = 2000;
- }
- else
- {
- DeviceExt->GetNextDirEntry = FATGetNextDirEntry;
- DeviceExt->BaseDateYear = 1980;
- }
-
- DeviceExt->StorageDevice = DeviceToMount;
- DeviceExt->StorageDevice->Vpb->DeviceObject = DeviceObject;
- DeviceExt->StorageDevice->Vpb->RealDevice = DeviceExt->StorageDevice;
- DeviceExt->StorageDevice->Vpb->Flags |= VPB_MOUNTED;
- DeviceObject->StackSize = DeviceExt->StorageDevice->StackSize + 1;
- DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
-
- DPRINT("FsDeviceObject %p\n", DeviceObject);
-
- /* Initialize this resource early ... it's used in VfatCleanup */
- ExInitializeResourceLite(&DeviceExt->DirResource);
-
- DeviceExt->FATFileObject = IoCreateStreamFileObject(NULL,
DeviceExt->StorageDevice);
- Fcb = vfatNewFCB(DeviceExt, &NameU);
- if (Fcb == NULL)
- {
- Status = STATUS_INSUFFICIENT_RESOURCES;
- goto ByeBye;
- }
- Ccb = ExAllocateFromNPagedLookasideList(&VfatGlobalData->CcbLookasideList);
- if (Ccb == NULL)
- {
- Status = STATUS_INSUFFICIENT_RESOURCES;
- goto ByeBye;
- }
-
- RtlZeroMemory(Ccb, sizeof (VFATCCB));
- DeviceExt->FATFileObject->FsContext = Fcb;
- DeviceExt->FATFileObject->FsContext2 = Ccb;
- DeviceExt->FATFileObject->SectionObjectPointer =
&Fcb->SectionObjectPointers;
- DeviceExt->FATFileObject->PrivateCacheMap = NULL;
- DeviceExt->FATFileObject->Vpb = DeviceObject->Vpb;
- Fcb->FileObject = DeviceExt->FATFileObject;
-
- Fcb->Flags |= FCB_IS_FAT;
-
- Fcb->RFCB.FileSize.QuadPart = DeviceExt->FatInfo.FATSectors *
DeviceExt->FatInfo.BytesPerSector;
- Fcb->RFCB.ValidDataLength = Fcb->RFCB.FileSize;
- Fcb->RFCB.AllocationSize = Fcb->RFCB.FileSize;
-
- CcInitializeCacheMap(DeviceExt->FATFileObject,
- (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
- TRUE,
- &VfatGlobalData->CacheMgrCallbacks,
- Fcb);
-
- DeviceExt->LastAvailableCluster = 2;
- ExInitializeResourceLite(&DeviceExt->FatResource);
-
- InitializeListHead(&DeviceExt->FcbListHead);
-
- VolumeFcb = vfatNewFCB(DeviceExt, &VolumeNameU);
- if (VolumeFcb == NULL)
- {
- Status = STATUS_INSUFFICIENT_RESOURCES;
- goto ByeBye;
- }
- VolumeFcb->Flags = FCB_IS_VOLUME;
- VolumeFcb->RFCB.FileSize.QuadPart = DeviceExt->FatInfo.Sectors *
DeviceExt->FatInfo.BytesPerSector;
- VolumeFcb->RFCB.ValidDataLength = VolumeFcb->RFCB.FileSize;
- VolumeFcb->RFCB.AllocationSize = VolumeFcb->RFCB.FileSize;
- DeviceExt->VolumeFcb = VolumeFcb;
-
- ExAcquireResourceExclusiveLite(&VfatGlobalData->VolumeListLock, TRUE);
- InsertHeadList(&VfatGlobalData->VolumeListHead,
&DeviceExt->VolumeListEntry);
- ExReleaseResourceLite(&VfatGlobalData->VolumeListLock);
-
- /* read serial number */
- DeviceObject->Vpb->SerialNumber = DeviceExt->FatInfo.VolumeID;
-
- /* read volume label */
- ReadVolumeLabel(DeviceExt, DeviceObject->Vpb);
-
- /* read clean shutdown bit status */
- Status = GetNextCluster(DeviceExt, 1, &eocMark);
- if (NT_SUCCESS(Status))
- {
- if (eocMark & DeviceExt->CleanShutBitMask)
- {
- /* unset clean shutdown bit */
- eocMark &= ~DeviceExt->CleanShutBitMask;
- WriteCluster(DeviceExt, 1, eocMark);
- VolumeFcb->Flags |= VCB_CLEAR_DIRTY;
- }
- }
- VolumeFcb->Flags |= VCB_IS_DIRTY;
-
- FsRtlNotifyVolumeEvent(DeviceExt->FATFileObject, FSRTL_VOLUME_MOUNT);
-
- Status = STATUS_SUCCESS;
+ PDEVICE_OBJECT DeviceObject = NULL;
+ PDEVICE_EXTENSION DeviceExt = NULL;
+ BOOLEAN RecognizedFS;
+ NTSTATUS Status;
+ PVFATFCB Fcb = NULL;
+ PVFATFCB VolumeFcb = NULL;
+ PVFATCCB Ccb = NULL;
+ PDEVICE_OBJECT DeviceToMount;
+ PVPB Vpb;
+ UNICODE_STRING NameU = RTL_CONSTANT_STRING(L"\\$$Fat$$");
+ UNICODE_STRING VolumeNameU = RTL_CONSTANT_STRING(L"\\$$Volume$$");
+ ULONG HashTableSize;
+ ULONG eocMark;
+ FATINFO FatInfo;
+
+ DPRINT("VfatMount(IrpContext %p)\n", IrpContext);
+
+ ASSERT(IrpContext);
+
+ if (IrpContext->DeviceObject != VfatGlobalData->DeviceObject)
+ {
+ Status = STATUS_INVALID_DEVICE_REQUEST;
+ goto ByeBye;
+ }
+
+ DeviceToMount = IrpContext->Stack->Parameters.MountVolume.DeviceObject;
+ Vpb = IrpContext->Stack->Parameters.MountVolume.Vpb;
+
+ Status = VfatHasFileSystem(DeviceToMount, &RecognizedFS, &FatInfo);
+ if (!NT_SUCCESS(Status))
+ {
+ goto ByeBye;
+ }
+
+ if (RecognizedFS == FALSE)
+ {
+ DPRINT("VFAT: Unrecognized Volume\n");
+ Status = STATUS_UNRECOGNIZED_VOLUME;
+ goto ByeBye;
+ }
+
+ /* Use prime numbers for the table size */
+ if (FatInfo.FatType == FAT12)
+ {
+ HashTableSize = 4099; // 4096 = 4 * 1024
+ }
+ else if (FatInfo.FatType == FAT16 ||
+ FatInfo.FatType == FATX16)
+ {
+ HashTableSize = 16411; // 16384 = 16 * 1024
+ }
+ else
+ {
+ HashTableSize = 65537; // 65536 = 64 * 1024;
+ }
+ HashTableSize = FCB_HASH_TABLE_SIZE;
+ DPRINT("VFAT: Recognized volume\n");
+ Status = IoCreateDevice(VfatGlobalData->DriverObject,
+ ROUND_UP(sizeof (DEVICE_EXTENSION), sizeof(ULONG)) +
sizeof(HASHENTRY*) * HashTableSize,
+ NULL,
+ FILE_DEVICE_DISK_FILE_SYSTEM,
+ DeviceToMount->Characteristics,
+ FALSE,
+ &DeviceObject);
+ if (!NT_SUCCESS(Status))
+ {
+ goto ByeBye;
+ }
+
+ DeviceObject->Flags = DeviceObject->Flags | DO_DIRECT_IO;
+ DeviceExt = (PVOID) DeviceObject->DeviceExtension;
+ RtlZeroMemory(DeviceExt, ROUND_UP(sizeof(DEVICE_EXTENSION), sizeof(ULONG)) +
sizeof(HASHENTRY*) * HashTableSize);
+ DeviceExt->FcbHashTable = (HASHENTRY**)((ULONG_PTR)DeviceExt +
ROUND_UP(sizeof(DEVICE_EXTENSION), sizeof(ULONG)));
+ DeviceExt->HashTableSize = HashTableSize;
+
+ /* use same vpb as device disk */
+ DeviceObject->Vpb = Vpb;
+ DeviceToMount->Vpb = Vpb;
+
+ Status = VfatMountDevice(DeviceExt, DeviceToMount);
+ if (!NT_SUCCESS(Status))
+ {
+ /* FIXME: delete device object */
+ goto ByeBye;
+ }
+
+ DPRINT("BytesPerSector: %u\n", DeviceExt->FatInfo.BytesPerSector);
+ DPRINT("SectorsPerCluster: %u\n",
DeviceExt->FatInfo.SectorsPerCluster);
+ DPRINT("FATCount: %u\n", DeviceExt->FatInfo.FATCount);
+ DPRINT("FATSectors: %u\n", DeviceExt->FatInfo.FATSectors);
+ DPRINT("RootStart: %u\n", DeviceExt->FatInfo.rootStart);
+ DPRINT("DataStart: %u\n", DeviceExt->FatInfo.dataStart);
+ if (DeviceExt->FatInfo.FatType == FAT32)
+ {
+ DPRINT("RootCluster: %u\n", DeviceExt->FatInfo.RootCluster);
+ }
+
+ switch (DeviceExt->FatInfo.FatType)
+ {
+ case FAT12:
+ DeviceExt->GetNextCluster = FAT12GetNextCluster;
+ DeviceExt->FindAndMarkAvailableCluster =
FAT12FindAndMarkAvailableCluster;
+ DeviceExt->WriteCluster = FAT12WriteCluster;
+ DeviceExt->CleanShutBitMask = 0;
+ break;
+
+ case FAT16:
+ case FATX16:
+ DeviceExt->GetNextCluster = FAT16GetNextCluster;
+ DeviceExt->FindAndMarkAvailableCluster =
FAT16FindAndMarkAvailableCluster;
+ DeviceExt->WriteCluster = FAT16WriteCluster;
+ DeviceExt->CleanShutBitMask = 0x8000;
+ break;
+
+ case FAT32:
+ case FATX32:
+ DeviceExt->GetNextCluster = FAT32GetNextCluster;
+ DeviceExt->FindAndMarkAvailableCluster =
FAT32FindAndMarkAvailableCluster;
+ DeviceExt->WriteCluster = FAT32WriteCluster;
+ DeviceExt->CleanShutBitMask = 0x80000000;
+ break;
+ }
+
+ if (DeviceExt->FatInfo.FatType == FATX16 ||
+ DeviceExt->FatInfo.FatType == FATX32)
+ {
+ DeviceExt->Flags |= VCB_IS_FATX;
+ DeviceExt->GetNextDirEntry = FATXGetNextDirEntry;
+ DeviceExt->BaseDateYear = 2000;
+ }
+ else
+ {
+ DeviceExt->GetNextDirEntry = FATGetNextDirEntry;
+ DeviceExt->BaseDateYear = 1980;
+ }
+
+ DeviceExt->StorageDevice = DeviceToMount;
+ DeviceExt->StorageDevice->Vpb->DeviceObject = DeviceObject;
+ DeviceExt->StorageDevice->Vpb->RealDevice = DeviceExt->StorageDevice;
+ DeviceExt->StorageDevice->Vpb->Flags |= VPB_MOUNTED;
+ DeviceObject->StackSize = DeviceExt->StorageDevice->StackSize + 1;
+ DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
+
+ DPRINT("FsDeviceObject %p\n", DeviceObject);
+
+ /* Initialize this resource early ... it's used in VfatCleanup */
+ ExInitializeResourceLite(&DeviceExt->DirResource);
+
+ DeviceExt->FATFileObject = IoCreateStreamFileObject(NULL,
DeviceExt->StorageDevice);
+ Fcb = vfatNewFCB(DeviceExt, &NameU);
+ if (Fcb == NULL)
+ {
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ goto ByeBye;
+ }
+
+ Ccb = ExAllocateFromNPagedLookasideList(&VfatGlobalData->CcbLookasideList);
+ if (Ccb == NULL)
+ {
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ goto ByeBye;
+ }
+
+ RtlZeroMemory(Ccb, sizeof (VFATCCB));
+ DeviceExt->FATFileObject->FsContext = Fcb;
+ DeviceExt->FATFileObject->FsContext2 = Ccb;
+ DeviceExt->FATFileObject->SectionObjectPointer =
&Fcb->SectionObjectPointers;
+ DeviceExt->FATFileObject->PrivateCacheMap = NULL;
+ DeviceExt->FATFileObject->Vpb = DeviceObject->Vpb;
+ Fcb->FileObject = DeviceExt->FATFileObject;
+
+ Fcb->Flags |= FCB_IS_FAT;
+
+ Fcb->RFCB.FileSize.QuadPart = DeviceExt->FatInfo.FATSectors *
DeviceExt->FatInfo.BytesPerSector;
+ Fcb->RFCB.ValidDataLength = Fcb->RFCB.FileSize;
+ Fcb->RFCB.AllocationSize = Fcb->RFCB.FileSize;
+
+ CcInitializeCacheMap(DeviceExt->FATFileObject,
+ (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
+ TRUE,
+ &VfatGlobalData->CacheMgrCallbacks,
+ Fcb);
+
+ DeviceExt->LastAvailableCluster = 2;
+ ExInitializeResourceLite(&DeviceExt->FatResource);
+
+ InitializeListHead(&DeviceExt->FcbListHead);
+
+ VolumeFcb = vfatNewFCB(DeviceExt, &VolumeNameU);
+ if (VolumeFcb == NULL)
+ {
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ goto ByeBye;
+ }
+
+ VolumeFcb->Flags = FCB_IS_VOLUME;
+ VolumeFcb->RFCB.FileSize.QuadPart = DeviceExt->FatInfo.Sectors *
DeviceExt->FatInfo.BytesPerSector;
+ VolumeFcb->RFCB.ValidDataLength = VolumeFcb->RFCB.FileSize;
+ VolumeFcb->RFCB.AllocationSize = VolumeFcb->RFCB.FileSize;
+ DeviceExt->VolumeFcb = VolumeFcb;
+
+ ExAcquireResourceExclusiveLite(&VfatGlobalData->VolumeListLock, TRUE);
+ InsertHeadList(&VfatGlobalData->VolumeListHead,
&DeviceExt->VolumeListEntry);
+ ExReleaseResourceLite(&VfatGlobalData->VolumeListLock);
+
+ /* read serial number */
+ DeviceObject->Vpb->SerialNumber = DeviceExt->FatInfo.VolumeID;
+
+ /* read volume label */
+ ReadVolumeLabel(DeviceExt, DeviceObject->Vpb);
+
+ /* read clean shutdown bit status */
+ Status = GetNextCluster(DeviceExt, 1, &eocMark);
+ if (NT_SUCCESS(Status))
+ {
+ if (eocMark & DeviceExt->CleanShutBitMask)
+ {
+ /* unset clean shutdown bit */
+ eocMark &= ~DeviceExt->CleanShutBitMask;
+ WriteCluster(DeviceExt, 1, eocMark);
+ VolumeFcb->Flags |= VCB_CLEAR_DIRTY;
+ }
+ }
+
+ VolumeFcb->Flags |= VCB_IS_DIRTY;
+
+ FsRtlNotifyVolumeEvent(DeviceExt->FATFileObject, FSRTL_VOLUME_MOUNT);
+
+ Status = STATUS_SUCCESS;
+
ByeBye:
-
- if (!NT_SUCCESS(Status))
- {
- // cleanup
- if (DeviceExt && DeviceExt->FATFileObject)
- ObDereferenceObject (DeviceExt->FATFileObject);
- if (Fcb)
- vfatDestroyFCB(Fcb);
- if (Ccb)
- vfatDestroyCCB(Ccb);
- if (DeviceObject)
- IoDeleteDevice(DeviceObject);
- if (VolumeFcb)
- vfatDestroyFCB(VolumeFcb);
- }
- return Status;
+ if (!NT_SUCCESS(Status))
+ {
+ /* Cleanup */
+ if (DeviceExt && DeviceExt->FATFileObject)
+ ObDereferenceObject (DeviceExt->FATFileObject);
+ if (Fcb)
+ vfatDestroyFCB(Fcb);
+ if (Ccb)
+ vfatDestroyCCB(Ccb);
+ if (DeviceObject)
+ IoDeleteDevice(DeviceObject);
+ if (VolumeFcb)
+ vfatDestroyFCB(VolumeFcb);
+ }
+
+ return Status;
}
-static NTSTATUS
-VfatVerify (PVFAT_IRP_CONTEXT IrpContext)
/*
* FUNCTION: Verify the filesystem
*/
+static
+NTSTATUS
+VfatVerify(
+ PVFAT_IRP_CONTEXT IrpContext)
{
- PDEVICE_OBJECT DeviceToVerify;
- NTSTATUS Status = STATUS_SUCCESS;
- FATINFO FatInfo;
- BOOLEAN RecognizedFS;
- PDEVICE_EXTENSION DeviceExt = IrpContext->DeviceExt;
-
- DPRINT("VfatVerify(IrpContext %p)\n", IrpContext);
-
- DeviceToVerify = IrpContext->Stack->Parameters.VerifyVolume.DeviceObject;
- Status = VfatBlockDeviceIoControl(DeviceToVerify,
- IOCTL_DISK_CHECK_VERIFY,
- NULL,
- 0,
- NULL,
- 0,
- TRUE);
- DeviceToVerify->Flags &= ~DO_VERIFY_VOLUME;
- if (!NT_SUCCESS(Status) && Status != STATUS_VERIFY_REQUIRED)
- {
- DPRINT("VfatBlockDeviceIoControl() failed (Status %lx)\n", Status);
- Status = STATUS_WRONG_VOLUME;
- }
- else
- {
- Status = VfatHasFileSystem(DeviceToVerify, &RecognizedFS, &FatInfo);
- if (!NT_SUCCESS(Status) || RecognizedFS == FALSE)
- {
- Status = STATUS_WRONG_VOLUME;
- }
- else if (sizeof(FATINFO) == RtlCompareMemory(&FatInfo,
&DeviceExt->FatInfo, sizeof(FATINFO)))
- {
- /*
- * FIXME:
- * Preformated floppy disks have very often a serial number of 0000:0000.
- * We should calculate a crc sum over the sectors from the root directory as
secondary volume number.
- * Each write to the root directory must update this crc sum.
- */
-
- }
- else
- {
- Status = STATUS_WRONG_VOLUME;
- }
- }
-
- return Status;
+ PDEVICE_OBJECT DeviceToVerify;
+ NTSTATUS Status = STATUS_SUCCESS;
+ FATINFO FatInfo;
+ BOOLEAN RecognizedFS;
+ PDEVICE_EXTENSION DeviceExt = IrpContext->DeviceExt;
+
+ DPRINT("VfatVerify(IrpContext %p)\n", IrpContext);
+
+ DeviceToVerify = IrpContext->Stack->Parameters.VerifyVolume.DeviceObject;
+ Status = VfatBlockDeviceIoControl(DeviceToVerify,
+ IOCTL_DISK_CHECK_VERIFY,
+ NULL,
+ 0,
+ NULL,
+ 0,
+ TRUE);
+ DeviceToVerify->Flags &= ~DO_VERIFY_VOLUME;
+ if (!NT_SUCCESS(Status) && Status != STATUS_VERIFY_REQUIRED)
+ {
+ DPRINT("VfatBlockDeviceIoControl() failed (Status %lx)\n", Status);
+ Status = STATUS_WRONG_VOLUME;
+ }
+ else
+ {
+ Status = VfatHasFileSystem(DeviceToVerify, &RecognizedFS, &FatInfo);
+ if (!NT_SUCCESS(Status) || RecognizedFS == FALSE)
+ {
+ Status = STATUS_WRONG_VOLUME;
+ }
+ else if (sizeof(FATINFO) == RtlCompareMemory(&FatInfo,
&DeviceExt->FatInfo, sizeof(FATINFO)))
+ {
+ /*
+ * FIXME:
+ * Preformated floppy disks have very often a serial number of 0000:0000.
+ * We should calculate a crc sum over the sectors from the root directory
as secondary volume number.
+ * Each write to the root directory must update this crc sum.
+ */
+ }
+ else
+ {
+ Status = STATUS_WRONG_VOLUME;
+ }
+ }
+
+ return Status;
}
-static NTSTATUS
-VfatGetVolumeBitmap(PVFAT_IRP_CONTEXT IrpContext)
+static
+NTSTATUS
+VfatGetVolumeBitmap(
+ PVFAT_IRP_CONTEXT IrpContext)
{
- DPRINT("VfatGetVolumeBitmap (IrpContext %p)\n", IrpContext);
-
- return STATUS_INVALID_DEVICE_REQUEST;
+ DPRINT("VfatGetVolumeBitmap (IrpContext %p)\n", IrpContext);
+ return STATUS_INVALID_DEVICE_REQUEST;
}
-static NTSTATUS
-VfatGetRetrievalPointers(PVFAT_IRP_CONTEXT IrpContext)
+static
+NTSTATUS
+VfatGetRetrievalPointers(
+ PVFAT_IRP_CONTEXT IrpContext)
{
- PIO_STACK_LOCATION Stack;
- LARGE_INTEGER Vcn;
- PRETRIEVAL_POINTERS_BUFFER RetrievalPointers;
- PFILE_OBJECT FileObject;
- ULONG MaxExtentCount;
- PVFATFCB Fcb;
- PDEVICE_EXTENSION DeviceExt;
- ULONG FirstCluster;
- ULONG CurrentCluster;
- ULONG LastCluster;
- NTSTATUS Status;
-
- DPRINT("VfatGetRetrievalPointers(IrpContext %p)\n", IrpContext);
-
- DeviceExt = IrpContext->DeviceExt;
- FileObject = IrpContext->FileObject;
- Stack = IrpContext->Stack;
- if (Stack->Parameters.DeviceIoControl.InputBufferLength <
sizeof(STARTING_VCN_INPUT_BUFFER) ||
- Stack->Parameters.DeviceIoControl.Type3InputBuffer == NULL)
- {
- return STATUS_INVALID_PARAMETER;
- }
- if (IrpContext->Irp->UserBuffer == NULL ||
- Stack->Parameters.DeviceIoControl.OutputBufferLength <
sizeof(RETRIEVAL_POINTERS_BUFFER))
- {
- return STATUS_BUFFER_TOO_SMALL;
- }
-
- Fcb = FileObject->FsContext;
-
- ExAcquireResourceSharedLite(&Fcb->MainResource, TRUE);
-
- Vcn =
((PSTARTING_VCN_INPUT_BUFFER)Stack->Parameters.DeviceIoControl.Type3InputBuffer)->StartingVcn;
- RetrievalPointers = IrpContext->Irp->UserBuffer;
-
- MaxExtentCount = ((Stack->Parameters.DeviceIoControl.OutputBufferLength -
sizeof(RetrievalPointers->ExtentCount) - sizeof(RetrievalPointers->StartingVcn)) /
sizeof(RetrievalPointers->Extents[0]));
-
-
- if (Vcn.QuadPart >= Fcb->RFCB.AllocationSize.QuadPart /
DeviceExt->FatInfo.BytesPerCluster)
- {
- Status = STATUS_INVALID_PARAMETER;
- goto ByeBye;
- }
-
- CurrentCluster = FirstCluster = vfatDirEntryGetFirstCluster(DeviceExt,
&Fcb->entry);
- Status = OffsetToCluster(DeviceExt, FirstCluster,
- Vcn.u.LowPart * DeviceExt->FatInfo.BytesPerCluster,
- &CurrentCluster, FALSE);
- if (!NT_SUCCESS(Status))
- {
- goto ByeBye;
- }
-
- RetrievalPointers->StartingVcn = Vcn;
- RetrievalPointers->ExtentCount = 0;
- RetrievalPointers->Extents[0].Lcn.u.HighPart = 0;
- RetrievalPointers->Extents[0].Lcn.u.LowPart = CurrentCluster - 2;
- LastCluster = 0;
- while (CurrentCluster != 0xffffffff && RetrievalPointers->ExtentCount <
MaxExtentCount)
- {
-
- LastCluster = CurrentCluster;
- Status = NextCluster(DeviceExt, CurrentCluster, &CurrentCluster, FALSE);
- Vcn.QuadPart++;
- if (!NT_SUCCESS(Status))
- {
- goto ByeBye;
- }
-
- if (LastCluster + 1 != CurrentCluster)
- {
- RetrievalPointers->Extents[RetrievalPointers->ExtentCount].NextVcn = Vcn;
- RetrievalPointers->ExtentCount++;
- if (RetrievalPointers->ExtentCount < MaxExtentCount)
- {
-
RetrievalPointers->Extents[RetrievalPointers->ExtentCount].Lcn.u.HighPart = 0;
-
RetrievalPointers->Extents[RetrievalPointers->ExtentCount].Lcn.u.LowPart =
CurrentCluster - 2;
- }
- }
- }
-
- IrpContext->Irp->IoStatus.Information = sizeof(RETRIEVAL_POINTERS_BUFFER) +
(sizeof(RetrievalPointers->Extents[0]) * (RetrievalPointers->ExtentCount - 1));
- Status = STATUS_SUCCESS;
+ PIO_STACK_LOCATION Stack;
+ LARGE_INTEGER Vcn;
+ PRETRIEVAL_POINTERS_BUFFER RetrievalPointers;
+ PFILE_OBJECT FileObject;
+ ULONG MaxExtentCount;
+ PVFATFCB Fcb;
+ PDEVICE_EXTENSION DeviceExt;
+ ULONG FirstCluster;
+ ULONG CurrentCluster;
+ ULONG LastCluster;
+ NTSTATUS Status;
+
+ DPRINT("VfatGetRetrievalPointers(IrpContext %p)\n", IrpContext);
+
+ DeviceExt = IrpContext->DeviceExt;
+ FileObject = IrpContext->FileObject;
+ Stack = IrpContext->Stack;
+ if (Stack->Parameters.DeviceIoControl.InputBufferLength <
sizeof(STARTING_VCN_INPUT_BUFFER) ||
+ Stack->Parameters.DeviceIoControl.Type3InputBuffer == NULL)
+ {
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ if (IrpContext->Irp->UserBuffer == NULL ||
+ Stack->Parameters.DeviceIoControl.OutputBufferLength <
sizeof(RETRIEVAL_POINTERS_BUFFER))
+ {
+ return STATUS_BUFFER_TOO_SMALL;
+ }
+
+ Fcb = FileObject->FsContext;
+
+ ExAcquireResourceSharedLite(&Fcb->MainResource, TRUE);
+
+ Vcn =
((PSTARTING_VCN_INPUT_BUFFER)Stack->Parameters.DeviceIoControl.Type3InputBuffer)->StartingVcn;
+ RetrievalPointers = IrpContext->Irp->UserBuffer;
+
+ MaxExtentCount = ((Stack->Parameters.DeviceIoControl.OutputBufferLength -
sizeof(RetrievalPointers->ExtentCount) - sizeof(RetrievalPointers->StartingVcn)) /
sizeof(RetrievalPointers->Extents[0]));
+
+ if (Vcn.QuadPart >= Fcb->RFCB.AllocationSize.QuadPart /
DeviceExt->FatInfo.BytesPerCluster)
+ {
+ Status = STATUS_INVALID_PARAMETER;
+ goto ByeBye;
+ }
+
+ CurrentCluster = FirstCluster = vfatDirEntryGetFirstCluster(DeviceExt,
&Fcb->entry);
+ Status = OffsetToCluster(DeviceExt, FirstCluster,
+ Vcn.u.LowPart * DeviceExt->FatInfo.BytesPerCluster,
+ &CurrentCluster, FALSE);
+ if (!NT_SUCCESS(Status))
+ {
+ goto ByeBye;
+ }
+
+ RetrievalPointers->StartingVcn = Vcn;
+ RetrievalPointers->ExtentCount = 0;
+ RetrievalPointers->Extents[0].Lcn.u.HighPart = 0;
+ RetrievalPointers->Extents[0].Lcn.u.LowPart = CurrentCluster - 2;
+ LastCluster = 0;
+ while (CurrentCluster != 0xffffffff && RetrievalPointers->ExtentCount <
MaxExtentCount)
+ {
+ LastCluster = CurrentCluster;
+ Status = NextCluster(DeviceExt, CurrentCluster, &CurrentCluster, FALSE);
+ Vcn.QuadPart++;
+ if (!NT_SUCCESS(Status))
+ {
+ goto ByeBye;
+ }
+
+ if (LastCluster + 1 != CurrentCluster)
+ {
+ RetrievalPointers->Extents[RetrievalPointers->ExtentCount].NextVcn =
Vcn;
+ RetrievalPointers->ExtentCount++;
+ if (RetrievalPointers->ExtentCount < MaxExtentCount)
+ {
+
RetrievalPointers->Extents[RetrievalPointers->ExtentCount].Lcn.u.HighPart = 0;
+
RetrievalPointers->Extents[RetrievalPointers->ExtentCount].Lcn.u.LowPart =
CurrentCluster - 2;
+ }
+ }
+ }
+
+ IrpContext->Irp->IoStatus.Information = sizeof(RETRIEVAL_POINTERS_BUFFER) +
(sizeof(RetrievalPointers->Extents[0]) * (RetrievalPointers->ExtentCount - 1));
+ Status = STATUS_SUCCESS;
ByeBye:
- ExReleaseResourceLite(&Fcb->MainResource);
-
- return Status;
+ ExReleaseResourceLite(&Fcb->MainResource);
+
+ return Status;
}
-static NTSTATUS
-VfatMoveFile(PVFAT_IRP_CONTEXT IrpContext)
+static
+NTSTATUS
+VfatMoveFile(
+ PVFAT_IRP_CONTEXT IrpContext)
{
- DPRINT("VfatMoveFile(IrpContext %p)\n", IrpContext);
-
- return STATUS_INVALID_DEVICE_REQUEST;
+ DPRINT("VfatMoveFile(IrpContext %p)\n", IrpContext);
+ return STATUS_INVALID_DEVICE_REQUEST;
}
-static NTSTATUS
-VfatIsVolumeDirty(PVFAT_IRP_CONTEXT IrpContext)
+static
+NTSTATUS
+VfatIsVolumeDirty(
+ PVFAT_IRP_CONTEXT IrpContext)
{
- PULONG Flags;
-
- DPRINT("VfatIsVolumeDirty(IrpContext %p)\n", IrpContext);
-
- if (IrpContext->Stack->Parameters.FileSystemControl.OutputBufferLength !=
sizeof(ULONG))
- return STATUS_INVALID_BUFFER_SIZE;
- else if (!IrpContext->Irp->AssociatedIrp.SystemBuffer)
- return STATUS_INVALID_USER_BUFFER;
-
- Flags = (PULONG)IrpContext->Irp->AssociatedIrp.SystemBuffer;
- *Flags = 0;
-
- if (IrpContext->DeviceExt->VolumeFcb->Flags & VCB_IS_DIRTY
- && !(IrpContext->DeviceExt->VolumeFcb->Flags &
VCB_CLEAR_DIRTY))
- {
- *Flags |= VOLUME_IS_DIRTY;
- }
-
- return STATUS_SUCCESS;
+ PULONG Flags;
+
+ DPRINT("VfatIsVolumeDirty(IrpContext %p)\n", IrpContext);
+
+ if (IrpContext->Stack->Parameters.FileSystemControl.OutputBufferLength !=
sizeof(ULONG))
+ return STATUS_INVALID_BUFFER_SIZE;
+ else if (!IrpContext->Irp->AssociatedIrp.SystemBuffer)
+ return STATUS_INVALID_USER_BUFFER;
+
+ Flags = (PULONG)IrpContext->Irp->AssociatedIrp.SystemBuffer;
+ *Flags = 0;
+
+ if ((IrpContext->DeviceExt->VolumeFcb->Flags & VCB_IS_DIRTY) &&
+ !(IrpContext->DeviceExt->VolumeFcb->Flags & VCB_CLEAR_DIRTY))
+ {
+ *Flags |= VOLUME_IS_DIRTY;
+ }
+
+ return STATUS_SUCCESS;
}
-static NTSTATUS
-VfatMarkVolumeDirty(PVFAT_IRP_CONTEXT IrpContext)
+static
+NTSTATUS
+VfatMarkVolumeDirty(
+ PVFAT_IRP_CONTEXT IrpContext)
{
- ULONG eocMark;
- PDEVICE_EXTENSION DeviceExt;
- NTSTATUS Status = STATUS_SUCCESS;
-
- DPRINT("VfatMarkVolumeDirty(IrpContext %p)\n", IrpContext);
- DeviceExt = IrpContext->DeviceExt;
-
- if (!(DeviceExt->VolumeFcb->Flags & VCB_IS_DIRTY))
- {
- Status = GetNextCluster(DeviceExt, 1, &eocMark);
- if (NT_SUCCESS(Status))
- {
- /* unset clean shutdown bit */
- eocMark &= ~DeviceExt->CleanShutBitMask;
- Status = WriteCluster(DeviceExt, 1, eocMark);
- }
- }
-
- DeviceExt->VolumeFcb->Flags &= ~VCB_CLEAR_DIRTY;
-
- return Status;
+ ULONG eocMark;
+ PDEVICE_EXTENSION DeviceExt;
+ NTSTATUS Status = STATUS_SUCCESS;
+
+ DPRINT("VfatMarkVolumeDirty(IrpContext %p)\n", IrpContext);
+ DeviceExt = IrpContext->DeviceExt;
+
+ if (!(DeviceExt->VolumeFcb->Flags & VCB_IS_DIRTY))
+ {
+ Status = GetNextCluster(DeviceExt, 1, &eocMark);
+ if (NT_SUCCESS(Status))
+ {
+ /* unset clean shutdown bit */
+ eocMark &= ~DeviceExt->CleanShutBitMask;
+ Status = WriteCluster(DeviceExt, 1, eocMark);
+ }
+ }
+
+ DeviceExt->VolumeFcb->Flags &= ~VCB_CLEAR_DIRTY;
+
+ return Status;
}
-NTSTATUS VfatFileSystemControl(PVFAT_IRP_CONTEXT IrpContext)
/*
* FUNCTION: File system control
*/
+NTSTATUS
+VfatFileSystemControl(
+ PVFAT_IRP_CONTEXT IrpContext)
{
-
- NTSTATUS Status;
-
- DPRINT("VfatFileSystemControl(IrpContext %p)\n", IrpContext);
-
- ASSERT(IrpContext);
- ASSERT(IrpContext->Irp);
- ASSERT(IrpContext->Stack);
-
- IrpContext->Irp->IoStatus.Information = 0;
-
- switch (IrpContext->MinorFunction)
- {
- case IRP_MN_KERNEL_CALL:
- case IRP_MN_USER_FS_REQUEST:
- switch(IrpContext->Stack->Parameters.DeviceIoControl.IoControlCode)
- {
- case FSCTL_GET_VOLUME_BITMAP:
- Status = VfatGetVolumeBitmap(IrpContext);
- break;
- case FSCTL_GET_RETRIEVAL_POINTERS:
- Status = VfatGetRetrievalPointers(IrpContext);
- break;
- case FSCTL_MOVE_FILE:
- Status = VfatMoveFile(IrpContext);
- break;
- case FSCTL_IS_VOLUME_DIRTY:
- Status = VfatIsVolumeDirty(IrpContext);
- break;
- case FSCTL_MARK_VOLUME_DIRTY:
- Status = VfatMarkVolumeDirty(IrpContext);
- break;
- default:
- Status = STATUS_INVALID_DEVICE_REQUEST;
- }
- break;
-
- case IRP_MN_MOUNT_VOLUME:
- Status = VfatMount(IrpContext);
- break;
-
- case IRP_MN_VERIFY_VOLUME:
- DPRINT("VFATFS: IRP_MN_VERIFY_VOLUME\n");
- Status = VfatVerify(IrpContext);
- break;
-
- default:
- DPRINT("VFAT FSC: MinorFunction %u\n",
IrpContext->MinorFunction);
- Status = STATUS_INVALID_DEVICE_REQUEST;
- break;
- }
-
- IrpContext->Irp->IoStatus.Status = Status;
-
- IoCompleteRequest (IrpContext->Irp, IO_NO_INCREMENT);
- VfatFreeIrpContext(IrpContext);
- return (Status);
+ NTSTATUS Status;
+
+ DPRINT("VfatFileSystemControl(IrpContext %p)\n", IrpContext);
+
+ ASSERT(IrpContext);
+ ASSERT(IrpContext->Irp);
+ ASSERT(IrpContext->Stack);
+
+ IrpContext->Irp->IoStatus.Information = 0;
+
+ switch (IrpContext->MinorFunction)
+ {
+ case IRP_MN_KERNEL_CALL:
+ case IRP_MN_USER_FS_REQUEST:
+ switch(IrpContext->Stack->Parameters.DeviceIoControl.IoControlCode)
+ {
+ case FSCTL_GET_VOLUME_BITMAP:
+ Status = VfatGetVolumeBitmap(IrpContext);
+ break;
+
+ case FSCTL_GET_RETRIEVAL_POINTERS:
+ Status = VfatGetRetrievalPointers(IrpContext);
+ break;
+
+ case FSCTL_MOVE_FILE:
+ Status = VfatMoveFile(IrpContext);
+ break;
+
+ case FSCTL_IS_VOLUME_DIRTY:
+ Status = VfatIsVolumeDirty(IrpContext);
+ break;
+
+ case FSCTL_MARK_VOLUME_DIRTY:
+ Status = VfatMarkVolumeDirty(IrpContext);
+ break;
+
+ default:
+ Status = STATUS_INVALID_DEVICE_REQUEST;
+ }
+ break;
+
+ case IRP_MN_MOUNT_VOLUME:
+ Status = VfatMount(IrpContext);
+ break;
+
+ case IRP_MN_VERIFY_VOLUME:
+ DPRINT("VFATFS: IRP_MN_VERIFY_VOLUME\n");
+ Status = VfatVerify(IrpContext);
+ break;
+
+ default:
+ DPRINT("VFAT FSC: MinorFunction %u\n",
IrpContext->MinorFunction);
+ Status = STATUS_INVALID_DEVICE_REQUEST;
+ break;
+ }
+
+ IrpContext->Irp->IoStatus.Status = Status;
+
+ IoCompleteRequest(IrpContext->Irp, IO_NO_INCREMENT);
+ VfatFreeIrpContext(IrpContext);
+ return Status;
}
Modified: trunk/reactos/drivers/filesystems/fastfat/misc.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfa…
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat/misc.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat/misc.c [iso-8859-1] Thu Dec 12 13:51:50
2013
@@ -159,12 +159,12 @@
{
Status = STATUS_INSUFFICIENT_RESOURCES;
Irp->IoStatus.Status = Status;
- IoCompleteRequest (Irp, IO_NO_INCREMENT);
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
}
else
{
FsRtlEnterFileSystem();
- Status = VfatDispatchRequest (IrpContext);
+ Status = VfatDispatchRequest(IrpContext);
FsRtlExitFileSystem();
}
return Status;
Modified: trunk/reactos/drivers/filesystems/fastfat/vfat.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfa…
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat/vfat.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat/vfat.h [iso-8859-1] Thu Dec 12 13:51:50
2013
@@ -15,94 +15,94 @@
#include <pshpack1.h>
struct _BootSector
{
- unsigned char magic0, res0, magic1;
- unsigned char OEMName[8];
- unsigned short BytesPerSector;
- unsigned char SectorsPerCluster;
- unsigned short ReservedSectors;
- unsigned char FATCount;
- unsigned short RootEntries, Sectors;
- unsigned char Media;
- unsigned short FATSectors, SectorsPerTrack, Heads;
- unsigned long HiddenSectors, SectorsHuge;
- unsigned char Drive, Res1, Sig;
- unsigned long VolumeID;
- unsigned char VolumeLabel[11], SysType[8];
- unsigned char Res2[448];
- unsigned short Signatur1;
+ unsigned char magic0, res0, magic1;
+ unsigned char OEMName[8];
+ unsigned short BytesPerSector;
+ unsigned char SectorsPerCluster;
+ unsigned short ReservedSectors;
+ unsigned char FATCount;
+ unsigned short RootEntries, Sectors;
+ unsigned char Media;
+ unsigned short FATSectors, SectorsPerTrack, Heads;
+ unsigned long HiddenSectors, SectorsHuge;
+ unsigned char Drive, Res1, Sig;
+ unsigned long VolumeID;
+ unsigned char VolumeLabel[11], SysType[8];
+ unsigned char Res2[448];
+ unsigned short Signatur1;
};
struct _BootSector32
{
- unsigned char magic0, res0, magic1; // 0
- unsigned char OEMName[8]; // 3
- unsigned short BytesPerSector; // 11
- unsigned char SectorsPerCluster; // 13
- unsigned short ReservedSectors; // 14
- unsigned char FATCount; // 16
- unsigned short RootEntries, Sectors; // 17
- unsigned char Media; // 21
- unsigned short FATSectors, SectorsPerTrack, Heads; // 22
- unsigned long HiddenSectors, SectorsHuge; // 28
- unsigned long FATSectors32; // 36
- unsigned short ExtFlag; // 40
- unsigned short FSVersion; // 42
- unsigned long RootCluster; // 44
- unsigned short FSInfoSector; // 48
- unsigned short BootBackup; // 50
- unsigned char Res3[12]; // 52
- unsigned char Drive; // 64
- unsigned char Res4; // 65
- unsigned char ExtBootSignature; // 66
- unsigned long VolumeID; // 67
- unsigned char VolumeLabel[11], SysType[8]; // 71
- unsigned char Res2[420]; // 90
- unsigned short Signature1; // 510
+ unsigned char magic0, res0, magic1; // 0
+ unsigned char OEMName[8]; // 3
+ unsigned short BytesPerSector; // 11
+ unsigned char SectorsPerCluster; // 13
+ unsigned short ReservedSectors; // 14
+ unsigned char FATCount; // 16
+ unsigned short RootEntries, Sectors; // 17
+ unsigned char Media; // 21
+ unsigned short FATSectors, SectorsPerTrack, Heads; // 22
+ unsigned long HiddenSectors, SectorsHuge; // 28
+ unsigned long FATSectors32; // 36
+ unsigned short ExtFlag; // 40
+ unsigned short FSVersion; // 42
+ unsigned long RootCluster; // 44
+ unsigned short FSInfoSector; // 48
+ unsigned short BootBackup; // 50
+ unsigned char Res3[12]; // 52
+ unsigned char Drive; // 64
+ unsigned char Res4; // 65
+ unsigned char ExtBootSignature; // 66
+ unsigned long VolumeID; // 67
+ unsigned char VolumeLabel[11], SysType[8]; // 71
+ unsigned char Res2[420]; // 90
+ unsigned short Signature1; // 510
};
struct _BootSectorFatX
{
- unsigned char SysType[4]; // 0
- unsigned long VolumeID; // 4
- unsigned long SectorsPerCluster; // 8
- unsigned short FATCount; // 12
- unsigned long Unknown; // 14
- unsigned char Unused[4078]; // 18
+ unsigned char SysType[4]; // 0
+ unsigned long VolumeID; // 4
+ unsigned long SectorsPerCluster; // 8
+ unsigned short FATCount; // 12
+ unsigned long Unknown; // 14
+ unsigned char Unused[4078]; // 18
};
struct _FsInfoSector
{
- unsigned long ExtBootSignature2; // 0
- unsigned char Res6[480]; // 4
- unsigned long FSINFOSignature; // 484
- unsigned long FreeCluster; // 488
- unsigned long NextCluster; // 492
- unsigned char Res7[12]; // 496
- unsigned long Signatur2; // 508
+ unsigned long ExtBootSignature2; // 0
+ unsigned char Res6[480]; // 4
+ unsigned long FSINFOSignature; // 484
+ unsigned long FreeCluster; // 488
+ unsigned long NextCluster; // 492
+ unsigned char Res7[12]; // 496
+ unsigned long Signatur2; // 508
};
typedef struct _BootSector BootSector;
struct _FATDirEntry
{
- union
- {
- struct { unsigned char Filename[8], Ext[3]; };
- unsigned char ShortName[11];
- };
- unsigned char Attrib;
- unsigned char lCase;
- unsigned char CreationTimeMs;
- unsigned short CreationTime,CreationDate,AccessDate;
- union
- {
- unsigned short FirstClusterHigh; // FAT32
- unsigned short ExtendedAttributes; // FAT12/FAT16
- };
- unsigned short UpdateTime; //time create/update
- unsigned short UpdateDate; //date create/update
- unsigned short FirstCluster;
- unsigned long FileSize;
+ union
+ {
+ struct { unsigned char Filename[8], Ext[3]; };
+ unsigned char ShortName[11];
+ };
+ unsigned char Attrib;
+ unsigned char lCase;
+ unsigned char CreationTimeMs;
+ unsigned short CreationTime,CreationDate,AccessDate;
+ union
+ {
+ unsigned short FirstClusterHigh; // FAT32
+ unsigned short ExtendedAttributes; // FAT12/FAT16
+ };
+ unsigned short UpdateTime; //time create/update
+ unsigned short UpdateDate; //date create/update
+ unsigned short FirstCluster;
+ unsigned long FileSize;
};
#define FAT_EAFILE "EA DATA. SF"
@@ -111,62 +111,62 @@
struct _EAFileHeader
{
- unsigned short Signature; // ED
- unsigned short Unknown[15];
- unsigned short EASetTable[240];
+ unsigned short Signature; // ED
+ unsigned short Unknown[15];
+ unsigned short EASetTable[240];
};
typedef struct _EASetHeader FAT_EA_SET_HEADER, *PFAT_EA_SET_HEADER;
struct _EASetHeader
{
- unsigned short Signature; // EA
- unsigned short Offset; // relative offset, same value as in the EASetTable
- unsigned short Unknown1[2];
- char TargetFileName[12];
- unsigned short Unknown2[3];
- unsigned int EALength;
- // EA Header
+ unsigned short Signature; // EA
+ unsigned short Offset; // relative offset, same value as in the EASetTable
+ unsigned short Unknown1[2];
+ char TargetFileName[12];
+ unsigned short Unknown2[3];
+ unsigned int EALength;
+ // EA Header
};
typedef struct _EAHeader FAT_EA_HEADER, *PFAT_EA_HEADER;
struct _EAHeader
{
- unsigned char Unknown;
- unsigned char EANameLength;
- unsigned short EAValueLength;
- // Name Data
- // Value Data
+ unsigned char Unknown;
+ unsigned char EANameLength;
+ unsigned short EAValueLength;
+ // Name Data
+ // Value Data
};
typedef struct _FATDirEntry FAT_DIR_ENTRY, *PFAT_DIR_ENTRY;
struct _FATXDirEntry
{
- unsigned char FilenameLength; // 0
- unsigned char Attrib; // 1
- unsigned char Filename[42]; // 2
- unsigned long FirstCluster; // 44
- unsigned long FileSize; // 48
- unsigned short UpdateTime; // 52
- unsigned short UpdateDate; // 54
- unsigned short CreationTime; // 56
- unsigned short CreationDate; // 58
- unsigned short AccessTime; // 60
- unsigned short AccessDate; // 62
+ unsigned char FilenameLength; // 0
+ unsigned char Attrib; // 1
+ unsigned char Filename[42]; // 2
+ unsigned long FirstCluster; // 44
+ unsigned long FileSize; // 48
+ unsigned short UpdateTime; // 52
+ unsigned short UpdateDate; // 54
+ unsigned short CreationTime; // 56
+ unsigned short CreationDate; // 58
+ unsigned short AccessTime; // 60
+ unsigned short AccessDate; // 62
};
struct _slot
{
- unsigned char id; // sequence number for slot
- WCHAR name0_4[5]; // first 5 characters in name
- unsigned char attr; // attribute byte
- unsigned char reserved; // always 0
- unsigned char alias_checksum; // checksum for 8.3 alias
- WCHAR name5_10[6]; // 6 more characters in name
- unsigned char start[2]; // starting cluster number
- WCHAR name11_12[2]; // last 2 characters in name
+ unsigned char id; // sequence number for slot
+ WCHAR name0_4[5]; // first 5 characters in name
+ unsigned char attr; // attribute byte
+ unsigned char reserved; // always 0
+ unsigned char alias_checksum; // checksum for 8.3 alias
+ WCHAR name5_10[6]; // 6 more characters in name
+ unsigned char start[2]; // starting cluster number
+ WCHAR name11_12[2]; // last 2 characters in name
};
typedef struct _slot slot;
@@ -199,8 +199,8 @@
union _DIR_ENTRY
{
- FAT_DIR_ENTRY Fat;
- FATX_DIR_ENTRY FatX;
+ FAT_DIR_ENTRY Fat;
+ FATX_DIR_ENTRY FatX;
};
typedef union _DIR_ENTRY DIR_ENTRY, *PDIR_ENTRY;
@@ -221,21 +221,21 @@
typedef struct
{
- ULONG VolumeID;
- ULONG FATStart;
- ULONG FATCount;
- ULONG FATSectors;
- ULONG rootDirectorySectors;
- ULONG rootStart;
- ULONG dataStart;
- ULONG RootCluster;
- ULONG SectorsPerCluster;
- ULONG BytesPerSector;
- ULONG BytesPerCluster;
- ULONG NumberOfClusters;
- ULONG FatType;
- ULONG Sectors;
- BOOLEAN FixedMedia;
+ ULONG VolumeID;
+ ULONG FATStart;
+ ULONG FATCount;
+ ULONG FATSectors;
+ ULONG rootDirectorySectors;
+ ULONG rootStart;
+ ULONG dataStart;
+ ULONG RootCluster;
+ ULONG SectorsPerCluster;
+ ULONG BytesPerSector;
+ ULONG BytesPerCluster;
+ ULONG NumberOfClusters;
+ ULONG FatType;
+ ULONG Sectors;
+ BOOLEAN FixedMedia;
} FATINFO, *PFATINFO;
struct _VFATFCB;
@@ -243,9 +243,9 @@
typedef struct _HASHENTRY
{
- ULONG Hash;
- struct _VFATFCB* self;
- struct _HASHENTRY* next;
+ ULONG Hash;
+ struct _VFATFCB* self;
+ struct _HASHENTRY* next;
}
HASHENTRY;
@@ -261,49 +261,49 @@
typedef struct DEVICE_EXTENSION
{
- ERESOURCE DirResource;
- ERESOURCE FatResource;
-
- KSPIN_LOCK FcbListLock;
- LIST_ENTRY FcbListHead;
- ULONG HashTableSize;
- struct _HASHENTRY** FcbHashTable;
-
- PDEVICE_OBJECT StorageDevice;
- PFILE_OBJECT FATFileObject;
- FATINFO FatInfo;
- ULONG LastAvailableCluster;
- ULONG AvailableClusters;
- BOOLEAN AvailableClustersValid;
- ULONG Flags;
- struct _VFATFCB * VolumeFcb;
-
- /* Pointers to functions for manipulating FAT. */
- PGET_NEXT_CLUSTER GetNextCluster;
- PFIND_AND_MARK_AVAILABLE_CLUSTER FindAndMarkAvailableCluster;
- PWRITE_CLUSTER WriteCluster;
- ULONG CleanShutBitMask;
-
- /* Pointers to functions for manipulating directory entries. */
- PGET_NEXT_DIR_ENTRY GetNextDirEntry;
-
- ULONG BaseDateYear;
-
- LIST_ENTRY VolumeListEntry;
+ ERESOURCE DirResource;
+ ERESOURCE FatResource;
+
+ KSPIN_LOCK FcbListLock;
+ LIST_ENTRY FcbListHead;
+ ULONG HashTableSize;
+ struct _HASHENTRY **FcbHashTable;
+
+ PDEVICE_OBJECT StorageDevice;
+ PFILE_OBJECT FATFileObject;
+ FATINFO FatInfo;
+ ULONG LastAvailableCluster;
+ ULONG AvailableClusters;
+ BOOLEAN AvailableClustersValid;
+ ULONG Flags;
+ struct _VFATFCB *VolumeFcb;
+
+ /* Pointers to functions for manipulating FAT. */
+ PGET_NEXT_CLUSTER GetNextCluster;
+ PFIND_AND_MARK_AVAILABLE_CLUSTER FindAndMarkAvailableCluster;
+ PWRITE_CLUSTER WriteCluster;
+ ULONG CleanShutBitMask;
+
+ /* Pointers to functions for manipulating directory entries. */
+ PGET_NEXT_DIR_ENTRY GetNextDirEntry;
+
+ ULONG BaseDateYear;
+
+ LIST_ENTRY VolumeListEntry;
} DEVICE_EXTENSION, VCB, *PVCB;
typedef struct
{
- PDRIVER_OBJECT DriverObject;
- PDEVICE_OBJECT DeviceObject;
- ULONG Flags;
- ERESOURCE VolumeListLock;
- LIST_ENTRY VolumeListHead;
- NPAGED_LOOKASIDE_LIST FcbLookasideList;
- NPAGED_LOOKASIDE_LIST CcbLookasideList;
- NPAGED_LOOKASIDE_LIST IrpContextLookasideList;
- FAST_IO_DISPATCH FastIoDispatch;
- CACHE_MANAGER_CALLBACKS CacheMgrCallbacks;
+ PDRIVER_OBJECT DriverObject;
+ PDEVICE_OBJECT DeviceObject;
+ ULONG Flags;
+ ERESOURCE VolumeListLock;
+ LIST_ENTRY VolumeListHead;
+ NPAGED_LOOKASIDE_LIST FcbLookasideList;
+ NPAGED_LOOKASIDE_LIST CcbLookasideList;
+ NPAGED_LOOKASIDE_LIST IrpContextLookasideList;
+ FAST_IO_DISPATCH FastIoDispatch;
+ CACHE_MANAGER_CALLBACKS CacheMgrCallbacks;
} VFAT_GLOBAL_DATA, *PVFAT_GLOBAL_DATA;
extern PVFAT_GLOBAL_DATA VfatGlobalData;
@@ -318,90 +318,90 @@
typedef struct _VFATFCB
{
- /* FCB header required by ROS/NT */
- FSRTL_COMMON_FCB_HEADER RFCB;
- SECTION_OBJECT_POINTERS SectionObjectPointers;
- ERESOURCE MainResource;
- ERESOURCE PagingIoResource;
- /* end FCB header required by ROS/NT */
-
- /* directory entry for this file or directory */
- DIR_ENTRY entry;
-
- /* Pointer to attributes in entry */
- PUCHAR Attributes;
-
- /* long file name, points into PathNameBuffer */
- UNICODE_STRING LongNameU;
-
- /* short file name */
- UNICODE_STRING ShortNameU;
-
- /* directory name, points into PathNameBuffer */
- UNICODE_STRING DirNameU;
-
- /* path + long file name 260 max*/
- UNICODE_STRING PathNameU;
-
- /* buffer for PathNameU */
- PWCHAR PathNameBuffer;
-
- /* buffer for ShortNameU */
- WCHAR ShortNameBuffer[13];
-
- /* */
- LONG RefCount;
-
- /* List of FCB's for this volume */
- LIST_ENTRY FcbListEntry;
-
- /* pointer to the parent fcb */
- struct _VFATFCB* parentFcb;
-
- /* Flags for the fcb */
- ULONG Flags;
-
- /* pointer to the file object which has initialized the fcb */
- PFILE_OBJECT FileObject;
-
- /* Directory index for the short name entry */
- ULONG dirIndex;
-
- /* Directory index where the long name starts */
- ULONG startIndex;
-
- /* Share access for the file object */
- SHARE_ACCESS FCBShareAccess;
-
- /* Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP */
- ULONG OpenHandleCount;
-
- /* Entry into the hash table for the path + long name */
- HASHENTRY Hash;
-
- /* Entry into the hash table for the path + short name */
- HASHENTRY ShortHash;
-
- /* List of byte-range locks for this file */
- FILE_LOCK FileLock;
-
- /*
- * Optimalization: caching of last read/write cluster+offset pair. Can't
- * be in VFATCCB because it must be reset everytime the allocated clusters
- * change.
- */
- FAST_MUTEX LastMutex;
- ULONG LastCluster;
- ULONG LastOffset;
+ /* FCB header required by ROS/NT */
+ FSRTL_COMMON_FCB_HEADER RFCB;
+ SECTION_OBJECT_POINTERS SectionObjectPointers;
+ ERESOURCE MainResource;
+ ERESOURCE PagingIoResource;
+ /* end FCB header required by ROS/NT */
+
+ /* directory entry for this file or directory */
+ DIR_ENTRY entry;
+
+ /* Pointer to attributes in entry */
+ PUCHAR Attributes;
+
+ /* long file name, points into PathNameBuffer */
+ UNICODE_STRING LongNameU;
+
+ /* short file name */
+ UNICODE_STRING ShortNameU;
+
+ /* directory name, points into PathNameBuffer */
+ UNICODE_STRING DirNameU;
+
+ /* path + long file name 260 max*/
+ UNICODE_STRING PathNameU;
+
+ /* buffer for PathNameU */
+ PWCHAR PathNameBuffer;
+
+ /* buffer for ShortNameU */
+ WCHAR ShortNameBuffer[13];
+
+ /* */
+ LONG RefCount;
+
+ /* List of FCB's for this volume */
+ LIST_ENTRY FcbListEntry;
+
+ /* pointer to the parent fcb */
+ struct _VFATFCB *parentFcb;
+
+ /* Flags for the fcb */
+ ULONG Flags;
+
+ /* pointer to the file object which has initialized the fcb */
+ PFILE_OBJECT FileObject;
+
+ /* Directory index for the short name entry */
+ ULONG dirIndex;
+
+ /* Directory index where the long name starts */
+ ULONG startIndex;
+
+ /* Share access for the file object */
+ SHARE_ACCESS FCBShareAccess;
+
+ /* Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP */
+ ULONG OpenHandleCount;
+
+ /* Entry into the hash table for the path + long name */
+ HASHENTRY Hash;
+
+ /* Entry into the hash table for the path + short name */
+ HASHENTRY ShortHash;
+
+ /* List of byte-range locks for this file */
+ FILE_LOCK FileLock;
+
+ /*
+ * Optimalization: caching of last read/write cluster+offset pair. Can't
+ * be in VFATCCB because it must be reset everytime the allocated clusters
+ * change.
+ */
+ FAST_MUTEX LastMutex;
+ ULONG LastCluster;
+ ULONG LastOffset;
} VFATFCB, *PVFATFCB;
typedef struct _VFATCCB
{
- LARGE_INTEGER CurrentByteOffset;
- /* for DirectoryControl */
- ULONG Entry;
- /* for DirectoryControl */
- UNICODE_STRING SearchPattern;
+ LARGE_INTEGER CurrentByteOffset;
+ /* for DirectoryControl */
+ ULONG Entry;
+ /* for DirectoryControl */
+ UNICODE_STRING SearchPattern;
} VFATCCB, *PVFATCCB;
#define TAG_CCB 'BCCV'
@@ -413,17 +413,17 @@
typedef struct __DOSTIME
{
- USHORT Second:5;
- USHORT Minute:6;
- USHORT Hour:5;
+ USHORT Second:5;
+ USHORT Minute:6;
+ USHORT Hour:5;
}
DOSTIME, *PDOSTIME;
typedef struct __DOSDATE
{
- USHORT Day:5;
- USHORT Month:4;
- USHORT Year:7;
+ USHORT Day:5;
+ USHORT Month:4;
+ USHORT Year:7;
}
DOSDATE, *PDOSDATE;
@@ -432,352 +432,522 @@
typedef struct
{
- PIRP Irp;
- PDEVICE_OBJECT DeviceObject;
- PDEVICE_EXTENSION DeviceExt;
- ULONG Flags;
- WORK_QUEUE_ITEM WorkQueueItem;
- PIO_STACK_LOCATION Stack;
- UCHAR MajorFunction;
- UCHAR MinorFunction;
- PFILE_OBJECT FileObject;
- ULONG RefCount;
- KEVENT Event;
+ PIRP Irp;
+ PDEVICE_OBJECT DeviceObject;
+ PDEVICE_EXTENSION DeviceExt;
+ ULONG Flags;
+ WORK_QUEUE_ITEM WorkQueueItem;
+ PIO_STACK_LOCATION Stack;
+ UCHAR MajorFunction;
+ UCHAR MinorFunction;
+ PFILE_OBJECT FileObject;
+ ULONG RefCount;
+ KEVENT Event;
} VFAT_IRP_CONTEXT, *PVFAT_IRP_CONTEXT;
typedef struct _VFAT_DIRENTRY_CONTEXT
{
- ULONG StartIndex;
- ULONG DirIndex;
- DIR_ENTRY DirEntry;
- UNICODE_STRING LongNameU;
- UNICODE_STRING ShortNameU;
+ ULONG StartIndex;
+ ULONG DirIndex;
+ DIR_ENTRY DirEntry;
+ UNICODE_STRING LongNameU;
+ UNICODE_STRING ShortNameU;
} VFAT_DIRENTRY_CONTEXT, *PVFAT_DIRENTRY_CONTEXT;
-/* ------------------------------------------------------ shutdown.c */
-
-DRIVER_DISPATCH VfatShutdown;
-NTSTATUS NTAPI VfatShutdown (PDEVICE_OBJECT DeviceObject,
- PIRP Irp);
-
-/* -------------------------------------------------------- volume.c */
-
-NTSTATUS VfatQueryVolumeInformation (PVFAT_IRP_CONTEXT IrpContext);
-
-NTSTATUS VfatSetVolumeInformation (PVFAT_IRP_CONTEXT IrpContext);
-
-/* ------------------------------------------------------ blockdev.c */
-
-NTSTATUS VfatReadDisk(IN PDEVICE_OBJECT pDeviceObject,
- IN PLARGE_INTEGER ReadOffset,
- IN ULONG ReadLength,
- IN PUCHAR Buffer,
- IN BOOLEAN Override);
-
-NTSTATUS VfatReadDiskPartial (IN PVFAT_IRP_CONTEXT IrpContext,
- IN PLARGE_INTEGER ReadOffset,
- IN ULONG ReadLength,
- IN ULONG BufferOffset,
- IN BOOLEAN Wait);
-
-NTSTATUS VfatWriteDiskPartial(IN PVFAT_IRP_CONTEXT IrpContext,
- IN PLARGE_INTEGER WriteOffset,
- IN ULONG WriteLength,
- IN ULONG BufferOffset,
- IN BOOLEAN Wait);
-
-NTSTATUS VfatBlockDeviceIoControl (IN PDEVICE_OBJECT DeviceObject,
- IN ULONG CtlCode,
- IN PVOID InputBuffer,
- IN ULONG InputBufferSize,
- IN OUT PVOID OutputBuffer,
- IN OUT PULONG pOutputBufferSize,
- IN BOOLEAN Override);
-
-/* ----------------------------------------------------------- dir.c */
-
-NTSTATUS VfatDirectoryControl (PVFAT_IRP_CONTEXT);
-
-BOOLEAN FsdDosDateTimeToSystemTime (PDEVICE_EXTENSION DeviceExt,
- USHORT DosDate,
- USHORT DosTime,
- PLARGE_INTEGER SystemTime);
-
-BOOLEAN FsdSystemTimeToDosDateTime (PDEVICE_EXTENSION DeviceExt,
- PLARGE_INTEGER SystemTime,
- USHORT *pDosDate,
- USHORT *pDosTime);
-
-/* -------------------------------------------------------- create.c */
-
-NTSTATUS VfatCreate (PVFAT_IRP_CONTEXT IrpContext);
-
-NTSTATUS FindFile (PDEVICE_EXTENSION DeviceExt,
- PVFATFCB Parent,
- PUNICODE_STRING FileToFindU,
- PVFAT_DIRENTRY_CONTEXT DirContext,
- BOOLEAN First);
-
-VOID vfat8Dot3ToString (PFAT_DIR_ENTRY pEntry,
- PUNICODE_STRING NameU);
-
-NTSTATUS ReadVolumeLabel(PDEVICE_EXTENSION DeviceExt,
- PVPB Vpb);
-
-/* --------------------------------------------------------- close.c */
-
-NTSTATUS VfatClose (PVFAT_IRP_CONTEXT IrpContext);
-
-NTSTATUS VfatCloseFile(PDEVICE_EXTENSION DeviceExt,
- PFILE_OBJECT FileObject);
-
-/* ------------------------------------------------------- cleanup.c */
-
-NTSTATUS VfatCleanup (PVFAT_IRP_CONTEXT IrpContext);
-
-/* --------------------------------------------------------- fastio.c */
-
-VOID
-VfatInitFastIoRoutines(PFAST_IO_DISPATCH FastIoDispatch);
-
-BOOLEAN NTAPI
-VfatAcquireForLazyWrite(IN PVOID Context,
- IN BOOLEAN Wait);
-
-VOID NTAPI
-VfatReleaseFromLazyWrite(IN PVOID Context);
-
-BOOLEAN NTAPI
-VfatAcquireForReadAhead(IN PVOID Context,
- IN BOOLEAN Wait);
-
-VOID NTAPI
-VfatReleaseFromReadAhead(IN PVOID Context);
-
-/* --------------------------------------------------------- fsctl.c */
-
-NTSTATUS VfatFileSystemControl (PVFAT_IRP_CONTEXT IrpContext);
-
-/* --------------------------------------------------------- finfo.c */
-
-NTSTATUS VfatQueryInformation (PVFAT_IRP_CONTEXT IrpContext);
-
-NTSTATUS VfatSetInformation (PVFAT_IRP_CONTEXT IrpContext);
-
-NTSTATUS
-VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject,
- PVFATFCB Fcb,
- PDEVICE_EXTENSION DeviceExt,
- PLARGE_INTEGER AllocationSize);
-
-/* --------------------------------------------------------- iface.c */
-
-NTSTATUS NTAPI DriverEntry (PDRIVER_OBJECT DriverObject,
- PUNICODE_STRING RegistryPath);
-
-/* --------------------------------------------------------- dirwr.c */
-
-NTSTATUS VfatAddEntry (PDEVICE_EXTENSION DeviceExt,
- PUNICODE_STRING PathNameU,
- PVFATFCB* Fcb,
- PVFATFCB ParentFcb,
- ULONG RequestedOptions,
- UCHAR ReqAttr);
-
-NTSTATUS VfatUpdateEntry (PVFATFCB pFcb);
-
-NTSTATUS VfatDelEntry(PDEVICE_EXTENSION, PVFATFCB);
+/* blockdev.c */
+
+NTSTATUS
+VfatReadDisk(
+ IN PDEVICE_OBJECT pDeviceObject,
+ IN PLARGE_INTEGER ReadOffset,
+ IN ULONG ReadLength,
+ IN PUCHAR Buffer,
+ IN BOOLEAN Override);
+
+NTSTATUS
+VfatReadDiskPartial(
+ IN PVFAT_IRP_CONTEXT IrpContext,
+ IN PLARGE_INTEGER ReadOffset,
+ IN ULONG ReadLength,
+ IN ULONG BufferOffset,
+ IN BOOLEAN Wait);
+
+NTSTATUS
+VfatWriteDiskPartial(
+ IN PVFAT_IRP_CONTEXT IrpContext,
+ IN PLARGE_INTEGER WriteOffset,
+ IN ULONG WriteLength,
+ IN ULONG BufferOffset,
+ IN BOOLEAN Wait);
+
+NTSTATUS
+VfatBlockDeviceIoControl(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN ULONG CtlCode,
+ IN PVOID InputBuffer,
+ IN ULONG InputBufferSize,
+ IN OUT PVOID OutputBuffer,
+ IN OUT PULONG pOutputBufferSize,
+ IN BOOLEAN Override);
+
+/* cleanup.c */
+
+NTSTATUS
+VfatCleanup(
+ PVFAT_IRP_CONTEXT IrpContext);
+
+/* close.c */
+
+NTSTATUS
+VfatClose(
+ PVFAT_IRP_CONTEXT IrpContext);
+
+NTSTATUS
+VfatCloseFile(
+ PDEVICE_EXTENSION DeviceExt,
+ PFILE_OBJECT FileObject);
+
+/* create.c */
+
+NTSTATUS
+VfatCreate(
+ PVFAT_IRP_CONTEXT IrpContext);
+
+NTSTATUS
+FindFile(
+ PDEVICE_EXTENSION DeviceExt,
+ PVFATFCB Parent,
+ PUNICODE_STRING FileToFindU,
+ PVFAT_DIRENTRY_CONTEXT DirContext,
+ BOOLEAN First);
+
+VOID
+vfat8Dot3ToString(
+ PFAT_DIR_ENTRY pEntry,
+ PUNICODE_STRING NameU);
+
+NTSTATUS
+ReadVolumeLabel(
+ PDEVICE_EXTENSION DeviceExt,
+ PVPB Vpb);
+
+/* dir.c */
+
+NTSTATUS
+VfatDirectoryControl(
+ PVFAT_IRP_CONTEXT IrpContext);
BOOLEAN
-vfatFindDirSpace(PDEVICE_EXTENSION DeviceExt,
- PVFATFCB pDirFcb,
- ULONG nbSlots,
- PULONG start);
-
-/* -------------------------------------------------------- string.c */
-
-VOID
-vfatSplitPathName(PUNICODE_STRING PathNameU,
- PUNICODE_STRING DirNameU,
- PUNICODE_STRING FileNameU);
-
-BOOLEAN vfatIsLongIllegal(WCHAR c);
-
-BOOLEAN wstrcmpjoki (PWSTR s1,
- PWSTR s2);
-
-/* ----------------------------------------------------------- fat.c */
-
-NTSTATUS FAT12GetNextCluster(PDEVICE_EXTENSION DeviceExt,
- ULONG CurrentCluster,
- PULONG NextCluster);
-
-NTSTATUS FAT12FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt,
- PULONG Cluster);
-
-NTSTATUS FAT12WriteCluster(PDEVICE_EXTENSION DeviceExt,
- ULONG ClusterToWrite,
- ULONG NewValue,
- PULONG OldValue);
-
-NTSTATUS FAT16GetNextCluster(PDEVICE_EXTENSION DeviceExt,
- ULONG CurrentCluster,
- PULONG NextCluster);
-
-NTSTATUS FAT16FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt,
- PULONG Cluster);
-
-NTSTATUS FAT16WriteCluster(PDEVICE_EXTENSION DeviceExt,
- ULONG ClusterToWrite,
- ULONG NewValue,
- PULONG OldValue);
-
-NTSTATUS FAT32GetNextCluster(PDEVICE_EXTENSION DeviceExt,
- ULONG CurrentCluster,
- PULONG NextCluster);
-
-NTSTATUS FAT32FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt,
- PULONG Cluster);
-
-NTSTATUS FAT32WriteCluster(PDEVICE_EXTENSION DeviceExt,
- ULONG ClusterToWrite,
- ULONG NewValue,
- PULONG OldValue);
-
-NTSTATUS OffsetToCluster (PDEVICE_EXTENSION DeviceExt,
- ULONG FirstCluster,
- ULONG FileOffset,
- PULONG Cluster,
- BOOLEAN Extend);
-
-ULONGLONG ClusterToSector (PDEVICE_EXTENSION DeviceExt,
- ULONG Cluster);
-
-NTSTATUS GetNextCluster (PDEVICE_EXTENSION DeviceExt,
- ULONG CurrentCluster,
- PULONG NextCluster);
-
-NTSTATUS GetNextClusterExtend (PDEVICE_EXTENSION DeviceExt,
- ULONG CurrentCluster,
- PULONG NextCluster);
-
-NTSTATUS CountAvailableClusters (PDEVICE_EXTENSION DeviceExt,
- PLARGE_INTEGER Clusters);
-
-NTSTATUS
-WriteCluster(PDEVICE_EXTENSION DeviceExt,
- ULONG ClusterToWrite,
- ULONG NewValue);
-
-/* ------------------------------------------------------ direntry.c */
-
-ULONG vfatDirEntryGetFirstCluster (PDEVICE_EXTENSION pDeviceExt,
- PDIR_ENTRY pDirEntry);
-
-BOOLEAN VfatIsDirectoryEmpty(PVFATFCB Fcb);
-
-NTSTATUS FATGetNextDirEntry(PVOID * pContext,
- PVOID * pPage,
- IN PVFATFCB pDirFcb,
- IN PVFAT_DIRENTRY_CONTEXT DirContext,
- BOOLEAN First);
-
-NTSTATUS FATXGetNextDirEntry(PVOID * pContext,
- PVOID * pPage,
- IN PVFATFCB pDirFcb,
- IN PVFAT_DIRENTRY_CONTEXT DirContext,
- BOOLEAN First);
-
-/* ----------------------------------------------------------- fcb.c */
-
-PVFATFCB vfatNewFCB (PDEVICE_EXTENSION pVCB,
- PUNICODE_STRING pFileNameU);
-
-VOID vfatDestroyFCB (PVFATFCB pFCB);
-
-VOID vfatDestroyCCB(PVFATCCB pCcb);
-
-VOID vfatGrabFCB (PDEVICE_EXTENSION pVCB,
- PVFATFCB pFCB);
-
-VOID vfatReleaseFCB (PDEVICE_EXTENSION pVCB,
- PVFATFCB pFCB);
-
-VOID vfatAddFCBToTable (PDEVICE_EXTENSION pVCB,
- PVFATFCB pFCB);
-
-PVFATFCB vfatGrabFCBFromTable (PDEVICE_EXTENSION pDeviceExt,
- PUNICODE_STRING pFileNameU);
-
-PVFATFCB vfatMakeRootFCB (PDEVICE_EXTENSION pVCB);
-
-PVFATFCB vfatOpenRootFCB (PDEVICE_EXTENSION pVCB);
-
-BOOLEAN vfatFCBIsDirectory (PVFATFCB FCB);
-
-BOOLEAN vfatFCBIsRoot(PVFATFCB FCB);
-
-NTSTATUS vfatAttachFCBToFileObject (PDEVICE_EXTENSION vcb,
- PVFATFCB fcb,
- PFILE_OBJECT fileObject);
-
-NTSTATUS vfatDirFindFile (PDEVICE_EXTENSION pVCB,
- PVFATFCB parentFCB,
- PUNICODE_STRING FileToFindU,
- PVFATFCB * fileFCB);
-
-NTSTATUS vfatGetFCBForFile (PDEVICE_EXTENSION pVCB,
- PVFATFCB *pParentFCB,
- PVFATFCB *pFCB,
- PUNICODE_STRING pFileNameU);
-
-NTSTATUS vfatMakeFCBFromDirEntry (PVCB vcb,
- PVFATFCB directoryFCB,
- PVFAT_DIRENTRY_CONTEXT DirContext,
- PVFATFCB * fileFCB);
-
-/* ------------------------------------------------------------ rw.c */
-
-NTSTATUS VfatRead (PVFAT_IRP_CONTEXT IrpContext);
-
-NTSTATUS VfatWrite (PVFAT_IRP_CONTEXT IrpContext);
-
-NTSTATUS NextCluster(PDEVICE_EXTENSION DeviceExt,
- ULONG FirstCluster,
- PULONG CurrentCluster,
- BOOLEAN Extend);
-
-/* ----------------------------------------------------------- misc.c */
-
-NTSTATUS VfatQueueRequest(PVFAT_IRP_CONTEXT IrpContext);
-
-PVFAT_IRP_CONTEXT VfatAllocateIrpContext(PDEVICE_OBJECT DeviceObject,
- PIRP Irp);
-
-VOID VfatFreeIrpContext(PVFAT_IRP_CONTEXT IrpContext);
-
-DRIVER_DISPATCH VfatBuildRequest;
-NTSTATUS NTAPI VfatBuildRequest (PDEVICE_OBJECT DeviceObject,
- PIRP Irp);
-
-PVOID VfatGetUserBuffer(IN PIRP);
-
-NTSTATUS VfatLockUserBuffer(IN PIRP, IN ULONG,
- IN LOCK_OPERATION);
-
-NTSTATUS
-VfatSetExtendedAttributes(PFILE_OBJECT FileObject,
- PVOID Ea,
- ULONG EaLength);
-/* ------------------------------------------------------------- flush.c */
-
-NTSTATUS VfatFlush(PVFAT_IRP_CONTEXT IrpContext);
-
-NTSTATUS VfatFlushVolume(PDEVICE_EXTENSION DeviceExt, PVFATFCB VolumeFcb);
-
-/* --------------------------------------------------------------- pnp.c */
-
-NTSTATUS VfatPnp(PVFAT_IRP_CONTEXT IrpContext);
+FsdDosDateTimeToSystemTime(
+ PDEVICE_EXTENSION DeviceExt,
+ USHORT DosDate,
+ USHORT DosTime,
+ PLARGE_INTEGER SystemTime);
+
+BOOLEAN
+FsdSystemTimeToDosDateTime(
+ PDEVICE_EXTENSION DeviceExt,
+ PLARGE_INTEGER SystemTime,
+ USHORT *pDosDate,
+ USHORT *pDosTime);
+
+/* direntry.c */
+
+ULONG
+vfatDirEntryGetFirstCluster(
+ PDEVICE_EXTENSION pDeviceExt,
+ PDIR_ENTRY pDirEntry);
+
+BOOLEAN
+VfatIsDirectoryEmpty(
+ PVFATFCB Fcb);
+
+NTSTATUS
+FATGetNextDirEntry(
+ PVOID *pContext,
+ PVOID *pPage,
+ IN PVFATFCB pDirFcb,
+ IN PVFAT_DIRENTRY_CONTEXT DirContext,
+ BOOLEAN First);
+
+NTSTATUS
+FATXGetNextDirEntry(
+ PVOID *pContext,
+ PVOID *pPage,
+ IN PVFATFCB pDirFcb,
+ IN PVFAT_DIRENTRY_CONTEXT DirContext,
+ BOOLEAN First);
+
+/* dirwr.c */
+
+NTSTATUS
+VfatAddEntry(
+ PDEVICE_EXTENSION DeviceExt,
+ PUNICODE_STRING PathNameU,
+ PVFATFCB* Fcb,
+ PVFATFCB ParentFcb,
+ ULONG RequestedOptions,
+ UCHAR ReqAttr);
+
+NTSTATUS
+VfatUpdateEntry(
+ PVFATFCB pFcb);
+
+NTSTATUS
+VfatDelEntry(
+ PDEVICE_EXTENSION,
+ PVFATFCB);
+
+BOOLEAN
+vfatFindDirSpace(
+ PDEVICE_EXTENSION DeviceExt,
+ PVFATFCB pDirFcb,
+ ULONG nbSlots,
+ PULONG start);
+
+/* ea.h */
+
+NTSTATUS
+VfatSetExtendedAttributes(
+ PFILE_OBJECT FileObject,
+ PVOID Ea,
+ ULONG EaLength);
+
+/* fastio.c */
+
+VOID
+VfatInitFastIoRoutines(
+ PFAST_IO_DISPATCH FastIoDispatch);
+
+BOOLEAN
+NTAPI
+VfatAcquireForLazyWrite(
+ IN PVOID Context,
+ IN BOOLEAN Wait);
+
+VOID
+NTAPI
+VfatReleaseFromLazyWrite(
+ IN PVOID Context);
+
+BOOLEAN
+NTAPI
+VfatAcquireForReadAhead(
+ IN PVOID Context,
+ IN BOOLEAN Wait);
+
+VOID
+NTAPI
+VfatReleaseFromReadAhead(
+ IN PVOID Context);
+
+/* fat.c */
+
+NTSTATUS
+FAT12GetNextCluster(
+ PDEVICE_EXTENSION DeviceExt,
+ ULONG CurrentCluster,
+ PULONG NextCluster);
+
+NTSTATUS
+FAT12FindAndMarkAvailableCluster(
+ PDEVICE_EXTENSION DeviceExt,
+ PULONG Cluster);
+
+NTSTATUS
+FAT12WriteCluster(
+ PDEVICE_EXTENSION DeviceExt,
+ ULONG ClusterToWrite,
+ ULONG NewValue,
+ PULONG OldValue);
+
+NTSTATUS
+FAT16GetNextCluster(
+ PDEVICE_EXTENSION DeviceExt,
+ ULONG CurrentCluster,
+ PULONG NextCluster);
+
+NTSTATUS
+FAT16FindAndMarkAvailableCluster(
+ PDEVICE_EXTENSION DeviceExt,
+ PULONG Cluster);
+
+NTSTATUS
+FAT16WriteCluster(
+ PDEVICE_EXTENSION DeviceExt,
+ ULONG ClusterToWrite,
+ ULONG NewValue,
+ PULONG OldValue);
+
+NTSTATUS
+FAT32GetNextCluster(
+ PDEVICE_EXTENSION DeviceExt,
+ ULONG CurrentCluster,
+ PULONG NextCluster);
+
+NTSTATUS
+FAT32FindAndMarkAvailableCluster(
+ PDEVICE_EXTENSION DeviceExt,
+ PULONG Cluster);
+
+NTSTATUS
+FAT32WriteCluster(
+ PDEVICE_EXTENSION DeviceExt,
+ ULONG ClusterToWrite,
+ ULONG NewValue,
+ PULONG OldValue);
+
+NTSTATUS
+OffsetToCluster(
+ PDEVICE_EXTENSION DeviceExt,
+ ULONG FirstCluster,
+ ULONG FileOffset,
+ PULONG Cluster,
+ BOOLEAN Extend);
+
+ULONGLONG
+ClusterToSector(
+ PDEVICE_EXTENSION DeviceExt,
+ ULONG Cluster);
+
+NTSTATUS
+GetNextCluster(
+ PDEVICE_EXTENSION DeviceExt,
+ ULONG CurrentCluster,
+ PULONG NextCluster);
+
+NTSTATUS
+GetNextClusterExtend(
+ PDEVICE_EXTENSION DeviceExt,
+ ULONG CurrentCluster,
+ PULONG NextCluster);
+
+NTSTATUS
+CountAvailableClusters(
+ PDEVICE_EXTENSION DeviceExt,
+ PLARGE_INTEGER Clusters);
+
+NTSTATUS
+WriteCluster(
+ PDEVICE_EXTENSION DeviceExt,
+ ULONG ClusterToWrite,
+ ULONG NewValue);
+
+/* fcb.c */
+
+PVFATFCB
+vfatNewFCB(
+ PDEVICE_EXTENSION pVCB,
+ PUNICODE_STRING pFileNameU);
+
+VOID
+vfatDestroyFCB(
+ PVFATFCB pFCB);
+
+VOID
+vfatDestroyCCB(
+ PVFATCCB pCcb);
+
+VOID
+vfatGrabFCB(
+ PDEVICE_EXTENSION pVCB,
+ PVFATFCB pFCB);
+
+VOID
+vfatReleaseFCB(
+ PDEVICE_EXTENSION pVCB,
+ PVFATFCB pFCB);
+
+VOID
+vfatAddFCBToTable(
+ PDEVICE_EXTENSION pVCB,
+ PVFATFCB pFCB);
+
+PVFATFCB
+vfatGrabFCBFromTable(
+ PDEVICE_EXTENSION pDeviceExt,
+ PUNICODE_STRING pFileNameU);
+
+PVFATFCB
+vfatMakeRootFCB(
+ PDEVICE_EXTENSION pVCB);
+
+PVFATFCB
+vfatOpenRootFCB(
+ PDEVICE_EXTENSION pVCB);
+
+BOOLEAN
+vfatFCBIsDirectory(
+ PVFATFCB FCB);
+
+BOOLEAN
+vfatFCBIsRoot(
+ PVFATFCB FCB);
+
+NTSTATUS
+vfatAttachFCBToFileObject(
+ PDEVICE_EXTENSION vcb,
+ PVFATFCB fcb,
+ PFILE_OBJECT fileObject);
+
+NTSTATUS
+vfatDirFindFile(
+ PDEVICE_EXTENSION pVCB,
+ PVFATFCB parentFCB,
+ PUNICODE_STRING FileToFindU,
+ PVFATFCB *fileFCB);
+
+NTSTATUS
+vfatGetFCBForFile(
+ PDEVICE_EXTENSION pVCB,
+ PVFATFCB *pParentFCB,
+ PVFATFCB *pFCB,
+ PUNICODE_STRING pFileNameU);
+
+NTSTATUS
+vfatMakeFCBFromDirEntry(
+ PVCB vcb,
+ PVFATFCB directoryFCB,
+ PVFAT_DIRENTRY_CONTEXT DirContext,
+ PVFATFCB *fileFCB);
+
+/* finfo.c */
+
+NTSTATUS
+VfatQueryInformation(
+ PVFAT_IRP_CONTEXT IrpContext);
+
+NTSTATUS
+VfatSetInformation(
+ PVFAT_IRP_CONTEXT IrpContext);
+
+NTSTATUS
+VfatSetAllocationSizeInformation(
+ PFILE_OBJECT FileObject,
+ PVFATFCB Fcb,
+ PDEVICE_EXTENSION DeviceExt,
+ PLARGE_INTEGER AllocationSize);
+
+/* flush.c */
+
+NTSTATUS
+VfatFlush(
+ PVFAT_IRP_CONTEXT IrpContext);
+
+NTSTATUS
+VfatFlushVolume(
+ PDEVICE_EXTENSION DeviceExt,
+ PVFATFCB VolumeFcb);
+
+/* fsctl.c */
+
+NTSTATUS
+VfatFileSystemControl(
+ PVFAT_IRP_CONTEXT IrpContext);
+
+/* iface.c */
+
+NTSTATUS
+NTAPI
+DriverEntry(
+ PDRIVER_OBJECT DriverObject,
+ PUNICODE_STRING RegistryPath);
+
+
+/* misc.c */
+
+NTSTATUS
+VfatQueueRequest(
+ PVFAT_IRP_CONTEXT IrpContext);
+
+PVFAT_IRP_CONTEXT
+VfatAllocateIrpContext(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp);
+
+VOID
+VfatFreeIrpContext(
+ PVFAT_IRP_CONTEXT IrpContext);
+
+DRIVER_DISPATCH
+VfatBuildRequest;
+
+NTSTATUS
+NTAPI
+VfatBuildRequest(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp);
+
+PVOID
+VfatGetUserBuffer(
+ IN PIRP);
+
+NTSTATUS
+VfatLockUserBuffer(
+ IN PIRP,
+ IN ULONG,
+ IN LOCK_OPERATION);
+
+/* pnp.c */
+
+NTSTATUS
+VfatPnp(
+ PVFAT_IRP_CONTEXT IrpContext);
+
+/* rw.c */
+
+NTSTATUS
+VfatRead(
+ PVFAT_IRP_CONTEXT IrpContext);
+
+NTSTATUS
+VfatWrite(
+ PVFAT_IRP_CONTEXT IrpContext);
+
+NTSTATUS
+NextCluster(
+ PDEVICE_EXTENSION DeviceExt,
+ ULONG FirstCluster,
+ PULONG CurrentCluster,
+ BOOLEAN Extend);
+
+/* shutdown.c */
+
+DRIVER_DISPATCH
+VfatShutdown;
+
+NTSTATUS
+NTAPI
+VfatShutdown(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp);
+
+/* string.c */
+
+VOID
+vfatSplitPathName(
+ PUNICODE_STRING PathNameU,
+ PUNICODE_STRING DirNameU,
+ PUNICODE_STRING FileNameU);
+
+BOOLEAN
+vfatIsLongIllegal(
+ WCHAR c);
+
+BOOLEAN
+wstrcmpjoki(
+ PWSTR s1,
+ PWSTR s2);
+
+/* volume.c */
+
+NTSTATUS
+VfatQueryVolumeInformation(
+ PVFAT_IRP_CONTEXT IrpContext);
+
+NTSTATUS
+VfatSetVolumeInformation(
+ PVFAT_IRP_CONTEXT IrpContext);
/* EOF */