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