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