正式进入EFI开发的阶段了,把UefiMain相关的struct与SimpleText相关的struct正规化在这里,方便后续的调用。
UefiMain.h
这个头文件主要解决系统表、BS表的struct:
// 这个文件用来定义系统表、系统服务表等基础的内容,可以说所有的efi文件都要用到这个文件 //
// 一些细分领域的struct,需要反诉回main中进行include //
#include "SimpleText.h"
// 定义基础的变量类型 //
typedef unsigned long long UINT64;
typedef long long INT64;
typedef unsigned int UINT32;
typedef unsigned short UINT16;
typedef unsigned short CHAR16;
typedef unsigned char UINT8;
typedef UINT64 UINTN;
typedef INT64 INTN;
// 定义基础的函数、函数返回值类型 //
typedef void VOID;
typedef UINT32 EFI_STATUS;
typedef VOID* EFI_HANDLE;
#define NULL ((void *)0)
// 定义GUID //
typedef struct {
UINT32 Data1;
UINT16 Data2;
UINT16 Data3;
UINT8 Data4[8];
} EFI_GUID;
// 定义表头,这包含了系统表的表头以及其他如bs表的表头等 //
typedef struct {
UINT64 Signature;
UINT32 Revision;
UINT32 HeaderSize;
UINT32 CRC32;
UINT32 Reserved;
} EFI_TABLE_HEADER;
// 定义BS表中的看门狗函数 //
typedef
EFI_STATUS
(*EFI_SET_WATCHDOG_TIMER) (
UINTN Timeout,
UINT64 WatchdogCode,
UINTN DataSize,
CHAR16 *WatchdogData
);
// 定义BS表中的获取protocol的函数 //
typedef
EFI_STATUS
(*EFI_LOCATE_PROTOCOL) (
EFI_GUID *Protocol,
VOID *Registration,
VOID **Interface
);
// BS表 //
typedef struct {
EFI_TABLE_HEADER Hdr;
UINT64 _bufA[29];
EFI_SET_WATCHDOG_TIMER SetWatchdogTimer;
UINT64 _bufB[7];
EFI_LOCATE_PROTOCOL LocateProtocol;
UINT64 _bufC[5];
} EFI_BOOT_SERVICES;
// EFI系统表 //
typedef struct {
EFI_TABLE_HEADER Hdr;
CHAR16 *FirmwareVendor;
UINT32 FirmwareRevision;
EFI_HANDLE ConsoleInHandle;
EFI_SIMPLE_TEXT_INPUT_PROTOCOL *ConIn;
EFI_HANDLE ConsoleOutHandle;
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;
EFI_HANDLE StandardErrorHandle;
UINT32 *StdErr;
UINT32 *RuntimeServices;
EFI_BOOT_SERVICES *BootServices;
UINTN NumberOfTableEntries;
UINT32 *ConfigurationTable;
} EFI_SYSTEM_TABLE;SimpleText.h
这个头文件用于承接来自ConIn与ConOut,以及他们对应的handle的一些函数解析实现的功能。
注意,SimpleText总共包含了INPUT与OUTPUT两个大类的东西。
// 这个文件用于放SimpleText协议相关的头文件内容 //
// 同样也进行一些基本变量的定义 //
typedef unsigned long long UINT64;
typedef long long INT64;
typedef unsigned int UINT32;
typedef unsigned short UINT16;
typedef unsigned short CHAR16;
typedef unsigned char UINT8;
typedef UINT64 UINTN;
typedef INT64 INTN;
typedef unsigned char BOOLEAN;
#define TRUE ((BOOLEAN)(1==1))
#define FALSE ((BOOLEAN)(0==1))
// 定义基础的函数、函数返回值类型 //
typedef void VOID;
typedef UINT32 EFI_STATUS;
typedef VOID* EFI_HANDLE;
#define NULL ((void *)0)
// 在EFI中,事件EVENT由BS处create,本质是一个指针 //
typedef VOID *EFI_EVENT
// 输入KEY的类型 //
typedef struct {
UINT16 ScanCode;
CHAR16 UnicodeChar;
} EFI_INPUT_KEY;
// 重启输入函数 //
typedef
EFI_STATUS
(*EFI_INPUT_RESET) (
UINT32 *This,
BOOLEAN ExtendedVerification
);
// EFI输入key的读取函数 //
typedef
EFI_STATUS
(*EFI_INPUT_READ_KEY) (
UINT32 *This,
EFI_INPUT_KEY *Key
);
// 阻滞函数 //
typedef
EFI_STATUS
(*EFI_WAIT_FOR_EVENT) (
UINTN NumberOfEvents,
EFI_EVENT *Event,
UINTN *Index
);
// 输入协议 //
typedef struct _EFI_SIMPLE_TEXT_INPUT_PROTOCOL {
EFI_INPUT_RESET Reset;
EFI_INPUT_READ_KEY ReadKeyStroke;
EFI_WAIT_FOR_EVENT WaitForKey;
} EFI_SIMPLE_TEXT_INPUT_PROTOCOL;
// 输出重启函数 //
typedef
EFI_STATUS
(*EFI_TEXT_RESET) (
UINT32 *This,
BOOLEAN ExtendedVerification
);
// 输出字符函数 //
typedef
EFI_STATUS
(*EFI_TEXT_STRING) (
UINT32 *This,
CHAR16 *String
);
// 输出字符测试函数 //
typedef
EFI_STATUS
(*EFI_TEXT_TEST_STRING) (
UINT32 *This,
CHAR16 *String
);
// 显示器模式查询 //
typedef
EFI_STATUS
(*EFI_TEXT_QUERY_MODE) (
UINT32 *This,
UINTN ModeNumber,
UINTN *Columns,
UINTN *Rows
);
// 切换显示模式 //
typedef
EFI_STATUS
(*EFI_TEXT_SET_MODE) (
UINT32 *This,
UINTN ModeNumber
);
// 设置前景后景色 //
typedef
EFI_STATUS
(*EFI_TEXT_SET_ATTRIBUTE) (
UINT32 *This,
UINTN Attribute
);
// 清空屏幕 //
typedef
EFI_STATUS
(*EFI_TEXT_CLEAR_SCREEN) (
UINT32 *This,
);
// 设置光标位置 //
typedef
EFI_STATUS
(*EFI_TEXT_SET_CURSOR_POSITION) (
UINT32 *This,
UINTN Column,
UINTN Row
);
// 启用光标可见 //
typedef
EFI_STATUS
(*EFI_TEXT_ENABLE_CURSOR) (
UINT32 *This,
BOOLEAN Visible
);
// 信息查询与解析 //
typedef struct {
INT32 MaxMode;
INT32 Mode;
INT32 Attribute;
INT32 CursorColumn;
INT32 CursorRow;
BOOLEAN CursorVisible;
} SIMPLE_TEXT_OUTPUT_MODE;
// 输出协议 //
typedef struct _EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL {
EFI_TEXT_RESET Reset;
EFI_TEXT_STRING OutputString;
EFI_TEXT_TEST_STRING TestString;
EFI_TEXT_QUERY_MODE QueryMode;
EFI_TEXT_SET_MODE SetMode;
EFI_TEXT_SET_ATTRIBUTE SetAttribute;
EFI_TEXT_CLEAR_SCREEN ClearScreen;
EFI_TEXT_SET_CURSOR_POSITION SetCursorPosition;
EFI_TEXT_ENABLE_CURSOR EnableCursor;
SIMPLE_TEXT_OUTPUT_MODE *Mode;
} EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL;后续其他文件的头文件也会尽量更新在这里,形成一套自有的头文件体系。