https://git.reactos.org/?p=reactos.git;a=commitdiff;h=3c3ebe33207a05c0b5b11…
commit 3c3ebe33207a05c0b5b11ffd2d753c69690dc2fb
Author: Pierre Schweitzer <pierre(a)reactos.org>
AuthorDate: Fri May 18 14:03:20 2018 +0200
Commit: Pierre Schweitzer <pierre(a)reactos.org>
CommitDate: Fri May 18 14:09:30 2018 +0200
[FASTFAT] Only initialize directory cache on use.
This avoids initializing cache directly on directory
open/create.
The advantage is we reduce the load on cache manager
and on memory manager by avoiding creating everytime
a stream file object, and initializing cache for it.
This will avoid initializing cache for started
applications 'current directory' which is just opened
for having a valid handle but no read/write is performed
in it, by default.
This is a step forward for autochk.
CORE-14629
---
drivers/filesystems/fastfat/cleanup.c | 2 +-
drivers/filesystems/fastfat/create.c | 2 +-
drivers/filesystems/fastfat/dir.c | 1 +
drivers/filesystems/fastfat/direntry.c | 31 ++++++++
drivers/filesystems/fastfat/dirwr.c | 138 +++++++++++++++++++++++++++++++--
drivers/filesystems/fastfat/fcb.c | 67 +---------------
drivers/filesystems/fastfat/finfo.c | 4 +-
drivers/filesystems/fastfat/flush.c | 2 +-
drivers/filesystems/fastfat/vfat.h | 14 +++-
9 files changed, 181 insertions(+), 80 deletions(-)
diff --git a/drivers/filesystems/fastfat/cleanup.c
b/drivers/filesystems/fastfat/cleanup.c
index 3ab4a101d1..f611a69def 100644
--- a/drivers/filesystems/fastfat/cleanup.c
+++ b/drivers/filesystems/fastfat/cleanup.c
@@ -88,7 +88,7 @@ VfatCleanupFile(
if (BooleanFlagOn(pFcb->Flags, FCB_IS_DIRTY))
{
- VfatUpdateEntry (pFcb, vfatVolumeIsFatX(DeviceExt));
+ VfatUpdateEntry (DeviceExt, pFcb);
}
if (BooleanFlagOn(pFcb->Flags, FCB_DELETE_PENDING) &&
diff --git a/drivers/filesystems/fastfat/create.c b/drivers/filesystems/fastfat/create.c
index d9efa96828..84751c2595 100644
--- a/drivers/filesystems/fastfat/create.c
+++ b/drivers/filesystems/fastfat/create.c
@@ -951,7 +951,7 @@ VfatCreateFile(
&pFcb->entry.Fat.UpdateTime);
}
- VfatUpdateEntry(pFcb, vfatVolumeIsFatX(DeviceExt));
+ VfatUpdateEntry(DeviceExt, pFcb);
}
ExAcquireResourceExclusiveLite(&(pFcb->MainResource), TRUE);
diff --git a/drivers/filesystems/fastfat/dir.c b/drivers/filesystems/fastfat/dir.c
index dd53080cda..18c6dcc2ca 100644
--- a/drivers/filesystems/fastfat/dir.c
+++ b/drivers/filesystems/fastfat/dir.c
@@ -599,6 +599,7 @@ DoQuery(
DPRINT("Buffer=%p tofind=%wZ\n", Buffer, &pCcb->SearchPattern);
+ DirContext.DeviceExt = IrpContext->DeviceExt;
DirContext.LongNameU.Buffer = LongNameBuffer;
DirContext.LongNameU.MaximumLength = sizeof(LongNameBuffer);
DirContext.ShortNameU.Buffer = ShortNameBuffer;
diff --git a/drivers/filesystems/fastfat/direntry.c
b/drivers/filesystems/fastfat/direntry.c
index f018282b6d..aa1e12f5a5 100644
--- a/drivers/filesystems/fastfat/direntry.c
+++ b/drivers/filesystems/fastfat/direntry.c
@@ -41,12 +41,14 @@ vfatDirEntryGetFirstCluster(
BOOLEAN
FATIsDirectoryEmpty(
+ PDEVICE_EXTENSION DeviceExt,
PVFATFCB Fcb)
{
LARGE_INTEGER FileOffset;
PVOID Context = NULL;
PFAT_DIR_ENTRY FatDirEntry;
ULONG Index, MaxIndex;
+ NTSTATUS Status;
if (vfatFCBIsRoot(Fcb))
{
@@ -60,6 +62,12 @@ FATIsDirectoryEmpty(
FileOffset.QuadPart = 0;
MaxIndex = Fcb->RFCB.FileSize.u.LowPart / sizeof(FAT_DIR_ENTRY);
+ Status = vfatFCBInitializeCacheFromVolume(DeviceExt, Fcb);
+ if (!NT_SUCCESS(Status))
+ {
+ return FALSE;
+ }
+
while (Index < MaxIndex)
{
if (Context == NULL || (Index % FAT_ENTRIES_PER_PAGE) == 0)
@@ -109,16 +117,24 @@ FATIsDirectoryEmpty(
BOOLEAN
FATXIsDirectoryEmpty(
+ PDEVICE_EXTENSION DeviceExt,
PVFATFCB Fcb)
{
LARGE_INTEGER FileOffset;
PVOID Context = NULL;
PFATX_DIR_ENTRY FatXDirEntry;
ULONG Index = 0, MaxIndex;
+ NTSTATUS Status;
FileOffset.QuadPart = 0;
MaxIndex = Fcb->RFCB.FileSize.u.LowPart / sizeof(FATX_DIR_ENTRY);
+ Status = vfatFCBInitializeCacheFromVolume(DeviceExt, Fcb);
+ if (!NT_SUCCESS(Status))
+ {
+ return FALSE;
+ }
+
while (Index < MaxIndex)
{
if (Context == NULL || (Index % FATX_ENTRIES_PER_PAGE) == 0)
@@ -186,12 +202,20 @@ FATGetNextDirEntry(
BOOLEAN Valid = TRUE;
BOOLEAN Back = FALSE;
+ NTSTATUS Status;
+
DirContext->LongNameU.Length = 0;
DirContext->LongNameU.Buffer[0] = UNICODE_NULL;
FileOffset.u.HighPart = 0;
FileOffset.u.LowPart = ROUND_DOWN(DirContext->DirIndex * sizeof(FAT_DIR_ENTRY),
PAGE_SIZE);
+ Status = vfatFCBInitializeCacheFromVolume(DirContext->DeviceExt, pDirFcb);
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+
if (*pContext == NULL || (DirContext->DirIndex % FAT_ENTRIES_PER_PAGE) == 0)
{
if (*pContext != NULL)
@@ -461,6 +485,7 @@ FATXGetNextDirEntry(
PFATX_DIR_ENTRY fatxDirEntry;
OEM_STRING StringO;
ULONG DirIndex = DirContext->DirIndex;
+ NTSTATUS Status;
FileOffset.u.HighPart = 0;
@@ -498,6 +523,12 @@ FATXGetNextDirEntry(
}
}
+ Status = vfatFCBInitializeCacheFromVolume(DirContext->DeviceExt, pDirFcb);
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+
if (*pContext == NULL || (DirIndex % FATX_ENTRIES_PER_PAGE) == 0)
{
if (*pContext != NULL)
diff --git a/drivers/filesystems/fastfat/dirwr.c b/drivers/filesystems/fastfat/dirwr.c
index 68f1579102..e2026b8cd9 100644
--- a/drivers/filesystems/fastfat/dirwr.c
+++ b/drivers/filesystems/fastfat/dirwr.c
@@ -16,23 +16,105 @@
#define NDEBUG
#include <debug.h>
+#ifdef KDBG
+extern UNICODE_STRING DebugFile;
+#endif
+
+NTSTATUS
+vfatFCBInitializeCacheFromVolume(
+ PVCB vcb,
+ PVFATFCB fcb)
+{
+ PFILE_OBJECT fileObject;
+ PVFATCCB newCCB;
+ NTSTATUS status;
+ BOOLEAN Acquired;
+
+ /* Don't re-initialize if already done */
+ if (BooleanFlagOn(fcb->Flags, FCB_CACHE_INITIALIZED))
+ {
+ return STATUS_SUCCESS;
+ }
+
+ ASSERT(vfatFCBIsDirectory(fcb));
+
+ Acquired = FALSE;
+ if (!ExIsResourceAcquiredExclusive(&vcb->DirResource))
+ {
+ ExAcquireResourceExclusiveLite(&vcb->DirResource, TRUE);
+ Acquired = TRUE;
+ }
+
+ fileObject = IoCreateStreamFileObject (NULL, vcb->StorageDevice);
+
+#ifdef KDBG
+ if (DebugFile.Buffer != NULL && FsRtlIsNameInExpression(&DebugFile,
&fcb->LongNameU, FALSE, NULL))
+ {
+ DPRINT1("Attaching %p to %p (%d)\n", fcb, fileObject,
fcb->RefCount);
+ }
+#endif
+
+ newCCB =
ExAllocateFromNPagedLookasideList(&VfatGlobalData->CcbLookasideList);
+ if (newCCB == NULL)
+ {
+ ObDereferenceObject(fileObject);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+ RtlZeroMemory(newCCB, sizeof (VFATCCB));
+
+ fileObject->SectionObjectPointer = &fcb->SectionObjectPointers;
+ fileObject->FsContext = fcb;
+ fileObject->FsContext2 = newCCB;
+ fileObject->Vpb = vcb->IoVPB;
+ fcb->FileObject = fileObject;
+
+ _SEH2_TRY
+ {
+ CcInitializeCacheMap(fileObject,
+ (PCC_FILE_SIZES)(&fcb->RFCB.AllocationSize),
+ TRUE,
+ &VfatGlobalData->CacheMgrCallbacks,
+ fcb);
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ status = _SEH2_GetExceptionCode();
+ fcb->FileObject = NULL;
+ ExFreeToNPagedLookasideList(&VfatGlobalData->CcbLookasideList, newCCB);
+ ObDereferenceObject(fileObject);
+ return status;
+ }
+ _SEH2_END;
+
+ vfatGrabFCB(vcb, fcb);
+ SetFlag(fcb->Flags, FCB_CACHE_INITIALIZED);
+
+ if (Acquired)
+ {
+ ExReleaseResourceLite(&vcb->DirResource);
+ }
+
+ return STATUS_SUCCESS;
+}
+
/*
* update an existing FAT entry
*/
NTSTATUS
VfatUpdateEntry(
- IN PVFATFCB pFcb,
- IN BOOLEAN IsFatX)
+ IN PDEVICE_EXTENSION DeviceExt,
+ IN PVFATFCB pFcb)
{
PVOID Context;
PDIR_ENTRY PinEntry;
LARGE_INTEGER Offset;
ULONG SizeDirEntry;
ULONG dirIndex;
+ NTSTATUS Status;
ASSERT(pFcb);
- if (IsFatX)
+ if (vfatVolumeIsFatX(DeviceExt))
{
SizeDirEntry = sizeof(FATX_DIR_ENTRY);
dirIndex = pFcb->startIndex;
@@ -52,6 +134,12 @@ VfatUpdateEntry(
ASSERT(pFcb->parentFcb);
+ Status = vfatFCBInitializeCacheFromVolume(DeviceExt, pFcb->parentFcb);
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+
Offset.u.HighPart = 0;
Offset.u.LowPart = dirIndex * SizeDirEntry;
_SEH2_TRY
@@ -91,6 +179,12 @@ vfatRenameEntry(
DPRINT("vfatRenameEntry(%p, %p, %wZ, %d)\n", DeviceExt, pFcb, FileName,
CaseChangeOnly);
+ Status = vfatFCBInitializeCacheFromVolume(DeviceExt, pFcb->parentFcb);
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+
if (vfatVolumeIsFatX(DeviceExt))
{
VFAT_DIRENTRY_CONTEXT DirContext;
@@ -120,6 +214,7 @@ vfatRenameEntry(
pDirEntry->FilenameLength = (unsigned char)NameA.Length;
/* Update FCB */
+ DirContext.DeviceExt = DeviceExt;
DirContext.ShortNameU.Length = 0;
DirContext.ShortNameU.MaximumLength = 0;
DirContext.ShortNameU.Buffer = NULL;
@@ -169,6 +264,12 @@ vfatFindDirSpace(
else
SizeDirEntry = sizeof(FAT_DIR_ENTRY);
+ Status = vfatFCBInitializeCacheFromVolume(DeviceExt, pDirFcb);
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+
count = pDirFcb->RFCB.FileSize.u.LowPart / SizeDirEntry;
size = DeviceExt->FatInfo.BytesPerCluster / SizeDirEntry;
for (i = 0; i < count; i++, pFatEntry = (PDIR_ENTRY)((ULONG_PTR)pFatEntry +
SizeDirEntry))
@@ -343,6 +444,7 @@ FATAddEntry(
NameA.Length = 0;
NameA.MaximumLength = sizeof(aName);
+ DirContext.DeviceExt = DeviceExt;
DirContext.ShortNameU.Buffer = ShortNameBuffer;
DirContext.ShortNameU.Length = 0;
DirContext.ShortNameU.MaximumLength = sizeof(ShortNameBuffer);
@@ -359,6 +461,7 @@ FATAddEntry(
needTilde = TRUE;
needLong = TRUE;
RtlZeroMemory(&NameContext, sizeof(GENERATE_NAME_CONTEXT));
+ SearchContext.DeviceExt = DeviceExt;
SearchContext.LongNameU.Buffer = LongNameBuffer;
SearchContext.LongNameU.MaximumLength = sizeof(LongNameBuffer);
SearchContext.ShortNameU.Buffer = ShortSearchName;
@@ -577,6 +680,8 @@ FATAddEntry(
DirContext.DirEntry.Fat.FirstCluster = (unsigned short)CurrentCluster;
}
+ /* No need to init cache here, vfatFindDirSpace() will have done it for us */
+
i = DeviceExt->FatInfo.BytesPerCluster / sizeof(FAT_DIR_ENTRY);
FileOffset.u.HighPart = 0;
FileOffset.u.LowPart = DirContext.StartIndex * sizeof(FAT_DIR_ENTRY);
@@ -659,6 +764,12 @@ FATAddEntry(
if (IsDirectory)
{
+ Status = vfatFCBInitializeCacheFromVolume(DeviceExt, (*Fcb));
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+
FileOffset.QuadPart = 0;
_SEH2_TRY
{
@@ -741,6 +852,7 @@ FATXAddEntry(
DirContext.ShortNameU.Buffer = 0;
DirContext.ShortNameU.Length = 0;
DirContext.ShortNameU.MaximumLength = 0;
+ DirContext.DeviceExt = DeviceExt;
RtlZeroMemory(&DirContext.DirEntry.FatX, sizeof(FATX_DIR_ENTRY));
memset(DirContext.DirEntry.FatX.Filename, 0xff, 42);
/* Use cluster, if moving */
@@ -784,6 +896,8 @@ FATXAddEntry(
DirContext.DirEntry.FatX.FileSize = MoveContext->FileSize;
}
+ /* No need to init cache here, vfatFindDirSpace() will have done it for us */
+
/* add entry into parent directory */
FileOffset.u.HighPart = 0;
FileOffset.u.LowPart = Index * sizeof(FATX_DIR_ENTRY);
@@ -829,10 +943,17 @@ FATDelEntry(
PVOID Context = NULL;
LARGE_INTEGER Offset;
PFAT_DIR_ENTRY pDirEntry = NULL;
+ NTSTATUS Status;
ASSERT(pFcb);
ASSERT(pFcb->parentFcb);
+ Status = vfatFCBInitializeCacheFromVolume(DeviceExt, pFcb->parentFcb);
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+
DPRINT("delEntry PathName \'%wZ\'\n", &pFcb->PathNameU);
DPRINT("delete entry: %u to %u\n", pFcb->startIndex,
pFcb->dirIndex);
Offset.u.HighPart = 0;
@@ -910,6 +1031,7 @@ FATXDelEntry(
LARGE_INTEGER Offset;
PFATX_DIR_ENTRY pDirEntry;
ULONG StartIndex;
+ NTSTATUS Status;
ASSERT(pFcb);
ASSERT(pFcb->parentFcb);
@@ -917,6 +1039,12 @@ FATXDelEntry(
StartIndex = pFcb->startIndex;
+ Status = vfatFCBInitializeCacheFromVolume(DeviceExt, pFcb->parentFcb);
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+
DPRINT("delEntry PathName \'%wZ\'\n", &pFcb->PathNameU);
DPRINT("delete entry: %u\n", StartIndex);
Offset.u.HighPart = 0;
@@ -1004,8 +1132,8 @@ VfatMoveEntry(
return Status;
}
-extern BOOLEAN FATXIsDirectoryEmpty(PVFATFCB Fcb);
-extern BOOLEAN FATIsDirectoryEmpty(PVFATFCB Fcb);
+extern BOOLEAN FATXIsDirectoryEmpty(PDEVICE_EXTENSION DeviceExt, PVFATFCB Fcb);
+extern BOOLEAN FATIsDirectoryEmpty(PDEVICE_EXTENSION DeviceExt, PVFATFCB Fcb);
extern NTSTATUS FATGetNextDirEntry(PVOID *pContext, PVOID *pPage, PVFATFCB pDirFcb,
PVFAT_DIRENTRY_CONTEXT DirContext, BOOLEAN First);
extern NTSTATUS FATXGetNextDirEntry(PVOID *pContext, PVOID *pPage, PVFATFCB pDirFcb,
PVFAT_DIRENTRY_CONTEXT DirContext, BOOLEAN First);
diff --git a/drivers/filesystems/fastfat/fcb.c b/drivers/filesystems/fastfat/fcb.c
index 35bb675795..89c8dc2ad2 100644
--- a/drivers/filesystems/fastfat/fcb.c
+++ b/drivers/filesystems/fastfat/fcb.c
@@ -640,62 +640,6 @@ vfatGrabFCBFromTable(
return NULL;
}
-static
-NTSTATUS
-vfatFCBInitializeCacheFromVolume(
- PVCB vcb,
- PVFATFCB fcb)
-{
- PFILE_OBJECT fileObject;
- PVFATCCB newCCB;
- NTSTATUS status;
-
- fileObject = IoCreateStreamFileObject (NULL, vcb->StorageDevice);
-
-#ifdef KDBG
- if (DebugFile.Buffer != NULL && FsRtlIsNameInExpression(&DebugFile,
&fcb->LongNameU, FALSE, NULL))
- {
- DPRINT1("Attaching %p to %p (%d)\n", fcb, fileObject,
fcb->RefCount);
- }
-#endif
-
- newCCB =
ExAllocateFromNPagedLookasideList(&VfatGlobalData->CcbLookasideList);
- if (newCCB == NULL)
- {
- ObDereferenceObject(fileObject);
- return STATUS_INSUFFICIENT_RESOURCES;
- }
- RtlZeroMemory(newCCB, sizeof (VFATCCB));
-
- fileObject->SectionObjectPointer = &fcb->SectionObjectPointers;
- fileObject->FsContext = fcb;
- fileObject->FsContext2 = newCCB;
- fileObject->Vpb = vcb->IoVPB;
- fcb->FileObject = fileObject;
-
- _SEH2_TRY
- {
- CcInitializeCacheMap(fileObject,
- (PCC_FILE_SIZES)(&fcb->RFCB.AllocationSize),
- TRUE,
- &VfatGlobalData->CacheMgrCallbacks,
- fcb);
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- status = _SEH2_GetExceptionCode();
- fcb->FileObject = NULL;
- ExFreeToNPagedLookasideList(&VfatGlobalData->CcbLookasideList, newCCB);
- ObDereferenceObject(fileObject);
- return status;
- }
- _SEH2_END;
-
- vfatGrabFCB(vcb, fcb);
- SetFlag(fcb->Flags, FCB_CACHE_INITIALIZED);
- return STATUS_SUCCESS;
-}
-
PVFATFCB
vfatMakeRootFCB(
PDEVICE_EXTENSION pVCB)
@@ -788,16 +732,6 @@ vfatMakeFCBFromDirEntry(
vfatInitFCBFromDirEntry(vcb, rcFCB, DirContext);
rcFCB->RefCount = 1;
- if (vfatFCBIsDirectory(rcFCB))
- {
- Status = vfatFCBInitializeCacheFromVolume(vcb, rcFCB);
- if (!NT_SUCCESS(Status))
- {
- vfatReleaseFCB(vcb, rcFCB);
- ExFreePoolWithTag(NameU.Buffer, TAG_FCB);
- return Status;
- }
- }
rcFCB->parentFcb = directoryFCB;
InsertTailList(&directoryFCB->ParentListHead,
&rcFCB->ParentListEntry);
vfatAddFCBToTable(vcb, rcFCB);
@@ -880,6 +814,7 @@ vfatDirFindFile(
DirContext.ShortNameU.Buffer = ShortNameBuffer;
DirContext.ShortNameU.Length = 0;
DirContext.ShortNameU.MaximumLength = sizeof(ShortNameBuffer);
+ DirContext.DeviceExt = pDeviceExt;
while (TRUE)
{
diff --git a/drivers/filesystems/fastfat/finfo.c b/drivers/filesystems/fastfat/finfo.c
index 97067b929f..d860cd641b 100644
--- a/drivers/filesystems/fastfat/finfo.c
+++ b/drivers/filesystems/fastfat/finfo.c
@@ -265,7 +265,7 @@ VfatSetBasicInformation(
}
}
- VfatUpdateEntry(FCB, vfatVolumeIsFatX(DeviceExt));
+ VfatUpdateEntry(DeviceExt, FCB);
if (NotifyFilter != 0)
{
@@ -1407,7 +1407,7 @@ VfatSetAllocationSizeInformation(
Fcb->Flags |= FCB_IS_DIRTY;
if (AllocSizeChanged)
{
- VfatUpdateEntry(Fcb, vfatVolumeIsFatX(DeviceExt));
+ VfatUpdateEntry(DeviceExt, Fcb);
vfatReportChange(DeviceExt, Fcb, FILE_NOTIFY_CHANGE_SIZE, FILE_ACTION_MODIFIED);
}
diff --git a/drivers/filesystems/fastfat/flush.c b/drivers/filesystems/fastfat/flush.c
index 0629491416..ebf1925172 100644
--- a/drivers/filesystems/fastfat/flush.c
+++ b/drivers/filesystems/fastfat/flush.c
@@ -35,7 +35,7 @@ VfatFlushFile(
if (BooleanFlagOn(Fcb->Flags, FCB_IS_DIRTY))
{
- Status = VfatUpdateEntry(Fcb, vfatVolumeIsFatX(DeviceExt));
+ Status = VfatUpdateEntry(DeviceExt, Fcb);
if (!NT_SUCCESS(Status))
{
IoStatus.Status = Status;
diff --git a/drivers/filesystems/fastfat/vfat.h b/drivers/filesystems/fastfat/vfat.h
index e58b61bb57..1f2939577c 100644
--- a/drivers/filesystems/fastfat/vfat.h
+++ b/drivers/filesystems/fastfat/vfat.h
@@ -281,7 +281,7 @@ typedef NTSTATUS
(*PGET_NEXT_CLUSTER)(PDEVICE_EXTENSION,ULONG,PULONG);
typedef NTSTATUS (*PFIND_AND_MARK_AVAILABLE_CLUSTER)(PDEVICE_EXTENSION,PULONG);
typedef NTSTATUS (*PWRITE_CLUSTER)(PDEVICE_EXTENSION,ULONG,ULONG,PULONG);
-typedef BOOLEAN (*PIS_DIRECTORY_EMPTY)(struct _VFATFCB*);
+typedef BOOLEAN (*PIS_DIRECTORY_EMPTY)(PDEVICE_EXTENSION,struct _VFATFCB*);
typedef NTSTATUS (*PADD_ENTRY)(PDEVICE_EXTENSION,PUNICODE_STRING,struct _VFATFCB**,struct
_VFATFCB*,ULONG,UCHAR,struct _VFAT_MOVE_CONTEXT*);
typedef NTSTATUS (*PDEL_ENTRY)(PDEVICE_EXTENSION,struct _VFATFCB*,struct
_VFAT_MOVE_CONTEXT*);
typedef NTSTATUS (*PGET_NEXT_DIR_ENTRY)(PVOID*,PVOID*,struct _VFATFCB*,struct
_VFAT_DIRENTRY_CONTEXT*,BOOLEAN);
@@ -352,7 +352,7 @@ BOOLEAN
VfatIsDirectoryEmpty(PDEVICE_EXTENSION DeviceExt,
struct _VFATFCB* Fcb)
{
- return DeviceExt->Dispatch.IsDirectoryEmpty(Fcb);
+ return DeviceExt->Dispatch.IsDirectoryEmpty(DeviceExt, Fcb);
}
FORCEINLINE
@@ -570,6 +570,7 @@ typedef struct _VFAT_DIRENTRY_CONTEXT
DIR_ENTRY DirEntry;
UNICODE_STRING LongNameU;
UNICODE_STRING ShortNameU;
+ PDEVICE_EXTENSION DeviceExt;
} VFAT_DIRENTRY_CONTEXT, *PVFAT_DIRENTRY_CONTEXT;
typedef struct _VFAT_MOVE_CONTEXT
@@ -736,10 +737,15 @@ vfatDirEntryGetFirstCluster(
/* dirwr.c */
+NTSTATUS
+vfatFCBInitializeCacheFromVolume(
+ PVCB vcb,
+ PVFATFCB fcb);
+
NTSTATUS
VfatUpdateEntry(
- PVFATFCB pFcb,
- IN BOOLEAN IsFatX);
+ IN PDEVICE_EXTENSION DeviceExt,
+ PVFATFCB pFcb);
BOOLEAN
vfatFindDirSpace(