diff options
Diffstat (limited to 'Core/EM/FileSystem/FileSystem.h')
-rw-r--r-- | Core/EM/FileSystem/FileSystem.h | 1480 |
1 files changed, 1480 insertions, 0 deletions
diff --git a/Core/EM/FileSystem/FileSystem.h b/Core/EM/FileSystem/FileSystem.h new file mode 100644 index 0000000..092eb9d --- /dev/null +++ b/Core/EM/FileSystem/FileSystem.h @@ -0,0 +1,1480 @@ +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2009, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Pkwy, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//********************************************************************** + +//********************************************************************** +// $Header: /Alaska/SOURCE/Core/Modules/FileSystem/FileSystem.h 13 10/24/11 10:56a Artems $ +// +// $Revision: 13 $ +// +// $Date: 10/24/11 10:56a $ +//********************************************************************** +// Revision History +// ---------------- +// $Log: /Alaska/SOURCE/Core/Modules/FileSystem/FileSystem.h $ +// +// 13 10/24/11 10:56a Artems +// EIP 73254: Remove "magic number" from source, added new #define macro +// +// 12 5/05/11 3:44p Pats +// [TAG] - EIP 58999 +// [Category]- BUG FIX +// [Severity]- Major +// [Symptom] - Cannot launch Shell from USB Filesystem device in Debug +// mode with latest Filesystem driver. +// [RootCause] - Functions using DISKIO were raising TPL to a fixed level. +// [Solution] - Modified above functions to check for the higher of the +// fixed level or current level. +// [Files] - Info.c, MediaAccess.c, Open.c, FileSystem.h +// +// 11 6/11/10 5:41p Pats +// EIP 39171: Long name sometimes not displayed, only short name. +// FetchLongName() in Open.c did not handle case where long name spilt +// over 2 clusters. Function modified to handle the case. +// Prototype changed here in this file. +// +// 10 8/28/09 11:59a Felixp +// Component Name protocol implementation is upadted to support both +// ComponentName and ComponentName2 protocols +// (based on value of the EFI_SPECIFICATION_VERSION SDL token). +// +// 9 7/02/09 5:47p Pats +// Updated to latest coding standard. No code changes. +// +// 8 4/13/07 7:07p Pats +// Edited to conform with coding standards. No code changes. +// +// +//********************************************************************** + +//<AMI_FHDR_START> +//---------------------------------------------------------------------- +// +// Name: FileSystem.h +// +// Description: Header file for Simple File System driver +// +//---------------------------------------------------------------------- +//<AMI_FHDR_END> + +//---------------------------------------------------------------------- + +#ifndef _SimpleFileSystem_ +#define _SimpleFileSystem_ + +#ifdef __cplusplus +extern "C" { +#endif + +//---------------------------------------------------------------------- + +#include <Efi.h> +#include <Token.h> +#include <Dxe.h> +#include <AmiDxeLib.h> +#include "Protocol\PciIo.h" +#include "Protocol\DevicePath.h" +#include "protocol\DriverBinding.h" +#include "protocol\BlockIo.h" +#include "protocol\DiskIo.h" +#include "Protocol\PDiskInfo.h" +#include "Protocol\SimpleFileSystem.h" +#include "Protocol\UnicodeCollation.h" +#include "Protocol\LoadedImage.h" +#include <Protocol\ComponentName.h> + +#define SIMPLE_FILE_SYSTEM_DRIVER_VERSION 0x010000 +#define BS_OEMName_Offset 3 +#define BPB_BytePerSec_Offset 11 +#define BPB_SecPerClus_Offset 13 +#define BPB_RsvdSecCnt_Offset 14 +#define BPB_NumFATs_Offset 16 +#define BPB_RootEntCnt_Offset 17 +#define BPB_TotSec16_Offset 19 +#define BPB_Media_Offset 21 +#define BPB_FATSz16_Offset 22 +#define BPB_SecPerTrk_Offset 24 +#define BPB_NumHeads_Offset 26 +#define BPB_Hiddsec_Offset 28 +#define BPB_TotSec32_Offset 32 + + +#define BS_DrvNum_Offset 36 +#define BS_Reserved1_Offset 37 +#define BS_BootSig_Offset 38 +#define BS_VolID_Offset 39 +#define BS_VolLab_Offset 43 +#define BS_FilSysType_Offset 54 + +#define BPB_FATSz32_Offset 36 +#define BPB_ExtFlags_Offset 40 +#define BPB_FSVer_Offset 42 +#define BPB_RootClus_Offset 44 +#define BPB_FSInfo_Offset 48 +#define BPB_BkBootSec_Offset 50 +#define BPB_Rserved_Offset 52 +#define BS_DrvNum_32_Offset 64 +#define BS_Reserved1_32_Offset 65 +#define BS_BootSig_32_Offset 66 +#define BS_VolID_32_Offset 67 +#define BS_VolLab_32_Offset 71 +#define BS_FilSysType_32_Offset 82 + +#define ATTR_READ_ONLY 0x01 +#define ATTR_HIDDEN 0x02 +#define ATTR_SYSTEM 0x04 +#define ATTR_VOLUME_ID 0x08 +#define ATTR_DIRECTORY 0x10 +#define ATTR_ARCHIVE 0x20 +#define ATTR_LONG_NAME (ATTR_READ_ONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME_ID) +#define ATTR_LONG_NAME_MASK (ATTR_READ_ONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME_ID | ATTR_ARCHIVE | ATTR_DIRECTORY) + +#define DIR_ENTRY_ERASE 0xE5 +#define MAX_LFN_LENGTH 255 +#define MAX_TOTAL_PATH_LENGTH 260 +#define MAX_LFN_SLOTS 20 + +#define MEMBLOCKSIZE 0x8000 +#define MEMALLOCSIZE 0x40 +#define MAX_OPEN_FHS 0x20 +#define FSI_Free_Count 488 +#define FSI_Nxt_Free 492 + +#pragma pack(1) + +//<AMI_SHDR_START> +//---------------------------------------------------------------------------- +// Name: FAT_DATE +// +// Description: File date structure +// +// Referrals: +// +//---------------------------------------------------------------------------- +//<AMI_SHDR_END> + + typedef struct { + UINT16 Day : 5; + UINT16 Month : 4; + UINT16 Year : 7; // From 1980 + } FAT_DATE; + + +//<AMI_SHDR_START> +//---------------------------------------------------------------------------- +// Name: FAT_TIME +// +// Description: File time structure +// +// Referrals: +// +//---------------------------------------------------------------------------- +//<AMI_SHDR_END> + + typedef struct { + UINT16 DoubleSecond : 5; + UINT16 Minute : 6; + UINT16 Hour : 5; + } FAT_TIME; + + +//<AMI_SHDR_START> +//---------------------------------------------------------------------------- +// Name: FAT_DATE_TIME +// +// Description: Contains FAT_TIME and FAT_DATE +// +// Referrals: +// +//---------------------------------------------------------------------------- +//<AMI_SHDR_END> + + typedef struct { + FAT_TIME Time; + FAT_DATE Date; + } FAT_DATE_TIME; + + +//<AMI_SHDR_START> +//---------------------------------------------------------------------------- +// Name: FAT_TYPE +// +// Description: Enumeration of fat types +// +// Referrals: +// +//---------------------------------------------------------------------------- +//<AMI_SHDR_END> + + typedef enum { + FAT12 = 1, + FAT16, + FAT32, + FAT_UNKNOWN + } FAT_TYPE; + + +//<AMI_SHDR_START> +//---------------------------------------------------------------------------- +// Name: REGIONS +// +// Description: Enumeration of volume regions +// +// Referrals: +// +//---------------------------------------------------------------------------- +//<AMI_SHDR_END> + + typedef enum { + RESERVED_REGION, + FAT_REGION, + DIRECTORY_REGION, + DATA_REGION + } REGIONS; + + +//<AMI_SHDR_START> +//---------------------------------------------------------------------------- +// Name: ACCESS_METHOD +// +// Description: Enumeration of access methods (read or write) +// +// Referrals: +// +//---------------------------------------------------------------------------- +//<AMI_SHDR_END> + + typedef enum { + READ_BLOCK, + WRITE_BLOCK + } ACCESS_METHOD; + + +//<AMI_SHDR_START> +//---------------------------------------------------------------------------- +// Name: DIR_ENTRY_32 +// +// Description: Structure of a FAT32 directory entry +// +// Referrals: +// +//---------------------------------------------------------------------------- +//<AMI_SHDR_END> + + typedef struct _DIR_ENTRY_32 { + + UINT8 Dir_Name[11]; + UINT8 Dir_Attr; + UINT8 Dir_NTRes; + UINT8 Dir_CrtTimeTenth; + UINT16 Dir_CrtTime; + UINT16 Dir_CrtDate; + UINT16 Dir_LstAccDate; + UINT16 Dir_FstClusHI; + UINT16 Dir_WrtTime; + UINT16 Dir_WrtDate; + UINT16 Dir_FstClusLO; + UINT32 Dir_FileSize; + + } DIR_ENTRY_32; + + +//<AMI_SHDR_START> +//---------------------------------------------------------------------------- +// Name: DIR_ENTRY_LFN +// +// Description: Structure of a long file name directory entry +// +// Referrals: +// +//---------------------------------------------------------------------------- +//<AMI_SHDR_END> + + typedef struct _DIR_ENTRY_LFN { + UINT8 Dir_Order; // Sequence number for slot + CHAR16 Dir_Name0_4[5]; // First 5 Unicode characters + UINT8 Dir_Attr; // Attributes, always 0x0F + UINT8 Dir_Reserved; // Reserved, always 0x00 + UINT8 Dir_Checksum; // Checksum of 8.3 name + CHAR16 Dir_Name5_10[6]; // 6 more Unicode characters + UINT16 Dir_FstClus; // First cluster number, must be 0 + CHAR16 Dir_Name11_12[2]; // Last 2 Unicode characters + } DIR_ENTRY_LFN; + + +//<AMI_SHDR_START> +//---------------------------------------------------------------------------- +// Name: BPB_COMMON +// +// Description: Structure of the common part of the BIOS parameter block +// +// Referrals: +// +//---------------------------------------------------------------------------- +//<AMI_SHDR_END> + + typedef struct _BPB_COMMON { + UINT8 BS_JmpBoot[3]; + UINT8 BS_OEMName[8]; + UINT16 BPB_BytePerSec; + UINT8 BPB_SecPerClus; + UINT16 BPB_RsvdSecCnt; + UINT8 BPB_NumFATs; + UINT16 BPB_RootEntCnt; + UINT16 BPB_TotSec16; + UINT8 BPB_Media; + UINT16 BPB_FATSz16; + UINT16 BPB_SecPerTrk; + UINT16 BPB_NumHeads; + UINT32 BPB_Hiddsec; + UINT32 BPB_TotSec32; + } BPB_COMMON; + + +//<AMI_SHDR_START> +//---------------------------------------------------------------------------- +// Name: BPB_FAT_12_16 +// +// Description: Structure of the FAT 12 or 16 unique part of the BPB +// +// Referrals: +// +//---------------------------------------------------------------------------- +//<AMI_SHDR_END> + + typedef struct _BPB_FAT_12_16 { + UINT8 BS_DrvNum; + UINT8 BS_Reserved1; + UINT8 BS_BootSig; + UINT32 BS_VolID; + UINT8 BS_VolLab[11]; + UINT8 BS_FilSysType[8]; + } BPB_FAT_12_16; + + +//<AMI_SHDR_START> +//---------------------------------------------------------------------------- +// Name: BPB_FAT_32 +// +// Description: Structure of the FAT 32 unique part of the BPB +// +// Referrals: +// +//---------------------------------------------------------------------------- +//<AMI_SHDR_END> + + typedef struct _BPB_FAT_32 { + UINT32 BPB_FATSz32; + UINT16 BPB_ExtFlags; + UINT16 BPB_FSVer; + UINT32 BPB_RootClus; + UINT16 BPB_FSInfo; + UINT16 BPB_BkBootSec; + UINT8 BPB_Rserved[12]; + UINT8 BS_DrvNum_32; + UINT8 BS_Reserved1_32; + UINT8 BS_BootSig_32; + UINT8 BS_VolID_32[4]; + UINT8 BS_VolLab_32[11]; + UINT8 BS_FilSysType_32[8]; + } BPB_FAT_32; + + +//<AMI_SHDR_START> +//---------------------------------------------------------------------------- +// Name: VOLUME_BPB +// +// Description: Structure of the Volume BIOS Parameter Block. Combines common, +// FAT 12-16, and FAT 32 parts +// +// Referrals: +// +//---------------------------------------------------------------------------- +//<AMI_SHDR_END> + + typedef struct _VOLUME_BPB { + UINT8 BS_JmpBoot[3]; + UINT8 BS_OEMName[8]; + UINT16 BPB_BytePerSec; + UINT8 BPB_SecPerClus; + UINT16 BPB_RsvdSecCnt; + UINT8 BPB_NumFATs; + UINT16 BPB_RootEntCnt; + UINT16 BPB_TotSec16; + UINT8 BPB_Media; + UINT16 BPB_FATSz16; + UINT16 BPB_SecPerTrk; + UINT16 BPB_NumHeads; + UINT32 BPB_Hiddsec; + UINT32 BPB_TotSec32; + union { + BPB_FAT_12_16 BPB_FAT1216; + BPB_FAT_32 BPB_FAT32; + } BPB_FAT; + } VOLUME_BPB; + + +//<AMI_SHDR_START> +//---------------------------------------------------------------------------- +// Name: VOLUME_INFO +// +// Description: Structure containing all Volume Information +// +// Referrals: +// +//---------------------------------------------------------------------------- +//<AMI_SHDR_END> + + typedef struct _VOLUME_INFO { + + EFI_SIMPLE_FILE_SYSTEM_PROTOCOL SimpleFileSystemProtocol; // This should be the first entry in this structure + EFI_HANDLE VolumeHandle; + EFI_STATUS VolumeStatus; // Global status that can be used by any open handles + + FAT_TYPE FatType; + UINT32 EOCMark; + VOLUME_BPB VolumeBPB; + BOOLEAN ValidVolumeID; + CHAR16 VolumeID[12]; + CHAR16 *FileSystemName; + UINT8 BytesPerSecPowerof2; + UINT32 BytesPerCluster; + UINT32 FirstRootDirSector; + UINT32 RootDirSectorCount; // 0 for FAT32 + UINT32 FATSz; // Size of 1 FAT + UINT32 TotalSectors; + UINT32 DataSectors; + UINT32 CountOfDataClusters; + +// Volume information for EFI_FILE_SYSTEM_INFO + UINT64 VolumeSize; + UINT32 FreeSpaceinClusters; + UINT32 FreeSpaceinSector1; + UINT32 BlockSize; + BOOLEAN ReadOnly; + UINT32 LastFreeCluster; + UINT32 FreeClusterBlocks; + + EFI_DISK_IO_PROTOCOL *DiskIo; + EFI_BLOCK_IO_PROTOCOL *BlkIo; + UINT32 MediaID; + EFI_UNICODE_COLLATION_PROTOCOL *UnicodeCollationInterface; + + UINT32 AllocatedMemorySize; + UINT32 TotalDirEntryList; + UINT32 AllowedFatCacheSize; + UINT32 AllowedDirCacheSize; + UINT32 FATCacheSize; + UINT32 DirCacheSize; + UINT32 *TempBuffer; + UINT32 *CacheBuffer; + BOOLEAN TempBufferInUse; + struct _FILE_HANDLE * RootFH; + DLIST OpenFHs; + DLIST OpenFIs; + DLIST CacheList; + DLIST MemList; + + } VOLUME_INFO; + + +//<AMI_SHDR_START> +//---------------------------------------------------------------------------- +// Name: FILE_HANDLE +// +// Description: Structure containing File Handle information +// +// Referrals: +// +//---------------------------------------------------------------------------- +//<AMI_SHDR_END> + + typedef struct _FILE_HANDLE { + + VOLUME_INFO *VolumeInterface; + EFI_STATUS HandleStatus; + BOOLEAN ROOTDIR; + + CHAR16 *FileNameLFN; // Points to the long Filename if not points to 8.3 + DIR_ENTRY_32 DirectoryEntry; // 8.3 entry + + UINT32 DirCluster; // Cluster at which this entry is present. For Root directory (FAT12/16) it is the sector count. + UINT32 DirOffset; // Offset with in the cluster + UINT16 InstancesCount; // No of Instances opened so far + UINT32 SlotNumber; // Same as in DIR_ENTRY_LIST + UINT32 FreeDirEntryCluster; // For FAT12/16 and ROOT directory, not valid. + UINT32 FreeDirEntryOffset; // + + BOOLEAN DirEntryChanged; + BOOLEAN DirListChanged; + struct _FILE_HANDLE *Parent; // Points to the parent directory + DLIST DirList; // List if Directory Entries + DLINK ViFHLink; // This link is for the DLIST OpenFHs in VOLUME_INFO + + DLIST ChildList; + DLINK ChildLink; + + } FILE_HANDLE; + + +//<AMI_SHDR_START> +//---------------------------------------------------------------------------- +// Name: FILE_HANDLE_INSTANCE +// +// Description: Structure containing File Handle Instance information +// +// Referrals: +// +//---------------------------------------------------------------------------- +//<AMI_SHDR_END> + + typedef struct _FILE_HANDLE_INSTANCE { + + EFI_FILE_PROTOCOL FileHandle; // Should be the first entry in the structure + EFI_STATUS HandleInstanceStatus; + FILE_HANDLE *pFH; + UINT64 OpenMode; // Open Modes + UINT64 Position; // + UINT32 CurrentCluster; // will point to sector number where the position is pointing currently + UINT32 CurrentClusterOffset; // will point to sector number where the position is pointing currently + BOOLEAN MEDIA_NOT_VALID; // Will be true if for any reason current instances cannot use the volume Eg: Change in Media + DLINK ViFILink; // This link is for the DLIST OpenFIs in the VOLUME_INFO + + } FILE_HANDLE_INSTANCE; + + +//<AMI_SHDR_START> +//---------------------------------------------------------------------------- +// Name: DIR_ENTRY_LIST +// +// Description: Structure containing directory entry information +// +// Referrals: +// +//---------------------------------------------------------------------------- +//<AMI_SHDR_END> + + typedef struct { + + DIR_ENTRY_32 DirectoryEntry; // 8.3 entry + CHAR16 *FileNameLFN; // Points to the long Filename if not points to 8.3 + UINT32 Cluster; // Not valid for FAT12/16 ROOT + UINT32 Offset; // For ROOT Fat12/16, offset is from the beginning. + UINT32 SlotNumber; // Used for EFI DIR + DLINK DirLink; // + + } DIR_ENTRY_LIST; + + +//<AMI_SHDR_START> +//---------------------------------------------------------------------------- +// Name: CACHE_HEADER +// +// Description: Structure containing cache header information +// +// Referrals: +// +//---------------------------------------------------------------------------- +//<AMI_SHDR_END> + + typedef struct { + + UINT64 AbsoluteOffset; + UINT64 AbsoluteOffsetEnd; + UINT8 *Buffer; + BOOLEAN DIRTY_FLAG; + REGIONS DataRegion; + DLINK CacheLink; + + } CACHE_HEADER; + + +//<AMI_SHDR_START> +//---------------------------------------------------------------------------- +// Name: MEM_HEADER +// +// Description: Structure containing memory header information +// +// Referrals: +// +//---------------------------------------------------------------------------- +//<AMI_SHDR_END> + + typedef struct { + + UINTN AddresMap; + UINT32 AddresMapLength; + UINTN BufferStart; + UINTN BufferEnd; + DLINK MemLink; + + } MEM_HEADER; + +#pragma pack() + +#define FIRSTCLUSTER(D) (((UINT32) D.Dir_FstClusHI << 16) + (UINT32) D.Dir_FstClusLO) +#define CLUSTERSREQUIRED(N) (N + Vol->BytesPerCluster - 1) / Vol->BytesPerCluster +#define FAT12_EOC(EntryValue) (EntryValue >= 0x0FF8) +#define FAT16_EOC(EntryValue) (EntryValue >= 0xFFF8) +#define FAT32_EOC(EntryValue) (EntryValue >= 0x0FFFFFF8) + + + EFI_STATUS + SimpleFileSystemSupported( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE Controller, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath + ); + + EFI_STATUS + SimpleFileSystemStart ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE Controller, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath + ); + + EFI_STATUS + SimpleFileSystemStop ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE Controller, + IN UINTN NumberOfChildren, + IN EFI_HANDLE *ChildHandleBuffer + ); + + EFI_STATUS + FileSystemInitUnicodeCollation ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN OUT EFI_UNICODE_COLLATION_PROTOCOL **gFileSystemUnicodeCollationInterface + ); + + EFI_STATUS + DetectInstallVolume( + IN EFI_DISK_IO_PROTOCOL *DiskIo, + IN EFI_BLOCK_IO_PROTOCOL *BlkIo, + IN EFI_HANDLE Handle + ); + + EFI_STATUS + DetectVolume ( + VOLUME_INFO *VolumeInterface, + BOOLEAN StatusCheck + ); + + EFI_STATUS + OpenVolume ( + IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This, + OUT EFI_FILE_PROTOCOL **Root + ); + + EFI_STATUS + OpenRoot( + IN VOLUME_INFO *VolumeInfo, + IN OUT FILE_HANDLE **Root + ); + + EFI_STATUS + CreateFileHandleInstance ( + IN FILE_HANDLE *Root, + IN OUT FILE_HANDLE_INSTANCE **FileInstance, + IN UINT64 OpenMode + ); + + void + InitEFIFileInterface ( + EFI_FILE_PROTOCOL *EFIFileInterface + ); + + EFI_STATUS + OpenVolume ( + IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This, + OUT EFI_FILE_PROTOCOL **Root + ); + + EFI_STATUS + OpenFileHandle ( + IN EFI_FILE_PROTOCOL *This, + OUT EFI_FILE_PROTOCOL **NewHandle, + IN CHAR16 *FileName, + IN UINT64 OpenMode, + IN UINT64 Attributes + ); + + EFI_STATUS + CloseFileHandle ( + IN EFI_FILE_PROTOCOL *This + ); + + EFI_STATUS + DeleteFileHandle ( + IN EFI_FILE_PROTOCOL *This + ); + + EFI_STATUS + ReadFileHandle ( + IN EFI_FILE_PROTOCOL *This, + IN OUT UINTN *BufferSize, + OUT VOID *Buffer + ); + + EFI_STATUS + WriteFileHandle ( + IN EFI_FILE_PROTOCOL *This, + IN OUT UINTN *BufferSize, + IN VOID *Buffer + ); + + EFI_STATUS + GetPositionFileHandle ( + IN EFI_FILE_PROTOCOL *This, + IN UINT64 *Position + ); + + EFI_STATUS + SetPositionFileHandleThis ( + IN EFI_FILE_PROTOCOL *This, + OUT UINT64 Position + ); + + + EFI_STATUS + SetPositionFileHandle ( + IN FILE_HANDLE_INSTANCE *fhi, + IN UINT64 Position + ); + + EFI_STATUS + GetInfoFileHandle ( + IN EFI_FILE_PROTOCOL *This, + IN EFI_GUID *InformationType, + IN OUT UINTN *BufferSize, + OUT VOID *Buffer + ); + + + EFI_STATUS + SetInfoFileHandle ( + IN EFI_FILE_PROTOCOL *This, + IN EFI_GUID *InformationType, + IN UINTN BufferSize, + IN VOID *Buffer + ); + + EFI_STATUS + FlushFileHandle ( + IN EFI_FILE_PROTOCOL *This + ); + + EFI_STATUS + ProcessOpenFileHandle( + IN FILE_HANDLE_INSTANCE *ParentFi, + IN CHAR16 **FileName, + OUT EFI_FILE_PROTOCOL **NewHandle, + IN UINT64 OpenMode, + IN UINT64 Attributes + ); + + EFI_STATUS + CreateDirectoryEntry ( + IN FILE_HANDLE *fh, + IN CHAR16 *NextCompName, + OUT FILE_HANDLE **fh1, + IN UINT64 Attributes + ); + + EFI_STATUS + CreateDirEntryInDisk ( + IN FILE_HANDLE *fh, + IN CHAR16 *NextCompName, + IN UINT64 Attributes, + OUT UINT32 *FreeDirCluster, + OUT UINT32 *FreeDirClusterOffset, + DIR_ENTRY_32 *Entry + ); + + BOOLEAN + FindMatchingFH ( + IN VOLUME_INFO *Vi, + IN CHAR16 *NextCompName, + IN FILE_HANDLE *fh, + OUT FILE_HANDLE **fh1 + ); + + EFI_STATUS + ReadAllDirectoryEntries ( + IN FILE_HANDLE *fh + ); + + EFI_STATUS + CreateFHFromDirEntryList( + IN DIR_ENTRY_LIST *Del, + IN FILE_HANDLE *fh, + OUT FILE_HANDLE **fh1 + ); + + BOOLEAN + FindMatchingDirEntry ( + IN FILE_HANDLE *fh, + IN CHAR16 *NextCompName, + OUT DIR_ENTRY_LIST **Del + ); + + BOOLEAN + FindMatchingSFNDirEntry ( + IN FILE_HANDLE *fh, + IN CHAR8 *ShortFileName, + OUT DIR_ENTRY_LIST **Del + ); + + EFI_STATUS + AddToDirList ( + FILE_HANDLE *fh, + DIR_ENTRY_32 DirectoryEntry, + CHAR16 *lfn, + UINT32 Cluster, + UINT32 Offset, + UINT32 SlotNumber + ); + + EFI_STATUS + GetDirListAtPosition( + FILE_HANDLE *Pfh, + UINT64 Position, + DIR_ENTRY_LIST **Del + ); + + EFI_STATUS + GetNextCompName ( + IN OUT CHAR16 **FileName, + IN CHAR16 *NextCompName + ); + + void + RemoveDirEntries ( + IN FILE_HANDLE *Rfh, + IN FILE_HANDLE *fh + ); + + EFI_STATUS + RemoveFH ( + FILE_HANDLE *fh + ); + + EFI_STATUS + FreeUpDirEntries ( + VOLUME_INFO *vi, + FILE_HANDLE *pfh + ); + + EFI_STATUS + FreeUpFHEntries ( + VOLUME_INFO *vi, + FILE_HANDLE *pfh + ); + + EFI_STATUS + RemoveAllDirList( + FILE_HANDLE *lfh + ); + + + EFI_STATUS + RemoveDirList ( + FILE_HANDLE *fh, + DIR_ENTRY_LIST *Del + ); + + BOOLEAN + FatLfnIsValid ( + CHAR16 *Name + ); + + EFI_STATUS + fsAllocateMemory ( + VOLUME_INFO *vi, + UINT32 Size, + VOID **Buffer, + BOOLEAN CLEAR + ); + + EFI_STATUS + fsDeAllocateMemory ( + VOLUME_INFO *vi, + void *Buffer + ); + + EFI_STATUS + GetVolumeLabel ( + VOLUME_INFO *vi, + IN OUT UINTN *BufferSize, + OUT VOID *Buffer + ); + + EFI_STATUS + SetVolumeLabel ( + VOLUME_INFO *vi, + IN UINTN BufferSize, + OUT VOID *Buffer + ); + + EFI_STATUS + GetfileInfo ( + IN FILE_HANDLE_INSTANCE *fhi, + IN OUT UINTN *BufferSize, + OUT VOID *Buffer + ); + + EFI_STATUS + SetfileInfo ( + IN EFI_FILE_PROTOCOL *This, + IN FILE_HANDLE_INSTANCE *fhi, + IN UINTN BufferSize, + OUT VOID *Buffer + ); + + EFI_STATUS + GetFileInfoFromFH ( + FILE_HANDLE *Pfh, + IN OUT UINTN *BufferSize, + OUT VOID *Buffer + ); + + VOID + FatToEfiTime ( + EFI_TIME *EfiTime, + UINT16 Date, + UINT16 Time + ); + + VOID + EfiToFatTime ( + EFI_TIME EfiTime, + UINT16 *Date, + UINT16 *Time + ); + + EFI_STATUS + GetSystemInfo ( + IN VOLUME_INFO *vi, + IN OUT UINTN *BufferSize, + OUT EFI_FILE_SYSTEM_INFO *Buffer + ); + + EFI_STATUS + SetSystemInfo ( + IN VOLUME_INFO *vi, + IN UINTN BufferSize, + OUT EFI_FILE_SYSTEM_INFO *Buffer + ); + + UINT32 + ReturnFreeSpace ( + IN VOLUME_INFO *vi + ); + + EFI_STATUS + GetVolumeLabel ( + IN VOLUME_INFO *vi, + IN OUT UINTN *BufferSize, + OUT VOID *Buffer + ); + + UINT8 + LfnChecksum( + UINT8 *D + ); + + UINT8 + FetchLongName ( + FILE_HANDLE *fh, + DIR_ENTRY_32 *Buffer, + UINT32 BufferPos, + UINT16 *Name, + UINT32 ClusterNumber, + UINT32 ClusterSize + ); + + BOOLEAN + FindShortName ( + UINT8 *Buffer, + UINT32 *Offset, + UINT32 BufferSize + ); + + EFI_STATUS + FsReadMedia ( + VOLUME_INFO *vi, + UINT8 *Buffer, + UINT64 Sector, + UINT32 Offset, + UINT32 ByteCount, + REGIONS DataRegion + ); + + EFI_STATUS + FsWriteMedia ( + VOLUME_INFO *vi, + UINT8 *Buffer, + UINT64 SectorCount, + UINT32 Offset, + UINT32 ByteCount, + REGIONS DataRegion + ); + + void + HandleDiskIoError ( + VOLUME_INFO *vi, + EFI_STATUS Status + + ); + + ExtractShortFileName ( + VOLUME_INFO *Vi, + CHAR16 *lfn, + UINT8 *Buffer + ); + + EFI_STATUS + CheckCached ( + VOLUME_INFO *vi, + UINT64 AbsoluteOffset, + UINT32 ByteCount, + UINT8 **cBuffer, + UINT32 *cBufferLength, + CACHE_HEADER **ch, + REGIONS DataRegion + ); + + BOOLEAN + IsCacheHit ( + VOLUME_INFO *vi, + REGIONS DataRegion, + UINT64 AbsoluteOffset, + UINT32 ByteCount, + UINT8 **cBuffer, + UINT32 *cBufferLength, + CACHE_HEADER **ch1 + ); + + void + CreateSpaceforCache ( + VOLUME_INFO *vi, + UINT32 ByteCount, + REGIONS DataRegion, + CACHE_HEADER **ch1 + ); + + EFI_STATUS + ReadClusterOfDirectoryEntries ( + IN FILE_HANDLE *fh, + IN UINT32 ClusterNumber, + OUT UINT32 *ClusterRead, + UINT8 *Buffer, + UINT32 *BufferSize + ); + + EFI_STATUS + ReadFatClusterNumber ( + IN VOLUME_INFO *Vol, + IN UINT32 Cluster, + IN UINT8 FatNumber, + OUT UINT32 *Value + ); + + EFI_STATUS + FatClusterNumberLocation ( + IN VOLUME_INFO *Vol, + IN UINT32 Cluster, + IN UINT8 FatNumber, + OUT UINT32 *Sector, + OUT UINT32 *SectorOffset + ); + + EFI_STATUS + WriteFatClusterNumber ( + IN VOLUME_INFO *Vol, + IN UINT32 Cluster, + IN UINT8 FatNumber, + IN UINT32 Value + ); + + EFI_STATUS + UnlinkFat ( + IN VOLUME_INFO *Vol, + IN UINT32 Cluster, + OUT UINT32 *ClusterCount + ); + + EFI_STATUS + FindFreeClusters ( + IN VOLUME_INFO *Vol, + IN UINT32 From, + IN UINT32 To, + OUT UINT32 *StartCluster, + IN OUT UINT32 *FreeClusters, + OUT UINT32 *TotalFree + ); + + EFI_STATUS + FindNextFreeCluster ( + IN VOLUME_INFO *Vol, + OUT UINT32 *Cluster + ); + + EFI_STATUS + GetFreeClusterCount ( + IN VOLUME_INFO *Vol, + OUT UINT32 *FreeClustersCount, + OUT UINT32 *FreeClusterBlock, + OUT UINT32 *FreeBlockCount + ); + + UINT32 + ClusterToSector ( + IN VOLUME_INFO *Vol, + IN UINT32 Cluster + ); + + UINT32 + SectorToCluster ( + IN VOLUME_INFO *Vol, + IN OUT UINT32 Sector + ); + + EFI_STATUS + GetClusterCount ( + IN VOLUME_INFO *Vol, + IN OUT UINT32 Cluster + ); + + int + Wcscmpcaseinsensitive( + CHAR16 *string1, + CHAR16 *string2 + ); + + EFI_STATUS + ReadFromFile ( + IN FILE_HANDLE_INSTANCE *File, + IN OUT VOID *Buffer, + IN OUT UINT32 *Size, + IN REGIONS DataRegion + ); + + EFI_STATUS + WriteToFile ( + IN FILE_HANDLE_INSTANCE *File, + IN OUT VOID *Buffer, + IN OUT UINT32 *Size, + IN REGIONS DataRegion + ); + + + EFI_STATUS + AllocateFirstCluster ( + IN FILE_HANDLE_INSTANCE *File, + OUT UINT32 *Cluster + ); + + EFI_STATUS + AllocateAndLinkClusters ( + IN VOLUME_INFO *Vol, + IN UINT32 BeginCluster, + IN UINT32 Size, + OUT UINT32 *FirstCluster, + OUT UINT32 *ClusterCount + ); + + static int AllocateAndLinkNewCluster ( + VOLUME_INFO *Vol, + IN UINT32 PrevCluster, + OUT UINT32 *Cluster + ); + + + EFI_STATUS + ExtendFile ( + IN FILE_HANDLE_INSTANCE *fhi, + IN UINT32 Length + ); + + EFI_STATUS + GetContiguousClusters ( + IN VOLUME_INFO *Vol, + IN UINT32 Size, + IN OUT UINT32 Cluster, + OUT UINT32 *LastCluster, + OUT UINT32 *Count + ); + + VOID + GetAbsSectorInfo ( + IN VOLUME_INFO *Vol, + IN UINT32 Cluster, + IN UINT32 ClusterOffset, + OUT UINT32 *Sector, + OUT UINT32 *SectorOffset + ); + + EFI_STATUS + GetClusterPosition ( + IN FILE_HANDLE_INSTANCE *File, + IN UINT64 Position, + OUT UINT32 *Cluster, + OUT UINT32 *ClusterOffset + ); + + UINT32 + GetEocValue ( + IN VOLUME_INFO *Vol + ); + + EFI_STATUS + ValidateCurrentStatus ( + FILE_HANDLE_INSTANCE *fhi + ); + + VOID + GetSectorAddressDir ( + FILE_HANDLE *fh, + UINT32 Cluster, + UINT32 ClusterOffset, + UINT32 *Sector, + UINT32 *SectorOffset + ); + + EFI_STATUS + UpdateAccAndWriteTime ( + IN OUT DIR_ENTRY_LIST *del + ); + + EFI_STATUS + UpdateAccDate( + IN OUT DIR_ENTRY_LIST *del + ); + + BOOLEAN + UpdateAccDateRequired ( + IN OUT DIR_ENTRY_LIST *del + ); + + EFI_STATUS + GetSpaceforDirEntry( + IN FILE_HANDLE *fh, + IN UINT32 FreeBytesRequired, + OUT UINT32 *FreeDirCluster, + OUT UINT32 *FreeDirClusterOffset, + BOOLEAN *LastDirEntry + ); + + EFI_STATUS + CheckforValidDirSpace ( + IN VOLUME_INFO *Vi, + IN BOOLEAN ROOTDIR, + IN UINT32 Cluster, + IN UINT32 Offset, + IN UINT32 FreeBytesRequired, + IN UINT32 *FreeDirCluster, + IN UINT32 *FreeDirClusterOffset + ); + + EFI_STATUS + LocateFreeDirEntry( + IN FILE_HANDLE *fh, + IN UINT32 FreeBytesRequired, + OUT UINT32 *FreeDirCluster, + OUT UINT32 *FreeDirClusterOffset, + BOOLEAN *LastDirEntry + ); + + EFI_STATUS + GenShortFilename ( + IN VOLUME_INFO *Vol, + IN CHAR16 *InPath, + OUT CHAR8 *ShortName + ); + + EFI_STATUS + UpdateDirListFromFHDir ( + FILE_HANDLE *fh + ); + + EFI_STATUS + LocateDel ( + DLINK *dlink, + UINT32 Cluster, + UINT32 ClusterOffset, + DIR_ENTRY_LIST **Del, + UINT32 *Position + ); + + EFI_STATUS + GenUniqueShortFname ( + IN FILE_HANDLE *fh, + IN CHAR16 *LongName, + OUT CHAR8 *ShortName, + OUT BOOLEAN *LfnNeeded + ); + + EFI_STATUS + SplitLFN ( + IN CHAR16 *LongName, + IN DIR_ENTRY_32 *ShortEntry, + OUT DIR_ENTRY_LFN *Slot, + OUT UINT32 *NumSlots + ); + + EFI_STATUS + ZeroOutdisk ( + IN VOLUME_INFO *Vi, + IN UINT32 Cluster, + IN UINT32 ClusterOffset, + IN UINT32 Size + ); + + EFI_STATUS + ShrinkClusters ( + IN VOLUME_INFO *Vol, + IN UINT32 StartCluster, + IN UINT32 ClusterCount + ); + + UINT32 + GetClustersRequired ( + IN VOLUME_INFO *Vol, + IN UINT32 N + ); + + EFI_STATUS + UpdateFreeSpace ( + IN VOLUME_INFO *vi, + IN UINT32 Count, + IN BOOLEAN Add + ); + + EFI_STATUS + FreeUpResources ( + VOLUME_INFO *vi, + EFI_STATUS Status + ); + + EFI_STATUS + MarkVolumeDirty ( + IN VOLUME_INFO *vi + ); + + EFI_STATUS + UnloadSimpleFileSystemDriver ( + IN EFI_HANDLE ImageHandle + ); + + void + Zeromemory ( + void *Buffer, + UINT32 Size + ); + + EFI_STATUS + CheckFileWrite ( + FILE_HANDLE_INSTANCE *fhi, + BOOLEAN IgnoreOpenMode + ); + + VOID EfiInitializeDriverLib( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ); + + EFI_STATUS + InternalMemAllocate ( + VOLUME_INFO *vi, + UINT32 Size, + VOID **Buffer, + BOOLEAN CLEAR + ); + + EFI_STATUS + AddBlocktoInternalMemManager ( + VOLUME_INFO *vi + ); + + EFI_STATUS + GetMemory ( + MEM_HEADER *Mem, + UINT32 Blocks, + VOID **Buffer, + BOOLEAN CLEAR + ); + + EFI_STATUS + FreeMemory ( + VOLUME_INFO *vi, + VOID *Buffer + ); + + + VOID + GetTempBuffer ( + VOLUME_INFO *vi, + VOID **Buffer + ); + + VOID + ReleaseTempBuffer ( + VOLUME_INFO *vi + ); + + void + PrintOpenfhiandfh ( + VOLUME_INFO *vi + ); + + VOID Labcpy( + CHAR16 *string1, + CHAR16 * string2 + ); + + UINTN Lablen( + CHAR16 *string + ); + + EFI_TPL + FindNextTpl ( + EFI_TPL TplLevel + ); + + VOID EfiDebugPrint ( + IN UINTN ErrorLevel, + IN CHAR8 *Format, + ... + ); + + /****** DO NOT WRITE BELOW THIS LINE *******/ +#ifdef __cplusplus +} +#endif + +#endif + +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2009, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Pkwy, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//********************************************************************** |