mineswefi.git

file.h

espurr
/* 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 */