mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 01:15:09 +00:00
[FORMATTING]
- Bring formatting closer to ReactOS kernelmode style. svn path=/trunk/; revision=39038
This commit is contained in:
parent
d1494fca12
commit
44f86392fe
1 changed files with 177 additions and 229 deletions
|
@ -28,93 +28,80 @@ 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,
|
IN BOOLEAN CanWait);
|
||||||
IN BOOLEAN CanWait);
|
|
||||||
|
|
||||||
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,90 +147,77 @@ 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)
|
|
||||||
{
|
{
|
||||||
ExRaiseStatus(STATUS_NOT_IMPLEMENTED);
|
ExRaiseStatus(STATUS_NOT_IMPLEMENTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
ExRaiseStatus(STATUS_NOT_IMPLEMENTED);
|
ExRaiseStatus(STATUS_NOT_IMPLEMENTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
ExRaiseStatus(STATUS_NOT_IMPLEMENTED);
|
ExRaiseStatus(STATUS_NOT_IMPLEMENTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
ExRaiseStatus(STATUS_NOT_IMPLEMENTED);
|
ExRaiseStatus(STATUS_NOT_IMPLEMENTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
ExRaiseStatus(STATUS_NOT_IMPLEMENTED);
|
ExRaiseStatus(STATUS_NOT_IMPLEMENTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
ExRaiseStatus(STATUS_NOT_IMPLEMENTED);
|
ExRaiseStatus(STATUS_NOT_IMPLEMENTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
ExRaiseStatus(STATUS_NOT_IMPLEMENTED);
|
ExRaiseStatus(STATUS_NOT_IMPLEMENTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
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,22 +230,24 @@ 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)
|
||||||
{
|
{
|
||||||
Context->PageOffset.QuadPart = PageOffset;
|
Context->PageOffset.QuadPart = PageOffset;
|
||||||
|
@ -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,19 +278,15 @@ 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;
|
||||||
CcUnpinData(Context->PageBcb);
|
CcUnpinData(Context->PageBcb);
|
||||||
if (!CcMapData(Context->FileObject,
|
if (!CcMapData(Context->FileObject,
|
||||||
|
@ -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,45 +309,33 @@ 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)
|
|
||||||
{
|
{
|
||||||
ExRaiseStatus(STATUS_NOT_IMPLEMENTED);
|
ExRaiseStatus(STATUS_NOT_IMPLEMENTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
ExRaiseStatus(STATUS_NOT_IMPLEMENTED);
|
ExRaiseStatus(STATUS_NOT_IMPLEMENTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
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,
|
IN BOOLEAN CanWait)
|
||||||
IN BOOLEAN CanWait)
|
|
||||||
{
|
{
|
||||||
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,10 +513,9 @@ 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)
|
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PBCB Bcb;
|
PBCB Bcb;
|
||||||
|
@ -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,55 +537,54 @@ 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);
|
||||||
|
|
||||||
/* 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.
|
||||||
*/
|
*/
|
||||||
if (CcMapData(Vcb->VolumeFileObject,
|
if (CcMapData(Vcb->VolumeFileObject,
|
||||||
&Offset,
|
&Offset,
|
||||||
sizeof(PACKED_BOOT_SECTOR),
|
sizeof(PACKED_BOOT_SECTOR),
|
||||||
TRUE,
|
TRUE,
|
||||||
&Bcb,
|
&Bcb,
|
||||||
&Buffer))
|
&Buffer))
|
||||||
{
|
{
|
||||||
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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue