#pragma once #include #include #include #ifdef _WIN32 #include #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 #define CHECK_GUEST_HANDLE(HANDLE) (((HANDLE) & 0x80000000) == 0x80000000) #define GUEST_HANDLE(HANDLE) ((HANDLE) | 0x80000000) #define HOST_HANDLE(HANDLE) ((HANDLE) & ~0x80000000) template struct be { T value; be() : value(0) { } be(const T v) { set(v); } static T byteswap(T value) { if constexpr (std::is_same_v) { const uint64_t swapped = std::byteswap(*reinterpret_cast(&value)); return *reinterpret_cast(&swapped); } else if constexpr (std::is_same_v) { const uint32_t swapped = std::byteswap(*reinterpret_cast(&value)); return *reinterpret_cast(&swapped); } else { return std::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; } }; template struct xpointer { be ptr; xpointer(T* ptr) : ptr(ptr) { } T* get() const { if (!ptr.value) { return nullptr; } return static_cast(ptr); } operator T* () const { return get(); } T* operator->() const { return get(); } }; typedef BYTE XBYTE; typedef be XWORD; typedef be XDWORD; typedef be XQWORD; typedef XBYTE* XLPBYTE; typedef XWORD* XLPWORD; typedef XDWORD* XLPDWORD; typedef XQWORD* XLPQWORD; struct _XLIST_ENTRY; typedef _XLIST_ENTRY XLIST_ENTRY; typedef xpointer PXLIST_ENTRY; typedef struct _X_RUNTIME_FUNCTION { DWORD BeginAddress; union { DWORD Data; struct { DWORD FunctionType : 2; DWORD FunctionLength : 22; DWORD PrologLength : 8; }; }; } X_RUNTIME_FUNCTION; static_assert(sizeof(X_RUNTIME_FUNCTION) == 8); typedef struct _XLIST_ENTRY { XDWORD Flink; XDWORD Blink; } XLIST_ENTRY; typedef struct _XDISPATCHER_HEADER { union { struct { UCHAR Type; union { UCHAR Abandoned; UCHAR Absolute; UCHAR NpxIrql; UCHAR Signalling; }; union { UCHAR Size; UCHAR Hand; }; union { UCHAR Inserted; UCHAR DebugActive; UCHAR DpcActive; }; }; XDWORD Lock; }; XDWORD 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; long LockCount; int32_t RecursionCount; uint32_t OwningThread; } XRTL_CRITICAL_SECTION; typedef struct _XANSI_STRING { XWORD Length; XWORD MaximumLength; xpointer Buffer; } XANSI_STRING; typedef struct _XOBJECT_ATTRIBUTES { XDWORD RootDirectory; xpointer Name; xpointer Attributes; } XOBJECT_ATTRIBUTES; typedef XDISPATCHER_HEADER XKEVENT; typedef struct _XIO_STATUS_BLOCK { union { XDWORD Status; XDWORD Pointer; }; be Information; } XIO_STATUS_BLOCK; typedef struct _XOVERLAPPED { XDWORD Internal; XDWORD InternalHigh; XDWORD Offset; XDWORD OffsetHigh; XDWORD hEvent; } XOVERLAPPED; // this name is so dumb typedef struct _XXOVERLAPPED { union { struct { XDWORD Error; XDWORD Length; }; struct { uint32_t InternalLow; uint32_t InternalHigh; }; }; uint32_t InternalContext; XDWORD hEvent; XDWORD pCompletionRoutine; XDWORD dwCompletionContext; XDWORD dwExtendedError; } XXOVERLAPPED, *PXXOVERLAPPED; static_assert(sizeof(_XXOVERLAPPED) == 0x1C); typedef struct _XVIDEO_MODE { be DisplayWidth; be DisplayHeight; be IsInterlaced; be IsWidescreen; be IsHighDefinition; be RefreshRate; be VideoStandard; be Unknown4A; be Unknown01; be reserved[3]; } XVIDEO_MODE; typedef struct _XKSEMAPHORE { XDISPATCHER_HEADER Header; XDWORD Limit; } XKSEMAPHORE;