mirror of
https://github.com/ventoy/Ventoy.git
synced 2025-09-17 17:31:16 +00:00
1. Optimization for WIMBOOT mode.
2. Add WIMBOOT for UEFI mode.
This commit is contained in:
318
wimboot/wimboot-2.7.3/src/bootapp.h
Normal file
318
wimboot/wimboot-2.7.3/src/bootapp.h
Normal file
@@ -0,0 +1,318 @@
|
||||
#ifndef _BOOTAPP_H
|
||||
#define _BOOTAPP_H
|
||||
|
||||
/*
|
||||
* Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301, USA.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* Boot application data structures
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/** A segment:offset address */
|
||||
struct segoff {
|
||||
/** Offset */
|
||||
uint16_t offset;
|
||||
/** Segment */
|
||||
uint16_t segment;
|
||||
} __attribute__ (( packed ));
|
||||
|
||||
/** A GUID */
|
||||
struct guid {
|
||||
/** 8 hex digits, big-endian */
|
||||
uint32_t a;
|
||||
/** 2 hex digits, big-endian */
|
||||
uint16_t b;
|
||||
/** 2 hex digits, big-endian */
|
||||
uint16_t c;
|
||||
/** 2 hex digits, big-endian */
|
||||
uint16_t d;
|
||||
/** 12 hex digits, big-endian */
|
||||
uint8_t e[6];
|
||||
} __attribute__ (( packed ));
|
||||
|
||||
/** Real-mode callback parameters */
|
||||
struct bootapp_callback_params {
|
||||
/** Vector */
|
||||
union {
|
||||
/** Interrupt number */
|
||||
uint32_t interrupt;
|
||||
/** Segment:offset address of real-mode function */
|
||||
struct segoff function;
|
||||
} vector;
|
||||
/** %eax value */
|
||||
union {
|
||||
struct {
|
||||
uint8_t al;
|
||||
uint8_t ah;
|
||||
} __attribute__ (( packed ));
|
||||
uint16_t ax;
|
||||
uint32_t eax;
|
||||
};
|
||||
/** %ebx value */
|
||||
union {
|
||||
struct {
|
||||
uint8_t bl;
|
||||
uint8_t bh;
|
||||
} __attribute__ (( packed ));
|
||||
uint16_t bx;
|
||||
uint32_t ebx;
|
||||
};
|
||||
/** %ecx value */
|
||||
union {
|
||||
struct {
|
||||
uint8_t cl;
|
||||
uint8_t ch;
|
||||
} __attribute__ (( packed ));
|
||||
uint16_t cx;
|
||||
uint32_t ecx;
|
||||
};
|
||||
/** %edx value */
|
||||
union {
|
||||
struct {
|
||||
uint8_t dl;
|
||||
uint8_t dh;
|
||||
} __attribute__ (( packed ));
|
||||
uint16_t dx;
|
||||
uint32_t edx;
|
||||
};
|
||||
/** Placeholder (for %esp?) */
|
||||
uint32_t unused_esp;
|
||||
/** Placeholder (for %ebp?) */
|
||||
uint32_t unused_ebp;
|
||||
/** %esi value */
|
||||
union {
|
||||
uint16_t si;
|
||||
uint32_t esi;
|
||||
};
|
||||
/** %edi value */
|
||||
union {
|
||||
uint16_t di;
|
||||
uint32_t edi;
|
||||
};
|
||||
/** Placeholder (for %cs?) */
|
||||
uint32_t unused_cs;
|
||||
/** %ds value */
|
||||
uint32_t ds;
|
||||
/** Placeholder (for %ss?) */
|
||||
uint32_t unused_ss;
|
||||
/** %es value */
|
||||
uint32_t es;
|
||||
/** %fs value */
|
||||
uint32_t fs;
|
||||
/** %gs value */
|
||||
uint32_t gs;
|
||||
/** eflags value */
|
||||
uint32_t eflags;
|
||||
} __attribute__ (( packed ));
|
||||
|
||||
/** eflags bits */
|
||||
enum eflags {
|
||||
CF = ( 1 << 0 ),
|
||||
PF = ( 1 << 2 ),
|
||||
AF = ( 1 << 4 ),
|
||||
ZF = ( 1 << 6 ),
|
||||
SF = ( 1 << 7 ),
|
||||
OF = ( 1 << 11 ),
|
||||
};
|
||||
|
||||
/** Real-mode callback function table */
|
||||
struct bootapp_callback_functions {
|
||||
/**
|
||||
* Call an arbitrary real-mode interrupt
|
||||
*
|
||||
* @v params Parameters
|
||||
*/
|
||||
void ( * call_interrupt ) ( struct bootapp_callback_params *params );
|
||||
/**
|
||||
* Call an arbitrary real-mode function
|
||||
*
|
||||
* @v params Parameters
|
||||
*/
|
||||
void ( * call_real ) ( struct bootapp_callback_params *params );
|
||||
} __attribute__ (( packed ));
|
||||
|
||||
/** Real-mode callbacks */
|
||||
struct bootapp_callback {
|
||||
/** Real-mode callback function table */
|
||||
struct bootapp_callback_functions *fns;
|
||||
/** Drive number for INT13 calls */
|
||||
uint32_t drive;
|
||||
} __attribute__ (( packed ));
|
||||
|
||||
/** Boot application descriptor */
|
||||
struct bootapp_descriptor {
|
||||
/** Signature */
|
||||
char signature[8];
|
||||
/** Version */
|
||||
uint32_t version;
|
||||
/** Total length */
|
||||
uint32_t len;
|
||||
/** COFF machine type */
|
||||
uint32_t arch;
|
||||
/** Reserved */
|
||||
uint32_t reserved_0x14;
|
||||
/** Loaded PE image base address */
|
||||
void *pe_base;
|
||||
/** Reserved */
|
||||
uint32_t reserved_0x1c;
|
||||
/** Length of loaded PE image */
|
||||
uint32_t pe_len;
|
||||
/** Offset to memory descriptor */
|
||||
uint32_t memory;
|
||||
/** Offset to boot application entry descriptor */
|
||||
uint32_t entry;
|
||||
/** Offset to ??? */
|
||||
uint32_t xxx;
|
||||
/** Offset to callback descriptor */
|
||||
uint32_t callback;
|
||||
/** Offset to pointless descriptor */
|
||||
uint32_t pointless;
|
||||
/** Reserved */
|
||||
uint32_t reserved_0x38;
|
||||
} __attribute__ (( packed ));
|
||||
|
||||
/** "BOOT APP" magic signature */
|
||||
#define BOOTAPP_SIGNATURE "BOOT APP"
|
||||
|
||||
/** Boot application descriptor version */
|
||||
#define BOOTAPP_VERSION 2
|
||||
|
||||
/** i386 architecture */
|
||||
#define BOOTAPP_ARCH_I386 0x014c
|
||||
|
||||
/** Memory region descriptor */
|
||||
struct bootapp_memory_region {
|
||||
/** Reserved (for struct list_head?) */
|
||||
uint8_t reserved[8];
|
||||
/** Start page address */
|
||||
uint64_t start_page;
|
||||
/** Reserved */
|
||||
uint8_t reserved_0x10[8];
|
||||
/** Number of pages */
|
||||
uint64_t num_pages;
|
||||
/** Reserved */
|
||||
uint8_t reserved_0x20[4];
|
||||
/** Flags */
|
||||
uint32_t flags;
|
||||
} __attribute__ (( packed ));
|
||||
|
||||
/** Memory descriptor */
|
||||
struct bootapp_memory_descriptor {
|
||||
/** Version */
|
||||
uint32_t version;
|
||||
/** Length of descriptor (excluding region descriptors) */
|
||||
uint32_t len;
|
||||
/** Number of regions */
|
||||
uint32_t num_regions;
|
||||
/** Length of each region descriptor */
|
||||
uint32_t region_len;
|
||||
/** Length of reserved area at start of each region descriptor */
|
||||
uint32_t reserved_len;
|
||||
} __attribute__ (( packed ));
|
||||
|
||||
/** Boot application memory descriptor version */
|
||||
#define BOOTAPP_MEMORY_VERSION 1
|
||||
|
||||
/** Boot application entry descriptor */
|
||||
struct bootapp_entry_descriptor {
|
||||
/** Signature */
|
||||
char signature[8];
|
||||
/** Flags */
|
||||
uint32_t flags;
|
||||
/** GUID */
|
||||
struct guid guid;
|
||||
/** Reserved */
|
||||
uint8_t reserved[16];
|
||||
} __attribute__ (( packed ));
|
||||
|
||||
/** ??? */
|
||||
struct bootapp_entry_wtf1_descriptor {
|
||||
/** Flags */
|
||||
uint32_t flags;
|
||||
/** Length of descriptor */
|
||||
uint32_t len;
|
||||
/** Total length of following descriptors within BTAPENT */
|
||||
uint32_t extra_len;
|
||||
/** Reserved */
|
||||
uint8_t reserved[12];
|
||||
} __attribute__ (( packed ));
|
||||
|
||||
/** ??? */
|
||||
struct bootapp_entry_wtf2_descriptor {
|
||||
/** GUID */
|
||||
struct guid guid;
|
||||
} __attribute__ (( packed ));
|
||||
|
||||
/** ??? */
|
||||
struct bootapp_entry_wtf3_descriptor {
|
||||
/** Flags */
|
||||
uint32_t flags;
|
||||
/** Reserved */
|
||||
uint32_t reserved_0x04;
|
||||
/** Length of descriptor */
|
||||
uint32_t len;
|
||||
/** Reserved */
|
||||
uint32_t reserved_0x0c;
|
||||
/** Boot partition offset (in bytes) */
|
||||
uint32_t boot_partition_offset;
|
||||
/** Reserved */
|
||||
uint8_t reserved_0x14[16];
|
||||
/** MBR signature present? */
|
||||
uint32_t xxx;
|
||||
/** MBR signature */
|
||||
uint32_t mbr_signature;
|
||||
/** Reserved */
|
||||
uint8_t reserved_0x2c[26];
|
||||
} __attribute__ (( packed ));
|
||||
|
||||
/** "BTAPENT" magic signature */
|
||||
#define BOOTAPP_ENTRY_SIGNATURE "BTAPENT\0"
|
||||
|
||||
/** Boot application entry flags
|
||||
*
|
||||
* pxeboot, etftboot, and fatboot all use a value of 0x21; I have no
|
||||
* idea what it means.
|
||||
*/
|
||||
#define BOOTAPP_ENTRY_FLAGS 0x21
|
||||
|
||||
/** Boot application callback descriptor */
|
||||
struct bootapp_callback_descriptor {
|
||||
/** Real-mode callbacks */
|
||||
struct bootapp_callback *callback;
|
||||
/** Reserved */
|
||||
uint32_t reserved;
|
||||
} __attribute__ (( packed ));
|
||||
|
||||
/** Boot application pointless descriptor */
|
||||
struct bootapp_pointless_descriptor {
|
||||
/** Version */
|
||||
uint32_t version;
|
||||
/** Reserved */
|
||||
uint8_t reserved[24];
|
||||
} __attribute__ (( packed ));
|
||||
|
||||
/** Boot application pointless descriptor version */
|
||||
#define BOOTAPP_POINTLESS_VERSION 1
|
||||
|
||||
#endif /* _BOOTAPP_H */
|
Reference in New Issue
Block a user