Linux support. (#3)

* Compiling and running on Linux.

* Fix xpointer constructor.

* Convert dependencies to submodules.

* Fix wchar_t usage for Linux.
This commit is contained in:
Skyth (Asilkan)
2024-12-21 00:49:06 +03:00
committed by GitHub
parent 45c00cfec6
commit 4650dc69fb
19 changed files with 295 additions and 201 deletions

View File

@@ -2,6 +2,7 @@
#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)
{

View File

@@ -5,15 +5,22 @@
#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 <intrin.h>
#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)

View File

@@ -7,45 +7,6 @@
#ifdef _WIN32
#include <windows.h>
#else
#define near
#define far
typedef char CHAR;
typedef wchar_t WCHAR;
typedef unsigned long DWORD;
typedef int BOOL;
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef float FLOAT;
typedef FLOAT* PFLOAT;
typedef BOOL near* PBOOL;
typedef BOOL far* LPBOOL;
typedef BYTE near* PBYTE;
typedef BYTE far* LPBYTE;
typedef int near* PINT;
typedef int far* LPINT;
typedef WORD near* PWORD;
typedef WORD far* LPWORD;
typedef long far* LPLONG;
typedef DWORD near* PDWORD;
typedef DWORD far* LPDWORD;
typedef void far* LPVOID;
typedef const void far* LPCVOID;
typedef unsigned long ULONG;
typedef ULONG* PULONG;
typedef signed long LONG;
typedef LONG* PLONG;
typedef unsigned long long ULONGLONG;
typedef ULONGLONG* PULONGLONG;
typedef unsigned short USHORT;
typedef USHORT* PUSHORT;
typedef unsigned char UCHAR;
typedef UCHAR* PUCHAR;
typedef char* PSZ;
typedef int INT;
typedef unsigned int UINT;
typedef unsigned int* PUINT;
#endif
// real win32 handles will never use the upper bits unless something goes really wrong
@@ -144,7 +105,7 @@ struct xpointer
{
}
xpointer(T* ptr) : ptr((uint32_t)ptr)
xpointer(T* ptr) : ptr(reinterpret_cast<size_t>(ptr) - reinterpret_cast<size_t>(MmGetHostAddress(0)))
{
}
@@ -175,33 +136,23 @@ struct HostObject
typedef TGuest guest_type;
};
typedef BYTE XBYTE;
typedef be<uint16_t> XWORD;
typedef be<uint32_t> XDWORD;
typedef be<uint64_t> XQWORD;
typedef XBYTE* XLPBYTE;
typedef XWORD* XLPWORD;
typedef XDWORD* XLPDWORD;
typedef XQWORD* XLPQWORD;
struct _XLIST_ENTRY;
typedef _XLIST_ENTRY XLIST_ENTRY;
typedef xpointer<XLIST_ENTRY> PXLIST_ENTRY;
typedef struct _IMAGE_CE_RUNTIME_FUNCTION
{
DWORD BeginAddress;
uint32_t BeginAddress;
union
{
DWORD Data;
uint32_t Data;
struct
{
DWORD PrologLength : 8;
DWORD FunctionLength : 22;
DWORD ThirtyTwoBit : 1;
DWORD ExceptionFlag : 1;
uint32_t PrologLength : 8;
uint32_t FunctionLength : 22;
uint32_t ThirtyTwoBit : 1;
uint32_t ExceptionFlag : 1;
};
};
} IMAGE_CE_RUNTIME_FUNCTION;
@@ -210,8 +161,8 @@ static_assert(sizeof(IMAGE_CE_RUNTIME_FUNCTION) == 8);
typedef struct _XLIST_ENTRY
{
XDWORD Flink;
XDWORD Blink;
be<uint32_t> Flink;
be<uint32_t> Blink;
} XLIST_ENTRY;
typedef struct _XDISPATCHER_HEADER
@@ -220,30 +171,30 @@ typedef struct _XDISPATCHER_HEADER
{
struct
{
UCHAR Type;
uint8_t Type;
union
{
UCHAR Abandoned;
UCHAR Absolute;
UCHAR NpxIrql;
UCHAR Signalling;
uint8_t Abandoned;
uint8_t Absolute;
uint8_t NpxIrql;
uint8_t Signalling;
};
union
{
UCHAR Size;
UCHAR Hand;
uint8_t Size;
uint8_t Hand;
};
union
{
UCHAR Inserted;
UCHAR DebugActive;
UCHAR DpcActive;
uint8_t Inserted;
uint8_t DebugActive;
uint8_t DpcActive;
};
};
XDWORD Lock;
be<uint32_t> Lock;
};
XDWORD SignalState;
be<uint32_t> SignalState;
XLIST_ENTRY WaitListHead;
} XDISPATCHER_HEADER, * XPDISPATCHER_HEADER;
@@ -251,20 +202,20 @@ typedef struct _XDISPATCHER_HEADER
typedef struct _XRTL_CRITICAL_SECTION
{
XDISPATCHER_HEADER Header;
long LockCount;
int32_t LockCount;
int32_t RecursionCount;
uint32_t OwningThread;
} XRTL_CRITICAL_SECTION;
typedef struct _XANSI_STRING {
XWORD Length;
XWORD MaximumLength;
be<uint16_t> Length;
be<uint16_t> MaximumLength;
xpointer<char> Buffer;
} XANSI_STRING;
typedef struct _XOBJECT_ATTRIBUTES
{
XDWORD RootDirectory;
be<uint32_t> RootDirectory;
xpointer<XANSI_STRING> Name;
xpointer<void> Attributes;
} XOBJECT_ATTRIBUTES;
@@ -274,18 +225,18 @@ typedef XDISPATCHER_HEADER XKEVENT;
typedef struct _XIO_STATUS_BLOCK
{
union {
XDWORD Status;
XDWORD Pointer;
be<uint32_t> Status;
be<uint32_t> Pointer;
};
be<uint32_t> Information;
} XIO_STATUS_BLOCK;
typedef struct _XOVERLAPPED {
XDWORD Internal;
XDWORD InternalHigh;
XDWORD Offset;
XDWORD OffsetHigh;
XDWORD hEvent;
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
@@ -294,8 +245,8 @@ typedef struct _XXOVERLAPPED {
{
struct
{
XDWORD Error;
XDWORD Length;
be<uint32_t> Error;
be<uint32_t> Length;
};
struct
@@ -305,24 +256,24 @@ typedef struct _XXOVERLAPPED {
};
};
uint32_t InternalContext;
XDWORD hEvent;
XDWORD pCompletionRoutine;
XDWORD dwCompletionContext;
XDWORD dwExtendedError;
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 {
XDWORD dwLength;
XDWORD dwMemoryLoad;
XDWORD dwTotalPhys;
XDWORD dwAvailPhys;
XDWORD dwTotalPageFile;
XDWORD dwAvailPageFile;
XDWORD dwTotalVirtual;
XDWORD dwAvailVirtual;
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
@@ -342,28 +293,28 @@ typedef struct _XVIDEO_MODE
typedef struct _XKSEMAPHORE
{
XDISPATCHER_HEADER Header;
XDWORD Limit;
be<uint32_t> Limit;
} XKSEMAPHORE;
typedef struct _XUSER_SIGNIN_INFO {
be<ULONGLONG> xuid;
XDWORD dwField08;
XDWORD SigninState;
XDWORD dwField10;
XDWORD dwField14;
CHAR Name[16];
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
{
XWORD Year;
XWORD Month;
XWORD Day;
XWORD Hour;
XWORD Minute;
XWORD Second;
XWORD Milliseconds;
XWORD Weekday;
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
@@ -380,10 +331,10 @@ typedef struct _XTIME_FIELDS
typedef struct _XCONTENT_DATA
{
XDWORD DeviceID;
XDWORD dwContentType;
be<WCHAR> szDisplayName[XCONTENT_MAX_DISPLAYNAME];
CHAR szFileName[XCONTENT_MAX_FILENAME];
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
@@ -398,11 +349,11 @@ typedef struct _XHOSTCONTENT_DATA : _XCONTENT_DATA
typedef struct _XDEVICE_DATA
{
XDWORD DeviceID;
XDWORD DeviceType;
XQWORD ulDeviceBytes;
XQWORD ulDeviceFreeBytes;
be<WCHAR> wszName[XCONTENTDEVICE_MAX_NAME];
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
@@ -427,32 +378,32 @@ typedef struct _XDEVICE_DATA
typedef struct _XAMINPUT_GAMEPAD
{
WORD wButtons;
BYTE bLeftTrigger;
BYTE bRightTrigger;
SHORT sThumbLX;
SHORT sThumbLY;
SHORT sThumbRX;
SHORT sThumbRY;
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
{
WORD wLeftMotorSpeed;
WORD wRightMotorSpeed;
uint16_t wLeftMotorSpeed;
uint16_t wRightMotorSpeed;
} XAMINPUT_VIBRATION, * PXAMINPUT_VIBRATION;
typedef struct _XAMINPUT_CAPABILITIES
{
BYTE Type;
BYTE SubType;
WORD Flags;
uint8_t Type;
uint8_t SubType;
uint16_t Flags;
XAMINPUT_GAMEPAD Gamepad;
XAMINPUT_VIBRATION Vibration;
} XAMINPUT_CAPABILITIES, * PXAMINPUT_CAPABILITIES;
typedef struct _XAMINPUT_STATE
{
DWORD dwPacketNumber;
uint32_t dwPacketNumber;
XAMINPUT_GAMEPAD Gamepad;
} XAMINPUT_STATE, * PXAMINPUT_STATE;

View File

@@ -1,12 +1,116 @@
#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"

View File

@@ -73,46 +73,46 @@ typedef struct _XEX_THUNK_DATA {
{
struct
{
WORD Ordinal : 16;
WORD Hint : 8;
WORD Type : 8;
uint16_t Ordinal : 16;
uint16_t Hint : 8;
uint16_t Type : 8;
} OriginalData;
XDWORD Ordinal;
XDWORD Function;
XDWORD AddressOfData;
be<uint32_t> Ordinal;
be<uint32_t> Function;
be<uint32_t> AddressOfData;
// For easier swapping
DWORD Data;
uint32_t Data;
};
} XEX_THUNK_DATA;
typedef struct _XEX_IMPORT_HEADER {
XDWORD SizeOfHeader;
XDWORD SizeOfStringTable;
XDWORD NumImports;
be<uint32_t> SizeOfHeader;
be<uint32_t> SizeOfStringTable;
be<uint32_t> NumImports;
} XEX_IMPORT_HEADER;
typedef struct _XEX_IMPORT_LIBRARY {
XDWORD Size;
be<uint32_t> Size;
char NextImportDigest[0x14];
XDWORD ID;
XDWORD Version;
XDWORD MinVersion;
XWORD Name;
XWORD NumberOfImports;
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 {
XDWORD FirstThunk; // VA XEX_THUNK_DATA
be<uint32_t> FirstThunk; // VA XEX_THUNK_DATA
} XEX_IMPORT_DESCRIPTOR;
typedef struct _XEX_OPTIONAL_HEADER
{
XDWORD Type;
XDWORD Address;
be<uint32_t> Type;
be<uint32_t> Address;
} XEX_OPTIONAL_HEADER;
typedef struct _XEX2_SECURITY_INFO