mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-11-04 07:10:07 +00:00 
			
		
		
		
	REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the FatPkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Ray Ni <ray.ni@intel.com>
		
			
				
	
	
		
			2020 lines
		
	
	
		
			54 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			2020 lines
		
	
	
		
			54 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  Main header file for EFI FAT file system driver.
 | 
						|
 | 
						|
Copyright (c) 2005 - 2013, Intel Corporation. All rights reserved.<BR>
 | 
						|
SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#ifndef _FAT_H_
 | 
						|
#define _FAT_H_
 | 
						|
 | 
						|
#include <Uefi.h>
 | 
						|
 | 
						|
#include <Guid/FileInfo.h>
 | 
						|
#include <Guid/FileSystemInfo.h>
 | 
						|
#include <Guid/FileSystemVolumeLabelInfo.h>
 | 
						|
#include <Protocol/BlockIo.h>
 | 
						|
#include <Protocol/DiskIo.h>
 | 
						|
#include <Protocol/DiskIo2.h>
 | 
						|
#include <Protocol/SimpleFileSystem.h>
 | 
						|
#include <Protocol/UnicodeCollation.h>
 | 
						|
 | 
						|
#include <Library/PcdLib.h>
 | 
						|
#include <Library/DebugLib.h>
 | 
						|
#include <Library/UefiLib.h>
 | 
						|
#include <Library/BaseLib.h>
 | 
						|
#include <Library/BaseMemoryLib.h>
 | 
						|
#include <Library/MemoryAllocationLib.h>
 | 
						|
#include <Library/UefiDriverEntryPoint.h>
 | 
						|
#include <Library/UefiBootServicesTableLib.h>
 | 
						|
#include <Library/UefiRuntimeServicesTableLib.h>
 | 
						|
 | 
						|
#include "FatFileSystem.h"
 | 
						|
 | 
						|
//
 | 
						|
// The FAT signature
 | 
						|
//
 | 
						|
#define FAT_VOLUME_SIGNATURE   SIGNATURE_32 ('f', 'a', 't', 'v')
 | 
						|
#define FAT_IFILE_SIGNATURE    SIGNATURE_32 ('f', 'a', 't', 'i')
 | 
						|
#define FAT_ODIR_SIGNATURE     SIGNATURE_32 ('f', 'a', 't', 'd')
 | 
						|
#define FAT_DIRENT_SIGNATURE   SIGNATURE_32 ('f', 'a', 't', 'e')
 | 
						|
#define FAT_OFILE_SIGNATURE    SIGNATURE_32 ('f', 'a', 't', 'o')
 | 
						|
#define FAT_TASK_SIGNATURE     SIGNATURE_32 ('f', 'a', 't', 'T')
 | 
						|
#define FAT_SUBTASK_SIGNATURE  SIGNATURE_32 ('f', 'a', 't', 'S')
 | 
						|
 | 
						|
#define ASSERT_VOLUME_LOCKED(a)  ASSERT_LOCKED (&FatFsLock)
 | 
						|
 | 
						|
#define IFILE_FROM_FHAND(a)  CR (a, FAT_IFILE, Handle, FAT_IFILE_SIGNATURE)
 | 
						|
 | 
						|
#define DIRENT_FROM_LINK(a)  CR (a, FAT_DIRENT, Link, FAT_DIRENT_SIGNATURE)
 | 
						|
 | 
						|
#define VOLUME_FROM_ROOT_DIRENT(a)  CR (a, FAT_VOLUME, RootDirEnt, FAT_VOLUME_SIGNATURE)
 | 
						|
 | 
						|
#define VOLUME_FROM_VOL_INTERFACE(a)  CR (a, FAT_VOLUME, VolumeInterface, FAT_VOLUME_SIGNATURE);
 | 
						|
 | 
						|
#define ODIR_FROM_DIRCACHELINK(a)  CR (a, FAT_ODIR, DirCacheLink, FAT_ODIR_SIGNATURE)
 | 
						|
 | 
						|
#define OFILE_FROM_CHECKLINK(a)  CR (a, FAT_OFILE, CheckLink, FAT_OFILE_SIGNATURE)
 | 
						|
 | 
						|
#define OFILE_FROM_CHILDLINK(a)  CR (a, FAT_OFILE, ChildLink, FAT_OFILE_SIGNATURE)
 | 
						|
 | 
						|
//
 | 
						|
// Minimum sector size is 512B, Maximum sector size is 4096B
 | 
						|
// Max sectors per cluster is 128
 | 
						|
//
 | 
						|
#define MAX_BLOCK_ALIGNMENT                12
 | 
						|
#define MIN_BLOCK_ALIGNMENT                9
 | 
						|
#define MAX_SECTORS_PER_CLUSTER_ALIGNMENT  7
 | 
						|
 | 
						|
//
 | 
						|
// Efi Time Definition
 | 
						|
//
 | 
						|
#define IS_LEAP_YEAR(a)  (((a) % 4 == 0) && (((a) % 100 != 0) || ((a) % 400 == 0)))
 | 
						|
 | 
						|
//
 | 
						|
// Minimum fat page size is 8K, maximum fat page alignment is 32K
 | 
						|
// Minimum data page size is 8K, maximum fat page alignment is 64K
 | 
						|
//
 | 
						|
#define FAT_FATCACHE_PAGE_MIN_ALIGNMENT   13
 | 
						|
#define FAT_FATCACHE_PAGE_MAX_ALIGNMENT   15
 | 
						|
#define FAT_DATACACHE_PAGE_MIN_ALIGNMENT  13
 | 
						|
#define FAT_DATACACHE_PAGE_MAX_ALIGNMENT  16
 | 
						|
#define FAT_DATACACHE_GROUP_COUNT         64
 | 
						|
#define FAT_FATCACHE_GROUP_MIN_COUNT      1
 | 
						|
#define FAT_FATCACHE_GROUP_MAX_COUNT      16
 | 
						|
 | 
						|
//
 | 
						|
// Used in 8.3 generation algorithm
 | 
						|
//
 | 
						|
#define MAX_SPEC_RETRY      4
 | 
						|
#define SPEC_BASE_TAG_LEN   6
 | 
						|
#define HASH_BASE_TAG_LEN   2
 | 
						|
#define HASH_VALUE_TAG_LEN  (SPEC_BASE_TAG_LEN - HASH_BASE_TAG_LEN)
 | 
						|
 | 
						|
//
 | 
						|
// Path name separator is back slash
 | 
						|
//
 | 
						|
#define PATH_NAME_SEPARATOR  L'\\'
 | 
						|
 | 
						|
#define EFI_PATH_STRING_LENGTH   260
 | 
						|
#define EFI_FILE_STRING_LENGTH   255
 | 
						|
#define FAT_MAX_ALLOCATE_SIZE    0xA00000
 | 
						|
#define LC_ISO_639_2_ENTRY_SIZE  3
 | 
						|
#define MAX_LANG_CODE_SIZE       100
 | 
						|
 | 
						|
#define FAT_MAX_DIR_CACHE_COUNT  8
 | 
						|
#define FAT_MAX_DIRENTRY_COUNT   0xFFFF
 | 
						|
typedef CHAR8 LC_ISO_639_2;
 | 
						|
 | 
						|
//
 | 
						|
// The fat types we support
 | 
						|
//
 | 
						|
typedef enum {
 | 
						|
  Fat12,
 | 
						|
  Fat16,
 | 
						|
  Fat32,
 | 
						|
  FatUndefined
 | 
						|
} FAT_VOLUME_TYPE;
 | 
						|
 | 
						|
typedef enum {
 | 
						|
  CacheFat,
 | 
						|
  CacheData,
 | 
						|
  CacheMaxType
 | 
						|
} CACHE_DATA_TYPE;
 | 
						|
 | 
						|
//
 | 
						|
// Used in FatDiskIo
 | 
						|
//
 | 
						|
typedef enum {
 | 
						|
  ReadDisk  = 0,     // raw disk read
 | 
						|
  WriteDisk = 1,     // raw disk write
 | 
						|
  ReadFat   = 2,     // read fat cache
 | 
						|
  WriteFat  = 3,     // write fat cache
 | 
						|
  ReadData  = 6,     // read data cache
 | 
						|
  WriteData = 7      // write data cache
 | 
						|
} IO_MODE;
 | 
						|
 | 
						|
#define CACHE_ENABLED(a)  ((a) >= 2)
 | 
						|
#define RAW_ACCESS(a)     ((IO_MODE)((a) & 0x1))
 | 
						|
#define CACHE_TYPE(a)     ((CACHE_DATA_TYPE)((a) >> 2))
 | 
						|
 | 
						|
//
 | 
						|
// Disk cache tag
 | 
						|
//
 | 
						|
typedef struct {
 | 
						|
  UINTN      PageNo;
 | 
						|
  UINTN      RealSize;
 | 
						|
  BOOLEAN    Dirty;
 | 
						|
} CACHE_TAG;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  UINT64       BaseAddress;
 | 
						|
  UINT64       LimitAddress;
 | 
						|
  UINT8        *CacheBase;
 | 
						|
  BOOLEAN      Dirty;
 | 
						|
  UINT8        PageAlignment;
 | 
						|
  UINTN        GroupMask;
 | 
						|
  CACHE_TAG    CacheTag[FAT_DATACACHE_GROUP_COUNT];
 | 
						|
} DISK_CACHE;
 | 
						|
 | 
						|
//
 | 
						|
// Hash table size
 | 
						|
//
 | 
						|
#define HASH_TABLE_SIZE  0x400
 | 
						|
#define HASH_TABLE_MASK  (HASH_TABLE_SIZE - 1)
 | 
						|
 | 
						|
//
 | 
						|
// The directory entry for opened directory
 | 
						|
//
 | 
						|
 | 
						|
typedef struct _FAT_DIRENT FAT_DIRENT;
 | 
						|
typedef struct _FAT_ODIR   FAT_ODIR;
 | 
						|
typedef struct _FAT_OFILE  FAT_OFILE;
 | 
						|
typedef struct _FAT_VOLUME FAT_VOLUME;
 | 
						|
 | 
						|
struct _FAT_DIRENT {
 | 
						|
  UINTN                  Signature;
 | 
						|
  UINT16                 EntryPos;              // The position of this directory entry in the parent directory file
 | 
						|
  UINT8                  EntryCount;            // The count of the directory entry in the parent directory file
 | 
						|
  BOOLEAN                Invalid;               // Indicate whether this directory entry is valid
 | 
						|
  CHAR16                 *FileString;           // The unicode long file name for this directory entry
 | 
						|
  FAT_OFILE              *OFile;                // The OFile of the corresponding directory entry
 | 
						|
  FAT_DIRENT             *ShortNameForwardLink; // Hash successor link for short filename
 | 
						|
  FAT_DIRENT             *LongNameForwardLink;  // Hash successor link for long filename
 | 
						|
  LIST_ENTRY             Link;                  // Connection of every directory entry
 | 
						|
  FAT_DIRECTORY_ENTRY    Entry;                 // The physical directory entry stored in disk
 | 
						|
};
 | 
						|
 | 
						|
struct _FAT_ODIR {
 | 
						|
  UINTN         Signature;
 | 
						|
  UINT32        CurrentEndPos;                // Current end position of the directory
 | 
						|
  UINT32        CurrentPos;                   // Current position of the directory
 | 
						|
  LIST_ENTRY    *CurrentCursor;               // Current directory entry pointer
 | 
						|
  LIST_ENTRY    ChildList;                    // List of all directory entries
 | 
						|
  BOOLEAN       EndOfDir;                     // Indicate whether we have reached the end of the directory
 | 
						|
  LIST_ENTRY    DirCacheLink;                 // Linked in Volume->DirCacheList when discarded
 | 
						|
  UINTN         DirCacheTag;                  // The identification of the directory when in directory cache
 | 
						|
  FAT_DIRENT    *LongNameHashTable[HASH_TABLE_SIZE];
 | 
						|
  FAT_DIRENT    *ShortNameHashTable[HASH_TABLE_SIZE];
 | 
						|
};
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  UINTN                Signature;
 | 
						|
  EFI_FILE_PROTOCOL    Handle;
 | 
						|
  UINT64               Position;
 | 
						|
  BOOLEAN              ReadOnly;
 | 
						|
  FAT_OFILE            *OFile;
 | 
						|
  LIST_ENTRY           Tasks;                 // List of all FAT_TASKs
 | 
						|
  LIST_ENTRY           Link;                  // Link to other IFiles
 | 
						|
} FAT_IFILE;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  UINTN                Signature;
 | 
						|
  EFI_FILE_IO_TOKEN    *FileIoToken;
 | 
						|
  FAT_IFILE            *IFile;
 | 
						|
  LIST_ENTRY           Subtasks;              // List of all FAT_SUBTASKs
 | 
						|
  LIST_ENTRY           Link;                  // Link to other FAT_TASKs
 | 
						|
} FAT_TASK;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  UINTN                 Signature;
 | 
						|
  EFI_DISK_IO2_TOKEN    DiskIo2Token;
 | 
						|
  FAT_TASK              *Task;
 | 
						|
  BOOLEAN               Write;
 | 
						|
  UINT64                Offset;
 | 
						|
  VOID                  *Buffer;
 | 
						|
  UINTN                 BufferSize;
 | 
						|
  LIST_ENTRY            Link;
 | 
						|
} FAT_SUBTASK;
 | 
						|
 | 
						|
//
 | 
						|
// FAT_OFILE - Each opened file
 | 
						|
//
 | 
						|
struct _FAT_OFILE {
 | 
						|
  UINTN         Signature;
 | 
						|
  FAT_VOLUME    *Volume;
 | 
						|
  //
 | 
						|
  // A permanent error code to return to all accesses to
 | 
						|
  // this opened file
 | 
						|
  //
 | 
						|
  EFI_STATUS    Error;
 | 
						|
  //
 | 
						|
  // A list of the IFILE instances for this OFile
 | 
						|
  //
 | 
						|
  LIST_ENTRY    Opens;
 | 
						|
 | 
						|
  //
 | 
						|
  // The dynamic information
 | 
						|
  //
 | 
						|
  UINTN         FileSize;
 | 
						|
  UINTN         FileCluster;
 | 
						|
  UINTN         FileCurrentCluster;
 | 
						|
  UINTN         FileLastCluster;
 | 
						|
 | 
						|
  //
 | 
						|
  // Dirty is set if there have been any updates to the
 | 
						|
  // file
 | 
						|
  // Archive is set if the archive attribute in the file's
 | 
						|
  // directory entry needs to be set when performing flush
 | 
						|
  // PreserveLastMod is set if the last modification of the
 | 
						|
  // file is specified by SetInfo API
 | 
						|
  //
 | 
						|
  BOOLEAN       Dirty;
 | 
						|
  BOOLEAN       IsFixedRootDir;
 | 
						|
  BOOLEAN       PreserveLastModification;
 | 
						|
  BOOLEAN       Archive;
 | 
						|
  //
 | 
						|
  // Set by an OFile SetPosition
 | 
						|
  //
 | 
						|
  UINTN         Position;       // within file
 | 
						|
  UINT64        PosDisk;        // on the disk
 | 
						|
  UINTN         PosRem;         // remaining in this disk run
 | 
						|
  //
 | 
						|
  // The opened parent, full path length and currently opened child files
 | 
						|
  //
 | 
						|
  FAT_OFILE     *Parent;
 | 
						|
  UINTN         FullPathLen;
 | 
						|
  LIST_ENTRY    ChildHead;
 | 
						|
  LIST_ENTRY    ChildLink;
 | 
						|
 | 
						|
  //
 | 
						|
  // The opened directory structure for a directory; if this
 | 
						|
  // OFile represents a file, then ODir = NULL
 | 
						|
  //
 | 
						|
  FAT_ODIR      *ODir;
 | 
						|
  //
 | 
						|
  // The directory entry for the Ofile
 | 
						|
  //
 | 
						|
  FAT_DIRENT    *DirEnt;
 | 
						|
 | 
						|
  //
 | 
						|
  // Link in Volume's reference list
 | 
						|
  //
 | 
						|
  LIST_ENTRY    CheckLink;
 | 
						|
};
 | 
						|
 | 
						|
struct _FAT_VOLUME {
 | 
						|
  UINTN                              Signature;
 | 
						|
 | 
						|
  EFI_HANDLE                         Handle;
 | 
						|
  BOOLEAN                            Valid;
 | 
						|
  BOOLEAN                            DiskError;
 | 
						|
 | 
						|
  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL    VolumeInterface;
 | 
						|
 | 
						|
  //
 | 
						|
  // If opened, the parent handle and BlockIo interface
 | 
						|
  //
 | 
						|
  EFI_BLOCK_IO_PROTOCOL              *BlockIo;
 | 
						|
  EFI_DISK_IO_PROTOCOL               *DiskIo;
 | 
						|
  EFI_DISK_IO2_PROTOCOL              *DiskIo2;
 | 
						|
  UINT32                             MediaId;
 | 
						|
  BOOLEAN                            ReadOnly;
 | 
						|
 | 
						|
  //
 | 
						|
  // Computed values from fat bpb info
 | 
						|
  //
 | 
						|
  UINT64                             VolumeSize;
 | 
						|
  UINT64                             FatPos;           // Disk pos of fat tables
 | 
						|
  UINT64                             RootPos;          // Disk pos of root directory
 | 
						|
  UINT64                             FirstClusterPos;  // Disk pos of first cluster
 | 
						|
  UINTN                              FatSize;          // Number of bytes in each fat
 | 
						|
  UINTN                              MaxCluster;       // Max cluster number
 | 
						|
  UINTN                              ClusterSize;      // Cluster size of fat partition
 | 
						|
  UINT8                              ClusterAlignment; // Equal to log_2 (clustersize);
 | 
						|
  FAT_VOLUME_TYPE                    FatType;
 | 
						|
 | 
						|
  //
 | 
						|
  // Current part of fat table that's present
 | 
						|
  //
 | 
						|
  UINT64                             FatEntryPos;    // Location of buffer
 | 
						|
  UINTN                              FatEntrySize;   // Size of buffer
 | 
						|
  UINT32                             FatEntryBuffer; // The buffer
 | 
						|
  FAT_INFO_SECTOR                    FatInfoSector;  // Free cluster info
 | 
						|
  UINTN                              FreeInfoPos;    // Pos with the free cluster info
 | 
						|
  BOOLEAN                            FreeInfoValid;  // If free cluster info is valid
 | 
						|
  //
 | 
						|
  // Unpacked Fat BPB info
 | 
						|
  //
 | 
						|
  UINTN                              NumFats;
 | 
						|
  UINTN                              RootEntries; // < FAT32, root dir is fixed size
 | 
						|
  UINTN                              RootCluster; // >= FAT32, root cluster chain head
 | 
						|
  //
 | 
						|
  // info for marking the volume dirty or not
 | 
						|
  //
 | 
						|
  BOOLEAN                            FatDirty;    // If fat-entries have been updated
 | 
						|
  UINT32                             DirtyValue;
 | 
						|
  UINT32                             NotDirtyValue;
 | 
						|
 | 
						|
  //
 | 
						|
  // The root directory entry and opened root file
 | 
						|
  //
 | 
						|
  FAT_DIRENT                         RootDirEnt;
 | 
						|
  //
 | 
						|
  // File Name of root OFile, it is empty string
 | 
						|
  //
 | 
						|
  CHAR16                             RootFileString[1];
 | 
						|
  FAT_OFILE                          *Root;
 | 
						|
 | 
						|
  //
 | 
						|
  // New OFiles are added to this list so they
 | 
						|
  // can be cleaned up if they aren't referenced.
 | 
						|
  //
 | 
						|
  LIST_ENTRY                         CheckRef;
 | 
						|
 | 
						|
  //
 | 
						|
  // Directory cache List
 | 
						|
  //
 | 
						|
  LIST_ENTRY                         DirCacheList;
 | 
						|
  UINTN                              DirCacheCount;
 | 
						|
 | 
						|
  //
 | 
						|
  // Disk Cache for this volume
 | 
						|
  //
 | 
						|
  VOID                               *CacheBuffer;
 | 
						|
  DISK_CACHE                         DiskCache[CacheMaxType];
 | 
						|
};
 | 
						|
 | 
						|
//
 | 
						|
// Function Prototypes
 | 
						|
//
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Implements Open() of Simple File System Protocol.
 | 
						|
 | 
						|
  @param  FHand                 - File handle of the file serves as a starting reference point.
 | 
						|
  @param  NewHandle             - Handle of the file that is newly opened.
 | 
						|
  @param  FileName              - File name relative to FHand.
 | 
						|
  @param  OpenMode              - Open mode.
 | 
						|
  @param  Attributes            - Attributes to set if the file is created.
 | 
						|
 | 
						|
 | 
						|
  @retval EFI_INVALID_PARAMETER - The FileName is NULL or the file string is empty.
 | 
						|
                          The OpenMode is not supported.
 | 
						|
                          The Attributes is not the valid attributes.
 | 
						|
  @retval EFI_OUT_OF_RESOURCES  - Can not allocate the memory for file string.
 | 
						|
  @retval EFI_SUCCESS           - Open the file successfully.
 | 
						|
  @return Others                - The status of open file.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
FatOpen (
 | 
						|
  IN  EFI_FILE_PROTOCOL  *FHand,
 | 
						|
  OUT EFI_FILE_PROTOCOL  **NewHandle,
 | 
						|
  IN  CHAR16             *FileName,
 | 
						|
  IN  UINT64             OpenMode,
 | 
						|
  IN  UINT64             Attributes
 | 
						|
  )
 | 
						|
;
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Implements OpenEx() of Simple File System Protocol.
 | 
						|
 | 
						|
  @param  FHand                 - File handle of the file serves as a starting reference point.
 | 
						|
  @param  NewHandle             - Handle of the file that is newly opened.
 | 
						|
  @param  FileName              - File name relative to FHand.
 | 
						|
  @param  OpenMode              - Open mode.
 | 
						|
  @param  Attributes            - Attributes to set if the file is created.
 | 
						|
  @param  Token                 - A pointer to the token associated with the transaction.
 | 
						|
 | 
						|
  @retval EFI_INVALID_PARAMETER - The FileName is NULL or the file string is empty.
 | 
						|
                          The OpenMode is not supported.
 | 
						|
                          The Attributes is not the valid attributes.
 | 
						|
  @retval EFI_OUT_OF_RESOURCES  - Can not allocate the memory for file string.
 | 
						|
  @retval EFI_SUCCESS           - Open the file successfully.
 | 
						|
  @return Others                - The status of open file.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
FatOpenEx (
 | 
						|
  IN  EFI_FILE_PROTOCOL     *FHand,
 | 
						|
  OUT EFI_FILE_PROTOCOL     **NewHandle,
 | 
						|
  IN  CHAR16                *FileName,
 | 
						|
  IN  UINT64                OpenMode,
 | 
						|
  IN  UINT64                Attributes,
 | 
						|
  IN OUT EFI_FILE_IO_TOKEN  *Token
 | 
						|
  )
 | 
						|
;
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Get the file's position of the file
 | 
						|
 | 
						|
  @param  FHand                 - The handle of file.
 | 
						|
  @param  Position              - The file's position of the file.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - Get the info successfully.
 | 
						|
  @retval EFI_DEVICE_ERROR      - Can not find the OFile for the file.
 | 
						|
  @retval EFI_UNSUPPORTED       - The open file is not a file.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
FatGetPosition (
 | 
						|
  IN  EFI_FILE_PROTOCOL  *FHand,
 | 
						|
  OUT UINT64             *Position
 | 
						|
  )
 | 
						|
;
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Get the some types info of the file into Buffer
 | 
						|
 | 
						|
  @param  FHand                 - The handle of file.
 | 
						|
  @param  Type                  - The type of the info.
 | 
						|
  @param  BufferSize            - Size of Buffer.
 | 
						|
  @param  Buffer                - Buffer containing volume info.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - Get the info successfully.
 | 
						|
  @retval EFI_DEVICE_ERROR      - Can not find the OFile for the file.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
FatGetInfo (
 | 
						|
  IN     EFI_FILE_PROTOCOL  *FHand,
 | 
						|
  IN     EFI_GUID           *Type,
 | 
						|
  IN OUT UINTN              *BufferSize,
 | 
						|
  OUT VOID                  *Buffer
 | 
						|
  )
 | 
						|
;
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Set the some types info of the file into Buffer.
 | 
						|
 | 
						|
  @param  FHand                 - The handle of file.
 | 
						|
  @param  Type                  - The type of the info.
 | 
						|
  @param  BufferSize            - Size of Buffer.
 | 
						|
  @param  Buffer                - Buffer containing volume info.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - Set the info successfully.
 | 
						|
  @retval EFI_DEVICE_ERROR      - Can not find the OFile for the file.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
FatSetInfo (
 | 
						|
  IN EFI_FILE_PROTOCOL  *FHand,
 | 
						|
  IN EFI_GUID           *Type,
 | 
						|
  IN UINTN              BufferSize,
 | 
						|
  IN VOID               *Buffer
 | 
						|
  )
 | 
						|
;
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Flushes all data associated with the file handle.
 | 
						|
 | 
						|
  @param  FHand                 - Handle to file to flush
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - Flushed the file successfully
 | 
						|
  @retval EFI_WRITE_PROTECTED   - The volume is read only
 | 
						|
  @retval EFI_ACCESS_DENIED     - The volume is not read only
 | 
						|
                          but the file is read only
 | 
						|
  @return Others                - Flushing of the file is failed
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
FatFlush (
 | 
						|
  IN EFI_FILE_PROTOCOL  *FHand
 | 
						|
  )
 | 
						|
;
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Flushes all data associated with the file handle.
 | 
						|
 | 
						|
  @param  FHand                 - Handle to file to flush.
 | 
						|
  @param  Token                 - A pointer to the token associated with the transaction.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - Flushed the file successfully.
 | 
						|
  @retval EFI_WRITE_PROTECTED   - The volume is read only.
 | 
						|
  @retval EFI_ACCESS_DENIED     - The file is read only.
 | 
						|
  @return Others                - Flushing of the file failed.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
FatFlushEx (
 | 
						|
  IN EFI_FILE_PROTOCOL  *FHand,
 | 
						|
  IN EFI_FILE_IO_TOKEN  *Token
 | 
						|
  )
 | 
						|
;
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Flushes & Closes the file handle.
 | 
						|
 | 
						|
  @param  FHand                 - Handle to the file to delete.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - Closed the file successfully.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
FatClose (
 | 
						|
  IN EFI_FILE_PROTOCOL  *FHand
 | 
						|
  )
 | 
						|
;
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Deletes the file & Closes the file handle.
 | 
						|
 | 
						|
  @param  FHand                    - Handle to the file to delete.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS              - Delete the file successfully.
 | 
						|
  @retval EFI_WARN_DELETE_FAILURE  - Fail to delete the file.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
FatDelete (
 | 
						|
  IN EFI_FILE_PROTOCOL  *FHand
 | 
						|
  )
 | 
						|
;
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Set the file's position of the file.
 | 
						|
 | 
						|
  @param  FHand                 - The handle of file
 | 
						|
  @param  Position              - The file's position of the file
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - Set the info successfully
 | 
						|
  @retval EFI_DEVICE_ERROR      - Can not find the OFile for the file
 | 
						|
  @retval EFI_UNSUPPORTED       - Set a directory with a not-zero position
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
FatSetPosition (
 | 
						|
  IN EFI_FILE_PROTOCOL  *FHand,
 | 
						|
  IN UINT64             Position
 | 
						|
  )
 | 
						|
;
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Get the file info.
 | 
						|
 | 
						|
  @param FHand                 - The handle of the file.
 | 
						|
  @param BufferSize            - Size of Buffer.
 | 
						|
  @param Buffer                - Buffer containing read data.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - Get the file info successfully.
 | 
						|
  @retval EFI_DEVICE_ERROR      - Can not find the OFile for the file.
 | 
						|
  @retval EFI_VOLUME_CORRUPTED  - The file type of open file is error.
 | 
						|
  @return other                 - An error occurred when operation the disk.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
FatRead (
 | 
						|
  IN     EFI_FILE_PROTOCOL  *FHand,
 | 
						|
  IN OUT UINTN              *BufferSize,
 | 
						|
  OUT VOID                  *Buffer
 | 
						|
  )
 | 
						|
;
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Get the file info.
 | 
						|
 | 
						|
  @param FHand                 - The handle of the file.
 | 
						|
  @param Token                 - A pointer to the token associated with the transaction.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - Get the file info successfully.
 | 
						|
  @retval EFI_DEVICE_ERROR      - Can not find the OFile for the file.
 | 
						|
  @retval EFI_VOLUME_CORRUPTED  - The file type of open file is error.
 | 
						|
  @return other                 - An error occurred when operation the disk.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
FatReadEx (
 | 
						|
  IN     EFI_FILE_PROTOCOL  *FHand,
 | 
						|
  IN OUT EFI_FILE_IO_TOKEN  *Token
 | 
						|
  )
 | 
						|
;
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Set the file info.
 | 
						|
 | 
						|
  @param  FHand                 - The handle of the file.
 | 
						|
  @param  BufferSize            - Size of Buffer.
 | 
						|
  @param Buffer                - Buffer containing write data.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - Set the file info successfully.
 | 
						|
  @retval EFI_WRITE_PROTECTED   - The disk is write protected.
 | 
						|
  @retval EFI_ACCESS_DENIED     - The file is read-only.
 | 
						|
  @retval EFI_DEVICE_ERROR      - The OFile is not valid.
 | 
						|
  @retval EFI_UNSUPPORTED       - The open file is not a file.
 | 
						|
                        - The writing file size is larger than 4GB.
 | 
						|
  @return other                 - An error occurred when operation the disk.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
FatWrite (
 | 
						|
  IN     EFI_FILE_PROTOCOL  *FHand,
 | 
						|
  IN OUT UINTN              *BufferSize,
 | 
						|
  IN     VOID               *Buffer
 | 
						|
  )
 | 
						|
;
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Get the file info.
 | 
						|
 | 
						|
  @param  FHand                 - The handle of the file.
 | 
						|
  @param  Token                 - A pointer to the token associated with the transaction.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - Get the file info successfully.
 | 
						|
  @retval EFI_DEVICE_ERROR      - Can not find the OFile for the file.
 | 
						|
  @retval EFI_VOLUME_CORRUPTED  - The file type of open file is error.
 | 
						|
  @return other                 - An error occurred when operation the disk.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
FatWriteEx (
 | 
						|
  IN     EFI_FILE_PROTOCOL  *FHand,
 | 
						|
  IN OUT EFI_FILE_IO_TOKEN  *Token
 | 
						|
  )
 | 
						|
;
 | 
						|
 | 
						|
//
 | 
						|
// DiskCache.c
 | 
						|
//
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Initialize the disk cache according to Volume's FatType.
 | 
						|
 | 
						|
  @param  Volume                - FAT file system volume.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - The disk cache is successfully initialized.
 | 
						|
  @retval EFI_OUT_OF_RESOURCES  - Not enough memory to allocate disk cache.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatInitializeDiskCache (
 | 
						|
  IN FAT_VOLUME  *Volume
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Read BufferSize bytes from the position of Offset into Buffer,
 | 
						|
  or write BufferSize bytes from Buffer into the position of Offset.
 | 
						|
 | 
						|
  Base on the parameter of CACHE_DATA_TYPE, the data access will be divided into
 | 
						|
  the access of FAT cache (CACHE_FAT) and the access of Data cache (CACHE_DATA):
 | 
						|
 | 
						|
  1. Access of FAT cache (CACHE_FAT): Access the data in the FAT cache, if there is cache
 | 
						|
     page hit, just return the cache page; else update the related cache page and return
 | 
						|
     the right cache page.
 | 
						|
  2. Access of Data cache (CACHE_DATA):
 | 
						|
     The access data will be divided into UnderRun data, Aligned data and OverRun data;
 | 
						|
     The UnderRun data and OverRun data will be accessed by the Data cache,
 | 
						|
     but the Aligned data will be accessed with disk directly.
 | 
						|
 | 
						|
  @param  Volume                - FAT file system volume.
 | 
						|
  @param  CacheDataType         - The type of cache: CACHE_DATA or CACHE_FAT.
 | 
						|
  @param  IoMode                - Indicate the type of disk access.
 | 
						|
  @param  Offset                - The starting byte offset to read from.
 | 
						|
  @param  BufferSize            - Size of Buffer.
 | 
						|
  @param  Buffer                - Buffer containing cache data.
 | 
						|
  @param  Task                    point to task instance.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - The data was accessed correctly.
 | 
						|
  @retval EFI_MEDIA_CHANGED     - The MediaId does not match the current device.
 | 
						|
  @return Others                - An error occurred when accessing cache.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatAccessCache (
 | 
						|
  IN     FAT_VOLUME       *Volume,
 | 
						|
  IN     CACHE_DATA_TYPE  CacheDataType,
 | 
						|
  IN     IO_MODE          IoMode,
 | 
						|
  IN     UINT64           Offset,
 | 
						|
  IN     UINTN            BufferSize,
 | 
						|
  IN OUT UINT8            *Buffer,
 | 
						|
  IN     FAT_TASK         *Task
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Flush all the dirty cache back, include the FAT cache and the Data cache.
 | 
						|
 | 
						|
  @param  Volume                - FAT file system volume.
 | 
						|
  @param  Task                    point to task instance.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - Flush all the dirty cache back successfully
 | 
						|
  @return other                 - An error occurred when writing the data into the disk
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatVolumeFlushCache (
 | 
						|
  IN FAT_VOLUME  *Volume,
 | 
						|
  IN FAT_TASK    *Task
 | 
						|
  );
 | 
						|
 | 
						|
//
 | 
						|
// Flush.c
 | 
						|
//
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Flush the data associated with an open file.
 | 
						|
  In this implementation, only last Mod/Access time is updated.
 | 
						|
 | 
						|
  @param  OFile                 - The open file.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - The OFile is flushed successfully.
 | 
						|
  @return Others                - An error occurred when flushing this OFile.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatOFileFlush (
 | 
						|
  IN FAT_OFILE  *OFile
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Check the references of the OFile.
 | 
						|
  If the OFile (that is checked) is no longer
 | 
						|
  referenced, then it is freed.
 | 
						|
 | 
						|
  @param  OFile                 - The OFile to be checked.
 | 
						|
 | 
						|
  @retval TRUE                  - The OFile is not referenced and freed.
 | 
						|
  @retval FALSE                 - The OFile is kept.
 | 
						|
 | 
						|
**/
 | 
						|
BOOLEAN
 | 
						|
FatCheckOFileRef (
 | 
						|
  IN FAT_OFILE  *OFile
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Set the OFile and its child OFile with the error Status
 | 
						|
 | 
						|
  @param  OFile                 - The OFile whose permanent error code is to be set.
 | 
						|
  @param  Status                - Error code to be set.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
FatSetVolumeError (
 | 
						|
  IN FAT_OFILE   *OFile,
 | 
						|
  IN EFI_STATUS  Status
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Close the open file instance.
 | 
						|
 | 
						|
  @param  IFile                 - Open file instance.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - Closed the file successfully.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatIFileClose (
 | 
						|
  FAT_IFILE  *IFile
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Set error status for a specific OFile, reference checking the volume.
 | 
						|
  If volume is already marked as invalid, and all resources are freed
 | 
						|
  after reference checking, the file system protocol is uninstalled and
 | 
						|
  the volume structure is freed.
 | 
						|
 | 
						|
  @param  Volume                - the Volume that is to be reference checked and unlocked.
 | 
						|
  @param  OFile                 - the OFile whose permanent error code is to be set.
 | 
						|
  @param  EfiStatus             - error code to be set.
 | 
						|
  @param  Task                    point to task instance.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - Clean up the volume successfully.
 | 
						|
  @return Others                - Cleaning up of the volume is failed.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatCleanupVolume (
 | 
						|
  IN FAT_VOLUME  *Volume,
 | 
						|
  IN FAT_OFILE   *OFile,
 | 
						|
  IN EFI_STATUS  EfiStatus,
 | 
						|
  IN FAT_TASK    *Task
 | 
						|
  );
 | 
						|
 | 
						|
//
 | 
						|
// FileSpace.c
 | 
						|
//
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Shrink the end of the open file base on the file size.
 | 
						|
 | 
						|
  @param  OFile                 - The open file.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - Shrinked successfully.
 | 
						|
  @retval EFI_VOLUME_CORRUPTED  - There are errors in the file's clusters.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatShrinkEof (
 | 
						|
  IN FAT_OFILE  *OFile
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Grow the end of the open file base on the NewSizeInBytes.
 | 
						|
 | 
						|
  @param  OFile                 - The open file.
 | 
						|
  @param  NewSizeInBytes        - The new size in bytes of the open file.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - The file is grown successfully.
 | 
						|
  @retval EFI_UNSUPPORTED       - The file size is larger than 4GB.
 | 
						|
  @retval EFI_VOLUME_CORRUPTED  - There are errors in the files' clusters.
 | 
						|
  @retval EFI_VOLUME_FULL       - The volume is full and can not grow the file.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatGrowEof (
 | 
						|
  IN FAT_OFILE  *OFile,
 | 
						|
  IN UINT64     NewSizeInBytes
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Get the size of directory of the open file.
 | 
						|
 | 
						|
  @param  Volume                - The File System Volume.
 | 
						|
  @param  Cluster               - The Starting cluster.
 | 
						|
 | 
						|
  @return The physical size of the file starting at the input cluster, if there is error in the
 | 
						|
  cluster chain, the return value is 0.
 | 
						|
 | 
						|
**/
 | 
						|
UINTN
 | 
						|
FatPhysicalDirSize (
 | 
						|
  IN FAT_VOLUME  *Volume,
 | 
						|
  IN UINTN       Cluster
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Get the physical size of a file on the disk.
 | 
						|
 | 
						|
  @param  Volume                - The file system volume.
 | 
						|
  @param  RealSize              - The real size of a file.
 | 
						|
 | 
						|
  @return The physical size of a file on the disk.
 | 
						|
 | 
						|
**/
 | 
						|
UINT64
 | 
						|
FatPhysicalFileSize (
 | 
						|
  IN FAT_VOLUME  *Volume,
 | 
						|
  IN UINTN       RealSize
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Seek OFile to requested position, and calculate the number of
 | 
						|
  consecutive clusters from the position in the file
 | 
						|
 | 
						|
  @param  OFile                 - The open file.
 | 
						|
  @param  Position              - The file's position which will be accessed.
 | 
						|
  @param  PosLimit              - The maximum length current reading/writing may access
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - Set the info successfully.
 | 
						|
  @retval EFI_VOLUME_CORRUPTED  - Cluster chain corrupt.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatOFilePosition (
 | 
						|
  IN FAT_OFILE  *OFile,
 | 
						|
  IN UINTN      Position,
 | 
						|
  IN UINTN      PosLimit
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Update the free cluster info of FatInfoSector of the volume.
 | 
						|
 | 
						|
  @param  Volume                - FAT file system volume.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
FatComputeFreeInfo (
 | 
						|
  IN FAT_VOLUME  *Volume
 | 
						|
  );
 | 
						|
 | 
						|
//
 | 
						|
// Init.c
 | 
						|
//
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Allocates volume structure, detects FAT file system, installs protocol,
 | 
						|
  and initialize cache.
 | 
						|
 | 
						|
  @param  Handle                - The handle of parent device.
 | 
						|
  @param  DiskIo                - The DiskIo of parent device.
 | 
						|
  @param  DiskIo2               - The DiskIo2 of parent device.
 | 
						|
  @param  BlockIo               - The BlockIo of parent device.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - Allocate a new volume successfully.
 | 
						|
  @retval EFI_OUT_OF_RESOURCES  - Can not allocate the memory.
 | 
						|
  @return Others                - Allocating a new volume failed.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatAllocateVolume (
 | 
						|
  IN  EFI_HANDLE             Handle,
 | 
						|
  IN  EFI_DISK_IO_PROTOCOL   *DiskIo,
 | 
						|
  IN  EFI_DISK_IO2_PROTOCOL  *DiskIo2,
 | 
						|
  IN  EFI_BLOCK_IO_PROTOCOL  *BlockIo
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Detects FAT file system on Disk and set relevant fields of Volume.
 | 
						|
 | 
						|
  @param Volume                - The volume structure.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - The Fat File System is detected successfully
 | 
						|
  @retval EFI_UNSUPPORTED       - The volume is not FAT file system.
 | 
						|
  @retval EFI_VOLUME_CORRUPTED  - The volume is corrupted.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatOpenDevice (
 | 
						|
  IN OUT FAT_VOLUME  *Volume
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Called by FatDriverBindingStop(), Abandon the volume.
 | 
						|
 | 
						|
  @param  Volume                - The volume to be abandoned.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - Abandoned the volume successfully.
 | 
						|
  @return Others                - Can not uninstall the protocol interfaces.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatAbandonVolume (
 | 
						|
  IN FAT_VOLUME  *Volume
 | 
						|
  );
 | 
						|
 | 
						|
//
 | 
						|
// Misc.c
 | 
						|
//
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Create the task
 | 
						|
 | 
						|
  @param  IFile                 - The instance of the open file.
 | 
						|
  @param  Token                 - A pointer to the token associated with the transaction.
 | 
						|
 | 
						|
  @return FAT_TASK *            - Return the task instance.
 | 
						|
 | 
						|
**/
 | 
						|
FAT_TASK *
 | 
						|
FatCreateTask (
 | 
						|
  FAT_IFILE          *IFile,
 | 
						|
  EFI_FILE_IO_TOKEN  *Token
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Destroy the task.
 | 
						|
 | 
						|
  @param  Task                  - The task to be destroyed.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
FatDestroyTask (
 | 
						|
  FAT_TASK  *Task
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Wait all non-blocking requests complete.
 | 
						|
 | 
						|
  @param  IFile                 - The instance of the open file.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
FatWaitNonblockingTask (
 | 
						|
  FAT_IFILE  *IFile
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Remove the subtask from subtask list.
 | 
						|
 | 
						|
  @param  Subtask               - The subtask to be removed.
 | 
						|
 | 
						|
  @return LIST_ENTRY *          - The next node in the list.
 | 
						|
 | 
						|
**/
 | 
						|
LIST_ENTRY *
 | 
						|
FatDestroySubtask (
 | 
						|
  FAT_SUBTASK  *Subtask
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Execute the task.
 | 
						|
 | 
						|
  @param  IFile                 - The instance of the open file.
 | 
						|
  @param  Task                  - The task to be executed.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - The task was executed successfully.
 | 
						|
  @return other                 - An error occurred when executing the task.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatQueueTask (
 | 
						|
  IN FAT_IFILE  *IFile,
 | 
						|
  IN FAT_TASK   *Task
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Set the volume as dirty or not.
 | 
						|
 | 
						|
  @param  Volume                - FAT file system volume.
 | 
						|
  @param  IoMode                - The access mode.
 | 
						|
  @param  DirtyValue            - Set the volume as dirty or not.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - Set the new FAT entry value successfully.
 | 
						|
  @return other                 - An error occurred when operation the FAT entries.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatAccessVolumeDirty (
 | 
						|
  IN FAT_VOLUME  *Volume,
 | 
						|
  IN IO_MODE     IoMode,
 | 
						|
  IN VOID        *DirtyValue
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  General disk access function.
 | 
						|
 | 
						|
  @param  Volume                - FAT file system volume.
 | 
						|
  @param  IoMode                - The access mode (disk read/write or cache access).
 | 
						|
  @param  Offset                - The starting byte offset to read from.
 | 
						|
  @param  BufferSize            - Size of Buffer.
 | 
						|
  @param  Buffer                - Buffer containing read data.
 | 
						|
  @param  Task                    point to task instance.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - The operation is performed successfully.
 | 
						|
  @retval EFI_VOLUME_CORRUPTED  - The access is
 | 
						|
  @return Others                - The status of read/write the disk
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatDiskIo (
 | 
						|
  IN FAT_VOLUME  *Volume,
 | 
						|
  IN IO_MODE     IoMode,
 | 
						|
  IN UINT64      Offset,
 | 
						|
  IN UINTN       BufferSize,
 | 
						|
  IN OUT VOID    *Buffer,
 | 
						|
  IN FAT_TASK    *Task
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Lock the volume.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
FatAcquireLock (
 | 
						|
  VOID
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Unlock the volume.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
FatReleaseLock (
 | 
						|
  VOID
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Lock the volume.
 | 
						|
  If the lock is already in the acquired state, then EFI_ACCESS_DENIED is returned.
 | 
						|
  Otherwise, EFI_SUCCESS is returned.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - The volume is locked.
 | 
						|
  @retval EFI_ACCESS_DENIED     - The volume could not be locked because it is already locked.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatAcquireLockOrFail (
 | 
						|
  VOID
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Free directory entry.
 | 
						|
 | 
						|
  @param  DirEnt                - The directory entry to be freed.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
FatFreeDirEnt (
 | 
						|
  IN FAT_DIRENT  *DirEnt
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Free volume structure (including the contents of directory cache and disk cache).
 | 
						|
 | 
						|
  @param  Volume                - The volume structure to be freed.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
FatFreeVolume (
 | 
						|
  IN FAT_VOLUME  *Volume
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Translate EFI time to FAT time.
 | 
						|
 | 
						|
  @param  ETime                 - The time of EFI_TIME.
 | 
						|
  @param  FTime                 - The time of FAT_DATE_TIME.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
FatEfiTimeToFatTime (
 | 
						|
  IN EFI_TIME        *ETime,
 | 
						|
  OUT FAT_DATE_TIME  *FTime
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Translate Fat time to EFI time.
 | 
						|
 | 
						|
  @param  FTime                 - The time of FAT_DATE_TIME.
 | 
						|
  @param  ETime                 - The time of EFI_TIME..
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
FatFatTimeToEfiTime (
 | 
						|
  IN FAT_DATE_TIME  *FTime,
 | 
						|
  OUT EFI_TIME      *ETime
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Get Current FAT time.
 | 
						|
 | 
						|
  @param  FatTime               - Current FAT time.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
FatGetCurrentFatTime (
 | 
						|
  OUT FAT_DATE_TIME  *FatTime
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Check whether a time is valid.
 | 
						|
 | 
						|
  @param  Time                  - The time of EFI_TIME.
 | 
						|
 | 
						|
  @retval TRUE                  - The time is valid.
 | 
						|
  @retval FALSE                 - The time is not valid.
 | 
						|
 | 
						|
**/
 | 
						|
BOOLEAN
 | 
						|
FatIsValidTime (
 | 
						|
  IN EFI_TIME  *Time
 | 
						|
  );
 | 
						|
 | 
						|
//
 | 
						|
// UnicodeCollation.c
 | 
						|
//
 | 
						|
 | 
						|
/**
 | 
						|
  Initialize Unicode Collation support.
 | 
						|
 | 
						|
  It tries to locate Unicode Collation 2 protocol and matches it with current
 | 
						|
  platform language code. If for any reason the first attempt fails, it then tries to
 | 
						|
  use Unicode Collation Protocol.
 | 
						|
 | 
						|
  @param  AgentHandle          The handle used to open Unicode Collation (2) protocol.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS          The Unicode Collation (2) protocol has been successfully located.
 | 
						|
  @retval Others               The Unicode Collation (2) protocol has not been located.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
InitializeUnicodeCollationSupport (
 | 
						|
  IN EFI_HANDLE  AgentHandle
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Convert FAT string to unicode string.
 | 
						|
 | 
						|
  @param  FatSize               The size of FAT string.
 | 
						|
  @param  Fat                   The FAT string.
 | 
						|
  @param  String                The unicode string.
 | 
						|
 | 
						|
  @return None.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
FatFatToStr (
 | 
						|
  IN UINTN    FatSize,
 | 
						|
  IN CHAR8    *Fat,
 | 
						|
  OUT CHAR16  *String
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Convert unicode string to Fat string.
 | 
						|
 | 
						|
  @param  String                The unicode string.
 | 
						|
  @param  FatSize               The size of the FAT string.
 | 
						|
  @param  Fat                   The FAT string.
 | 
						|
 | 
						|
  @retval TRUE                  Convert successfully.
 | 
						|
  @retval FALSE                 Convert error.
 | 
						|
 | 
						|
**/
 | 
						|
BOOLEAN
 | 
						|
FatStrToFat (
 | 
						|
  IN  CHAR16  *String,
 | 
						|
  IN  UINTN   FatSize,
 | 
						|
  OUT CHAR8   *Fat
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Lowercase a string
 | 
						|
 | 
						|
  @param  Str                   The string which will be lower-cased.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
FatStrLwr (
 | 
						|
  IN CHAR16  *Str
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Uppercase a string.
 | 
						|
 | 
						|
  @param  Str                   The string which will be upper-cased.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
FatStrUpr (
 | 
						|
  IN CHAR16  *Str
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Performs a case-insensitive comparison of two Null-terminated Unicode strings.
 | 
						|
 | 
						|
  @param  Str1                   A pointer to a Null-terminated Unicode string.
 | 
						|
  @param  Str2                   A pointer to a Null-terminated Unicode string.
 | 
						|
 | 
						|
  @retval 0                    S1 is equivalent to S2.
 | 
						|
  @retval >0                   S1 is lexically greater than S2.
 | 
						|
  @retval <0                   S1 is lexically less than S2.
 | 
						|
**/
 | 
						|
INTN
 | 
						|
FatStriCmp (
 | 
						|
  IN CHAR16  *Str1,
 | 
						|
  IN CHAR16  *Str2
 | 
						|
  );
 | 
						|
 | 
						|
//
 | 
						|
// Open.c
 | 
						|
//
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Open a file for a file name relative to an existing OFile.
 | 
						|
  The IFile of the newly opened file is passed out.
 | 
						|
 | 
						|
  @param  OFile                 - The file that serves as a starting reference point.
 | 
						|
  @param  NewIFile              - The newly generated IFile instance.
 | 
						|
  @param  FileName              - The file name relative to the OFile.
 | 
						|
  @param  OpenMode              - Open mode.
 | 
						|
  @param  Attributes            - Attributes to set if the file is created.
 | 
						|
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - Open the file successfully.
 | 
						|
  @retval EFI_INVALID_PARAMETER - The open mode is conflict with the attributes
 | 
						|
                          or the file name is not valid.
 | 
						|
  @retval EFI_NOT_FOUND         - Conflicts between dir intention and attribute.
 | 
						|
  @retval EFI_WRITE_PROTECTED   - Can't open for write if the volume is read only.
 | 
						|
  @retval EFI_ACCESS_DENIED     - If the file's attribute is read only, and the
 | 
						|
                          open is for read-write fail it.
 | 
						|
  @retval EFI_OUT_OF_RESOURCES  - Can not allocate the memory.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatOFileOpen (
 | 
						|
  IN FAT_OFILE   *OFile,
 | 
						|
  OUT FAT_IFILE  **NewIFile,
 | 
						|
  IN CHAR16      *FileName,
 | 
						|
  IN UINT64      OpenMode,
 | 
						|
  IN UINT8       Attributes
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Create an Open instance for the existing OFile.
 | 
						|
  The IFile of the newly opened file is passed out.
 | 
						|
 | 
						|
  @param  OFile                 - The file that serves as a starting reference point.
 | 
						|
  @param  PtrIFile              - The newly generated IFile instance.
 | 
						|
 | 
						|
  @retval EFI_OUT_OF_RESOURCES  - Can not allocate the memory for the IFile
 | 
						|
  @retval EFI_SUCCESS           - Create the new IFile for the OFile successfully
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatAllocateIFile (
 | 
						|
  IN FAT_OFILE   *OFile,
 | 
						|
  OUT FAT_IFILE  **PtrIFile
 | 
						|
  );
 | 
						|
 | 
						|
//
 | 
						|
// OpenVolume.c
 | 
						|
//
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Implements Simple File System Protocol interface function OpenVolume().
 | 
						|
 | 
						|
  @param  This                  - Calling context.
 | 
						|
  @param  File                  - the Root Directory of the volume.
 | 
						|
 | 
						|
  @retval EFI_OUT_OF_RESOURCES  - Can not allocate the memory.
 | 
						|
  @retval EFI_VOLUME_CORRUPTED  - The FAT type is error.
 | 
						|
  @retval EFI_SUCCESS           - Open the volume successfully.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
FatOpenVolume (
 | 
						|
  IN  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL  *This,
 | 
						|
  OUT EFI_FILE_PROTOCOL                **File
 | 
						|
  );
 | 
						|
 | 
						|
//
 | 
						|
// ReadWrite.c
 | 
						|
//
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  This function reads data from a file or writes data to a file.
 | 
						|
  It uses OFile->PosRem to determine how much data can be accessed in one time.
 | 
						|
 | 
						|
  @param  OFile                 - The open file.
 | 
						|
  @param  IoMode                - Indicate whether the access mode is reading or writing.
 | 
						|
  @param  Position              - The position where data will be accessed.
 | 
						|
  @param  DataBufferSize        - Size of Buffer.
 | 
						|
  @param  UserBuffer            - Buffer containing data.
 | 
						|
  @param  Task                    point to task instance.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - Access the data successfully.
 | 
						|
  @return other                 - An error occurred when operating on the disk.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatAccessOFile (
 | 
						|
  IN FAT_OFILE  *OFile,
 | 
						|
  IN IO_MODE    IoMode,
 | 
						|
  IN UINTN      Position,
 | 
						|
  IN UINTN      *DataBufferSize,
 | 
						|
  IN UINT8      *UserBuffer,
 | 
						|
  IN FAT_TASK   *Task
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Expand OFile by appending zero bytes at the end of OFile.
 | 
						|
 | 
						|
  @param  OFile                 - The open file.
 | 
						|
  @param  ExpandedSize          - The number of zero bytes appended at the end of the file.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - The file is expanded successfully.
 | 
						|
  @return other                 - An error occurred when expanding file.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatExpandOFile (
 | 
						|
  IN FAT_OFILE  *OFile,
 | 
						|
  IN UINT64     ExpandedSize
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Write zero pool from the WritePos to the end of OFile.
 | 
						|
 | 
						|
  @param  OFile                 - The open file to write zero pool.
 | 
						|
  @param  WritePos              - The number of zero bytes written.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - Write the zero pool successfully.
 | 
						|
  @retval EFI_OUT_OF_RESOURCES  - Not enough memory to perform the operation.
 | 
						|
  @return other                 - An error occurred when writing disk.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatWriteZeroPool (
 | 
						|
  IN FAT_OFILE  *OFile,
 | 
						|
  IN UINTN      WritePos
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Truncate the OFile to smaller file size.
 | 
						|
 | 
						|
  @param  OFile                 - The open file.
 | 
						|
  @param  TruncatedSize         - The new file size.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - The file is truncated successfully.
 | 
						|
  @return other                 - An error occurred when truncating file.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatTruncateOFile (
 | 
						|
  IN FAT_OFILE  *OFile,
 | 
						|
  IN UINTN      TruncatedSize
 | 
						|
  );
 | 
						|
 | 
						|
//
 | 
						|
// DirectoryManage.c
 | 
						|
//
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Set the OFile's current directory cursor to the list head.
 | 
						|
 | 
						|
  @param OFile                 - The directory OFile whose directory cursor is reset.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
FatResetODirCursor (
 | 
						|
  IN FAT_OFILE  *OFile
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Set the directory's cursor to the next and get the next directory entry.
 | 
						|
 | 
						|
  @param  OFile                 - The parent OFile.
 | 
						|
  @param PtrDirEnt             - The next directory entry.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - We get the next directory entry successfully.
 | 
						|
  @return other                 - An error occurred when get next directory entry.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatGetNextDirEnt (
 | 
						|
  IN  FAT_OFILE   *OFile,
 | 
						|
  OUT FAT_DIRENT  **PtrDirEnt
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Remove this directory entry node from the list of directory entries and hash table.
 | 
						|
 | 
						|
  @param  OFile                - The parent OFile.
 | 
						|
  @param  DirEnt               - The directory entry to be removed.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS          - The directory entry is successfully removed.
 | 
						|
  @return other                - An error occurred when removing the directory entry.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatRemoveDirEnt (
 | 
						|
  IN FAT_OFILE   *OFile,
 | 
						|
  IN FAT_DIRENT  *DirEnt
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Save the directory entry to disk.
 | 
						|
 | 
						|
  @param  OFile                 - The parent OFile which needs to update.
 | 
						|
  @param  DirEnt                - The directory entry to be saved.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - Store the directory entry successfully.
 | 
						|
  @return other                 - An error occurred when writing the directory entry.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatStoreDirEnt (
 | 
						|
  IN FAT_OFILE   *OFile,
 | 
						|
  IN FAT_DIRENT  *DirEnt
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Create a directory entry in the parent OFile.
 | 
						|
 | 
						|
  @param  OFile                 - The parent OFile.
 | 
						|
  @param  FileName              - The filename of the newly-created directory entry.
 | 
						|
  @param  Attributes            - The attribute of the newly-created directory entry.
 | 
						|
  @param  PtrDirEnt             - The pointer to the newly-created directory entry.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - The directory entry is successfully created.
 | 
						|
  @retval EFI_OUT_OF_RESOURCES  - Not enough memory to create the directory entry.
 | 
						|
  @return other                 - An error occurred when creating the directory entry.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatCreateDirEnt (
 | 
						|
  IN  FAT_OFILE   *OFile,
 | 
						|
  IN  CHAR16      *FileName,
 | 
						|
  IN  UINT8       Attributes,
 | 
						|
  OUT FAT_DIRENT  **PtrDirEnt
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Determine whether the directory entry is "." or ".." entry.
 | 
						|
 | 
						|
  @param  DirEnt               - The corresponding directory entry.
 | 
						|
 | 
						|
  @retval TRUE                 - The directory entry is "." or ".." directory entry
 | 
						|
  @retval FALSE                - The directory entry is not "." or ".." directory entry
 | 
						|
 | 
						|
**/
 | 
						|
BOOLEAN
 | 
						|
FatIsDotDirEnt (
 | 
						|
  IN FAT_DIRENT  *DirEnt
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Set the OFile's cluster and size info in its directory entry.
 | 
						|
 | 
						|
  @param  OFile                 - The corresponding OFile.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
FatUpdateDirEntClusterSizeInfo (
 | 
						|
  IN FAT_OFILE  *OFile
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Copy all the information of DirEnt2 to DirEnt1 except for 8.3 name.
 | 
						|
 | 
						|
  @param  DirEnt1               - The destination directory entry.
 | 
						|
  @param  DirEnt2               - The source directory entry.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
FatCloneDirEnt (
 | 
						|
  IN  FAT_DIRENT  *DirEnt1,
 | 
						|
  IN  FAT_DIRENT  *DirEnt2
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Get the directory entry's info into Buffer.
 | 
						|
 | 
						|
  @param  Volume                - FAT file system volume.
 | 
						|
  @param  DirEnt                - The corresponding directory entry.
 | 
						|
  @param  BufferSize            - Size of Buffer.
 | 
						|
  @param  Buffer                - Buffer containing file info.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - Get the file info successfully.
 | 
						|
  @retval EFI_BUFFER_TOO_SMALL  - The buffer is too small.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatGetDirEntInfo (
 | 
						|
  IN FAT_VOLUME  *Volume,
 | 
						|
  IN FAT_DIRENT  *DirEnt,
 | 
						|
  IN OUT UINTN   *BufferSize,
 | 
						|
  OUT VOID       *Buffer
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Open the directory entry to get the OFile.
 | 
						|
 | 
						|
  @param  Parent                - The parent OFile.
 | 
						|
  @param  DirEnt                - The directory entry to be opened.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - The directory entry is successfully opened.
 | 
						|
  @retval EFI_OUT_OF_RESOURCES  - not enough memory to allocate a new OFile.
 | 
						|
  @return other                 - An error occurred when opening the directory entry.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatOpenDirEnt (
 | 
						|
  IN FAT_OFILE   *OFile,
 | 
						|
  IN FAT_DIRENT  *DirEnt
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Create "." and ".." directory entries in the newly-created parent OFile.
 | 
						|
 | 
						|
  @param  OFile                 - The parent OFile.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - The dot directory entries are successfully created.
 | 
						|
  @return other                 - An error occurred when creating the directory entry.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatCreateDotDirEnts (
 | 
						|
  IN FAT_OFILE  *OFile
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Close the directory entry and free the OFile.
 | 
						|
 | 
						|
  @param  DirEnt               - The directory entry to be closed.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
FatCloseDirEnt (
 | 
						|
  IN FAT_DIRENT  *DirEnt
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Traverse filename and open all OFiles that can be opened.
 | 
						|
  Update filename pointer to the component that can't be opened.
 | 
						|
  If more than one name component remains, returns an error;
 | 
						|
  otherwise, return the remaining name component so that the caller might choose to create it.
 | 
						|
 | 
						|
  @param  PtrOFile              - As input, the reference OFile; as output, the located OFile.
 | 
						|
  @param  FileName              - The file name relevant to the OFile.
 | 
						|
  @param  Attributes            - The attribute of the destination OFile.
 | 
						|
  @param  NewFileName           - The remaining file name.
 | 
						|
 | 
						|
  @retval EFI_NOT_FOUND         - The file name can't be opened and there is more than one
 | 
						|
                          components within the name left (this means the name can
 | 
						|
                          not be created either).
 | 
						|
  @retval EFI_INVALID_PARAMETER - The parameter is not valid.
 | 
						|
  @retval EFI_SUCCESS           - Open the file successfully.
 | 
						|
  @return other                 - An error occurred when locating the OFile.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatLocateOFile (
 | 
						|
  IN OUT FAT_OFILE  **PtrOFile,
 | 
						|
  IN     CHAR16     *FileName,
 | 
						|
  IN     UINT8      Attributes,
 | 
						|
  OUT CHAR16        *NewFileName
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Get the directory entry for the volume.
 | 
						|
 | 
						|
  @param  Volume                - FAT file system volume.
 | 
						|
  @param  Name                  - The file name of the volume.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           - Update the volume with the directory entry successfully.
 | 
						|
  @return others                - An error occurred when getting volume label.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatGetVolumeEntry (
 | 
						|
  IN FAT_VOLUME  *Volume,
 | 
						|
  IN CHAR16      *Name
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Set the relevant directory entry into disk for the volume.
 | 
						|
 | 
						|
  @param  Volume              - FAT file system volume.
 | 
						|
  @param  Name                - The new file name of the volume.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS         - Update the Volume successfully.
 | 
						|
  @retval EFI_UNSUPPORTED     - The input label is not a valid volume label.
 | 
						|
  @return other               - An error occurred when setting volume label.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FatSetVolumeEntry (
 | 
						|
  IN FAT_VOLUME  *Volume,
 | 
						|
  IN CHAR16      *Name
 | 
						|
  );
 | 
						|
 | 
						|
//
 | 
						|
// Hash.c
 | 
						|
//
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Search the long name hash table for the directory entry.
 | 
						|
 | 
						|
  @param  ODir                  - The directory to be searched.
 | 
						|
  @param  LongNameString        - The long name string to search.
 | 
						|
 | 
						|
  @return The previous long name hash node of the directory entry.
 | 
						|
 | 
						|
**/
 | 
						|
FAT_DIRENT **
 | 
						|
FatLongNameHashSearch (
 | 
						|
  IN FAT_ODIR  *ODir,
 | 
						|
  IN CHAR16    *LongNameString
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Search the short name hash table for the directory entry.
 | 
						|
 | 
						|
  @param  ODir                  - The directory to be searched.
 | 
						|
  @param  ShortNameString       - The short name string to search.
 | 
						|
 | 
						|
  @return The previous short name hash node of the directory entry.
 | 
						|
 | 
						|
**/
 | 
						|
FAT_DIRENT **
 | 
						|
FatShortNameHashSearch (
 | 
						|
  IN FAT_ODIR  *ODir,
 | 
						|
  IN CHAR8     *ShortNameString
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Insert directory entry to hash table.
 | 
						|
 | 
						|
  @param  ODir                  - The parent directory.
 | 
						|
  @param  DirEnt                - The directory entry node.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
FatInsertToHashTable (
 | 
						|
  IN FAT_ODIR    *ODir,
 | 
						|
  IN FAT_DIRENT  *DirEnt
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Delete directory entry from hash table.
 | 
						|
 | 
						|
  @param  ODir                  - The parent directory.
 | 
						|
  @param  DirEnt                - The directory entry node.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
FatDeleteFromHashTable (
 | 
						|
  IN FAT_ODIR    *ODir,
 | 
						|
  IN FAT_DIRENT  *DirEnt
 | 
						|
  );
 | 
						|
 | 
						|
//
 | 
						|
// FileName.c
 | 
						|
//
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  This function checks whether the input FileName is a valid 8.3 short name.
 | 
						|
  If the input FileName is a valid 8.3, the output is the 8.3 short name;
 | 
						|
  otherwise, the output is the base tag of 8.3 short name.
 | 
						|
 | 
						|
  @param  FileName              - The input unicode filename.
 | 
						|
  @param  File8Dot3Name         - The output ascii 8.3 short name or base tag of 8.3 short name.
 | 
						|
 | 
						|
  @retval TRUE                  - The input unicode filename is a valid 8.3 short name.
 | 
						|
  @retval FALSE                 - The input unicode filename is not a valid 8.3 short name.
 | 
						|
 | 
						|
**/
 | 
						|
BOOLEAN
 | 
						|
FatCheckIs8Dot3Name (
 | 
						|
  IN CHAR16  *FileName,
 | 
						|
  OUT CHAR8  *File8Dot3Name
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  This function generates 8Dot3 name from user specified name for a newly created file.
 | 
						|
 | 
						|
  @param  Parent                - The parent directory.
 | 
						|
  @param  DirEnt                - The directory entry whose 8Dot3Name needs to be generated.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
FatCreate8Dot3Name (
 | 
						|
  IN FAT_OFILE   *Parent,
 | 
						|
  IN FAT_DIRENT  *DirEnt
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Convert the ascii fat name to the unicode string and strip trailing spaces,
 | 
						|
  and if necessary, convert the unicode string to lower case.
 | 
						|
 | 
						|
  @param  FatName               - The Char8 string needs to be converted.
 | 
						|
  @param  Len                   - The length of the fat name.
 | 
						|
  @param  LowerCase             - Indicate whether to convert the string to lower case.
 | 
						|
  @param  Str                   - The result of the conversion.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
FatNameToStr (
 | 
						|
  IN CHAR8   *FatName,
 | 
						|
  IN UINTN   Len,
 | 
						|
  IN UINTN   LowerCase,
 | 
						|
  IN CHAR16  *Str
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Set the caseflag value for the directory entry.
 | 
						|
 | 
						|
  @param DirEnt                - The logical directory entry whose caseflag value is to be set.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
FatSetCaseFlag (
 | 
						|
  IN FAT_DIRENT  *DirEnt
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Convert the 8.3 ASCII fat name to cased Unicode string according to case flag.
 | 
						|
 | 
						|
  @param  DirEnt                - The corresponding directory entry.
 | 
						|
  @param  FileString            - The output Unicode file name.
 | 
						|
  @param  FileStringMax           The max length of FileString.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
FatGetFileNameViaCaseFlag (
 | 
						|
  IN     FAT_DIRENT  *DirEnt,
 | 
						|
  IN OUT CHAR16      *FileString,
 | 
						|
  IN     UINTN       FileStringMax
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Get the Check sum for a short name.
 | 
						|
 | 
						|
  @param  ShortNameString       - The short name for a file.
 | 
						|
 | 
						|
  @retval Sum                   - UINT8 checksum.
 | 
						|
 | 
						|
**/
 | 
						|
UINT8
 | 
						|
FatCheckSum (
 | 
						|
  IN CHAR8  *ShortNameString
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Takes Path as input, returns the next name component
 | 
						|
  in Name, and returns the position after Name (e.g., the
 | 
						|
  start of the next name component)
 | 
						|
 | 
						|
  @param  Path                  - The path of one file.
 | 
						|
  @param  Name                  - The next name component in Path.
 | 
						|
 | 
						|
  The position after Name in the Path
 | 
						|
 | 
						|
**/
 | 
						|
CHAR16 *
 | 
						|
FatGetNextNameComponent (
 | 
						|
  IN  CHAR16  *Path,
 | 
						|
  OUT CHAR16  *Name
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Check whether the IFileName is valid long file name. If the IFileName is a valid
 | 
						|
  long file name, then we trim the possible leading blanks and leading/trailing dots.
 | 
						|
  the trimmed filename is stored in OutputFileName
 | 
						|
 | 
						|
  @param  InputFileName         - The input file name.
 | 
						|
  @param  OutputFileName        - The output file name.
 | 
						|
 | 
						|
  @retval TRUE                  - The InputFileName is a valid long file name.
 | 
						|
  @retval FALSE                 - The InputFileName is not a valid long file name.
 | 
						|
 | 
						|
**/
 | 
						|
BOOLEAN
 | 
						|
FatFileNameIsValid (
 | 
						|
  IN  CHAR16  *InputFileName,
 | 
						|
  OUT CHAR16  *OutputFileName
 | 
						|
  );
 | 
						|
 | 
						|
//
 | 
						|
// DirectoryCache.c
 | 
						|
//
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Discard the directory structure when an OFile will be freed.
 | 
						|
  Volume will cache this directory if the OFile does not represent a deleted file.
 | 
						|
 | 
						|
  @param  OFile                 - The OFile whose directory structure is to be discarded.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
FatDiscardODir (
 | 
						|
  IN FAT_OFILE  *OFile
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Request the directory structure when an OFile is newly generated.
 | 
						|
  If the directory structure is cached by volume, then just return this directory;
 | 
						|
  Otherwise, allocate a new one for OFile.
 | 
						|
 | 
						|
  @param  OFile                 - The OFile which requests directory structure.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
FatRequestODir (
 | 
						|
  IN FAT_OFILE  *OFile
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  Clean up all the cached directory structures when the volume is going to be abandoned.
 | 
						|
 | 
						|
  @param  Volume                - FAT file system volume.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
FatCleanupODirCache (
 | 
						|
  IN FAT_VOLUME  *Volume
 | 
						|
  );
 | 
						|
 | 
						|
//
 | 
						|
// Global Variables
 | 
						|
//
 | 
						|
extern EFI_DRIVER_BINDING_PROTOCOL   gFatDriverBinding;
 | 
						|
extern EFI_COMPONENT_NAME_PROTOCOL   gFatComponentName;
 | 
						|
extern EFI_COMPONENT_NAME2_PROTOCOL  gFatComponentName2;
 | 
						|
extern EFI_LOCK                      FatFsLock;
 | 
						|
extern EFI_LOCK                      FatTaskLock;
 | 
						|
extern EFI_FILE_PROTOCOL             FatFileInterface;
 | 
						|
 | 
						|
#endif
 |