summaryrefslogtreecommitdiff
path: root/Core/EM/Recovery/RecoveryCsp.h
diff options
context:
space:
mode:
Diffstat (limited to 'Core/EM/Recovery/RecoveryCsp.h')
-rw-r--r--Core/EM/Recovery/RecoveryCsp.h849
1 files changed, 849 insertions, 0 deletions
diff --git a/Core/EM/Recovery/RecoveryCsp.h b/Core/EM/Recovery/RecoveryCsp.h
new file mode 100644
index 0000000..8460371
--- /dev/null
+++ b/Core/EM/Recovery/RecoveryCsp.h
@@ -0,0 +1,849 @@
+//*************************************************************************
+//*************************************************************************
+//** **
+//** (C)Copyright 1985-2008, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+//** **
+//** Phone: (770)-246-8600 **
+//** **
+//*************************************************************************
+//*************************************************************************
+
+//*************************************************************************
+// $Header: /Alaska/BIN/Core/Modules/Recovery/RecoveryCsp.h 5 8/09/12 11:12a Pats $
+//
+// $Revision: 5 $
+//
+// $Date: 8/09/12 11:12a $
+//*************************************************************************
+// Revision History
+// ----------------
+// $Log: /Alaska/BIN/Core/Modules/Recovery/RecoveryCsp.h $
+//
+// 5 8/09/12 11:12a Pats
+// [TAG] - EIP 80780
+// [Category] - Function Request
+// [Description] - Support for recovery from media formatted with the
+// EXT(x) file system.
+// [Files] Recovery.c, Recovery.mak, Recovery.sdl, RecoveryCsp.h (bin),
+// and FsRecovery.c (source)
+//
+// 4 1/25/12 2:47p Pats
+// [TAG] - EIP 26909
+// [Category] - Function Request
+// [Description] - Support for recovery from media formatted with the NTFS
+// file system. This of necessity includes detection of GPT partitions,
+// which may contain any file system.
+// [Files] Recovery.c, Recovery.mak, Recovery.sdl, RecoveryCsp.h (bin),
+// and FsRecovery.c (source)
+//
+// 3 5/13/11 4:44p Artems
+// Replaced GetFileName infrastructure with GetRecoveryFileInfo for
+// clarification
+//
+// 2 2/05/11 2:46p Artems
+// EIP 39463: Added support for secure update - GetFileName eLink
+//
+// 1 6/11/10 11:45a Artems
+// Definitions of layout for FAT and ISO9660 structures
+//
+//*************************************************************************
+//<AMI_FHDR_START>
+//
+// Name: RecoveryCsp.h
+//
+// Description:
+// File system recovery data types definition
+//
+//<AMI_FHDR_END>
+//*************************************************************************
+#ifndef __RECOVERY_CSP__H__
+#define __RECOVERY_CSP__H__
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <PPI/DeviceRecoveryBlockIo.h>
+
+#define FAT12 0
+#define FAT16 1
+#define FAT32 2
+#define NTFS 3
+#define EXTx 4
+
+//
+// Some NTFS definitions
+//
+#define FILE_RECORD_SIZE 1024 // Size of an NTFS file record
+#define MAXIMUM_RECORD_NUMBER 0x0000FFFFFFFFFFFF // NTFS max record no.
+#define FR_ATTRIBUTE_NAME 0x00000030
+#define FR_ATTRIBUTE_VOLUME_NAME 0x00000060
+#define FR_ATTRIBUTE_DATA 0x00000080
+#define FR_ATTRIBUTE_INDEX_ROOT 0x00000090
+#define FR_ATTRIBUTE_INDEX_ALLOC 0x000000A0
+#define MINIMUM_ENTRY_SIZE 0x58
+
+#pragma pack(push, 1)
+
+typedef struct
+{
+ CHAR8 FileName[11];
+ UINT8 Unused[3]; //Attr, NTRes, CrtTimeTenth;
+ UINT16 Unused1[3]; //CrtTime, CrtDate, LstAccDate;
+ UINT16 FirstClusterHi;
+ UINT16 Unused2[2]; //WrtTime, WrtDate;
+ UINT16 FirstClusterLo;
+ UINT32 FileSize;
+} DIR_ENTRY;
+
+typedef struct
+{
+ UINT8 jmp[3]; //0
+ CHAR8 OEMName[8]; //3
+ UINT16 BytsPerSec; //11
+ UINT8 SecPerClus; //13
+ UINT16 RsvdSecCnt; //14
+ UINT8 NumFATs; //16
+ UINT16 RootEntCnt; //17
+ UINT16 TotSec16; //19
+ UINT8 Media; //21
+ UINT16 FATSz16; //22
+ UINT16 SecPerTrk; //24
+ UINT16 NumHeads; //26
+ UINT32 HiddSec; //28
+ UINT32 TotSec32; //32
+ union
+ {
+ struct
+ {
+ UINT8 Padding[510 - 36];
+ } Fat16;
+ struct
+ {
+ UINT32 FATSz32; //36
+ UINT8 Padding1[4]; //40
+ UINT32 RootClus; //44
+ UINT8 Padding2[510 - 48];
+ } Fat32;
+ struct
+ {
+ UINT32 FATSz32u; //36
+ UINT64 TotSec64; //40
+ UINT64 MFTClus; //48
+ UINT8 Padding3[510 - 56];
+ } Ntfs;
+ } Fat;
+ UINT16 Signature;
+} BOOT_SECTOR;
+
+typedef struct _RC_VOL_INFO
+{
+ UINT32 BlockSize;
+ EFI_PEI_RECOVERY_BLOCK_IO_PPI *BlkIo;
+ UINTN Device;
+ UINT8 FatType;
+ UINT8 *FatPointer;
+ DIR_ENTRY *RootPointer;
+ UINT64 PartitionOffset;
+ UINT64 FatOffset;
+ UINT64 RootOffset;
+ UINT64 DataOffset;
+ UINT32 BytesPerCluster;
+} RC_VOL_INFO;
+
+typedef struct
+{
+ UINT8 Length, ExtAttrLength; //1,2
+ UINT32 ExtentOffset, Unused1; //3..10
+ UINT32 DataLength, Unused2; //11..18
+ UINT8 DataTime[7]; //19..25
+ UINT8 Flags; //26
+ UINT8 Unused3[32 - 26]; //27..32
+ UINT8 LengthOfFileId; //33
+} DIR_RECORD;
+
+typedef struct
+{
+ UINT8 Type; //1
+ CHAR8 StandardId[5]; //2..6
+ UINT8 Version; //7
+ UINT8 Unused1[156 - 7]; //8..156
+ DIR_RECORD RootDir; //157..190
+ UINT8 Padding;
+ CHAR8 Unused2[2048 - 190]; //191..2048
+} PRIMARY_VOLUME_DESCRIPTOR;
+
+typedef struct
+{
+ UINT8 BootRecordIndicator;
+ CHAR8 ISO9660Identifier[0x5];
+ UINT8 DescriptorVersion;
+ CHAR8 BootSystemIdentifier[0x20];
+ CHAR8 Unused0[0x20];
+ UINT32 BootCatalogFirstSector;
+ UINT8 Unused1[0x7B6];
+} BOOT_RECORD_VOLUME_DESCRIPTOR;
+
+typedef struct
+{
+ UINT8 HeaderID;
+ UINT8 PlatformID;
+ UINT8 Reserved0[0x2];
+ CHAR8 ManufacturerID[0x18];
+ UINT16 Checksum;
+ UINT16 Key;
+} VALIDATION_ENTRY;
+
+typedef struct
+{
+ UINT8 BootIndicator;
+ UINT8 BootMediaType;
+ UINT16 LoadSegment;
+ UINT8 SystemType;
+ UINT8 Unused0;
+ UINT16 SectorCount;
+ UINT32 LoadRBA;
+ UINT8 Unused1[0x14];
+} INITIAL_DEFAULT_ENTRY;
+
+typedef struct _MBR_PARTITION
+{
+ UINT8 BootIndicator;
+ UINT8 StartHead;
+ UINT8 StartSector;
+ UINT8 StartTrack;
+ UINT8 OSType;
+ UINT8 EndHead;
+ UINT8 EndSector;
+ UINT8 EndTrack;
+ UINT32 StartingLba;
+ UINT32 SizeInLba;
+} MBR_PARTITION;
+
+typedef struct _MASTER_BOOT_RECORD
+{
+ UINT8 BootCode[440];
+ UINT32 UniqueMbrSig;
+ UINT16 Unknown;
+ MBR_PARTITION PartRec[4];
+ UINT16 Sig;
+} MASTER_BOOT_RECORD;
+
+//
+// GUID Partition structures
+//
+typedef struct _GUID_PARTITION
+{
+ UINT8 TypeGuid[16];
+ UINT8 UniqueGuid[16];
+ UINT64 FirstLba;
+ UINT64 LastLba;
+ UINT64 Flags;
+ CHAR16 Name[36];
+} GUID_PARTITION;
+
+typedef struct _GUID_BOOT_RECORD
+{
+ GUID_PARTITION GuidPart[4];
+} GUID_BOOT_RECORD;
+
+typedef struct _GUID_TABLE_HEADER
+{
+ UINT8 Signature[8];
+ UINT32 Revision;
+ UINT32 HeaderSize;
+ UINT32 HeaderCRC;
+ UINT32 Reserved;
+ UINT64 CurrentLBA;
+ UINT64 BackupLBA;
+ UINT64 FirstLBA;
+ UINT64 LastLBA;
+ UINT8 DiskGuid[16];
+ UINT64 StartLBA;
+ UINT32 EntryCount;
+ UINT32 EntrySize;
+ UINT32 ArraySize;
+} GUID_TABLE_HEADER;
+
+//
+// NTFS Structures
+//
+//<AMI_SHDR_START>
+//----------------------------------------------------------------------------
+// Name: MFT_FILE_RECORD
+//
+// Description: Structure of a Master File Table file record.
+//
+// Referrals:
+//
+//----------------------------------------------------------------------------
+//<AMI_SHDR_END>
+
+typedef struct _MFT_FILE_RECORD
+{
+ CHAR8 FR_Name[4]; // 0x00 - Always "FILE"
+ UINT16 FR_UpdateSeqOffset; // 0x04
+ UINT16 FR_UpdateSeqSize; // 0x06
+ UINT64 FR_LogSeqNumber; // 0x08
+ UINT16 FR_SequenceNumber; // 0x10
+ UINT16 FR_HardLinkCount; // 0x12
+ UINT16 FR_AttributeOffset; // 0x14 - Offset to Attributes
+ UINT16 FR_Flags; // 0x16 - File Record Flags
+ // 0x01 - Record is in use
+ // 0x02 - Record is a directory
+ UINT32 FR_RealSize; // 0x18 - Real size of record
+ UINT32 FR_AllocatedSize; // 0x1C - Allocated size of record
+ UINT64 FR_BaseRecordNumber; // 0x20 - Zero if this is a base record
+} MFT_FILE_RECORD;
+
+
+//<AMI_SHDR_START>
+//----------------------------------------------------------------------------
+// Name: FR_ATTR_HEADER_RES
+//
+// Description: Structure of a File Record resident attribute header.
+//
+// Referrals:
+//
+// Note(s): The "Name" in this structure is not a file name, but the
+// name of the attribute. Not used in this driver.
+//
+//----------------------------------------------------------------------------
+//<AMI_SHDR_END>
+
+typedef struct _FR_ATTR_HEADER_RES
+{
+ UINT32 AHR_Type; // 0x00 - Attribute Type
+ // 0x30 - File Name
+ // 0x80 - Data
+ UINT32 AHR_Length; // 0x04 - Attribute Length
+ UINT8 AHR_NonResFlag; // 0x08 - Non-Resident Flag
+ UINT8 AHR_NameLength; // 0x09 - Name Length (if named)
+ UINT16 AHR_NameOffset; // 0x0A - Offset to Name (if named)
+ UINT16 AHR_Flags; // 0x0C - Attribute Hdr. Flags
+ // 0x0001 - Compressed
+ // 0x4000 - Encrypted
+ // 0x8000 - Sparse
+ UINT16 AHR_AttributeId; // 0x0E
+ UINT32 AHR_InfoLength; // 0x10 - Attribute Information Length
+ UINT16 AHR_InfoOffset; // 0x14 - Offset to this Attribute's
+ // Information
+ UINT16 AHR_IndexFlag; // 0x16
+} FR_ATTR_HEADER_RES;
+
+
+//<AMI_SHDR_START>
+//----------------------------------------------------------------------------
+// Name: FR_ATTR_HEADER_NONRES
+//
+// Description: Structure of a File Record non-resident attribute header.
+//
+// Referrals:
+//
+//----------------------------------------------------------------------------
+//<AMI_SHDR_END>
+
+typedef struct _FR_ATTR_HEADER_NONRES
+{
+ UINT32 AHNR_Type; // 0x00 - Attribute Type
+ // 0x30 - File Name
+ // 0x80 - Data
+ UINT32 AHNR_Length; // 0x04 - Attribute Length
+ UINT8 AHNR_NonResFlag; // 0x08 - Non-Resident Flag
+ UINT8 AHNR_NameLength; // 0x09 - Name Length (if named)
+ UINT16 AHNR_NameOffset; // 0x0A - Offset to Name (if named)
+ UINT16 AHNR_Flags; // 0x0C - Flags
+ // 0x0001 - Compressed
+ // 0x4000 - Encrypted
+ // 0x8000 - Sparse
+ UINT16 AHNR_AttributeId; // 0x0E
+ UINT64 AHNR_StartingVCN; // 0x10 - Staeting Virtual Cluster Number
+ UINT64 AHNR_LastVCN; // 0x18 - Last Virtual Cluster Number
+ UINT16 AHNR_RunOffset; // 0x20 - Offset to data runs
+ // (Usually 0x40 for a
+ // Data attribute)
+} FR_ATTR_HEADER_NONRES;
+
+
+//<AMI_SHDR_START>
+//----------------------------------------------------------------------------
+// Name: FR_NAME_ATTRIBUTE (0x30)
+//
+// Description: Structure of a Master File Table Name Attribute.
+//
+// Referrals:
+//
+// Notes: Time stamps in NTFS are the number of 100ns units since
+// January 1, 1601.
+// This attribute is preceeded by a resident attribute header.
+//----------------------------------------------------------------------------
+//<AMI_SHDR_END>
+
+typedef struct _FR_NAME_ATTRIBUTE
+{
+ UINT64 NA_PDReference; // 0x00 - Parent Directory Reference
+ UINT64 NA_CreationTime; // 0x08 - File Creation Time
+ UINT64 NA_AlteredTime; // 0x10 - File Altered Time
+ UINT64 NA_MFTChangedTime; // 0x18 - MFT Record Changed Time
+ UINT64 NA_ReadTime; // 0x20 - File Read Time
+ UINT64 NA_AllocatedSize; // 0x28 - Allocated Size of File
+ UINT64 NA_RealSize; // 0x30 - Real size of File
+ UINT32 NA_Flags; // 0x38 - File Flags
+ // Note: These flags correspond to
+ // DOS flags up to 0x20 (Archive).
+ // If other flags are set, reject
+ // the file.
+ UINT32 NA_Reparse; // 0x3C
+ UINT8 NA_NameLength; // 0x40 - Length of file name in Words
+ UINT8 NA_NameType; // 0x41 - File Name type
+ // 0x00 - POSIX
+ // 0x01 - Unicode
+ // 0x02 - DOS
+ // 0x03 - Both
+ CHAR16 NA_Name[1]; // 0x42 - File Name (unicode)
+} FR_NAME_ATTRIBUTE;
+
+//<AMI_SHDR_START>
+//----------------------------------------------------------------------------
+// Name: FR_DATA_ATTRIBUTE (0x80)
+//
+// Description: Structure of a Master File Table Data Attribute.
+//
+// Referrals:
+//
+// Notes: This attribute can be preceeded by a resident or non-resident
+// attribute header. If resident, the data will be the actual
+// file data. If non-resident, the data will be a run list
+//
+//----------------------------------------------------------------------------
+//<AMI_SHDR_END>
+
+typedef struct _FR_DATA_ATTRIBUTE
+{
+ UINT8 DA_Data[1]; // 0x00 - Run List or data
+} FR_DATA_ATTRIBUTE;
+
+//<AMI_SHDR_START>
+//----------------------------------------------------------------------------
+// Name: FR_INDEX_ROOT_ATTRIBUTE (0x90)
+//
+// Description: Structure of a Master File Table Index Root Attribute.
+//
+// Referrals:
+//
+// Notes: A small index will have it's entries inside this attribute.
+// This attribute is preceeded by a resident attribute header.
+//
+//----------------------------------------------------------------------------
+//<AMI_SHDR_END>
+typedef struct _FR_INDEX_ROOT_ATTRIBUTE
+{
+ UINT32 IRA_Type;
+ UINT32 IRA_Collation;
+ UINT32 IRA_Size;
+ UINT8 IRA_ClustersPerIndexRec;
+ UINT8 Padding1[3];
+ UINT32 IRA_Offset; // 0x10 - Offset to Index entries (if small index)
+ // The above offset is from here,
+ // not from beginning.
+ UINT32 IRA_TotalSize;
+ UINT32 IRA_AllocSize;
+ UINT8 IRA_Flags; // 0x1C - 0 = small index, 1 = large index
+ UINT8 Padding2[3];
+} FR_INDEX_ROOT_ATTRIBUTE;
+
+//<AMI_SHDR_START>
+//----------------------------------------------------------------------------
+// Name: FR_INDEX_ALLOC_ATTRIBUTE (0xA0)
+//
+// Description: Structure of a Master File Table Index Allocation Attribute.
+//
+// Referrals:
+//
+// Notes: A large index will be in a separate index file, and the
+// run list in this attribute will indicate where it is.
+// This attribute is preceeded by a non-resident attribute header
+//
+//----------------------------------------------------------------------------
+//<AMI_SHDR_END>
+typedef struct _FR_INDEX_ALLOC_ATTRIBUTE
+{
+ UINT8 IAA_RunList[1]; // 0x00 - Run list of index record
+} FR_INDEX_ALLOC_ATTRIBUTE;
+
+//<AMI_SHDR_START>
+//----------------------------------------------------------------------------
+// Name: INDEX_RECORD
+//
+// Description: Structure of an Index record.
+//
+// Referrals:
+//
+// Notes: In NTFS, the Index is equivalent to a directory in FAT. A large
+// index will be contained in an Index Record, while a small index
+// will be contained within the Master File Table File Record for
+// the index, in the Index Root Attribute. Index Records are
+// files, the way FAT directories are files, but not every
+// "directory" will have a file. See the structure INDEX_ENTRY
+// for the actual "directory entry" format.
+//
+//----------------------------------------------------------------------------
+//<AMI_SHDR_END>
+typedef struct _INDEX_RECORD
+{
+ CHAR8 INDR_Name[4]; // 0x00 - Always "INDX"
+ UINT16 INDR_UpSeqOff; // 0x04 - Offset to update sequence
+ UINT16 INDR_UpSeqSize; // 0x06 - Size of update sequence
+ UINT64 INDR_LogSeqNo; // 0x08 - Log sequence number
+ UINT64 INDR_VCN; // 0x10 - Virtual Cluster Number
+ UINT32 INDR_IndxEntryOff; // 0x18 - Offset to Index Entries
+ // (from here, not from start)
+ UINT32 INDR_IndxEntrySize; // 0x1C - Size of Index Entries
+ UINT32 INDR_IndxEntryAlloc; // 0x20 - Allocated size of Entries
+ UINT8 INDR_LeafNode; // 0x24 - 1 if not leaf node
+ UINT8 INDR_Padding[3]; // 0x25 - Padding
+ UINT16 INDR_UpdateSequence; // 0x28 - Update Sequence
+ UINT16 INDR_SeqenceArray[1]; // 0x2A - Sequence Array
+} INDEX_RECORD;
+
+//<AMI_SHDR_START>
+//----------------------------------------------------------------------------
+// Name: INDEX_ENTRY
+//
+// Description: Structure of an Index record entry.
+//
+// Referrals:
+//
+// Notes: In NTFS, the index is the equivalent of a directory in FAT,
+// so the index entry is the equivalent of a directory entry.
+// The lower 4 bytes of the MFT reference is the number of the
+// file's File Record in the MFT. The lower 4 bytes of the MFT
+// parent reference is the number of the File Record for the
+// Index that this entry is in.
+//----------------------------------------------------------------------------
+//<AMI_SHDR_END>
+typedef struct _INDEX_ENTRY
+{
+ UINT64 INDE_MFTRecord; // 0x00 - MFT reference of this entry's file
+ UINT16 INDE_EntrySize; // 0x08 - Size of this entry
+ UINT16 INDE_NameOffset; // 0x0a - Offset to file name
+ UINT16 INDE_IndexFlags; // 0x0C - Index Flags
+ UINT16 INDE_Padding;
+ UINT64 INDE_MFTParentRec; // 0x10 - MFT refernece of this entry's parent
+ UINT64 INDE_CreationTime; // 0x18 - File Creation Time
+ UINT64 INDE_AlteredTime; // 0x20 - File Altered Time
+ UINT64 INDE_MFTChangedTime; // 0x28 - MFT Record Changed Time
+ UINT64 INDE_ReadTime; // 0x30 - File Read Time
+ UINT64 INDE_AllocSize; // 0x38 - Allocated File Size
+ UINT64 INDE_RealSize; // 0x40 - Real File Size
+ UINT64 INDE_FileFlags; // 0x48 - File Flags (like DOS flags + more)
+ UINT8 INDE_NameLength; // 0x50 - Length of File name
+ UINT8 INDE_NameType; // 0x51 - File Name type
+ // 0x00 - POSIX
+ // 0x01 - Unicode
+ // 0x02 - DOS
+ // 0x03 - Both
+ CHAR16 INDE_Name[1]; // 0x52 - File Name (Unicode, not terminated)
+} INDEX_ENTRY;
+
+//
+// EXTx STRUCTURES
+//
+//<AMI_SHDR_START>
+//----------------------------------------------------------------------------
+// Name: DIR_ENTRY_EXT
+//
+// Description: Structure of a EXT directory entry
+//
+// Referrals:
+//
+// Notes: The directory entry length must be a multiple of 4 bytes
+// Padding will be added after the name if necessary.
+// Note that the directory does not contain any file info
+// other than the name. That info is in the inode for the file.
+//
+//----------------------------------------------------------------------------
+//<AMI_SHDR_END>
+typedef struct _DIR_ENTRY_EXT {
+ UINT32 DIR_Inode; // 0x00 - Inode no. of file
+ UINT16 DIR_EntryLength; // 0x04 - Length of dir. entry
+ UINT8 DIR_NameLength; // 0x06 - Length of name
+ UINT8 DIR_FileType; // 0x07 - Type of file
+ // 1 = regular file, 2 = directory
+ CHAR8 DIR_Name[1]; // 0x08 - File name starts here
+} DIR_ENTRY_EXT;
+
+
+//<AMI_SHDR_START>
+//----------------------------------------------------------------------------
+// Name: VOLUME_SB
+//
+// Description: Structure of the Volume SuperBlock for EXT volumes.
+//
+// Referrals:
+//
+// Notes: The Superblock is equivalent to the BPB of a FAT or NTFS
+// volume, containing information about the volume. However,
+// it does not contain any boot code.
+//
+//----------------------------------------------------------------------------
+//<AMI_SHDR_END>
+
+typedef struct _VOLUME_SB {
+ UINT32 SB_TotalInodes; // 0x00 - Total Inodes
+ UINT32 SB_TotalBlocks; // 0x04 - Total size in blocks
+ UINT32 SB_ReservedBlocks; // 0x08 - Reserved blocks
+ UINT32 SB_FreeBlocks; // 0x0C - Free blocks
+ UINT32 SB_FreeInodes; // 0x10 - Free inodes
+ UINT32 SB_FirstBlock; // 0x14 - First data block (always 1 or 0)
+ UINT32 SB_BlockSize; // 0x18 - Block size shift value
+ // The actual block size is calculated
+ // as 1024 << SB_BlockSize
+ UINT32 SB_FragSize; // 0x0C - Fragment size
+ UINT32 SB_BlocksPerGroup; // 0x20 - Blocks per group
+ UINT32 SB_FragsPerGroup; // 0x24 - Fragments per group
+ UINT32 SB_InodesPerGroup; // 0x28 - Inodes per group
+ UINT32 SB_LastMountTime; // 0x2C - Time of last mount
+ UINT32 SB_LastWriteTime; // 0x30 - Time of last write
+ UINT16 SB_MountCount; // 0x34 - Count of mounts since verification
+ UINT16 SB_MaxMountCount; // 0x36 - Max mounts allowed before check
+ UINT16 SB_Magic; // 0x38 - Magic number (0xEF53)
+ UINT16 SB_StatusFlag; // 0x3A - 1 = clean, 2 = error
+ UINT16 SB_ErrorDo; // 0x3C - What to do if error
+ UINT16 SB_MinorRev; // 0x3E - Minor revision level
+ UINT32 SB_LastCheckTime; // 0x40
+ UINT32 SB_CheckInterval; // 0x44
+ UINT32 SB_CreatorOS; // 0x48 - OS that created the volume (0=Linux)
+ UINT32 SB_Revision; // 0x4C
+ UINT16 SB_DefaultUID; // 0x50 - Default User ID
+ UINT16 SB_DefaultGID; // 0x52 - Default Group ID
+ UINT32 SB_FirstInode; // 0x54 - First non-reserved inode
+ UINT16 SB_InodeStrucSize; // 0x58 - Inode structure size
+ UINT16 SB_BlockGroupNo; // 0x5A - Block Group Number
+ UINT32 SB_CompFeatMap; // 0x5C - Compatible feature bitmap
+ UINT32 SB_IncompFeatMap; // 0x60 - Incompatible feature bitmap
+ UINT32 SB_ROCompFeatMap; // 0x64 - Read-only comp. feature bitmap
+ EFI_GUID SB_UUID; // 0x68 - Volume Unique ID
+ CHAR8 SB_VolumeName[16]; // 0x78 - Volume name
+ CHAR8 SB_LastPath[64]; // 0x88 - Last mount path (normally not used)
+ UINT32 SB_AlgoBitmap; // 0xC8 - Compression algorithm bitmap
+ UINT8 SB_PreAllocBlocks; // 0xCC - Blocks to pre-allocate for new file
+ UINT8 SB_PreAllocBlocksDir;// 0xCD - Blocks to pre-allocate for new directory
+ UINT8 SB_Padding[512-0xCE];// 0xCE - Padding to 1024 starts here
+ // We're loading this into an MBR buffer,
+ // so we only pad to 512.
+} VOLUME_SB;
+
+
+//<AMI_SHDR_START>
+//----------------------------------------------------------------------------
+// Name: VOLUME_BGDT
+//
+// Description: Structure of the Volume Block Group Descriptor Table.
+//
+// Referrals:
+//
+// Notes: In EXT, volumes are arranged as groups of blocks. The size
+// of each group is defined in SB_BlocksPerGroup in the
+// Superblock. The descriptor table gives info about the group.
+//
+//----------------------------------------------------------------------------
+//<AMI_SHDR_END>
+
+typedef struct _VOLUME_BGDT {
+ UINT32 BGDT_BlockBitmapBlk; // 0x00 - Block bitmap block number
+ UINT32 BGDT_InodeBitmapBlk; // 0x04 - Inode bitmap block number
+ UINT32 BGDT_InodeTableBlk; // 0x08 - Inode table block number
+ UINT16 BGDT_FreeBlocks; // 0x0C - Free blocks in the group
+ UINT16 BGDT_FreeInodes; // 0x0E - Free inodes in the group
+ UINT16 BGDT_UsedDirs; // 0x10 - Inodes used for directories in the group
+ UINT16 BGDT_Padding; // 0x12 - Padding
+ UINT8 BGDT_Reserved[12]; // 0x14 - Reserved
+} VOLUME_BGDT;
+
+
+//<AMI_SHDR_START>
+//----------------------------------------------------------------------------
+// Name: VOLUME_IT
+//
+// Description: Structure of an Inode table
+//
+// Referrals:
+//
+// Notes: The inode table table contains all the information about each
+// file EXCEPT the file's name, which is in the directory.
+// The directory contains the file's name and inode number.
+// The inodes are numbered sequentially in the table, and the
+// table occupies consecutive blocks.
+//
+// EXT2, EXT3 File allocation method:
+// The block map of the file in IT_Blocks works as follows:
+// The first 12 entries are direct block numbers of the file.
+// The 13th entry is the number of a block containing block
+// numbers of the file (single-indirect blocks).
+// The 14th entry is the number of a block containing block
+// numbers of blocks containing file block numbers (double-
+// indirect blocks).
+// Similarly, the 15th entry is triple-indirect blocks.
+// Therefore, the maximum file size with 1024-byte blocks
+// would be 12+256+65536+16777216 1024-byte blocks.
+//
+// EXT4 File allocation method:
+// Instead of a block map, EXT4 has a header followed by up
+// to 4 extents of contiguous blocks. If the entire file is
+// contiguous, there will be only one extent. Each extent
+// consists of a 32-bit logical block no. (relative to the
+// start of the file), a 16-bit block count, and a 48-bit
+// physical block number, expressed as a 16-bit high value
+// and a 32-bit low value. If a file requires more than 4
+// extents, the value of EH_Depth in the header will be
+// non-zero, and the first extent will point to a block of
+// extents indtead of the file.
+//
+// The file dates in VOLUME_IT are the number of seconds since
+// January 1, 1970.
+//
+//----------------------------------------------------------------------------
+//<AMI_SHDR_END>
+
+typedef struct _EXT_HDR {
+ UINT16 EH_Magic; // 0x00 - Magic number (0xF30A)
+ UINT16 EH_Extents; // 0x02 - Number of extents
+ UINT16 EH_Max; // 0x04 - Maximum no. of extents
+ UINT16 EH_Depth; // 0x06 - Depth of tree (0 normally)
+ UINT32 EH_Generation; // 0x08 - Generation ID (currently 0)
+} EXT_HDR;
+typedef struct _EXT_EXT {
+ UINT32 EE_LogBlk; // 0x00 - Logical block no.
+ UINT16 EE_Length; // 0x04 - Length of extent in blocks
+ UINT16 EE_BlockHi; // 0x06 - Uppper 16 bits of block no.
+ UINT32 EE_BlockLo; // 0x08 - Lower 32 bits of block no.
+} EXT_EXT;
+
+typedef struct _VOLUME_IT {
+ UINT16 IT_Type; // 0x00 - File type and access rights
+ // 0x8??? = regular file
+ // 0x4??? = directory
+ UINT16 IT_UID; // 0x02 - User ID
+ UINT32 IT_SizeLo; // 0x04 - File size (low 32 bits)
+ UINT32 IT_ATime; // 0x08 - Last access time
+ UINT32 IT_CTime; // 0x0C - File creation time
+ UINT32 IT_MTime; // 0x10 - File modified time
+ UINT32 IT_DTime; // 0x14 - File deleted time
+ UINT16 IT_GID; // 0x18 - Group ID
+ UINT16 IT_Links; // 0x1A - Links to this file (usually 1)
+ UINT32 IT_ListSize; // 0x1C - Block list size in 512-byte units.
+ UINT32 IT_Flags; // 0x20 - File flags
+ UINT32 IT_OSD1; // 0x24 - OS Dependant value no. 1
+ union
+ {
+ struct
+ {
+ UINT32 Blocks[15]; // 0x28 - Blocks occupied by file (see notes)
+ } Ext2;
+ struct
+ {
+ EXT_HDR Header; // 0x28 - Extent header
+ EXT_EXT Extent[4]; // 0x34 - Extents of file (see notes)
+ } Ext4;
+ } Alloc;
+ UINT32 IT_Version; // 0x64 - File version
+ UINT32 IT_FileACL; // 0x68 - File Access Control List
+ UINT32 IT_SizeHi; // 0x6C - File size (high 32 bits)
+ UINT32 IT_Fragment; // 0x70 - Not used in Linux
+ UINT32 IT_OSD2[3]; // 0x74 - OS Dependant value no. 2
+} VOLUME_IT;
+
+//<AMI_SHDR_START>
+//----------------------------------------------------------------------------
+// Name: MEMORY_BLOCK
+//
+// Description: Structure of a memory boock used to hold various basic
+// structures.
+//
+// Referrals:
+//
+// Notes: In order to make a smaller compiled binary, this memory block
+// is allocated, and used to hold structures that were formerly
+// reserved statically.
+//
+//----------------------------------------------------------------------------
+//<AMI_SHDR_END>
+
+typedef struct _MEMORY_BLOCK {
+ MASTER_BOOT_RECORD Mbr; // Master boot record (all file systems)
+ BOOT_SECTOR Bs; // Boot sector (FAT and NTFS)
+ UINT8 MFTRunList[256];// Master File Table run list (NTFS)
+ UINT8 RootRunList[128];// Root dir run list (NTFS)
+ UINT8 ResidentIndex[256];// Stores resident index (NTFS)
+ VOLUME_SB Sb; // Superblock (EXT(n))
+ VOLUME_IT RootInode; // Root directory inode (EXT(n))
+ VOLUME_IT FileInode; // File inode (EXT(n))
+} MEMORY_BLOCK;
+
+#pragma pack(pop)
+
+//**************** eLink override definitions *******************************
+//This functions may be overriden by eLinks
+
+VOID GetFileListFromPrimaryVolume(
+ IN DIR_RECORD *Root,
+ IN UINT32 RootSize,
+ OUT UINTN *NumberOfFiles,
+ OUT DIR_RECORD **Buffer
+);
+
+VOID GetFileListFromFatVolume(
+ IN DIR_ENTRY *Root,
+ IN UINT32 RootEntries,
+ OUT UINTN *NumberOfFiles,
+ OUT DIR_ENTRY **Buffer
+);
+
+VOID GetFileListFromNtfsVolume(
+ IN UINT8 *Root,
+ IN UINT32 RootSize,
+ OUT UINTN *NumberOfFiles,
+ OUT INDEX_ENTRY **Buffer
+);
+
+VOID GetFileListFromExtVolume(
+ IN UINT8 *Root,
+ IN UINT32 RootSize,
+ OUT UINTN *NumberOfFiles,
+ OUT DIR_ENTRY_EXT **Buffer
+);
+
+BOOLEAN IsValidFile(
+ IN VOID *FileData,
+ IN UINTN FileSize
+);
+
+EFI_STATUS GetRecoveryFileInfo(
+ IN EFI_PEI_SERVICES **PeiServices,
+ IN OUT VOID **pCapsuleName,
+ IN OUT UINTN *pCapsuleSize,
+ OUT BOOLEAN *ExtendedVerification
+);
+
+/****** DO NOT WRITE BELOW THIS LINE *******/
+#ifdef __cplusplus
+}
+#endif
+#endif
+//*************************************************************************
+//*************************************************************************
+//** **
+//** (C)Copyright 1985-2008, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+//** **
+//** Phone: (770)-246-8600 **
+//** **
+//*************************************************************************
+//*************************************************************************