mirror of
https://github.com/hedge-dev/XenonRecomp.git
synced 2025-07-22 04:47:13 +00:00
Rebrand to XenonRecomp.
This commit is contained in:
10
XenonUtils/CMakeLists.txt
Normal file
10
XenonUtils/CMakeLists.txt
Normal file
@@ -0,0 +1,10 @@
|
||||
project("XenonUtils")
|
||||
|
||||
add_library(XenonUtils
|
||||
"disasm.cpp"
|
||||
"xex.cpp"
|
||||
"image.cpp"
|
||||
"xdbf_wrapper.cpp")
|
||||
|
||||
target_include_directories(XenonUtils PUBLIC .)
|
||||
target_link_libraries(XenonUtils PUBLIC disasm)
|
25
XenonUtils/byteswap.h
Normal file
25
XenonUtils/byteswap.h
Normal file
@@ -0,0 +1,25 @@
|
||||
#pragma once
|
||||
|
||||
#include <cassert>
|
||||
|
||||
template<typename T>
|
||||
inline T ByteSwap(T value)
|
||||
{
|
||||
if constexpr (sizeof(T) == 1)
|
||||
return value;
|
||||
else if constexpr (sizeof(T) == 2)
|
||||
return static_cast<T>(__builtin_bswap16(static_cast<uint16_t>(value)));
|
||||
else if constexpr (sizeof(T) == 4)
|
||||
return static_cast<T>(__builtin_bswap32(static_cast<uint32_t>(value)));
|
||||
else if constexpr (sizeof(T) == 8)
|
||||
return static_cast<T>(__builtin_bswap64(static_cast<uint64_t>(value)));
|
||||
|
||||
assert(false && "Unexpected byte size.");
|
||||
return value;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
inline void ByteSwapInplace(T& value)
|
||||
{
|
||||
value = ByteSwap(value);
|
||||
}
|
33
XenonUtils/disasm.cpp
Normal file
33
XenonUtils/disasm.cpp
Normal file
@@ -0,0 +1,33 @@
|
||||
#include "disasm.h"
|
||||
|
||||
thread_local ppc::DisassemblerEngine ppc::gBigEndianDisassembler{ BFD_ENDIAN_BIG, "cell 64"};
|
||||
|
||||
ppc::DisassemblerEngine::DisassemblerEngine(bfd_endian endian, const char* options)
|
||||
{
|
||||
INIT_DISASSEMBLE_INFO(info, stdout, fprintf);
|
||||
info.arch = bfd_arch_powerpc;
|
||||
info.endian = endian;
|
||||
info.disassembler_options = options;
|
||||
}
|
||||
|
||||
int ppc::DisassemblerEngine::Disassemble(const void* code, size_t size, uint64_t base, ppc_insn& out)
|
||||
{
|
||||
if (size < 4)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
info.buffer = (bfd_byte*)code;
|
||||
info.buffer_vma = base;
|
||||
info.buffer_length = size;
|
||||
return decode_insn_ppc(base, &info, &out);
|
||||
}
|
||||
|
||||
int ppc::Disassemble(const void* code, uint64_t base, ppc_insn* out, size_t nOut)
|
||||
{
|
||||
for (size_t i = 0; i < nOut; i++)
|
||||
{
|
||||
Disassemble(static_cast<const uint32_t*>(code) + i, base, out[i]);
|
||||
}
|
||||
return static_cast<int>(nOut) * 4;
|
||||
}
|
35
XenonUtils/disasm.h
Normal file
35
XenonUtils/disasm.h
Normal file
@@ -0,0 +1,35 @@
|
||||
#pragma once
|
||||
#include <dis-asm.h>
|
||||
#include <ppc.h>
|
||||
|
||||
namespace ppc
|
||||
{
|
||||
struct DisassemblerEngine
|
||||
{
|
||||
disassemble_info info{};
|
||||
DisassemblerEngine(const DisassemblerEngine&) = default;
|
||||
DisassemblerEngine& operator=(const DisassemblerEngine&) = delete;
|
||||
|
||||
DisassemblerEngine(bfd_endian endian, const char* options);
|
||||
~DisassemblerEngine() = default;
|
||||
|
||||
/**
|
||||
* \return Numbers of bytes decoded
|
||||
*/
|
||||
int Disassemble(const void* code, size_t size, uint64_t base, ppc_insn& out);
|
||||
};
|
||||
|
||||
thread_local extern DisassemblerEngine gBigEndianDisassembler;
|
||||
|
||||
static int Disassemble(const void* code, size_t size, uint64_t base, ppc_insn& out)
|
||||
{
|
||||
return gBigEndianDisassembler.Disassemble(code, size, base, out);
|
||||
}
|
||||
|
||||
static int Disassemble(const void* code, uint64_t base, ppc_insn& out)
|
||||
{
|
||||
return Disassemble(code, 4, base, out);
|
||||
}
|
||||
|
||||
static int Disassemble(const void* code, uint64_t base, ppc_insn* out, size_t nOut);
|
||||
}
|
488
XenonUtils/elf.h
Normal file
488
XenonUtils/elf.h
Normal file
@@ -0,0 +1,488 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#ifndef _UAPI_LINUX_ELF_H
|
||||
#define _UAPI_LINUX_ELF_H
|
||||
|
||||
typedef unsigned int __u32;
|
||||
typedef unsigned short __u16;
|
||||
|
||||
typedef signed int __s32;
|
||||
typedef signed short __s16;
|
||||
|
||||
typedef unsigned long long __u64;
|
||||
typedef signed long long __s64;
|
||||
|
||||
/* 32-bit ELF base types. */
|
||||
typedef __u32 Elf32_Addr;
|
||||
typedef __u16 Elf32_Half;
|
||||
typedef __u32 Elf32_Off;
|
||||
typedef __s32 Elf32_Sword;
|
||||
typedef __u32 Elf32_Word;
|
||||
|
||||
/* 64-bit ELF base types. */
|
||||
typedef __u64 Elf64_Addr;
|
||||
typedef __u16 Elf64_Half;
|
||||
typedef __s16 Elf64_SHalf;
|
||||
typedef __u64 Elf64_Off;
|
||||
typedef __s32 Elf64_Sword;
|
||||
typedef __u32 Elf64_Word;
|
||||
typedef __u64 Elf64_Xword;
|
||||
typedef __s64 Elf64_Sxword;
|
||||
|
||||
/* These constants are for the segment types stored in the image headers */
|
||||
#define PT_NULL 0
|
||||
#define PT_LOAD 1
|
||||
#define PT_DYNAMIC 2
|
||||
#define PT_INTERP 3
|
||||
#define PT_NOTE 4
|
||||
#define PT_SHLIB 5
|
||||
#define PT_PHDR 6
|
||||
#define PT_TLS 7 /* Thread local storage segment */
|
||||
#define PT_LOOS 0x60000000 /* OS-specific */
|
||||
#define PT_HIOS 0x6fffffff /* OS-specific */
|
||||
#define PT_LOPROC 0x70000000
|
||||
#define PT_HIPROC 0x7fffffff
|
||||
#define PT_GNU_EH_FRAME (PT_LOOS + 0x474e550)
|
||||
#define PT_GNU_STACK (PT_LOOS + 0x474e551)
|
||||
#define PT_GNU_RELRO (PT_LOOS + 0x474e552)
|
||||
#define PT_GNU_PROPERTY (PT_LOOS + 0x474e553)
|
||||
|
||||
|
||||
/* ARM MTE memory tag segment type */
|
||||
#define PT_AARCH64_MEMTAG_MTE (PT_LOPROC + 0x2)
|
||||
|
||||
/*
|
||||
* Extended Numbering
|
||||
*
|
||||
* If the real number of program header table entries is larger than
|
||||
* or equal to PN_XNUM(0xffff), it is set to sh_info field of the
|
||||
* section header at index 0, and PN_XNUM is set to e_phnum
|
||||
* field. Otherwise, the section header at index 0 is zero
|
||||
* initialized, if it exists.
|
||||
*
|
||||
* Specifications are available in:
|
||||
*
|
||||
* - Oracle: Linker and Libraries.
|
||||
* Part No: 817<31>1984<38>19, August 2011.
|
||||
* https://docs.oracle.com/cd/E18752_01/pdf/817-1984.pdf
|
||||
*
|
||||
* - System V ABI AMD64 Architecture Processor Supplement
|
||||
* Draft Version 0.99.4,
|
||||
* January 13, 2010.
|
||||
* http://www.cs.washington.edu/education/courses/cse351/12wi/supp-docs/abi.pdf
|
||||
*/
|
||||
#define PN_XNUM 0xffff
|
||||
|
||||
/* These constants define the different elf file types */
|
||||
#define ET_NONE 0
|
||||
#define ET_REL 1
|
||||
#define ET_EXEC 2
|
||||
#define ET_DYN 3
|
||||
#define ET_CORE 4
|
||||
#define ET_LOPROC 0xff00
|
||||
#define ET_HIPROC 0xffff
|
||||
|
||||
/* This is the info that is needed to parse the dynamic section of the file */
|
||||
#define DT_NULL 0
|
||||
#define DT_NEEDED 1
|
||||
#define DT_PLTRELSZ 2
|
||||
#define DT_PLTGOT 3
|
||||
#define DT_HASH 4
|
||||
#define DT_STRTAB 5
|
||||
#define DT_SYMTAB 6
|
||||
#define DT_RELA 7
|
||||
#define DT_RELASZ 8
|
||||
#define DT_RELAENT 9
|
||||
#define DT_STRSZ 10
|
||||
#define DT_SYMENT 11
|
||||
#define DT_INIT 12
|
||||
#define DT_FINI 13
|
||||
#define DT_SONAME 14
|
||||
#define DT_RPATH 15
|
||||
#define DT_SYMBOLIC 16
|
||||
#define DT_REL 17
|
||||
#define DT_RELSZ 18
|
||||
#define DT_RELENT 19
|
||||
#define DT_PLTREL 20
|
||||
#define DT_DEBUG 21
|
||||
#define DT_TEXTREL 22
|
||||
#define DT_JMPREL 23
|
||||
#define DT_ENCODING 32
|
||||
#define OLD_DT_LOOS 0x60000000
|
||||
#define DT_LOOS 0x6000000d
|
||||
#define DT_HIOS 0x6ffff000
|
||||
#define DT_VALRNGLO 0x6ffffd00
|
||||
#define DT_VALRNGHI 0x6ffffdff
|
||||
#define DT_ADDRRNGLO 0x6ffffe00
|
||||
#define DT_ADDRRNGHI 0x6ffffeff
|
||||
#define DT_VERSYM 0x6ffffff0
|
||||
#define DT_RELACOUNT 0x6ffffff9
|
||||
#define DT_RELCOUNT 0x6ffffffa
|
||||
#define DT_FLAGS_1 0x6ffffffb
|
||||
#define DT_VERDEF 0x6ffffffc
|
||||
#define DT_VERDEFNUM 0x6ffffffd
|
||||
#define DT_VERNEED 0x6ffffffe
|
||||
#define DT_VERNEEDNUM 0x6fffffff
|
||||
#define OLD_DT_HIOS 0x6fffffff
|
||||
#define DT_LOPROC 0x70000000
|
||||
#define DT_HIPROC 0x7fffffff
|
||||
|
||||
/* This info is needed when parsing the symbol table */
|
||||
#define STB_LOCAL 0
|
||||
#define STB_GLOBAL 1
|
||||
#define STB_WEAK 2
|
||||
|
||||
#define STT_NOTYPE 0
|
||||
#define STT_OBJECT 1
|
||||
#define STT_FUNC 2
|
||||
#define STT_SECTION 3
|
||||
#define STT_FILE 4
|
||||
#define STT_COMMON 5
|
||||
#define STT_TLS 6
|
||||
|
||||
#define ELF_ST_BIND(x) ((x) >> 4)
|
||||
#define ELF_ST_TYPE(x) ((x) & 0xf)
|
||||
#define ELF32_ST_BIND(x) ELF_ST_BIND(x)
|
||||
#define ELF32_ST_TYPE(x) ELF_ST_TYPE(x)
|
||||
#define ELF64_ST_BIND(x) ELF_ST_BIND(x)
|
||||
#define ELF64_ST_TYPE(x) ELF_ST_TYPE(x)
|
||||
|
||||
typedef struct {
|
||||
Elf32_Sword d_tag;
|
||||
union {
|
||||
Elf32_Sword d_val;
|
||||
Elf32_Addr d_ptr;
|
||||
} d_un;
|
||||
} Elf32_Dyn;
|
||||
|
||||
typedef struct {
|
||||
Elf64_Sxword d_tag; /* entry tag value */
|
||||
union {
|
||||
Elf64_Xword d_val;
|
||||
Elf64_Addr d_ptr;
|
||||
} d_un;
|
||||
} Elf64_Dyn;
|
||||
|
||||
/* The following are used with relocations */
|
||||
#define ELF32_R_SYM(x) ((x) >> 8)
|
||||
#define ELF32_R_TYPE(x) ((x) & 0xff)
|
||||
|
||||
#define ELF64_R_SYM(i) ((i) >> 32)
|
||||
#define ELF64_R_TYPE(i) ((i) & 0xffffffff)
|
||||
|
||||
typedef struct elf32_rel {
|
||||
Elf32_Addr r_offset;
|
||||
Elf32_Word r_info;
|
||||
} Elf32_Rel;
|
||||
|
||||
typedef struct elf64_rel {
|
||||
Elf64_Addr r_offset; /* Location at which to apply the action */
|
||||
Elf64_Xword r_info; /* index and type of relocation */
|
||||
} Elf64_Rel;
|
||||
|
||||
typedef struct elf32_rela {
|
||||
Elf32_Addr r_offset;
|
||||
Elf32_Word r_info;
|
||||
Elf32_Sword r_addend;
|
||||
} Elf32_Rela;
|
||||
|
||||
typedef struct elf64_rela {
|
||||
Elf64_Addr r_offset; /* Location at which to apply the action */
|
||||
Elf64_Xword r_info; /* index and type of relocation */
|
||||
Elf64_Sxword r_addend; /* Constant addend used to compute value */
|
||||
} Elf64_Rela;
|
||||
|
||||
typedef struct elf32_sym {
|
||||
Elf32_Word st_name;
|
||||
Elf32_Addr st_value;
|
||||
Elf32_Word st_size;
|
||||
unsigned char st_info;
|
||||
unsigned char st_other;
|
||||
Elf32_Half st_shndx;
|
||||
} Elf32_Sym;
|
||||
|
||||
typedef struct elf64_sym {
|
||||
Elf64_Word st_name; /* Symbol name, index in string tbl */
|
||||
unsigned char st_info; /* Type and binding attributes */
|
||||
unsigned char st_other; /* No defined meaning, 0 */
|
||||
Elf64_Half st_shndx; /* Associated section index */
|
||||
Elf64_Addr st_value; /* Value of the symbol */
|
||||
Elf64_Xword st_size; /* Associated symbol size */
|
||||
} Elf64_Sym;
|
||||
|
||||
|
||||
#define EI_NIDENT 16
|
||||
|
||||
typedef struct elf32_hdr {
|
||||
unsigned char e_ident[EI_NIDENT];
|
||||
Elf32_Half e_type;
|
||||
Elf32_Half e_machine;
|
||||
Elf32_Word e_version;
|
||||
Elf32_Addr e_entry; /* Entry point */
|
||||
Elf32_Off e_phoff;
|
||||
Elf32_Off e_shoff;
|
||||
Elf32_Word e_flags;
|
||||
Elf32_Half e_ehsize;
|
||||
Elf32_Half e_phentsize;
|
||||
Elf32_Half e_phnum;
|
||||
Elf32_Half e_shentsize;
|
||||
Elf32_Half e_shnum;
|
||||
Elf32_Half e_shstrndx;
|
||||
} Elf32_Ehdr;
|
||||
|
||||
typedef struct elf64_hdr {
|
||||
unsigned char e_ident[EI_NIDENT]; /* ELF "magic number" */
|
||||
Elf64_Half e_type;
|
||||
Elf64_Half e_machine;
|
||||
Elf64_Word e_version;
|
||||
Elf64_Addr e_entry; /* Entry point virtual address */
|
||||
Elf64_Off e_phoff; /* Program header table file offset */
|
||||
Elf64_Off e_shoff; /* Section header table file offset */
|
||||
Elf64_Word e_flags;
|
||||
Elf64_Half e_ehsize;
|
||||
Elf64_Half e_phentsize;
|
||||
Elf64_Half e_phnum;
|
||||
Elf64_Half e_shentsize;
|
||||
Elf64_Half e_shnum;
|
||||
Elf64_Half e_shstrndx;
|
||||
} Elf64_Ehdr;
|
||||
|
||||
/* These constants define the permissions on sections in the program
|
||||
header, p_flags. */
|
||||
#define PF_R 0x4
|
||||
#define PF_W 0x2
|
||||
#define PF_X 0x1
|
||||
|
||||
typedef struct elf32_phdr {
|
||||
Elf32_Word p_type;
|
||||
Elf32_Off p_offset;
|
||||
Elf32_Addr p_vaddr;
|
||||
Elf32_Addr p_paddr;
|
||||
Elf32_Word p_filesz;
|
||||
Elf32_Word p_memsz;
|
||||
Elf32_Word p_flags;
|
||||
Elf32_Word p_align;
|
||||
} Elf32_Phdr;
|
||||
|
||||
typedef struct elf64_phdr {
|
||||
Elf64_Word p_type;
|
||||
Elf64_Word p_flags;
|
||||
Elf64_Off p_offset; /* Segment file offset */
|
||||
Elf64_Addr p_vaddr; /* Segment virtual address */
|
||||
Elf64_Addr p_paddr; /* Segment physical address */
|
||||
Elf64_Xword p_filesz; /* Segment size in file */
|
||||
Elf64_Xword p_memsz; /* Segment size in memory */
|
||||
Elf64_Xword p_align; /* Segment alignment, file & memory */
|
||||
} Elf64_Phdr;
|
||||
|
||||
/* sh_type */
|
||||
#define SHT_NULL 0
|
||||
#define SHT_PROGBITS 1
|
||||
#define SHT_SYMTAB 2
|
||||
#define SHT_STRTAB 3
|
||||
#define SHT_RELA 4
|
||||
#define SHT_HASH 5
|
||||
#define SHT_DYNAMIC 6
|
||||
#define SHT_NOTE 7
|
||||
#define SHT_NOBITS 8
|
||||
#define SHT_REL 9
|
||||
#define SHT_SHLIB 10
|
||||
#define SHT_DYNSYM 11
|
||||
#define SHT_NUM 12
|
||||
#define SHT_LOPROC 0x70000000
|
||||
#define SHT_HIPROC 0x7fffffff
|
||||
#define SHT_LOUSER 0x80000000
|
||||
#define SHT_HIUSER 0xffffffff
|
||||
|
||||
/* sh_flags */
|
||||
#define SHF_WRITE 0x1
|
||||
#define SHF_ALLOC 0x2
|
||||
#define SHF_EXECINSTR 0x4
|
||||
#define SHF_RELA_LIVEPATCH 0x00100000
|
||||
#define SHF_RO_AFTER_INIT 0x00200000
|
||||
#define SHF_MASKPROC 0xf0000000
|
||||
|
||||
/* special section indexes */
|
||||
#define SHN_UNDEF 0
|
||||
#define SHN_LORESERVE 0xff00
|
||||
#define SHN_LOPROC 0xff00
|
||||
#define SHN_HIPROC 0xff1f
|
||||
#define SHN_LIVEPATCH 0xff20
|
||||
#define SHN_ABS 0xfff1
|
||||
#define SHN_COMMON 0xfff2
|
||||
#define SHN_HIRESERVE 0xffff
|
||||
|
||||
typedef struct elf32_shdr {
|
||||
Elf32_Word sh_name;
|
||||
Elf32_Word sh_type;
|
||||
Elf32_Word sh_flags;
|
||||
Elf32_Addr sh_addr;
|
||||
Elf32_Off sh_offset;
|
||||
Elf32_Word sh_size;
|
||||
Elf32_Word sh_link;
|
||||
Elf32_Word sh_info;
|
||||
Elf32_Word sh_addralign;
|
||||
Elf32_Word sh_entsize;
|
||||
} Elf32_Shdr;
|
||||
|
||||
typedef struct elf64_shdr {
|
||||
Elf64_Word sh_name; /* Section name, index in string tbl */
|
||||
Elf64_Word sh_type; /* Type of section */
|
||||
Elf64_Xword sh_flags; /* Miscellaneous section attributes */
|
||||
Elf64_Addr sh_addr; /* Section virtual addr at execution */
|
||||
Elf64_Off sh_offset; /* Section file offset */
|
||||
Elf64_Xword sh_size; /* Size of section in bytes */
|
||||
Elf64_Word sh_link; /* Index of another section */
|
||||
Elf64_Word sh_info; /* Additional section information */
|
||||
Elf64_Xword sh_addralign; /* Section alignment */
|
||||
Elf64_Xword sh_entsize; /* Entry size if section holds table */
|
||||
} Elf64_Shdr;
|
||||
|
||||
#define EI_MAG0 0 /* e_ident[] indexes */
|
||||
#define EI_MAG1 1
|
||||
#define EI_MAG2 2
|
||||
#define EI_MAG3 3
|
||||
#define EI_CLASS 4
|
||||
#define EI_DATA 5
|
||||
#define EI_VERSION 6
|
||||
#define EI_OSABI 7
|
||||
#define EI_PAD 8
|
||||
|
||||
#define ELFMAG0 0x7f /* EI_MAG */
|
||||
#define ELFMAG1 'E'
|
||||
#define ELFMAG2 'L'
|
||||
#define ELFMAG3 'F'
|
||||
#define ELFMAG "\177ELF"
|
||||
#define SELFMAG 4
|
||||
|
||||
#define ELFCLASSNONE 0 /* EI_CLASS */
|
||||
#define ELFCLASS32 1
|
||||
#define ELFCLASS64 2
|
||||
#define ELFCLASSNUM 3
|
||||
|
||||
#define ELFDATANONE 0 /* e_ident[EI_DATA] */
|
||||
#define ELFDATA2LSB 1
|
||||
#define ELFDATA2MSB 2
|
||||
|
||||
#define EV_NONE 0 /* e_version, EI_VERSION */
|
||||
#define EV_CURRENT 1
|
||||
#define EV_NUM 2
|
||||
|
||||
#define ELFOSABI_NONE 0
|
||||
#define ELFOSABI_LINUX 3
|
||||
|
||||
#ifndef ELF_OSABI
|
||||
#define ELF_OSABI ELFOSABI_NONE
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Notes used in ET_CORE. Architectures export some of the arch register sets
|
||||
* using the corresponding note types via the PTRACE_GETREGSET and
|
||||
* PTRACE_SETREGSET requests.
|
||||
* The note name for these types is "LINUX", except NT_PRFPREG that is named
|
||||
* "CORE".
|
||||
*/
|
||||
#define NT_PRSTATUS 1
|
||||
#define NT_PRFPREG 2
|
||||
#define NT_PRPSINFO 3
|
||||
#define NT_TASKSTRUCT 4
|
||||
#define NT_AUXV 6
|
||||
/*
|
||||
* Note to userspace developers: size of NT_SIGINFO note may increase
|
||||
* in the future to accomodate more fields, don't assume it is fixed!
|
||||
*/
|
||||
#define NT_SIGINFO 0x53494749
|
||||
#define NT_FILE 0x46494c45
|
||||
#define NT_PRXFPREG 0x46e62b7f /* copied from gdb5.1/include/elf/common.h */
|
||||
#define NT_PPC_VMX 0x100 /* PowerPC Altivec/VMX registers */
|
||||
#define NT_PPC_SPE 0x101 /* PowerPC SPE/EVR registers */
|
||||
#define NT_PPC_VSX 0x102 /* PowerPC VSX registers */
|
||||
#define NT_PPC_TAR 0x103 /* Target Address Register */
|
||||
#define NT_PPC_PPR 0x104 /* Program Priority Register */
|
||||
#define NT_PPC_DSCR 0x105 /* Data Stream Control Register */
|
||||
#define NT_PPC_EBB 0x106 /* Event Based Branch Registers */
|
||||
#define NT_PPC_PMU 0x107 /* Performance Monitor Registers */
|
||||
#define NT_PPC_TM_CGPR 0x108 /* TM checkpointed GPR Registers */
|
||||
#define NT_PPC_TM_CFPR 0x109 /* TM checkpointed FPR Registers */
|
||||
#define NT_PPC_TM_CVMX 0x10a /* TM checkpointed VMX Registers */
|
||||
#define NT_PPC_TM_CVSX 0x10b /* TM checkpointed VSX Registers */
|
||||
#define NT_PPC_TM_SPR 0x10c /* TM Special Purpose Registers */
|
||||
#define NT_PPC_TM_CTAR 0x10d /* TM checkpointed Target Address Register */
|
||||
#define NT_PPC_TM_CPPR 0x10e /* TM checkpointed Program Priority Register */
|
||||
#define NT_PPC_TM_CDSCR 0x10f /* TM checkpointed Data Stream Control Register */
|
||||
#define NT_PPC_PKEY 0x110 /* Memory Protection Keys registers */
|
||||
#define NT_PPC_DEXCR 0x111 /* PowerPC DEXCR registers */
|
||||
#define NT_PPC_HASHKEYR 0x112 /* PowerPC HASHKEYR register */
|
||||
#define NT_386_TLS 0x200 /* i386 TLS slots (struct user_desc) */
|
||||
#define NT_386_IOPERM 0x201 /* x86 io permission bitmap (1=deny) */
|
||||
#define NT_X86_XSTATE 0x202 /* x86 extended state using xsave */
|
||||
/* Old binutils treats 0x203 as a CET state */
|
||||
#define NT_X86_SHSTK 0x204 /* x86 SHSTK state */
|
||||
#define NT_S390_HIGH_GPRS 0x300 /* s390 upper register halves */
|
||||
#define NT_S390_TIMER 0x301 /* s390 timer register */
|
||||
#define NT_S390_TODCMP 0x302 /* s390 TOD clock comparator register */
|
||||
#define NT_S390_TODPREG 0x303 /* s390 TOD programmable register */
|
||||
#define NT_S390_CTRS 0x304 /* s390 control registers */
|
||||
#define NT_S390_PREFIX 0x305 /* s390 prefix register */
|
||||
#define NT_S390_LAST_BREAK 0x306 /* s390 breaking event address */
|
||||
#define NT_S390_SYSTEM_CALL 0x307 /* s390 system call restart data */
|
||||
#define NT_S390_TDB 0x308 /* s390 transaction diagnostic block */
|
||||
#define NT_S390_VXRS_LOW 0x309 /* s390 vector registers 0-15 upper half */
|
||||
#define NT_S390_VXRS_HIGH 0x30a /* s390 vector registers 16-31 */
|
||||
#define NT_S390_GS_CB 0x30b /* s390 guarded storage registers */
|
||||
#define NT_S390_GS_BC 0x30c /* s390 guarded storage broadcast control block */
|
||||
#define NT_S390_RI_CB 0x30d /* s390 runtime instrumentation */
|
||||
#define NT_S390_PV_CPU_DATA 0x30e /* s390 protvirt cpu dump data */
|
||||
#define NT_ARM_VFP 0x400 /* ARM VFP/NEON registers */
|
||||
#define NT_ARM_TLS 0x401 /* ARM TLS register */
|
||||
#define NT_ARM_HW_BREAK 0x402 /* ARM hardware breakpoint registers */
|
||||
#define NT_ARM_HW_WATCH 0x403 /* ARM hardware watchpoint registers */
|
||||
#define NT_ARM_SYSTEM_CALL 0x404 /* ARM system call number */
|
||||
#define NT_ARM_SVE 0x405 /* ARM Scalable Vector Extension registers */
|
||||
#define NT_ARM_PAC_MASK 0x406 /* ARM pointer authentication code masks */
|
||||
#define NT_ARM_PACA_KEYS 0x407 /* ARM pointer authentication address keys */
|
||||
#define NT_ARM_PACG_KEYS 0x408 /* ARM pointer authentication generic key */
|
||||
#define NT_ARM_TAGGED_ADDR_CTRL 0x409 /* arm64 tagged address control (prctl()) */
|
||||
#define NT_ARM_PAC_ENABLED_KEYS 0x40a /* arm64 ptr auth enabled keys (prctl()) */
|
||||
#define NT_ARM_SSVE 0x40b /* ARM Streaming SVE registers */
|
||||
#define NT_ARM_ZA 0x40c /* ARM SME ZA registers */
|
||||
#define NT_ARM_ZT 0x40d /* ARM SME ZT registers */
|
||||
#define NT_ARM_FPMR 0x40e /* ARM floating point mode register */
|
||||
#define NT_ARC_V2 0x600 /* ARCv2 accumulator/extra registers */
|
||||
#define NT_VMCOREDD 0x700 /* Vmcore Device Dump Note */
|
||||
#define NT_MIPS_DSP 0x800 /* MIPS DSP ASE registers */
|
||||
#define NT_MIPS_FP_MODE 0x801 /* MIPS floating-point mode */
|
||||
#define NT_MIPS_MSA 0x802 /* MIPS SIMD registers */
|
||||
#define NT_RISCV_CSR 0x900 /* RISC-V Control and Status Registers */
|
||||
#define NT_RISCV_VECTOR 0x901 /* RISC-V vector registers */
|
||||
#define NT_LOONGARCH_CPUCFG 0xa00 /* LoongArch CPU config registers */
|
||||
#define NT_LOONGARCH_CSR 0xa01 /* LoongArch control and status registers */
|
||||
#define NT_LOONGARCH_LSX 0xa02 /* LoongArch Loongson SIMD Extension registers */
|
||||
#define NT_LOONGARCH_LASX 0xa03 /* LoongArch Loongson Advanced SIMD Extension registers */
|
||||
#define NT_LOONGARCH_LBT 0xa04 /* LoongArch Loongson Binary Translation registers */
|
||||
#define NT_LOONGARCH_HW_BREAK 0xa05 /* LoongArch hardware breakpoint registers */
|
||||
#define NT_LOONGARCH_HW_WATCH 0xa06 /* LoongArch hardware watchpoint registers */
|
||||
|
||||
/* Note types with note name "GNU" */
|
||||
#define NT_GNU_PROPERTY_TYPE_0 5
|
||||
|
||||
/* Note header in a PT_NOTE section */
|
||||
typedef struct elf32_note {
|
||||
Elf32_Word n_namesz; /* Name size */
|
||||
Elf32_Word n_descsz; /* Content size */
|
||||
Elf32_Word n_type; /* Content type */
|
||||
} Elf32_Nhdr;
|
||||
|
||||
/* Note header in a PT_NOTE section */
|
||||
typedef struct elf64_note {
|
||||
Elf64_Word n_namesz; /* Name size */
|
||||
Elf64_Word n_descsz; /* Content size */
|
||||
Elf64_Word n_type; /* Content type */
|
||||
} Elf64_Nhdr;
|
||||
|
||||
/* .note.gnu.property types for EM_AARCH64: */
|
||||
#define GNU_PROPERTY_AARCH64_FEATURE_1_AND 0xc0000000
|
||||
|
||||
/* Bits for GNU_PROPERTY_AARCH64_FEATURE_1_BTI */
|
||||
#define GNU_PROPERTY_AARCH64_FEATURE_1_BTI (1U << 0)
|
||||
|
||||
#endif /* _UAPI_LINUX_ELF_H */
|
28
XenonUtils/file.h
Normal file
28
XenonUtils/file.h
Normal file
@@ -0,0 +1,28 @@
|
||||
#pragma once
|
||||
|
||||
#include <filesystem>
|
||||
#include <fstream>
|
||||
#include <vector>
|
||||
|
||||
inline std::vector<uint8_t> LoadFile(const std::filesystem::path& path)
|
||||
{
|
||||
std::ifstream stream(path, std::ios::binary);
|
||||
if (!stream.is_open())
|
||||
{
|
||||
return {};
|
||||
}
|
||||
|
||||
stream.seekg(0, std::ios::end);
|
||||
std::streampos size = stream.tellg();
|
||||
stream.seekg(0, std::ios::beg);
|
||||
|
||||
std::vector<uint8_t> data;
|
||||
data.resize(size);
|
||||
stream.read((char *)(data.data()), size);
|
||||
if (stream.bad())
|
||||
{
|
||||
return {};
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
99
XenonUtils/image.cpp
Normal file
99
XenonUtils/image.cpp
Normal file
@@ -0,0 +1,99 @@
|
||||
#include "image.h"
|
||||
#include "elf.h"
|
||||
#include "xex.h"
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
|
||||
void Image::Map(const std::string_view& name, size_t base, uint32_t size, uint8_t flags, uint8_t* data)
|
||||
{
|
||||
sections.insert({ std::string(name), this->base + base,
|
||||
size, static_cast<SectionFlags>(flags), data });
|
||||
}
|
||||
|
||||
const void* Image::Find(size_t address) const
|
||||
{
|
||||
const auto section = std::prev(sections.upper_bound(address));
|
||||
return section->data + (address - section->base);
|
||||
}
|
||||
|
||||
const Section* Image::Find(const std::string_view& name) const
|
||||
{
|
||||
for (const auto& section : sections)
|
||||
{
|
||||
if (section.name == name)
|
||||
{
|
||||
return §ion;
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Image Image::ParseImage(const uint8_t* data, size_t size)
|
||||
{
|
||||
if (data[0] == ELFMAG0 && data[1] == ELFMAG1 && data[2] == ELFMAG2 && data[3] == ELFMAG3)
|
||||
{
|
||||
return ElfLoadImage(data, size);
|
||||
}
|
||||
else if (data[0] == 'X' && data[1] == 'E' && data[2] == 'X' && data[3] == '2')
|
||||
{
|
||||
return Xex2LoadImage(data);
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
Image ElfLoadImage(const uint8_t* data, size_t size)
|
||||
{
|
||||
const auto* header = (elf32_hdr*)data;
|
||||
assert(header->e_ident[EI_DATA] == 2);
|
||||
|
||||
Image image{};
|
||||
image.size = size;
|
||||
image.data = std::make_unique<uint8_t[]>(size);
|
||||
image.entry_point = ByteSwap(header->e_entry);
|
||||
memcpy(image.data.get(), data, size);
|
||||
|
||||
auto stringTableIndex = ByteSwap(header->e_shstrndx);
|
||||
|
||||
const auto numSections = ByteSwap(header->e_shnum);
|
||||
const auto numpSections = ByteSwap(header->e_phnum);
|
||||
|
||||
const auto* sections = (elf32_shdr*)(data + ByteSwap(header->e_shoff));
|
||||
const auto* psections = (elf32_phdr*)(data + ByteSwap(header->e_phoff));
|
||||
|
||||
for (size_t i = 0; i < numpSections; i++)
|
||||
{
|
||||
if (psections[i].p_type == ByteSwap((Elf32_Word)PT_LOAD))
|
||||
{
|
||||
image.base = ByteSwap(psections[i].p_vaddr);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
auto* stringTable = reinterpret_cast<const char*>(data + ByteSwap(sections[stringTableIndex].sh_offset));
|
||||
|
||||
for (size_t i = 0; i < numSections; i++)
|
||||
{
|
||||
const auto& section = sections[i];
|
||||
if (section.sh_type == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
uint8_t flags{};
|
||||
|
||||
if (section.sh_flags & ByteSwap(SHF_EXECINSTR))
|
||||
{
|
||||
flags |= SectionFlags_Code;
|
||||
}
|
||||
|
||||
auto* name = section.sh_name != 0 ? stringTable + ByteSwap(section.sh_name) : nullptr;
|
||||
const auto rva = ByteSwap(section.sh_addr) - image.base;
|
||||
const auto size = ByteSwap(section.sh_size);
|
||||
|
||||
image.Map(name, rva, size, flags, image.data.get() + ByteSwap(section.sh_offset));
|
||||
}
|
||||
|
||||
return image;
|
||||
}
|
50
XenonUtils/image.h
Normal file
50
XenonUtils/image.h
Normal file
@@ -0,0 +1,50 @@
|
||||
#pragma once
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <set>
|
||||
#include <expected>
|
||||
#include <section.h>
|
||||
#include "symbol_table.h"
|
||||
|
||||
struct Image
|
||||
{
|
||||
std::unique_ptr<uint8_t[]> data{};
|
||||
size_t base{};
|
||||
uint32_t size{};
|
||||
|
||||
size_t entry_point{};
|
||||
std::set<Section, SectionComparer> sections{};
|
||||
SymbolTable symbols{};
|
||||
|
||||
/**
|
||||
* \brief Map data to image by RVA
|
||||
* \param name Name of section
|
||||
* \param base Section RVA
|
||||
* \param size Section Size
|
||||
* \param flags Section Flags, enum SectionFlags
|
||||
* \param data Section data
|
||||
*/
|
||||
void Map(const std::string_view& name, size_t base, uint32_t size, uint8_t flags, uint8_t* data);
|
||||
|
||||
/**
|
||||
* \param address Virtual Address
|
||||
* \return Pointer to image owned data
|
||||
*/
|
||||
const void* Find(size_t address) const;
|
||||
|
||||
/**
|
||||
* \param name Name of section
|
||||
* \return Section
|
||||
*/
|
||||
const Section* Find(const std::string_view& name) const;
|
||||
|
||||
/**
|
||||
* \brief Parse given data to an image, reallocates with ownership
|
||||
* \param data Pointer to data
|
||||
* \param size Size of data
|
||||
* \return Parsed image
|
||||
*/
|
||||
static Image ParseImage(const uint8_t* data, size_t size);
|
||||
};
|
||||
|
||||
Image ElfLoadImage(const uint8_t* data, size_t size);
|
660
XenonUtils/ppc_context.h
Normal file
660
XenonUtils/ppc_context.h
Normal file
@@ -0,0 +1,660 @@
|
||||
#ifndef PPC_CONTEXT_H_INCLUDED
|
||||
#define PPC_CONTEXT_H_INCLUDED
|
||||
|
||||
#ifndef PPC_CONFIG_H_INCLUDED
|
||||
#error "ppc_config.h must be included before ppc_context.h"
|
||||
#endif
|
||||
|
||||
#include <climits>
|
||||
#include <cmath>
|
||||
#include <csetjmp>
|
||||
#include <cstdint>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
|
||||
#include <x86intrin.h>
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <intrin.h>
|
||||
#else
|
||||
#include <xmmintrin.h>
|
||||
#include <smmintrin.h>
|
||||
#endif
|
||||
|
||||
#define PPC_JOIN(x, y) x##y
|
||||
#define PPC_XSTRINGIFY(x) #x
|
||||
#define PPC_STRINGIFY(x) PPC_XSTRINGIFY(x)
|
||||
#define PPC_FUNC(x) void x(PPCContext& __restrict ctx, uint8_t* base)
|
||||
#define PPC_FUNC_IMPL(x) extern "C" PPC_FUNC(x)
|
||||
#define PPC_EXTERN_FUNC(x) extern PPC_FUNC(x)
|
||||
#define PPC_WEAK_FUNC(x) __attribute__((weak,noinline)) PPC_FUNC(x)
|
||||
|
||||
#define PPC_FUNC_PROLOGUE() __builtin_assume(((size_t)base & 0xFFFFFFFF) == 0)
|
||||
|
||||
#ifndef PPC_LOAD_U8
|
||||
#define PPC_LOAD_U8(x) *(volatile uint8_t*)(base + (x))
|
||||
#endif
|
||||
|
||||
#ifndef PPC_LOAD_U16
|
||||
#define PPC_LOAD_U16(x) __builtin_bswap16(*(volatile uint16_t*)(base + (x)))
|
||||
#endif
|
||||
|
||||
#ifndef PPC_LOAD_U32
|
||||
#define PPC_LOAD_U32(x) __builtin_bswap32(*(volatile uint32_t*)(base + (x)))
|
||||
#endif
|
||||
|
||||
#ifndef PPC_LOAD_U64
|
||||
#define PPC_LOAD_U64(x) __builtin_bswap64(*(volatile uint64_t*)(base + (x)))
|
||||
#endif
|
||||
|
||||
// TODO: Implement.
|
||||
// These are currently unused. However, MMIO loads could possibly be handled statically with some profiling and a fallback.
|
||||
// The fallback would be a runtime exception handler which will intercept reads from MMIO regions
|
||||
// and log the PC for compiling to static code later.
|
||||
#ifndef PPC_MM_LOAD_U8
|
||||
#define PPC_MM_LOAD_U8(x) PPC_LOAD_U8 (x)
|
||||
#endif
|
||||
|
||||
#ifndef PPC_MM_LOAD_U16
|
||||
#define PPC_MM_LOAD_U16(x) PPC_LOAD_U16(x)
|
||||
#endif
|
||||
|
||||
#ifndef PPC_MM_LOAD_U32
|
||||
#define PPC_MM_LOAD_U32(x) PPC_LOAD_U32(x)
|
||||
#endif
|
||||
|
||||
#ifndef PPC_MM_LOAD_U64
|
||||
#define PPC_MM_LOAD_U64(x) PPC_LOAD_U64(x)
|
||||
#endif
|
||||
|
||||
#ifndef PPC_STORE_U8
|
||||
#define PPC_STORE_U8(x, y) *(volatile uint8_t*)(base + (x)) = (y)
|
||||
#endif
|
||||
|
||||
#ifndef PPC_STORE_U16
|
||||
#define PPC_STORE_U16(x, y) *(volatile uint16_t*)(base + (x)) = __builtin_bswap16(y)
|
||||
#endif
|
||||
|
||||
#ifndef PPC_STORE_U32
|
||||
#define PPC_STORE_U32(x, y) *(volatile uint32_t*)(base + (x)) = __builtin_bswap32(y)
|
||||
#endif
|
||||
|
||||
#ifndef PPC_STORE_U64
|
||||
#define PPC_STORE_U64(x, y) *(volatile uint64_t*)(base + (x)) = __builtin_bswap64(y)
|
||||
#endif
|
||||
|
||||
// MMIO Store handling is completely reliant on being preeceded by eieio.
|
||||
// TODO: Verify if that's always the case.
|
||||
#ifndef PPC_MM_STORE_U8
|
||||
#define PPC_MM_STORE_U8(x, y) PPC_STORE_U8 (x, y)
|
||||
#endif
|
||||
|
||||
#ifndef PPC_MM_STORE_U16
|
||||
#define PPC_MM_STORE_U16(x, y) PPC_STORE_U16(x, y)
|
||||
#endif
|
||||
|
||||
#ifndef PPC_MM_STORE_U32
|
||||
#define PPC_MM_STORE_U32(x, y) PPC_STORE_U32(x, y)
|
||||
#endif
|
||||
|
||||
#ifndef PPC_MM_STORE_U64
|
||||
#define PPC_MM_STORE_U64(x, y) PPC_STORE_U64(x, y)
|
||||
#endif
|
||||
|
||||
#ifndef PPC_CALL_FUNC
|
||||
#define PPC_CALL_FUNC(x) x(ctx, base)
|
||||
#endif
|
||||
|
||||
#define PPC_MEMORY_SIZE 0x100000000ull
|
||||
|
||||
#define PPC_LOOKUP_FUNC(x, y) *(PPCFunc**)(x + PPC_IMAGE_BASE + PPC_IMAGE_SIZE + (uint64_t(uint32_t(y) - PPC_CODE_BASE) * 2))
|
||||
|
||||
#ifndef PPC_CALL_INDIRECT_FUNC
|
||||
#define PPC_CALL_INDIRECT_FUNC(x) (PPC_LOOKUP_FUNC(base, x))(ctx, base)
|
||||
#endif
|
||||
|
||||
typedef void PPCFunc(struct PPCContext& __restrict__ ctx, uint8_t* base);
|
||||
|
||||
struct PPCFuncMapping
|
||||
{
|
||||
size_t guest;
|
||||
PPCFunc* host;
|
||||
};
|
||||
|
||||
extern PPCFuncMapping PPCFuncMappings[];
|
||||
|
||||
struct PPCRegister
|
||||
{
|
||||
union
|
||||
{
|
||||
int8_t s8;
|
||||
uint8_t u8;
|
||||
int16_t s16;
|
||||
uint16_t u16;
|
||||
int32_t s32;
|
||||
uint32_t u32;
|
||||
int64_t s64;
|
||||
uint64_t u64;
|
||||
float f32;
|
||||
double f64;
|
||||
};
|
||||
};
|
||||
|
||||
struct PPCXERRegister
|
||||
{
|
||||
uint8_t so;
|
||||
uint8_t ov;
|
||||
uint8_t ca;
|
||||
};
|
||||
|
||||
struct PPCCRRegister
|
||||
{
|
||||
uint8_t lt;
|
||||
uint8_t gt;
|
||||
uint8_t eq;
|
||||
union
|
||||
{
|
||||
uint8_t so;
|
||||
uint8_t un;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
inline void compare(T left, T right, const PPCXERRegister& xer) noexcept
|
||||
{
|
||||
lt = left < right;
|
||||
gt = left > right;
|
||||
eq = left == right;
|
||||
so = xer.so;
|
||||
}
|
||||
|
||||
inline void compare(double left, double right) noexcept
|
||||
{
|
||||
un = __builtin_isnan(left) || __builtin_isnan(right);
|
||||
lt = !un && (left < right);
|
||||
gt = !un && (left > right);
|
||||
eq = !un && (left == right);
|
||||
}
|
||||
|
||||
inline void setFromMask(__m128 mask, int imm) noexcept
|
||||
{
|
||||
int m = _mm_movemask_ps(mask);
|
||||
lt = m == imm; // all equal
|
||||
gt = 0;
|
||||
eq = m == 0; // none equal
|
||||
so = 0;
|
||||
}
|
||||
|
||||
inline void setFromMask(__m128i mask, int imm) noexcept
|
||||
{
|
||||
int m = _mm_movemask_epi8(mask);
|
||||
lt = m == imm; // all equal
|
||||
gt = 0;
|
||||
eq = m == 0; // none equal
|
||||
so = 0;
|
||||
}
|
||||
};
|
||||
|
||||
struct alignas(0x10) PPCVRegister
|
||||
{
|
||||
union
|
||||
{
|
||||
int8_t s8[16];
|
||||
uint8_t u8[16];
|
||||
int16_t s16[8];
|
||||
uint16_t u16[8];
|
||||
int32_t s32[4];
|
||||
uint32_t u32[4];
|
||||
int64_t s64[2];
|
||||
uint64_t u64[2];
|
||||
float f32[4];
|
||||
double f64[2];
|
||||
};
|
||||
};
|
||||
|
||||
#define PPC_ROUND_NEAREST 0x00
|
||||
#define PPC_ROUND_TOWARD_ZERO 0x01
|
||||
#define PPC_ROUND_UP 0x02
|
||||
#define PPC_ROUND_DOWN 0x03
|
||||
#define PPC_ROUND_MASK 0x03
|
||||
|
||||
struct PPCFPSCRRegister
|
||||
{
|
||||
uint32_t csr;
|
||||
|
||||
static constexpr size_t GuestToHost[] = { _MM_ROUND_NEAREST, _MM_ROUND_TOWARD_ZERO, _MM_ROUND_UP, _MM_ROUND_DOWN };
|
||||
static constexpr size_t HostToGuest[] = { PPC_ROUND_NEAREST, PPC_ROUND_DOWN, PPC_ROUND_UP, PPC_ROUND_TOWARD_ZERO };
|
||||
|
||||
inline uint32_t loadFromHost() noexcept
|
||||
{
|
||||
csr = _mm_getcsr();
|
||||
return HostToGuest[(csr & _MM_ROUND_MASK) >> 13];
|
||||
}
|
||||
|
||||
inline void storeFromGuest(uint32_t value) noexcept
|
||||
{
|
||||
csr &= ~_MM_ROUND_MASK;
|
||||
csr |= GuestToHost[value & PPC_ROUND_MASK];
|
||||
_mm_setcsr(csr);
|
||||
}
|
||||
|
||||
static constexpr size_t FlushMask = _MM_FLUSH_ZERO_MASK | _MM_DENORMALS_ZERO_MASK;
|
||||
|
||||
inline void enableFlushModeUnconditional() noexcept
|
||||
{
|
||||
csr |= FlushMask;
|
||||
_mm_setcsr(csr);
|
||||
}
|
||||
|
||||
inline void disableFlushModeUnconditional() noexcept
|
||||
{
|
||||
csr &= ~FlushMask;
|
||||
_mm_setcsr(csr);
|
||||
}
|
||||
|
||||
inline void enableFlushMode() noexcept
|
||||
{
|
||||
if ((csr & FlushMask) != FlushMask) [[unlikely]]
|
||||
{
|
||||
csr |= FlushMask;
|
||||
_mm_setcsr(csr);
|
||||
}
|
||||
}
|
||||
|
||||
inline void disableFlushMode() noexcept
|
||||
{
|
||||
if ((csr & FlushMask) != 0) [[unlikely]]
|
||||
{
|
||||
csr &= ~FlushMask;
|
||||
_mm_setcsr(csr);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
struct PPCContext
|
||||
{
|
||||
PPCRegister r3;
|
||||
#ifndef PPC_CONFIG_NON_ARGUMENT_AS_LOCAL
|
||||
PPCRegister r0;
|
||||
#endif
|
||||
PPCRegister r1;
|
||||
#ifndef PPC_CONFIG_NON_ARGUMENT_AS_LOCAL
|
||||
PPCRegister r2;
|
||||
#endif
|
||||
PPCRegister r4;
|
||||
PPCRegister r5;
|
||||
PPCRegister r6;
|
||||
PPCRegister r7;
|
||||
PPCRegister r8;
|
||||
PPCRegister r9;
|
||||
PPCRegister r10;
|
||||
#ifndef PPC_CONFIG_NON_ARGUMENT_AS_LOCAL
|
||||
PPCRegister r11;
|
||||
PPCRegister r12;
|
||||
#endif
|
||||
PPCRegister r13;
|
||||
#ifndef PPC_CONFIG_NON_VOLATILE_AS_LOCAL
|
||||
PPCRegister r14;
|
||||
PPCRegister r15;
|
||||
PPCRegister r16;
|
||||
PPCRegister r17;
|
||||
PPCRegister r18;
|
||||
PPCRegister r19;
|
||||
PPCRegister r20;
|
||||
PPCRegister r21;
|
||||
PPCRegister r22;
|
||||
PPCRegister r23;
|
||||
PPCRegister r24;
|
||||
PPCRegister r25;
|
||||
PPCRegister r26;
|
||||
PPCRegister r27;
|
||||
PPCRegister r28;
|
||||
PPCRegister r29;
|
||||
PPCRegister r30;
|
||||
PPCRegister r31;
|
||||
#endif
|
||||
|
||||
#ifndef PPC_CONFIG_SKIP_LR
|
||||
uint64_t lr;
|
||||
#endif
|
||||
#ifndef PPC_CONFIG_CTR_AS_LOCAL
|
||||
PPCRegister ctr;
|
||||
#endif
|
||||
#ifndef PPC_CONFIG_XER_AS_LOCAL
|
||||
PPCXERRegister xer;
|
||||
#endif
|
||||
#ifndef PPC_CONFIG_RESERVED_AS_LOCAL
|
||||
PPCRegister reserved;
|
||||
#endif
|
||||
#ifndef PPC_CONFIG_SKIP_MSR
|
||||
uint32_t msr = 0x200A000;
|
||||
#endif
|
||||
#ifndef PPC_CONFIG_CR_AS_LOCAL
|
||||
PPCCRRegister cr0;
|
||||
PPCCRRegister cr1;
|
||||
PPCCRRegister cr2;
|
||||
PPCCRRegister cr3;
|
||||
PPCCRRegister cr4;
|
||||
PPCCRRegister cr5;
|
||||
PPCCRRegister cr6;
|
||||
PPCCRRegister cr7;
|
||||
#endif
|
||||
PPCFPSCRRegister fpscr;
|
||||
|
||||
#ifndef PPC_CONFIG_NON_ARGUMENT_AS_LOCAL
|
||||
PPCRegister f0;
|
||||
#endif
|
||||
PPCRegister f1;
|
||||
PPCRegister f2;
|
||||
PPCRegister f3;
|
||||
PPCRegister f4;
|
||||
PPCRegister f5;
|
||||
PPCRegister f6;
|
||||
PPCRegister f7;
|
||||
PPCRegister f8;
|
||||
PPCRegister f9;
|
||||
PPCRegister f10;
|
||||
PPCRegister f11;
|
||||
PPCRegister f12;
|
||||
PPCRegister f13;
|
||||
#ifndef PPC_CONFIG_NON_VOLATILE_AS_LOCAL
|
||||
PPCRegister f14;
|
||||
PPCRegister f15;
|
||||
PPCRegister f16;
|
||||
PPCRegister f17;
|
||||
PPCRegister f18;
|
||||
PPCRegister f19;
|
||||
PPCRegister f20;
|
||||
PPCRegister f21;
|
||||
PPCRegister f22;
|
||||
PPCRegister f23;
|
||||
PPCRegister f24;
|
||||
PPCRegister f25;
|
||||
PPCRegister f26;
|
||||
PPCRegister f27;
|
||||
PPCRegister f28;
|
||||
PPCRegister f29;
|
||||
PPCRegister f30;
|
||||
PPCRegister f31;
|
||||
#endif
|
||||
|
||||
PPCVRegister v0;
|
||||
PPCVRegister v1;
|
||||
PPCVRegister v2;
|
||||
PPCVRegister v3;
|
||||
PPCVRegister v4;
|
||||
PPCVRegister v5;
|
||||
PPCVRegister v6;
|
||||
PPCVRegister v7;
|
||||
PPCVRegister v8;
|
||||
PPCVRegister v9;
|
||||
PPCVRegister v10;
|
||||
PPCVRegister v11;
|
||||
PPCVRegister v12;
|
||||
PPCVRegister v13;
|
||||
#ifndef PPC_CONFIG_NON_VOLATILE_AS_LOCAL
|
||||
PPCVRegister v14;
|
||||
PPCVRegister v15;
|
||||
PPCVRegister v16;
|
||||
PPCVRegister v17;
|
||||
PPCVRegister v18;
|
||||
PPCVRegister v19;
|
||||
PPCVRegister v20;
|
||||
PPCVRegister v21;
|
||||
PPCVRegister v22;
|
||||
PPCVRegister v23;
|
||||
PPCVRegister v24;
|
||||
PPCVRegister v25;
|
||||
PPCVRegister v26;
|
||||
PPCVRegister v27;
|
||||
PPCVRegister v28;
|
||||
PPCVRegister v29;
|
||||
PPCVRegister v30;
|
||||
PPCVRegister v31;
|
||||
#endif
|
||||
#ifndef PPC_CONFIG_NON_ARGUMENT_AS_LOCAL
|
||||
PPCVRegister v32;
|
||||
PPCVRegister v33;
|
||||
PPCVRegister v34;
|
||||
PPCVRegister v35;
|
||||
PPCVRegister v36;
|
||||
PPCVRegister v37;
|
||||
PPCVRegister v38;
|
||||
PPCVRegister v39;
|
||||
PPCVRegister v40;
|
||||
PPCVRegister v41;
|
||||
PPCVRegister v42;
|
||||
PPCVRegister v43;
|
||||
PPCVRegister v44;
|
||||
PPCVRegister v45;
|
||||
PPCVRegister v46;
|
||||
PPCVRegister v47;
|
||||
PPCVRegister v48;
|
||||
PPCVRegister v49;
|
||||
PPCVRegister v50;
|
||||
PPCVRegister v51;
|
||||
PPCVRegister v52;
|
||||
PPCVRegister v53;
|
||||
PPCVRegister v54;
|
||||
PPCVRegister v55;
|
||||
PPCVRegister v56;
|
||||
PPCVRegister v57;
|
||||
PPCVRegister v58;
|
||||
PPCVRegister v59;
|
||||
PPCVRegister v60;
|
||||
PPCVRegister v61;
|
||||
PPCVRegister v62;
|
||||
PPCVRegister v63;
|
||||
#endif
|
||||
#ifndef PPC_CONFIG_NON_VOLATILE_AS_LOCAL
|
||||
PPCVRegister v64;
|
||||
PPCVRegister v65;
|
||||
PPCVRegister v66;
|
||||
PPCVRegister v67;
|
||||
PPCVRegister v68;
|
||||
PPCVRegister v69;
|
||||
PPCVRegister v70;
|
||||
PPCVRegister v71;
|
||||
PPCVRegister v72;
|
||||
PPCVRegister v73;
|
||||
PPCVRegister v74;
|
||||
PPCVRegister v75;
|
||||
PPCVRegister v76;
|
||||
PPCVRegister v77;
|
||||
PPCVRegister v78;
|
||||
PPCVRegister v79;
|
||||
PPCVRegister v80;
|
||||
PPCVRegister v81;
|
||||
PPCVRegister v82;
|
||||
PPCVRegister v83;
|
||||
PPCVRegister v84;
|
||||
PPCVRegister v85;
|
||||
PPCVRegister v86;
|
||||
PPCVRegister v87;
|
||||
PPCVRegister v88;
|
||||
PPCVRegister v89;
|
||||
PPCVRegister v90;
|
||||
PPCVRegister v91;
|
||||
PPCVRegister v92;
|
||||
PPCVRegister v93;
|
||||
PPCVRegister v94;
|
||||
PPCVRegister v95;
|
||||
PPCVRegister v96;
|
||||
PPCVRegister v97;
|
||||
PPCVRegister v98;
|
||||
PPCVRegister v99;
|
||||
PPCVRegister v100;
|
||||
PPCVRegister v101;
|
||||
PPCVRegister v102;
|
||||
PPCVRegister v103;
|
||||
PPCVRegister v104;
|
||||
PPCVRegister v105;
|
||||
PPCVRegister v106;
|
||||
PPCVRegister v107;
|
||||
PPCVRegister v108;
|
||||
PPCVRegister v109;
|
||||
PPCVRegister v110;
|
||||
PPCVRegister v111;
|
||||
PPCVRegister v112;
|
||||
PPCVRegister v113;
|
||||
PPCVRegister v114;
|
||||
PPCVRegister v115;
|
||||
PPCVRegister v116;
|
||||
PPCVRegister v117;
|
||||
PPCVRegister v118;
|
||||
PPCVRegister v119;
|
||||
PPCVRegister v120;
|
||||
PPCVRegister v121;
|
||||
PPCVRegister v122;
|
||||
PPCVRegister v123;
|
||||
PPCVRegister v124;
|
||||
PPCVRegister v125;
|
||||
PPCVRegister v126;
|
||||
PPCVRegister v127;
|
||||
#endif
|
||||
};
|
||||
|
||||
inline uint8_t VectorMaskL[] =
|
||||
{
|
||||
0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00,
|
||||
0xFF, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01,
|
||||
0xFF, 0xFF, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02,
|
||||
0xFF, 0xFF, 0xFF, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x0E, 0x0D, 0x0C,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x0E, 0x0D,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x0E,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F,
|
||||
};
|
||||
|
||||
inline uint8_t VectorMaskR[] =
|
||||
{
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0x02, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0x03, 0x02, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0x04, 0x03, 0x02, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0xFF, 0xFF, 0xFF,
|
||||
0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0xFF, 0xFF,
|
||||
0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0xFF,
|
||||
};
|
||||
|
||||
inline uint8_t VectorShiftTableL[] =
|
||||
{
|
||||
0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00,
|
||||
0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01,
|
||||
0x11, 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02,
|
||||
0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03,
|
||||
0x13, 0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04,
|
||||
0x14, 0x13, 0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05,
|
||||
0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06,
|
||||
0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07,
|
||||
0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08,
|
||||
0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09,
|
||||
0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A,
|
||||
0x1A, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B,
|
||||
0x1B, 0x1A, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D, 0x0C,
|
||||
0x1C, 0x1B, 0x1A, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D,
|
||||
0x1D, 0x1C, 0x1B, 0x1A, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0F, 0x0E,
|
||||
0x1E, 0x1D, 0x1C, 0x1B, 0x1A, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0F,
|
||||
};
|
||||
|
||||
inline uint8_t VectorShiftTableR[] =
|
||||
{
|
||||
0x1F, 0x1E, 0x1D, 0x1C, 0x1B, 0x1A, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10,
|
||||
0x1E, 0x1D, 0x1C, 0x1B, 0x1A, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0F,
|
||||
0x1D, 0x1C, 0x1B, 0x1A, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0F, 0x0E,
|
||||
0x1C, 0x1B, 0x1A, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D,
|
||||
0x1B, 0x1A, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D, 0x0C,
|
||||
0x1A, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B,
|
||||
0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A,
|
||||
0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09,
|
||||
0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08,
|
||||
0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07,
|
||||
0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06,
|
||||
0x14, 0x13, 0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05,
|
||||
0x13, 0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04,
|
||||
0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03,
|
||||
0x11, 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02,
|
||||
0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01,
|
||||
};
|
||||
|
||||
inline __m128i _mm_adds_epu32(__m128i a, __m128i b)
|
||||
{
|
||||
return _mm_add_epi32(a, _mm_min_epu32(_mm_xor_si128(a, _mm_cmpeq_epi32(a, a)), b));
|
||||
}
|
||||
|
||||
inline __m128i _mm_avg_epi8(__m128i a, __m128i b)
|
||||
{
|
||||
__m128i c = _mm_set1_epi8(char(128));
|
||||
return _mm_xor_si128(c, _mm_avg_epu8(_mm_xor_si128(c, a), _mm_xor_si128(c, b)));
|
||||
}
|
||||
|
||||
inline __m128i _mm_avg_epi16(__m128i a, __m128i b)
|
||||
{
|
||||
__m128i c = _mm_set1_epi16(short(32768));
|
||||
return _mm_xor_si128(c, _mm_avg_epu16(_mm_xor_si128(c, a), _mm_xor_si128(c, b)));
|
||||
}
|
||||
|
||||
inline __m128 _mm_cvtepu32_ps_(__m128i src1)
|
||||
{
|
||||
__m128i xmm1 = _mm_add_epi32(src1, _mm_set1_epi32(127));
|
||||
__m128i xmm0 = _mm_slli_epi32(src1, 31 - 8);
|
||||
xmm0 = _mm_srli_epi32(xmm0, 31);
|
||||
xmm0 = _mm_add_epi32(xmm0, xmm1);
|
||||
xmm0 = _mm_srai_epi32(xmm0, 8);
|
||||
xmm0 = _mm_add_epi32(xmm0, _mm_set1_epi32(0x4F800000));
|
||||
__m128 xmm2 = _mm_cvtepi32_ps(src1);
|
||||
return _mm_blendv_ps(xmm2, _mm_castsi128_ps(xmm0), _mm_castsi128_ps(src1));
|
||||
}
|
||||
|
||||
inline __m128i _mm_perm_epi8_(__m128i a, __m128i b, __m128i c)
|
||||
{
|
||||
__m128i d = _mm_set1_epi8(0xF);
|
||||
__m128i e = _mm_sub_epi8(d, _mm_and_si128(c, d));
|
||||
return _mm_blendv_epi8(_mm_shuffle_epi8(a, e), _mm_shuffle_epi8(b, e), _mm_slli_epi32(c, 3));
|
||||
}
|
||||
|
||||
inline __m128i _mm_cmpgt_epu8(__m128i a, __m128i b)
|
||||
{
|
||||
__m128i c = _mm_set1_epi8(char(128));
|
||||
return _mm_cmpgt_epi8(_mm_xor_si128(a, c), _mm_xor_si128(b, c));
|
||||
}
|
||||
|
||||
inline __m128i _mm_cmpgt_epu16(__m128i a, __m128i b)
|
||||
{
|
||||
__m128i c = _mm_set1_epi16(short(32768));
|
||||
return _mm_cmpgt_epi16(_mm_xor_si128(a, c), _mm_xor_si128(b, c));
|
||||
}
|
||||
|
||||
inline __m128i _mm_vctsxs(__m128 src1)
|
||||
{
|
||||
__m128 xmm2 = _mm_cmpunord_ps(src1, src1);
|
||||
__m128i xmm0 = _mm_cvttps_epi32(src1);
|
||||
__m128i xmm1 = _mm_cmpeq_epi32(xmm0, _mm_set1_epi32(INT_MIN));
|
||||
xmm1 = _mm_andnot_si128(_mm_castps_si128(src1), xmm1);
|
||||
__m128 dest = _mm_blendv_ps(_mm_castsi128_ps(xmm0), _mm_castsi128_ps(_mm_set1_epi32(INT_MAX)), _mm_castsi128_ps(xmm1));
|
||||
return _mm_andnot_si128(_mm_castps_si128(xmm2), _mm_castps_si128(dest));
|
||||
}
|
||||
|
||||
inline __m128i _mm_vsr(__m128i a, __m128i b)
|
||||
{
|
||||
b = _mm_srli_epi64(_mm_slli_epi64(b, 61), 61);
|
||||
return _mm_castps_si128(_mm_insert_ps(_mm_castsi128_ps(_mm_srl_epi64(a, b)), _mm_castsi128_ps(_mm_srl_epi64(_mm_srli_si128(a, 4), b)), 0x10));
|
||||
}
|
||||
|
||||
#endif
|
54
XenonUtils/section.h
Normal file
54
XenonUtils/section.h
Normal file
@@ -0,0 +1,54 @@
|
||||
#pragma once
|
||||
#include <string>
|
||||
#include <cstdint>
|
||||
|
||||
enum SectionFlags : uint8_t
|
||||
{
|
||||
SectionFlags_None = 0,
|
||||
SectionFlags_Data = 1,
|
||||
SectionFlags_Code = 2
|
||||
};
|
||||
|
||||
struct Section
|
||||
{
|
||||
std::string name{};
|
||||
size_t base{};
|
||||
uint32_t size{};
|
||||
SectionFlags flags{};
|
||||
uint8_t* data{};
|
||||
|
||||
bool operator<(size_t address) const
|
||||
{
|
||||
return address < base;
|
||||
}
|
||||
|
||||
bool operator>(size_t address) const
|
||||
{
|
||||
return address >= (base + size);
|
||||
}
|
||||
|
||||
bool operator==(size_t address) const
|
||||
{
|
||||
return address >= base && address < base + size;
|
||||
}
|
||||
};
|
||||
|
||||
struct SectionComparer
|
||||
{
|
||||
using is_transparent = void;
|
||||
|
||||
bool operator()(const Section& lhs, size_t rhs) const
|
||||
{
|
||||
return lhs.base < rhs;
|
||||
}
|
||||
|
||||
bool operator()(size_t lhs, const Section& rhs) const
|
||||
{
|
||||
return lhs < rhs.base;
|
||||
}
|
||||
|
||||
bool operator()(const Section& lhs, const Section& rhs) const
|
||||
{
|
||||
return lhs.base < rhs.base;
|
||||
}
|
||||
};
|
48
XenonUtils/symbol.h
Normal file
48
XenonUtils/symbol.h
Normal file
@@ -0,0 +1,48 @@
|
||||
#pragma once
|
||||
#include <string>
|
||||
#include <cstdint>
|
||||
|
||||
enum SymbolType
|
||||
{
|
||||
Symbol_None,
|
||||
Symbol_Section,
|
||||
Symbol_Function,
|
||||
Symbol_Comment,
|
||||
};
|
||||
|
||||
struct Symbol
|
||||
{
|
||||
mutable std::string name{};
|
||||
size_t address{};
|
||||
size_t size{};
|
||||
mutable SymbolType type{};
|
||||
|
||||
Symbol()
|
||||
{
|
||||
}
|
||||
|
||||
Symbol(std::string name, size_t address, size_t size, SymbolType type)
|
||||
: name(std::move(name)), address(address), size(size), type(type)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
struct SymbolComparer
|
||||
{
|
||||
using is_transparent = void;
|
||||
|
||||
bool operator()(const Symbol& lhs, size_t rhs) const
|
||||
{
|
||||
return lhs.address < rhs;
|
||||
}
|
||||
|
||||
bool operator()(size_t lhs, const Symbol& rhs) const
|
||||
{
|
||||
return lhs < rhs.address;
|
||||
}
|
||||
|
||||
bool operator()(const Symbol& lhs, const Symbol& rhs) const
|
||||
{
|
||||
return lhs.address < rhs.address;
|
||||
}
|
||||
};
|
63
XenonUtils/symbol_table.h
Normal file
63
XenonUtils/symbol_table.h
Normal file
@@ -0,0 +1,63 @@
|
||||
#pragma once
|
||||
#include "symbol.h"
|
||||
#include <set>
|
||||
|
||||
class SymbolTable : public std::multiset<Symbol, SymbolComparer>
|
||||
{
|
||||
public:
|
||||
const_iterator find(size_t address) const
|
||||
{
|
||||
auto [beginIt, endIt] = equal_range(address);
|
||||
if (beginIt == endIt)
|
||||
{
|
||||
return end();
|
||||
}
|
||||
|
||||
size_t closest{ address - beginIt->address };
|
||||
auto match = end();
|
||||
for (auto it = beginIt; it != endIt; ++it)
|
||||
{
|
||||
if (address < it->address || address >= it->address + it->size)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
const size_t distance = address - it->address;
|
||||
if (distance <= closest)
|
||||
{
|
||||
match = it;
|
||||
closest = distance;
|
||||
}
|
||||
}
|
||||
|
||||
return match;
|
||||
}
|
||||
|
||||
iterator find(size_t address)
|
||||
{
|
||||
auto [beginIt, endIt] = equal_range(address);
|
||||
if (beginIt == endIt)
|
||||
{
|
||||
return end();
|
||||
}
|
||||
|
||||
size_t closest{ address - beginIt->address };
|
||||
auto match = end();
|
||||
for (auto it = beginIt; it != endIt; ++it)
|
||||
{
|
||||
if (address < it->address || address >= it->address + it->size)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
const size_t distance = address - it->address;
|
||||
if (distance <= closest)
|
||||
{
|
||||
match = it;
|
||||
closest = distance;
|
||||
}
|
||||
}
|
||||
|
||||
return match;
|
||||
}
|
||||
};
|
409
XenonUtils/xbox.h
Normal file
409
XenonUtils/xbox.h
Normal file
@@ -0,0 +1,409 @@
|
||||
#pragma once
|
||||
#include <cstdint>
|
||||
#include <type_traits>
|
||||
#include <bit>
|
||||
#include <string>
|
||||
#include "byteswap.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
// real win32 handles will never use the upper bits unless something goes really wrong
|
||||
#define CHECK_GUEST_HANDLE(HANDLE) (((HANDLE) & 0x80000000) == 0x80000000)
|
||||
#define GUEST_HANDLE(HANDLE) ((HANDLE) | 0x80000000)
|
||||
#define HOST_HANDLE(HANDLE) ((HANDLE) & ~0x80000000)
|
||||
|
||||
// Return true to free the associated memory
|
||||
typedef bool(*TypeDestructor_t)(void*);
|
||||
|
||||
template<typename T>
|
||||
bool DestroyObject(void* obj)
|
||||
{
|
||||
static_cast<T*>(obj)->~T();
|
||||
return true;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
struct be
|
||||
{
|
||||
T value;
|
||||
|
||||
be() : value(0)
|
||||
{
|
||||
}
|
||||
|
||||
be(const T v)
|
||||
{
|
||||
set(v);
|
||||
}
|
||||
|
||||
static T byteswap(T value)
|
||||
{
|
||||
if constexpr (std::is_same_v<T, double>)
|
||||
{
|
||||
const uint64_t swapped = ByteSwap(*reinterpret_cast<uint64_t*>(&value));
|
||||
return *reinterpret_cast<const T*>(&swapped);
|
||||
}
|
||||
else if constexpr (std::is_same_v<T, float>)
|
||||
{
|
||||
const uint32_t swapped = ByteSwap(*reinterpret_cast<uint32_t*>(&value));
|
||||
return *reinterpret_cast<const T*>(&swapped);
|
||||
}
|
||||
else if constexpr (std::is_enum_v<T>)
|
||||
{
|
||||
const std::underlying_type_t<T> swapped = ByteSwap(*reinterpret_cast<std::underlying_type_t<T>*>(&value));
|
||||
return *reinterpret_cast<const T*>(&swapped);
|
||||
}
|
||||
else
|
||||
{
|
||||
return ByteSwap(value);
|
||||
}
|
||||
}
|
||||
|
||||
void set(const T v)
|
||||
{
|
||||
value = byteswap(v);
|
||||
}
|
||||
|
||||
T get() const
|
||||
{
|
||||
return byteswap(value);
|
||||
}
|
||||
|
||||
be& operator| (T value)
|
||||
{
|
||||
set(get() | value);
|
||||
return *this;
|
||||
}
|
||||
|
||||
be& operator& (T value)
|
||||
{
|
||||
set(get() & value);
|
||||
return *this;
|
||||
}
|
||||
|
||||
operator T() const
|
||||
{
|
||||
return get();
|
||||
}
|
||||
|
||||
be& operator=(T v)
|
||||
{
|
||||
set(v);
|
||||
return *this;
|
||||
}
|
||||
};
|
||||
|
||||
extern "C" void* MmGetHostAddress(uint32_t ptr);
|
||||
template<typename T>
|
||||
struct xpointer
|
||||
{
|
||||
be<uint32_t> ptr;
|
||||
|
||||
xpointer() : ptr(0)
|
||||
{
|
||||
}
|
||||
|
||||
xpointer(T* ptr) : ptr(reinterpret_cast<size_t>(ptr) - reinterpret_cast<size_t>(MmGetHostAddress(0)))
|
||||
{
|
||||
}
|
||||
|
||||
T* get() const
|
||||
{
|
||||
if (!ptr.value)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return reinterpret_cast<T*>(MmGetHostAddress(ptr));
|
||||
}
|
||||
|
||||
operator T* () const
|
||||
{
|
||||
return get();
|
||||
}
|
||||
|
||||
T* operator->() const
|
||||
{
|
||||
return get();
|
||||
}
|
||||
};
|
||||
|
||||
template<typename TGuest>
|
||||
struct HostObject
|
||||
{
|
||||
typedef TGuest guest_type;
|
||||
};
|
||||
|
||||
struct _XLIST_ENTRY;
|
||||
typedef _XLIST_ENTRY XLIST_ENTRY;
|
||||
typedef xpointer<XLIST_ENTRY> PXLIST_ENTRY;
|
||||
|
||||
typedef struct _IMAGE_CE_RUNTIME_FUNCTION
|
||||
{
|
||||
uint32_t BeginAddress;
|
||||
|
||||
union
|
||||
{
|
||||
uint32_t Data;
|
||||
struct
|
||||
{
|
||||
uint32_t PrologLength : 8;
|
||||
uint32_t FunctionLength : 22;
|
||||
uint32_t ThirtyTwoBit : 1;
|
||||
uint32_t ExceptionFlag : 1;
|
||||
};
|
||||
};
|
||||
} IMAGE_CE_RUNTIME_FUNCTION;
|
||||
|
||||
static_assert(sizeof(IMAGE_CE_RUNTIME_FUNCTION) == 8);
|
||||
|
||||
typedef struct _XLIST_ENTRY
|
||||
{
|
||||
be<uint32_t> Flink;
|
||||
be<uint32_t> Blink;
|
||||
} XLIST_ENTRY;
|
||||
|
||||
typedef struct _XDISPATCHER_HEADER
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint8_t Type;
|
||||
union
|
||||
{
|
||||
uint8_t Abandoned;
|
||||
uint8_t Absolute;
|
||||
uint8_t NpxIrql;
|
||||
uint8_t Signalling;
|
||||
};
|
||||
union
|
||||
{
|
||||
uint8_t Size;
|
||||
uint8_t Hand;
|
||||
};
|
||||
union
|
||||
{
|
||||
uint8_t Inserted;
|
||||
uint8_t DebugActive;
|
||||
uint8_t DpcActive;
|
||||
};
|
||||
};
|
||||
be<uint32_t> Lock;
|
||||
};
|
||||
|
||||
be<uint32_t> SignalState;
|
||||
XLIST_ENTRY WaitListHead;
|
||||
} XDISPATCHER_HEADER, * XPDISPATCHER_HEADER;
|
||||
|
||||
// These variables are never accessed in guest code, we can safely use them in little endian
|
||||
typedef struct _XRTL_CRITICAL_SECTION
|
||||
{
|
||||
XDISPATCHER_HEADER Header;
|
||||
int32_t LockCount;
|
||||
int32_t RecursionCount;
|
||||
uint32_t OwningThread;
|
||||
} XRTL_CRITICAL_SECTION;
|
||||
|
||||
typedef struct _XANSI_STRING {
|
||||
be<uint16_t> Length;
|
||||
be<uint16_t> MaximumLength;
|
||||
xpointer<char> Buffer;
|
||||
} XANSI_STRING;
|
||||
|
||||
typedef struct _XOBJECT_ATTRIBUTES
|
||||
{
|
||||
be<uint32_t> RootDirectory;
|
||||
xpointer<XANSI_STRING> Name;
|
||||
xpointer<void> Attributes;
|
||||
} XOBJECT_ATTRIBUTES;
|
||||
|
||||
typedef XDISPATCHER_HEADER XKEVENT;
|
||||
|
||||
typedef struct _XIO_STATUS_BLOCK
|
||||
{
|
||||
union {
|
||||
be<uint32_t> Status;
|
||||
be<uint32_t> Pointer;
|
||||
};
|
||||
be<uint32_t> Information;
|
||||
} XIO_STATUS_BLOCK;
|
||||
|
||||
typedef struct _XOVERLAPPED {
|
||||
be<uint32_t> Internal;
|
||||
be<uint32_t> InternalHigh;
|
||||
be<uint32_t> Offset;
|
||||
be<uint32_t> OffsetHigh;
|
||||
be<uint32_t> hEvent;
|
||||
} XOVERLAPPED;
|
||||
|
||||
// this name is so dumb
|
||||
typedef struct _XXOVERLAPPED {
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
be<uint32_t> Error;
|
||||
be<uint32_t> Length;
|
||||
};
|
||||
|
||||
struct
|
||||
{
|
||||
uint32_t InternalLow;
|
||||
uint32_t InternalHigh;
|
||||
};
|
||||
};
|
||||
uint32_t InternalContext;
|
||||
be<uint32_t> hEvent;
|
||||
be<uint32_t> pCompletionRoutine;
|
||||
be<uint32_t> dwCompletionContext;
|
||||
be<uint32_t> dwExtendedError;
|
||||
} XXOVERLAPPED, *PXXOVERLAPPED;
|
||||
|
||||
static_assert(sizeof(_XXOVERLAPPED) == 0x1C);
|
||||
|
||||
// https://learn.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-memorystatus
|
||||
typedef struct _XMEMORYSTATUS {
|
||||
be<uint32_t> dwLength;
|
||||
be<uint32_t> dwMemoryLoad;
|
||||
be<uint32_t> dwTotalPhys;
|
||||
be<uint32_t> dwAvailPhys;
|
||||
be<uint32_t> dwTotalPageFile;
|
||||
be<uint32_t> dwAvailPageFile;
|
||||
be<uint32_t> dwTotalVirtual;
|
||||
be<uint32_t> dwAvailVirtual;
|
||||
} XMEMORYSTATUS, * XLPMEMORYSTATUS;
|
||||
|
||||
typedef struct _XVIDEO_MODE
|
||||
{
|
||||
be<uint32_t> DisplayWidth;
|
||||
be<uint32_t> DisplayHeight;
|
||||
be<uint32_t> IsInterlaced;
|
||||
be<uint32_t> IsWidescreen;
|
||||
be<uint32_t> IsHighDefinition;
|
||||
be<uint32_t> RefreshRate;
|
||||
be<uint32_t> VideoStandard;
|
||||
be<uint32_t> Unknown4A;
|
||||
be<uint32_t> Unknown01;
|
||||
be<uint32_t> reserved[3];
|
||||
} XVIDEO_MODE;
|
||||
|
||||
typedef struct _XKSEMAPHORE
|
||||
{
|
||||
XDISPATCHER_HEADER Header;
|
||||
be<uint32_t> Limit;
|
||||
} XKSEMAPHORE;
|
||||
|
||||
typedef struct _XUSER_SIGNIN_INFO {
|
||||
be<uint64_t> xuid;
|
||||
be<uint32_t> dwField08;
|
||||
be<uint32_t> SigninState;
|
||||
be<uint32_t> dwField10;
|
||||
be<uint32_t> dwField14;
|
||||
char Name[16];
|
||||
} XUSER_SIGNIN_INFO;
|
||||
|
||||
typedef struct _XTIME_FIELDS
|
||||
{
|
||||
be<uint16_t> Year;
|
||||
be<uint16_t> Month;
|
||||
be<uint16_t> Day;
|
||||
be<uint16_t> Hour;
|
||||
be<uint16_t> Minute;
|
||||
be<uint16_t> Second;
|
||||
be<uint16_t> Milliseconds;
|
||||
be<uint16_t> Weekday;
|
||||
} XTIME_FIELDS, * PXTIME_FIELDS;
|
||||
|
||||
// Content types
|
||||
#define XCONTENTTYPE_SAVEDATA 1
|
||||
#define XCONTENTTYPE_DLC 2
|
||||
#define XCONTENTTYPE_RESERVED 3
|
||||
|
||||
#define XCONTENT_NEW 1
|
||||
#define XCONTENT_EXISTING 2
|
||||
|
||||
#define XCONTENT_MAX_DISPLAYNAME 128
|
||||
#define XCONTENT_MAX_FILENAME 42
|
||||
#define XCONTENTDEVICE_MAX_NAME 27
|
||||
|
||||
typedef struct _XCONTENT_DATA
|
||||
{
|
||||
be<uint32_t> DeviceID;
|
||||
be<uint32_t> dwContentType;
|
||||
be<uint16_t> szDisplayName[XCONTENT_MAX_DISPLAYNAME];
|
||||
char szFileName[XCONTENT_MAX_FILENAME];
|
||||
} XCONTENT_DATA, * PXCONTENT_DATA;
|
||||
|
||||
typedef struct _XHOSTCONTENT_DATA : _XCONTENT_DATA
|
||||
{
|
||||
// This is a host exclusive type so we don't care what goes on
|
||||
std::string szRoot{};
|
||||
} XHOSTCONTENT_DATA, *PXHOSTCONTENT_DATA;
|
||||
|
||||
|
||||
#define XCONTENTDEVICETYPE_HDD 1
|
||||
#define XCONTENTDEVICETYPE_MU 2
|
||||
|
||||
typedef struct _XDEVICE_DATA
|
||||
{
|
||||
be<uint32_t> DeviceID;
|
||||
be<uint32_t> DeviceType;
|
||||
be<uint64_t> ulDeviceBytes;
|
||||
be<uint64_t> ulDeviceFreeBytes;
|
||||
be<uint16_t> wszName[XCONTENTDEVICE_MAX_NAME];
|
||||
} XDEVICE_DATA, *PXDEVICE_DATA;
|
||||
|
||||
// Direct reflection of XInput structures
|
||||
|
||||
#define XAMINPUT_DEVTYPE_GAMEPAD 0x01
|
||||
#define XAMINPUT_DEVSUBTYPE_GAMEPAD 0x01
|
||||
|
||||
#define XAMINPUT_GAMEPAD_DPAD_UP 0x0001
|
||||
#define XAMINPUT_GAMEPAD_DPAD_DOWN 0x0002
|
||||
#define XAMINPUT_GAMEPAD_DPAD_LEFT 0x0004
|
||||
#define XAMINPUT_GAMEPAD_DPAD_RIGHT 0x0008
|
||||
#define XAMINPUT_GAMEPAD_START 0x0010
|
||||
#define XAMINPUT_GAMEPAD_BACK 0x0020
|
||||
#define XAMINPUT_GAMEPAD_LEFT_THUMB 0x0040
|
||||
#define XAMINPUT_GAMEPAD_RIGHT_THUMB 0x0080
|
||||
#define XAMINPUT_GAMEPAD_LEFT_SHOULDER 0x0100
|
||||
#define XAMINPUT_GAMEPAD_RIGHT_SHOULDER 0x0200
|
||||
#define XAMINPUT_GAMEPAD_A 0x1000
|
||||
#define XAMINPUT_GAMEPAD_B 0x2000
|
||||
#define XAMINPUT_GAMEPAD_X 0x4000
|
||||
#define XAMINPUT_GAMEPAD_Y 0x8000
|
||||
|
||||
typedef struct _XAMINPUT_GAMEPAD
|
||||
{
|
||||
uint16_t wButtons;
|
||||
uint8_t bLeftTrigger;
|
||||
uint8_t bRightTrigger;
|
||||
int16_t sThumbLX;
|
||||
int16_t sThumbLY;
|
||||
int16_t sThumbRX;
|
||||
int16_t sThumbRY;
|
||||
} XAMINPUT_GAMEPAD, *PXAMINPUT_GAMEPAD;
|
||||
|
||||
typedef struct _XAMINPUT_VIBRATION
|
||||
{
|
||||
uint16_t wLeftMotorSpeed;
|
||||
uint16_t wRightMotorSpeed;
|
||||
} XAMINPUT_VIBRATION, * PXAMINPUT_VIBRATION;
|
||||
|
||||
typedef struct _XAMINPUT_CAPABILITIES
|
||||
{
|
||||
uint8_t Type;
|
||||
uint8_t SubType;
|
||||
uint16_t Flags;
|
||||
XAMINPUT_GAMEPAD Gamepad;
|
||||
XAMINPUT_VIBRATION Vibration;
|
||||
} XAMINPUT_CAPABILITIES, * PXAMINPUT_CAPABILITIES;
|
||||
|
||||
typedef struct _XAMINPUT_STATE
|
||||
{
|
||||
uint32_t dwPacketNumber;
|
||||
XAMINPUT_GAMEPAD Gamepad;
|
||||
} XAMINPUT_STATE, * PXAMINPUT_STATE;
|
1749
XenonUtils/xbox/xam_table.inc
Normal file
1749
XenonUtils/xbox/xam_table.inc
Normal file
File diff suppressed because it is too large
Load Diff
936
XenonUtils/xbox/xboxkrnl_table.inc
Normal file
936
XenonUtils/xbox/xboxkrnl_table.inc
Normal file
@@ -0,0 +1,936 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* Xenia : Xbox 360 Emulator Research Project *
|
||||
******************************************************************************
|
||||
* Copyright 2021 Ben Vanik. All rights reserved. *
|
||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
// This is a partial file designed to be included by other files when
|
||||
// constructing various tables.
|
||||
|
||||
// clang-format off
|
||||
|
||||
XE_EXPORT(xboxkrnl, 0x00000001, DbgBreakPoint, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000002, DbgBreakPointWithStatus, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000003, DbgPrint, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000004, DbgPrompt, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000005, DumpGetRawDumpInfo, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000006, DumpWriteDump, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000007, ExAcquireReadWriteLockExclusive, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000008, ExAcquireReadWriteLockShared, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000009, ExAllocatePool, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000000A, ExAllocatePoolWithTag, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000000B, ExAllocatePoolTypeWithTag, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000000C, ExConsoleGameRegion, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x0000000D, ExCreateThread, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000000E, ExEventObjectType, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x0000000F, ExFreePool, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000010, ExGetXConfigSetting, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000011, ExInitializeReadWriteLock, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000012, ExMutantObjectType, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x00000013, ExQueryPoolBlockSize, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000014, ExRegisterThreadNotification, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000015, ExRegisterTitleTerminateNotification, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000016, ExReleaseReadWriteLock, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000017, ExSemaphoreObjectType, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x00000018, ExSetXConfigSetting, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000019, ExTerminateThread, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000001A, ExTerminateTitleProcess, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000001B, ExThreadObjectType, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x0000001C, ExTimerObjectType, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x0000001D, MmDoubleMapMemory, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000001E, MmUnmapMemory, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000001F, XeKeysGetConsoleCertificate, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000020, FscGetCacheElementCount, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000021, FscSetCacheElementCount, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000022, HalGetCurrentAVPack, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000023, HalGpioControl, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000024, HalOpenCloseODDTray, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000025, HalReadWritePCISpace, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000026, HalRegisterPowerDownNotification, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000027, HalRegisterSMCNotification, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000028, HalReturnToFirmware, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000029, HalSendSMCMessage, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000002A, HalSetAudioEnable, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000002B, InterlockedFlushSList, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000002C, InterlockedPopEntrySList, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000002D, InterlockedPushEntrySList, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000002E, IoAcquireDeviceObjectLock, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000002F, IoAllocateIrp, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000030, IoBuildAsynchronousFsdRequest, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000031, IoBuildDeviceIoControlRequest, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000032, IoBuildSynchronousFsdRequest, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000033, IoCallDriver, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000034, IoCheckShareAccess, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000035, IoCompleteRequest, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000036, IoCompletionObjectType, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x00000037, IoCreateDevice, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000038, IoCreateFile, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000039, IoDeleteDevice, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000003A, IoDeviceObjectType, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x0000003B, IoDismountVolume, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000003C, IoDismountVolumeByFileHandle, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000003D, IoDismountVolumeByName, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000003E, IoFileObjectType, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x0000003F, IoFreeIrp, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000040, IoInitializeIrp, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000041, IoInvalidDeviceRequest, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000042, ExSetBetaFeaturesEnabled, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000043, IoQueueThreadIrp, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000044, IoReleaseDeviceObjectLock, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000045, IoRemoveShareAccess, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000046, IoSetIoCompletion, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000047, IoSetShareAccess, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000048, IoStartNextPacket, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000049, IoStartNextPacketByKey, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000004A, IoStartPacket, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000004B, IoSynchronousDeviceIoControlRequest, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000004C, IoSynchronousFsdRequest, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000004D, KeAcquireSpinLockAtRaisedIrql, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000004E, KeAlertResumeThread, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000004F, KeAlertThread, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000050, KeBlowFuses, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000051, KeBoostPriorityThread, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000052, KeBugCheck, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000053, KeBugCheckEx, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000054, KeCancelTimer, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000055, KeConnectInterrupt, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000056, KeContextFromKframes, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000057, KeContextToKframes, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000058, KeCreateUserMode, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000059, KeDebugMonitorData, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x0000005A, KeDelayExecutionThread, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000005B, KeDeleteUserMode, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000005C, KeDisconnectInterrupt, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000005D, KeEnableFpuExceptions, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000005E, KeEnablePPUPerformanceMonitor, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000005F, KeEnterCriticalRegion, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000060, KeEnterUserMode, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000061, KeFlushCacheRange, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000062, KeFlushCurrentEntireTb, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000063, KeFlushEntireTb, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000064, KeFlushUserModeCurrentTb, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000065, KeFlushUserModeTb, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000066, KeGetCurrentProcessType, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000067, KeGetPMWRegister, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000068, KeGetPRVRegister, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000069, KeGetSocRegister, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000006A, KeGetSpecialPurposeRegister, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000006B, KeLockL2, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000006C, KeUnlockL2, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000006D, KeInitializeApc, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000006E, KeInitializeDeviceQueue, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000006F, KeInitializeDpc, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000070, KeInitializeEvent, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000071, KeInitializeInterrupt, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000072, KeInitializeMutant, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000073, KeInitializeQueue, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000074, KeInitializeSemaphore, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000075, KeInitializeTimerEx, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000076, KeInsertByKeyDeviceQueue, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000077, KeInsertDeviceQueue, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000078, KeInsertHeadQueue, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000079, KeInsertQueue, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000007A, KeInsertQueueApc, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000007B, KeInsertQueueDpc, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000007C, KeIpiGenericCall, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000007D, KeLeaveCriticalRegion, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000007E, KeLeaveUserMode, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000007F, KePulseEvent, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000080, KeQueryBackgroundProcessors, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000081, KeQueryBasePriorityThread, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000082, KeQueryInterruptTime, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000083, KeQueryPerformanceFrequency, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000084, KeQuerySystemTime, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000085, KeRaiseIrqlToDpcLevel, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000086, KeRegisterDriverNotification, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000087, KeReleaseMutant, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000088, KeReleaseSemaphore, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000089, KeReleaseSpinLockFromRaisedIrql, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000008A, KeRemoveByKeyDeviceQueue, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000008B, KeRemoveDeviceQueue, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000008C, KeRemoveEntryDeviceQueue, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000008D, KeRemoveQueue, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000008E, KeRemoveQueueDpc, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000008F, KeResetEvent, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000090, KeRestoreFloatingPointState, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000091, KeRestoreVectorUnitState, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000092, KeResumeThread, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000093, KeRetireDpcList, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000094, KeRundownQueue, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000095, KeSaveFloatingPointState, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000096, KeSaveVectorUnitState, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000097, KeSetAffinityThread, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000098, KeSetBackgroundProcessors, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000099, KeSetBasePriorityThread, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000009A, KeSetCurrentProcessType, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000009B, KeSetCurrentStackPointers, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000009C, KeSetDisableBoostThread, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000009D, KeSetEvent, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000009E, KeSetEventBoostPriority, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000009F, KeSetPMWRegister, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000A0, KeSetPowerMode, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000A1, KeSetPRVRegister, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000A2, KeSetPriorityClassThread, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000A3, KeSetPriorityThread, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000A4, KeSetSocRegister, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000A5, KeSetSpecialPurposeRegister, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000A6, KeSetTimer, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000A7, KeSetTimerEx, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000A8, KeStallExecutionProcessor, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000A9, KeSuspendThread, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000AA, KeSweepDcacheRange, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000AB, KeSweepIcacheRange, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000AC, KeTestAlertThread, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000AD, KeTimeStampBundle, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x000000AE, KeTryToAcquireSpinLockAtRaisedIrql, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000AF, KeWaitForMultipleObjects, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000B0, KeWaitForSingleObject, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000B1, KfAcquireSpinLock, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000B2, KfRaiseIrql, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000B3, KfLowerIrql, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000B4, KfReleaseSpinLock, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000B5, KiBugCheckData, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x000000B6, LDICreateDecompression, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000B7, LDIDecompress, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000B8, LDIDestroyDecompression, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000B9, MmAllocatePhysicalMemory, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000BA, MmAllocatePhysicalMemoryEx, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000BB, MmCreateKernelStack, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000BC, MmDeleteKernelStack, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000BD, MmFreePhysicalMemory, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000BE, MmGetPhysicalAddress, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000BF, MmIsAddressValid, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000C0, MmLockAndMapSegmentArray, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000C1, MmLockUnlockBufferPages, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000C2, MmMapIoSpace, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000C3, MmPersistPhysicalMemoryAllocation, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000C4, MmQueryAddressProtect, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000C5, MmQueryAllocationSize, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000C6, MmQueryStatistics, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000C7, MmSetAddressProtect, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000C8, MmSplitPhysicalMemoryAllocation, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000C9, MmUnlockAndUnmapSegmentArray, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000CA, MmUnmapIoSpace, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000CB, Nls844UnicodeCaseTable, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x000000CC, NtAllocateVirtualMemory, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000CD, NtCancelTimer, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000CE, NtClearEvent, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000CF, NtClose, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000D0, NtCreateDirectoryObject, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000D1, NtCreateEvent, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000D2, NtCreateFile, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000D3, NtCreateIoCompletion, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000D4, NtCreateMutant, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000D5, NtCreateSemaphore, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000D6, NtCreateSymbolicLinkObject, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000D7, NtCreateTimer, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000D8, NtDeleteFile, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000D9, NtDeviceIoControlFile, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000DA, NtDuplicateObject, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000DB, NtFlushBuffersFile, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000DC, NtFreeVirtualMemory, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000DD, NtMakeTemporaryObject, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000DE, NtOpenDirectoryObject, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000DF, NtOpenFile, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000E0, NtOpenSymbolicLinkObject, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000E1, NtProtectVirtualMemory, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000E2, NtPulseEvent, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000E3, NtQueueApcThread, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000E4, NtQueryDirectoryFile, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000E5, NtQueryDirectoryObject, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000E6, NtQueryEvent, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000E7, NtQueryFullAttributesFile, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000E8, NtQueryInformationFile, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000E9, NtQueryIoCompletion, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000EA, NtQueryMutant, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000EB, NtQuerySemaphore, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000EC, NtQuerySymbolicLinkObject, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000ED, NtQueryTimer, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000EE, NtQueryVirtualMemory, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000EF, NtQueryVolumeInformationFile, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000F0, NtReadFile, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000F1, NtReadFileScatter, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000F2, NtReleaseMutant, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000F3, NtReleaseSemaphore, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000F4, NtRemoveIoCompletion, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000F5, NtResumeThread, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000F6, NtSetEvent, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000F7, NtSetInformationFile, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000F8, NtSetIoCompletion, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000F9, NtSetSystemTime, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000FA, NtSetTimerEx, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000FB, NtSignalAndWaitForSingleObjectEx, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000FC, NtSuspendThread, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000FD, NtWaitForSingleObjectEx, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000FE, NtWaitForMultipleObjectsEx, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000000FF, NtWriteFile, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000100, NtWriteFileGather, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000101, NtYieldExecution, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000102, ObCreateObject, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000103, ObCreateSymbolicLink, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000104, ObDeleteSymbolicLink, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000105, ObDereferenceObject, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000106, ObDirectoryObjectType, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x00000107, ObGetWaitableObject, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000108, ObInsertObject, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000109, ObIsTitleObject, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000010A, ObLookupAnyThreadByThreadId, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000010B, ObLookupThreadByThreadId, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000010C, ObMakeTemporaryObject, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000010D, ObOpenObjectByName, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000010E, ObOpenObjectByPointer, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000010F, ObReferenceObject, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000110, ObReferenceObjectByHandle, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000111, ObReferenceObjectByName, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000112, ObSymbolicLinkObjectType, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x00000113, ObTranslateSymbolicLink, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000114, RtlAnsiStringToUnicodeString, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000115, RtlAppendStringToString, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000116, RtlAppendUnicodeStringToString, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000117, RtlAppendUnicodeToString, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000118, RtlAssert, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000119, RtlCaptureContext, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000011A, RtlCompareMemory, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000011B, RtlCompareMemoryUlong, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000011C, RtlCompareString, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000011D, RtlCompareStringN, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000011E, RtlCompareUnicodeString, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000011F, RtlCompareUnicodeStringN, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000120, RtlCompareUtf8ToUnicode, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000121, RtlCopyString, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000122, RtlCopyUnicodeString, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000123, RtlCreateUnicodeString, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000124, RtlDowncaseUnicodeChar, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000125, RtlEnterCriticalSection, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000126, RtlFillMemoryUlong, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000127, RtlFreeAnsiString, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000128, RtlFreeUnicodeString, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000129, RtlGetCallersAddress, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000012A, RtlGetStackLimits, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000012B, RtlImageXexHeaderField, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000012C, RtlInitAnsiString, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000012D, RtlInitUnicodeString, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000012E, RtlInitializeCriticalSection, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000012F, RtlInitializeCriticalSectionAndSpinCount, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000130, RtlLeaveCriticalSection, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000131, RtlLookupFunctionEntry, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000132, RtlLowerChar, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000133, RtlMultiByteToUnicodeN, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000134, RtlMultiByteToUnicodeSize, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000135, RtlNtStatusToDosError, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000136, RtlRaiseException, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000137, RtlRaiseStatus, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000138, RtlRip, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000139, _scprintf, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000013A, _snprintf, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000013B, sprintf, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000013C, _scwprintf, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000013D, _snwprintf, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000013E, swprintf, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000013F, RtlTimeFieldsToTime, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000140, RtlTimeToTimeFields, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000141, RtlTryEnterCriticalSection, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000142, RtlUnicodeStringToAnsiString, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000143, RtlUnicodeToMultiByteN, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000144, RtlUnicodeToMultiByteSize, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000145, RtlUnicodeToUtf8, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000146, RtlUnicodeToUtf8Size, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000147, RtlUnwind, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000148, RtlUnwind2, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000149, RtlUpcaseUnicodeChar, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000014A, RtlUpperChar, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000014B, RtlVirtualUnwind, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000014C, _vscprintf, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000014D, _vsnprintf, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000014E, vsprintf, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000014F, _vscwprintf, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000150, _vsnwprintf, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000151, vswprintf, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000152, KeTlsAlloc, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000153, KeTlsFree, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000154, KeTlsGetValue, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000155, KeTlsSetValue, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000156, XboxHardwareInfo, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x00000157, XboxKrnlBaseVersion, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x00000158, XboxKrnlVersion, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x00000159, XeCryptAesKey, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000015A, XeCryptAesEcb, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000015B, XeCryptAesCbc, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000015C, XeCryptBnDwLeDhEqualBase, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000015D, XeCryptBnDwLeDhInvalBase, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000015E, XeCryptBnDwLeDhModExp, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000015F, XeCryptBnDw_Copy, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000160, XeCryptBnDw_SwapLeBe, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000161, XeCryptBnDw_Zero, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000162, XeCryptBnDwLePkcs1Format, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000163, XeCryptBnDwLePkcs1Verify, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000164, XeCryptBnQwBeSigCreate, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000165, XeCryptBnQwBeSigFormat, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000166, XeCryptBnQwBeSigVerify, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000167, XeCryptBnQwNeModExp, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000168, XeCryptBnQwNeModExpRoot, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000169, XeCryptBnQwNeModInv, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000016A, XeCryptBnQwNeModMul, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000016B, XeCryptBnQwNeRsaKeyGen, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000016C, XeCryptBnQwNeRsaPrvCrypt, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000016D, XeCryptBnQwNeRsaPubCrypt, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000016E, XeCryptBnQw_Copy, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000016F, XeCryptBnQw_SwapDwQw, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000170, XeCryptBnQw_SwapDwQwLeBe, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000171, XeCryptBnQw_SwapLeBe, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000172, XeCryptBnQw_Zero, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000173, XeCryptChainAndSumMac, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000174, XeCryptDesParity, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000175, XeCryptDesKey, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000176, XeCryptDesEcb, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000177, XeCryptDesCbc, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000178, XeCryptDes3Key, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000179, XeCryptDes3Ecb, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000017A, XeCryptDes3Cbc, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000017B, XeCryptHmacMd5Init, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000017C, XeCryptHmacMd5Update, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000017D, XeCryptHmacMd5Final, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000017E, XeCryptHmacMd5, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000017F, XeCryptHmacShaInit, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000180, XeCryptHmacShaUpdate, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000181, XeCryptHmacShaFinal, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000182, XeCryptHmacSha, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000183, XeCryptHmacShaVerify, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000184, XeCryptMd5Init, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000185, XeCryptMd5Update, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000186, XeCryptMd5Final, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000187, XeCryptMd5, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000188, XeCryptParveEcb, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000189, XeCryptParveCbcMac, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000018A, XeCryptRandom, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000018B, XeCryptRc4Key, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000018C, XeCryptRc4Ecb, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000018D, XeCryptRc4, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000018E, XeCryptRotSumSha, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000018F, XeCryptShaInit, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000190, XeCryptShaUpdate, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000191, XeCryptShaFinal, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000192, XeCryptSha, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000193, XexExecutableModuleHandle, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x00000194, XexCheckExecutablePrivilege, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000195, XexGetModuleHandle, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000196, XexGetModuleSection, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000197, XexGetProcedureAddress, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000198, XexLoadExecutable, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000199, XexLoadImage, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000019A, XexLoadImageFromMemory, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000019B, XexLoadImageHeaders, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000019C, XexPcToFileHeader, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000019D, KiApcNormalRoutineNop_, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000019E, XexRegisterPatchDescriptor, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000019F, XexSendDeferredNotifications, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001A0, XexStartExecutable, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001A1, XexUnloadImage, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001A2, XexUnloadImageAndExitThread, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001A3, XexUnloadTitleModules, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001A4, XexVerifyImageHeaders, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001A5, __C_specific_handler, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001A6, DbgLoadImageSymbols, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001A7, DbgUnLoadImageSymbols, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001A8, RtlImageDirectoryEntryToData, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001A9, RtlImageNtHeader, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001AA, ExDebugMonitorService, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001AB, MmDbgReadCheck, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001AC, MmDbgReleaseAddress, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001AD, MmDbgWriteCheck, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001AE, ExLoadedCommandLine, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x000001AF, ExLoadedImageName, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x000001B0, VdBlockUntilGUIIdle, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001B1, VdCallGraphicsNotificationRoutines, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001B2, VdDisplayFatalError, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001B3, VdEnableClosedCaption, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001B4, VdEnableDisableClockGating, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001B5, VdEnableDisablePowerSavingMode, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001B6, VdEnableRingBufferRPtrWriteBack, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001B7, VdGenerateGPUCSCCoefficients, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001B8, VdGetClosedCaptionReadyStatus, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001B9, VdGetCurrentDisplayGamma, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001BA, VdGetCurrentDisplayInformation, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001BB, VdGetDisplayModeOverride, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001BC, VdGetGraphicsAsicID, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001BD, VdGetSystemCommandBuffer, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001BE, VdGlobalDevice, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x000001BF, VdGlobalXamDevice, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x000001C0, VdGpuClockInMHz, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x000001C1, VdHSIOCalibrationLock, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x000001C2, VdInitializeEngines, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001C3, VdInitializeRingBuffer, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001C4, VdInitializeScaler, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001C5, VdInitializeScalerCommandBuffer, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001C6, VdIsHSIOTrainingSucceeded, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001C7, VdPersistDisplay, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001C8, VdQuerySystemCommandBuffer, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001C9, VdQueryVideoFlags, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001CA, VdQueryVideoMode, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001CB, VdReadDVERegisterUlong, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001CC, VdReadWriteHSIOCalibrationFlag, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001CD, VdRegisterGraphicsNotification, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001CE, VdRegisterXamGraphicsNotification, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001CF, VdSendClosedCaptionData, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001D0, VdSetCGMSOption, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001D1, VdSetColorProfileAdjustment, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001D2, VdSetCscMatricesOverride, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001D3, VdSetDisplayMode, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001D4, VdSetDisplayModeOverride, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001D5, VdSetGraphicsInterruptCallback, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001D6, VdSetHDCPOption, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001D7, VdSetMacrovisionOption, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001D8, VdSetSystemCommandBuffer, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001D9, VdSetSystemCommandBufferGpuIdentifierAddress, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001DA, VdSetWSSData, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001DB, VdSetWSSOption, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001DC, VdShutdownEngines, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001DD, VdTurnDisplayOff, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001DE, VdTurnDisplayOn, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001DF, KiApcNormalRoutineNop, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001E0, VdWriteDVERegisterUlong, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001E1, XVoicedHeadsetPresent, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001E2, XVoicedSubmitPacket, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001E3, XVoicedClose, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001E4, XVoicedActivate, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001E5, XInputdGetCapabilities, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001E6, XInputdReadState, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001E7, XInputdWriteState, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001E8, XInputdNotify, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001E9, XInputdRawState, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001EA, HidGetCapabilities, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001EB, HidReadKeys, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001EC, XInputdGetDeviceStats, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001ED, XInputdResetDevice, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001EE, XInputdSetRingOfLight, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001EF, XInputdSetRFPowerMode, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001F0, XInputdSetRadioFrequency, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001F1, HidGetLastInputTime, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001F2, XAudioRenderDriverInitialize, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001F3, XAudioRegisterRenderDriverClient, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001F4, XAudioUnregisterRenderDriverClient, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001F5, XAudioSubmitRenderDriverFrame, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001F6, XAudioRenderDriverLock, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001F7, XAudioGetVoiceCategoryVolumeChangeMask, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001F8, XAudioGetVoiceCategoryVolume, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001F9, XAudioSetVoiceCategoryVolume, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001FA, XAudioBeginDigitalBypassMode, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001FB, XAudioEndDigitalBypassMode, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001FC, XAudioSubmitDigitalPacket, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001FD, XAudioQueryDriverPerformance, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001FE, XAudioGetRenderDriverThread, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000001FF, XAudioGetSpeakerConfig, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000200, XAudioSetSpeakerConfig, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000201, NicSetUnicastAddress, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000202, NicAttach, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000203, NicDetach, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000204, NicXmit, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000205, NicUpdateMcastMembership, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000206, NicFlushXmitQueue, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000207, NicShutdown, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000208, NicGetLinkState, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000209, NicGetStats, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000020A, NicGetOpt, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000020B, NicSetOpt, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000020C, DrvSetSysReqCallback, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000020D, DrvSetUserBindingCallback, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000020E, DrvSetContentStorageCallback, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000020F, DrvSetAutobind, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000210, DrvGetContentStorageNotification, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000211, MtpdBeginTransaction, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000212, MtpdCancelTransaction, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000213, MtpdEndTransaction, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000214, MtpdGetCurrentDevices, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000215, MtpdReadData, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000216, MtpdReadEvent, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000217, MtpdResetDevice, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000218, MtpdSendData, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000219, MtpdVerifyProximity, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000021A, XUsbcamSetCaptureMode, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000021B, XUsbcamGetConfig, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000021C, XUsbcamSetConfig, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000021D, XUsbcamGetState, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000021E, XUsbcamReadFrame, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000021F, XUsbcamSnapshot, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000220, XUsbcamSetView, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000221, XUsbcamGetView, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000222, XUsbcamCreate, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000223, XUsbcamDestroy, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000224, XMACreateContext, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000225, XMAInitializeContext, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000226, XMAReleaseContext, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000227, XMAEnableContext, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000228, XMADisableContext, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000229, XMAGetOutputBufferWriteOffset, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000022A, XMASetOutputBufferReadOffset, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000022B, XMAGetOutputBufferReadOffset, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000022C, XMASetOutputBufferValid, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000022D, XMAIsOutputBufferValid, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000022E, XMASetInputBuffer0Valid, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000022F, XMAIsInputBuffer0Valid, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000230, XMASetInputBuffer1Valid, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000231, XMAIsInputBuffer1Valid, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000232, XMASetInputBuffer0, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000233, XMASetInputBuffer1, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000234, XMAGetPacketMetadata, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000235, XMABlockWhileInUse, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000236, XMASetLoopData, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000237, XMASetInputBufferReadOffset, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000238, XMAGetInputBufferReadOffset, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000239, ExIsBetaFeatureEnabled, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000023A, XeKeysGetFactoryChallenge, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000023B, XeKeysSetFactoryResponse, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000023C, XeKeysInitializeFuses, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000023D, XeKeysSaveBootLoader, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000023E, XeKeysSaveKeyVault, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000023F, XeKeysGetStatus, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000240, XeKeysGeneratePrivateKey, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000241, XeKeysGetKeyProperties, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000242, XeKeysSetKey, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000243, XeKeysGenerateRandomKey, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000244, XeKeysGetKey, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000245, XeKeysGetDigest, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000246, XeKeysGetConsoleID, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000247, XeKeysGetConsoleType, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000248, XeKeysQwNeRsaPrvCrypt, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000249, XeKeysHmacSha, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000024A, XInputdPassThroughRFCommand, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000024B, XeKeysAesCbc, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000024C, XeKeysDes2Cbc, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000024D, XeKeysDesCbc, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000024E, XeKeysObscureKey, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000024F, XeKeysHmacShaUsingKey, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000250, XeKeysSaveBootLoaderEx, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000251, XeKeysAesCbcUsingKey, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000252, XeKeysDes2CbcUsingKey, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000253, XeKeysDesCbcUsingKey, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000254, XeKeysObfuscate, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000255, XeKeysUnObfuscate, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000256, XeKeysConsolePrivateKeySign, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000257, XeKeysConsoleSignatureVerification, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000258, XeKeysVerifyRSASignature, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000259, StfsCreateDevice, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000025A, StfsControlDevice, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000025B, VdSwap, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000025C, HalFsbInterruptCount, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x0000025D, XeKeysSaveSystemUpdate, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000025E, XeKeysLockSystemUpdate, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000025F, XeKeysExecute, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000260, XeKeysGetVersions, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000261, XInputdPowerDownDevice, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000262, AniBlockOnAnimation, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000263, AniTerminateAnimation, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000264, XUsbcamReset, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000265, AniSetLogo, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000266, KeCertMonitorData, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x00000267, HalIsExecutingPowerDownDpc, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000268, VdInitializeEDRAM, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000269, VdRetrainEDRAM, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000026A, VdRetrainEDRAMWorker, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000026B, VdHSIOTrainCount, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x0000026C, HalGetPowerUpCause, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000026D, VdHSIOTrainingStatus, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x0000026E, RgcBindInfo, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x0000026F, VdReadEEDIDBlock, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000270, VdEnumerateVideoModes, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000271, VdEnableHDCP, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000272, VdRegisterHDCPNotification, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000273, HidReadMouseChanges, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000274, DumpSetCollectionFacility, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000275, XexTransformImageKey, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000276, XAudioOverrideSpeakerConfig, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000277, XInputdReadTextKeystroke, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000278, DrvXenonButtonPressed, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000279, DrvBindToUser, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000027A, XexGetModuleImportVersions, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000027B, RtlComputeCrc32, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000027C, XeKeysSetRevocationList, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000027D, HalRegisterPowerDownCallback, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000027E, VdGetDisplayDiscoveryData, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000027F, XInputdSendStayAliveRequest, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000280, XVoicedSendVPort, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000281, XVoicedGetBatteryStatus, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000282, XInputdFFGetDeviceInfo, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000283, XInputdFFSetEffect, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000284, XInputdFFUpdateEffect, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000285, XInputdFFEffectOperation, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000286, XInputdFFDeviceControl, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000287, XInputdFFSetDeviceGain, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000288, XInputdFFCancelIo, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000289, XInputdFFSetRumble, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000028A, NtAllocateEncryptedMemory, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000028B, NtFreeEncryptedMemory, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000028C, XeKeysExSaveKeyVault, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000028D, XeKeysExSetKey, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000028E, XeKeysExGetKey, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000028F, DrvSetDeviceConfigChangeCallback, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000290, DrvDeviceConfigChange, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000291, HalRegisterHdDvdRomNotification, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000292, XeKeysSecurityInitialize, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000293, XeKeysSecurityLoadSettings, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000294, XeKeysSecuritySaveSettings, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000295, XeKeysSecuritySetDetected, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000296, XeKeysSecurityGetDetected, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000297, XeKeysSecuritySetActivated, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000298, XeKeysSecurityGetActivated, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000299, XeKeysDvdAuthAP25InstallTable, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000029A, XeKeysDvdAuthAP25GetTableVersion, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000029B, XeKeysGetProtectedFlag, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000029C, XeKeysSetProtectedFlag, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000029D, KeEnablePFMInterrupt, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000029E, KeDisablePFMInterrupt, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000029F, KeSetProfilerISR, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002A0, VdStartDisplayDiscovery, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002A1, VdSetHDCPRevocationList, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002A2, XeKeysGetUpdateSequence, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002A3, XeKeysDvdAuthExActivate, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002A4, KeGetImagePageTableEntry, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002A5, HalRegisterBackgroundModeTransitionCallback, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002A6, AniStartBootAnimation, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002A7, HalClampUnclampOutputDACs, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002A8, HalPowerDownToBackgroundMode, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002A9, HalNotifyAddRemoveBackgroundTask, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002AA, HalCallBackgroundModeNotificationRoutines, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002AB, HalFsbResetCount, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x000002AC, HalGetMemoryInformation, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002AD, XInputdGetLastTextInputTime, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002AE, VdEnableWMAProOverHDMI, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002AF, XeKeysRevokeSaveSettings, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002B0, XInputdSetTextMessengerIndicator, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002B1, MicDeviceRequest, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002B2, XeKeysGetMediaID, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002B3, XeKeysLoadKeyVault, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002B4, KeGetVidInfo, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002B5, HalNotifyBackgroundModeTransitionComplete, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002B6, IoAcquireCancelSpinLock, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002B7, IoReleaseCancelSpinLock, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002B8, NtCancelIoFile, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002B9, NtCancelIoFileEx, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002BA, HalFinalizePowerLossRecovery, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002BB, HalSetPowerLossRecovery, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002BC, ExReadModifyWriteXConfigSettingUlong, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002BD, HalRegisterXamPowerDownCallback, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002BE, ExCancelAlarm, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002BF, ExInitializeAlarm, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002C0, ExSetAlarm, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002C1, XexActivationGetNonce, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002C2, XexActivationSetLicense, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002C3, IptvSetBoundaryKey, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002C4, IptvSetSessionKey, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002C5, IptvVerifyOmac1Signature, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002C6, IptvGetAesCtrTransform, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002C7, SataCdRomRecordReset, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002C8, XInputdSetTextDeviceKeyLocks, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002C9, XInputdGetTextDeviceKeyLocks, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002CA, XexActivationVerifyOwnership, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002CB, XexDisableVerboseDbgPrint, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002CC, SvodCreateDevice, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002CD, RtlCaptureStackBackTrace, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002CE, XeKeysRevokeUpdateDynamic, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002CF, XexImportTraceEnable, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002D0, ExRegisterXConfigNotification, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002D1, XeKeysSecuritySetStat, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002D2, VdQueryRealVideoMode, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002D3, XexSetExecutablePrivilege, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002D4, XAudioSuspendRenderDriverClients, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002D5, IptvGetSessionKeyHash, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002D6, VdSetCGMSState, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002D7, VdSetSCMSState, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002D8, KeFlushMultipleTb, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002D9, VdGetOption, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002DA, VdSetOption, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002DB, UsbdBootEnumerationDoneEvent, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x000002DC, StfsDeviceErrorEvent, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x000002DD, ExTryToAcquireReadWriteLockExclusive, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002DE, ExTryToAcquireReadWriteLockShared, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002DF, XexSetLastKdcTime, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002E0, XInputdControl, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002E1, RmcDeviceRequest, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002E2, LDIResetDecompression, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002E3, NicRegisterDevice, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002E4, UsbdAddDeviceComplete, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002E5, UsbdCancelAsyncTransfer, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002E6, UsbdGetDeviceSpeed, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002E7, UsbdGetDeviceTopology, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002E8, UsbdGetEndpointDescriptor, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002E9, UsbdIsDeviceAuthenticated, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002EA, UsbdOpenDefaultEndpoint, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002EB, UsbdOpenEndpoint, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002EC, UsbdQueueAsyncTransfer, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002ED, UsbdQueueCloseDefaultEndpoint, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002EE, UsbdQueueCloseEndpoint, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002EF, UsbdRemoveDeviceComplete, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002F0, KeRemoveQueueApc, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002F1, UsbdDriverLoadRequiredEvent, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x000002F2, UsbdGetRequiredDrivers, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002F3, UsbdRegisterDriverObject, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002F4, UsbdUnregisterDriverObject, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002F5, UsbdCallAndBlockOnDpcRoutine, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002F6, UsbdResetDevice, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002F7, UsbdGetDeviceDescriptor, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002F8, NomnilGetExtension, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002F9, NomnilStartCloseDevice, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002FA, WifiBeginAuthentication, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002FB, WifiCheckCounterMeasures, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002FC, WifiChooseAuthenCipherSetFromBSSID, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002FD, WifiCompleteAuthentication, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002FE, WifiGetAssociationIE, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000002FF, WifiOnMICError, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000300, WifiPrepareAuthenticationContext, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000301, WifiRecvEAPOLPacket, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000302, WifiDeduceNetworkType, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000303, NicUnregisterDevice, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000304, DumpXitThread, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000305, XInputdSetWifiChannel, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000306, NomnilSetLed, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000307, WifiCalculateRegulatoryDomain, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000308, WifiSelectAdHocChannel, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000309, WifiChannelToFrequency, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000030A, MmGetPoolPagesType, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000030B, ExExpansionInstall, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000030C, ExExpansionCall, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000030D, PsCamDeviceRequest, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000030E, McaDeviceRequest, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000030F, DetroitDeviceRequest, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000310, XeCryptSha256Init, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000311, XeCryptSha256Update, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000312, XeCryptSha256Final, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000313, XeCryptSha256, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000314, XeCryptSha384Init, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000315, XeCryptSha384Update, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000316, XInputdGetDevicePid, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000317, HalGetNotedArgonErrors, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000318, XeCryptSha384Final, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000319, HalReadArgonEeprom, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000031A, HalWriteArgonEeprom, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000031B, XeKeysFcrtLoad, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000031C, XeKeysFcrtSave, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000031D, XeKeysFcrtSet, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000031E, XeCryptSha384, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000031F, XeCryptSha512Init, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000320, XAudioRegisterRenderDriverMECClient, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000321, XAudioUnregisterRenderDriverMECClient, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000322, XAudioCaptureRenderDriverFrame, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000323, XeCryptSha512Update, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000324, XeCryptSha512Final, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000325, XeCryptSha512, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000326, XeCryptBnQwNeCompare, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000327, XVoicedGetDirectionalData, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000328, DrvSetMicArrayStartCallback, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000329, DevAuthGetStatistics, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000032A, NullCableRequest, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000032B, XeKeysRevokeIsDeviceRevoked, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000032C, DumpUpdateDumpSettings, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000032D, EtxConsumerDisableEventType, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000032E, EtxConsumerEnableEventType, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000032F, EtxConsumerProcessLogs, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000330, EtxConsumerRegister, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000331, EtxConsumerUnregister, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000332, EtxProducerLog, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000333, EtxProducerLogV, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000334, EtxProducerRegister, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000335, EtxProducerUnregister, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000336, EtxConsumerFlushBuffers, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000337, EtxProducerLogXwpp, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000338, EtxProducerLogXwppV, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000339, UsbdEnableDisableRootHubPort, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000033A, EtxBufferRegister, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000033B, EtxBufferUnregister, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000033C, DumpRegisterDedicatedDataBlock, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000033D, XeKeysDvdAuthExSave, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000033E, XeKeysDvdAuthExInstall, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000033F, XexShimDisable, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000340, XexShimEnable, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000341, XexShimEntryDisable, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000342, XexShimEntryEnable, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000343, XexShimEntryRegister, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000344, XexShimLock, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000345, XboxKrnlVersion4Digit, kVariable),
|
||||
XE_EXPORT(xboxkrnl, 0x00000346, XeKeysObfuscateEx, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000347, XeKeysUnObfuscateEx, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000348, XexTitleHash, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000349, XexTitleHashClose, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000034A, XexTitleHashContinue, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000034B, XexTitleHashOpen, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000034C, XAudioGetRenderDriverTic, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000034D, XAudioEnableDucker, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000034E, XAudioSetDuckerLevel, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000034F, XAudioIsDuckerEnabled, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000350, XAudioGetDuckerLevel, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000351, XAudioGetDuckerThreshold, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000352, XAudioSetDuckerThreshold, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000353, XAudioGetDuckerAttackTime, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000354, XAudioSetDuckerAttackTime, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000355, XAudioGetDuckerReleaseTime, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000356, XAudioSetDuckerReleaseTime, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000357, XAudioGetDuckerHoldTime, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000358, XAudioSetDuckerHoldTime, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000359, DevAuthShouldAlwaysEnforce, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000035A, XAudioGetUnderrunCount, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000035B, DrvSetAudioLatencyCallback, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000035C, XVoicedIsActiveProcess, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000035D, KeExecuteOnProtectedStack, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000035E, XeKeysVerifyPIRSSignature, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000035F, XeCryptAesCtr, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000360, XeCryptAesCbcMac, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000361, XeCryptAesDmMac, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000362, EmaExecute, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000363, XeKeysGetTruncatedSecondaryConsoleId, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000364, ExFreeDebugPool, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000365, VdQueryVideoCapabilities, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000366, UsbdGetDeviceRootPortType, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000367, VdGet3dVideoFormat, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000368, VdGetWSS2Data, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000369, VdSet3dVideoFormat, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000036A, VdSetWSS2Data, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000036B, XexReserveCodeBuffer, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000036C, XexCommitCodeBuffer, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000036D, RtlSetVectoredExceptionHandler, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000036E, RtlClearVectoredExceptionHandler, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000036F, XAudioSetProcessFrameCallback, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000370, UsbdGetRootHubDeviceNode, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000371, UsbdGetPortDeviceNode, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000372, UsbdGetNatalHub, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000373, UsbdGetNatalHardwareVersion, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000374, UsbdNatalHubRegisterNotificationCallback, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000375, KeCallAndBlockOnDpcRoutine, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000376, KeCallAndWaitForDpcRoutine, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000377, TidDeviceRequest, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000378, DmPrintData, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000379, VdSetStudioRGBMode, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000037A, UsbdTitleDriverResetAllUnrecognizedPorts, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000037B, UsbdTitleDriverSetUnrecognizedPort, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000037C, UsbdResetEndpoint, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000037D, UsbdSetTimer, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000037E, UsbdCancelTimer, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000037F, UsbdQueueIsochTransfer, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000380, KeSetPageRelocationCallback, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000381, XexRegisterUsermodeModule, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000383, TitleDeviceAuthRequest, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000384, KeRegisterSwapNotification, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000385, XInputdGetFailedConnectionOrBind, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000386, XInputdSetFailedConnectionOrBindCallback, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000388, XInputdSetMinMaxAuthDelay, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000389, VgcHandler_SetHandlers, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000038A, VvcHandlerCancelTransfers, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000038B, VvcHandlerRetrieveVoiceExtension, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000038D, MmResetLowestAvailablePages, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000394, VeSetHandlers, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000395, HalConfigureVeDevice, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000396, XeCryptSha224Init, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000397, XeCryptAesCreateKeySchedule, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000398, XeCryptAesEncryptOne, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x00000399, XeCryptAesDecryptOne, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000039A, XeCryptAesCbcEncrypt, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000039B, XeCryptAesCbcDecrypt, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000039C, XeCryptAesGcmInitialize, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000039D, XeCryptAesGcmUpdate, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000039E, XeCryptAesGcmFinalize, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x0000039F, XeCryptEccGetCurveParameters, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000003A0, XeCryptEccEcdhGenerateKeypair, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000003A1, XeCryptEccEcdhExponentiate, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000003A2, XeCryptEccEcdsaGenerateSignature, kFunction),
|
||||
XE_EXPORT(xboxkrnl, 0x000003A3, XeCryptEccEcdsaVerifySignature, kFunction),
|
203
XenonUtils/xdbf.h
Normal file
203
XenonUtils/xdbf.h
Normal file
@@ -0,0 +1,203 @@
|
||||
#pragma once
|
||||
|
||||
#include <xbox.h>
|
||||
|
||||
#define XDBF_SIGNATURE 0x58444246
|
||||
#define XACH_SIGNATURE 0x58414348
|
||||
|
||||
struct XDBFHeader
|
||||
{
|
||||
be<uint32_t> Signature;
|
||||
be<uint32_t> Version;
|
||||
be<uint32_t> EntryTableLength;
|
||||
be<uint32_t> EntryCount;
|
||||
be<uint32_t> FreeSpaceTableLength;
|
||||
be<uint32_t> FreeSpaceTableEntryCount;
|
||||
};
|
||||
|
||||
enum EXDBFNamespace : uint16_t
|
||||
{
|
||||
XDBF_SPA_NAMESPACE_METADATA = 1,
|
||||
XDBF_SPA_NAMESPACE_IMAGE = 2,
|
||||
XDBF_SPA_NAMESPACE_STRING_TABLE = 3,
|
||||
XDBF_GPD_NAMESPACE_ACHIEVEMENT = 1,
|
||||
XDBF_GPD_NAMESPACE_IMAGE = 2,
|
||||
XDBF_GPD_NAMESPACE_SETTING = 3,
|
||||
XDBF_GPD_NAMESPACE_TITLE = 4,
|
||||
XDBF_GPD_NAMESPACE_STRING = 5,
|
||||
XDBF_GPD_NAMESPACE_ACHIEVEMENT_SECURITY_GFWL = 6,
|
||||
XDBF_GPD_NAMESPACE_AVATAR_AWARD_360 = 6
|
||||
};
|
||||
|
||||
#pragma pack(push, 1)
|
||||
struct XDBFEntry
|
||||
{
|
||||
be<EXDBFNamespace> NamespaceID;
|
||||
be<uint64_t> ResourceID;
|
||||
be<uint32_t> Offset;
|
||||
be<uint32_t> Length;
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
||||
struct XDBFFreeSpaceEntry
|
||||
{
|
||||
be<uint32_t> Offset;
|
||||
be<uint32_t> Length;
|
||||
};
|
||||
|
||||
enum EXDBFLanguage : uint32_t
|
||||
{
|
||||
XDBF_LANGUAGE_UNKNOWN = 0,
|
||||
XDBF_LANGUAGE_ENGLISH = 1,
|
||||
XDBF_LANGUAGE_JAPANESE = 2,
|
||||
XDBF_LANGUAGE_GERMAN = 3,
|
||||
XDBF_LANGUAGE_FRENCH = 4,
|
||||
XDBF_LANGUAGE_SPANISH = 5,
|
||||
XDBF_LANGUAGE_ITALIAN = 6,
|
||||
XDBF_LANGUAGE_KOREAN = 7,
|
||||
XDBF_LANGUAGE_CHINESE_TRAD = 8,
|
||||
XDBF_LANGUAGE_PORTUGUESE = 9,
|
||||
XDBF_LANGUAGE_CHINESE_SIMP = 10,
|
||||
XDBF_LANGUAGE_POLISH = 11,
|
||||
XDBF_LANGUAGE_RUSSIAN = 12,
|
||||
XDBF_LANGUAGE_MAX
|
||||
};
|
||||
|
||||
struct XSTCHeader
|
||||
{
|
||||
be<uint32_t> Signature;
|
||||
be<uint32_t> Version;
|
||||
be<uint32_t> Size;
|
||||
be<EXDBFLanguage> Language;
|
||||
};
|
||||
|
||||
#pragma pack(push, 1)
|
||||
struct XSTRHeader
|
||||
{
|
||||
be<uint32_t> Signature;
|
||||
be<uint32_t> Version;
|
||||
be<uint32_t> Size;
|
||||
be<uint16_t> StringCount;
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
||||
struct XSTREntry
|
||||
{
|
||||
be<uint16_t> ID;
|
||||
be<uint16_t> Length;
|
||||
};
|
||||
|
||||
#pragma pack(push, 1)
|
||||
struct XACHHeader
|
||||
{
|
||||
be<uint32_t> Signature;
|
||||
be<uint32_t> Version;
|
||||
be<uint32_t> Size;
|
||||
be<uint16_t> AchievementCount;
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
||||
enum EXACHFlags : uint32_t
|
||||
{
|
||||
XACH_TYPE_COMPLETION = 1U,
|
||||
XACH_TYPE_LEVELING = 2U,
|
||||
XACH_TYPE_UNLOCK = 3U,
|
||||
XACH_TYPE_EVENT = 4U,
|
||||
XACH_TYPE_TOURNAMENT = 5U,
|
||||
XACH_TYPE_CHECKPOINT = 6U,
|
||||
XACH_TYPE_OTHER = 7U,
|
||||
XACH_TYPE_MASK = 7U,
|
||||
XACH_STATUS_UNACHIEVED = (1U << 4),
|
||||
XACH_STATUS_EARNED_ONLINE = (1U << 16),
|
||||
XACH_STATUS_EARNED = (1U << 17),
|
||||
XACH_STATUS_EDITED = (1U << 20)
|
||||
};
|
||||
|
||||
struct XACHEntry
|
||||
{
|
||||
be<uint16_t> AchievementID;
|
||||
be<uint16_t> NameID;
|
||||
be<uint16_t> UnlockedDescID;
|
||||
be<uint16_t> LockedDescID;
|
||||
be<uint32_t> ImageID;
|
||||
be<uint16_t> Gamerscore;
|
||||
char pad0[0x02];
|
||||
be<EXACHFlags> Flags;
|
||||
char pad1[0x10];
|
||||
};
|
||||
|
||||
union XDBFTitleID
|
||||
{
|
||||
struct
|
||||
{
|
||||
be<uint16_t> u16;
|
||||
char u8[0x02];
|
||||
};
|
||||
|
||||
be<uint32_t> u32;
|
||||
};
|
||||
|
||||
struct XDBFTitleVersion
|
||||
{
|
||||
be<uint16_t> Major;
|
||||
be<uint16_t> Minor;
|
||||
be<uint16_t> Build;
|
||||
be<uint16_t> Revision;
|
||||
};
|
||||
|
||||
enum EXDBFTitleType : uint32_t
|
||||
{
|
||||
XDBF_TITLE_TYPE_SYSTEM = 0,
|
||||
XDBF_TITLE_TYPE_FULL = 1,
|
||||
XDBF_TITLE_TYPE_DEMO = 2,
|
||||
XDBF_TITLE_TYPE_DOWNLOAD = 3
|
||||
};
|
||||
|
||||
struct XTHDHeader
|
||||
{
|
||||
be<uint32_t> Signature;
|
||||
be<uint32_t> Version;
|
||||
be<uint32_t> Size;
|
||||
XDBFTitleID TitleID;
|
||||
be<EXDBFTitleType> Type;
|
||||
XDBFTitleVersion TitleVersion;
|
||||
char pad0[0x10];
|
||||
};
|
||||
|
||||
#pragma pack(push, 1)
|
||||
struct XGAAHeader
|
||||
{
|
||||
be<uint32_t> Signature;
|
||||
be<uint32_t> Version;
|
||||
be<uint32_t> Size;
|
||||
be<uint16_t> Count;
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
||||
struct XGAAEntry
|
||||
{
|
||||
char pad0[0x04];
|
||||
be<uint16_t> AvatarAwardID;
|
||||
char pad1[0x06];
|
||||
XDBFTitleID TitleID;
|
||||
be<uint16_t> NameID;
|
||||
be<uint16_t> UnlockedDescID;
|
||||
be<uint16_t> LockedDescID;
|
||||
char pad2[0x02];
|
||||
be<uint32_t> ImageID;
|
||||
char pad3[0x08];
|
||||
};
|
||||
|
||||
struct XSRCHeader
|
||||
{
|
||||
be<uint32_t> Signature;
|
||||
be<uint32_t> Version;
|
||||
be<uint32_t> Size;
|
||||
be<uint32_t> FileNameLength;
|
||||
};
|
||||
|
||||
struct XSRCHeader2
|
||||
{
|
||||
be<uint32_t> UncompressedSize;
|
||||
be<uint32_t> CompressedSize;
|
||||
};
|
152
XenonUtils/xdbf_wrapper.cpp
Normal file
152
XenonUtils/xdbf_wrapper.cpp
Normal file
@@ -0,0 +1,152 @@
|
||||
#include "xdbf_wrapper.h"
|
||||
|
||||
XDBFWrapper::XDBFWrapper(const uint8_t* buffer, size_t bufferSize) : pBuffer(buffer), BufferSize(bufferSize)
|
||||
{
|
||||
if (!buffer || bufferSize <= sizeof(XDBFHeader))
|
||||
{
|
||||
pBuffer = nullptr;
|
||||
return;
|
||||
}
|
||||
|
||||
auto seek = pBuffer;
|
||||
|
||||
pHeader = (XDBFHeader*)seek;
|
||||
seek += sizeof(XDBFHeader);
|
||||
|
||||
if (pHeader->Signature != XDBF_SIGNATURE)
|
||||
{
|
||||
pBuffer = nullptr;
|
||||
return;
|
||||
}
|
||||
|
||||
pEntries = (XDBFEntry*)seek;
|
||||
seek += sizeof(XDBFEntry) * pHeader->EntryCount;
|
||||
|
||||
pFiles = (XDBFFreeSpaceEntry*)seek;
|
||||
seek += sizeof(XDBFFreeSpaceEntry) * pHeader->FreeSpaceTableLength;
|
||||
|
||||
pContent = seek;
|
||||
}
|
||||
|
||||
XDBFBlock XDBFWrapper::GetResource(EXDBFNamespace ns, uint64_t id) const
|
||||
{
|
||||
for (int i = 0; i < pHeader->EntryCount; i++)
|
||||
{
|
||||
auto& entry = pEntries[i];
|
||||
|
||||
if (entry.NamespaceID == ns && entry.ResourceID == id)
|
||||
{
|
||||
XDBFBlock block{};
|
||||
block.pBuffer = pContent + entry.Offset;
|
||||
block.BufferSize = entry.Length;
|
||||
return block;
|
||||
}
|
||||
}
|
||||
|
||||
return { nullptr };
|
||||
}
|
||||
|
||||
std::string XDBFWrapper::GetString(EXDBFLanguage language, uint16_t id) const
|
||||
{
|
||||
auto languageBlock = GetResource(XDBF_SPA_NAMESPACE_STRING_TABLE, (uint64_t)language);
|
||||
|
||||
if (!languageBlock)
|
||||
return "";
|
||||
|
||||
auto pHeader = (XSTRHeader*)languageBlock.pBuffer;
|
||||
auto seek = languageBlock.pBuffer + sizeof(XSTRHeader);
|
||||
|
||||
for (int i = 0; i < pHeader->StringCount; i++)
|
||||
{
|
||||
auto entry = (XSTREntry*)seek;
|
||||
|
||||
seek += sizeof(XSTREntry);
|
||||
|
||||
if (entry->ID == id)
|
||||
return std::string((const char*)seek, entry->Length);
|
||||
|
||||
seek += entry->Length;
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
std::vector<Achievement> XDBFWrapper::GetAchievements(EXDBFLanguage language) const
|
||||
{
|
||||
std::vector<Achievement> result;
|
||||
|
||||
auto achievementsBlock = GetResource(XDBF_SPA_NAMESPACE_METADATA, XACH_SIGNATURE);
|
||||
|
||||
if (!achievementsBlock)
|
||||
return result;
|
||||
|
||||
auto pHeader = (XACHHeader*)achievementsBlock.pBuffer;
|
||||
auto seek = achievementsBlock.pBuffer + sizeof(XACHHeader);
|
||||
|
||||
for (int i = 0; i < pHeader->AchievementCount; i++)
|
||||
{
|
||||
auto entry = (XACHEntry*)seek;
|
||||
|
||||
seek += sizeof(XACHEntry);
|
||||
|
||||
Achievement achievement{};
|
||||
achievement.ID = entry->AchievementID;
|
||||
achievement.Name = GetString(language, entry->NameID);
|
||||
achievement.UnlockedDesc = GetString(language, entry->UnlockedDescID);
|
||||
achievement.LockedDesc = GetString(language, entry->LockedDescID);
|
||||
achievement.Score = entry->Gamerscore;
|
||||
|
||||
auto imageBlock = GetResource(XDBF_SPA_NAMESPACE_IMAGE, entry->ImageID);
|
||||
|
||||
if (imageBlock)
|
||||
{
|
||||
achievement.pImageBuffer = imageBlock.pBuffer;
|
||||
achievement.ImageBufferSize = imageBlock.BufferSize;
|
||||
}
|
||||
|
||||
result.push_back(achievement);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
Achievement XDBFWrapper::GetAchievement(EXDBFLanguage language, uint16_t id) const
|
||||
{
|
||||
Achievement result{};
|
||||
|
||||
auto achievementsBlock = GetResource(XDBF_SPA_NAMESPACE_METADATA, 0x58414348);
|
||||
|
||||
if (!achievementsBlock)
|
||||
return result;
|
||||
|
||||
auto pHeader = (XACHHeader*)achievementsBlock.pBuffer;
|
||||
auto seek = achievementsBlock.pBuffer + sizeof(XACHHeader);
|
||||
|
||||
for (int i = 0; i < pHeader->AchievementCount; i++)
|
||||
{
|
||||
auto entry = (XACHEntry*)seek;
|
||||
|
||||
seek += sizeof(XACHEntry);
|
||||
|
||||
if (entry->AchievementID == id)
|
||||
{
|
||||
result.ID = entry->AchievementID;
|
||||
result.Name = GetString(language, entry->NameID);
|
||||
result.UnlockedDesc = GetString(language, entry->UnlockedDescID);
|
||||
result.LockedDesc = GetString(language, entry->LockedDescID);
|
||||
result.Score = entry->Gamerscore;
|
||||
|
||||
auto imageBlock = GetResource(XDBF_SPA_NAMESPACE_IMAGE, entry->ImageID);
|
||||
|
||||
if (imageBlock)
|
||||
{
|
||||
result.pImageBuffer = imageBlock.pBuffer;
|
||||
result.ImageBufferSize = imageBlock.BufferSize;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
46
XenonUtils/xdbf_wrapper.h
Normal file
46
XenonUtils/xdbf_wrapper.h
Normal file
@@ -0,0 +1,46 @@
|
||||
#pragma once
|
||||
|
||||
#include <vector>
|
||||
#include "xdbf.h"
|
||||
|
||||
struct Achievement
|
||||
{
|
||||
uint16_t ID;
|
||||
std::string Name;
|
||||
std::string UnlockedDesc;
|
||||
std::string LockedDesc;
|
||||
const uint8_t* pImageBuffer;
|
||||
size_t ImageBufferSize;
|
||||
uint16_t Score;
|
||||
};
|
||||
|
||||
struct XDBFBlock
|
||||
{
|
||||
const uint8_t* pBuffer;
|
||||
size_t BufferSize;
|
||||
|
||||
operator bool() const
|
||||
{
|
||||
return pBuffer;
|
||||
}
|
||||
};
|
||||
|
||||
class XDBFWrapper
|
||||
{
|
||||
public:
|
||||
const uint8_t* pBuffer;
|
||||
size_t BufferSize;
|
||||
|
||||
const uint8_t* pContent;
|
||||
|
||||
const XDBFHeader* pHeader;
|
||||
const XDBFEntry* pEntries;
|
||||
const XDBFFreeSpaceEntry* pFiles;
|
||||
|
||||
XDBFWrapper() {}
|
||||
XDBFWrapper(const uint8_t* pBuffer, size_t bufferSize);
|
||||
XDBFBlock GetResource(EXDBFNamespace ns, uint64_t id) const;
|
||||
std::string GetString(EXDBFLanguage language, uint16_t id) const;
|
||||
std::vector<Achievement> GetAchievements(EXDBFLanguage language) const;
|
||||
Achievement GetAchievement(EXDBFLanguage language, uint16_t id) const;
|
||||
};
|
252
XenonUtils/xex.cpp
Normal file
252
XenonUtils/xex.cpp
Normal file
@@ -0,0 +1,252 @@
|
||||
#include "xex.h"
|
||||
#include "image.h"
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
#include <vector>
|
||||
#include <unordered_map>
|
||||
|
||||
#define STRINGIFY(X) #X
|
||||
#define XE_EXPORT(MODULE, ORDINAL, NAME, TYPE) { (ORDINAL), "__imp__" STRINGIFY(NAME) }
|
||||
|
||||
#ifndef _WIN32
|
||||
|
||||
typedef struct _IMAGE_DOS_HEADER {
|
||||
uint16_t e_magic;
|
||||
uint16_t e_cblp;
|
||||
uint16_t e_cp;
|
||||
uint16_t e_crlc;
|
||||
uint16_t e_cparhdr;
|
||||
uint16_t e_minalloc;
|
||||
uint16_t e_maxalloc;
|
||||
uint16_t e_ss;
|
||||
uint16_t e_sp;
|
||||
uint16_t e_csum;
|
||||
uint16_t e_ip;
|
||||
uint16_t e_cs;
|
||||
uint16_t e_lfarlc;
|
||||
uint16_t e_ovno;
|
||||
uint16_t e_res[4];
|
||||
uint16_t e_oemid;
|
||||
uint16_t e_oeminfo;
|
||||
uint16_t e_res2[10];
|
||||
uint32_t e_lfanew;
|
||||
} IMAGE_DOS_HEADER, * PIMAGE_DOS_HEADER;
|
||||
|
||||
typedef struct _IMAGE_FILE_HEADER {
|
||||
uint16_t Machine;
|
||||
uint16_t NumberOfSections;
|
||||
uint32_t TimeDateStamp;
|
||||
uint32_t PointerToSymbolTable;
|
||||
uint32_t NumberOfSymbols;
|
||||
uint16_t SizeOfOptionalHeader;
|
||||
uint16_t Characteristics;
|
||||
} IMAGE_FILE_HEADER, * PIMAGE_FILE_HEADER;
|
||||
|
||||
typedef struct _IMAGE_DATA_DIRECTORY {
|
||||
uint32_t VirtualAddress;
|
||||
uint32_t Size;
|
||||
} IMAGE_DATA_DIRECTORY, * PIMAGE_DATA_DIRECTORY;
|
||||
|
||||
#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
|
||||
|
||||
typedef struct _IMAGE_OPTIONAL_HEADER {
|
||||
uint16_t Magic;
|
||||
uint8_t MajorLinkerVersion;
|
||||
uint8_t MinorLinkerVersion;
|
||||
uint32_t SizeOfCode;
|
||||
uint32_t SizeOfInitializedData;
|
||||
uint32_t SizeOfUninitializedData;
|
||||
uint32_t AddressOfEntryPoint;
|
||||
uint32_t BaseOfCode;
|
||||
uint32_t BaseOfData;
|
||||
uint32_t ImageBase;
|
||||
uint32_t SectionAlignment;
|
||||
uint32_t FileAlignment;
|
||||
uint16_t MajorOperatingSystemVersion;
|
||||
uint16_t MinorOperatingSystemVersion;
|
||||
uint16_t MajorImageVersion;
|
||||
uint16_t MinorImageVersion;
|
||||
uint16_t MajorSubsystemVersion;
|
||||
uint16_t MinorSubsystemVersion;
|
||||
uint32_t Win32VersionValue;
|
||||
uint32_t SizeOfImage;
|
||||
uint32_t SizeOfHeaders;
|
||||
uint32_t CheckSum;
|
||||
uint16_t Subsystem;
|
||||
uint16_t DllCharacteristics;
|
||||
uint32_t SizeOfStackReserve;
|
||||
uint32_t SizeOfStackCommit;
|
||||
uint32_t SizeOfHeapReserve;
|
||||
uint32_t SizeOfHeapCommit;
|
||||
uint32_t LoaderFlags;
|
||||
uint32_t NumberOfRvaAndSizes;
|
||||
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
|
||||
} IMAGE_OPTIONAL_HEADER32, * PIMAGE_OPTIONAL_HEADER32;
|
||||
|
||||
typedef struct _IMAGE_NT_HEADERS {
|
||||
uint32_t Signature;
|
||||
IMAGE_FILE_HEADER FileHeader;
|
||||
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
|
||||
} IMAGE_NT_HEADERS32, * PIMAGE_NT_HEADERS32;
|
||||
|
||||
#define IMAGE_SIZEOF_SHORT_NAME 8
|
||||
|
||||
typedef struct _IMAGE_SECTION_HEADER {
|
||||
uint8_t Name[IMAGE_SIZEOF_SHORT_NAME];
|
||||
union {
|
||||
uint32_t PhysicalAddress;
|
||||
uint32_t VirtualSize;
|
||||
} Misc;
|
||||
uint32_t VirtualAddress;
|
||||
uint32_t SizeOfRawData;
|
||||
uint32_t PointerToRawData;
|
||||
uint32_t PointerToRelocations;
|
||||
uint32_t PointerToLinenumbers;
|
||||
uint16_t NumberOfRelocations;
|
||||
uint16_t NumberOfLinenumbers;
|
||||
uint32_t Characteristics;
|
||||
} IMAGE_SECTION_HEADER, * PIMAGE_SECTION_HEADER;
|
||||
|
||||
#define IMAGE_SCN_CNT_CODE 0x00000020
|
||||
|
||||
#endif
|
||||
|
||||
std::unordered_map<size_t, const char*> XamExports =
|
||||
{
|
||||
#include "xbox/xam_table.inc"
|
||||
};
|
||||
|
||||
std::unordered_map<size_t, const char*> XboxKernelExports =
|
||||
{
|
||||
#include "xbox/xboxkrnl_table.inc"
|
||||
};
|
||||
|
||||
Image Xex2LoadImage(const uint8_t* data)
|
||||
{
|
||||
auto* header = reinterpret_cast<const XEX_HEADER*>(data);
|
||||
auto* security = reinterpret_cast<const XEX2_SECURITY_INFO*>(data + header->AddressOfSecurityInfo);
|
||||
|
||||
const auto* compressionInfo = Xex2FindOptionalHeader<XEX_FILE_FORMAT_INFO>(header, XEX_HEADER_FILE_FORMAT_INFO);
|
||||
|
||||
Image image{};
|
||||
std::unique_ptr<uint8_t[]> result{};
|
||||
size_t imageSize = security->SizeOfImage;
|
||||
|
||||
// Decompress image
|
||||
if (compressionInfo != nullptr)
|
||||
{
|
||||
assert(compressionInfo->CompressionType <= XEX_COMPRESSION_BASIC);
|
||||
assert(compressionInfo->EncryptionType == XEX_ENCRYPTION_NONE);
|
||||
|
||||
if (compressionInfo->CompressionType == XEX_COMPRESSION_NONE)
|
||||
{
|
||||
result = std::make_unique<uint8_t[]>(imageSize);
|
||||
memcpy(result.get(), data + header->SizeOfHeader, imageSize);
|
||||
}
|
||||
else if (compressionInfo->CompressionType == XEX_COMPRESSION_BASIC)
|
||||
{
|
||||
auto* blocks = reinterpret_cast<const XEX_BASIC_FILE_COMPRESSION_INFO*>(compressionInfo + 1);
|
||||
const size_t numBlocks = (compressionInfo->SizeOfHeader / sizeof(XEX_BASIC_FILE_COMPRESSION_INFO)) - 1;
|
||||
|
||||
imageSize = 0;
|
||||
for (size_t i = 0; i < numBlocks; i++)
|
||||
{
|
||||
imageSize += blocks[i].SizeOfData + blocks[i].SizeOfPadding;
|
||||
}
|
||||
|
||||
result = std::make_unique<uint8_t[]>(imageSize);
|
||||
auto* srcData = data + header->SizeOfHeader;
|
||||
auto* destData = result.get();
|
||||
|
||||
for (size_t i = 0; i < numBlocks; i++)
|
||||
{
|
||||
memcpy(destData, srcData, blocks[i].SizeOfData);
|
||||
|
||||
srcData += blocks[i].SizeOfData;
|
||||
destData += blocks[i].SizeOfData;
|
||||
|
||||
memset(destData, 0, blocks[i].SizeOfPadding);
|
||||
destData += blocks[i].SizeOfPadding;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
image.data = std::move(result);
|
||||
image.size = imageSize;
|
||||
|
||||
// Map image
|
||||
const auto* dosHeader = reinterpret_cast<IMAGE_DOS_HEADER*>(image.data.get());
|
||||
const auto* ntHeaders = reinterpret_cast<IMAGE_NT_HEADERS32*>(image.data.get() + dosHeader->e_lfanew);
|
||||
|
||||
image.base = ntHeaders->OptionalHeader.ImageBase;
|
||||
image.entry_point = image.base + ntHeaders->OptionalHeader.AddressOfEntryPoint;
|
||||
|
||||
const auto numSections = ntHeaders->FileHeader.NumberOfSections;
|
||||
const auto* sections = reinterpret_cast<const IMAGE_SECTION_HEADER*>(ntHeaders + 1);
|
||||
|
||||
for (size_t i = 0; i < numSections; i++)
|
||||
{
|
||||
const auto& section = sections[i];
|
||||
uint8_t flags{};
|
||||
|
||||
if (section.Characteristics & IMAGE_SCN_CNT_CODE)
|
||||
{
|
||||
flags |= SectionFlags_Code;
|
||||
}
|
||||
|
||||
image.Map(reinterpret_cast<const char*>(section.Name), section.VirtualAddress,
|
||||
section.Misc.VirtualSize, flags, image.data.get() + section.VirtualAddress);
|
||||
}
|
||||
|
||||
auto* imports = Xex2FindOptionalHeader<XEX_IMPORT_HEADER>(header, XEX_HEADER_IMPORT_LIBRARIES);
|
||||
if (imports != nullptr)
|
||||
{
|
||||
std::vector<std::string_view> stringTable;
|
||||
auto* pStrTable = reinterpret_cast<const char*>(imports + 1);
|
||||
|
||||
for (size_t i = 0; i < imports->NumImports; i++)
|
||||
{
|
||||
stringTable.emplace_back(pStrTable);
|
||||
pStrTable += strlen(pStrTable) + 1;
|
||||
}
|
||||
|
||||
auto* library = (XEX_IMPORT_LIBRARY*)(((char*)imports) + sizeof(XEX_IMPORT_HEADER) + imports->SizeOfStringTable);
|
||||
for (size_t i = 0; i < stringTable.size(); i++)
|
||||
{
|
||||
auto* descriptors = (XEX_IMPORT_DESCRIPTOR*)(library + 1);
|
||||
static std::unordered_map<size_t, const char*> DummyExports;
|
||||
const std::unordered_map<size_t, const char*>* names = &DummyExports;
|
||||
|
||||
if (stringTable[i] == "xam.xex")
|
||||
{
|
||||
names = &XamExports;
|
||||
}
|
||||
else if (stringTable[i] == "xboxkrnl.exe")
|
||||
{
|
||||
names = &XboxKernelExports;
|
||||
}
|
||||
|
||||
for (size_t im = 0; im < library->NumberOfImports; im++)
|
||||
{
|
||||
auto originalThunk = (XEX_THUNK_DATA*)image.Find(descriptors[im].FirstThunk);
|
||||
auto originalData = originalThunk;
|
||||
originalData->Data = ByteSwap(originalData->Data);
|
||||
|
||||
if (originalData->OriginalData.Type != 0)
|
||||
{
|
||||
uint32_t thunk[4] = { 0x00000060, 0x00000060, 0x00000060, 0x2000804E };
|
||||
auto name = names->find(originalData->OriginalData.Ordinal);
|
||||
if (name != names->end())
|
||||
{
|
||||
image.symbols.insert({ name->second, descriptors[im].FirstThunk, sizeof(thunk), Symbol_Function });
|
||||
}
|
||||
|
||||
memcpy(originalThunk, thunk, sizeof(thunk));
|
||||
}
|
||||
}
|
||||
library = (XEX_IMPORT_LIBRARY*)((char*)(library + 1) + library->NumberOfImports * sizeof(XEX_IMPORT_DESCRIPTOR));
|
||||
}
|
||||
}
|
||||
|
||||
return image;
|
||||
}
|
176
XenonUtils/xex.h
Normal file
176
XenonUtils/xex.h
Normal file
@@ -0,0 +1,176 @@
|
||||
#pragma once
|
||||
#include <memory>
|
||||
#include "xbox.h"
|
||||
|
||||
#define XEX_COMPRESSION_NONE 0
|
||||
#define XEX_COMPRESSION_BASIC 1
|
||||
|
||||
#define XEX_ENCRYPTION_NONE 0
|
||||
|
||||
enum _XEX_THUNK_TYPES
|
||||
{
|
||||
XEX_THUNK_VARIABLE = 0,
|
||||
XEX_THUNK_FUNCTION = 1,
|
||||
};
|
||||
|
||||
enum _XEX_OPTIONAL_HEADER_TYPES
|
||||
{
|
||||
XEX_HEADER_RESOURCE_INFO = 0x000002FF,
|
||||
XEX_HEADER_FILE_FORMAT_INFO = 0x000003FF,
|
||||
XEX_HEADER_DELTA_PATCH_DESCRIPTOR = 0x000005FF,
|
||||
XEX_HEADER_BASE_REFERENCE = 0x00000405,
|
||||
XEX_HEADER_BOUNDING_PATH = 0x000080FF,
|
||||
XEX_HEADER_DEVICE_ID = 0x00008105,
|
||||
XEX_HEADER_ORIGINAL_BASE_ADDRESS = 0x00010001,
|
||||
XEX_HEADER_ENTRY_POINT = 0x00010100,
|
||||
XEX_HEADER_IMAGE_BASE_ADDRESS = 0x00010201,
|
||||
XEX_HEADER_IMPORT_LIBRARIES = 0x000103FF,
|
||||
XEX_HEADER_CHECKSUM_TIMESTAMP = 0x00018002,
|
||||
XEX_HEADER_ENABLED_FOR_CALLCAP = 0x00018102,
|
||||
XEX_HEADER_ENABLED_FOR_FASTCAP = 0x00018200,
|
||||
XEX_HEADER_ORIGINAL_PE_NAME = 0x000183FF,
|
||||
XEX_HEADER_STATIC_LIBRARIES = 0x000200FF,
|
||||
XEX_HEADER_TLS_INFO = 0x00020104,
|
||||
XEX_HEADER_DEFAULT_STACK_SIZE = 0x00020200,
|
||||
XEX_HEADER_DEFAULT_FILESYSTEM_CACHE_SIZE = 0x00020301,
|
||||
XEX_HEADER_DEFAULT_HEAP_SIZE = 0x00020401,
|
||||
XEX_HEADER_PAGE_HEAP_SIZE_AND_FLAGS = 0x00028002,
|
||||
XEX_HEADER_SYSTEM_FLAGS = 0x00030000,
|
||||
XEX_HEADER_EXECUTION_INFO = 0x00040006,
|
||||
XEX_HEADER_TITLE_WORKSPACE_SIZE = 0x00040201,
|
||||
XEX_HEADER_GAME_RATINGS = 0x00040310,
|
||||
XEX_HEADER_LAN_KEY = 0x00040404,
|
||||
XEX_HEADER_XBOX360_LOGO = 0x000405FF,
|
||||
XEX_HEADER_MULTIDISC_MEDIA_IDS = 0x000406FF,
|
||||
XEX_HEADER_ALTERNATE_TITLE_IDS = 0x000407FF,
|
||||
XEX_HEADER_ADDITIONAL_TITLE_MEMORY = 0x00040801,
|
||||
XEX_HEADER_EXPORTS_BY_NAME = 0x00E10402,
|
||||
};
|
||||
|
||||
typedef struct _XEX_FILE_FORMAT_INFO
|
||||
{
|
||||
be<uint32_t> SizeOfHeader;
|
||||
be<uint16_t> EncryptionType;
|
||||
be<uint16_t> CompressionType;
|
||||
} XEX_FILE_FORMAT_INFO;
|
||||
|
||||
typedef struct _XEX_RESOURCE_INFO
|
||||
{
|
||||
be<uint32_t> SizeOfHeader;
|
||||
uint8_t ResourceID[8];
|
||||
be<uint32_t> Offset;
|
||||
be<uint32_t> SizeOfData;
|
||||
} XEX_RESOURCE_INFO;
|
||||
|
||||
typedef struct _XEX_BASIC_FILE_COMPRESSION_INFO
|
||||
{
|
||||
be<uint32_t> SizeOfData;
|
||||
be<uint32_t> SizeOfPadding;
|
||||
} XEX_BASIC_FILE_COMPRESSION_INFO;
|
||||
|
||||
typedef struct _XEX_THUNK_DATA {
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint16_t Ordinal : 16;
|
||||
uint16_t Hint : 8;
|
||||
uint16_t Type : 8;
|
||||
} OriginalData;
|
||||
|
||||
be<uint32_t> Ordinal;
|
||||
be<uint32_t> Function;
|
||||
be<uint32_t> AddressOfData;
|
||||
|
||||
// For easier swapping
|
||||
uint32_t Data;
|
||||
};
|
||||
} XEX_THUNK_DATA;
|
||||
|
||||
typedef struct _XEX_IMPORT_HEADER {
|
||||
be<uint32_t> SizeOfHeader;
|
||||
be<uint32_t> SizeOfStringTable;
|
||||
be<uint32_t> NumImports;
|
||||
} XEX_IMPORT_HEADER;
|
||||
|
||||
typedef struct _XEX_IMPORT_LIBRARY {
|
||||
be<uint32_t> Size;
|
||||
char NextImportDigest[0x14];
|
||||
be<uint32_t> ID;
|
||||
be<uint32_t> Version;
|
||||
be<uint32_t> MinVersion;
|
||||
be<uint16_t> Name;
|
||||
be<uint16_t> NumberOfImports;
|
||||
} XEX_IMPORT_LIBRARY;
|
||||
|
||||
static_assert(sizeof(XEX_IMPORT_LIBRARY) == 0x28);
|
||||
|
||||
typedef struct _XEX_IMPORT_DESCRIPTOR {
|
||||
be<uint32_t> FirstThunk; // VA XEX_THUNK_DATA
|
||||
} XEX_IMPORT_DESCRIPTOR;
|
||||
|
||||
typedef struct _XEX_OPTIONAL_HEADER
|
||||
{
|
||||
be<uint32_t> Type;
|
||||
be<uint32_t> Address;
|
||||
} XEX_OPTIONAL_HEADER;
|
||||
|
||||
typedef struct _XEX2_SECURITY_INFO
|
||||
{
|
||||
be<uint32_t> SizeOfHeader;
|
||||
be<uint32_t> SizeOfImage;
|
||||
char RsaSignature[0x100];
|
||||
be<uint32_t> Unknown108;
|
||||
be<uint32_t> ImageFlags;
|
||||
be<uint32_t> ImageBase;
|
||||
char SectionDigest[0x14];
|
||||
be<uint32_t> NumberOfImports;
|
||||
char ImportsDigest[0x14];
|
||||
char Xgd2MediaID[0x10];
|
||||
char AesKey[0x10];
|
||||
be<uint32_t> AddressOfExports;
|
||||
char HeaderDigest[0x14];
|
||||
be<uint32_t> Region;
|
||||
be<uint32_t> AllowedMediaTypes;
|
||||
be<uint32_t> NumberOfPageDescriptors;
|
||||
} XEX2_SECURITY_INFO;
|
||||
|
||||
typedef struct _XEX_HEADER
|
||||
{
|
||||
char Signature[4];
|
||||
be<uint32_t> Flags;
|
||||
be<uint32_t> SizeOfHeader;
|
||||
char Reserved[4];
|
||||
be<uint32_t> AddressOfSecurityInfo;
|
||||
be<uint32_t> NumberOfOptionalHeaders;
|
||||
} XEX_HEADER;
|
||||
|
||||
template<typename T>
|
||||
inline static const T* Xex2FindOptionalHeader(const void* base, const XEX_OPTIONAL_HEADER* headers, size_t n, _XEX_OPTIONAL_HEADER_TYPES type)
|
||||
{
|
||||
for (size_t i = 0; i < n; i++)
|
||||
{
|
||||
if (headers[i].Type == (uint32_t)type)
|
||||
{
|
||||
if ((type & 0xFF) == 0)
|
||||
{
|
||||
return reinterpret_cast<const T*>(&headers[i].Address);
|
||||
}
|
||||
else
|
||||
{
|
||||
return reinterpret_cast<const T*>(static_cast<const char*>(base) + headers[i].Address);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
inline static const T* Xex2FindOptionalHeader(const XEX_HEADER* header, _XEX_OPTIONAL_HEADER_TYPES type)
|
||||
{
|
||||
return Xex2FindOptionalHeader<T>(header, (XEX_OPTIONAL_HEADER*)(header + 1), header->NumberOfOptionalHeaders, type);
|
||||
}
|
||||
|
||||
struct Image;
|
||||
Image Xex2LoadImage(const uint8_t* data);
|
Reference in New Issue
Block a user