[FORMATTING]

- Bring formatting closer to ReactOS kernelmode style.

svn path=/trunk/; revision=39038
This commit is contained in:
Aleksey Bragin 2009-01-23 11:01:59 +00:00
parent d1494fca12
commit 44f86392fe

View file

@ -28,84 +28,72 @@ typedef struct _FAT_SCAN_CONTEXT
((ULONG) ((xOffset - (xVcb)->DataArea) >> (xVcb)->BytesPerClusterLog) + 0x02) ((ULONG) ((xOffset - (xVcb)->DataArea) >> (xVcb)->BytesPerClusterLog) + 0x02)
ULONG ULONG
FatScanFat12ForContinousRun( FatScanFat12ForContinousRun(IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PULONG Index, IN OUT PULONG Index,
IN BOOLEAN CanWait); IN BOOLEAN CanWait);
ULONG ULONG
FatSetFat12ContinousRun( FatSetFat12ContinousRun(IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PFAT_SCAN_CONTEXT Context,
IN ULONG Index, IN ULONG Index,
IN ULONG Length, IN ULONG Length,
IN BOOLEAN CanWait); IN BOOLEAN CanWait);
ULONG ULONG
FatScanFat12ForValueRun( FatScanFat12ForValueRun(IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PULONG Index, IN OUT PULONG Index,
IN ULONG IndexValue, IN ULONG IndexValue,
IN BOOLEAN CanWait); IN BOOLEAN CanWait);
ULONG ULONG
FatSetFat12ValueRun( FatSetFat12ValueRun(IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PFAT_SCAN_CONTEXT Context,
IN ULONG Index, IN ULONG Index,
IN ULONG Length, IN ULONG Length,
IN ULONG IndexValue, IN ULONG IndexValue,
IN BOOLEAN CanWait); IN BOOLEAN CanWait);
ULONG ULONG
FatScanFat16ForContinousRun( FatScanFat16ForContinousRun(IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PULONG Index, IN OUT PULONG Index,
IN BOOLEAN CanWait); IN BOOLEAN CanWait);
ULONG ULONG
FatSetFat16ContinousRun( FatSetFat16ContinousRun(IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PFAT_SCAN_CONTEXT Context,
IN ULONG Index, IN ULONG Index,
IN ULONG Length, IN ULONG Length,
IN BOOLEAN CanWait); IN BOOLEAN CanWait);
ULONG ULONG
FatScanFat16ForValueRun( FatScanFat16ForValueRun(IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PULONG Index, IN OUT PULONG Index,
IN ULONG IndexValue, IN ULONG IndexValue,
IN BOOLEAN CanWait); IN BOOLEAN CanWait);
ULONG ULONG
FatSetFat16ValueRun( FatSetFat16ValueRun(IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PFAT_SCAN_CONTEXT Context,
IN ULONG Index, IN ULONG Index,
IN ULONG Length, IN ULONG Length,
IN ULONG IndexValue, IN ULONG IndexValue,
IN BOOLEAN CanWait); IN BOOLEAN CanWait);
ULONG ULONG
FatScanFat32ForContinousRun( FatScanFat32ForContinousRun(IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PULONG Index, IN OUT PULONG Index,
IN BOOLEAN CanWait); IN BOOLEAN CanWait);
ULONG ULONG
FatSetFat32ContinousRun( FatSetFat32ContinousRun(IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PFAT_SCAN_CONTEXT Context,
IN ULONG Index, IN ULONG Index,
IN ULONG Length, IN ULONG Length,
IN BOOLEAN CanWait); IN BOOLEAN CanWait);
ULONG ULONG
FatScanFat32ForValueRun( FatScanFat32ForValueRun(IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PULONG Index, IN OUT PULONG Index,
IN ULONG IndexValue, IN ULONG IndexValue,
IN BOOLEAN CanWait); IN BOOLEAN CanWait);
ULONG ULONG
FatSetFat32ValueRun( FatSetFat32ValueRun(IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PFAT_SCAN_CONTEXT Context,
IN ULONG Index, IN ULONG Index,
IN ULONG Length, IN ULONG Length,
IN ULONG IndexValue, IN ULONG IndexValue,
@ -113,8 +101,7 @@ FatSetFat32ValueRun(
BOOLEAN BOOLEAN
NTAPI NTAPI
FatValidBpb( FatValidBpb(IN PBIOS_PARAMETER_BLOCK Bpb);
IN PBIOS_PARAMETER_BLOCK Bpb);
/* VARIABLES ****************************************************************/ /* VARIABLES ****************************************************************/
FAT_METHODS Fat12Methods = { FAT_METHODS Fat12Methods = {
@ -139,10 +126,7 @@ FAT_METHODS Fat32Methods = {
}; };
/* FUNCTIONS ****************************************************************/ /* FUNCTIONS ****************************************************************/
FORCEINLINE
ULONG
FatPowerOfTwo(
ULONG Number)
/* /*
* FUNCTION: * FUNCTION:
* Determines the index of the set bit. * Determines the index of the set bit.
@ -150,6 +134,10 @@ FatPowerOfTwo(
* Number = Number having a single bit set. * Number = Number having a single bit set.
* RETURNS: Index of the set bit. * RETURNS: Index of the set bit.
*/ */
FORCEINLINE
ULONG
FatPowerOfTwo(
ULONG Number)
{ {
ULONG Temp; ULONG Temp;
Temp = Number Temp = Number
@ -159,8 +147,7 @@ FatPowerOfTwo(
} }
ULONG ULONG
FatScanFat12ForContinousRun( FatScanFat12ForContinousRun(IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PULONG Index, IN OUT PULONG Index,
IN BOOLEAN CanWait) IN BOOLEAN CanWait)
{ {
@ -168,8 +155,7 @@ FatScanFat12ForContinousRun(
} }
ULONG ULONG
FatSetFat12ContinousRun( FatSetFat12ContinousRun(IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PFAT_SCAN_CONTEXT Context,
IN ULONG Index, IN ULONG Index,
IN ULONG Length, IN ULONG Length,
IN BOOLEAN CanWait) IN BOOLEAN CanWait)
@ -178,8 +164,7 @@ FatSetFat12ContinousRun(
} }
ULONG ULONG
FatScanFat12ForValueRun( FatScanFat12ForValueRun(IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PULONG Index, IN OUT PULONG Index,
IN ULONG IndexValue, IN ULONG IndexValue,
IN BOOLEAN CanWait) IN BOOLEAN CanWait)
@ -188,8 +173,7 @@ FatScanFat12ForValueRun(
} }
ULONG ULONG
FatSetFat12ValueRun( FatSetFat12ValueRun(IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PFAT_SCAN_CONTEXT Context,
IN ULONG Index, IN ULONG Index,
IN ULONG Length, IN ULONG Length,
IN ULONG IndexValue, IN ULONG IndexValue,
@ -199,8 +183,7 @@ FatSetFat12ValueRun(
} }
ULONG ULONG
FatScanFat16ForContinousRun( FatScanFat16ForContinousRun(IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PULONG Index, IN OUT PULONG Index,
IN BOOLEAN CanWait) IN BOOLEAN CanWait)
{ {
@ -208,8 +191,7 @@ FatScanFat16ForContinousRun(
} }
ULONG ULONG
FatSetFat16ContinousRun( FatSetFat16ContinousRun(IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PFAT_SCAN_CONTEXT Context,
IN ULONG Index, IN ULONG Index,
IN ULONG Length, IN ULONG Length,
IN BOOLEAN CanWait) IN BOOLEAN CanWait)
@ -218,8 +200,7 @@ FatSetFat16ContinousRun(
} }
ULONG ULONG
FatScanFat16ForValueRun( FatScanFat16ForValueRun(IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PULONG Index, IN OUT PULONG Index,
IN ULONG IndexValue, IN ULONG IndexValue,
IN BOOLEAN CanWait) IN BOOLEAN CanWait)
@ -228,8 +209,7 @@ FatScanFat16ForValueRun(
} }
ULONG ULONG
FatSetFat16ValueRun( FatSetFat16ValueRun(IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PFAT_SCAN_CONTEXT Context,
IN ULONG Index, IN ULONG Index,
IN ULONG Length, IN ULONG Length,
IN ULONG IndexValue, IN ULONG IndexValue,
@ -238,11 +218,6 @@ FatSetFat16ValueRun(
ExRaiseStatus(STATUS_NOT_IMPLEMENTED); ExRaiseStatus(STATUS_NOT_IMPLEMENTED);
} }
ULONG
FatScanFat32ForContinousRun(
IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PULONG Index,
IN BOOLEAN CanWait)
/* /*
* FUNCTION: * FUNCTION:
* Scans FAT32 for continous chain of clusters * Scans FAT32 for continous chain of clusters
@ -255,20 +230,22 @@ FatScanFat32ForContinousRun(
* RETURNS: Value of the last claster terminated the scan. * RETURNS: Value of the last claster terminated the scan.
* NOTES: Raises STATUS_CANT_WAIT race condition. * NOTES: Raises STATUS_CANT_WAIT race condition.
*/ */
ULONG
FatScanFat32ForContinousRun(IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PULONG Index,
IN BOOLEAN CanWait)
{ {
LONGLONG PageOffset; LONGLONG PageOffset;
SIZE_T OffsetWithinPage, PageValidLength; SIZE_T OffsetWithinPage, PageValidLength;
PULONG Entry, BeyoudLastEntry; PULONG Entry, BeyoudLastEntry;
/* /* Determine page offset and the offset within page
* Determine page offset and the offset within page
* for the first cluster. * for the first cluster.
*/ */
PageValidLength = PAGE_SIZE; PageValidLength = PAGE_SIZE;
PageOffset = ((LONGLONG) *Index) << 0x2; PageOffset = ((LONGLONG) *Index) << 0x2;
OffsetWithinPage = (SIZE_T) (PageOffset & (PAGE_SIZE - 1)); OffsetWithinPage = (SIZE_T) (PageOffset & (PAGE_SIZE - 1));
PageOffset -= OffsetWithinPage; PageOffset -= OffsetWithinPage;
/* /* Check if the context already has the required page mapped.
* Check if the context already has the required page mapped.
* Map the first page is necessary. * Map the first page is necessary.
*/ */
if (PageOffset != Context->PageOffset.QuadPart) if (PageOffset != Context->PageOffset.QuadPart)
@ -279,17 +256,19 @@ FatScanFat32ForContinousRun(
CcUnpinData(Context->PageBcb); CcUnpinData(Context->PageBcb);
Context->PageBcb = NULL; Context->PageBcb = NULL;
} }
if (!CcMapData(Context->FileObject, &Context->PageOffset, if (!CcMapData(Context->FileObject,
PAGE_SIZE, CanWait, &Context->PageBcb, &Context->PageBuffer)) &Context->PageOffset,
PAGE_SIZE,
CanWait,
&Context->PageBcb,
&Context->PageBuffer))
{ {
Context->PageOffset.QuadPart = 0LL; Context->PageOffset.QuadPart = 0LL;
ExRaiseStatus(STATUS_CANT_WAIT); ExRaiseStatus(STATUS_CANT_WAIT);
} }
} }
Entry = Add2Ptr(Context->PageBuffer, OffsetWithinPage, PULONG); Entry = Add2Ptr(Context->PageBuffer, OffsetWithinPage, PULONG);
/* /* Next Page Offset */
* Next Page Offset.
*/
PageOffset = Context->PageOffset.QuadPart + PAGE_SIZE; PageOffset = Context->PageOffset.QuadPart + PAGE_SIZE;
if (PageOffset > Context->BeyoundLastEntryOffset) if (PageOffset > Context->BeyoundLastEntryOffset)
PageValidLength = (SIZE_T) (Context->BeyoundLastEntryOffset PageValidLength = (SIZE_T) (Context->BeyoundLastEntryOffset
@ -299,17 +278,13 @@ FatScanFat32ForContinousRun(
{ {
do do
{ {
if ((*Entry & FAT_CLUSTER_LAST) != ++(*Index) ) if ((*Entry & FAT_CLUSTER_LAST) != ++(*Index))
return (*Entry & FAT_CLUSTER_LAST); return (*Entry & FAT_CLUSTER_LAST);
} } while (++Entry < BeyoudLastEntry);
while (++Entry < BeyoudLastEntry); /* Check if this is the last available entry */
/*
* Check if this is the last available entry.
*/
if (PageValidLength < PAGE_SIZE) if (PageValidLength < PAGE_SIZE)
break; break;
/* /* We are getting beyound current page and
* We are getting beyound current page and
* are still in the continous run, map the next page. * are still in the continous run, map the next page.
*/ */
Context->PageOffset.QuadPart = PageOffset; Context->PageOffset.QuadPart = PageOffset;
@ -323,9 +298,7 @@ FatScanFat32ForContinousRun(
ExRaiseStatus(STATUS_CANT_WAIT); ExRaiseStatus(STATUS_CANT_WAIT);
} }
Entry = (PULONG) Context->PageBuffer; Entry = (PULONG) Context->PageBuffer;
/* /* Next Page Offset */
* Next Page Offset.
*/
PageOffset = Context->PageOffset.QuadPart + PAGE_SIZE; PageOffset = Context->PageOffset.QuadPart + PAGE_SIZE;
if (PageOffset > Context->BeyoundLastEntryOffset) if (PageOffset > Context->BeyoundLastEntryOffset)
PageValidLength = (SIZE_T) (Context->BeyoundLastEntryOffset PageValidLength = (SIZE_T) (Context->BeyoundLastEntryOffset
@ -336,8 +309,7 @@ FatScanFat32ForContinousRun(
} }
ULONG ULONG
FatSetFat32ContinousRun( FatSetFat32ContinousRun(IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PFAT_SCAN_CONTEXT Context,
IN ULONG Index, IN ULONG Index,
IN ULONG Length, IN ULONG Length,
IN BOOLEAN CanWait) IN BOOLEAN CanWait)
@ -346,8 +318,7 @@ FatSetFat32ContinousRun(
} }
ULONG ULONG
FatScanFat32ForValueRun( FatScanFat32ForValueRun(IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PULONG Index, IN OUT PULONG Index,
IN ULONG IndexValue, IN ULONG IndexValue,
IN BOOLEAN CanWait) IN BOOLEAN CanWait)
@ -356,8 +327,7 @@ FatScanFat32ForValueRun(
} }
ULONG ULONG
FatSetFat32ValueRun( FatSetFat32ValueRun(IN OUT PFAT_SCAN_CONTEXT Context,
IN OUT PFAT_SCAN_CONTEXT Context,
IN ULONG Index, IN ULONG Index,
IN ULONG Length, IN ULONG Length,
IN ULONG IndexValue, IN ULONG IndexValue,
@ -366,15 +336,6 @@ FatSetFat32ValueRun(
ExRaiseStatus(STATUS_NOT_IMPLEMENTED); ExRaiseStatus(STATUS_NOT_IMPLEMENTED);
} }
ULONG
FatScanFat(
IN PFCB Fcb,
IN LONGLONG Vbo,
OUT PLONGLONG Lbo,
IN OUT PLONGLONG Length,
OUT PULONG Index,
IN BOOLEAN CanWait
)
/* /*
* FUNCTION: * FUNCTION:
* Queries file MCB for the specified region [Vbo, Vbo + Length], * Queries file MCB for the specified region [Vbo, Vbo + Length],
@ -395,37 +356,36 @@ FatScanFat(
* NOTES: Should be called by I/O routines to split the I/O operation * NOTES: Should be called by I/O routines to split the I/O operation
* into sequential or parallel I/O operations. * into sequential or parallel I/O operations.
*/ */
ULONG
FatScanFat(IN PFCB Fcb,
IN LONGLONG Vbo,
OUT PLONGLONG Lbo,
IN OUT PLONGLONG Length,
OUT PULONG Index,
IN BOOLEAN CanWait)
{ {
LONGLONG CurrentLbo, CurrentVbo, BeyoundLastVbo, CurrentLength; LONGLONG CurrentLbo, CurrentVbo, BeyoundLastVbo, CurrentLength;
ULONG Entry, NextEntry, NumberOfEntries, CurrentIndex; ULONG Entry, NextEntry, NumberOfEntries, CurrentIndex;
FAT_SCAN_CONTEXT Context; FAT_SCAN_CONTEXT Context;
PVCB Vcb; PVCB Vcb;
/* /* Some often used values */
* Some often used values
*/
Vcb = Fcb->Vcb; Vcb = Fcb->Vcb;
CurrentIndex = 0; CurrentIndex = 0;
BeyoundLastVbo = Vbo + *Length; BeyoundLastVbo = Vbo + *Length;
CurrentLength = ((LONGLONG) Vcb->Clusters) << Vcb->BytesPerClusterLog; CurrentLength = ((LONGLONG) Vcb->Clusters) << Vcb->BytesPerClusterLog;
if (BeyoundLastVbo > CurrentLength) if (BeyoundLastVbo > CurrentLength)
BeyoundLastVbo = CurrentLength; BeyoundLastVbo = CurrentLength;
/* /* Try to locate first run */
* Try to locate first run.
*/
if (FsRtlLookupLargeMcbEntry(&Fcb->Mcb, Vbo, Lbo, Length, NULL, NULL, Index)) if (FsRtlLookupLargeMcbEntry(&Fcb->Mcb, Vbo, Lbo, Length, NULL, NULL, Index))
{ {
/* /* Check if we have a single mapped run */
* Check if we have a single mapped run.
*/
if (Vbo >= BeyoundLastVbo) if (Vbo >= BeyoundLastVbo)
goto FatScanFcbFatExit; goto FatScanFcbFatExit;
} else { } else {
*Length = 0L; *Length = 0L;
} }
/* /* Get the first scan startup values */
* Get the first scan startup values.
*/
if (FsRtlLookupLastLargeMcbEntryAndIndex( if (FsRtlLookupLastLargeMcbEntryAndIndex(
&Fcb->Mcb, &CurrentVbo, &CurrentLbo, &CurrentIndex)) &Fcb->Mcb, &CurrentVbo, &CurrentLbo, &CurrentIndex))
{ {
@ -433,9 +393,7 @@ FatScanFat(
} }
else else
{ {
/* /* Map is empty, set up initial values */
* Map is empty, set up initial values.
*/
Entry = Fcb->FirstCluster; Entry = Fcb->FirstCluster;
if (Entry <= 0x2) if (Entry <= 0x2)
ExRaiseStatus(STATUS_FILE_CORRUPT_ERROR); ExRaiseStatus(STATUS_FILE_CORRUPT_ERROR);
@ -452,16 +410,12 @@ FatScanFat(
Context.FileObject = Vcb->VolumeFileObject; Context.FileObject = Vcb->VolumeFileObject;
while (CurrentVbo < BeyoundLastVbo) while (CurrentVbo < BeyoundLastVbo)
{ {
/* /* Locate Continous run starting with the current entry */
* Locate Continous run starting with the current entry.
*/
NumberOfEntries = Entry; NumberOfEntries = Entry;
NextEntry = Vcb->Methods.ScanContinousRun( NextEntry = Vcb->Methods.ScanContinousRun(
&Context, &NumberOfEntries, CanWait); &Context, &NumberOfEntries, CanWait);
NumberOfEntries -= Entry; NumberOfEntries -= Entry;
/* /* Check value that terminated the for being valid for FAT */
* Check value that terminated the for being valid for FAT.
*/
if (NextEntry <= 0x2) if (NextEntry <= 0x2)
ExRaiseStatus(STATUS_FILE_CORRUPT_ERROR); ExRaiseStatus(STATUS_FILE_CORRUPT_ERROR);
if (NextEntry >= Vcb->Clusters) if (NextEntry >= Vcb->Clusters)
@ -470,18 +424,14 @@ FatScanFat(
ExRaiseStatus(STATUS_FILE_CORRUPT_ERROR); ExRaiseStatus(STATUS_FILE_CORRUPT_ERROR);
break; break;
} }
/* /* Add new run */
* Add new run.
*/
CurrentLength = ((LONGLONG) NumberOfEntries) CurrentLength = ((LONGLONG) NumberOfEntries)
<< Vcb->BytesPerClusterLog; << Vcb->BytesPerClusterLog;
FsRtlAddLargeMcbEntry(&Fcb->Mcb, FsRtlAddLargeMcbEntry(&Fcb->Mcb,
CurrentVbo, CurrentVbo,
FatEntryToDataOffset(Entry, Vcb), FatEntryToDataOffset(Entry, Vcb),
CurrentLength); CurrentLength);
/* /* Setup next iteration */
* Setup next iteration.
*/
Entry = NextEntry; Entry = NextEntry;
CurrentVbo += CurrentLength; CurrentVbo += CurrentLength;
CurrentIndex ++; CurrentIndex ++;
@ -501,8 +451,7 @@ FatScanFcbFatExit:
BOOLEAN BOOLEAN
NTAPI NTAPI
FatValidBpb( FatValidBpb(IN PBIOS_PARAMETER_BLOCK Bpb)
IN PBIOS_PARAMETER_BLOCK Bpb)
{ {
return (FatValidBytesPerSector(Bpb->BytesPerSector) return (FatValidBytesPerSector(Bpb->BytesPerSector)
&& FatValidSectorsPerCluster(Bpb->SectorsPerCluster) && FatValidSectorsPerCluster(Bpb->SectorsPerCluster)
@ -524,8 +473,7 @@ FatValidBpb(
} }
VOID VOID
FatiInitializeVcb( FatiInitializeVcb(PVCB Vcb)
PVCB Vcb)
{ {
ULONG ClustersCapacity; ULONG ClustersCapacity;
@ -565,8 +513,7 @@ FatiInitializeVcb(
} }
NTSTATUS NTSTATUS
FatInitializeVcb( FatInitializeVcb(IN PVCB Vcb,
IN PVCB Vcb,
IN PDEVICE_OBJECT TargetDeviceObject, IN PDEVICE_OBJECT TargetDeviceObject,
IN PVPB Vpb) IN PVPB Vpb)
{ {
@ -577,13 +524,12 @@ FatInitializeVcb(
RtlZeroMemory(Vcb, sizeof(*Vcb)); RtlZeroMemory(Vcb, sizeof(*Vcb));
/* /* Initialize list head, so that it will
* Initialize list head, so that it will
* not fail in cleanup. * not fail in cleanup.
*/ */
InitializeListHead(&Vcb->VcbLinks); InitializeListHead(&Vcb->VcbLinks);
/* Setup FCB Header. */ /* Setup FCB Header */
Vcb->Header.NodeTypeCode = FAT_NTC_VCB; Vcb->Header.NodeTypeCode = FAT_NTC_VCB;
Vcb->Header.NodeByteSize = sizeof(*Vcb); Vcb->Header.NodeByteSize = sizeof(*Vcb);
@ -591,28 +537,27 @@ FatInitializeVcb(
Vcb->TargetDeviceObject = TargetDeviceObject; Vcb->TargetDeviceObject = TargetDeviceObject;
ObReferenceObject(TargetDeviceObject); ObReferenceObject(TargetDeviceObject);
/* Setup FCB Header. */ /* Setup FCB Header */
ExInitializeFastMutex(&Vcb->HeaderMutex); ExInitializeFastMutex(&Vcb->HeaderMutex);
FsRtlSetupAdvancedHeader(&Vcb->Header, &Vcb->HeaderMutex); FsRtlSetupAdvancedHeader(&Vcb->Header, &Vcb->HeaderMutex);
/* Create Volume File Object. */ /* Create Volume File Object */
Vcb->VolumeFileObject = IoCreateStreamFileObject(NULL, Vcb->VolumeFileObject = IoCreateStreamFileObject(NULL,
Vcb->TargetDeviceObject); Vcb->TargetDeviceObject);
/* We have to setup all FCB fields needed for CC. */ /* We have to setup all FCB fields needed for CC */
Vcb->VolumeFileObject->FsContext = Vcb; Vcb->VolumeFileObject->FsContext = Vcb;
Vcb->VolumeFileObject->SectionObjectPointer = &Vcb->SectionObjectPointers; Vcb->VolumeFileObject->SectionObjectPointer = &Vcb->SectionObjectPointers;
/* At least full boot sector should be available */
/* At least full boot sector should be available. */
Vcb->Header.FileSize.QuadPart = sizeof(PACKED_BOOT_SECTOR); Vcb->Header.FileSize.QuadPart = sizeof(PACKED_BOOT_SECTOR);
Vcb->Header.AllocationSize.QuadPart = sizeof(PACKED_BOOT_SECTOR); Vcb->Header.AllocationSize.QuadPart = sizeof(PACKED_BOOT_SECTOR);
Vcb->Header.ValidDataLength.HighPart = MAXLONG; Vcb->Header.ValidDataLength.HighPart = MAXLONG;
Vcb->Header.ValidDataLength.LowPart = MAXULONG; Vcb->Header.ValidDataLength.LowPart = MAXULONG;
/* Initialize CC. */ /* Initialize CC */
CcInitializeCacheMap(Vcb->VolumeFileObject, CcInitializeCacheMap(Vcb->VolumeFileObject,
(PCC_FILE_SIZES) &Vcb->Header.AllocationSize, (PCC_FILE_SIZES)&Vcb->Header.AllocationSize,
FALSE, FALSE,
&FatGlobalData.CacheMgrNoopCallbacks, &FatGlobalData.CacheMgrNoopCallbacks,
Vcb); Vcb);
@ -620,8 +565,8 @@ FatInitializeVcb(
/* Read boot sector */ /* Read boot sector */
Offset.QuadPart = 0; Offset.QuadPart = 0;
Bcb = NULL; Bcb = NULL;
/*
* Note: Volume Read path does not require /* Note: Volume Read path does not require
* any of the parameters set further * any of the parameters set further
* in this routine. * in this routine.
*/ */
@ -634,12 +579,12 @@ FatInitializeVcb(
{ {
PPACKED_BOOT_SECTOR BootSector = (PPACKED_BOOT_SECTOR) Buffer; PPACKED_BOOT_SECTOR BootSector = (PPACKED_BOOT_SECTOR) Buffer;
FatUnpackBios(&Vcb->Bpb, &BootSector->PackedBpb); FatUnpackBios(&Vcb->Bpb, &BootSector->PackedBpb);
if (!(FatBootSectorJumpValid(BootSector->Jump) if (!(FatBootSectorJumpValid(BootSector->Jump) &&
&& FatValidBpb(&Vcb->Bpb))) FatValidBpb(&Vcb->Bpb)))
{ {
Status = STATUS_UNRECOGNIZED_VOLUME; Status = STATUS_UNRECOGNIZED_VOLUME;
} }
CopyUchar4( &Vpb->SerialNumber, BootSector->Id ); CopyUchar4(&Vpb->SerialNumber, BootSector->Id);
CcUnpinData(Bcb); CcUnpinData(Bcb);
} }
else else
@ -647,7 +592,10 @@ FatInitializeVcb(
Status = STATUS_UNRECOGNIZED_VOLUME; Status = STATUS_UNRECOGNIZED_VOLUME;
goto FatInitializeVcbCleanup; goto FatInitializeVcbCleanup;
} }
/* Call helper function */
FatiInitializeVcb(Vcb); FatiInitializeVcb(Vcb);
/* Add this Vcb to grobal Vcb list. */ /* Add this Vcb to grobal Vcb list. */
InsertTailList(&FatGlobalData.VcbListHead, &Vcb->VcbLinks); InsertTailList(&FatGlobalData.VcbListHead, &Vcb->VcbLinks);
return STATUS_SUCCESS; return STATUS_SUCCESS;
@ -660,8 +608,7 @@ FatInitializeVcbCleanup:
} }
VOID VOID
FatUninitializeVcb( FatUninitializeVcb(IN PVCB Vcb)
IN PVCB Vcb)
{ {
LARGE_INTEGER ZeroSize; LARGE_INTEGER ZeroSize;
@ -675,6 +622,7 @@ FatUninitializeVcb(
ObDereferenceObject(Vcb->VolumeFileObject); ObDereferenceObject(Vcb->VolumeFileObject);
Vcb->VolumeFileObject = NULL; Vcb->VolumeFileObject = NULL;
} }
/* Unlink from global Vcb list. */ /* Unlink from global Vcb list. */
RemoveEntryList(&Vcb->VcbLinks); RemoveEntryList(&Vcb->VcbLinks);