]> git.proxmox.com Git - mirror_edk2.git/blame - FatPkg/EnhancedFatDxe/Fat.h
Fix a typo when checking the 16-bit alignment of Unicode String.
[mirror_edk2.git] / FatPkg / EnhancedFatDxe / Fat.h
CommitLineData
b9ec9330
QH
1/*++\r
2\r
3Copyright (c) 2005 - 2007, Intel Corporation\r
4All rights reserved. This program and the accompanying materials are licensed and made available\r
5under the terms and conditions of the BSD License which accompanies this\r
6distribution. The full text of the license may be found at\r
7http://opensource.org/licenses/bsd-license.php\r
8\r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11\r
12\r
13Module Name:\r
14\r
15 Fat.h\r
16\r
17Abstract:\r
18\r
19 Main header file for EFI FAT file system driver\r
20\r
21Revision History\r
22\r
23--*/\r
24\r
25#ifndef _FAT_H_\r
26#define _FAT_H_\r
27\r
28#include <Uefi.h>\r
29\r
30#include <Guid/FileInfo.h>\r
31#include <Guid/FileSystemInfo.h>\r
32#include <Guid/FileSystemVolumeLabelInfo.h>\r
33#include <Guid/GlobalVariable.h>\r
34#include <Protocol/BlockIo.h>\r
35#include <Protocol/DiskIo.h>\r
36#include <Protocol/SimpleFileSystem.h>\r
37#include <Protocol/UnicodeCollation.h>\r
38\r
39#include <Library/PcdLib.h>\r
40#include <Library/DebugLib.h>\r
41#include <Library/UefiLib.h>\r
42#include <Library/BaseLib.h>\r
43#include <Library/BaseMemoryLib.h>\r
44#include <Library/MemoryAllocationLib.h>\r
45#include <Library/UefiDriverEntryPoint.h>\r
46#include <Library/UefiBootServicesTableLib.h>\r
47#include <Library/UefiRuntimeServicesTableLib.h>\r
48\r
49#include "FatFileSystem.h"\r
50\r
51//\r
52// The FAT signature\r
53//\r
54#define FAT_VOLUME_SIGNATURE EFI_SIGNATURE_32 ('f', 'a', 't', 'v')\r
55#define FAT_IFILE_SIGNATURE EFI_SIGNATURE_32 ('f', 'a', 't', 'i')\r
56#define FAT_ODIR_SIGNATURE EFI_SIGNATURE_32 ('f', 'a', 't', 'd')\r
57#define FAT_DIRENT_SIGNATURE EFI_SIGNATURE_32 ('f', 'a', 't', 'e')\r
58#define FAT_OFILE_SIGNATURE EFI_SIGNATURE_32 ('f', 'a', 't', 'o')\r
59\r
60#define ASSERT_VOLUME_LOCKED(a) ASSERT_LOCKED (&FatFsLock)\r
61\r
62#define IFILE_FROM_FHAND(a) CR (a, FAT_IFILE, Handle, FAT_IFILE_SIGNATURE)\r
63\r
64#define DIRENT_FROM_LINK(a) CR (a, FAT_DIRENT, Link, FAT_DIRENT_SIGNATURE)\r
65\r
66#define VOLUME_FROM_ROOT_DIRENT(a) CR (a, FAT_VOLUME, RootDirEnt, FAT_VOLUME_SIGNATURE)\r
67\r
68#define VOLUME_FROM_VOL_INTERFACE(a) CR (a, FAT_VOLUME, VolumeInterface, FAT_VOLUME_SIGNATURE);\r
69\r
70#define ODIR_FROM_DIRCACHELINK(a) CR (a, FAT_ODIR, DirCacheLink, FAT_ODIR_SIGNATURE)\r
71\r
72#define OFILE_FROM_CHECKLINK(a) CR (a, FAT_OFILE, CheckLink, FAT_OFILE_SIGNATURE)\r
73\r
74#define OFILE_FROM_CHILDLINK(a) CR (a, FAT_OFILE, ChildLink, FAT_OFILE_SIGNATURE)\r
75\r
76//\r
77// Minimum sector size is 512B, Maximum sector size is 4096B\r
78// Max sectors per cluster is 128\r
79//\r
80#define MAX_BLOCK_ALIGNMENT 12\r
81#define MIN_BLOCK_ALIGNMENT 9\r
82#define MAX_SECTORS_PER_CLUSTER_ALIGNMENT 7\r
83\r
84//\r
85// Efi Time Definition\r
86//\r
87#define IS_LEAP_YEAR(a) (((a) % 4 == 0) && (((a) % 100 != 0) || ((a) % 400 == 0)))\r
88\r
89//\r
90// Minimum fat page size is 8K, maximum fat page alignment is 32K\r
91// Minimum data page size is 8K, maximum fat page alignment is 64K\r
92//\r
93#define FAT_FATCACHE_PAGE_MIN_ALIGNMENT 13\r
94#define FAT_FATCACHE_PAGE_MAX_ALIGNMENT 15\r
95#define FAT_DATACACHE_PAGE_MIN_ALIGNMENT 13\r
96#define FAT_DATACACHE_PAGE_MAX_ALIGNMENT 16\r
97#define FAT_DATACACHE_GROUP_COUNT 64\r
98#define FAT_FATCACHE_GROUP_MIN_COUNT 1\r
99#define FAT_FATCACHE_GROUP_MAX_COUNT 16\r
100\r
101//\r
102// Used in 8.3 generation algorithm\r
103//\r
104#define MAX_SPEC_RETRY 4\r
105#define SPEC_BASE_TAG_LEN 6\r
106#define HASH_BASE_TAG_LEN 2\r
107#define HASH_VALUE_TAG_LEN (SPEC_BASE_TAG_LEN - HASH_BASE_TAG_LEN)\r
108\r
109//\r
110// Path name separator is back slash\r
111//\r
112#define PATH_NAME_SEPARATOR L'\\'\r
113\r
114\r
115#define EFI_PATH_STRING_LENGTH 260\r
116#define EFI_FILE_STRING_LENGTH 255\r
117#define FAT_MAX_ALLOCATE_SIZE 0xA00000\r
118#define LC_ISO_639_2_ENTRY_SIZE 3\r
119#define MAX_LANG_CODE_SIZE 100\r
120\r
121#define FAT_MAX_DIR_CACHE_COUNT 8\r
122#define FAT_MAX_DIRENTRY_COUNT 0xFFFF\r
123typedef CHAR8 LC_ISO_639_2;\r
124\r
125//\r
126// The fat types we support\r
127//\r
128typedef enum {\r
129 FAT12,\r
130 FAT16,\r
131 FAT32,\r
132 FatUndefined\r
133} FAT_VOLUME_TYPE;\r
134\r
135typedef enum {\r
136 CACHE_FAT,\r
137 CACHE_DATA,\r
138 CACHE_MAX_TYPE\r
139} CACHE_DATA_TYPE;\r
140\r
141//\r
142// Used in FatDiskIo\r
143//\r
144typedef enum {\r
145 READ_DISK = 0, // raw disk read\r
146 WRITE_DISK = 1, // raw disk write\r
147 READ_FAT = 2, // read fat cache\r
148 WRITE_FAT = 3, // write fat cache\r
149 READ_DATA = 6, // read data cache\r
150 WRITE_DATA = 7 // write data cache\r
151} IO_MODE;\r
152\r
153#define CACHE_ENABLED(a) ((a) >= 2)\r
154#define RAW_ACCESS(a) ((IO_MODE)((a) & 0x1))\r
155#define CACHE_TYPE(a) ((CACHE_DATA_TYPE)((a) >> 2))\r
156\r
157//\r
158// Disk cache tag\r
159//\r
160typedef struct {\r
161 UINTN PageNo;\r
162 UINTN RealSize;\r
163 BOOLEAN Dirty;\r
164} CACHE_TAG;\r
165\r
166typedef struct {\r
167 UINT64 BaseAddress;\r
168 UINT64 LimitAddress;\r
169 UINT8 *CacheBase;\r
170 BOOLEAN Dirty;\r
171 UINT8 PageAlignment;\r
172 UINTN GroupMask;\r
173 CACHE_TAG CacheTag[FAT_DATACACHE_GROUP_COUNT];\r
174} DISK_CACHE;\r
175\r
176//\r
177// Hash table size\r
178//\r
179#define HASH_TABLE_SIZE 0x400\r
180#define HASH_TABLE_MASK (HASH_TABLE_SIZE - 1)\r
181\r
182//\r
183// The directory entry for opened directory\r
184//\r
185typedef struct _FAT_DIRENT {\r
186 UINTN Signature;\r
187 UINT16 EntryPos; // The position of this directory entry in the parent directory file\r
188 UINT8 EntryCount; // The count of the directory entry in the parent directory file\r
189 BOOLEAN Invalid; // Indicate whether this directory entry is valid\r
190 CHAR16 *FileString; // The unicode long file name for this directory entry\r
191 struct _FAT_OFILE *OFile; // The OFile of the corresponding directory entry\r
192 struct _FAT_DIRENT *ShortNameForwardLink; // Hash successor link for short filename\r
193 struct _FAT_DIRENT *LongNameForwardLink; // Hash successor link for long filename\r
194 LIST_ENTRY Link; // Connection of every directory entry\r
195 FAT_DIRECTORY_ENTRY Entry; // The physical directory entry stored in disk\r
196} FAT_DIRENT;\r
197\r
198typedef struct _FAT_ODIR {\r
199 UINTN Signature;\r
200 UINT32 CurrentEndPos; // Current end position of the directory\r
201 UINT32 CurrentPos; // Current position of the directory\r
202 LIST_ENTRY *CurrentCursor; // Current directory entry pointer\r
203 LIST_ENTRY ChildList; // List of all directory entries\r
204 BOOLEAN EndOfDir; // Indicate whether we have reached the end of the directory\r
205 LIST_ENTRY DirCacheLink; // Linked in Volume->DirCacheList when discarded\r
206 UINTN DirCacheTag; // The identification of the directory when in directory cache\r
207 FAT_DIRENT *LongNameHashTable[HASH_TABLE_SIZE];\r
208 FAT_DIRENT *ShortNameHashTable[HASH_TABLE_SIZE];\r
209} FAT_ODIR;\r
210\r
211typedef struct {\r
212 UINTN Signature;\r
213 EFI_FILE Handle;\r
214 UINT64 Position;\r
215 BOOLEAN ReadOnly;\r
216 struct _FAT_OFILE *OFile;\r
217 LIST_ENTRY Link;\r
218} FAT_IFILE;\r
219\r
220//\r
221// FAT_OFILE - Each opened file\r
222//\r
223typedef struct _FAT_OFILE {\r
224 UINTN Signature;\r
225 struct _FAT_VOLUME *Volume;\r
226 //\r
227 // A permanant error code to return to all accesses to\r
228 // this opened file\r
229 //\r
230 EFI_STATUS Error;\r
231 //\r
232 // A list of the IFILE instances for this OFile\r
233 //\r
234 LIST_ENTRY Opens;\r
235\r
236 //\r
237 // The dynamic infomation\r
238 //\r
239 UINTN FileSize;\r
240 UINTN FileCluster;\r
241 UINTN FileCurrentCluster;\r
242 UINTN FileLastCluster;\r
243\r
244 //\r
245 // Dirty is set if there have been any updates to the\r
246 // file\r
247 // Archive is set if the archive attribute in the file’s\r
248 // directory entry needs to be set when performing flush\r
249 // PreserveLastMod is set if the last modification of the\r
250 // file is specified by SetInfo API\r
251 //\r
252 BOOLEAN Dirty;\r
253 BOOLEAN IsFixedRootDir;\r
254 BOOLEAN PreserveLastModification;\r
255 BOOLEAN Archive;\r
256 //\r
257 // Set by an OFile SetPosition\r
258 //\r
259 UINTN Position; // within file\r
260 UINT64 PosDisk; // on the disk\r
261 UINTN PosRem; // remaining in this disk run\r
262 //\r
263 // The opened parent, full path length and currently opened child files\r
264 //\r
265 struct _FAT_OFILE *Parent;\r
266 UINTN FullPathLen;\r
267 LIST_ENTRY ChildHead;\r
268 LIST_ENTRY ChildLink;\r
269\r
270 //\r
271 // The opened directory structure for a directory; if this\r
272 // OFile represents a file, then ODir = NULL\r
273 //\r
274 FAT_ODIR *ODir;\r
275 //\r
276 // The directory entry for the Ofile\r
277 //\r
278 FAT_DIRENT *DirEnt;\r
279\r
280 //\r
281 // Link in Volume's reference list\r
282 //\r
283 LIST_ENTRY CheckLink;\r
284} FAT_OFILE;\r
285\r
286typedef struct _FAT_VOLUME {\r
287 UINTN Signature;\r
288\r
289 EFI_HANDLE Handle;\r
290 BOOLEAN Valid;\r
291 BOOLEAN DiskError;\r
292\r
293 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL VolumeInterface;\r
294\r
295 //\r
296 // If opened, the parent handle and BlockIo interface\r
297 //\r
298 EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
299 EFI_DISK_IO_PROTOCOL *DiskIo;\r
300 UINT32 MediaId;\r
301 BOOLEAN ReadOnly;\r
302\r
303 //\r
304 // Computed values from fat bpb info\r
305 //\r
306 UINT64 VolumeSize;\r
307 UINT64 FatPos; // Disk pos of fat tables\r
308 UINT64 RootPos; // Disk pos of root directory\r
309 UINT64 FirstClusterPos; // Disk pos of first cluster\r
310 UINTN FatSize; // Number of bytes in each fat\r
311 UINTN MaxCluster; // Max cluster number\r
312 UINTN ClusterSize; // Cluster size of fat partition\r
313 UINT8 ClusterAlignment; // Equal to log_2 (clustersize);\r
314 FAT_VOLUME_TYPE FatType;\r
315\r
316 //\r
317 // Current part of fat table that's present\r
318 //\r
319 UINT64 FatEntryPos; // Location of buffer\r
320 UINTN FatEntrySize; // Size of buffer\r
321 UINT32 FatEntryBuffer; // The buffer\r
322 FAT_INFO_SECTOR FatInfoSector; // Free cluster info\r
323 UINTN FreeInfoPos; // Pos with the free cluster info\r
324 BOOLEAN FreeInfoValid; // If free cluster info is valid\r
325 //\r
326 // Unpacked Fat BPB info\r
327 //\r
328 UINTN NumFats;\r
329 UINTN RootEntries; // < FAT32, root dir is fixed size\r
330 UINTN RootCluster; // >= FAT32, root cluster chain head\r
331 //\r
332 // info for marking the volume dirty or not\r
333 //\r
334 BOOLEAN FatDirty; // If fat-entries have been updated\r
335 UINT32 DirtyValue;\r
336 UINT32 NotDirtyValue;\r
337\r
338 //\r
339 // The root directory entry and opened root file\r
340 //\r
341 FAT_DIRENT RootDirEnt;\r
342 //\r
343 // File Name of root OFile, it is empty string\r
344 //\r
345 CHAR16 RootFileString[1];\r
346 struct _FAT_OFILE *Root;\r
347\r
348 //\r
349 // New OFiles are added to this list so they\r
350 // can be cleaned up if they aren't referenced.\r
351 //\r
352 LIST_ENTRY CheckRef;\r
353\r
354 //\r
355 // Directory cache List\r
356 //\r
357 LIST_ENTRY DirCacheList;\r
358 UINTN DirCacheCount;\r
359\r
360 //\r
361 // Disk Cache for this volume\r
362 //\r
363 VOID *CacheBuffer;\r
364 DISK_CACHE DiskCache[CACHE_MAX_TYPE];\r
365} FAT_VOLUME;\r
366\r
367//\r
368// Function Prototypes\r
369//\r
370EFI_STATUS\r
371EFIAPI\r
372FatOpen (\r
373 IN EFI_FILE *FHand,\r
374 OUT EFI_FILE **NewHandle,\r
375 IN CHAR16 *FileName,\r
376 IN UINT64 OpenMode,\r
377 IN UINT64 Attributes\r
378 )\r
379/*++\r
380Routine Description:\r
381\r
382 Implements Open() of Simple File System Protocol.\r
383\r
384Arguments:\r
385\r
386 FHand - File handle of the file serves as a starting reference point.\r
387 NewHandle - Handle of the file that is newly opened.\r
388 FileName - File name relative to FHand.\r
389 OpenMode - Open mode.\r
390 Attributes - Attributes to set if the file is created.\r
391\r
392Returns:\r
393\r
394 EFI_INVALID_PARAMETER - The FileName is NULL or the file string is empty.\r
395 The OpenMode is not supported.\r
396 The Attributes is not the valid attributes.\r
397 EFI_OUT_OF_RESOURCES - Can not allocate the memory for file string.\r
398 EFI_SUCCESS - Open the file successfully.\r
399 Others - The status of open file.\r
400\r
401--*/\r
402;\r
403\r
404EFI_STATUS\r
405EFIAPI\r
406FatGetPosition (\r
407 IN EFI_FILE *FHand,\r
408 OUT UINT64 *Position\r
409 )\r
410/*++\r
411\r
412Routine Description:\r
413\r
414 Get the file's position of the file\r
415\r
416Arguments:\r
417\r
418 FHand - The handle of file.\r
419 Position - The file's position of the file.\r
420\r
421Returns:\r
422\r
423 EFI_SUCCESS - Get the info successfully.\r
424 EFI_DEVICE_ERROR - Can not find the OFile for the file.\r
425 EFI_UNSUPPORTED - The open file is not a file.\r
426\r
427--*/\r
428;\r
429\r
430EFI_STATUS\r
431EFIAPI\r
432FatGetInfo (\r
433 IN EFI_FILE *FHand,\r
434 IN EFI_GUID *Type,\r
435 IN OUT UINTN *BufferSize,\r
436 OUT VOID *Buffer\r
437 )\r
438/*++\r
439\r
440Routine Description:\r
441\r
442 Get the some types info of the file into Buffer\r
443\r
444Arguments:\r
445\r
446 FHand - The handle of file.\r
447 Type - The type of the info.\r
448 BufferSize - Size of Buffer.\r
449 Buffer - Buffer containing volume info.\r
450\r
451Returns:\r
452\r
453 EFI_SUCCESS - Get the info successfully.\r
454 EFI_DEVICE_ERROR - Can not find the OFile for the file.\r
455\r
456--*/\r
457;\r
458\r
459EFI_STATUS\r
460EFIAPI\r
461FatSetInfo (\r
462 IN EFI_FILE *FHand,\r
463 IN EFI_GUID *Type,\r
464 IN UINTN BufferSize,\r
465 IN VOID *Buffer\r
466 )\r
467/*++\r
468\r
469Routine Description:\r
470\r
471 Set the some types info of the file into Buffer\r
472\r
473Arguments:\r
474\r
475 FHand - The handle of file.\r
476 Type - The type of the info.\r
477 BufferSize - Size of Buffer.\r
478 Buffer - Buffer containing volume info.\r
479\r
480Returns:\r
481\r
482 EFI_SUCCESS - Set the info successfully.\r
483 EFI_DEVICE_ERROR - Can not find the OFile for the file.\r
484\r
485--*/\r
486;\r
487\r
488EFI_STATUS\r
489EFIAPI\r
490FatFlush (\r
491 IN EFI_FILE *FHand\r
492 )\r
493/*++\r
494\r
495Routine Description:\r
496\r
497 Flushes all data associated with the file handle\r
498\r
499Arguments:\r
500\r
501 FHand - Handle to file to flush\r
502\r
503Returns:\r
504\r
505 EFI_SUCCESS - Flushed the file successfully\r
506 EFI_WRITE_PROTECTED - The volume is read only\r
507 EFI_ACCESS_DENIED - The volume is not read only\r
508 but the file is read only\r
509 Others - Flushing of the file is failed\r
510\r
511--*/\r
512;\r
513\r
514EFI_STATUS\r
515EFIAPI\r
516FatClose (\r
517 IN EFI_FILE *FHand\r
518 )\r
519/*++\r
520\r
521Routine Description:\r
522\r
523 Flushes & Closes the file handle.\r
524\r
525Arguments:\r
526\r
527 FHand - Handle to the file to delete.\r
528\r
529Returns:\r
530\r
531 EFI_SUCCESS - Closed the file successfully.\r
532\r
533--*/\r
534;\r
535\r
536EFI_STATUS\r
537EFIAPI\r
538FatDelete (\r
539 IN EFI_FILE *FHand\r
540 )\r
541/*++\r
542\r
543Routine Description:\r
544\r
545 Deletes the file & Closes the file handle.\r
546\r
547Arguments:\r
548\r
549 FHand - Handle to the file to delete.\r
550\r
551Returns:\r
552\r
553 EFI_SUCCESS - Delete the file successfully.\r
554 EFI_WARN_DELETE_FAILURE - Fail to delete the file.\r
555\r
556--*/\r
557;\r
558\r
559EFI_STATUS\r
560EFIAPI\r
561FatSetPosition (\r
562 IN EFI_FILE *FHand,\r
563 IN UINT64 Position\r
564 )\r
565/*++\r
566\r
567Routine Description:\r
568\r
569 Set the file's position of the file\r
570\r
571Arguments:\r
572\r
573 FHand - The handle of file\r
574 Position - The file's position of the file\r
575\r
576Returns:\r
577\r
578 EFI_SUCCESS - Set the info successfully\r
579 EFI_DEVICE_ERROR - Can not find the OFile for the file\r
580 EFI_UNSUPPORTED - Set a directory with a not-zero position\r
581\r
582--*/\r
583;\r
584\r
585EFI_STATUS\r
586EFIAPI\r
587FatRead (\r
588 IN EFI_FILE *FHand,\r
589 IN OUT UINTN *BufferSize,\r
590 OUT VOID *Buffer\r
591 )\r
592/*++\r
593\r
594Routine Description:\r
595\r
596 Get the file info.\r
597\r
598Arguments:\r
599\r
600 FHand - The handle of the file.\r
601 BufferSize - Size of Buffer.\r
602 Buffer - Buffer containing read data.\r
603\r
604Returns:\r
605\r
606 EFI_SUCCESS - Get the file info successfully.\r
607 EFI_DEVICE_ERROR - Can not find the OFile for the file.\r
608 EFI_VOLUME_CORRUPTED - The file type of open file is error.\r
609 other - An error occurred when operation the disk.\r
610\r
611--*/\r
612;\r
613\r
614EFI_STATUS\r
615EFIAPI\r
616FatWrite (\r
617 IN EFI_FILE *FHand,\r
618 IN OUT UINTN *BufferSize,\r
619 IN VOID *Buffer\r
620 )\r
621/*++\r
622\r
623Routine Description:\r
624\r
625 Set the file info.\r
626\r
627Arguments:\r
628\r
629 FHand - The handle of the file.\r
630 BufferSize - Size of Buffer.\r
631 Buffer - Buffer containing write data.\r
632\r
633Returns:\r
634\r
635 EFI_SUCCESS - Set the file info successfully.\r
636 EFI_WRITE_PROTECTED - The disk is write protected.\r
637 EFI_ACCESS_DENIED - The file is read-only.\r
638 EFI_DEVICE_ERROR - The OFile is not valid.\r
639 EFI_UNSUPPORTED - The open file is not a file.\r
640 - The writing file size is larger than 4GB.\r
641 other - An error occurred when operation the disk.\r
642\r
643--*/\r
644;\r
645\r
646//\r
647// DiskCache.c\r
648//\r
649EFI_STATUS\r
650FatInitializeDiskCache (\r
651 IN FAT_VOLUME *Volume\r
652 );\r
653\r
654EFI_STATUS\r
655FatAccessCache (\r
656 IN FAT_VOLUME *Volume,\r
657 IN CACHE_DATA_TYPE CacheDataType,\r
658 IN IO_MODE IoMode,\r
659 IN UINT64 Offset,\r
660 IN UINTN BufferSize,\r
661 IN OUT UINT8 *Buffer\r
662 );\r
663\r
664EFI_STATUS\r
665FatVolumeFlushCache (\r
666 IN FAT_VOLUME *Volume\r
667 );\r
668\r
669//\r
670// Flush.c\r
671//\r
672EFI_STATUS\r
673FatOFileFlush (\r
674 IN FAT_OFILE *OFile\r
675 );\r
676\r
677BOOLEAN\r
678FatCheckOFileRef (\r
679 IN FAT_OFILE *OFile\r
680 );\r
681\r
682VOID\r
683FatSetVolumeError (\r
684 IN FAT_OFILE *OFile,\r
685 IN EFI_STATUS Status\r
686 );\r
687\r
688EFI_STATUS\r
689FatIFileClose (\r
690 FAT_IFILE *IFile\r
691 );\r
692\r
693EFI_STATUS\r
694FatCleanupVolume (\r
695 IN FAT_VOLUME *Volume,\r
696 IN FAT_OFILE *OFile,\r
697 IN EFI_STATUS EfiStatus\r
698 );\r
699\r
700//\r
701// FileSpace.c\r
702//\r
703EFI_STATUS\r
704FatShrinkEof (\r
705 IN FAT_OFILE *OFile\r
706 );\r
707\r
708EFI_STATUS\r
709FatGrowEof (\r
710 IN FAT_OFILE *OFile,\r
711 IN UINT64 NewSizeInBytes\r
712 );\r
713\r
714UINTN\r
715FatPhysicalDirSize (\r
716 IN FAT_VOLUME *Volume,\r
717 IN UINTN Cluster\r
718 );\r
719\r
720UINT64\r
721FatPhysicalFileSize (\r
722 IN FAT_VOLUME *Volume,\r
723 IN UINTN RealSize\r
724 );\r
725\r
726EFI_STATUS\r
727FatOFilePosition (\r
728 IN FAT_OFILE *OFile,\r
729 IN UINTN Position,\r
730 IN UINTN PosLimit\r
731 );\r
732\r
733VOID\r
734FatComputeFreeInfo (\r
735 IN FAT_VOLUME *Volume\r
736 );\r
737\r
738//\r
739// Init.c\r
740//\r
741EFI_STATUS\r
742FatAllocateVolume (\r
743 IN EFI_HANDLE Handle,\r
744 IN EFI_DISK_IO_PROTOCOL *DiskIo,\r
745 IN EFI_BLOCK_IO_PROTOCOL *BlockIo\r
746 );\r
747\r
748EFI_STATUS\r
749FatOpenDevice (\r
750 IN OUT FAT_VOLUME *Volume\r
751 );\r
752\r
753EFI_STATUS\r
754FatAbandonVolume (\r
755 IN FAT_VOLUME *Volume\r
756 );\r
757\r
758//\r
759// Misc.c\r
760//\r
761EFI_STATUS\r
762FatAccessVolumeDirty (\r
763 IN FAT_VOLUME *Volume,\r
764 IN IO_MODE IoMode,\r
765 IN VOID *DirtyValue\r
766 );\r
767\r
768EFI_STATUS\r
769FatDiskIo (\r
770 IN FAT_VOLUME *Volume,\r
771 IN IO_MODE IoMode,\r
772 IN UINT64 Offset,\r
773 IN UINTN BufferSize,\r
774 IN OUT VOID *Buffer\r
775 );\r
776\r
777VOID\r
778FatAcquireLock (\r
779 VOID\r
780 );\r
781\r
782VOID\r
783FatReleaseLock (\r
784 VOID\r
785 );\r
786\r
787BOOLEAN\r
788FatIsLocked (\r
789 VOID\r
790 );\r
791\r
792VOID\r
793FatFreeDirEnt (\r
794 IN FAT_DIRENT *DirEnt\r
795 );\r
796\r
797VOID\r
798FatFreeVolume (\r
799 IN FAT_VOLUME *Volume\r
800 );\r
801\r
802VOID\r
803FatEfiTimeToFatTime (\r
804 IN EFI_TIME *ETime,\r
805 OUT FAT_DATE_TIME *FTime\r
806 );\r
807\r
808VOID\r
809FatFatTimeToEfiTime (\r
810 IN FAT_DATE_TIME *FTime,\r
811 OUT EFI_TIME *ETime\r
812 );\r
813\r
814VOID\r
815FatGetCurrentFatTime (\r
816 OUT FAT_DATE_TIME *FatTime\r
817 );\r
818\r
819BOOLEAN\r
820FatIsValidTime (\r
821 IN EFI_TIME *Time\r
822 );\r
823\r
824//\r
825// UnicodeCollation.c\r
826//\r
827EFI_STATUS\r
828InitializeUnicodeCollationSupport (\r
829 IN EFI_HANDLE AgentHandle\r
830 );\r
831\r
832VOID\r
833FatFatToStr (\r
834 IN UINTN FatSize,\r
835 IN CHAR8 *Fat,\r
836 OUT CHAR16 *String\r
837 );\r
838\r
839BOOLEAN\r
840FatStrToFat (\r
841 IN CHAR16 *String,\r
842 IN UINTN FatSize,\r
843 OUT CHAR8 *Fat\r
844 );\r
845\r
846VOID\r
847FatStrLwr (\r
848 IN CHAR16 *Str\r
849 );\r
850\r
851VOID\r
852FatStrUpr (\r
853 IN CHAR16 *Str\r
854 );\r
855\r
856INTN\r
857FatStriCmp (\r
858 IN CHAR16 *Str1,\r
859 IN CHAR16 *Str2\r
860 );\r
861\r
862//\r
863// Open.c\r
864//\r
865EFI_STATUS\r
866FatOFileOpen (\r
867 IN FAT_OFILE *OFile,\r
868 OUT FAT_IFILE **NewIFile,\r
869 IN CHAR16 *FileName,\r
870 IN UINT64 OpenMode,\r
871 IN UINT8 Attributes\r
872 );\r
873\r
874EFI_STATUS\r
875FatAllocateIFile (\r
876 IN FAT_OFILE *OFile,\r
877 OUT FAT_IFILE **PtrIFile\r
878 );\r
879\r
880//\r
881// OpenVolume.c\r
882//\r
883EFI_STATUS\r
884EFIAPI\r
885FatOpenVolume (\r
886 IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,\r
887 OUT EFI_FILE **File\r
888 );\r
889\r
890//\r
891// ReadWrite.c\r
892//\r
893EFI_STATUS\r
894FatAccessOFile (\r
895 IN FAT_OFILE *OFile,\r
896 IN IO_MODE IoMode,\r
897 IN UINTN Position,\r
898 IN UINTN *DataBufferSize,\r
899 IN UINT8 *UserBuffer\r
900 );\r
901\r
902EFI_STATUS\r
903FatExpandOFile (\r
904 IN FAT_OFILE *OFile,\r
905 IN UINT64 ExpandedSize\r
906 );\r
907\r
908EFI_STATUS\r
909FatWriteZeroPool (\r
910 IN FAT_OFILE *OFile,\r
911 IN UINTN WritePos\r
912 );\r
913\r
914EFI_STATUS\r
915FatTruncateOFile (\r
916 IN FAT_OFILE *OFile,\r
917 IN UINTN TruncatedSize\r
918 );\r
919\r
920//\r
921// DirectoryManage.c\r
922//\r
923VOID\r
924FatResetODirCursor (\r
925 IN FAT_OFILE *OFile\r
926 );\r
927\r
928EFI_STATUS\r
929FatGetNextDirEnt (\r
930 IN FAT_OFILE *OFILE,\r
931 OUT FAT_DIRENT **PtrDirEnt\r
932 );\r
933\r
934EFI_STATUS\r
935FatRemoveDirEnt (\r
936 IN FAT_OFILE *OFile,\r
937 IN FAT_DIRENT *DirEnt\r
938 );\r
939\r
940EFI_STATUS\r
941FatStoreDirEnt (\r
942 IN FAT_OFILE *OFile,\r
943 IN FAT_DIRENT *DirEnt\r
944 );\r
945\r
946EFI_STATUS\r
947FatCreateDirEnt (\r
948 IN FAT_OFILE *OFile,\r
949 IN CHAR16 *FileName,\r
950 IN UINT8 Attributes,\r
951 OUT FAT_DIRENT **PtrDirEnt\r
952 );\r
953\r
954BOOLEAN\r
955FatIsDotDirEnt (\r
956 IN FAT_DIRENT *DirEnt\r
957 );\r
958\r
959VOID\r
960FatUpdateDirEntClusterSizeInfo (\r
961 IN FAT_OFILE *OFile\r
962 );\r
963\r
964VOID\r
965FatCloneDirEnt (\r
966 IN FAT_DIRENT *DirEnt1,\r
967 IN FAT_DIRENT *DirEnt2\r
968 );\r
969\r
970EFI_STATUS\r
971FatGetDirEntInfo (\r
972 IN FAT_VOLUME *Volume,\r
973 IN FAT_DIRENT *DirEnt,\r
974 IN OUT UINTN *BufferSize,\r
975 OUT VOID *Buffer\r
976 );\r
977\r
978EFI_STATUS\r
979FatOpenDirEnt (\r
980 IN FAT_OFILE *OFile,\r
981 IN FAT_DIRENT *DirEnt\r
982 );\r
983\r
984EFI_STATUS\r
985FatCreateDotDirEnts (\r
986 IN FAT_OFILE *OFile\r
987 );\r
988\r
989VOID\r
990FatCloseDirEnt (\r
991 IN FAT_DIRENT *DirEnt\r
992 );\r
993\r
994EFI_STATUS\r
995FatLocateOFile (\r
996 IN OUT FAT_OFILE **PtrOFile,\r
997 IN CHAR16 *FileName,\r
998 IN UINT8 Attributes,\r
999 OUT CHAR16 *NewFileName\r
1000 );\r
1001\r
1002EFI_STATUS\r
1003FatGetVolumeEntry (\r
1004 IN FAT_VOLUME *Volume,\r
1005 IN CHAR16 *Name\r
1006 );\r
1007\r
1008EFI_STATUS\r
1009FatSetVolumeEntry (\r
1010 IN FAT_VOLUME *Volume,\r
1011 IN CHAR16 *Name\r
1012 );\r
1013\r
1014//\r
1015// Hash.c\r
1016//\r
1017FAT_DIRENT **\r
1018FatLongNameHashSearch (\r
1019 IN FAT_ODIR *ODir,\r
1020 IN CHAR16 *LongNameString\r
1021 );\r
1022\r
1023FAT_DIRENT **\r
1024FatShortNameHashSearch (\r
1025 IN FAT_ODIR *ODir,\r
1026 IN CHAR8 *ShortNameString\r
1027 );\r
1028\r
1029VOID\r
1030FatInsertToHashTable (\r
1031 IN FAT_ODIR *ODir,\r
1032 IN FAT_DIRENT *DirEnt\r
1033 );\r
1034\r
1035VOID\r
1036FatDeleteFromHashTable (\r
1037 IN FAT_ODIR *ODir,\r
1038 IN FAT_DIRENT *DirEnt\r
1039 );\r
1040\r
1041//\r
1042// FileName.c\r
1043//\r
1044BOOLEAN\r
1045FatCheckIs8Dot3Name (\r
1046 IN CHAR16 *FileName,\r
1047 OUT CHAR8 *File8Dot3Name\r
1048 );\r
1049\r
1050VOID\r
1051FatCreate8Dot3Name (\r
1052 IN FAT_OFILE *Parent,\r
1053 IN FAT_DIRENT *DirEnt\r
1054 );\r
1055\r
1056VOID\r
1057FatNameToStr (\r
1058 IN CHAR8 *FatName,\r
1059 IN UINTN Len,\r
1060 IN UINTN LowerCase,\r
1061 IN CHAR16 *Str\r
1062 );\r
1063\r
1064VOID\r
1065FatSetCaseFlag (\r
1066 IN FAT_DIRENT *DirEnt\r
1067 );\r
1068\r
1069VOID\r
1070FatGetFileNameViaCaseFlag (\r
1071 IN FAT_DIRENT *DirEnt,\r
1072 OUT CHAR16 *FileString\r
1073 );\r
1074\r
1075UINT8\r
1076FatCheckSum (\r
1077 IN CHAR8 *ShortNameString\r
1078 );\r
1079\r
1080CHAR16*\r
1081FatGetNextNameComponent (\r
1082 IN CHAR16 *Path,\r
1083 OUT CHAR16 *Name\r
1084 );\r
1085\r
1086BOOLEAN\r
1087FatFileNameIsValid (\r
1088 IN CHAR16 *InputFileName,\r
1089 OUT CHAR16 *OutputFileName\r
1090 );\r
1091\r
1092//\r
1093// DirectoryCache.c\r
1094//\r
1095VOID\r
1096FatDiscardODir (\r
1097 IN FAT_OFILE *OFile\r
1098 );\r
1099\r
1100VOID\r
1101FatRequestODir (\r
1102 IN FAT_OFILE *OFile\r
1103 );\r
1104\r
1105VOID\r
1106FatCleanupODirCache (\r
1107 IN FAT_VOLUME *Volume\r
1108 );\r
1109\r
1110//\r
1111// Global Variables\r
1112//\r
1113extern EFI_DRIVER_BINDING_PROTOCOL gFatDriverBinding;\r
1114extern EFI_COMPONENT_NAME_PROTOCOL gFatComponentName;\r
1115extern EFI_COMPONENT_NAME2_PROTOCOL gFatComponentName2;\r
1116extern EFI_LOCK FatFsLock;\r
1117extern EFI_FILE FatFileInterface;\r
1118\r
1119#endif\r