mirror of
https://github.com/grub4dos/ntloader.git
synced 2025-05-08 19:51:14 +08:00
348 lines
7.7 KiB
C
348 lines
7.7 KiB
C
#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),
|
|
TF = (1 << 8),
|
|
IF = (1 << 9),
|
|
DF = (1 << 10),
|
|
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 */
|