37 if (Position >= Parent->FileSize) {
41 ASSERT (IoMode == ReadData);
71 CHAR16 *LfnBufferPointer;
72 CHAR16 LfnBuffer[MAX_LFN_ENTRIES * LFN_CHAR_TOTAL + 1];
76 EntryPos = DirEnt->EntryPos;
77 EntryCount = DirEnt->EntryCount;
81 Status =
FatAccessEntry (OFile, WriteData, EntryPos, &DirEnt->Entry);
82 if (EFI_ERROR (Status)) {
86 if (--EntryCount > 0) {
90 SetMem (LfnBuffer,
sizeof (CHAR16) * LFN_CHAR_TOTAL * EntryCount, 0xff);
96 if (EFI_ERROR (Status)) {
100 LfnBufferPointer = LfnBuffer;
101 LfnEntry.Attributes = FAT_ATTRIBUTE_LFN;
103 LfnEntry.MustBeZero = 0;
104 LfnEntry.Checksum =
FatCheckSum (DirEnt->Entry.FileName);
105 for (LfnOrdinal = 1; LfnOrdinal <= EntryCount; LfnOrdinal++) {
106 LfnEntry.Ordinal = LfnOrdinal;
107 if (LfnOrdinal == EntryCount) {
108 LfnEntry.Ordinal |= FAT_LFN_LAST;
111 CopyMem (LfnEntry.Name1, LfnBufferPointer, sizeof (CHAR16) * LFN_CHAR1_LEN);
112 LfnBufferPointer += LFN_CHAR1_LEN;
113 CopyMem (LfnEntry.Name2, LfnBufferPointer, sizeof (CHAR16) * LFN_CHAR2_LEN);
114 LfnBufferPointer += LFN_CHAR2_LEN;
115 CopyMem (LfnEntry.Name3, LfnBufferPointer, sizeof (CHAR16) * LFN_CHAR3_LEN);
116 LfnBufferPointer += LFN_CHAR3_LEN;
118 if (DirEnt->Invalid) {
119 LfnEntry.Ordinal = DELETE_ENTRY_MARK;
123 if (EFI_ERROR (Status)) {
149 FileString = DirEnt->FileString;
150 if ((
StrCmp (FileString, L
".") == 0) || (
StrCmp (FileString, L
"..") == 0)) {
173 DirEnt = OFile->DirEnt;
174 Cluster = OFile->FileCluster;
175 DirEnt->Entry.FileClusterHigh = (UINT16)(Cluster >> 16);
176 DirEnt->Entry.FileCluster = (UINT16)Cluster;
191 ASSERT (OFile->ODir ==
NULL);
192 OFile->DirEnt->Entry.FileSize = (UINT32)OFile->FileSize;
213 Entry1 = (UINT8 *)&DirEnt1->Entry;
214 Entry2 = (UINT8 *)&DirEnt2->Entry;
216 Entry1 + FAT_ENTRY_INFO_OFFSET,
217 Entry2 + FAT_ENTRY_INFO_OFFSET,
237 CHAR16 LfnBuffer[MAX_LFN_ENTRIES * LFN_CHAR_TOTAL + 1];
238 CHAR16 *LfnBufferPointer;
239 CHAR8 *File8Dot3Name;
246 EntryPos = DirEnt->EntryPos;
247 File8Dot3Name = DirEnt->Entry.FileName;
248 LfnBufferPointer = LfnBuffer;
256 LfnBufferPointer = LfnBuffer;
262 if (EFI_ERROR (Status) ||
263 (LfnEntry.Attributes != FAT_ATTRIBUTE_LFN) ||
264 (LfnEntry.MustBeZero != 0) ||
265 (LfnEntry.Checksum != LfnChecksum) ||
266 ((LfnEntry.Ordinal & (~FAT_LFN_LAST)) != LfnOrdinal) ||
267 (LfnOrdinal > MAX_LFN_ENTRIES)
275 LfnBufferPointer = LfnBuffer;
279 CopyMem (LfnBufferPointer, LfnEntry.Name1, sizeof (CHAR16) * LFN_CHAR1_LEN);
280 LfnBufferPointer += LFN_CHAR1_LEN;
281 CopyMem (LfnBufferPointer, LfnEntry.Name2, sizeof (CHAR16) * LFN_CHAR2_LEN);
282 LfnBufferPointer += LFN_CHAR2_LEN;
283 CopyMem (LfnBufferPointer, LfnEntry.Name3, sizeof (CHAR16) * LFN_CHAR3_LEN);
284 LfnBufferPointer += LFN_CHAR3_LEN;
286 }
while ((LfnEntry.Ordinal & FAT_LFN_LAST) == 0);
288 DirEnt->EntryCount = LfnOrdinal;
292 *LfnBufferPointer = 0;
293 if (LfnBufferPointer == LfnBuffer) {
323 if (DirEnt->Link.BackLink ==
NULL) {
324 DirEnt->Link.BackLink = &ODir->ChildList;
359 ASSERT (ODir !=
NULL);
363 ASSERT (!ODir->EndOfDir);
370 Status =
FatAccessEntry (OFile, ReadData, ODir->CurrentEndPos, &Entry);
371 if (EFI_ERROR (Status)) {
375 if (((UINT8)Entry.FileName[0] != DELETE_ENTRY_MARK) && ((Entry.Attributes & FAT_ATTRIBUTE_VOLUME_ID) == 0)) {
382 ODir->CurrentEndPos++;
385 if (Entry.FileName[0] != EMPTY_ENTRY_MARK) {
390 if (OFile->Volume->FatType != Fat32) {
391 Entry.FileClusterHigh = 0;
398 if (DirEnt ==
NULL) {
399 return EFI_OUT_OF_RESOURCES;
402 DirEnt->Signature = FAT_DIRENT_SIGNATURE;
406 DirEnt->EntryPos = (UINT16)ODir->CurrentEndPos;
409 if (DirEnt->FileString ==
NULL) {
410 Status = EFI_OUT_OF_RESOURCES;
421 ODir->CurrentEndPos++;
423 ODir->EndOfDir =
TRUE;
464 ASSERT_VOLUME_LOCKED (Volume);
467 NameSize =
StrSize (DirEnt->FileString);
468 ResultSize = Size + NameSize;
470 Status = EFI_BUFFER_TOO_SMALL;
471 if (*BufferSize >= ResultSize) {
473 Entry = &DirEnt->Entry;
475 Info->
Size = ResultSize;
476 if ((Entry->Attributes & FAT_ATTRIBUTE_DIRECTORY) != 0) {
477 Cluster = (Entry->FileClusterHigh << 16) | Entry->FileCluster;
485 ZeroMem (&FatLastAccess.Time, sizeof (FatLastAccess.Time));
486 CopyMem (&FatLastAccess.Date, &Entry->FileLastAccess, sizeof (FatLastAccess.Date));
490 Info->
Attribute = Entry->Attributes & EFI_FILE_VALID_ATTR;
491 CopyMem ((CHAR8 *)Buffer + Size, DirEnt->FileString, NameSize);
494 *BufferSize = ResultSize;
514 IN CHAR16 *FileNameString,
518 BOOLEAN PossibleShortName;
519 CHAR8 File8Dot3Name[FAT_NAME_LEN];
525 ASSERT (ODir !=
NULL);
534 if ((DirEnt ==
NULL) && PossibleShortName) {
538 if (DirEnt ==
NULL) {
543 while (!ODir->EndOfDir) {
545 if (EFI_ERROR (Status)) {
549 if (DirEnt !=
NULL) {
550 if (
FatStriCmp (FileNameString, DirEnt->FileString) == 0) {
554 if (PossibleShortName && (
CompareMem (File8Dot3Name, DirEnt->Entry.FileName, FAT_NAME_LEN) == 0)) {
580 ASSERT (ODir !=
NULL);
581 ODir->CurrentCursor = &(ODir->ChildList);
582 ODir->CurrentPos = 0;
607 ASSERT (ODir !=
NULL);
608 if (ODir->CurrentCursor->ForwardLink == &ODir->ChildList) {
612 if (!ODir->EndOfDir) {
617 if (EFI_ERROR (Status)) {
623 if (ODir->CurrentCursor->ForwardLink == &ODir->ChildList) {
628 ODir->CurrentPos = ODir->CurrentEndPos;
630 ODir->CurrentCursor = ODir->CurrentCursor->ForwardLink;
631 DirEnt = DIRENT_FROM_LINK (ODir->CurrentCursor);
632 ODir->CurrentPos = DirEnt->EntryPos + 1;
655 CHAR8 *File8Dot3Name;
660 DirEnt->EntryCount = 1;
661 FileString = DirEnt->FileString;
662 File8Dot3Name = DirEnt->Entry.FileName;
663 SetMem (File8Dot3Name, FAT_NAME_LEN,
' ');
664 if (
StrCmp (FileString, L
".") == 0) {
668 File8Dot3Name[0] =
'.';
670 }
else if (
StrCmp (FileString, L
"..") == 0) {
674 File8Dot3Name[0] =
'.';
675 File8Dot3Name[1] =
'.';
691 DirEnt->EntryCount = (UINT8)(LFN_ENTRY_NUMBER (
StrLen (FileString)) + DirEnt->EntryCount);
712 return FatExpandOFile (OFile, OFile->FileSize + OFile->Volume->ClusterSize);
738 Entry = &DirEnt->Entry;
739 DirEnt->Invalid =
TRUE;
742 if (EFI_ERROR (Status)) {
746 if (((UINT8)Entry->FileName[0] != DELETE_ENTRY_MARK) && (((Entry->Attributes) & (~FAT_ATTRIBUTE_ARCHIVE)) == FAT_ATTRIBUTE_VOLUME_ID)) {
747 DirEnt->EntryPos = (UINT16)EntryPos;
748 DirEnt->EntryCount = 1;
749 DirEnt->Invalid =
FALSE;
754 }
while (Entry->FileName[0] != EMPTY_ENTRY_MARK);
792 if (OFile->Parent ==
NULL) {
794 if (EFI_ERROR (Status)) {
798 if (!LabelDirEnt.Invalid) {
799 LabelPos = LabelDirEnt.EntryPos;
803 EntryCount = DirEnt->EntryCount;
804 NewEntryPos = EntryCount;
807 for (CurrentEntry = ODir->ChildList.ForwardLink;
808 CurrentEntry != &ODir->ChildList;
809 CurrentEntry = CurrentEntry->ForwardLink
812 CurrentDirEnt = DIRENT_FROM_LINK (CurrentEntry);
813 if (NewEntryPos + CurrentDirEnt->EntryCount <= CurrentDirEnt->EntryPos) {
814 if ((LabelPos > NewEntryPos) || (LabelPos <= CurrentPos)) {
822 CurrentPos = CurrentDirEnt->EntryPos;
823 NewEntryPos = CurrentPos + EntryCount;
826 if (NewEntryPos >= ODir->CurrentEndPos) {
827 return EFI_VOLUME_FULL;
831 DirEnt->EntryPos = (UINT16)NewEntryPos;
832 DirEnt->Link.BackLink = CurrentEntry;
861 ASSERT (ODir !=
NULL);
865 while (!ODir->EndOfDir) {
867 if (EFI_ERROR (Status)) {
876 CopyMem (&DirEnt->Entry.FileModificationTime, &DirEnt->Entry.FileCreateTime, sizeof (
FAT_DATE_TIME));
877 CopyMem (&DirEnt->Entry.FileLastAccess, &DirEnt->Entry.FileCreateTime.Date, sizeof (
FAT_DATE));
878 NewEndPos = ODir->CurrentEndPos + DirEnt->EntryCount;
880 if (NewEndPos >= (OFile->IsFixedRootDir ? OFile->Volume->RootEntries : FAT_MAX_DIRENTRY_COUNT)) {
891 if (EFI_ERROR (Status)) {
899 ODir->CurrentEndPos = NewEndPos;
900 DirEnt->EntryPos = (UINT16)(ODir->CurrentEndPos - 1);
926 if (!EFI_ERROR (Status)) {
927 if (!LabelDirEnt.Invalid) {
959 if (EFI_ERROR (Status)) {
963 if (LabelDirEnt.Invalid) {
968 LabelDirEnt.EntryCount = 1;
970 if (EFI_ERROR (Status)) {
974 LabelDirEnt.Entry.Attributes = FAT_ATTRIBUTE_VOLUME_ID;
977 SetMem (LabelDirEnt.Entry.FileName, FAT_NAME_LEN,
' ');
978 if (
FatStrToFat (Name, FAT_NAME_LEN, LabelDirEnt.Entry.FileName)) {
979 return EFI_UNSUPPORTED;
1005 if (EFI_ERROR (Status)) {
1013 Status =
FatCreateDirEnt (OFile, L
".", FAT_ATTRIBUTE_DIRECTORY, &DirEnt);
1014 if (EFI_ERROR (Status)) {
1021 Status =
FatCreateDirEnt (OFile, L
"..", FAT_ATTRIBUTE_DIRECTORY, &DirEnt);
1042 IN CHAR16 *FileName,
1043 IN UINT8 Attributes,
1051 ASSERT (OFile !=
NULL);
1053 ASSERT (ODir !=
NULL);
1055 if (DirEnt ==
NULL) {
1056 return EFI_OUT_OF_RESOURCES;
1059 DirEnt->Signature = FAT_DIRENT_SIGNATURE;
1061 if (DirEnt->FileString ==
NULL) {
1062 Status = EFI_OUT_OF_RESOURCES;
1074 if (EFI_ERROR (Status)) {
1079 DirEnt->Entry.Attributes = Attributes;
1080 *PtrDirEnt = DirEnt;
1081 DEBUG ((DEBUG_INFO,
"FSOpen: Created new directory entry '%S'\n", DirEnt->FileString));
1109 if (ODir->CurrentCursor == &DirEnt->Link) {
1113 ODir->CurrentCursor = ODir->CurrentCursor->BackLink;
1124 DirEnt->Entry.FileName[0] = DELETE_ENTRY_MARK;
1125 DirEnt->Invalid =
TRUE;
1150 if (DirEnt->OFile ==
NULL) {
1155 if (OFile ==
NULL) {
1156 return EFI_OUT_OF_RESOURCES;
1159 OFile->Signature = FAT_OFILE_SIGNATURE;
1162 OFile->Parent = Parent;
1163 OFile->DirEnt = DirEnt;
1164 if (Parent !=
NULL) {
1168 Volume = Parent->Volume;
1169 OFile->FullPathLen = Parent->FullPathLen + 1 +
StrLen (DirEnt->FileString);
1170 OFile->FileCluster = ((DirEnt->Entry.FileClusterHigh) << 16) | (DirEnt->Entry.FileCluster);
1176 Volume = VOLUME_FROM_ROOT_DIRENT (DirEnt);
1177 Volume->Root = OFile;
1178 OFile->FileCluster = Volume->RootCluster;
1179 if (Volume->FatType != Fat32) {
1180 OFile->IsFixedRootDir =
TRUE;
1184 OFile->FileCurrentCluster = OFile->FileCluster;
1185 OFile->Volume = Volume;
1188 OFile->FileSize = DirEnt->Entry.FileSize;
1189 if ((DirEnt->Entry.Attributes & FAT_ATTRIBUTE_DIRECTORY) != 0) {
1190 if (OFile->IsFixedRootDir) {
1197 if (OFile->ODir ==
NULL) {
1198 return EFI_OUT_OF_RESOURCES;
1202 DirEnt->OFile = OFile;
1223 OFile = DirEnt->OFile;
1224 ASSERT (OFile !=
NULL);
1225 Volume = OFile->Volume;
1227 if (OFile->ODir !=
NULL) {
1231 if (OFile->Parent ==
NULL) {
1232 Volume->Root =
NULL;
1238 DirEnt->OFile =
NULL;
1239 if (DirEnt->Invalid ==
TRUE) {
1270 IN CHAR16 *FileName,
1271 IN UINT8 Attributes,
1272 OUT CHAR16 *NewFileName
1277 CHAR16 ComponentName[EFI_PATH_STRING_LENGTH];
1279 BOOLEAN DirIntended;
1286 FileNameLen =
StrLen (FileName);
1287 if (FileNameLen == 0) {
1288 return EFI_INVALID_PARAMETER;
1292 Volume = OFile->Volume;
1294 DirIntended =
FALSE;
1295 if (FileName[FileNameLen - 1] == PATH_NAME_SEPARATOR) {
1302 if (*FileName == PATH_NAME_SEPARATOR) {
1303 OFile = Volume->Root;
1314 if (2 + OFile->FullPathLen + 1 + FileNameLen + 1 > EFI_PATH_STRING_LENGTH) {
1318 return EFI_INVALID_PARAMETER;
1335 if (ComponentName[0] == 0) {
1336 if (DirIntended && (OFile->ODir ==
NULL)) {
1337 return EFI_NOT_FOUND;
1347 if (
StrCmp (ComponentName, L
".") == 0) {
1354 if (
StrCmp (ComponentName, L
"..") == 0) {
1355 if (OFile->Parent ==
NULL) {
1356 return EFI_INVALID_PARAMETER;
1359 OFile = OFile->Parent;
1364 return EFI_INVALID_PARAMETER;
1370 if (OFile->ODir ==
NULL) {
1374 return EFI_NOT_FOUND;
1381 if (EFI_ERROR (Status)) {
1385 if (DirEnt ==
NULL) {
1390 return EFI_NOT_FOUND;
1393 if (DirIntended && ((Attributes & FAT_ATTRIBUTE_DIRECTORY) == 0)) {
1394 return EFI_INVALID_PARAMETER;
1405 if (EFI_ERROR (Status)) {
1409 OFile = DirEnt->OFile;
UINTN EFIAPI StrSize(IN CONST CHAR16 *String)
RETURN_STATUS EFIAPI StrCpyS(OUT CHAR16 *Destination, IN UINTN DestMax, IN CONST CHAR16 *Source)
INTN EFIAPI StrCmp(IN CONST CHAR16 *FirstString, IN CONST CHAR16 *SecondString)
LIST_ENTRY *EFIAPI InsertHeadList(IN OUT LIST_ENTRY *ListHead, IN OUT LIST_ENTRY *Entry)
LIST_ENTRY *EFIAPI RemoveEntryList(IN CONST LIST_ENTRY *Entry)
LIST_ENTRY *EFIAPI InitializeListHead(IN OUT LIST_ENTRY *ListHead)
UINTN EFIAPI StrLen(IN CONST CHAR16 *String)
LIST_ENTRY *EFIAPI InsertTailList(IN OUT LIST_ENTRY *ListHead, IN OUT LIST_ENTRY *Entry)
INTN EFIAPI CompareMem(IN CONST VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI SetMem(OUT VOID *Buffer, IN UINTN Length, IN UINT8 Value)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
VOID FatRequestODir(IN FAT_OFILE *OFile)
VOID FatDiscardODir(IN FAT_OFILE *OFile)
EFI_STATUS FatRemoveDirEnt(IN FAT_OFILE *OFile, IN FAT_DIRENT *DirEnt)
EFI_STATUS FatStoreDirEnt(IN FAT_OFILE *OFile, IN FAT_DIRENT *DirEnt)
EFI_STATUS FatGetDirEntInfo(IN FAT_VOLUME *Volume, IN FAT_DIRENT *DirEnt, IN OUT UINTN *BufferSize, OUT VOID *Buffer)
EFI_STATUS FatCreateDirEnt(IN FAT_OFILE *OFile, IN CHAR16 *FileName, IN UINT8 Attributes, OUT FAT_DIRENT **PtrDirEnt)
BOOLEAN FatIsDotDirEnt(IN FAT_DIRENT *DirEnt)
EFI_STATUS FatOpenDirEnt(IN FAT_OFILE *Parent, IN FAT_DIRENT *DirEnt)
EFI_STATUS FatLocateOFile(IN OUT FAT_OFILE **PtrOFile, IN CHAR16 *FileName, IN UINT8 Attributes, OUT CHAR16 *NewFileName)
STATIC EFI_STATUS FatExpandODir(IN FAT_OFILE *OFile)
EFI_STATUS FatSetVolumeEntry(IN FAT_VOLUME *Volume, IN CHAR16 *Name)
EFI_STATUS FatCreateDotDirEnts(IN FAT_OFILE *OFile)
STATIC EFI_STATUS FatSearchODir(IN FAT_OFILE *OFile, IN CHAR16 *FileNameString, OUT FAT_DIRENT **PtrDirEnt)
EFI_STATUS FatGetNextDirEnt(IN FAT_OFILE *OFile, OUT FAT_DIRENT **PtrDirEnt)
EFI_STATUS FatGetVolumeEntry(IN FAT_VOLUME *Volume, IN CHAR16 *Name)
STATIC EFI_STATUS FatAccessEntry(IN FAT_OFILE *Parent, IN IO_MODE IoMode, IN UINTN EntryPos, IN OUT VOID *Entry)
STATIC EFI_STATUS FatLoadNextDirEnt(IN FAT_OFILE *OFile, OUT FAT_DIRENT **PtrDirEnt)
STATIC VOID FatLoadLongNameEntry(IN FAT_OFILE *Parent, IN FAT_DIRENT *DirEnt)
STATIC VOID FatSetEntryCount(IN FAT_OFILE *OFile, IN FAT_DIRENT *DirEnt)
VOID FatCloneDirEnt(IN FAT_DIRENT *DirEnt1, IN FAT_DIRENT *DirEnt2)
STATIC EFI_STATUS FatSeekVolumeId(IN FAT_OFILE *Root, OUT FAT_DIRENT *DirEnt)
VOID FatUpdateDirEntClusterSizeInfo(IN FAT_OFILE *OFile)
STATIC EFI_STATUS FatFirstFitInsertDirEnt(IN FAT_OFILE *OFile, IN FAT_DIRENT *DirEnt)
STATIC EFI_STATUS FatNewEntryPos(IN FAT_OFILE *OFile, IN FAT_DIRENT *DirEnt)
VOID FatResetODirCursor(IN FAT_OFILE *OFile)
STATIC VOID FatAddDirEnt(IN FAT_ODIR *ODir, IN FAT_DIRENT *DirEnt)
VOID FatCloseDirEnt(IN FAT_DIRENT *DirEnt)
STATIC VOID FatSetDirEntCluster(IN FAT_OFILE *OFile)
VOID *EFIAPI AllocateZeroPool(IN UINTN AllocationSize)
VOID EFIAPI FreePool(IN VOID *Buffer)
VOID *EFIAPI AllocateCopyPool(IN UINTN AllocationSize, IN CONST VOID *Buffer)
FAT_DIRENT ** FatShortNameHashSearch(IN FAT_ODIR *ODir, IN CHAR8 *ShortNameString)
BOOLEAN FatFileNameIsValid(IN CHAR16 *InputFileName, OUT CHAR16 *OutputFileName)
VOID FatFatTimeToEfiTime(IN FAT_DATE_TIME *FTime, OUT EFI_TIME *ETime)
BOOLEAN FatStrToFat(IN CHAR16 *String, IN UINTN FatSize, OUT CHAR8 *Fat)
UINTN FatPhysicalDirSize(IN FAT_VOLUME *Volume, IN UINTN Cluster)
VOID FatInsertToHashTable(IN FAT_ODIR *ODir, IN FAT_DIRENT *DirEnt)
VOID FatNameToStr(IN CHAR8 *FatName, IN UINTN Len, IN UINTN LowerCase, IN CHAR16 *Str)
EFI_STATUS FatExpandOFile(IN FAT_OFILE *OFile, IN UINT64 ExpandedSize)
VOID FatGetFileNameViaCaseFlag(IN FAT_DIRENT *DirEnt, IN OUT CHAR16 *FileString, IN UINTN FileStringMax)
VOID FatSetCaseFlag(IN FAT_DIRENT *DirEnt)
INTN FatStriCmp(IN CHAR16 *Str1, IN CHAR16 *Str2)
UINT64 FatPhysicalFileSize(IN FAT_VOLUME *Volume, IN UINTN RealSize)
VOID FatCreate8Dot3Name(IN FAT_OFILE *Parent, IN FAT_DIRENT *DirEnt)
EFI_STATUS FatAccessOFile(IN FAT_OFILE *OFile, IN IO_MODE IoMode, IN UINTN Position, IN UINTN *DataBufferSize, IN UINT8 *UserBuffer, IN FAT_TASK *Task)
UINT8 FatCheckSum(IN CHAR8 *ShortNameString)
VOID FatFreeDirEnt(IN FAT_DIRENT *DirEnt)
VOID FatDeleteFromHashTable(IN FAT_ODIR *ODir, IN FAT_DIRENT *DirEnt)
VOID FatGetCurrentFatTime(OUT FAT_DATE_TIME *FatTime)
CHAR16 * FatGetNextNameComponent(IN CHAR16 *Path, OUT CHAR16 *Name)
BOOLEAN FatCheckIs8Dot3Name(IN CHAR16 *FileName, OUT CHAR8 *File8Dot3Name)
FAT_DIRENT ** FatLongNameHashSearch(IN FAT_ODIR *ODir, IN CHAR16 *LongNameString)
#define SIZE_OF_EFI_FILE_INFO
#define ARRAY_SIZE(Array)
#define DEBUG(Expression)
EFI_TIME ModificationTime