菜单

kaoqi
kaoqi
发布于 2026-09-02 / 3 阅读
0
0

GOP.C

GOP.C

代码如下:

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)

typedef struct {
    UINT32  Data1;
    UINT16  Data2;
    UINT16  Data3;
    UINT8   Data4[8];
} EFI_GUID;

typedef struct {
    UINT64      Signature;
    UINT32      Revision;
    UINT32      HeaderSize;
    UINT32      CRC32;
    UINT32      Reserved;
} EFI_TABLE_HEADER;

typedef struct {
    UINT8                        Blue;
    UINT8                        Green;
    UINT8                        Red;
    UINT8                        Reserved;
} EFI_GRAPHICS_OUTPUT_BLT_PIXEL;

typedef enum {
    EfiBltVideoFill,
    EfiBltVideoToBltBuffer,
    EfiBltBufferToVideo,
    EfiBltVideoToVideo,
    EfiGraphicsOutputBltOperationMax
} EFI_GRAPHICS_OUTPUT_BLT_OPERATION;

typedef enum {
    PixelRedGreenBlueReserved8BitPerColor,
    PixelBlueGreenRedReserved8BitPerColor,
    PixelBitMask,
    PixelBltOnly,
    PixelFormatMax
} EFI_GRAPHICS_PIXEL_FORMAT;

typedef struct {
    UINT32              RedMask;
    UINT32              GreenMask;
    UINT32              BlueMask;
    UINT32              ReservedMask;
} EFI_PIXEL_BITMASK;

typedef struct {
    UINT32 Version;
    UINT32 HorizontalResolution;
    UINT32 VerticalResolution;
    EFI_GRAPHICS_PIXEL_FORMAT PixelFormat;
    EFI_PIXEL_BITMASK PixelInformation;
    UINT32 PixelsPerScanLine;
} EFI_GRAPHICS_OUTPUT_MODE_INFORMATION;

typedef EFI_STATUS 
(*EFI_GRAPHICS_OUTPUT_PROTOCOL_QUERY_MODE) (
    UINT32 *This,
    UINT32 ModeNumber,
    UINTN *SizeOfInfo,
    EFI_GRAPHICS_OUTPUT_MODE_INFORMATION **Info
);

typedef EFI_STATUS
(*EFI_GRAPHICS_OUTPUT_PROTOCOL_SET_MODE) (
    UINT32 *This,
    UINT32 ModeNumber
);

typedef EFI_STATUS 
(*EFI_GRAPHICS_OUTPUT_PROTOCOL_BLT) (
    UINT32 *This,
    EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer,
    EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation,
    UINTN SourceX,
    UINTN SourceY,
    UINTN DestinationX,
    UINTN DestinationY,
    UINTN Width,
    UINTN Height,
    UINTN Delta
);

typedef struct {
    UINT32 MaxMode;
    UINT32 Mode;
    EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;
    UINTN SizeOfInfo;
    UINT64 FrameBufferBase;
    UINTN FrameBufferSize;
} EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE;

typedef struct EFI_GRAPHICS_OUTPUT_PROTOCOL {
    EFI_GRAPHICS_OUTPUT_PROTOCOL_QUERY_MODE QueryMode;
    EFI_GRAPHICS_OUTPUT_PROTOCOL_SET_MODE SetMode;
    EFI_GRAPHICS_OUTPUT_PROTOCOL_BLT Blt;
    EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Mode;
} EFI_GRAPHICS_OUTPUT_PROTOCOL;

typedef
EFI_STATUS
(*EFI_SET_WATCHDOG_TIMER) (
    UINTN                          Timeout,
    UINT64                         WatchdogCode,
    UINTN                          DataSize,
    CHAR16                         *WatchdogData
);

typedef
EFI_STATUS
(*EFI_LOCATE_PROTOCOL) (
    EFI_GUID                            *Protocol,
    VOID                                *Registration,
    VOID                                **Interface
);

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;

typedef struct {
    EFI_TABLE_HEADER                 Hdr;
    CHAR16                           *FirmwareVendor;
    UINT32                           FirmwareRevision;
    EFI_HANDLE                       ConsoleInHandle;
    UINT32                           *ConIn;
    EFI_HANDLE                       ConsoleOutHandle;
    UINT32                           *ConOut;
    EFI_HANDLE                       StandardErrorHandle;
    UINT32                           *StdErr;
    UINT32                           *RuntimeServices;
    EFI_BOOT_SERVICES                *BootServices;
    UINTN                            NumberOfTableEntries;
    UINT32                           *ConfigurationTable;
} EFI_SYSTEM_TABLE;

EFI_STATUS *EFI_Main (EFI_HANDLE ImageHandle,EFI_SYSTEM_TABLE *SystemTable)
{
    //在main函数中可以直接定义一个gop的guid数据结构
    EFI_GUID gop_guid = {0x9042a9de, 0x23dc, 0x4a38, {0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a}};

    //调用系统表、启动表,找GOP句柄
    EFI_GRAPHICS_OUTPUT_PROTOCOL *GOP = NULL;
    EFI_STATUS Status;

    SystemTable->BootServices->SetWatchdogTimer(0, 0, 0, NULL);
    Status = SystemTable->BootServices->LocateProtocol(
        &gop_guid,
        NULL,
        (void**)&GOP
    );

    if (Status != 0 || GOP == NULL) {
        return Status; //GOP协议不可用直接返回
    }

    //获取GOP句柄后画画
    unsigned int width  = GOP->Mode->Info->HorizontalResolution;
    unsigned int height = GOP->Mode->Info->VerticalResolution;
    unsigned long long fb_base = GOP->Mode->FrameBufferBase;
    unsigned int *fb_ptr = (unsigned int*)(unsigned long)fb_base;

    unsigned int red_pixel;
    if (GOP->Mode->Info->PixelFormat == 1) {
        red_pixel = 0x00FF0000; // RGBA格式红色
    } else {
        red_pixel = 0x000000FF; // BGRA格式红色
    }

    //填充整个区域为红色
    unsigned int total_pixels = width * height;
    for (unsigned int i = 0; i < total_pixels; i++) {
        fb_ptr[i] = red_pixel;
    }
    return 0;
}


评论