菜单

kaoqi
kaoqi
发布于 2026-09-07 / 4 阅读
0
0

EFI头文件正规化

正式进入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;

后续其他文件的头文件也会尽量更新在这里,形成一套自有的头文件体系。


评论