ReactOS  0.4.15-dev-5500-g82cf6c2
fcb.c File Reference
#include "vfat.h"
#include <debug.h>
Include dependency graph for fcb.c:

Go to the source code of this file.

Macros

#define NDEBUG
 

Functions

static ULONG vfatNameHash (ULONG hash, PUNICODE_STRING NameU)
 
VOID vfatSplitPathName (PUNICODE_STRING PathNameU, PUNICODE_STRING DirNameU, PUNICODE_STRING FileNameU)
 
static VOID vfatInitFcb (PVFATFCB Fcb, PUNICODE_STRING NameU)
 
PVFATFCB vfatNewFCB (PDEVICE_EXTENSION pVCB, PUNICODE_STRING pFileNameU)
 
static VOID vfatDelFCBFromTable (PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
 
static NTSTATUS vfatMakeFullName (PVFATFCB directoryFCB, PUNICODE_STRING LongNameU, PUNICODE_STRING ShortNameU, PUNICODE_STRING NameU)
 
VOID vfatDestroyCCB (PVFATCCB pCcb)
 
VOID vfatDestroyFCB (PVFATFCB pFCB)
 
BOOLEAN vfatFCBIsRoot (PVFATFCB FCB)
 
VOID vfatGrabFCB (PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
 
VOID vfatReleaseFCB (PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
 
static VOID vfatAddFCBToTable (PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
 
static VOID vfatInitFCBFromDirEntry (PDEVICE_EXTENSION Vcb, PVFATFCB ParentFcb, PVFATFCB Fcb, PVFAT_DIRENTRY_CONTEXT DirContext)
 
NTSTATUS vfatSetFCBNewDirName (PDEVICE_EXTENSION pVCB, PVFATFCB Fcb, PVFATFCB ParentFcb)
 
NTSTATUS vfatUpdateFCB (PDEVICE_EXTENSION pVCB, PVFATFCB Fcb, PVFAT_DIRENTRY_CONTEXT DirContext, PVFATFCB ParentFcb)
 
PVFATFCB vfatGrabFCBFromTable (PDEVICE_EXTENSION pVCB, PUNICODE_STRING PathNameU)
 
PVFATFCB vfatMakeRootFCB (PDEVICE_EXTENSION pVCB)
 
PVFATFCB vfatOpenRootFCB (PDEVICE_EXTENSION pVCB)
 
NTSTATUS vfatMakeFCBFromDirEntry (PVCB vcb, PVFATFCB directoryFCB, PVFAT_DIRENTRY_CONTEXT DirContext, PVFATFCB *fileFCB)
 
NTSTATUS vfatAttachFCBToFileObject (PDEVICE_EXTENSION vcb, PVFATFCB fcb, PFILE_OBJECT fileObject)
 
NTSTATUS vfatDirFindFile (PDEVICE_EXTENSION pDeviceExt, PVFATFCB pDirectoryFCB, PUNICODE_STRING FileToFindU, PVFATFCB *pFoundFCB)
 
NTSTATUS vfatGetFCBForFile (PDEVICE_EXTENSION pVCB, PVFATFCB *pParentFCB, PVFATFCB *pFCB, PUNICODE_STRING pFileNameU)
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 15 of file fcb.c.

Function Documentation

◆ vfatAddFCBToTable()

static VOID vfatAddFCBToTable ( PDEVICE_EXTENSION  pVCB,
PVFATFCB  pFCB 
)
static

Definition at line 400 of file fcb.c.

403 {
404  ULONG Index;
405  ULONG ShortIndex;
406 
407  ASSERT(pFCB->Hash.Hash == vfatNameHash(0, &pFCB->PathNameU));
408  Index = pFCB->Hash.Hash % pVCB->HashTableSize;
409  ShortIndex = pFCB->ShortHash.Hash % pVCB->HashTableSize;
410 
411  InsertTailList(&pVCB->FcbListHead, &pFCB->FcbListEntry);
412 
413  pFCB->Hash.next = pVCB->FcbHashTable[Index];
414  pVCB->FcbHashTable[Index] = &pFCB->Hash;
415  if (pFCB->Hash.Hash != pFCB->ShortHash.Hash)
416  {
417  pFCB->ShortHash.next = pVCB->FcbHashTable[ShortIndex];
418  pVCB->FcbHashTable[ShortIndex] = &pFCB->ShortHash;
419  }
420  if (pFCB->parentFcb)
421  {
422  vfatGrabFCB(pVCB, pFCB->parentFcb);
423  }
424 }
LIST_ENTRY FcbListEntry
Definition: vfat.h:484
VOID vfatGrabFCB(PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
Definition: fcb.c:301
#define InsertTailList(ListHead, Entry)
#define ASSERT(a)
Definition: mode.c:44
struct _VFATFCB * parentFcb
Definition: vfat.h:490
_In_ WDFCOLLECTION _In_ ULONG Index
struct _HASHENTRY * next
Definition: vfat.h:279
ULONG Hash
Definition: vfat.h:277
HASHENTRY ShortHash
Definition: vfat.h:517
static ULONG vfatNameHash(ULONG hash, PUNICODE_STRING NameU)
Definition: fcb.c:32
UNICODE_STRING PathNameU
Definition: vfat.h:472
unsigned int ULONG
Definition: retypes.h:1
HASHENTRY Hash
Definition: vfat.h:514

Referenced by vfatMakeFCBFromDirEntry(), vfatMakeRootFCB(), vfatSetFCBNewDirName(), and vfatUpdateFCB().

◆ vfatAttachFCBToFileObject()

NTSTATUS vfatAttachFCBToFileObject ( PDEVICE_EXTENSION  vcb,
PVFATFCB  fcb,
PFILE_OBJECT  fileObject 
)

Definition at line 754 of file fcb.c.

758 {
759  PVFATCCB newCCB;
760 
761 #ifdef KDBG
762  if (DebugFile.Buffer != NULL && FsRtlIsNameInExpression(&DebugFile, &fcb->LongNameU, FALSE, NULL))
763  {
764  DPRINT1("Attaching %p to %p (%d)\n", fcb, fileObject, fcb->RefCount);
765  }
766 #endif
767 
768  newCCB = ExAllocateFromNPagedLookasideList(&VfatGlobalData->CcbLookasideList);
769  if (newCCB == NULL)
770  {
772  }
773  RtlZeroMemory(newCCB, sizeof (VFATCCB));
774 
775  fileObject->SectionObjectPointer = &fcb->SectionObjectPointers;
776  fileObject->FsContext = fcb;
777  fileObject->FsContext2 = newCCB;
778  fileObject->Vpb = vcb->IoVPB;
779  DPRINT("file open: fcb:%p PathName:%wZ\n", fcb, &fcb->PathNameU);
780 
781 #ifdef KDBG
782  fcb->Flags &= ~FCB_CLEANED_UP;
783  fcb->Flags &= ~FCB_CLOSED;
784 #endif
785 
786  return STATUS_SUCCESS;
787 }
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
Definition: vfat.h:536
BOOLEAN NTAPI FsRtlIsNameInExpression(IN PUNICODE_STRING Expression, IN PUNICODE_STRING Name, IN BOOLEAN IgnoreCase, IN PWCHAR UpcaseTable OPTIONAL)
Definition: name.c:514
#define FALSE
Definition: types.h:117
NPAGED_LOOKASIDE_LIST CcbLookasideList
Definition: vfat.h:418
struct _fcb fcb
Definition: btrfs_drv.h:1364
PVFAT_GLOBAL_DATA VfatGlobalData
Definition: iface.c:18
#define NULL
Definition: types.h:112
#define DPRINT1
Definition: precomp.h:8
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:71

Referenced by VfatCreateFile(), VfatMount(), and VfatOpenFile().

◆ vfatDelFCBFromTable()

static VOID vfatDelFCBFromTable ( PDEVICE_EXTENSION  pVCB,
PVFATFCB  pFCB 
)
static

Definition at line 164 of file fcb.c.

167 {
168  ULONG Index;
169  ULONG ShortIndex;
170  HASHENTRY* entry;
171 
172  Index = pFCB->Hash.Hash % pVCB->HashTableSize;
173  ShortIndex = pFCB->ShortHash.Hash % pVCB->HashTableSize;
174 
175  if (pFCB->Hash.Hash != pFCB->ShortHash.Hash)
176  {
177  entry = pVCB->FcbHashTable[ShortIndex];
178  if (entry->self == pFCB)
179  {
180  pVCB->FcbHashTable[ShortIndex] = entry->next;
181  }
182  else
183  {
184  while (entry->next->self != pFCB)
185  {
186  entry = entry->next;
187  }
188  entry->next = pFCB->ShortHash.next;
189  }
190  }
191  entry = pVCB->FcbHashTable[Index];
192  if (entry->self == pFCB)
193  {
194  pVCB->FcbHashTable[Index] = entry->next;
195  }
196  else
197  {
198  while (entry->next->self != pFCB)
199  {
200  entry = entry->next;
201  }
202  entry->next = pFCB->Hash.next;
203  }
204 
206 }
LIST_ENTRY FcbListEntry
Definition: vfat.h:484
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
Definition: rtlfuncs.h:105
_In_ WDFCOLLECTION _In_ ULONG Index
struct _HASHENTRY * next
Definition: vfat.h:279
ULONG Hash
Definition: vfat.h:277
uint32_t entry
Definition: isohybrid.c:63
HASHENTRY ShortHash
Definition: vfat.h:517
unsigned int ULONG
Definition: retypes.h:1
HASHENTRY Hash
Definition: vfat.h:514

Referenced by vfatReleaseFCB(), vfatSetFCBNewDirName(), and vfatUpdateFCB().

◆ vfatDestroyCCB()

VOID vfatDestroyCCB ( PVFATCCB  pCcb)

Definition at line 257 of file fcb.c.

259 {
260  if (pCcb->SearchPattern.Buffer)
261  {
263  }
264  ExFreeToNPagedLookasideList(&VfatGlobalData->CcbLookasideList, pCcb);
265 }
UNICODE_STRING SearchPattern
Definition: vfat.h:543
NPAGED_LOOKASIDE_LIST CcbLookasideList
Definition: vfat.h:418
#define TAG_SEARCH
Definition: vfat.h:554
PVFAT_GLOBAL_DATA VfatGlobalData
Definition: iface.c:18
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099

Referenced by VfatCloseFile(), and VfatMount().

◆ vfatDestroyFCB()

VOID vfatDestroyFCB ( PVFATFCB  pFCB)

Definition at line 268 of file fcb.c.

270 {
271 #ifdef KDBG
272  if (DebugFile.Buffer != NULL && FsRtlIsNameInExpression(&DebugFile, &pFCB->LongNameU, FALSE, NULL))
273  {
274  DPRINT1("Destroying: %p (%wZ) %d\n", pFCB, &pFCB->PathNameU, pFCB->RefCount);
275  }
276 #endif
277 
279 
280  if (!vfatFCBIsRoot(pFCB) &&
282  {
284  }
285  ExFreePool(pFCB->PathNameBuffer);
289  ExFreeToNPagedLookasideList(&VfatGlobalData->FcbLookasideList, pFCB);
290 }
NPAGED_LOOKASIDE_LIST FcbLookasideList
Definition: vfat.h:417
#define BooleanFlagOn(F, SF)
Definition: ext2fs.h:183
VOID NTAPI FsRtlUninitializeFileLock(IN PFILE_LOCK FileLock)
Definition: filelock.c:1279
NTSTATUS NTAPI ExDeleteResourceLite(IN PERESOURCE Resource)
Definition: resource.c:1456
UNICODE_STRING LongNameU
Definition: vfat.h:463
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
Definition: rtlfuncs.h:57
BOOLEAN NTAPI FsRtlIsNameInExpression(IN PUNICODE_STRING Expression, IN PUNICODE_STRING Name, IN BOOLEAN IgnoreCase, IN PWCHAR UpcaseTable OPTIONAL)
Definition: name.c:514
LONG RefCount
Definition: vfat.h:481
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
Definition: rtlfuncs.h:105
#define FALSE
Definition: types.h:117
ULONG Flags
Definition: vfat.h:496
BOOLEAN vfatFCBIsRoot(PVFATFCB FCB)
Definition: fcb.c:293
#define ASSERT(a)
Definition: mode.c:44
FILE_LOCK FileLock
Definition: vfat.h:520
#define FCB_IS_FAT
Definition: vfat.h:435
PWCHAR PathNameBuffer
Definition: vfat.h:475
ERESOURCE PagingIoResource
Definition: vfat.h:453
PVFAT_GLOBAL_DATA VfatGlobalData
Definition: iface.c:18
#define NULL
Definition: types.h:112
#define FCB_IS_VOLUME
Definition: ntfs.h:510
ERESOURCE MainResource
Definition: vfat.h:452
#define DPRINT1
Definition: precomp.h:8
UNICODE_STRING PathNameU
Definition: vfat.h:472
LIST_ENTRY ParentListHead
Definition: vfat.h:493
#define ExFreePool(addr)
Definition: env_spec_w32.h:352
LIST_ENTRY ParentListEntry
Definition: vfat.h:487

Referenced by VfatCheckForDismount(), VfatDismountVolume(), VfatMount(), and vfatReleaseFCB().

◆ vfatDirFindFile()

NTSTATUS vfatDirFindFile ( PDEVICE_EXTENSION  pDeviceExt,
PVFATFCB  pDirectoryFCB,
PUNICODE_STRING  FileToFindU,
PVFATFCB pFoundFCB 
)

Definition at line 790 of file fcb.c.

795 {
797  PVOID Context = NULL;
798  PVOID Page = NULL;
799  BOOLEAN First = TRUE;
801  /* This buffer must have a size of 260 characters, because
802  vfatMakeFCBFromDirEntry can copy 20 name entries with 13 characters. */
803  WCHAR LongNameBuffer[260];
804  WCHAR ShortNameBuffer[13];
805  BOOLEAN FoundLong = FALSE;
806  BOOLEAN FoundShort = FALSE;
807  BOOLEAN IsFatX = vfatVolumeIsFatX(pDeviceExt);
808 
809  ASSERT(pDeviceExt);
810  ASSERT(pDirectoryFCB);
811  ASSERT(FileToFindU);
812 
813  DPRINT("vfatDirFindFile(VCB:%p, dirFCB:%p, File:%wZ)\n",
814  pDeviceExt, pDirectoryFCB, FileToFindU);
815  DPRINT("Dir Path:%wZ\n", &pDirectoryFCB->PathNameU);
816 
817  DirContext.DirIndex = 0;
818  DirContext.LongNameU.Buffer = LongNameBuffer;
819  DirContext.LongNameU.Length = 0;
820  DirContext.LongNameU.MaximumLength = sizeof(LongNameBuffer);
821  DirContext.ShortNameU.Buffer = ShortNameBuffer;
822  DirContext.ShortNameU.Length = 0;
823  DirContext.ShortNameU.MaximumLength = sizeof(ShortNameBuffer);
824  DirContext.DeviceExt = pDeviceExt;
825 
826  while (TRUE)
827  {
828  status = VfatGetNextDirEntry(pDeviceExt,
829  &Context,
830  &Page,
831  pDirectoryFCB,
832  &DirContext,
833  First);
834  First = FALSE;
836  {
838  }
839  if (!NT_SUCCESS(status))
840  {
841  return status;
842  }
843 
844  DPRINT(" Index:%u longName:%wZ\n",
845  DirContext.DirIndex, &DirContext.LongNameU);
846 
847  if (!ENTRY_VOLUME(IsFatX, &DirContext.DirEntry))
848  {
849  if (DirContext.LongNameU.Length == 0 ||
850  DirContext.ShortNameU.Length == 0)
851  {
852  DPRINT1("WARNING: File system corruption detected. You may need to run a disk repair utility.\n");
854  {
855  ASSERT(DirContext.LongNameU.Length != 0 &&
856  DirContext.ShortNameU.Length != 0);
857  }
859  continue;
860  }
861  FoundLong = RtlEqualUnicodeString(FileToFindU, &DirContext.LongNameU, TRUE);
862  if (FoundLong == FALSE)
863  {
864  FoundShort = RtlEqualUnicodeString(FileToFindU, &DirContext.ShortNameU, TRUE);
865  }
866  if (FoundLong || FoundShort)
867  {
868  status = vfatMakeFCBFromDirEntry(pDeviceExt,
869  pDirectoryFCB,
870  &DirContext,
871  pFoundFCB);
873  return status;
874  }
875  }
877  }
878 
880 }
#define STATUS_NO_MORE_ENTRIES
Definition: ntstatus.h:205
#define TRUE
Definition: types.h:120
LONG NTSTATUS
Definition: precomp.h:26
VOID NTAPI CcUnpinData(IN PVOID Bcb)
Definition: pinsup.c:955
ULONG DirIndex
Definition: ntfs.h:533
#define ENTRY_VOLUME(IsFatX, DirEntry)
Definition: vfat.h:206
WCHAR First[]
Definition: FormatMessage.c:11
_In_ PVOID _Out_opt_ BOOLEAN _Out_opt_ PPFN_NUMBER Page
Definition: mm.h:1295
#define FALSE
Definition: types.h:117
NTSTATUS vfatMakeFCBFromDirEntry(PVCB vcb, PVFATFCB directoryFCB, PVFAT_DIRENTRY_CONTEXT DirContext, PVFATFCB *fileFCB)
Definition: fcb.c:725
unsigned char BOOLEAN
FORCEINLINE BOOLEAN vfatVolumeIsFatX(PDEVICE_EXTENSION DeviceExt)
Definition: vfat.h:651
#define ASSERT(a)
Definition: mode.c:44
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
_In_ PFCB _In_ PDIRENT_ENUM_CONTEXT DirContext
Definition: cdprocs.h:424
FORCEINLINE NTSTATUS VfatGetNextDirEntry(PDEVICE_EXTENSION DeviceExt, PVOID *pContext, PVOID *pPage, struct _VFATFCB *pDirFcb, struct _VFAT_DIRENTRY_CONTEXT *DirContext, BOOLEAN First)
Definition: vfat.h:397
#define VFAT_BREAK_ON_CORRUPTION
Definition: vfat.h:407
#define STATUS_OBJECT_NAME_NOT_FOUND
Definition: udferr_usr.h:149
PVFAT_GLOBAL_DATA VfatGlobalData
Definition: iface.c:18
#define NULL
Definition: types.h:112
ULONG Flags
Definition: vfat.h:413
#define DPRINT1
Definition: precomp.h:8
UNICODE_STRING PathNameU
Definition: vfat.h:472
#define DPRINT
Definition: sndvol32.h:71
static SERVICE_STATUS status
Definition: service.c:31
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
Definition: ps.c:97

Referenced by vfatGetFCBForFile().

◆ vfatFCBIsRoot()

BOOLEAN vfatFCBIsRoot ( PVFATFCB  FCB)

Definition at line 293 of file fcb.c.

295 {
296  return FCB->PathNameU.Length == sizeof(WCHAR) && FCB->PathNameU.Buffer[0] == L'\\' ? TRUE : FALSE;
297 }
#define TRUE
Definition: types.h:120
Definition: cdstruc.h:902
#define L(x)
Definition: ntvdm.h:50
#define FALSE
Definition: types.h:117
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by FATAddEntry(), FATIsDirectoryEmpty(), FATXAddEntry(), FATXGetNextDirEntry(), FindFile(), vfatDestroyFCB(), vfatFindDirSpace(), vfatInitFCBFromDirEntry(), vfatMakeFullName(), VfatOpenFile(), VfatSetDispositionInformation(), VfatSetRenameInformation(), and VfatUpdateEntry().

◆ vfatGetFCBForFile()

NTSTATUS vfatGetFCBForFile ( PDEVICE_EXTENSION  pVCB,
PVFATFCB pParentFCB,
PVFATFCB pFCB,
PUNICODE_STRING  pFileNameU 
)

Definition at line 883 of file fcb.c.

888 {
890  PVFATFCB FCB = NULL;
891  PVFATFCB parentFCB;
892  UNICODE_STRING NameU;
893  UNICODE_STRING RootNameU = RTL_CONSTANT_STRING(L"\\");
894  UNICODE_STRING FileNameU;
895  WCHAR NameBuffer[260];
896  PWCHAR curr, prev, last;
897  ULONG Length;
898 
899  DPRINT("vfatGetFCBForFile (%p,%p,%p,%wZ)\n",
900  pVCB, pParentFCB, pFCB, pFileNameU);
901 
902  RtlInitEmptyUnicodeString(&FileNameU, NameBuffer, sizeof(NameBuffer));
903 
904  parentFCB = *pParentFCB;
905 
906  if (parentFCB == NULL)
907  {
908  /* Passed-in name is the full name */
909  RtlCopyUnicodeString(&FileNameU, pFileNameU);
910 
911  // Trivial case, open of the root directory on volume
912  if (RtlEqualUnicodeString(&FileNameU, &RootNameU, FALSE))
913  {
914  DPRINT("returning root FCB\n");
915 
916  FCB = vfatOpenRootFCB(pVCB);
917  *pFCB = FCB;
918  *pParentFCB = NULL;
919 
921  }
922 
923  /* Check for an existing FCB */
924  FCB = vfatGrabFCBFromTable(pVCB, &FileNameU);
925  if (FCB)
926  {
927  *pFCB = FCB;
928  *pParentFCB = FCB->parentFcb;
929  vfatGrabFCB(pVCB, *pParentFCB);
930  return STATUS_SUCCESS;
931  }
932 
933  last = curr = FileNameU.Buffer + FileNameU.Length / sizeof(WCHAR) - 1;
934  while (*curr != L'\\' && curr > FileNameU.Buffer)
935  {
936  curr--;
937  }
938 
939  if (curr > FileNameU.Buffer)
940  {
941  NameU.Buffer = FileNameU.Buffer;
942  NameU.MaximumLength = NameU.Length = (curr - FileNameU.Buffer) * sizeof(WCHAR);
943  FCB = vfatGrabFCBFromTable(pVCB, &NameU);
944  if (FCB)
945  {
946  Length = (curr - FileNameU.Buffer) * sizeof(WCHAR);
947  if (Length != FCB->PathNameU.Length)
948  {
949  if (FileNameU.Length + FCB->PathNameU.Length - Length > FileNameU.MaximumLength)
950  {
951  vfatReleaseFCB(pVCB, FCB);
953  }
954  RtlMoveMemory(FileNameU.Buffer + FCB->PathNameU.Length / sizeof(WCHAR),
955  curr, FileNameU.Length - Length);
956  FileNameU.Length += (USHORT)(FCB->PathNameU.Length - Length);
957  curr = FileNameU.Buffer + FCB->PathNameU.Length / sizeof(WCHAR);
958  last = FileNameU.Buffer + FileNameU.Length / sizeof(WCHAR) - 1;
959  }
960  RtlCopyMemory(FileNameU.Buffer, FCB->PathNameU.Buffer, FCB->PathNameU.Length);
961  }
962  }
963  else
964  {
965  FCB = NULL;
966  }
967 
968  if (FCB == NULL)
969  {
970  FCB = vfatOpenRootFCB(pVCB);
971  curr = FileNameU.Buffer;
972  }
973 
974  parentFCB = NULL;
975  prev = curr;
976  }
977  else
978  {
979  /* Make absolute path */
980  RtlCopyUnicodeString(&FileNameU, &parentFCB->PathNameU);
981  curr = FileNameU.Buffer + FileNameU.Length / sizeof(WCHAR) - 1;
982  if (*curr != L'\\')
983  {
984  RtlAppendUnicodeToString(&FileNameU, L"\\");
985  curr++;
986  }
987  ASSERT(*curr == L'\\');
988  RtlAppendUnicodeStringToString(&FileNameU, pFileNameU);
989 
990  FCB = parentFCB;
991  parentFCB = NULL;
992  prev = curr;
993  last = FileNameU.Buffer + FileNameU.Length / sizeof(WCHAR) - 1;
994  }
995 
996  while (curr <= last)
997  {
998  if (parentFCB)
999  {
1000  vfatReleaseFCB(pVCB, parentFCB);
1001  parentFCB = NULL;
1002  }
1003  // fail if element in FCB is not a directory
1004  if (!vfatFCBIsDirectory(FCB))
1005  {
1006  DPRINT ("Element in requested path is not a directory\n");
1007 
1008  vfatReleaseFCB(pVCB, FCB);
1009  FCB = NULL;
1010  *pParentFCB = NULL;
1011  *pFCB = NULL;
1012 
1014  }
1015  parentFCB = FCB;
1016  if (prev < curr)
1017  {
1018  Length = (curr - prev) * sizeof(WCHAR);
1019  if (Length != parentFCB->LongNameU.Length)
1020  {
1021  if (FileNameU.Length + parentFCB->LongNameU.Length - Length > FileNameU.MaximumLength)
1022  {
1023  vfatReleaseFCB(pVCB, parentFCB);
1024  *pParentFCB = NULL;
1025  *pFCB = NULL;
1027  }
1028  RtlMoveMemory(prev + parentFCB->LongNameU.Length / sizeof(WCHAR), curr,
1029  FileNameU.Length - (curr - FileNameU.Buffer) * sizeof(WCHAR));
1030  FileNameU.Length += (USHORT)(parentFCB->LongNameU.Length - Length);
1031  curr = prev + parentFCB->LongNameU.Length / sizeof(WCHAR);
1032  last = FileNameU.Buffer + FileNameU.Length / sizeof(WCHAR) - 1;
1033  }
1034  RtlCopyMemory(prev, parentFCB->LongNameU.Buffer, parentFCB->LongNameU.Length);
1035  }
1036  curr++;
1037  prev = curr;
1038  while (*curr != L'\\' && curr <= last)
1039  {
1040  curr++;
1041  }
1042  NameU.Buffer = FileNameU.Buffer;
1043  NameU.Length = (curr - NameU.Buffer) * sizeof(WCHAR);
1044  NameU.MaximumLength = FileNameU.MaximumLength;
1045  DPRINT("%wZ\n", &NameU);
1046  FCB = vfatGrabFCBFromTable(pVCB, &NameU);
1047  if (FCB == NULL)
1048  {
1049  NameU.Buffer = prev;
1050  NameU.MaximumLength = NameU.Length = (curr - prev) * sizeof(WCHAR);
1051  status = vfatDirFindFile(pVCB, parentFCB, &NameU, &FCB);
1053  {
1054  *pFCB = NULL;
1055  if (curr > last)
1056  {
1057  *pParentFCB = parentFCB;
1059  }
1060  else
1061  {
1062  vfatReleaseFCB(pVCB, parentFCB);
1063  *pParentFCB = NULL;
1065  }
1066  }
1067  else if (!NT_SUCCESS(status))
1068  {
1069  vfatReleaseFCB(pVCB, parentFCB);
1070  *pParentFCB = NULL;
1071  *pFCB = NULL;
1072 
1073  return status;
1074  }
1075  }
1076  }
1077 
1078  *pParentFCB = parentFCB;
1079  *pFCB = FCB;
1080 
1081  return STATUS_SUCCESS;
1082 }
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
Definition: vfat.h:447
USHORT MaximumLength
Definition: env_spec_w32.h:370
PVFATFCB vfatOpenRootFCB(PDEVICE_EXTENSION pVCB)
Definition: fcb.c:708
POINT last
Definition: font.c:46
Definition: cdstruc.h:902
LONG NTSTATUS
Definition: precomp.h:26
FORCEINLINE BOOLEAN vfatFCBIsDirectory(PVFATFCB FCB)
Definition: vfat.h:637
UNICODE_STRING LongNameU
Definition: vfat.h:463
VOID vfatGrabFCB(PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
Definition: fcb.c:301
NTSTATUS vfatDirFindFile(PDEVICE_EXTENSION pDeviceExt, PVFATFCB pDirectoryFCB, PUNICODE_STRING FileToFindU, PVFATFCB *pFoundFCB)
Definition: fcb.c:790
uint16_t * PWCHAR
Definition: typedefs.h:56
VOID vfatReleaseFCB(PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
Definition: fcb.c:335
#define RtlMoveMemory(Destination, Source, Length)
Definition: typedefs.h:264
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
#define L(x)
Definition: ntvdm.h:50
#define FALSE
Definition: types.h:117
struct _FCB FCB
NTSTATUS RtlAppendUnicodeToString(IN PUNICODE_STRING Str1, IN PWSTR Str2)
Definition: string_lib.cpp:62
#define ASSERT(a)
Definition: mode.c:44
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define STATUS_OBJECT_PATH_NOT_FOUND
Definition: udferr_usr.h:151
PVFATFCB vfatGrabFCBFromTable(PDEVICE_EXTENSION pVCB, PUNICODE_STRING PathNameU)
Definition: fcb.c:594
#define STATUS_OBJECT_NAME_NOT_FOUND
Definition: udferr_usr.h:149
unsigned short USHORT
Definition: pedump.c:61
NTSYSAPI NTSTATUS NTAPI RtlAppendUnicodeStringToString(PUNICODE_STRING Destination, PUNICODE_STRING Source)
#define STATUS_OBJECT_NAME_INVALID
Definition: udferr_usr.h:148
#define NULL
Definition: types.h:112
UNICODE_STRING PathNameU
Definition: vfat.h:472
unsigned int ULONG
Definition: retypes.h:1
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:71
static SERVICE_STATUS status
Definition: service.c:31
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14
Definition: ps.c:97

Referenced by VfatCreateFile(), VfatOpenFile(), and vfatPrepareTargetForRename().

◆ vfatGrabFCB()

VOID vfatGrabFCB ( PDEVICE_EXTENSION  pVCB,
PVFATFCB  pFCB 
)

Definition at line 301 of file fcb.c.

314 {
315 #ifdef KDBG
316  if (DebugFile.Buffer != NULL && FsRtlIsNameInExpression(&DebugFile, &pFCB->LongNameU, FALSE, NULL))
317  {
318  DPRINT1("Inc ref count (%d, oc: %d) for: %p (%wZ) at: %s(%d) %s\n", pFCB->RefCount, pFCB->OpenHandleCount, pFCB, &pFCB->PathNameU, File, Line, Func);
319  }
320 #else
321  DPRINT("Grabbing FCB at %p: %wZ, refCount:%d\n",
322  pFCB, &pFCB->PathNameU, pFCB->RefCount);
323 #endif
324 
325  ASSERT(ExIsResourceAcquiredExclusive(&pVCB->DirResource));
326 
328  ASSERT(pFCB != pVCB->VolumeFcb && !BooleanFlagOn(pFCB->Flags, FCB_IS_VOLUME));
329  ASSERT(pFCB->RefCount > 0);
330  ++pFCB->RefCount;
331 }
#define BooleanFlagOn(F, SF)
Definition: ext2fs.h:183
UNICODE_STRING LongNameU
Definition: vfat.h:463
BOOLEAN NTAPI FsRtlIsNameInExpression(IN PUNICODE_STRING Expression, IN PUNICODE_STRING Name, IN BOOLEAN IgnoreCase, IN PWCHAR UpcaseTable OPTIONAL)
Definition: name.c:514
LONG RefCount
Definition: vfat.h:481
#define FALSE
Definition: types.h:117
ULONG Flags
Definition: vfat.h:496
#define ASSERT(a)
Definition: mode.c:44
Definition: ncftp.h:79
#define FCB_IS_FAT
Definition: vfat.h:435
void(* Func)(int)
#define NULL
Definition: types.h:112
#define FCB_IS_VOLUME
Definition: ntfs.h:510
#define DPRINT1
Definition: precomp.h:8
UNICODE_STRING PathNameU
Definition: vfat.h:472
Definition: File.h:15
#define DPRINT
Definition: sndvol32.h:71
#define ExIsResourceAcquiredExclusive
Definition: exfuncs.h:347
ULONG OpenHandleCount
Definition: vfat.h:511

Referenced by vfatAddFCBToTable(), VfatCreateFile(), vfatFCBInitializeCacheFromVolume(), vfatGetFCBForFile(), vfatGrabFCBFromTable(), VfatOpenFile(), and VfatSetRenameInformation().

◆ vfatGrabFCBFromTable()

PVFATFCB vfatGrabFCBFromTable ( PDEVICE_EXTENSION  pVCB,
PUNICODE_STRING  PathNameU 
)

Definition at line 594 of file fcb.c.

597 {
598  PVFATFCB rcFCB;
599  ULONG Hash;
600  UNICODE_STRING DirNameU;
601  UNICODE_STRING FileNameU;
602  PUNICODE_STRING FcbNameU;
603 
604  HASHENTRY* entry;
605 
606  DPRINT("'%wZ'\n", PathNameU);
607 
608  ASSERT(PathNameU->Length >= sizeof(WCHAR) && PathNameU->Buffer[0] == L'\\');
609  Hash = vfatNameHash(0, PathNameU);
610 
611  entry = pVCB->FcbHashTable[Hash % pVCB->HashTableSize];
612  if (entry)
613  {
614  vfatSplitPathName(PathNameU, &DirNameU, &FileNameU);
615  }
616 
617  while (entry)
618  {
619  if (entry->Hash == Hash)
620  {
621  rcFCB = entry->self;
622  DPRINT("'%wZ' '%wZ'\n", &DirNameU, &rcFCB->DirNameU);
623  if (RtlEqualUnicodeString(&DirNameU, &rcFCB->DirNameU, TRUE))
624  {
625  if (rcFCB->Hash.Hash == Hash)
626  {
627  FcbNameU = &rcFCB->LongNameU;
628  }
629  else
630  {
631  FcbNameU = &rcFCB->ShortNameU;
632  }
633  /* compare the file name */
634  DPRINT("'%wZ' '%wZ'\n", &FileNameU, FcbNameU);
635  if (RtlEqualUnicodeString(&FileNameU, FcbNameU, TRUE))
636  {
637  vfatGrabFCB(pVCB, rcFCB);
638  return rcFCB;
639  }
640  }
641  }
642  entry = entry->next;
643  }
644  return NULL;
645 }
static int Hash(const char *)
Definition: reader.c:2257
UNICODE_STRING ShortNameU
Definition: vfat.h:466
Definition: vfat.h:447
#define TRUE
Definition: types.h:120
UNICODE_STRING LongNameU
Definition: vfat.h:463
VOID vfatGrabFCB(PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
Definition: fcb.c:301
#define L(x)
Definition: ntvdm.h:50
#define ASSERT(a)
Definition: mode.c:44
__wchar_t WCHAR
Definition: xmlstorage.h:180
ULONG Hash
Definition: vfat.h:277
uint32_t entry
Definition: isohybrid.c:63
UNICODE_STRING DirNameU
Definition: vfat.h:469
static ULONG vfatNameHash(ULONG hash, PUNICODE_STRING NameU)
Definition: fcb.c:32
#define NULL
Definition: types.h:112
VOID vfatSplitPathName(PUNICODE_STRING PathNameU, PUNICODE_STRING DirNameU, PUNICODE_STRING FileNameU)
Definition: fcb.c:54
unsigned int ULONG
Definition: retypes.h:1
#define DPRINT
Definition: sndvol32.h:71
HASHENTRY Hash
Definition: vfat.h:514
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)

Referenced by FindFile(), vfatGetFCBForFile(), and vfatOpenRootFCB().

◆ vfatInitFcb()

static VOID vfatInitFcb ( PVFATFCB  Fcb,
PUNICODE_STRING  NameU 
)
static

Definition at line 83 of file fcb.c.

86 {
87  USHORT PathNameBufferLength;
88 
89  if (NameU)
90  PathNameBufferLength = NameU->Length + sizeof(WCHAR);
91  else
92  PathNameBufferLength = 0;
93 
94  Fcb->PathNameBuffer = ExAllocatePoolWithTag(NonPagedPool, PathNameBufferLength, TAG_FCB);
95  if (!Fcb->PathNameBuffer)
96  {
97  /* FIXME: what to do if no more memory? */
98  DPRINT1("Unable to initialize FCB for filename '%wZ'\n", NameU);
99  KeBugCheckEx(FAT_FILE_SYSTEM, (ULONG_PTR)Fcb, (ULONG_PTR)NameU, 0, 0);
100  }
101 
103  Fcb->RFCB.NodeByteSize = sizeof(VFATFCB);
104 
105  Fcb->PathNameU.Length = 0;
106  Fcb->PathNameU.Buffer = Fcb->PathNameBuffer;
107  Fcb->PathNameU.MaximumLength = PathNameBufferLength;
108  Fcb->ShortNameU.Length = 0;
109  Fcb->ShortNameU.Buffer = Fcb->ShortNameBuffer;
110  Fcb->ShortNameU.MaximumLength = sizeof(Fcb->ShortNameBuffer);
111  Fcb->DirNameU.Buffer = Fcb->PathNameU.Buffer;
112  if (NameU && NameU->Length)
113  {
114  RtlCopyUnicodeString(&Fcb->PathNameU, NameU);
115  vfatSplitPathName(&Fcb->PathNameU, &Fcb->DirNameU, &Fcb->LongNameU);
116  }
117  else
118  {
119  Fcb->DirNameU.Buffer = Fcb->LongNameU.Buffer = NULL;
120  Fcb->DirNameU.MaximumLength = Fcb->DirNameU.Length = 0;
121  Fcb->LongNameU.MaximumLength = Fcb->LongNameU.Length = 0;
122  }
123  RtlZeroMemory(&Fcb->FCBShareAccess, sizeof(SHARE_ACCESS));
124  Fcb->OpenHandleCount = 0;
125 }
struct _VFATFCB VFATFCB
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
uint32_t ULONG_PTR
Definition: typedefs.h:65
FSRTL_COMMON_FCB_HEADER RFCB
Definition: ntfs.h:517
ULONG OpenHandleCount
Definition: ntfs.h:537
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define NODE_TYPE_FCB
Definition: mup.h:20
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define TAG_FCB
Definition: nodetype.h:152
unsigned short USHORT
Definition: pedump.c:61
#define NULL
Definition: types.h:112
VOID vfatSplitPathName(PUNICODE_STRING PathNameU, PUNICODE_STRING DirNameU, PUNICODE_STRING FileNameU)
Definition: fcb.c:54
#define DPRINT1
Definition: precomp.h:8
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
_In_ PFCB Fcb
Definition: cdprocs.h:159
VOID NTAPI KeBugCheckEx(_In_ ULONG BugCheckCode, _In_ ULONG_PTR BugCheckParameter1, _In_ ULONG_PTR BugCheckParameter2, _In_ ULONG_PTR BugCheckParameter3, _In_ ULONG_PTR BugCheckParameter4)
Definition: rtlcompat.c:108

Referenced by vfatNewFCB().

◆ vfatInitFCBFromDirEntry()

static VOID vfatInitFCBFromDirEntry ( PDEVICE_EXTENSION  Vcb,
PVFATFCB  ParentFcb,
PVFATFCB  Fcb,
PVFAT_DIRENTRY_CONTEXT  DirContext 
)
static

Definition at line 428 of file fcb.c.

433 {
434  ULONG Size;
435 
436  RtlCopyMemory(&Fcb->entry, &DirContext->DirEntry, sizeof (DIR_ENTRY));
437  RtlCopyUnicodeString(&Fcb->ShortNameU, &DirContext->ShortNameU);
438  Fcb->Hash.Hash = vfatNameHash(0, &Fcb->PathNameU);
439  if (vfatVolumeIsFatX(Vcb))
440  {
441  Fcb->ShortHash.Hash = Fcb->Hash.Hash;
442  }
443  else
444  {
445  Fcb->ShortHash.Hash = vfatNameHash(0, &Fcb->DirNameU);
446  Fcb->ShortHash.Hash = vfatNameHash(Fcb->ShortHash.Hash, &Fcb->ShortNameU);
447  }
448 
449  if (vfatFCBIsDirectory(Fcb))
450  {
451  ULONG FirstCluster, CurrentCluster;
453  Size = 0;
454  FirstCluster = vfatDirEntryGetFirstCluster(Vcb, &Fcb->entry);
455  if (FirstCluster == 1)
456  {
457  Size = Vcb->FatInfo.rootDirectorySectors * Vcb->FatInfo.BytesPerSector;
458  }
459  else if (FirstCluster != 0)
460  {
461  CurrentCluster = FirstCluster;
462  while (CurrentCluster != 0xffffffff && NT_SUCCESS(Status))
463  {
464  Size += Vcb->FatInfo.BytesPerCluster;
465  Status = NextCluster(Vcb, FirstCluster, &CurrentCluster, FALSE);
466  }
467  }
468  }
469  else if (vfatVolumeIsFatX(Vcb))
470  {
471  Size = Fcb->entry.FatX.FileSize;
472  }
473  else
474  {
475  Size = Fcb->entry.Fat.FileSize;
476  }
477  Fcb->dirIndex = DirContext->DirIndex;
478  Fcb->startIndex = DirContext->StartIndex;
479  Fcb->parentFcb = ParentFcb;
481  {
482  ASSERT(DirContext->DirIndex >= 2 && DirContext->StartIndex >= 2);
483  Fcb->dirIndex = DirContext->DirIndex-2;
484  Fcb->startIndex = DirContext->StartIndex-2;
485  }
488  Fcb->RFCB.AllocationSize.QuadPart = ROUND_UP_64(Size, Vcb->FatInfo.BytesPerCluster);
489 }
ActualNumberDriverObjects * sizeof(PDRIVER_OBJECT)) PDRIVER_OBJECT *DriverObjectList
ULONG vfatDirEntryGetFirstCluster(PDEVICE_EXTENSION pDeviceExt, PDIR_ENTRY pFatDirEntry)
Definition: direntry.c:18
LONG NTSTATUS
Definition: precomp.h:26
ULONG DirIndex
Definition: ntfs.h:533
FORCEINLINE BOOLEAN vfatFCBIsDirectory(PVFATFCB FCB)
Definition: vfat.h:637
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:361
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
#define ROUND_UP_64(n, align)
Definition: vfat.h:34
#define FALSE
Definition: types.h:117
BOOLEAN vfatFCBIsRoot(PVFATFCB FCB)
Definition: fcb.c:293
FSRTL_COMMON_FCB_HEADER RFCB
Definition: ntfs.h:517
Status
Definition: gdiplustypes.h:24
FORCEINLINE BOOLEAN vfatVolumeIsFatX(PDEVICE_EXTENSION DeviceExt)
Definition: vfat.h:651
#define ASSERT(a)
Definition: mode.c:44
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define Vcb
Definition: cdprocs.h:1415
_In_ PFCB _In_ PDIRENT_ENUM_CONTEXT DirContext
Definition: cdprocs.h:424
_In_ PFCB ParentFcb
Definition: cdprocs.h:736
LARGE_INTEGER AllocationSize
Definition: env_spec_w32.h:755
static ULONG vfatNameHash(ULONG hash, PUNICODE_STRING NameU)
Definition: fcb.c:32
Definition: vfat.h:224
NTSTATUS NextCluster(PDEVICE_EXTENSION DeviceExt, ULONG FirstCluster, PULONG CurrentCluster, BOOLEAN Extend)
Definition: rw.c:38
unsigned int ULONG
Definition: retypes.h:1
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define STATUS_SUCCESS
Definition: shellext.h:65
_In_ PFCB Fcb
Definition: cdprocs.h:159
LARGE_INTEGER ValidDataLength
Definition: env_spec_w32.h:757
LONGLONG QuadPart
Definition: typedefs.h:114

Referenced by vfatMakeFCBFromDirEntry(), and vfatUpdateFCB().

◆ vfatMakeFCBFromDirEntry()

NTSTATUS vfatMakeFCBFromDirEntry ( PVCB  vcb,
PVFATFCB  directoryFCB,
PVFAT_DIRENTRY_CONTEXT  DirContext,
PVFATFCB fileFCB 
)

Definition at line 725 of file fcb.c.

730 {
731  PVFATFCB rcFCB;
732  UNICODE_STRING NameU;
734 
735  Status = vfatMakeFullName(directoryFCB, &DirContext->LongNameU, &DirContext->ShortNameU, &NameU);
736  if (!NT_SUCCESS(Status))
737  {
738  return Status;
739  }
740 
741  rcFCB = vfatNewFCB(vcb, &NameU);
742  vfatInitFCBFromDirEntry(vcb, directoryFCB, rcFCB, DirContext);
743 
744  rcFCB->RefCount = 1;
745  InsertTailList(&directoryFCB->ParentListHead, &rcFCB->ParentListEntry);
746  vfatAddFCBToTable(vcb, rcFCB);
747  *fileFCB = rcFCB;
748 
750  return STATUS_SUCCESS;
751 }
static NTSTATUS vfatMakeFullName(PVFATFCB directoryFCB, PUNICODE_STRING LongNameU, PUNICODE_STRING ShortNameU, PUNICODE_STRING NameU)
Definition: fcb.c:210
Definition: vfat.h:447
LONG NTSTATUS
Definition: precomp.h:26
#define InsertTailList(ListHead, Entry)
static VOID vfatInitFCBFromDirEntry(PDEVICE_EXTENSION Vcb, PVFATFCB ParentFcb, PVFATFCB Fcb, PVFAT_DIRENTRY_CONTEXT DirContext)
Definition: fcb.c:428
LONG RefCount
Definition: vfat.h:481
Status
Definition: gdiplustypes.h:24
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
_In_ PFCB _In_ PDIRENT_ENUM_CONTEXT DirContext
Definition: cdprocs.h:424
#define TAG_FCB
Definition: nodetype.h:152
PVFATFCB vfatNewFCB(PDEVICE_EXTENSION pVCB, PUNICODE_STRING pFileNameU)
Definition: fcb.c:128
#define STATUS_SUCCESS
Definition: shellext.h:65
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
LIST_ENTRY ParentListHead
Definition: vfat.h:493
static VOID vfatAddFCBToTable(PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
Definition: fcb.c:400
LIST_ENTRY ParentListEntry
Definition: vfat.h:487

Referenced by FATAddEntry(), FATXAddEntry(), and vfatDirFindFile().

◆ vfatMakeFullName()

static NTSTATUS vfatMakeFullName ( PVFATFCB  directoryFCB,
PUNICODE_STRING  LongNameU,
PUNICODE_STRING  ShortNameU,
PUNICODE_STRING  NameU 
)
static

Definition at line 210 of file fcb.c.

215 {
216  PWCHAR PathNameBuffer;
217  USHORT PathNameLength;
218 
219  PathNameLength = directoryFCB->PathNameU.Length + max(LongNameU->Length, ShortNameU->Length);
220  if (!vfatFCBIsRoot(directoryFCB))
221  {
222  PathNameLength += sizeof(WCHAR);
223  }
224 
225  if (PathNameLength > LONGNAME_MAX_LENGTH * sizeof(WCHAR))
226  {
228  }
229  PathNameBuffer = ExAllocatePoolWithTag(NonPagedPool, PathNameLength + sizeof(WCHAR), TAG_FCB);
230  if (!PathNameBuffer)
231  {
233  }
234  NameU->Buffer = PathNameBuffer;
235  NameU->Length = 0;
236  NameU->MaximumLength = PathNameLength;
237 
238  RtlCopyUnicodeString(NameU, &directoryFCB->PathNameU);
239  if (!vfatFCBIsRoot(directoryFCB))
240  {
241  RtlAppendUnicodeToString(NameU, L"\\");
242  }
243  if (LongNameU->Length > 0)
244  {
245  RtlAppendUnicodeStringToString(NameU, LongNameU);
246  }
247  else
248  {
249  RtlAppendUnicodeStringToString(NameU, ShortNameU);
250  }
251  NameU->Buffer[NameU->Length / sizeof(WCHAR)] = 0;
252 
253  return STATUS_SUCCESS;
254 }
#define max(a, b)
Definition: svc.c:63
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
USHORT MaximumLength
Definition: env_spec_w32.h:370
uint16_t * PWCHAR
Definition: typedefs.h:56
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
#define L(x)
Definition: ntvdm.h:50
BOOLEAN vfatFCBIsRoot(PVFATFCB FCB)
Definition: fcb.c:293
NTSTATUS RtlAppendUnicodeToString(IN PUNICODE_STRING Str1, IN PWSTR Str2)
Definition: string_lib.cpp:62
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define TAG_FCB
Definition: nodetype.h:152
unsigned short USHORT
Definition: pedump.c:61
NTSYSAPI NTSTATUS NTAPI RtlAppendUnicodeStringToString(PUNICODE_STRING Destination, PUNICODE_STRING Source)
#define STATUS_OBJECT_NAME_INVALID
Definition: udferr_usr.h:148
UNICODE_STRING PathNameU
Definition: vfat.h:472
#define LONGNAME_MAX_LENGTH
Definition: vfat.h:203
#define STATUS_SUCCESS
Definition: shellext.h:65

Referenced by vfatMakeFCBFromDirEntry(), vfatSetFCBNewDirName(), and vfatUpdateFCB().

◆ vfatMakeRootFCB()

PVFATFCB vfatMakeRootFCB ( PDEVICE_EXTENSION  pVCB)

Definition at line 648 of file fcb.c.

650 {
651  PVFATFCB FCB;
652  ULONG FirstCluster, CurrentCluster, Size = 0;
654  UNICODE_STRING NameU = RTL_CONSTANT_STRING(L"\\");
655 
656  ASSERT(pVCB->RootFcb == NULL);
657 
658  FCB = vfatNewFCB(pVCB, &NameU);
659  if (vfatVolumeIsFatX(pVCB))
660  {
661  memset(FCB->entry.FatX.Filename, ' ', 42);
662  FCB->entry.FatX.FileSize = pVCB->FatInfo.rootDirectorySectors * pVCB->FatInfo.BytesPerSector;
663  FCB->entry.FatX.Attrib = FILE_ATTRIBUTE_DIRECTORY;
664  FCB->entry.FatX.FirstCluster = 1;
665  Size = pVCB->FatInfo.rootDirectorySectors * pVCB->FatInfo.BytesPerSector;
666  }
667  else
668  {
669  memset(FCB->entry.Fat.ShortName, ' ', 11);
670  FCB->entry.Fat.FileSize = pVCB->FatInfo.rootDirectorySectors * pVCB->FatInfo.BytesPerSector;
671  FCB->entry.Fat.Attrib = FILE_ATTRIBUTE_DIRECTORY;
672  if (pVCB->FatInfo.FatType == FAT32)
673  {
674  CurrentCluster = FirstCluster = pVCB->FatInfo.RootCluster;
675  FCB->entry.Fat.FirstCluster = (unsigned short)(FirstCluster & 0xffff);
676  FCB->entry.Fat.FirstClusterHigh = (unsigned short)(FirstCluster >> 16);
677 
678  while (CurrentCluster != 0xffffffff && NT_SUCCESS(Status))
679  {
680  Size += pVCB->FatInfo.BytesPerCluster;
681  Status = NextCluster (pVCB, FirstCluster, &CurrentCluster, FALSE);
682  }
683  }
684  else
685  {
686  FCB->entry.Fat.FirstCluster = 1;
687  Size = pVCB->FatInfo.rootDirectorySectors * pVCB->FatInfo.BytesPerSector;
688  }
689  }
690  FCB->ShortHash.Hash = FCB->Hash.Hash;
691  FCB->RefCount = 2;
692  FCB->dirIndex = 0;
697 
699  vfatAddFCBToTable(pVCB, FCB);
700 
701  /* Cache it */
702  pVCB->RootFcb = FCB;
703 
704  return FCB;
705 }
Definition: vfat.h:447
Definition: cdstruc.h:902
LONG NTSTATUS
Definition: precomp.h:26
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:361
unsigned short(__cdecl typeof(TIFFCurrentDirectory))(struct tiff *)
Definition: typeof.h:94
#define L(x)
Definition: ntvdm.h:50
#define FALSE
Definition: types.h:117
LONG RefCount
Definition: ntfs.h:535
struct _FCB FCB
FSRTL_COMMON_FCB_HEADER RFCB
Definition: ntfs.h:517
#define FILE_ATTRIBUTE_DIRECTORY
Definition: nt_native.h:705
Status
Definition: gdiplustypes.h:24
FORCEINLINE BOOLEAN vfatVolumeIsFatX(PDEVICE_EXTENSION DeviceExt)
Definition: vfat.h:651
NTSTATUS vfatFCBInitializeCacheFromVolume(PVCB vcb, PVFATFCB fcb)
Definition: dirwr.c:22
#define ASSERT(a)
Definition: mode.c:44
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
LARGE_INTEGER AllocationSize
Definition: env_spec_w32.h:755
#define NULL
Definition: types.h:112
#define FAT32
Definition: fat.h:169
NTSTATUS NextCluster(PDEVICE_EXTENSION DeviceExt, ULONG FirstCluster, PULONG CurrentCluster, BOOLEAN Extend)
Definition: rw.c:38
unsigned int ULONG
Definition: retypes.h:1
PVFATFCB vfatNewFCB(PDEVICE_EXTENSION pVCB, PUNICODE_STRING pFileNameU)
Definition: fcb.c:128
#define STATUS_SUCCESS
Definition: shellext.h:65
LARGE_INTEGER ValidDataLength
Definition: env_spec_w32.h:757
#define memset(x, y, z)
Definition: compat.h:39
FILE_NAME_NODE ShortName
Definition: fatstruc.h:1115
static VOID vfatAddFCBToTable(PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
Definition: fcb.c:400
LONGLONG QuadPart
Definition: typedefs.h:114
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14

Referenced by vfatOpenRootFCB().

◆ vfatNameHash()

static ULONG vfatNameHash ( ULONG  hash,
PUNICODE_STRING  NameU 
)
static

Definition at line 32 of file fcb.c.

35 {
36  PWCHAR last;
37  PWCHAR curr;
38  register WCHAR c;
39 
40  // LFN could start from "."
41  //ASSERT(NameU->Buffer[0] != L'.');
42  curr = NameU->Buffer;
43  last = NameU->Buffer + NameU->Length / sizeof(WCHAR);
44 
45  while(curr < last)
46  {
47  c = towlower(*curr++);
48  hash = (hash + (c << 4) + (c >> 4)) * 11;
49  }
50  return hash;
51 }
POINT last
Definition: font.c:46
uint16_t * PWCHAR
Definition: typedefs.h:56
int hash
Definition: main.c:58
__wchar_t WCHAR
Definition: xmlstorage.h:180
const GLubyte * c
Definition: glext.h:8905
#define c
Definition: ke_i.h:80
#define towlower(c)
Definition: wctype.h:97
Definition: _hash_fun.h:40

Referenced by vfatAddFCBToTable(), vfatGrabFCBFromTable(), vfatInitFCBFromDirEntry(), vfatNewFCB(), and vfatSetFCBNewDirName().

◆ vfatNewFCB()

PVFATFCB vfatNewFCB ( PDEVICE_EXTENSION  pVCB,
PUNICODE_STRING  pFileNameU 
)

Definition at line 128 of file fcb.c.

131 {
132  PVFATFCB rcFCB;
133 
134  DPRINT("'%wZ'\n", pFileNameU);
135 
136  rcFCB = ExAllocateFromNPagedLookasideList(&VfatGlobalData->FcbLookasideList);
137  if (rcFCB == NULL)
138  {
139  return NULL;
140  }
141  RtlZeroMemory(rcFCB, sizeof(VFATFCB));
142  vfatInitFcb(rcFCB, pFileNameU);
143  if (vfatVolumeIsFatX(pVCB))
144  rcFCB->Attributes = &rcFCB->entry.FatX.Attrib;
145  else
146  rcFCB->Attributes = &rcFCB->entry.Fat.Attrib;
147  rcFCB->Hash.Hash = vfatNameHash(0, &rcFCB->PathNameU);
148  rcFCB->Hash.self = rcFCB;
149  rcFCB->ShortHash.self = rcFCB;
154  rcFCB->RFCB.PagingIoResource = &rcFCB->PagingIoResource;
155  rcFCB->RFCB.Resource = &rcFCB->MainResource;
158 
159  return rcFCB;
160 }
Definition: vfat.h:447
VOID NTAPI FsRtlInitializeFileLock(IN PFILE_LOCK FileLock, IN PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine OPTIONAL, IN PUNLOCK_ROUTINE UnlockRoutine OPTIONAL)
Definition: filelock.c:1262
NPAGED_LOOKASIDE_LIST FcbLookasideList
Definition: vfat.h:417
NTSTATUS ExInitializeResourceLite(PULONG res)
Definition: env_spec_w32.h:641
FAT_DIR_ENTRY Fat
Definition: vfat.h:226
unsigned char Attrib
Definition: vfat.h:117
FORCEINLINE BOOLEAN vfatVolumeIsFatX(PDEVICE_EXTENSION DeviceExt)
Definition: vfat.h:651
struct _VFATFCB * self
Definition: vfat.h:278
FORCEINLINE VOID ExInitializeFastMutex(_Out_ PFAST_MUTEX FastMutex)
Definition: exfuncs.h:274
FSRTL_COMMON_FCB_HEADER RFCB
Definition: vfat.h:450
FILE_LOCK FileLock
Definition: vfat.h:520
FATX_DIR_ENTRY FatX
Definition: vfat.h:227
ULONG Hash
Definition: vfat.h:277
DIR_ENTRY entry
Definition: vfat.h:457
PUCHAR Attributes
Definition: vfat.h:460
HASHENTRY ShortHash
Definition: vfat.h:517
ERESOURCE PagingIoResource
Definition: vfat.h:453
PVFAT_GLOBAL_DATA VfatGlobalData
Definition: iface.c:18
static ULONG vfatNameHash(ULONG hash, PUNICODE_STRING NameU)
Definition: fcb.c:32
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
#define NULL
Definition: types.h:112
ERESOURCE MainResource
Definition: vfat.h:452
UNICODE_STRING PathNameU
Definition: vfat.h:472
static VOID vfatInitFcb(PVFATFCB Fcb, PUNICODE_STRING NameU)
Definition: fcb.c:83
FAST_MUTEX LastMutex
Definition: vfat.h:527
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define DPRINT
Definition: sndvol32.h:71
HASHENTRY Hash
Definition: vfat.h:514
LIST_ENTRY ParentListHead
Definition: vfat.h:493
unsigned char Attrib
Definition: vfat.h:172

Referenced by vfatMakeFCBFromDirEntry(), vfatMakeRootFCB(), and VfatMount().

◆ vfatOpenRootFCB()

PVFATFCB vfatOpenRootFCB ( PDEVICE_EXTENSION  pVCB)

Definition at line 708 of file fcb.c.

710 {
711  PVFATFCB FCB;
712  UNICODE_STRING NameU = RTL_CONSTANT_STRING(L"\\");
713 
714  FCB = vfatGrabFCBFromTable(pVCB, &NameU);
715  if (FCB == NULL)
716  {
717  FCB = vfatMakeRootFCB(pVCB);
718  }
719  ASSERT(FCB == pVCB->RootFcb);
720 
721  return FCB;
722 }
Definition: vfat.h:447
Definition: cdstruc.h:902
#define L(x)
Definition: ntvdm.h:50
struct _FCB FCB
#define ASSERT(a)
Definition: mode.c:44
PVFATFCB vfatGrabFCBFromTable(PDEVICE_EXTENSION pVCB, PUNICODE_STRING PathNameU)
Definition: fcb.c:594
#define NULL
Definition: types.h:112
PVFATFCB vfatMakeRootFCB(PDEVICE_EXTENSION pVCB)
Definition: fcb.c:648
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14

Referenced by FsdSetFsLabelInformation(), ReadVolumeLabel(), and vfatGetFCBForFile().

◆ vfatReleaseFCB()

VOID vfatReleaseFCB ( PDEVICE_EXTENSION  pVCB,
PVFATFCB  pFCB 
)

Definition at line 335 of file fcb.c.

348 {
349  PVFATFCB tmpFcb;
350 
351 #ifdef KDBG
352  if (DebugFile.Buffer != NULL && FsRtlIsNameInExpression(&DebugFile, &pFCB->LongNameU, FALSE, NULL))
353  {
354  DPRINT1("Dec ref count (%d, oc: %d) for: %p (%wZ) at: %s(%d) %s\n", pFCB->RefCount, pFCB->OpenHandleCount, pFCB, &pFCB->PathNameU, File, Line, Func);
355  }
356 #else
357  DPRINT("Releasing FCB at %p: %wZ, refCount:%d\n",
358  pFCB, &pFCB->PathNameU, pFCB->RefCount);
359 #endif
360 
361  ASSERT(ExIsResourceAcquiredExclusive(&pVCB->DirResource));
362 
363  while (pFCB)
364  {
365  ULONG RefCount;
366 
368  ASSERT(pFCB != pVCB->VolumeFcb && !BooleanFlagOn(pFCB->Flags, FCB_IS_VOLUME));
369  ASSERT(pFCB->RefCount > 0);
370  RefCount = --pFCB->RefCount;
371 
372  if (RefCount == 1 && BooleanFlagOn(pFCB->Flags, FCB_CACHE_INITIALIZED))
373  {
374  PFILE_OBJECT tmpFileObject;
375  tmpFileObject = pFCB->FileObject;
376 
377  pFCB->FileObject = NULL;
378  CcUninitializeCacheMap(tmpFileObject, NULL, NULL);
380  ObDereferenceObject(tmpFileObject);
381  }
382 
383  if (RefCount == 0)
384  {
385  ASSERT(pFCB->OpenHandleCount == 0);
386  tmpFcb = pFCB->parentFcb;
387  vfatDelFCBFromTable(pVCB, pFCB);
388  vfatDestroyFCB(pFCB);
389  }
390  else
391  {
392  tmpFcb = NULL;
393  }
394  pFCB = tmpFcb;
395  }
396 }
Definition: vfat.h:447
#define BooleanFlagOn(F, SF)
Definition: ext2fs.h:183
UNICODE_STRING LongNameU
Definition: vfat.h:463
VOID vfatDestroyFCB(PVFATFCB pFCB)
Definition: fcb.c:268
BOOLEAN NTAPI FsRtlIsNameInExpression(IN PUNICODE_STRING Expression, IN PUNICODE_STRING Name, IN BOOLEAN IgnoreCase, IN PWCHAR UpcaseTable OPTIONAL)
Definition: name.c:514
LONG RefCount
Definition: vfat.h:481
#define FALSE
Definition: types.h:117
static VOID vfatDelFCBFromTable(PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
Definition: fcb.c:164
PFILE_OBJECT FileObject
Definition: vfat.h:499
ULONG Flags
Definition: vfat.h:496
#define ASSERT(a)
Definition: mode.c:44
struct _VFATFCB * parentFcb
Definition: vfat.h:490
#define ObDereferenceObject
Definition: obfuncs.h:203
* PFILE_OBJECT
Definition: iotypes.h:1998
#define FCB_CACHE_INITIALIZED
Definition: ntfs.h:508
Definition: ncftp.h:79
#define FCB_IS_FAT
Definition: vfat.h:435
ClearFlag(Dirent->Flags, DIRENT_FLAG_NOT_PERSISTENT)
BOOLEAN NTAPI CcUninitializeCacheMap(IN PFILE_OBJECT FileObject, IN OPTIONAL PLARGE_INTEGER TruncateSize, IN OPTIONAL PCACHE_UNINITIALIZE_EVENT UninitializeEvent)
Definition: fssup.c:286
void(* Func)(int)
#define NULL
Definition: types.h:112
#define FCB_IS_VOLUME
Definition: ntfs.h:510
#define DPRINT1
Definition: precomp.h:8
UNICODE_STRING PathNameU
Definition: vfat.h:472
unsigned int ULONG
Definition: retypes.h:1
Definition: File.h:15
#define DPRINT
Definition: sndvol32.h:71
#define ExIsResourceAcquiredExclusive
Definition: exfuncs.h:347
ULONG OpenHandleCount
Definition: vfat.h:511

Referenced by FindFile(), FsdSetFsLabelInformation(), ReadVolumeLabel(), VfatCommonCloseFile(), VfatCreateFile(), vfatGetFCBForFile(), VfatOpenFile(), vfatPrepareTargetForRename(), vfatSetFCBNewDirName(), VfatSetRenameInformation(), and vfatUpdateFCB().

◆ vfatSetFCBNewDirName()

NTSTATUS vfatSetFCBNewDirName ( PDEVICE_EXTENSION  pVCB,
PVFATFCB  Fcb,
PVFATFCB  ParentFcb 
)

Definition at line 492 of file fcb.c.

496 {
498  UNICODE_STRING NewNameU;
499 
500  /* Get full path name */
501  Status = vfatMakeFullName(ParentFcb, &Fcb->LongNameU, &Fcb->ShortNameU, &NewNameU);
502  if (!NT_SUCCESS(Status))
503  {
504  return Status;
505  }
506 
507  /* Delete old name */
508  if (Fcb->PathNameBuffer)
509  {
510  ExFreePoolWithTag(Fcb->PathNameBuffer, TAG_FCB);
511  }
512  Fcb->PathNameU = NewNameU;
513 
514  /* Delete from table */
515  vfatDelFCBFromTable(pVCB, Fcb);
516 
517  /* Split it properly */
518  Fcb->PathNameBuffer = Fcb->PathNameU.Buffer;
519  Fcb->DirNameU.Buffer = Fcb->PathNameU.Buffer;
520  vfatSplitPathName(&Fcb->PathNameU, &Fcb->DirNameU, &Fcb->LongNameU);
521  Fcb->Hash.Hash = vfatNameHash(0, &Fcb->PathNameU);
522  if (vfatVolumeIsFatX(pVCB))
523  {
524  Fcb->ShortHash.Hash = Fcb->Hash.Hash;
525  }
526  else
527  {
528  Fcb->ShortHash.Hash = vfatNameHash(0, &Fcb->DirNameU);
529  Fcb->ShortHash.Hash = vfatNameHash(Fcb->ShortHash.Hash, &Fcb->ShortNameU);
530  }
531 
532  vfatAddFCBToTable(pVCB, Fcb);
533  vfatReleaseFCB(pVCB, ParentFcb);
534 
535  return STATUS_SUCCESS;
536 }
static NTSTATUS vfatMakeFullName(PVFATFCB directoryFCB, PUNICODE_STRING LongNameU, PUNICODE_STRING ShortNameU, PUNICODE_STRING NameU)
Definition: fcb.c:210
LONG NTSTATUS
Definition: precomp.h:26
VOID vfatReleaseFCB(PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
Definition: fcb.c:335
static VOID vfatDelFCBFromTable(PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
Definition: fcb.c:164
Status
Definition: gdiplustypes.h:24
FORCEINLINE BOOLEAN vfatVolumeIsFatX(PDEVICE_EXTENSION DeviceExt)
Definition: vfat.h:651
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
_In_ PFCB ParentFcb
Definition: cdprocs.h:736
#define TAG_FCB
Definition: nodetype.h:152
static ULONG vfatNameHash(ULONG hash, PUNICODE_STRING NameU)
Definition: fcb.c:32
VOID vfatSplitPathName(PUNICODE_STRING PathNameU, PUNICODE_STRING DirNameU, PUNICODE_STRING FileNameU)
Definition: fcb.c:54
#define STATUS_SUCCESS
Definition: shellext.h:65
_In_ PFCB Fcb
Definition: cdprocs.h:159
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
static VOID vfatAddFCBToTable(PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
Definition: fcb.c:400

Referenced by VfatRenameChildFCB().

◆ vfatSplitPathName()

VOID vfatSplitPathName ( PUNICODE_STRING  PathNameU,
PUNICODE_STRING  DirNameU,
PUNICODE_STRING  FileNameU 
)

Definition at line 54 of file fcb.c.

58 {
59  PWCHAR pName;
60  USHORT Length = 0;
61  pName = PathNameU->Buffer + PathNameU->Length / sizeof(WCHAR) - 1;
62  while (*pName != L'\\' && pName >= PathNameU->Buffer)
63  {
64  pName--;
65  Length++;
66  }
67  ASSERT(*pName == L'\\' || pName < PathNameU->Buffer);
68  if (FileNameU)
69  {
70  FileNameU->Buffer = pName + 1;
71  FileNameU->Length = FileNameU->MaximumLength = Length * sizeof(WCHAR);
72  }
73  if (DirNameU)
74  {
75  DirNameU->Buffer = PathNameU->Buffer;
76  DirNameU->Length = (pName + 1 - PathNameU->Buffer) * sizeof(WCHAR);
77  DirNameU->MaximumLength = DirNameU->Length;
78  }
79 }
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
USHORT MaximumLength
Definition: env_spec_w32.h:370
uint16_t * PWCHAR
Definition: typedefs.h:56
#define L(x)
Definition: ntvdm.h:50
Definition: bufpool.h:45
static LPSTR pName
Definition: security.c:75
#define ASSERT(a)
Definition: mode.c:44
__wchar_t WCHAR
Definition: xmlstorage.h:180
unsigned short USHORT
Definition: pedump.c:61

Referenced by VfatCreateFile(), vfatGrabFCBFromTable(), vfatInitFcb(), vfatSetFCBNewDirName(), VfatSetRenameInformation(), and vfatUpdateFCB().

◆ vfatUpdateFCB()

NTSTATUS vfatUpdateFCB ( PDEVICE_EXTENSION  pVCB,
PVFATFCB  Fcb,
PVFAT_DIRENTRY_CONTEXT  DirContext,
PVFATFCB  ParentFcb 
)

Definition at line 539 of file fcb.c.

544 {
546  PVFATFCB OldParent;
547 
548  DPRINT("vfatUpdateFCB(%p, %p, %p, %p)\n", pVCB, Fcb, DirContext, ParentFcb);
549 
550  /* Get full path name */
551  Status = vfatMakeFullName(ParentFcb, &DirContext->LongNameU, &DirContext->ShortNameU, &Fcb->PathNameU);
552  if (!NT_SUCCESS(Status))
553  {
554  return Status;
555  }
556 
557  /* Delete old name */
558  if (Fcb->PathNameBuffer)
559  {
560  ExFreePoolWithTag(Fcb->PathNameBuffer, TAG_FCB);
561  }
562 
563  /* Delete from table */
564  vfatDelFCBFromTable(pVCB, Fcb);
565 
566  /* Split it properly */
567  Fcb->PathNameBuffer = Fcb->PathNameU.Buffer;
568  Fcb->DirNameU.Buffer = Fcb->PathNameU.Buffer;
569  vfatSplitPathName(&Fcb->PathNameU, &Fcb->DirNameU, &Fcb->LongNameU);
570 
571  /* Save old parent */
572  OldParent = Fcb->parentFcb;
573  RemoveEntryList(&Fcb->ParentListEntry);
574 
575  /* Reinit FCB */
577 
578  if (vfatFCBIsDirectory(Fcb))
579  {
581  }
582  InsertTailList(&ParentFcb->ParentListHead, &Fcb->ParentListEntry);
583  vfatAddFCBToTable(pVCB, Fcb);
584 
585  /* If we moved across directories, dereference our old parent
586  * We also dereference in case we're just renaming since AddFCBToTable references it
587  */
588  vfatReleaseFCB(pVCB, OldParent);
589 
590  return STATUS_SUCCESS;
591 }
static NTSTATUS vfatMakeFullName(PVFATFCB directoryFCB, PUNICODE_STRING LongNameU, PUNICODE_STRING ShortNameU, PUNICODE_STRING NameU)
Definition: fcb.c:210
VOID NTAPI CcFlushCache(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN OPTIONAL PLARGE_INTEGER FileOffset, IN ULONG Length, OUT OPTIONAL PIO_STATUS_BLOCK IoStatus)
Definition: cachesub.c:222
Definition: vfat.h:447
LONG NTSTATUS
Definition: precomp.h:26
FORCEINLINE BOOLEAN vfatFCBIsDirectory(PVFATFCB FCB)
Definition: vfat.h:637
#define InsertTailList(ListHead, Entry)
VOID vfatReleaseFCB(PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
Definition: fcb.c:335
static VOID vfatInitFCBFromDirEntry(PDEVICE_EXTENSION Vcb, PVFATFCB ParentFcb, PVFATFCB Fcb, PVFAT_DIRENTRY_CONTEXT DirContext)
Definition: fcb.c:428
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
Definition: rtlfuncs.h:105
static VOID vfatDelFCBFromTable(PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
Definition: fcb.c:164
Status
Definition: gdiplustypes.h:24
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
_In_ PFCB _In_ PDIRENT_ENUM_CONTEXT DirContext
Definition: cdprocs.h:424
_In_ PFCB ParentFcb
Definition: cdprocs.h:736
#define TAG_FCB
Definition: nodetype.h:152
#define NULL
Definition: types.h:112
VOID vfatSplitPathName(PUNICODE_STRING PathNameU, PUNICODE_STRING DirNameU, PUNICODE_STRING FileNameU)
Definition: fcb.c:54
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:71
_In_ PFCB Fcb
Definition: cdprocs.h:159
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
SECTION_OBJECT_POINTERS SectionObjectPointers
Definition: ntfs.h:518
static VOID vfatAddFCBToTable(PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
Definition: fcb.c:400

Referenced by FATAddEntry(), FATXAddEntry(), and vfatRenameEntry().