mineswefi.git
file.h

/* mineswefi - uefi minesweeper
* Copyright (C) 2025 ArcNyxx <olive@arcnyxx.net>
* see LICENCE file for licensing information */
#ifndef EFI_FILE_H
#define EFI_FILE_H
#include <stdbool.h>
#define EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL 0x00000001
#define EFI_OPEN_PROTOCOL_GET_PROTOCOL 0x00000002
#define EFI_OPEN_PROTOCOL_TEST_PROTOCOL 0x00000004
#define EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER 0x00000008
#define EFI_OPEN_PROTOCOL_BY_DRIVER 0x00000010
#define EFI_OPEN_PROTOCOL_EXCLUSIVE 0x00000020
#define EFI_IMAGE_GUID { 0x5B1B31A1, 0x9562, 0x11d2, \
{ 0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B } }
#define EFI_OPEN_PROTO_HANDLE 1
typedef struct efi_table efi_table_t;
typedef struct efi_image efi_image_t;
struct efi_image {
uint32_t rev;
void *parent_handle;
efi_table_t *table;
void *device;
void *file_path;
void *reserved;
uint32_t load_options_size;
void *load_opts;
void *image_base;
uint64_t image_size;
void *a, *b, *c;
};
#define EFI_FILE_SYSTEM_GUID { 0x0964e5b22, 0x6459, 0x11d2, \
{ 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } }
typedef struct efi_file efi_file_t;
typedef struct efi_file_system efi_file_system_t;
typedef struct efi_file_system {
uint64_t rev;
uint64_t (*open)(efi_file_system_t *this, efi_file_t **root);
} efi_file_system_t;
#define EFI_FILE_MODE_READ 1LL
#define EFI_FILE_MODE_WRITE (1LL << 1);
#define EFI_FILE_MODE_CREATE (1LL << 63);
#define EFI_FILE_READ_ONLY 0x0000000000000001
#define EFI_FILE_HIDDEN 0x0000000000000002
#define EFI_FILE_SYSTEM 0x0000000000000004
#define EFI_FILE_RESERVED 0x0000000000000008
#define EFI_FILE_DIRECTORY 0x0000000000000010
#define EFI_FILE_ARCHIVE 0x0000000000000020
#define EFI_FILE_VALID_ATTR 0x0000000000000037
#define EFI_FILE_INFO_ID { 0x09576e92, 0x6d3f, 0x11d2, \
{ 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } }
typedef struct {
uint16_t year;
uint8_t month;
uint8_t day;
uint8_t hour;
uint8_t minute;
uint8_t second;
uint8_t _unused0;
uint32_t nanosecond;
int16_t tz;
uint8_t daylight;
uint8_t _unused1;
} efi_time_t;
typedef struct efi_file_info {
uint64_t len;
uint64_t size;
uint64_t psize;
efi_time_t ctime;
efi_time_t atime;
efi_time_t mtime;
uint64_t attr;
int16_t name[];
} efi_file_info_t;
#define EFI_FILE_SYSTEM_INFO_ID { 0x09576e93, 0x6d3f, 0x11d2, \
{ 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } }
typedef struct efi_file_system_info {
uint64_t len;
bool ro;
uint64_t vsize;
uint64_t free;
uint64_t bsize;
int16_t label[];
} efi_file_system_info_t;
#define EFI_FILE_SYSTEM_VOLUME_ID { 0xdb47d7d3, 0xfe81, 0x11d3, \
{ 0x9a, 0x35, 0x00, 0x90, 0x27, 0x3f, 0xC1, 0x4d } }
typedef struct efi_file_system_volume {
int16_t label[];
} efi_file_system_volume;
struct efi_file {
uint64_t rev;
uint64_t (*open)(efi_file_t *this, efi_file_t **handle, const int16_t *name, uint64_t mode, uint64_t attrs);
uint64_t (*close)(efi_file_t *this);
uint64_t (*delete)(efi_file_t *this);
uint64_t (*read)(efi_file_t *this, uint64_t *size, void *buf);
uint64_t (*write)(efi_file_t *this, uint64_t *size, void *buf);
uint64_t (*seek)(efi_file_t *this, uint64_t ofs);
uint64_t (*tell)(efi_file_t *this, uint64_t *ofs);
uint64_t (*stat)(efi_file_t *this, efi_guid_t *type, uint64_t *size, void *buf);
uint64_t (*set)(efi_file_t *this, efi_guid_t *type, uint64_t size, void *buf);
uint64_t (*flush)(efi_file_t *this);
void *unused[4];
};
#endif /* EFI_FILE_H */