From 62ca60a64ebdba12780dc0c899ba84d4c80cb83a Mon Sep 17 00:00:00 2001 From: Phinehas Beresford <78656905+Cracko298@users.noreply.github.com> Date: Fri, 29 Sep 2023 10:18:44 -0400 Subject: [PATCH 01/11] Update README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 4c21cf5..0146944 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,10 @@ # UnrealModUnlocker-Public 1.0.4 +## Notes: +- **I'm not the best programmer in the world. (Keep that in mind).** + + + ## General Information: UnrealModUnlocker Public and UnrealModUnlocker Basic are NOT from the same codebase. From 0f36c0667c1162bdfcec5b87cd2176d1fe7cdce6 Mon Sep 17 00:00:00 2001 From: Phinehas Beresford <78656905+Cracko298@users.noreply.github.com> Date: Fri, 29 Sep 2023 10:23:52 -0400 Subject: [PATCH 02/11] Add files via upload --- exe_load/exe_loader(not_finished).cpp | 71 +++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 exe_load/exe_loader(not_finished).cpp diff --git a/exe_load/exe_loader(not_finished).cpp b/exe_load/exe_loader(not_finished).cpp new file mode 100644 index 0000000..6393f1d --- /dev/null +++ b/exe_load/exe_loader(not_finished).cpp @@ -0,0 +1,71 @@ +#include + +extern "C" +{ +int printf(const char *format, ...); +} + +void LoadISZPlugin() { + printf("Plugin Has Been Loaded.\n"); + char currentDirectory[MAX_PATH]; + GetCurrentDirectory(MAX_PATH, currentDirectory); // Current Path + + std::string configFile = currentDirectory; + configFile += "\\isz_plg.config"; // Set 'isz_plg.config' as config file (required) + + // Open the config file + HANDLE hFile = CreateFile(configFile.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + + if (hFile == INVALID_HANDLE_VALUE) { // If file doesn't exist + return; + } + + char buffer[1024]; + DWORD bytesRead; + int lineCount = 0; + + while (lineCount < 2) { + if (!ReadFile(hFile, buffer, sizeof(buffer), &bytesRead, NULL)) { + CloseHandle(hFile); + return; + } + + if (bytesRead == 0) { // Error Handle (eof) + CloseHandle(hFile); + return; + } + + for (DWORD i = 0; i < bytesRead; i++) { + if (buffer[i] == '\n') { + lineCount++; + if (lineCount == 2) { + buffer[i] = '\0'; + break; + } + } + } + } + + CloseHandle(hFile); + + char* secondLine = strchr(buffer, '\0') + 1; // Path to EXE (To Execute) + + while (1==1){ + printf("Example Code. Will put more here."); + printf(secondLine); + Sleep(100); + } +} + +BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { + switch (ul_reason_for_call) { + case DLL_PROCESS_ATTACH: + LoadISZPlugin(); + break; + case DLL_PROCESS_DETACH: + break; + default: + break; + } + return TRUE; +} \ No newline at end of file From 5811303dd2ef612e1868d9617bb2e201c9d46d97 Mon Sep 17 00:00:00 2001 From: Phinehas Beresford <78656905+Cracko298@users.noreply.github.com> Date: Fri, 29 Sep 2023 10:29:57 -0400 Subject: [PATCH 03/11] Update README.md --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0146944..d317c97 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,16 @@ # UnrealModUnlocker-Public 1.0.4 ## Notes: -- **I'm not the best programmer in the world. (Keep that in mind).** +- **I'm not the best programmer in the world (Keep that in mind).** +- **EXE Loader loads an Executable ModMenu/PluginLoader primarily for control over mods.** +### FaQ's: +#### Can this be used Maliciously? +- **Yes, it 100% can be. However you have to specific the executable you want to load in the 'isz_plg.config' file.** + +#### Why do I need/want this? +- **You don't "need" it. However if you want to automatically open an executable when UMU loads. You might want to check this out.** ## General Information: From 70800c355ee5e42d96d1cbb6ec0819a228731374 Mon Sep 17 00:00:00 2001 From: Phinehas Beresford <78656905+Cracko298@users.noreply.github.com> Date: Fri, 29 Sep 2023 10:33:28 -0400 Subject: [PATCH 04/11] Add files via upload --- exe_load/isz_plg.config | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 exe_load/isz_plg.config diff --git a/exe_load/isz_plg.config b/exe_load/isz_plg.config new file mode 100644 index 0000000..e794bb6 --- /dev/null +++ b/exe_load/isz_plg.config @@ -0,0 +1,2 @@ +[EXE_PATH] +C:\Users\batch_7236\Documents\exe_load\ISZ-Plugin-Loader\PluginLoader.exe \ No newline at end of file From 9729f0cfcf6b010ad66bf84286f7c7ebda86df26 Mon Sep 17 00:00:00 2001 From: Phinehas Beresford <78656905+Cracko298@users.noreply.github.com> Date: Fri, 29 Sep 2023 10:46:54 -0400 Subject: [PATCH 05/11] Update exe_loader(not_finished).cpp --- exe_load/exe_loader(not_finished).cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exe_load/exe_loader(not_finished).cpp b/exe_load/exe_loader(not_finished).cpp index 6393f1d..1b6bf1f 100644 --- a/exe_load/exe_loader(not_finished).cpp +++ b/exe_load/exe_loader(not_finished).cpp @@ -1,4 +1,4 @@ -#include +#include extern "C" { @@ -68,4 +68,4 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReser break; } return TRUE; -} \ No newline at end of file +} From 67bcecce56801ee53cf173fd672a5f518d6398e1 Mon Sep 17 00:00:00 2001 From: Phinehas Beresford <78656905+Cracko298@users.noreply.github.com> Date: Fri, 29 Sep 2023 10:51:58 -0400 Subject: [PATCH 06/11] Add files via upload --- exe_load/include/atomic.h | 277 ++ exe_load/include/dbghelp.h | 922 ++++++ exe_load/include/dds.h | 211 ++ exe_load/include/fiber.h | 103 + exe_load/include/file.h | 505 +++ exe_load/include/gdi.h | 62 + exe_load/include/intrin.h | 42 + exe_load/include/io.h | 366 +++ exe_load/include/make.bat | 51 + exe_load/include/misc.h | 390 +++ exe_load/include/process.h | 290 ++ exe_load/include/sysinfo.h | 596 ++++ exe_load/include/threads.h | 356 +++ exe_load/include/window.h | 386 +++ exe_load/include/windows.h | 4695 ++++++++++++++++++++++++++++ exe_load/include/windows_base.h | 393 +++ exe_load/include/windows_modular.h | 85 + 17 files changed, 9730 insertions(+) create mode 100644 exe_load/include/atomic.h create mode 100644 exe_load/include/dbghelp.h create mode 100644 exe_load/include/dds.h create mode 100644 exe_load/include/fiber.h create mode 100644 exe_load/include/file.h create mode 100644 exe_load/include/gdi.h create mode 100644 exe_load/include/intrin.h create mode 100644 exe_load/include/io.h create mode 100644 exe_load/include/make.bat create mode 100644 exe_load/include/misc.h create mode 100644 exe_load/include/process.h create mode 100644 exe_load/include/sysinfo.h create mode 100644 exe_load/include/threads.h create mode 100644 exe_load/include/window.h create mode 100644 exe_load/include/windows.h create mode 100644 exe_load/include/windows_base.h create mode 100644 exe_load/include/windows_modular.h diff --git a/exe_load/include/atomic.h b/exe_load/include/atomic.h new file mode 100644 index 0000000..b86d76f --- /dev/null +++ b/exe_load/include/atomic.h @@ -0,0 +1,277 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Arvid Gerstmann. All rights reserved. + */ +#ifndef _WINDOWS_ +#ifndef WINDOWS_ATOMIC_H +#define WINDOWS_ATOMIC_H + +/* Disable all warnings */ +#if defined(_MSC_VER) + #pragma warning(push, 0) +#endif + +#include "intrin.h" + +#if defined(__cplusplus) +extern "C" { +#endif + + +/* ========================================================================== */ +/* Atomic Functions: */ +/* ========================================================================== */ + +/* ========================================================================== */ +/* 8-Bit Atomic Intrinsics: */ +/* Exchange */ +char _InterlockedExchange8( + char volatile *Target, + char Value); +char _InterlockedExchangeAdd8( + char volatile *Addend, + char Value); + +/* Bit Operations */ +char _InterlockedExchangeAnd8( + char volatile *Destination, + char Value); +char _InterlockedExchangeOr8( + char volatile *Destination, + char Value); +char _InterlockedExchangeXor8( + char volatile *Destination, + char Value); + +/* Increment & Decrement */ +char _InterlockedDecrement8( + char volatile *Addend); +char _InterlockedIncrement8( + char volatile *Addend); + +/* Compare & Exchang */ +char _InterlockedCompareExchange8( + char volatile *Destination, + char Exchange, + char Comparand); +char _InterlockedCompareExchange8_HLEAcquire( + char volatile *Destination, + char Exchange, + char Comparand); +char _InterlockedCompareExchange8_HLERelease( + char volatile *Destination, + char Exchange, + char Comparand); + + +/* ========================================================================== */ +/* 16-Bit Atomic Intrinsics: */ +/* Exchange */ +short _InterlockedExchange16( + short volatile *Target, + short Value); +short _InterlockedExchangeAdd16( + short volatile *Addend, + short Value); + +/* Bit Operations */ +short _InterlockedExchangeAnd16( + short volatile *Destination, + short Value); +short _InterlockedExchangeOr16( + short volatile *Destination, + short Value); +short _InterlockedExchangeXor16( + short volatile *Destination, + short Value); + +/* Increment & Decrement */ +short _InterlockedDecrement16( + short volatile *Addend); +short _InterlockedIncrement16( + short volatile *Addend); + +/* Compare & Exchang */ +short _InterlockedCompareExchange16( + short volatile *Destination, + short Exchange, + short Comparand); +short _InterlockedCompareExchange16_HLEAcquire( + short volatile *Destination, + short Exchange, + short Comparand); +short _InterlockedCompareExchange16_HLERelease( + short volatile *Destination, + short Exchange, + short Comparand); + + +/* ========================================================================== */ +/* 32-Bit Atomic Intrinsics: */ +/* Exchange */ +long _InterlockedExchange( + long volatile *Target, + long Value); +long _InterlockedExchangeAdd( + long volatile *Addend, + long Value); + +/* Bit Operations */ +long _InterlockedExchangeAnd( + long volatile *Destination, + long Value); +long _InterlockedExchangeOr( + long volatile *Destination, + long Value); +long _InterlockedExchangeXor( + long volatile *Destination, + long Value); + +/* Increment & Decrement */ +long _InterlockedDecrement( + long volatile *Addend); +long _InterlockedIncrement( + long volatile *Addend); + +/* Compare & Exchang */ +long _InterlockedCompareExchange( + long volatile *Destination, + long Exchange, + long Comparand); +long _InterlockedCompareExchange_HLEAcquire( + long volatile *Destination, + long Exchange, + long Comparand); +long _InterlockedCompareExchange_HLERelease( + long volatile *Destination, + long Exchange, + long Comparand); + +/* ========================================================================== */ +/* 64-Bit Atomic Intrinsics: */ +#ifdef _AMD64_ +/* Exchange */ +__int64 _InterlockedExchange64( + __int64 volatile *Target, + __int64 Value); +__int64 _InterlockedExchangeAdd64( + __int64 volatile *Addend, + __int64 Value); + +/* Bit Operations */ +__int64 _InterlockedExchangeAnd64( + __int64 volatile *Destination, + __int64 Value); +__int64 _InterlockedExchangeOr64( + __int64 volatile *Destination, + __int64 Value); +__int64 _InterlockedExchangeXor64( + __int64 volatile *Destination, + __int64 Value); + +/* Increment & Decrement */ +__int64 _InterlockedDecrement64( + __int64 volatile *Addend); +__int64 _InterlockedIncrement64( + __int64 volatile *Addend); + +/* Compare & Exchang */ +__int64 _InterlockedCompareExchange64( + __int64 volatile *Destination, + __int64 Exchange, + __int64 Comparand); +__int64 _InterlockedCompareExchange64_HLEAcquire( + __int64 volatile *Destination, + __int64 Exchange, + __int64 Comparand); +__int64 _InterlockedCompareExchange64_HLERelease( + __int64 volatile *Destination, + __int64 Exchange, + __int64 Comparand); + +/* ========================================================================== */ +/* 128-Bit Atomic Intrinsics: */ +/* Exchange */ +unsigned char _InterlockedCompareExchange128( + __int64 volatile *Destination, + __int64 ExchangeHigh, + __int64 ExchangeLow, + __int64 *ComparandResult); + +#endif + +/* Win32 InterlockedXX functions are defined as macros */ +#define InterlockedExchange8 _InterlockedExchange8 +#define InterlockedExchangeAdd8 _InterlockedExchangeAdd8 +#define InterlockedExchangeAnd8 _InterlockedExchangeAnd8 +#define InterlockedExchangeOr8 _InterlockedExchangeOr8 +#define InterlockedExchangeXor8 _InterlockedExchangeXor8 +#define InterlockedDecrement8 _InterlockedDecrement8 +#define InterlockedIncrement8 _InterlockedIncrement8 +#define InterlockedCompareExchange8 _InterlockedCompareExchange8 + +#define InterlockedExchange16 _InterlockedExchange16 +#define InterlockedExchangeAdd16 _InterlockedExchangeAdd16 +#define InterlockedExchangeAnd16 _InterlockedExchangeAnd16 +#define InterlockedExchangeOr16 _InterlockedExchangeOr16 +#define InterlockedExchangeXor16 _InterlockedExchangeXor16 +#define InterlockedDecrement16 _InterlockedDecrement16 +#define InterlockedIncrement16 _InterlockedIncrement16 +#define InterlockedCompareExchange16 _InterlockedCompareExchange16 + +#define InterlockedExchange _InterlockedExchange +#define InterlockedExchangeAdd _InterlockedExchangeAdd +#define InterlockedExchangeAnd _InterlockedExchangeAnd +#define InterlockedExchangeOr _InterlockedExchangeOr +#define InterlockedExchangeXor _InterlockedExchangeXor +#define InterlockedDecrement _InterlockedDecrement +#define InterlockedIncrement _InterlockedIncrement +#define InterlockedCompareExchange _InterlockedCompareExchange + +#ifdef _AMD64_ + #define InterlockedExchange64 _InterlockedExchange64 + #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64 + #define InterlockedExchangeAnd64 _InterlockedExchangeAnd64 + #define InterlockedExchangeOr64 _InterlockedExchangeOr64 + #define InterlockedExchangeXor64 _InterlockedExchangeXor64 + #define InterlockedDecrement64 _InterlockedDecrement64 + #define InterlockedIncrement64 _InterlockedIncrement64 + #define InterlockedCompareExchange64 _InterlockedCompareExchange64 + + #define InterlockedCompareExchange128 _InterlockedCompareExchange128 +#endif + + +/* ========================================================================== */ +/* Barriers: */ +void _ReadWriteBarrier(void); +#pragma intrinsic(_ReadWriteBarrier) + +#ifdef _AMD64_ + #define MemoryBarrier __faststorefence + #define YieldProcessor _mm_pause + +#elif defined(_M_IX86) + FORCEINLINE void + MemoryBarrier(void) + { + LONG Barrier; + __asm { + xchg Barrier, eax + } + } + #define YieldProcessor __asm { rep nop } +#endif + +#if defined(__cplusplus) +} +#endif + +/* Enable all warnings */ +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + +#endif /* WINDOWS_ATOMIC_H */ +#endif /* _WINDOWS_ */ + diff --git a/exe_load/include/dbghelp.h b/exe_load/include/dbghelp.h new file mode 100644 index 0000000..ef9e2fd --- /dev/null +++ b/exe_load/include/dbghelp.h @@ -0,0 +1,922 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Arvid Gerstmann. All rights reserved. + */ +#ifndef _WINDOWS_ +#ifndef WINDOWS_DBGHELP_H +#define WINDOWS_DBGHELP_H + +/* Disable all warnings */ +#if defined(_MSC_VER) + #pragma warning(push, 0) +#endif + +#ifndef WINDOWS_BASE_H +#include "windows_base.h" +#endif +#if defined(__cplusplus) +extern "C" { +#endif + +/* Exceptions: */ +#define EXCEPTION_MAXIMUM_PARAMETERS 15 +#define EXCEPTION_EXECUTE_HANDLER 0x1 +#define EXCEPTION_CONTINUE_EXECUTION 0xFFFFFFFF +#define EXCEPTION_CONTINUE_SEARCH 0x0 + +#define EXCEPTION_ACCESS_VIOLATION ((DWORD)0xC0000005L) +#define EXCEPTION_DATATYPE_MISALIGNMENT ((DWORD)0x80000002L) +#define EXCEPTION_BREAKPOINT ((DWORD)0x80000003L) +#define EXCEPTION_SINGLE_STEP ((DWORD)0x80000004L) +#define EXCEPTION_ARRAY_BOUNDS_EXCEEDED ((DWORD)0xC000008CL) +#define EXCEPTION_FLT_DENORMAL_OPERAND ((DWORD)0xC000008DL) +#define EXCEPTION_FLT_DIVIDE_BY_ZERO ((DWORD)0xC000008EL) +#define EXCEPTION_FLT_INEXACT_RESULT ((DWORD)0xC000008FL) +#define EXCEPTION_FLT_INVALID_OPERATION ((DWORD)0xC0000090L) +#define EXCEPTION_FLT_OVERFLOW ((DWORD)0xC0000091L) +#define EXCEPTION_FLT_STACK_CHECK ((DWORD)0xC0000092L) +#define EXCEPTION_FLT_UNDERFLOW ((DWORD)0xC0000093L) +#define EXCEPTION_INT_DIVIDE_BY_ZERO ((DWORD)0xC0000094L) +#define EXCEPTION_INT_OVERFLOW ((DWORD)0xC0000095L) +#define EXCEPTION_PRIV_INSTRUCTION ((DWORD)0xC0000096L) +#define EXCEPTION_IN_PAGE_ERROR ((DWORD)0xC0000006L) +#define EXCEPTION_STACK_OVERFLOW ((DWORD)0xC00000FDL) +#define EXCEPTION_ILLEGAL_INSTRUCTION ((DWORD)0xC000001DL) +#define EXCEPTION_NONCONTINUABLE_EXCEPTION ((DWORD)0xC0000025L) +#define EXCEPTION_INVALID_DISPOSITION ((DWORD)0xC0000026L) +#define EXCEPTION_GUARD_PAGE ((DWORD)0x80000001L) +#define EXCEPTION_INVALID_HANDLE ((DWORD)0xC0000008L) +#define EXCEPTION_POSSIBLE_DEADLOCK ((DWORD)0xC0000194L) +#define CONTROL_C_EXIT ((DWORD)0xC000013AL) + +/* User defined. */ +#ifndef EXCEPTION_ASSERTION +#define EXCEPTION_ASSERTION ((DWORD)0xEF000001L) +#endif + +/* Snapshotting: */ +#define TH32CS_SNAPTHREAD 0x00000004 +#define IMAGE_FILE_MACHINE_I386 0x014c +#define IMAGE_FILE_MACHINE_AMD64 0x8664 +#define CONTEXT_AMD64 0x100000 +#define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L) +#define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L) +#define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L) +#define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L) +#define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L) + + +#define CONTEXT_FULL \ + (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT) + +#define CONTEXT_ALL \ + (CONTEXT_CONTROL |\ + CONTEXT_INTEGER |\ + CONTEXT_SEGMENTS |\ + CONTEXT_FLOATING_POINT |\ + CONTEXT_DEBUG_REGISTERS) + +/* Symbol Options: */ +#define SYMOPT_CASE_INSENSITIVE 0x00000001 +#define SYMOPT_UNDNAME 0x00000002 +#define SYMOPT_DEFERRED_LOADS 0x00000004 +#define SYMOPT_NO_CPP 0x00000008 +#define SYMOPT_LOAD_LINES 0x00000010 +#define SYMOPT_OMAP_FIND_NEAREST 0x00000020 +#define SYMOPT_LOAD_ANYTHING 0x00000040 +#define SYMOPT_IGNORE_CVREC 0x00000080 +#define SYMOPT_NO_UNQUALIFIED_LOADS 0x00000100 +#define SYMOPT_FAIL_CRITICAL_ERRORS 0x00000200 +#define SYMOPT_EXACT_SYMBOLS 0x00000400 +#define SYMOPT_ALLOW_ABSOLUTE_SYMBOLS 0x00000800 +#define SYMOPT_IGNORE_NT_SYMPATH 0x00001000 +#define SYMOPT_INCLUDE_32BIT_MODULES 0x00002000 +#define SYMOPT_PUBLICS_ONLY 0x00004000 +#define SYMOPT_NO_PUBLICS 0x00008000 +#define SYMOPT_AUTO_PUBLICS 0x00010000 +#define SYMOPT_NO_IMAGE_SEARCH 0x00020000 +#define SYMOPT_SECURE 0x00040000 +#define SYMOPT_NO_PROMPTS 0x00080000 +#define SYMOPT_OVERWRITE 0x00100000 +#define SYMOPT_IGNORE_IMAGEDIR 0x00200000 +#define SYMOPT_FLAT_DIRECTORY 0x00400000 +#define SYMOPT_FAVOR_COMPRESSED 0x00800000 +#define SYMOPT_ALLOW_ZERO_ADDRESS 0x01000000 +#define SYMOPT_DISABLE_SYMSRV_AUTODETECT 0x02000000 + +#define SYMOPT_DEBUG 0x80000000 + +enum SymTagEnum { + SymTagNull, + SymTagExe, + SymTagCompiland, + SymTagCompilandDetails, + SymTagCompilandEnv, + SymTagFunction, + SymTagBlock, + SymTagData, + SymTagAnnotation, + SymTagLabel, + SymTagPublicSymbol, + SymTagUDT, + SymTagEnum, + SymTagFunctionType, + SymTagPointerType, + SymTagArrayType, + SymTagBaseType, + SymTagTypedef, + SymTagBaseClass, + SymTagFriend, + SymTagFunctionArgType, + SymTagFuncDebugStart, + SymTagFuncDebugEnd, + SymTagUsingNamespace, + SymTagVTableShape, + SymTagVTable, + SymTagCustom, + SymTagThunk, + SymTagCustomType, + SymTagManagedType, + SymTagDimension, + SymTagCallSite, + SymTagInlineSite, + SymTagBaseInterface, + SymTagVectorType, + SymTagMatrixType, + SymTagHLSLType +}; + +/* Thread-Information Block: */ +typedef struct _NT_TIB { /* x86 / x64 */ + void * ExceptionList; /* 0x0000 / 0x0000 */ + void * StackBase; /* 0x0004 / 0x0008 */ + void * StackLimit; /* 0x0008 / 0x0010 */ + void * SubSystemTib; /* 0x000c / 0x0018 */ + union { + void * FiberData; /* 0x0010 / 0x0020 */ + DWORD Version; /* 0x0010 / 0x0020 */ + }; + void * ArbitraryUserPointer; /* 0x0014 / 0x0028 */ + struct _NT_TIB *Self; /* 0x0018 / 0x0030 */ +} NT_TIB, *LPNT_TIB, *PNT_TIB; + +/* Exceptions: */ +#if defined(_WIN64) +typedef struct DECLSPEC_ALIGN(16) _M128A { + ULONGLONG Low; + LONGLONG High; +} M128A, *PM128A; +typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT { + WORD ControlWord; + WORD StatusWord; + BYTE TagWord; + BYTE Reserved1; + WORD ErrorOpcode; + DWORD ErrorOffset; + WORD ErrorSelector; + WORD Reserved2; + DWORD DataOffset; + WORD DataSelector; + WORD Reserved3; + DWORD MxCsr; + DWORD MxCsr_Mask; + M128A FloatRegisters[8]; + +#if defined(_WIN64) + M128A XmmRegisters[16]; + BYTE Reserved4[96]; +#else + M128A XmmRegisters[8]; + BYTE Reserved4[192]; + + DWORD StackControl[7]; + DWORD Cr0NpxState; +#endif +} XSAVE_FORMAT, *PXSAVE_FORMAT; +typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32; + +typedef struct DECLSPEC_ALIGN(16) _CONTEXT { + DWORD64 P1Home; + DWORD64 P2Home; + DWORD64 P3Home; + DWORD64 P4Home; + DWORD64 P5Home; + DWORD64 P6Home; + + DWORD ContextFlags; + DWORD MxCsr; + + WORD SegCs; + WORD SegDs; + WORD SegEs; + WORD SegFs; + WORD SegGs; + WORD SegSs; + DWORD EFlags; + + DWORD64 Dr0; + DWORD64 Dr1; + DWORD64 Dr2; + DWORD64 Dr3; + DWORD64 Dr6; + DWORD64 Dr7; + + DWORD64 Rax; + DWORD64 Rcx; + DWORD64 Rdx; + DWORD64 Rbx; + DWORD64 Rsp; + DWORD64 Rbp; + DWORD64 Rsi; + DWORD64 Rdi; + DWORD64 R8; + DWORD64 R9; + DWORD64 R10; + DWORD64 R11; + DWORD64 R12; + DWORD64 R13; + DWORD64 R14; + DWORD64 R15; + DWORD64 Rip; + + union { + XMM_SAVE_AREA32 FltSave; + struct { + M128A Header[2]; + M128A Legacy[8]; + M128A Xmm0; + M128A Xmm1; + M128A Xmm2; + M128A Xmm3; + M128A Xmm4; + M128A Xmm5; + M128A Xmm6; + M128A Xmm7; + M128A Xmm8; + M128A Xmm9; + M128A Xmm10; + M128A Xmm11; + M128A Xmm12; + M128A Xmm13; + M128A Xmm14; + M128A Xmm15; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME; + + M128A VectorRegister[26]; + DWORD64 VectorControl; + + DWORD64 DebugControl; + DWORD64 LastBranchToRip; + DWORD64 LastBranchFromRip; + DWORD64 LastExceptionToRip; + DWORD64 LastExceptionFromRip; +} CONTEXT, *PCONTEXT; +typedef PCONTEXT LPCONTEXT; +#elif _WIN32 +typedef struct _FLOATING_SAVE_AREA +{ + ULONG ControlWord; + ULONG StatusWord; + ULONG TagWord; + ULONG ErrorOffset; + ULONG ErrorSelector; + ULONG DataOffset; + ULONG DataSelector; + UCHAR RegisterArea[80]; + ULONG Cr0NpxState; +} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA; +#define MAXIMUM_SUPPORTED_EXTENSION 512 +typedef struct _CONTEXT { + DWORD ContextFlags; + DWORD Dr0; + DWORD Dr1; + DWORD Dr2; + DWORD Dr3; + DWORD Dr6; + DWORD Dr7; + + FLOATING_SAVE_AREA FloatSave; + + DWORD SegGs; + DWORD SegFs; + DWORD SegEs; + DWORD SegDs; + + DWORD Edi; + DWORD Esi; + DWORD Ebx; + DWORD Edx; + DWORD Ecx; + DWORD Eax; + + DWORD Ebp; + DWORD Eip; + DWORD SegCs; + DWORD EFlags; + DWORD Esp; + DWORD SegSs; + + BYTE ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION]; + +} CONTEXT, *PCONTEXT; +typedef PCONTEXT LPCONTEXT; +#endif +typedef struct _EXCEPTION_RECORD { + DWORD ExceptionCode; + DWORD ExceptionFlags; + struct _EXCEPTION_RECORD * ExceptionRecord; + PVOID ExceptionAddress; + DWORD NumberParameters; + ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; +} EXCEPTION_RECORD, *PEXCEPTION_RECORD; +typedef struct _EXCEPTION_POINTERS { + PEXCEPTION_RECORD ExceptionRecord; + PCONTEXT ContextRecord; +} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS; +typedef PEXCEPTION_POINTERS LPEXCEPTION_POINTERS; +typedef LONG (WINAPI *PTOP_LEVEL_EXCEPTION_FILTER)( + struct _EXCEPTION_POINTERS *ExceptionInfo); +typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER; +typedef LONG (WINAPI *PVECTORED_EXCEPTION_HANDLER)( + struct _EXCEPTION_POINTERS *ExceptionInfo); + +/* Symbols: */ +typedef struct _SYMBOL_INFO { + ULONG SizeOfStruct; + ULONG TypeIndex; + ULONG64 Reserved[2]; + ULONG Index; + ULONG Size; + ULONG64 ModBase; + ULONG Flags; + ULONG64 Value; + ULONG64 Address; + ULONG Register; + ULONG Scope; + ULONG Tag; + ULONG NameLen; + ULONG MaxNameLen; + CHAR Name[1]; +} SYMBOL_INFO, *PSYMBOL_INFO; + +typedef struct _SYMBOL_INFOW { + ULONG SizeOfStruct; + ULONG TypeIndex; + ULONG64 Reserved[2]; + ULONG Index; + ULONG Size; + ULONG64 ModBase; + ULONG Flags; + ULONG64 Value; + ULONG64 Address; + ULONG Register; + ULONG Scope; + ULONG Tag; + ULONG NameLen; + ULONG MaxNameLen; + WCHAR Name[1]; +} SYMBOL_INFOW, *PSYMBOL_INFOW; + +typedef struct _IMAGEHLP_LINE64 { + DWORD SizeOfStruct; + PVOID Key; + DWORD LineNumber; + PCHAR FileName; + DWORD64 Address; +} IMAGEHLP_LINE64, *PIMAGEHLP_LINE64; + +typedef struct _IMAGEHLP_LINEW64 { + DWORD SizeOfStruct; + PVOID Key; + DWORD LineNumber; + PWSTR FileName; + DWORD64 Address; +} IMAGEHLP_LINEW64, *PIMAGEHLP_LINEW64; + +/* Thread Walking: */ +typedef struct tagTHREADENTRY32 { + DWORD dwSize; + DWORD cntUsage; + DWORD th32ThreadID; + DWORD th32OwnerProcessID; + LONG tpBasePri; + LONG tpDeltaPri; + DWORD dwFlags; +} THREADENTRY32, *PTHREADENTRY32; +typedef PTHREADENTRY32 LPTHREADENTRY32; + +/* Stack Walking: */ +typedef enum { + AddrMode1616, + AddrMode1632, + AddrModeReal, + AddrModeFlat +} ADDRESS_MODE; +typedef struct _tagADDRESS64 { + DWORD64 Offset; + WORD Segment; + ADDRESS_MODE Mode; +} ADDRESS64, *LPADDRESS64; +typedef struct _KDHELP64 { + DWORD64 Thread; + DWORD ThCallbackStack; + DWORD ThCallbackBStore; + DWORD NextCallback; + DWORD FramePointer; + DWORD64 KiCallUserMode; + DWORD64 KeUserCallbackDispatcher; + DWORD64 SystemRangeStart; + DWORD64 KiUserExceptionDispatcher; + DWORD64 StackBase; + DWORD64 StackLimit; + DWORD64 Reserved[5]; +} KDHELP64, *PKDHELP64; +typedef struct _tagSTACKFRAME64 { + ADDRESS64 AddrPC; + ADDRESS64 AddrReturn; + ADDRESS64 AddrFrame; + ADDRESS64 AddrStack; + ADDRESS64 AddrBStore; + PVOID FuncTableEntry; + DWORD64 Params[4]; + BOOL Far; + BOOL Virtual; + DWORD64 Reserved[3]; + KDHELP64 KdHelp; +} STACKFRAME64, *LPSTACKFRAME64; + +/* Some weird stuff: */ +typedef struct _LUID { + DWORD LowPart; + LONG HighPart; +} LUID, *PLUID; +#pragma pack(push,4) +typedef struct _LUID_AND_ATTRIBUTES { + LUID Luid; + DWORD Attributes; +} LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES; +#pragma pack(pop) +typedef struct _TOKEN_PRIVILEGES { + DWORD PrivilegeCount; + LUID_AND_ATTRIBUTES Privileges[1]; +} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES; + + +/* ========================================================================== */ +/* Debugging: */ +void WINAPI DebugBreak(void); +BOOL WINAPI IsDebuggerPresent(void); +BOOL WINAPI CheckRemoteDebuggerPresent( + HANDLE hProcess, + PBOOL hbDebuggerPresent); +void WINAPI OutputDebugStringA( + LPCSTR lpOutputString); +void WINAPI OutputDebugStringW( + LPCWSTR lpOutputString); +BOOL WINAPI GetThreadContext( + HANDLE hThread, + LPCONTEXT lpContext); +BOOL WINAPI DebugActiveProcess( + DWORD dwProcessId); +BOOL WINAPI DebugActiveProcessStop( + DWORD dwProcessId); + +/* ========================================================================== */ +/* Symbols: */ +DWORD WINAPI SymSetOptions( + DWORD SymOptions); +BOOL WINAPI SymInitialize( + HANDLE hProcess, + LPCSTR UserSearchPath, + BOOL fInvadeProcess); +BOOL WINAPI SymInitializeW( + HANDLE hProcess, + LPCWSTR UserSearchPath, + BOOL fInvadeProcess); +BOOL WINAPI SymFromAddr( + HANDLE hProcess, + DWORD64 Address, + PDWORD64 Displacement, + PSYMBOL_INFO Symbol); +BOOL WINAPI SymFromAddrW( + HANDLE hProcess, + DWORD64 Address, + PDWORD64 Displacement, + PSYMBOL_INFOW Symbol); +PVOID WINAPI SymFunctionTableAccess64( + HANDLE hProcess, + DWORD64 AddrBase); +DWORD64 WINAPI SymGetModuleBase64( + HANDLE hProcess, + DWORD64 dwAddr); +typedef BOOL (*PSYM_ENUMERATESYMBOLS_CALLBACK)( + PSYMBOL_INFO pSymInfo, + ULONG SymbolSize, + PVOID UserContext +); +typedef BOOL (*PSYM_ENUMERATESYMBOLS_CALLBACKW)( + PSYMBOL_INFOW pSymInfo, + ULONG SymbolSize, + PVOID UserContext +); +BOOL WINAPI SymSearch( + HANDLE hProcess, + ULONG64 BaseOfDll, + DWORD Index, + DWORD SymTag, + LPCSTR Mask, + DWORD64 Address, + PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback, + PVOID UserContext, + DWORD Options); +BOOL WINAPI SymSearchW( + HANDLE hProcess, + ULONG64 BaseOfDll, + DWORD Index, + DWORD SymTag, + LPCWSTR Mask, + DWORD64 Address, + PSYM_ENUMERATESYMBOLS_CALLBACKW EnumSymbolsCallback, + PVOID UserContext, + DWORD Options); +BOOL WINAPI SymRefreshModuleList( + HANDLE hProcess); + +typedef BOOL (*PSYM_ENUMMODULES_CALLBACK64)( + LPCSTR ModuleName, + DWORD64 BaseOfDll, + PVOID UserContext +); +typedef BOOL (*PSYM_ENUMMODULES_CALLBACKW64)( + LPCWSTR ModuleName, + DWORD64 BaseOfDll, + PVOID UserContext +); +BOOL WINAPI SymEnumerateModules64( + HANDLE hProcess, + PSYM_ENUMMODULES_CALLBACK64 EnumModulesCallback, + PVOID UserContext +); +BOOL WINAPI SymEnumerateModulesW64( + HANDLE hProcess, + PSYM_ENUMMODULES_CALLBACKW64 EnumModulesCallback, + PVOID UserContext +); + +BOOL WINAPI SymSetSearchPath( + HANDLE hProcess, + LPCSTR SearchPath); +BOOL WINAPI SymSetSearchPathW( + HANDLE hProcess, + LPCWSTR SearchPath); + +BOOL WINAPI SymGetSearchPath( + HANDLE hProcess, + LPSTR SearchPath, + DWORD SearchPathLength); +BOOL WINAPI SymGetSearchPathW( + HANDLE hProcess, + LPWSTR SearchPath, + DWORD SearchPathLength); + +BOOL WINAPI SymCleanup( + HANDLE hProcess); + +BOOL WINAPI SymGetLineFromAddr64( + HANDLE hProcess, + DWORD64 dwAddr, + PDWORD pdwDisplacement, + PIMAGEHLP_LINE64 Line +); + +BOOL WINAPI SymGetLineFromAddrW64( + HANDLE hProcess, + DWORD64 dwAddr, + PDWORD pdwDisplacement, + PIMAGEHLP_LINEW64 Line +); + +/* ========================================================================== */ +/* Exceptions: */ +LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter( + LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter); +LONG WINAPI UnhandledExceptionFilter( + struct _EXCEPTION_POINTERS * ExceptionInfo); + +PVOID WINAPI AddVectoredExceptionHandler( + ULONG FirstHandler, + PVECTORED_EXCEPTION_HANDLER VectoredHandler); + +ULONG WINAPI RemoveVectoredExceptionHandler( + PVOID Handler); + +#define CaptureStackBackTrace RtlCaptureStackBackTrace +USHORT WINAPI RtlCaptureStackBackTrace( + ULONG FramesToSkip, + ULONG FramesToCapture, + PVOID * BackTrace, + PULONG BackTraceHash); +void WINAPI RtlCaptureContext( + PCONTEXT ContextRecord); +void WINAPI RaiseException( + DWORD dwExceptionCode, + DWORD dwExceptionFlags, + DWORD nNumberOfArguments, + const ULONG_PTR * lpArguments); + +/* ========================================================================== */ +/* Thread Walking: */ +HANDLE WINAPI CreateToolhelp32Snapshot( + DWORD dwFlags, + DWORD th32ProcessID); +BOOL WINAPI Thread32First( + HANDLE hSnapshot, + LPTHREADENTRY32 lpte); +BOOL WINAPI Thread32Next( + HANDLE hSnapshot, + LPTHREADENTRY32 lpte); + +/* ========================================================================== */ +/* Stack Walking: */ +typedef BOOL (__stdcall *PREAD_PROCESS_MEMORY_ROUTINE64)( + HANDLE hProcess, + DWORD64 qwBaseAddress, + PVOID lpBuffer, + DWORD nSize, + LPDWORD lpNumberOfBytesRead); + +typedef PVOID (__stdcall *PFUNCTION_TABLE_ACCESS_ROUTINE64)( + HANDLE ahProcess, + DWORD64 AddrBase); + +typedef DWORD64 (__stdcall *PGET_MODULE_BASE_ROUTINE64)( + HANDLE hProcess, + DWORD64 Address); + +typedef DWORD64 (__stdcall *PTRANSLATE_ADDRESS_ROUTINE64)( + HANDLE hProcess, + HANDLE hThread, + LPADDRESS64 lpaddr); + +BOOL WINAPI StackWalk64( + DWORD MachineType, + HANDLE hProcess, + HANDLE hThread, + LPSTACKFRAME64 StackFrame, + PVOID ContextRecord, + PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, + PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, + PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine, + PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress +); + +/* ========================================================================== */ +/* Minidumps: */ +/* == VS Version == */ +typedef struct tagVS_FIXEDFILEINFO +{ + DWORD dwSignature; /* e.g. 0xfeef04bd */ + DWORD dwStrucVersion; /* e.g. 0x00000042 = "0.42" */ + DWORD dwFileVersionMS; /* e.g. 0x00030075 = "3.75" */ + DWORD dwFileVersionLS; /* e.g. 0x00000031 = "0.31" */ + DWORD dwProductVersionMS; /* e.g. 0x00030010 = "3.10" */ + DWORD dwProductVersionLS; /* e.g. 0x00000031 = "0.31" */ + DWORD dwFileFlagsMask; /* = 0x3F for version "0.42" */ + DWORD dwFileFlags; /* e.g. VFF_DEBUG | VFF_PRERELEASE */ + DWORD dwFileOS; /* e.g. VOS_DOS_WINDOWS16 */ + DWORD dwFileType; /* e.g. VFT_DRIVER */ + DWORD dwFileSubtype; /* e.g. VFT2_DRV_KEYBOARD */ + DWORD dwFileDateMS; /* e.g. 0 */ + DWORD dwFileDateLS; /* e.g. 0 */ +} VS_FIXEDFILEINFO; + +/* == Type == */ +typedef enum _MINIDUMP_TYPE { + MiniDumpNormal = 0x00000000, + MiniDumpWithDataSegs = 0x00000001, + MiniDumpWithFullMemory = 0x00000002, + MiniDumpWithHandleData = 0x00000004, + MiniDumpFilterMemory = 0x00000008, + MiniDumpScanMemory = 0x00000010, + MiniDumpWithUnloadedModules = 0x00000020, + MiniDumpWithIndirectlyReferencedMemory = 0x00000040, + MiniDumpFilterModulePaths = 0x00000080, + MiniDumpWithProcessThreadData = 0x00000100, + MiniDumpWithPrivateReadWriteMemory = 0x00000200, + MiniDumpWithoutOptionalData = 0x00000400, + MiniDumpWithFullMemoryInfo = 0x00000800, + MiniDumpWithThreadInfo = 0x00001000, + MiniDumpWithCodeSegs = 0x00002000, + MiniDumpWithoutAuxiliaryState = 0x00004000, + MiniDumpWithFullAuxiliaryState = 0x00008000, + MiniDumpWithPrivateWriteCopyMemory = 0x00010000, + MiniDumpIgnoreInaccessibleMemory = 0x00020000, + MiniDumpWithTokenInformation = 0x00040000, + MiniDumpValidTypeFlags = 0x0007ffff, +} MINIDUMP_TYPE; + +/* == Exception Info == */ +typedef struct _MINIDUMP_EXCEPTION_INFORMATION { + DWORD ThreadId; + PEXCEPTION_POINTERS ExceptionPointers; + BOOL ClientPointers; +} MINIDUMP_EXCEPTION_INFORMATION, *PMINIDUMP_EXCEPTION_INFORMATION; +typedef struct _MINIDUMP_EXCEPTION_INFORMATION64 { + DWORD ThreadId; + ULONG64 ExceptionRecord; + ULONG64 ContextRecord; + BOOL ClientPointers; +} MINIDUMP_EXCEPTION_INFORMATION64, *PMINIDUMP_EXCEPTION_INFORMATION64; + +/* == Callback Input Hell == */ +typedef struct _MINIDUMP_THREAD_CALLBACK { + ULONG ThreadId; + HANDLE ThreadHandle; + CONTEXT Context; + ULONG SizeOfContext; + ULONG64 StackBase; + ULONG64 StackEnd; +} MINIDUMP_THREAD_CALLBACK, *PMINIDUMP_THREAD_CALLBACK; +typedef struct _MINIDUMP_THREAD_EX_CALLBACK { + ULONG ThreadId; + HANDLE ThreadHandle; + CONTEXT Context; + ULONG SizeOfContext; + ULONG64 StackBase; + ULONG64 StackEnd; + ULONG64 BackingStoreBase; + ULONG64 BackingStoreEnd; +} MINIDUMP_THREAD_EX_CALLBACK, *PMINIDUMP_THREAD_EX_CALLBACK; +typedef struct _MINIDUMP_MODULE_CALLBACK { + PWCHAR FullPath; + ULONG64 BaseOfImage; + ULONG SizeOfImage; + ULONG CheckSum; + ULONG TimeDateStamp; + VS_FIXEDFILEINFO VersionInfo; + PVOID CvRecord; + ULONG SizeOfCvRecord; + PVOID MiscRecord; + ULONG SizeOfMiscRecord; +} MINIDUMP_MODULE_CALLBACK, *PMINIDUMP_MODULE_CALLBACK; +typedef struct _MINIDUMP_INCLUDE_THREAD_CALLBACK { + ULONG ThreadId; +} MINIDUMP_INCLUDE_THREAD_CALLBACK, *PMINIDUMP_INCLUDE_THREAD_CALLBACK; +typedef struct _MINIDUMP_INCLUDE_MODULE_CALLBACK { + ULONG64 BaseOfImage; +} MINIDUMP_INCLUDE_MODULE_CALLBACK, *PMINIDUMP_INCLUDE_MODULE_CALLBACK; +typedef struct _MINIDUMP_IO_CALLBACK { + HANDLE Handle; + ULONG64 Offset; + PVOID Buffer; + ULONG BufferBytes; +} MINIDUMP_IO_CALLBACK, *PMINIDUMP_IO_CALLBACK; +typedef struct _MINIDUMP_READ_MEMORY_FAILURE_CALLBACK +{ + ULONG64 Offset; + ULONG Bytes; + HRESULT FailureStatus; +} MINIDUMP_READ_MEMORY_FAILURE_CALLBACK, + *PMINIDUMP_READ_MEMORY_FAILURE_CALLBACK; +typedef struct _MINIDUMP_CALLBACK_INPUT { + ULONG ProcessId; + HANDLE ProcessHandle; + ULONG CallbackType; + union { + HRESULT Status; + MINIDUMP_THREAD_CALLBACK Thread; + MINIDUMP_THREAD_EX_CALLBACK ThreadEx; + MINIDUMP_MODULE_CALLBACK Module; + MINIDUMP_INCLUDE_THREAD_CALLBACK IncludeThread; + MINIDUMP_INCLUDE_MODULE_CALLBACK IncludeModule; + MINIDUMP_IO_CALLBACK Io; + MINIDUMP_READ_MEMORY_FAILURE_CALLBACK ReadMemoryFailure; + ULONG SecondaryFlags; + }; +} MINIDUMP_CALLBACK_INPUT, *PMINIDUMP_CALLBACK_INPUT; + +/* == Callback Output Hell == */ +typedef struct _MINIDUMP_MEMORY_INFO { + ULONG64 BaseAddress; + ULONG64 AllocationBase; + ULONG32 AllocationProtect; + ULONG32 __alignment1; + ULONG64 RegionSize; + ULONG32 State; + ULONG32 Protect; + ULONG32 Type; + ULONG32 __alignment2; +} MINIDUMP_MEMORY_INFO, *PMINIDUMP_MEMORY_INFO; +typedef struct _MINIDUMP_CALLBACK_OUTPUT { + union { + ULONG ModuleWriteFlags; + ULONG ThreadWriteFlags; + ULONG SecondaryFlags; + struct { + ULONG64 MemoryBase; + ULONG MemorySize; + }; + struct { + BOOL CheckCancel; + BOOL Cancel; + }; + HANDLE Handle; + struct { + MINIDUMP_MEMORY_INFO VmRegion; + BOOL Continue; + }; + HRESULT Status; + }; +} MINIDUMP_CALLBACK_OUTPUT, *PMINIDUMP_CALLBACK_OUTPUT; + +/* == Callback Hell == */ +typedef BOOL (WINAPI *MINIDUMP_CALLBACK_ROUTINE)( + PVOID CallbackParam, + PMINIDUMP_CALLBACK_INPUT CallbackInput, + PMINIDUMP_CALLBACK_OUTPUT CallbackOutput); +typedef struct _MINIDUMP_CALLBACK_INFORMATION { + MINIDUMP_CALLBACK_ROUTINE CallbackRoutine; + PVOID CallbackParam; +} MINIDUMP_CALLBACK_INFORMATION, *PMINIDUMP_CALLBACK_INFORMATION; + +/* == User Stream Information == */ +typedef struct _MINIDUMP_USER_STREAM { + ULONG32 Type; + ULONG BufferSize; + PVOID Buffer; +} MINIDUMP_USER_STREAM, *PMINIDUMP_USER_STREAM; +typedef struct _MINIDUMP_USER_STREAM_INFORMATION { + ULONG UserStreamCount; + PMINIDUMP_USER_STREAM UserStreamArray; +} MINIDUMP_USER_STREAM_INFORMATION, *PMINIDUMP_USER_STREAM_INFORMATION; + +/* Function (all this shit above is required for this simple function). */ +BOOL WINAPI MiniDumpWriteDump( + HANDLE hProcess, + DWORD ProcessId, + HANDLE hFile, + MINIDUMP_TYPE DumpType, + PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, + PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, + PMINIDUMP_CALLBACK_INFORMATION CallbackParam); + +/* Priviliges: */ +BOOL WINAPI OpenProcessToken ( + HANDLE ProcessHandle, + DWORD DesiredAccess, + PHANDLE TokenHandle); +BOOL WINAPI LookupPrivilegeValueA( + LPCSTR lpSystemName, + LPCSTR lpName, + PLUID lpLuid); +BOOL WINAPI LookupPrivilegeValueW( + LPCWSTR lpSystemName, + LPCWSTR lpName, + PLUID lpLuid); +BOOL WINAPI AdjustTokenPrivileges( + HANDLE TokenHandle, + BOOL DisableAllPrivileges, + PTOKEN_PRIVILEGES NewState, + DWORD BufferLength, + PTOKEN_PRIVILEGES PreviousState, + PDWORD ReturnLength); + +/* ========================================================================== */ +/* Segment Registers: */ +void __debugbreak(void); +#if _WIN64 +unsigned char __readgsbyte(unsigned long Offset); +unsigned short __readgsword(unsigned long Offset); +unsigned long __readgsdword(unsigned long Offset); +unsigned __int64 __readgsqword(unsigned long Offset); +#else +unsigned char __readfsbyte(unsigned long Offset); +unsigned short __readfsword(unsigned long Offset); +unsigned long __readfsdword(unsigned long Offset); +unsigned __int64 __readfsqword(unsigned long Offset); +#endif + +static NT_TIB * +GetTib(void) +{ +#if _WIN64 + return (NT_TIB *)__readgsqword(0x30); +#else + return (NT_TIB *)__readfsdword(0x18); +#endif +} + + +#if defined(__cplusplus) +} +#endif + +/* Enable all warnings */ +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + +#endif /* WINDOWS_DBGHELP_H */ +#endif /* _WINDOWS_ */ + diff --git a/exe_load/include/dds.h b/exe_load/include/dds.h new file mode 100644 index 0000000..5b0d343 --- /dev/null +++ b/exe_load/include/dds.h @@ -0,0 +1,211 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Arvid Gerstmann. All rights reserved. + */ +#ifndef _WINDOWS_ +#ifndef WINDOWS_DDS_H +#define WINDOWS_DDS_H + +/* Disable all warnings */ +#if defined(_MSC_VER) + #pragma warning(push, 0) +#endif + +#ifndef WINDOWS_BASE_H +#include "windows_base.h" +#endif +#if defined(__cplusplus) +extern "C" { +#endif + +#ifndef DXGI_FORMAT_DEFINED +#define DXGI_FORMAT_DEFINED 1 +typedef enum DXGI_FORMAT +{ + DXGI_FORMAT_UNKNOWN = 0, + DXGI_FORMAT_R32G32B32A32_TYPELESS = 1, + DXGI_FORMAT_R32G32B32A32_FLOAT = 2, + DXGI_FORMAT_R32G32B32A32_UINT = 3, + DXGI_FORMAT_R32G32B32A32_SINT = 4, + DXGI_FORMAT_R32G32B32_TYPELESS = 5, + DXGI_FORMAT_R32G32B32_FLOAT = 6, + DXGI_FORMAT_R32G32B32_UINT = 7, + DXGI_FORMAT_R32G32B32_SINT = 8, + DXGI_FORMAT_R16G16B16A16_TYPELESS = 9, + DXGI_FORMAT_R16G16B16A16_FLOAT = 10, + DXGI_FORMAT_R16G16B16A16_UNORM = 11, + DXGI_FORMAT_R16G16B16A16_UINT = 12, + DXGI_FORMAT_R16G16B16A16_SNORM = 13, + DXGI_FORMAT_R16G16B16A16_SINT = 14, + DXGI_FORMAT_R32G32_TYPELESS = 15, + DXGI_FORMAT_R32G32_FLOAT = 16, + DXGI_FORMAT_R32G32_UINT = 17, + DXGI_FORMAT_R32G32_SINT = 18, + DXGI_FORMAT_R32G8X24_TYPELESS = 19, + DXGI_FORMAT_D32_FLOAT_S8X24_UINT = 20, + DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS = 21, + DXGI_FORMAT_X32_TYPELESS_G8X24_UINT = 22, + DXGI_FORMAT_R10G10B10A2_TYPELESS = 23, + DXGI_FORMAT_R10G10B10A2_UNORM = 24, + DXGI_FORMAT_R10G10B10A2_UINT = 25, + DXGI_FORMAT_R11G11B10_FLOAT = 26, + DXGI_FORMAT_R8G8B8A8_TYPELESS = 27, + DXGI_FORMAT_R8G8B8A8_UNORM = 28, + DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = 29, + DXGI_FORMAT_R8G8B8A8_UINT = 30, + DXGI_FORMAT_R8G8B8A8_SNORM = 31, + DXGI_FORMAT_R8G8B8A8_SINT = 32, + DXGI_FORMAT_R16G16_TYPELESS = 33, + DXGI_FORMAT_R16G16_FLOAT = 34, + DXGI_FORMAT_R16G16_UNORM = 35, + DXGI_FORMAT_R16G16_UINT = 36, + DXGI_FORMAT_R16G16_SNORM = 37, + DXGI_FORMAT_R16G16_SINT = 38, + DXGI_FORMAT_R32_TYPELESS = 39, + DXGI_FORMAT_D32_FLOAT = 40, + DXGI_FORMAT_R32_FLOAT = 41, + DXGI_FORMAT_R32_UINT = 42, + DXGI_FORMAT_R32_SINT = 43, + DXGI_FORMAT_R24G8_TYPELESS = 44, + DXGI_FORMAT_D24_UNORM_S8_UINT = 45, + DXGI_FORMAT_R24_UNORM_X8_TYPELESS = 46, + DXGI_FORMAT_X24_TYPELESS_G8_UINT = 47, + DXGI_FORMAT_R8G8_TYPELESS = 48, + DXGI_FORMAT_R8G8_UNORM = 49, + DXGI_FORMAT_R8G8_UINT = 50, + DXGI_FORMAT_R8G8_SNORM = 51, + DXGI_FORMAT_R8G8_SINT = 52, + DXGI_FORMAT_R16_TYPELESS = 53, + DXGI_FORMAT_R16_FLOAT = 54, + DXGI_FORMAT_D16_UNORM = 55, + DXGI_FORMAT_R16_UNORM = 56, + DXGI_FORMAT_R16_UINT = 57, + DXGI_FORMAT_R16_SNORM = 58, + DXGI_FORMAT_R16_SINT = 59, + DXGI_FORMAT_R8_TYPELESS = 60, + DXGI_FORMAT_R8_UNORM = 61, + DXGI_FORMAT_R8_UINT = 62, + DXGI_FORMAT_R8_SNORM = 63, + DXGI_FORMAT_R8_SINT = 64, + DXGI_FORMAT_A8_UNORM = 65, + DXGI_FORMAT_R1_UNORM = 66, + DXGI_FORMAT_R9G9B9E5_SHAREDEXP = 67, + DXGI_FORMAT_R8G8_B8G8_UNORM = 68, + DXGI_FORMAT_G8R8_G8B8_UNORM = 69, + DXGI_FORMAT_BC1_TYPELESS = 70, + DXGI_FORMAT_BC1_UNORM = 71, + DXGI_FORMAT_BC1_UNORM_SRGB = 72, + DXGI_FORMAT_BC2_TYPELESS = 73, + DXGI_FORMAT_BC2_UNORM = 74, + DXGI_FORMAT_BC2_UNORM_SRGB = 75, + DXGI_FORMAT_BC3_TYPELESS = 76, + DXGI_FORMAT_BC3_UNORM = 77, + DXGI_FORMAT_BC3_UNORM_SRGB = 78, + DXGI_FORMAT_BC4_TYPELESS = 79, + DXGI_FORMAT_BC4_UNORM = 80, + DXGI_FORMAT_BC4_SNORM = 81, + DXGI_FORMAT_BC5_TYPELESS = 82, + DXGI_FORMAT_BC5_UNORM = 83, + DXGI_FORMAT_BC5_SNORM = 84, + DXGI_FORMAT_B5G6R5_UNORM = 85, + DXGI_FORMAT_B5G5R5A1_UNORM = 86, + DXGI_FORMAT_B8G8R8A8_UNORM = 87, + DXGI_FORMAT_B8G8R8X8_UNORM = 88, + DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM = 89, + DXGI_FORMAT_B8G8R8A8_TYPELESS = 90, + DXGI_FORMAT_B8G8R8A8_UNORM_SRGB = 91, + DXGI_FORMAT_B8G8R8X8_TYPELESS = 92, + DXGI_FORMAT_B8G8R8X8_UNORM_SRGB = 93, + DXGI_FORMAT_BC6H_TYPELESS = 94, + DXGI_FORMAT_BC6H_UF16 = 95, + DXGI_FORMAT_BC6H_SF16 = 96, + DXGI_FORMAT_BC7_TYPELESS = 97, + DXGI_FORMAT_BC7_UNORM = 98, + DXGI_FORMAT_BC7_UNORM_SRGB = 99, + DXGI_FORMAT_FORCE_UINT = 0xffffffff +} DXGI_FORMAT; +#endif + +/* Value for magic header */ +#define FOURCC_DDS (0x20534444) + +/* Values for DDS_PIXELFORMAT.dwFlags */ +#define DDPF_FOURCC (0x00000004) + +#pragma pack(push,1) + +typedef struct { + DWORD dwSize; + DWORD dwFlags; + DWORD dwFourCC; + DWORD dwRGBBitCount; + DWORD dwRBitMask; + DWORD dwGBitMask; + DWORD dwBBitMask; + DWORD dwABitMask; +} DDS_PIXELFORMAT; + +typedef struct { + DWORD dwSize; + DWORD dwHeaderFlags; + DWORD dwHeight; + DWORD dwWidth; + DWORD dwPitchOrLinearSize; + DWORD dwDepth; // only if DDS_HEADER_FLAGS_VOLUME is set in dwHeaderFlags + DWORD dwMipMapCount; + DWORD dwReserved1[11]; + DDS_PIXELFORMAT ddspf; + DWORD dwSurfaceFlags; + DWORD dwCubemapFlags; + DWORD dwReserved2[3]; +} DDS_HEADER; + +typedef struct { + DXGI_FORMAT dxgiFormat; + UINT resourceDimension; + UINT miscFlag; + UINT arraySize; + UINT reserved; +} DDS_HEADER_DXT10; + +/* Values for DDS_PIXELFORMAT.dwFourCC */ +#define FMT_DX10 (0x30315844) +#define FMT_DXT1 (0x31545844) /* DXGI_FORMAT_BC1_UNORM */ +#define FMT_DXT3 (0x33545844) /* DXGI_FORMAT_BC2_UNORM */ +#define FMT_DXT5 (0x35545844) /* DXGI_FORMAT_BC3_UNORM */ + +/* Values for dwFlags */ +#define DDSD_CAPS 0x00000001 +#define DDSD_HEIGHT 0x00000002 +#define DDSD_WIDTH 0x00000004 +#define DDSD_PITCH 0x00000008 +#define DDSD_PIXELFORMAT 0x00001000 +#define DDSD_MIPMAPCOUNT 0x00020000 +#define DDSD_LINEARSIZE 0x00080000 +#define DDSD_DEPTH 0x00800000 + +/* Values for dwCaps */ +#define DDSCAPS_COMPLEX 0x00000008 +#define DDSCAPS_MIPMAP 0x04000000 +#define DDSCAPS_TEXTURE 0x00001000 + +/* Blocksizes */ +#define BLOCKSIZE_DXT1 0x8 +#define BLOCKSIZE_DXT3 0x10 +#define BLOCKSIZE_DXT5 0x10 + +#pragma pack(pop) + + +#if defined(__cplusplus) +} +#endif + +/* Enable all warnings */ +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + +#endif /* WINDOWS_DDS_H */ +#endif /* _WINDOWS_ */ + diff --git a/exe_load/include/fiber.h b/exe_load/include/fiber.h new file mode 100644 index 0000000..4c7038c --- /dev/null +++ b/exe_load/include/fiber.h @@ -0,0 +1,103 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Arvid Gerstmann. All rights reserved. + */ +#ifndef _WINDOWS_ +#ifndef WINDOWS_FIBER_H +#define WINDOWS_FIBER_H + +/* Disable all warnings */ +#if defined(_MSC_VER) + #pragma warning(push, 0) +#endif + +#ifndef WINDOWS_BASE_H + #include "windows_base.h" +#endif + +/* dbghelp contains __readfsdword / __readgsqword */ +#ifndef WINDOWS_DBGHELP_H + #include "dbghelp.h" +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + + +/* ========================================================================= */ +/* Fiber */ +/* ========================================================================= */ +typedef void (WINAPI *PFIBER_START_ROUTINE)(LPVOID lpFiberParameter); +typedef PFIBER_START_ROUTINE LPFIBER_START_ROUTINE; +typedef void(NTAPI *PFLS_CALLBACK_FUNCTION)(PVOID lpFlsData); + +BOOL WINAPI IsThreadAFiber(void); + +void WINAPI SwitchToFiber(LPVOID lpFiber); +void WINAPI DeleteFiber(LPVOID lpFiber); + +BOOL WINAPI ConvertFiberToThread(void); + +LPVOID WINAPI CreateFiber( + SIZE_T dwStackSize, + LPFIBER_START_ROUTINE lpStartAddress, + LPVOID lpParameter); +LPVOID WINAPI CreateFiberEx( + SIZE_T dwStackCommitSize, + SIZE_T dwStackReserveSize, + DWORD dwFlags, + LPFIBER_START_ROUTINE lpStartAddress, + LPVOID lpParameter); + +LPVOID WINAPI ConvertThreadToFiber(LPVOID lpParameter); +LPVOID WINAPI ConvertThreadToFiberEx( + LPVOID lpParameter, + DWORD dwFlags); + +#ifdef _AMD64_ +__inline PVOID +GetCurrentFiber(void) +{ + return (PVOID)(ULONG_PTR)__readgsqword(0x20); +} +#else +__inline PVOID +GetCurrentFiber(void) +{ + return (PVOID)(ULONG_PTR)__readfsdword(0x10); +} +#endif + +__forceinline PVOID +GetFiberData(void) +{ + return *(PVOID *)GetCurrentFiber(); +} + + +/* ========================================================================= */ +/* Fiber Local Storage */ +/* ========================================================================= */ +#ifndef FLS_OUT_OF_INDEXES +#define FLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF) +#endif + +DWORD WINAPI FlsAlloc(PFLS_CALLBACK_FUNCTION lpCallback); +PVOID WINAPI FlsGetValue(DWORD dwFlsIndex); +BOOL WINAPI FlsSetValue(DWORD dwFlsIndex, PVOID lpFlsData); +BOOL WINAPI FlsFree(DWORD dwFlsIndex); + + +#if defined(__cplusplus) +} +#endif + +/* Enable all warnings */ +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + +#endif /* WINDOWS_FIBER_H */ +#endif /* _WINDOWS_ */ + diff --git a/exe_load/include/file.h b/exe_load/include/file.h new file mode 100644 index 0000000..1babd25 --- /dev/null +++ b/exe_load/include/file.h @@ -0,0 +1,505 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Arvid Gerstmann. All rights reserved. + */ +#ifndef _WINDOWS_ +#ifndef WINDOWS_FILE_H +#define WINDOWS_FILE_H + +/* Disable all warnings */ +#if defined(_MSC_VER) + #pragma warning(push, 0) +#endif + +#ifndef WINDOWS_BASE_H +#include "windows_base.h" +#endif +#if defined(__cplusplus) +extern "C" { +#endif + +/* CreateFile.dwShareMode Enums: */ +#define FILE_SHARE_DELETE 0x00000004 +#define FILE_SHARE_READ 0x00000001 +#define FILE_SHARE_WRITE 0x00000002 + +/* Generic Access Rights: */ +#define GENERIC_READ 0x80000000L +#define GENERIC_WRITE 0x40000000L +#define GENERIC_EXECUTE 0x20000000L +#define GENERIC_ALL 0x10000000L + +/* Standard Access Rights: */ +#define DELETE 0x00010000L +#define READ_CONTROL 0x00020000L +#define WRITE_DAC 0x00040000L +#define WRITE_OWNER 0x00080000L +#define SYNCHRONIZE 0x00100000L + +#define STANDARD_RIGHTS_REQUIRED 0x000F0000L + +#define STANDARD_RIGHTS_READ READ_CONTROL +#define STANDARD_RIGHTS_WRITE READ_CONTROL +#define STANDARD_RIGHTS_EXECUTE READ_CONTROL + +#define STANDARD_RIGHTS_ALL 0x001F0000L +#define SPECIFIC_RIGHTS_ALL 0x0000FFFFL + +/* Commulated Access Rights: */ +#define FILE_READ_DATA 0x0001 +#define FILE_LIST_DIRECTORY 0x0001 +#define FILE_WRITE_DATA 0x0002 +#define FILE_ADD_FILE 0x0002 +#define FILE_APPEND_DATA 0x0004 +#define FILE_ADD_SUBDIRECTORY 0x0004 +#define FILE_CREATE_PIPE_INSTANCE 0x0004 +#define FILE_READ_EA 0x0008 +#define FILE_WRITE_EA 0x0010 +#define FILE_EXECUTE 0x0020 +#define FILE_TRAVERSE 0x0020 +#define FILE_DELETE_CHILD 0x0040 +#define FILE_READ_ATTRIBUTES 0x0080 +#define FILE_WRITE_ATTRIBUTES 0x0100 +#define FILE_ALL_ACCESS \ + (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF) + +#define FILE_GENERIC_READ \ + (STANDARD_RIGHTS_READ | \ + FILE_READ_DATA | \ + FILE_READ_ATTRIBUTES | \ + FILE_READ_EA | \ + SYNCHRONIZE) + +#define FILE_GENERIC_WRITE \ + (STANDARD_RIGHTS_WRITE | \ + FILE_WRITE_DATA | \ + FILE_WRITE_ATTRIBUTES | \ + FILE_WRITE_EA | \ + FILE_APPEND_DATA | \ + SYNCHRONIZE) + +#define FILE_GENERIC_EXECUTE \ + (STANDARD_RIGHTS_EXECUTE | \ + FILE_READ_ATTRIBUTES | \ + FILE_EXECUTE | \ + SYNCHRONIZE) + +/* Creation Disposition: */ +#define CREATE_ALWAYS 2 +#define CREATE_NEW 1 +#define OPEN_ALWAYS 4 +#define OPEN_EXISTING 3 +#define TRUNCATE_EXISTING 5 + +/* File Attributes: */ +#define INVALID_FILE_ATTRIBUTES 0xffffffff +#define FILE_ATTRIBUTE_HIDDEN 0x2 +#define FILE_ATTRIBUTE_NORMAL 0x80 +#define FILE_ATTRIBUTE_DIRECTORY 0x10 +#define FILE_ATTRIBUTE_TEMPORARY 0x100 +#define FILE_ATTRIBUTE_REPARSE_POINT 0x400 + +/* File Offsets: */ +#define FILE_BEGIN 0 +#define FILE_CURRENT 1 +#define FILE_END 2 + +/* File Mapping: */ +#define SECTION_QUERY 0x0001 +#define SECTION_MAP_WRITE 0x0002 +#define SECTION_MAP_READ 0x0004 +#define SECTION_MAP_EXECUTE 0x0008 +#define SECTION_EXTEND_SIZE 0x0010 +#define SECTION_MAP_EXECUTE_EXPLICIT 0x0020 +#define SECTION_ALL_ACCESS \ + (STANDARD_RIGHTS_REQUIRED |\ + SECTION_QUERY |\ + SECTION_MAP_WRITE |\ + SECTION_MAP_READ |\ + SECTION_MAP_EXECUTE |\ + SECTION_EXTEND_SIZE) + +#define FILE_MAP_COPY SECTION_QUERY +#define FILE_MAP_WRITE SECTION_MAP_WRITE +#define FILE_MAP_READ SECTION_MAP_READ +#define FILE_MAP_ALL_ACCESS SECTION_ALL_ACCESS +#define FILE_MAP_EXECUTE SECTION_MAP_EXECUTE_EXPLICIT + +#define PAGE_EXECUTE_READ 0x20 +#define PAGE_EXECUTE_READWRITE 0x40 +#define PAGE_EXECUTE_WRITECOPY 0x80 +#define PAGE_READONLY 0x02 +#define PAGE_READWRITE 0x04 +#define PAGE_WRITECOPY 0x08 + +/* File Change Notifications: */ +#define FILE_NOTIFY_CHANGE_FILE_NAME 0x00000001 +#define FILE_NOTIFY_CHANGE_DIR_NAME 0x00000002 +#define FILE_NOTIFY_CHANGE_ATTRIBUTES 0x00000004 +#define FILE_NOTIFY_CHANGE_SIZE 0x00000008 +#define FILE_NOTIFY_CHANGE_LAST_WRITE 0x00000010 +#define FILE_NOTIFY_CHANGE_SECURITY 0x00000100 + +/* File Type: */ +#define FILE_TYPE_UNKNOWN 0x0000 +#define FILE_TYPE_DISK 0x0001 +#define FILE_TYPE_CHAR 0x0002 +#define FILE_TYPE_PIPE 0x0003 +#define FILE_TYPE_REMOTE 0x8000 + +/* Move Flags: */ +#define MOVEFILE_COPY_ALLOWED 0x2 +#define MOVEFILE_REPLACE_EXISTING 0x1 + +typedef DWORD SECURITY_INFORMATION, *PSECURITY_INFORMATION; +typedef HANDLE PSECURITY_DESCRIPTOR; + + +/* ========================================================================== */ +/* Structures: */ +typedef struct _OVERLAPPED { + ULONG_PTR Internal; + ULONG_PTR InternalHigh; + union { + struct { + DWORD Offset; + DWORD OffsetHigh; + }; + PVOID Pointer; + }; + HANDLE hEvent; +} OVERLAPPED, *LPOVERLAPPED; + +/* File Iteration: */ +typedef struct _WIN32_FIND_DATAA { + DWORD dwFileAttributes; + FILETIME ftCreationTime; + FILETIME ftLastAccessTime; + FILETIME ftLastWriteTime; + DWORD nFileSizeHigh; + DWORD nFileSizeLow; + DWORD dwReserved0; + DWORD dwReserved1; + CHAR cFileName[MAX_PATH]; + CHAR cAlternateFileName[14]; +} WIN32_FIND_DATAA, *PWIN32_FIND_DATAA, *LPWIN32_FIND_DATAA; +typedef struct _WIN32_FIND_DATAW { + DWORD dwFileAttributes; + FILETIME ftCreationTime; + FILETIME ftLastAccessTime; + FILETIME ftLastWriteTime; + DWORD nFileSizeHigh; + DWORD nFileSizeLow; + DWORD dwReserved0; + DWORD dwReserved1; + WCHAR cFileName[MAX_PATH]; + WCHAR cAlternateFileName[14]; +} WIN32_FIND_DATAW, *PWIN32_FIND_DATAW, *LPWIN32_FIND_DATAW; + + +/* ========================================================================== */ +/* File I/O Functions: */ +HANDLE WINAPI CreateFileA( + LPCSTR lpFileName, + DWORD dwDesiredAccess, + DWORD dwShareMode, + LPSECURITY_ATTRIBUTES lpSecurityAttributes, + DWORD dwCreationDisposition, + DWORD dwFlagsAndAttributes, + HANDLE hTemplateFile); +HANDLE WINAPI CreateFileW( + LPCWSTR lpFileName, + DWORD dwDesiredAccess, + DWORD dwShareMode, + LPSECURITY_ATTRIBUTES lpSecurityAttributes, + DWORD dwCreationDisposition, + DWORD dwFlagsAndAttributes, + HANDLE hTemplateFile); + +BOOL WINAPI WriteFile( + HANDLE hFile, + LPCVOID lpBuffer, + DWORD nNumberOfBytesToWrite, + LPDWORD lpNumberOfBytesWritten, + LPOVERLAPPED lpOverlapped); +BOOL WINAPI ReadFile( + HANDLE hFile, + LPVOID lpBuffer, + DWORD nNumberOfBytesToRead, + LPDWORD lpNumberOfBytesRead, + LPOVERLAPPED lpOverlapped); +DWORD WINAPI SetFilePointer( + HANDLE hFile, + LONG lDistanceToMove, + PLONG lpDistanceToMoveHigh, + DWORD dwMoveMethod); +BOOL WINAPI SetFilePointerEx( + HANDLE hFile, + LARGE_INTEGER liDistanceToMove, + PLARGE_INTEGER lpNewFilePointer, + DWORD dwMoveMethod); +BOOL WINAPI FlushFileBuffers( + HANDLE hFile); +DWORD WINAPI GetModuleFileNameA( + HMODULE hModule, + LPSTR lpFileName, + DWORD nSize); +DWORD WINAPI GetModuleFileNameW( + HMODULE hModule, + LPWSTR lpFileName, + DWORD nSize); +DWORD WINAPI GetModuleFileNameExA( + HANDLE hProcess, + HMODULE hModule, + LPSTR lpFileName, + DWORD nSize); +DWORD WINAPI GetModuleFileNameExW( + HANDLE hProcess, + HMODULE hModule, + LPWSTR lpFileName, + DWORD nSize); +HANDLE WINAPI OpenFileMappingA( + DWORD dwDesiredAccess, + BOOL bInheritHandle, + LPCSTR lpName); +HANDLE WINAPI OpenFileMappingW( + DWORD dwDesiredAccess, + BOOL bInheritHandle, + LPCWSTR lpName); +LPVOID WINAPI MapViewOfFile( + HANDLE hFileMappingObject, + DWORD dwDesiredAccess, + DWORD dwFileOffsetHigh, + DWORD dwFileOffsetLow, + SIZE_T dwNumberOfBytesToMap); +LPVOID WINAPI MapViewOfFileEx( + HANDLE hFileMappingObject, + DWORD dwDesiredAccess, + DWORD dwFileOffsetHigh, + DWORD dwFileOffsetLow, + SIZE_T dwNumberOfBytesToMap, + LPVOID lpBaseAddress); +HANDLE WINAPI CreateFileMappingA( + HANDLE hFile, + LPSECURITY_ATTRIBUTES lpAttributes, + DWORD flProtect, + DWORD dwMaximumSizeHigh, + DWORD dwMaximumSizeLow, + LPCSTR lpName); +HANDLE WINAPI CreateFileMappingW( + HANDLE hFile, + LPSECURITY_ATTRIBUTES lpAttributes, + DWORD flProtect, + DWORD dwMaximumSizeHigh, + DWORD dwMaximumSizeLow, + LPCWSTR lpName); +BOOL WINAPI UnmapViewOfFile( + LPCVOID lpBaseAddress); +DWORD WINAPI GetFileAttributesA( + LPCSTR lpFileName); +DWORD WINAPI GetFileAttributesW( + LPCWSTR lpFileName); + +typedef enum _GET_FILEEX_INFO_LEVELS { + GetFileExInfoStandard, + GetFileExMaxInfoLevel +} GET_FILEEX_INFO_LEVELS; +typedef struct _WIN32_FILE_ATTRIBUTE_DATA { + DWORD dwFileAttributes; + FILETIME ftCreationTime; + FILETIME ftLastAccessTime; + FILETIME ftLastWriteTime; + DWORD nFileSizeHigh; + DWORD nFileSizeLow; +} WIN32_FILE_ATTRIBUTE_DATA, *LPWIN32_FILE_ATTRIBUTE_DATA; +BOOL WINAPI GetFileAttributesExA( + LPCSTR lpFileName, + GET_FILEEX_INFO_LEVELS fInfoLevelId, + LPVOID lpFileInformation); +BOOL WINAPI GetFileAttributesExW( + LPCWSTR lpFileName, + GET_FILEEX_INFO_LEVELS fInfoLevelId, + LPVOID lpFileInformation); +BOOL SetFileAttributesA(LPCSTR lpFileName, DWORD dwFileAttributes); +BOOL SetFileAttributesW(LPCWSTR lpFileName, DWORD dwFileAttributes); + + +BOOL WINAPI GetFileTime( + HANDLE hFile, + LPFILETIME lpCreationTime, + LPFILETIME lpLastAccessTime, + LPFILETIME lpLastWriteTime); +BOOL WINAPI SetEndOfFile( + HANDLE hFile); +BOOL WINAPI CreateDirectoryA( + LPCSTR lpPathName, + LPSECURITY_ATTRIBUTES lpSecurityAttributes); +BOOL WINAPI CreateDirectoryW( + LPCWSTR lpPathName, + LPSECURITY_ATTRIBUTES lpSecurityAttributes); +BOOL WINAPI CopyFileA( + LPCSTR lpExistingFileName, + LPCSTR lpNewFileName, + BOOL bFailIfExists); +BOOL WINAPI CopyFileW( + LPCWSTR lpExistingFileName, + LPCWSTR lpNewFileName, + BOOL bFailIfExists); +BOOL WINAPI DeleteFileA( + LPCSTR lpFileName); +BOOL WINAPI DeleteFileW( + LPCWSTR lpFileName); +BOOL WINAPI MoveFileA( + LPCSTR lpExistingFileName, + LPCSTR lpNewFileName); +BOOL WINAPI MoveFileW( + LPCWSTR lpExistingFileName, + LPCWSTR lpNewFileName); +BOOL WINAPI MoveFileExA( + LPCSTR lpExistingFileName, + LPCSTR lpNewFileName, + DWORD dwFlags); +BOOL WINAPI MoveFileExW( + LPCWSTR lpExistingFileName, + LPCWSTR lpNewFileName, + DWORD dwFlags); +BOOL WINAPI RemoveDirectoryA( + LPCSTR lpPathName); +BOOL WINAPI RemoveDirectoryW( + LPCWSTR lpPathName); +BOOL WINAPI GetFileSizeEx( + HANDLE hFile, + PLARGE_INTEGER lpFileSize); +BOOL WINAPI FlushViewOfFile( + LPCVOID lpBaseAddress, + SIZE_T dwNumberOfBytesToFlush); + + +/* ========================================================================== */ +/* File Iteration Functions: */ +HANDLE WINAPI FindFirstFileA( + LPCSTR lpFileName, + LPWIN32_FIND_DATAA lpFindFileData); +HANDLE WINAPI FindFirstFileW( + LPCWSTR lpFileName, + LPWIN32_FIND_DATAW lpFindFileData); +BOOL WINAPI FindNextFileA( + HANDLE hFindFile, + LPWIN32_FIND_DATAA lpFindFileData); +BOOL WINAPI FindNextFileW( + HANDLE hFindFile, + LPWIN32_FIND_DATAW lpFindFileData); +BOOL WINAPI FindClose( + HANDLE hFindFile); + +/* ========================================================================== */ +/* File Change Functions: */ +HANDLE WINAPI FindFirstChangeNotificationA( + LPCSTR lpPathName, + BOOL bWatchSubtree, + DWORD dwNotifyFilter); +HANDLE WINAPI FindFirstChangeNotificationW( + LPCWSTR lpPathName, + BOOL bWatchSubtree, + DWORD dwNotifyFilter); +BOOL WINAPI FindNextChangeNotification( + HANDLE hChangeHandle); +BOOL WINAPI FindCloseChangeNotification( + HANDLE hChangeHandle); + +/* ========================================================================== */ +/* File Misc: */ +DWORD WINAPI GetFileType( + HANDLE hFile); + +/* ========================================================================== */ +/* Temp File: */ +UINT WINAPI GetTempFileNameW( + LPCWSTR lpPathName, + LPCWSTR lpPrefixString, + UINT uUnique, + LPWSTR lpTempFileName +); + +DWORD WINAPI GetTempPathW( + DWORD nBufferLength, + LPWSTR lpBuffer +); + +/* ========================================================================== */ +/* File Security: */ +BOOL WINAPI GetFileSecurityA( + LPCSTR lpFileName, + SECURITY_INFORMATION RequestedInformation, + PSECURITY_DESCRIPTOR pSecurityDescriptor, + DWORD nLength, + LPDWORD lpnLengthNeeded); +BOOL WINAPI GetFileSecurityW( + LPCWSTR lpFileName, + SECURITY_INFORMATION RequestedInformation, + PSECURITY_DESCRIPTOR pSecurityDescriptor, + DWORD nLength, + LPDWORD lpnLengthNeeded); + +/* ========================================================================== */ +/* Directory Changes: */ +#define FILE_ACTION_ADDED 0x00000001 +#define FILE_ACTION_REMOVED 0x00000002 +#define FILE_ACTION_MODIFIED 0x00000003 +#define FILE_ACTION_RENAMED_OLD_NAME 0x00000004 +#define FILE_ACTION_RENAMED_NEW_NAME 0x00000005 + +#define STATUS_WAIT_0 ((DWORD)0x00000000L) +#define STATUS_TIMEOUT ((DWORD)0x00000102L) +#define STATUS_PENDING ((DWORD)0x00000103L) +#define STILL_ACTIVE STATUS_PENDING + +#define FILE_FLAG_WRITE_THROUGH 0x80000000 +#define FILE_FLAG_OVERLAPPED 0x40000000 +#define FILE_FLAG_NO_BUFFERING 0x20000000 +#define FILE_FLAG_RANDOM_ACCESS 0x10000000 +#define FILE_FLAG_SEQUENTIAL_SCAN 0x08000000 +#define FILE_FLAG_DELETE_ON_CLOSE 0x04000000 +#define FILE_FLAG_BACKUP_SEMANTICS 0x02000000 +#define FILE_FLAG_POSIX_SEMANTICS 0x01000000 +#define FILE_FLAG_SESSION_AWARE 0x00800000 +#define FILE_FLAG_OPEN_REPARSE_POINT 0x00200000 +#define FILE_FLAG_OPEN_NO_RECALL 0x00100000 +#define FILE_FLAG_FIRST_PIPE_INSTANCE 0x00080000 + +#define HasOverlappedIoCompleted(lpOverlapped) (((DWORD)(lpOverlapped)->Internal) != STATUS_PENDING) + +typedef VOID(WINAPI* LPOVERLAPPED_COMPLETION_ROUTINE)(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped); + +typedef struct FILE_NOTIFY_INFORMATION { + DWORD NextEntryOffset; + DWORD Action; + DWORD FileNameLength; + WCHAR FileName[1]; +} FILE_NOTIFY_INFORMATION; + +BOOL WINAPI ReadDirectoryChangesW( + HANDLE hDirectory, + LPVOID lpBuffer, + DWORD nBufferLength, + BOOL bWatchSubtree, + DWORD dwNotifyFilter, + LPDWORD lpBytesReturned, + LPOVERLAPPED lpOverlapped, + LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine +); + + + +#if defined(__cplusplus) +} +#endif + +/* Enable all warnings */ +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + +#endif /* WINDOWS_FILE_H */ +#endif /* _WINDOWS_ */ + diff --git a/exe_load/include/gdi.h b/exe_load/include/gdi.h new file mode 100644 index 0000000..1b82311 --- /dev/null +++ b/exe_load/include/gdi.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Arvid Gerstmann. All rights reserved. + */ +#ifndef _WINDOWS_ +#ifndef WINDOWS_GDI_H +#define WINDOWS_GDI_H + +/* Disable all warnings */ +#if defined(_MSC_VER) + #pragma warning(push, 0) +#endif + +#ifndef WINDOWS_BASE_H +#include "windows_base.h" +#endif +#if defined(__cplusplus) +extern "C" { +#endif + +/* GDI: */ +#define BLACK_BRUSH 4 + + +/* Icons / Cursor: */ +#define MAKEINTRESOURCE(res) ((ULONG_PTR)(USHORT)res) +#define IDI_APPLICATION MAKEINTRESOURCE(32512) +#define IDC_ARROW MAKEINTRESOURCE(32512) + + +/* ========================================================================= */ +/* Functions */ +HCURSOR WINAPI LoadCursorA( + HINSTANCE hInstance, + LPCSTR lpCursorName); +HCURSOR WINAPI LoadCursorW( + HINSTANCE hInstance, + LPCWSTR lpCursorName); +HICON WINAPI LoadIconA( + HINSTANCE hInstance, + LPCSTR lpIconName); +HICON WINAPI LoadIconW( + HINSTANCE hInstance, + LPCWSTR lpIconName); +HGDIOBJ WINAPI GetStockObject( + int fnObject); +HCURSOR WINAPI SetCursor( + HCURSOR hCursor); + + +#if defined(__cplusplus) +} +#endif + +/* Enable all warnings */ +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + +#endif /* WINDOWS_GDI_H */ +#endif /* _WINDOWS_ */ + diff --git a/exe_load/include/intrin.h b/exe_load/include/intrin.h new file mode 100644 index 0000000..3e6df0f --- /dev/null +++ b/exe_load/include/intrin.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Arvid Gerstmann. All rights reserved. + */ +#ifndef _WINDOWS_ +#ifndef WINDOWS_INTRIN_H +#define WINDOWS_INTRIN_H + +/* Disable all warnings */ +#if defined(_MSC_VER) + #pragma warning(push, 0) +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + + +/* ========================================================================== */ +/* Intrinsics */ +/* ========================================================================== */ + +extern void _mm_pause(void); +#pragma intrinsic(_mm_pause) + +extern void _ReadWriteBarrier(void); +#pragma intrinsic(_ReadWriteBarrier) + + + +#if defined(__cplusplus) +} +#endif + +/* Enable all warnings */ +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + +#endif /* WINDOWS_INTRIN_H */ +#endif /* _WINDOWS_ */ + diff --git a/exe_load/include/io.h b/exe_load/include/io.h new file mode 100644 index 0000000..9cc5f30 --- /dev/null +++ b/exe_load/include/io.h @@ -0,0 +1,366 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Arvid Gerstmann. All rights reserved. + */ +#ifndef _WINDOWS_ +#ifndef WINDOWS_IO_H +#define WINDOWS_IO_H + +/* Disable all warnings */ +#if defined(_MSC_VER) + #pragma warning(push, 0) +#endif + +#ifndef WINDOWS_BASE_H +#include "windows_base.h" +#endif +#if defined(__cplusplus) +extern "C" { +#endif + +/* GetStdHandle: */ +#define STD_INPUT_HANDLE ((DWORD)-10) +#define STD_OUTPUT_HANDLE ((DWORD)-11) +#define STD_ERROR_HANDLE ((DWORD)-12) +#define INVALID_HANDLE_VALUE ((HANDLE)(LONG_PTR)-1) +#define ATTACH_PARENT_PROCESS ((DWORD)-1) + +#define HANDLE_FLAG_INHERIT 0x00000001 +#define HANDLE_FLAG_PROTECT_FROM_CLOSE 0x00000002 + +/* Console Colors: */ +#define FOREGROUND_BLUE 0x0001 +#define FOREGROUND_GREEN 0x0002 +#define FOREGROUND_RED 0x0004 +#define FOREGROUND_INTENSITY 0x0008 +#define BACKGROUND_BLUE 0x0010 +#define BACKGROUND_GREEN 0x0020 +#define BACKGROUND_RED 0x0040 +#define BACKGROUND_INTENSITY 0x0080 + +/* Console Handler */ +#define CTRL_C_EVENT 0x0 +#define CTRL_BREAK_EVENT 0x1 +#define CTRL_CLOSE_EVENT 0x2 +#define CTRL_LOGOFF_EVENT 0x5 +#define CTRL_SHUTDOWN_EVENT 0x6 + +/* Console Input Mode flags */ +#define ENABLE_PROCESSED_INPUT 0x0001 +#define ENABLE_LINE_INPUT 0x0002 +#define ENABLE_ECHO_INPUT 0x0004 +#define ENABLE_WINDOW_INPUT 0x0008 +#define ENABLE_MOUSE_INPUT 0x0010 +#define ENABLE_INSERT_MODE 0x0020 +#define ENABLE_QUICK_EDIT_MODE 0x0040 +#define ENABLE_EXTENDED_FLAGS 0x0080 +#define ENABLE_AUTO_POSITION 0x0100 +#define ENABLE_VIRTUAL_TERMINAL_INPUT 0x0200 + +/* Console Output Mode flags */ +#define ENABLE_PROCESSED_OUTPUT 0x0001 +#define ENABLE_WRAP_AT_EOL_OUTPUT 0x0002 +#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004 +#define DISABLE_NEWLINE_AUTO_RETURN 0x0008 +#define ENABLE_LVB_GRID_WORLDWIDE 0x0010 + +/* HeapAlloc, HeapReAlloc, etc: */ +#define HEAP_NO_SERIALIZE 0x00000001 +#define HEAP_ZERO_MEMORY 0x00000008 +#define HEAP_REALLOC_IN_PLACE_ONLY 0x00000010 + +/* Heap / Memory: */ +typedef enum _HEAP_INFORMATION_CLASS { + HeapCompatibilityInformation = 0, + HeapEneableTerminationOnCorruption = 1, + HeapOptimizeResources = 3 +} HEAP_INFORMATION_CLASS; + +/* VirtualAlloc.flAllocationType: */ +#define MEM_COMMIT 0x00001000 +#define MEM_RESERVE 0x00002000 +#define MEM_RESET 0x00080000 +#define MEM_RESET_UNDO 0x01000000 +#define MEM_LARGE_PAGES 0x20000000 +#define MEM_PHYSICAL 0x00400000 +#define MEM_TOP_DOWN 0x00100000 +#define MEM_WRITE_WATCH 0x00200000 + +/* VirtualAlloc.flProtect: */ +#define PAGE_EXECUTE 0x10 +#define PAGE_EXECUTE_READ 0x20 +#define PAGE_EXECUTE_READWRITE 0x40 +#define PAGE_EXECUTE_WRITECOPY 0x80 +#define PAGE_NOACCESS 0x01 +#define PAGE_READONLY 0x02 +#define PAGE_READWRITE 0x04 +#define PAGE_WRITECOPY 0x08 +#define PAGE_TARGETS_INVALID 0x40000000 +#define PAGE_TARGETS_NO_UPDATE 0x40000000 +#define PAGE_GUARD 0x100 +#define PAGE_NOCACHE 0x200 +#define PAGE_WRITECOMBINE 0x400 + +/* VirtualFree.dwFreeType: */ +#define MEM_DECOMMIT 0x4000 +#define MEM_RELEASE 0x8000 + +/* VirtualQuery State and Type: */ +#define MEM_FREE 0x10000 +#define MEM_IMAGE 0x1000000 +#define MEM_MAPPED 0x40000 +#define MEM_PRIVATE 0x20000 + + +/* ========================================================================== */ +/* Structures: */ +typedef struct _COORD { + SHORT X; + SHORT Y; +} COORD, *PCOORD; + +typedef struct _SMALL_RECT { + SHORT Left; + SHORT Top; + SHORT Right; + SHORT Bottom; +} SMALL_RECT; + +typedef struct _CONSOLE_SCREEN_BUFFER_INFO { + COORD dwSize; + COORD dwCursorPosition; + WORD wAttributes; + SMALL_RECT srWindow; + COORD dwMaximumWindowSize; +} CONSOLE_SCREEN_BUFFER_INFO, *PCONSOLE_SCREEN_BUFFER_INFO; + +typedef BOOL (WINAPI *PHANDLER_ROUTINE)(DWORD dwCtrlType); + +typedef struct _MEMORY_BASIC_INFORMATION32 { + DWORD BaseAddress; + DWORD AllocationBase; + DWORD AllocationProtect; + DWORD RegionSize; + DWORD State; + DWORD Protect; + DWORD Type; +} MEMORY_BASIC_INFORMATION32, *PMEMORY_BASIC_INFORMATION32; + +typedef struct __declspec(align(16)) _MEMORY_BASIC_INFORMATION64 { + ULONGLONG BaseAddress; + ULONGLONG AllocationBase; + DWORD AllocationProtect; + DWORD __alignment1; + ULONGLONG RegionSize; + DWORD State; + DWORD Protect; + DWORD Type; + DWORD __alignment2; +} MEMORY_BASIC_INFORMATION64, *PMEMORY_BASIC_INFORMATION64; +#if defined(_WIN64) +typedef MEMORY_BASIC_INFORMATION64 MEMORY_BASIC_INFORMATION; +typedef PMEMORY_BASIC_INFORMATION64 PMEMORY_BASIC_INFORMATION; +#else +typedef MEMORY_BASIC_INFORMATION32 MEMORY_BASIC_INFORMATION; +typedef PMEMORY_BASIC_INFORMATION32 PMEMORY_BASIC_INFORMATION; +#endif + + +/* ========================================================================== */ +/* I/O Functions: */ +HANDLE WINAPI GetStdHandle( + DWORD nStdHandle); +BOOL WINAPI GetConsoleScreenBufferInfo( + HANDLE hConsoleOutput, + PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo); +BOOL WINAPI SetConsoleTextAttribute( + HANDLE hConsoleOutput, + WORD wAttributes); +BOOL WINAPI GetConsoleMode( + HANDLE hConsoleHandle, + LPDWORD lpMode); +BOOL WINAPI SetConsoleMode( + HANDLE hConsoleHandle, + DWORD dwMode); +BOOL WINAPI CloseHandle( + HANDLE hObject); +BOOL WINAPI SetHandleInformation( + HANDLE hObject, + DWORD dwMask, + DWORD dwFlags); +BOOL WINAPI DuplicateHandle( + HANDLE hSourceProcessHandle, + HANDLE hSourceHandle, + HANDLE hTargetProcessHandle, + LPHANDLE lpTargetHandle, + DWORD dwDesiredAccess, + BOOL bInheritHandle, + DWORD dwOptions); + + +LPSTR WINAPI GetCommandLineA(void); +LPWSTR WINAPI GetCommandLineW(void); +#ifdef UNICODE +#define GetCommandLine GetCommandLineW +#else +#define GetCommandLine GetCommandLineA +#endif + +/* ========================================================================== */ +/* Console Functions: */ +BOOL WINAPI AllocConsole(void); +BOOL WINAPI FreeConsole(void); +BOOL WINAPI AttachConsole( + DWORD dwProcessId); +BOOL WINAPI WriteConsoleA( + HANDLE hConsoleOutput, + const void *lpBuffer, + DWORD nNumberOfCharsToWrite, + LPDWORD lpNumberOfCHarsWritten, + LPVOID lpReserved); +BOOL WINAPI WriteConsoleW( + HANDLE hConsoleOutput, + const void *lpBuffer, + DWORD nNumberOfCharsToWrite, + LPDWORD lpNumberOfCHarsWritten, + LPVOID lpReserved); +BOOL WINAPI SetConsoleCtrlHandler( + PHANDLER_ROUTINE HandlerRoutine, + BOOL Add); +HWND WINAPI GetConsoleWindow(void); +BOOL WINAPI SetConsoleOutputCP( + UINT wCodePageID); +UINT WINAPI GetConsoleOutputCP(void); + +/* ========================================================================== */ +/* Heap Functions: */ +HANDLE WINAPI GetProcessHeap(void); +LPVOID WINAPI HeapAlloc( + HANDLE hHeap, + DWORD dwFlags, + SIZE_T dwBytes); +LPVOID WINAPI HeapReAlloc( + HANDLE hHeap, + DWORD dwFlags, + LPVOID lpMem, + SIZE_T dwBytes); +BOOL WINAPI HeapFree( + HANDLE hHeap, + DWORD dwFlags, + LPVOID lpMem); +BOOL WINAPI HeapsetInformation( + HANDLE HeapHandle, + HEAP_INFORMATION_CLASS HeapInformationClass, + PVOID HeapInformation, + SIZE_T HeapInformationLength); +LPVOID WINAPI VirtualAlloc( + LPVOID lpAddress, + SIZE_T dwSize, + DWORD flAllocationType, + DWORD flProtect); +SIZE_T WINAPI VirtualQuery( + LPCVOID lpAddress, + PMEMORY_BASIC_INFORMATION lpBuffer, + SIZE_T dwLength); +BOOL WINAPI VirtualFree( + LPVOID lpAddress, + SIZE_T dwSize, + DWORD dwFreeType); +BOOL WINAPI VirtualProtect( + LPVOID lpAddress, + SIZE_T dwSize, + DWORD flNewProtect, + PDWORD lpflOldProtect); +BOOL WINAPI FlushInstructionCache( + HANDLE hProcess, + LPCVOID lpBaseAddress, + SIZE_T dwSize); + + +/* ========================================================================== */ +/* Pipe Functions: */ +#define PIPE_WAIT 0x00000000 +#define PIPE_NOWAIT 0x00000001 +#define PIPE_READMODE_BYTE 0x00000000 +#define PIPE_READMODE_MESSAGE 0x00000002 +#define PIPE_TYPE_BYTE 0x00000000 +#define PIPE_TYPE_MESSAGE 0x00000004 +#define PIPE_ACCEPT_REMOTE_CLIENTS 0x00000000 +#define PIPE_REJECT_REMOTE_CLIENTS 0x00000008 + +#define PIPE_ACCESS_INBOUND 0x00000001 +#define PIPE_ACCESS_OUTBOUND 0x00000002 +#define PIPE_ACCESS_DUPLEX 0x00000003 + +#define PIPE_UNLIMITED_INSTANCES 255 +#define ERROR_PIPE_BUSY 231L + +HANDLE WINAPI CreateNamedPipeA( + LPCSTR lpName, + DWORD dwOpenMode, + DWORD dwPipeMode, + DWORD nMaxInstances, + DWORD nOutBufferSize, + DWORD nInBufferSize, + DWORD nDefaultTimeOut, + LPSECURITY_ATTRIBUTES lpSecurityAttributes); +HANDLE WINAPI CreateNamedPipeW( + LPCWSTR lpName, + DWORD dwOpenMode, + DWORD dwPipeMode, + DWORD nMaxInstances, + DWORD nOutBufferSize, + DWORD nInBufferSize, + DWORD nDefaultTimeOut, + LPSECURITY_ATTRIBUTES lpSecurityAttributes); +BOOL WINAPI CreatePipe( + PHANDLE hReadPipe, + PHANDLE hWritePipe, + LPSECURITY_ATTRIBUTES lpPipeAttributes, + DWORD nSize); +BOOL WINAPI ConnectNamedPipe(HANDLE hNamedPipe, LPOVERLAPPED lpOverlapped); +BOOL WINAPI PeekNamedPipe( + HANDLE hNamedPipe, + LPVOID lpBuffer, + DWORD nBufferSize, + LPDWORD lpBytesRead, + LPDWORD lpTotalBytesAvail, + LPDWORD lpBytesLeftThisMessage); +BOOL WINAPI WaitNamedPipeA(LPCSTR lpNamedPipeName, DWORD nTimeOut); +BOOL WINAPI WaitNamedPipeW(LPCWSTR lpNamedPipeName, DWORD nTimeOut); + +/* ========================================================================== */ +/* Path Functions: */ +DWORD WINAPI GetFullPathNameA( + LPCSTR lpFileName, + DWORD nBufferLength, + LPSTR lpBuffer, + LPSTR *lpFilePart); +DWORD WINAPI GetFullPathNameW( + LPCWSTR lpFileName, + DWORD nBufferLength, + LPWSTR lpBuffer, + LPWSTR *lpFilePart); +BOOL WINAPI SetCurrentDirectoryA( + LPCSTR lpPathName); +BOOL WINAPI SetCurrentDirectoryW( + LPCWSTR lpPathName); +DWORD WINAPI GetCurrentDirectoryA( + DWORD nBufferLength, + LPSTR lpBuffer); +DWORD WINAPI GetCurrentDirectoryW( + DWORD nBufferLength, + LPWSTR lpBuffer); + +#if defined(__cplusplus) +} +#endif + +/* Enable all warnings */ +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + +#endif /* WINDOWS_IO_H */ +#endif /* _WINDOWS_ */ + diff --git a/exe_load/include/make.bat b/exe_load/include/make.bat new file mode 100644 index 0000000..4fc8055 --- /dev/null +++ b/exe_load/include/make.bat @@ -0,0 +1,51 @@ +@echo off + +:: Remove old windows.h header, if present. +del /F /Q windows.h + +:: Generate skeleton +echo #ifndef _WINDOWS_>> windows.h +echo #pragma once>> windows.h +echo #ifndef _INC_WINDOWS>> windows.h +echo #define _INC_WINDOWS>> windows.h +echo #ifndef WINDOWS_H>> windows.h +echo #define WINDOWS_H>> windows.h +echo:>> windows.h + +:: Append files +echo:>> windows.h +type windows_base.h >> windows.h +echo:>> windows.h +type atomic.h >> windows.h +echo:>> windows.h +type dbghelp.h >> windows.h +echo:>> windows.h +type dds.h >> windows.h +echo:>> windows.h +type file.h >> windows.h +echo:>> windows.h +type gdi.h >> windows.h +echo:>> windows.h +type io.h >> windows.h +echo:>> windows.h +type misc.h >> windows.h +echo:>> windows.h +type process.h >> windows.h +echo:>> windows.h +type sysinfo.h >> windows.h +echo:>> windows.h +type threads.h >> windows.h +echo:>> windows.h +type window.h >> windows.h +echo:>> windows.h +type intrin.h >> windows.h +echo:>> windows.h +type fiber.h >> windows.h +echo:>> windows.h + +:: Finish skeleton +echo #endif>> windows.h +echo #endif>> windows.h +echo #define _WINDOWS_>> windows.h +echo #endif>> windows.h + diff --git a/exe_load/include/misc.h b/exe_load/include/misc.h new file mode 100644 index 0000000..90edd56 --- /dev/null +++ b/exe_load/include/misc.h @@ -0,0 +1,390 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Arvid Gerstmann. All rights reserved. + */ +#ifndef _WINDOWS_ +#ifndef WINDOWS_MISC_H +#define WINDOWS_MISC_H + +/* Disable all warnings */ +#if defined(_MSC_VER) + #pragma warning(push, 0) +#endif + +#include + +#ifndef WINDOWS_BASE_H +#include "windows_base.h" +#endif +#if defined(__cplusplus) +extern "C" { +#endif + +/* MMRESULT: */ +typedef UINT MMRESULT; +#define TIMERR_BASE 96 +#define TIMERR_NOERROR (0) +#define TIMERR_NOCANDO (TIMERR_BASE+1) +#define TIMERR_STRUCT (TIMERR_BASE+33) + +/* Code Pages: */ +#define CP_INSTALLED 0x00000001 +#define CP_SUPPORTED 0x00000002 +#define CP_ACP 0 +#define CP_OEMCP 1 +#define CP_MACCP 2 +#define CP_THREAD_ACP 3 +#define CP_SYMBOL 42 +#define CP_UTF7 65000 +#define CP_UTF8 65001 + +/* Format: */ +#define FORMAT_MESSAGE_ALLOCATE_BUFFER 0x00000100 +#define FORMAT_MESSAGE_ARGUMENT_ARRAY 0x00002000 +#define FORMAT_MESSAGE_FROM_SYSTEM 0x00001000 +#define FORMAT_MESSAGE_IGNORE_INSERTS 0x00000200 +#define FORMAT_MESSAGE_FROM_HMODULE 0x00000800 +#define FORMAT_MESSAGE_FROM_STRING 0x00000400 + +/* Language ID: */ +#define MAKELANGID(p, s) ((((WORD)(s)) << 10) | (WORD )(p)) +#define PRIMARYLANGID(lgid) ((WORD)(lgid) & 0x3ff) +#define SUBLANGID(lgid) ((WORD)(lgid) >> 10) + +#define LANG_NEUTRAL 0x00 +#define LANG_INVARIANT 0x7f +#define LANG_ENGLISH 0x09 +#define LANG_GERMAN 0x07 + +#define SUBLANG_NEUTRAL 0x00 +#define SUBLANG_DEFAULT 0x01 +#define SUBLANG_SYS_DEFAULT 0x02 +#define SUBLANG_CUSTOM_DEFAULT 0x03 +#define SUBLANG_CUSTOM_UNSPECIFIED 0x04 +#define SUBLANG_UI_CUSTOM_DEFAULT 0x05 +#define SUBLANG_ENGLISH_US 0x01 +#define SUBLANG_ENGLISH_UK 0x02 +#define SUBLANG_GERMAN 0x01 + + +/* ========================================================================== */ +/* Structures: */ +/* Time: */ +typedef struct _SYSTEMTIME { + WORD wYear; + WORD wMonth; + WORD wDayOfWeek; + WORD wDay; + WORD wHour; + WORD wMinute; + WORD wSecond; + WORD wMilliseconds; +} SYSTEMTIME, *PSYSTEMTIME; +typedef PSYSTEMTIME LPSYSTEMTIME; + +typedef struct _TIME_ZONE_INFORMATION { + LONG Bias; + WCHAR StandardName[32]; + SYSTEMTIME StandardDate; + LONG StandardBias; + WCHAR DaylightName[32]; + SYSTEMTIME DaylightDate; + LONG DaylightBias; +} TIME_ZONE_INFORMATION, *PTIME_ZONE_INFORMATION; +typedef PTIME_ZONE_INFORMATION LPTIME_ZONE_INFORMATION; + + +/* ========================================================================== */ +/* Functions: */ +/* + * I could've implemented them in assembly, they're like 4 lines, but this is + * avoiding the cost of a function call, if optimizations are turned on. + */ +#ifdef WIN32_BYTESWAP_MACROS +#define _byteswap_ulong(x) (((unsigned long)(x) << 24) | \ + (((unsigned long)(x) << 8) & 0xff0000) | \ + (((unsigned long)(x) >> 8) & 0xff00) | \ + ((unsigned long)(x) >> 24)) +#define _byteswap_uint64(x) (((unsigned __int64)(x) << 56) | \ + (((unsigned __int64)(x) << 40) & 0xff000000000000ULL) | \ + (((unsigned __int64)(x) << 24) & 0xff0000000000ULL) | \ + (((unsigned __int64)(x) << 8) & 0xff00000000ULL) | \ + (((unsigned __int64)(x) >> 8) & 0xff000000ULL) | \ + (((unsigned __int64)(x) >> 24) & 0xff0000ULL) | \ + (((unsigned __int64)(x) >> 40) & 0xff00ULL) | \ + ((unsigned __int64)(x) >> 56)) +#else +unsigned short __cdecl _byteswap_ushort(unsigned short Number); +unsigned long __cdecl _byteswap_ulong (unsigned long Number); +unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64 Number); +#endif + +unsigned int _rotl(unsigned int value, int shift); +unsigned __int64 _rotl64(unsigned __int64 value, int shift); +unsigned char _BitScanForward(unsigned long * Index, unsigned long Mask); +unsigned char _BitScanForward64(unsigned long * Index, unsigned __int64 Mask); + + +/* ========================================================================== */ +/* UTF-16 <-> UTF-8 conversion Functions: */ +int WINAPI WideCharToMultiByte( + UINT CodePage, + DWORD dwFlags, + LPCWSTR lpWideCharStr, + int cchWideChar, + LPSTR lpMultiByteStr, + int cbMultiByte, + LPCSTR lpDefaultChar, + LPBOOL lpUsedDefaultChar); +int WINAPI MultiByteToWideChar( + UINT CodePage, + DWORD dwFlags, + LPCSTR lpMultiByteStr, + int cbMultiByte, + LPWSTR lpWideCharStr, + int cchWideChar); +int WINAPI lstrlenA( + LPCSTR lpString); +int WINAPI lstrlenW( + LPCWSTR lpString); +LPCSTR WINAPI lstrcpyA( + LPCSTR lpString1, + LPCSTR lpString2); +LPCWSTR WINAPI lstrcpyW( + LPCWSTR lpString1, + LPCWSTR lpString2); + +/* ========================================================================== */ +/* Time: */ +void WINAPI GetSystemTime( + LPSYSTEMTIME lpSystemTime); +void WINAPI GetLocalTime( + LPSYSTEMTIME lpSystemTime); +BOOL WINAPI QueryProcessCycleTime( + HANDLE hProcess, + PULONG64 CycleTime); +BOOL WINAPI SystemTimeToFileTime( + const SYSTEMTIME * lpSystemTime, + LPFILETIME lpFileTime); +BOOL WINAPI FileTimeToSystemTime( + const FILETIME * lpFileTime, + LPSYSTEMTIME lpSystemTime); +LONG WINAPI CompareFileTime( + const FILETIME * lpFileTime1, + const FILETIME * lpFileTime2); +void WINAPI GetSystemTimeAsFileTime( + LPFILETIME lpSystemTimeAsFileTime); +BOOL WINAPI SystemTimeToTzSpecificLocalTime( + LPTIME_ZONE_INFORMATION lpTimeZone, + LPSYSTEMTIME lpUniversalTime, + LPSYSTEMTIME lpLocalTime); +DWORD timeGetTime(void); + +/* ========================================================================== */ +/* Environment: */ +BOOL WINAPI SetEnvironmentVariableA( + LPCSTR lpName, + LPCSTR lpValue); +BOOL WINAPI SetEnvironmentVariableW( + LPCWSTR lpName, + LPCWSTR lpValue); +DWORD WINAPI GetEnvironmentVariableA( + LPCSTR lpName, + LPCSTR lpBuffer, + DWORD nSize); +DWORD WINAPI GetEnvironmentVariableW( + LPCWSTR lpName, + LPCWSTR lpBuffer, + DWORD nSize); + +/* ========================================================================== */ +/* Misc Functions: */ +BOOL WINAPI DisableThreadLibraryCalls( + HMODULE hModule); +DWORD WINAPI GetLastError(void); +void WINAPI Sleep( + DWORD dwMilliseconds); +DWORD WINAPI SleepEx( + DWORD dwMilliseconds, + BOOL bAlertable); +HMODULE WINAPI GetModuleHandleA( + LPCSTR lpModuleName); +HMODULE WINAPI GetModuleHandleW( + LPCWSTR lpModuleName); +DWORD WINAPI FormatMessageA( + DWORD dwFlags, + LPCVOID lpSource, + DWORD dwMessageId, + DWORD dwLanguageId, + LPSTR lpBuffer, + DWORD nSize, + va_list *Arguments); +DWORD WINAPI FormatMessageW( + DWORD dwFlags, + LPCVOID lpSource, + DWORD dwMessageId, + DWORD dwLanguageId, + LPWSTR lpBuffer, + DWORD nSize, + va_list *Arguments); + + +/* ========================================================================== */ +/* Timer Functions: */ +DWORD WINAPI GetTickCount(void); +ULONGLONG WINAPI GetTickCount64(void); +BOOL WINAPI QueryPerformanceFrequency( + LARGE_INTEGER *lpFrequency); +BOOL WINAPI QueryPerformanceCounter( + LARGE_INTEGER *lpPerformanceCount); + + +/* ========================================================================== */ +/* Multi Media Timer: */ +#define TIMERR_NOERROR (0) /* no error */ +#define TIMERR_NOCANDO (TIMERR_BASE+1) /* request not completed */ +#define TIMERR_STRUCT (TIMERR_BASE+33) /* time struct size */ + +typedef struct timecaps_tag { + UINT wPeriodMin; /* minimum period supported */ + UINT wPeriodMax; /* maximum period supported */ +} TIMECAPS, *PTIMECAPS, *NPTIMECAPS, *LPTIMECAPS; +typedef UINT MMRESULT; + +MMRESULT WINAPI timeGetDevCaps(LPTIMECAPS ptc, UINT cbtc); +MMRESULT WINAPI timeBeginPeriod(UINT uPeriod); +MMRESULT WINAPI timeEndPeriod(UINT uPeriod); + + +/* ========================================================================== */ +/* DLL Functions: */ +HMODULE WINAPI LoadLibraryA( + LPCSTR lpFileName); +HMODULE WINAPI LoadLibraryW( + LPCWSTR lpFileName); +HMODULE WINAPI LoadLibraryExA( + LPCSTR lpLibFileName, + HANDLE hFile, + DWORD dwFlags); +HMODULE WINAPI LoadLibraryExW( + LPCWSTR lpLibFileName, + HANDLE hFile, + DWORD dwFlags); +FARPROC WINAPI GetProcAddress( + HMODULE hModule, + LPCSTR lProcName); +PROC WINAPI wglGetProcAddress( + LPCSTR lpszProc); +BOOL WINAPI FreeLibrary( + HMODULE hModule); + +/* ========================================================================== */ +/* Libc Replacements: */ +PVOID SecureZeroMemory( + PVOID ptr, + SIZE_T cnt); + +VOID __stosb( + PBYTE Destination, + BYTE Value, + SIZE_T Count); + +VOID __stosw( + PWORD Destination, + WORD Value, + SIZE_T Count); + +VOID __stosd( + PDWORD Destination, + DWORD Value, + SIZE_T Count); + +VOID __stosq( + PDWORD64 Destination, + DWORD64 Value, + SIZE_T Count); + +#pragma intrinsic(__stosb) +#pragma intrinsic(__stosw) +#pragma intrinsic(__stosd) +#pragma intrinsic(__stosq) + +FORCEINLINE PVOID SecureZeroMemory( + PVOID ptr, + SIZE_T cnt) +{ + volatile char* vptr = (volatile char*)ptr; + +#if defined(_M_AMD64) + __stosb((PBYTE)((DWORD64)vptr), 0, cnt); +#else + while (cnt) + { +# if !defined(_M_CEE) && (defined(_M_ARM) || defined(_M_ARM64)) + __iso_volatile_store8(vptr, 0); +# else + * vptr = 0; +# endif + + vptr++; + cnt--; + } + +#endif // _M_AMD64 + + return ptr; +} + +_NODISCARD _Check_return_ +int __cdecl memcmp( + _In_reads_bytes_(_Size) void const* _Buf1, + _In_reads_bytes_(_Size) void const* _Buf2, + _In_ size_t _Size +); + +_CRT_INSECURE_DEPRECATE_MEMORY(memmove_s) +_VCRTIMP void* __cdecl memmove( + _Out_writes_bytes_all_opt_(_Size) void* _Dst, + _In_reads_bytes_opt_(_Size) void const* _Src, + _In_ size_t _Size +); + +void* __cdecl memcpy( + _Out_writes_bytes_all_(_Size) void* _Dst, + _In_reads_bytes_(_Size) void const* _Src, + _In_ size_t _Size +); + +void* __cdecl memset( + _Out_writes_bytes_all_(_Size) void* _Dst, + _In_ int _Val, + _In_ size_t _Size +); + + +#define RtlEqualMemory(Destination,Source,Length) (!memcmp((Destination),(Source),(Length))) +#define RtlMoveMemory(Destination,Source,Length) memmove((Destination),(Source),(Length)) +#define RtlCopyMemory(Destination,Source,Length) memcpy((Destination),(Source),(Length)) +#define RtlFillMemory(Destination,Length,Fill) memset((Destination),(Fill),(Length)) +#define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length)) + +#define MoveMemory RtlMoveMemory +#define CopyMemory RtlCopyMemory +#define FillMemory RtlFillMemory +#define ZeroMemory RtlZeroMemory + +UINT WINAPI GetDoubleClickTime(VOID); +BOOL WINAPI SetDoubleClickTime(UINT); + +#if defined(__cplusplus) +} +#endif + +/* Enable all warnings */ +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + +#endif /* WINDOWS_MISC_H */ +#endif /* _WINDOWS_ */ + diff --git a/exe_load/include/process.h b/exe_load/include/process.h new file mode 100644 index 0000000..b277257 --- /dev/null +++ b/exe_load/include/process.h @@ -0,0 +1,290 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Arvid Gerstmann. All rights reserved. + */ +#ifndef _WINDOWS_ +#ifndef WINDOWS_PROCESS_H +#define WINDOWS_PROCESS_H + +/* Disable all warnings */ +#if defined(_MSC_VER) + #pragma warning(push, 0) +#endif + +#ifndef WINDOWS_BASE_H +#include "windows_base.h" +#endif +#if defined(__cplusplus) +extern "C" { +#endif + +/* Originally defined in threads.h */ +#ifndef INFINITE +#define INFINITE 0xffffffff +#endif + +/* Originally defined in file.h */ +#ifndef STANDARD_RIGHTS_REQUIRED +#define STANDARD_RIGHTS_REQUIRED 0x000F0000L +#endif +#ifndef SYNCHRONIZE +#define SYNCHRONIZE 0x00100000L +#endif + +/* Process Access Rights: */ +#define PROCESS_DUP_HANDLE (0x0040) +#define PROCESS_QUERY_INFORMATION (0x0400) +#define PROCESS_SUSPEND_RESUME (0x0800) +#define PROCESS_TERMINATE (0x0001) +#define PROCESS_VM_READ (0x0010) +#define PROCESS_ALL_ACCESS \ + (STANDARD_RIGHTS_REQUIRED | \ + SYNCHRONIZE | \ + 0xFFFF) + +/* Tokens: */ +#define TOKEN_ASSIGN_PRIMARY (0x0001) +#define TOKEN_DUPLICATE (0x0002) +#define TOKEN_IMPERSONATE (0x0004) +#define TOKEN_QUERY (0x0008) +#define TOKEN_QUERY_SOURCE (0x0010) +#define TOKEN_ADJUST_PRIVILEGES (0x0020) +#define TOKEN_ADJUST_GROUPS (0x0040) +#define TOKEN_ADJUST_DEFAULT (0x0080) +#define TOKEN_ADJUST_SESSIONID (0x0100) + +#define TOKEN_ALL_ACCESS_P (STANDARD_RIGHTS_REQUIRED | \ + TOKEN_ASSIGN_PRIMARY | \ + TOKEN_DUPLICATE | \ + TOKEN_IMPERSONATE | \ + TOKEN_QUERY | \ + TOKEN_QUERY_SOURCE | \ + TOKEN_ADJUST_PRIVILEGES | \ + TOKEN_ADJUST_GROUPS | \ + TOKEN_ADJUST_DEFAULT) + +#define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L) +#define SE_PRIVILEGE_ENABLED (0x00000002L) +#define SE_PRIVILEGE_REMOVED (0X00000004L) +#define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L) + +/* Status */ +#define STATUS_WAIT_0 ((DWORD)0x00000000L) +#define STATUS_TIMEOUT ((DWORD)0x00000102L) +#define STATUS_PENDING ((DWORD)0x00000103L) +#define STILL_ACTIVE STATUS_PENDING + +/* Startupinfo */ +#define STARTF_USESHOWWINDOW 0x00000001 +#define STARTF_USESIZE 0x00000002 +#define STARTF_USEPOSITION 0x00000004 +#define STARTF_USECOUNTCHARS 0x00000008 +#define STARTF_USEFILLATTRIBUTE 0x00000010 +#define STARTF_RUNFULLSCREEN 0x00000020 +#define STARTF_FORCEONFEEDBACK 0x00000040 +#define STARTF_FORCEOFFFEEDBACK 0x00000080 +#define STARTF_USESTDHANDLES 0x00000100 + + +/* Priority Classes / CreateProcess: */ +#define NORMAL_PRIORITY_CLASS 0x00000020 + +/* Job Objects: */ +#define JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE 0x00002000 +typedef enum _JOBOBJECTINFOCLASS { + JobObjectBasicAccountingInformation = 1, + JobObjectBasicLimitInformation, + JobObjectBasicProcessIdList, + JobObjectBasicUIRestrictions, + JobObjectSecurityLimitInformation, // deprecated + JobObjectEndOfJobTimeInformation, + JobObjectAssociateCompletionPortInformation, + JobObjectBasicAndIoAccountingInformation, + JobObjectExtendedLimitInformation, + JobObjectJobSetInformation, + JobObjectGroupInformation, + JobObjectNotificationLimitInformation, + JobObjectLimitViolationInformation, + JobObjectGroupInformationEx, + JobObjectCpuRateControlInformation, + JobObjectCompletionFilter, + JobObjectCompletionCounter, + JobObjectReserved1Information = 18, + JobObjectReserved2Information, + JobObjectReserved3Information, + JobObjectReserved4Information, + JobObjectReserved5Information, + JobObjectReserved6Information, + JobObjectReserved7Information, + JobObjectReserved8Information, + JobObjectReserved9Information, + MaxJobObjectInfoClass +} JOBOBJECTINFOCLASS; + +/* Process: */ +typedef struct _STARTUPINFOA { + DWORD cb; + LPSTR lpReserved; + LPSTR lpDesktop; + LPSTR lpTitle; + DWORD dwX; + DWORD dwY; + DWORD dwXSize; + DWORD dwYSize; + DWORD dwXCountChars; + DWORD dwYCountChars; + DWORD dwFillAttribute; + DWORD dwFlags; + WORD wShowWindow; + WORD cbReserved2; + LPBYTE lpReserved2; + HANDLE hStdInput; + HANDLE hStdOutput; + HANDLE hStdError; +} STARTUPINFOA, *LPSTARTUPINFOA; +typedef struct _STARTUPINFOW { + DWORD cb; + LPWSTR lpReserved; + LPWSTR lpDesktop; + LPWSTR lpTitle; + DWORD dwX; + DWORD dwY; + DWORD dwXSize; + DWORD dwYSize; + DWORD dwXCountChars; + DWORD dwYCountChars; + DWORD dwFillAttribute; + DWORD dwFlags; + WORD wShowWindow; + WORD cbReserved2; + LPBYTE lpReserved2; + HANDLE hStdInput; + HANDLE hStdOutput; + HANDLE hStdError; +} STARTUPINFOW, *LPSTARTUPINFOW; + +typedef struct _PROC_THREAD_ATTRIBUTE_LIST +*PPROC_THREAD_ATTRIBUTE_LIST, *LPPROC_THREAD_ATTRIBUTE_LIST; +typedef struct _STARTUPINFOEXA { + STARTUPINFOA StartupInfo; + PPROC_THREAD_ATTRIBUTE_LIST lpAttributeList; +} STARTUPINFOEXA, *LPSTARTUPINFOEXA; +typedef struct _STARTUPINFOEXW { + STARTUPINFOW StartupInfo; + PPROC_THREAD_ATTRIBUTE_LIST lpAttributeList; +} STARTUPINFOEXW, *LPSTARTUPINFOEXW; +typedef struct _PROCESS_INFORMATION { + HANDLE hProcess; + HANDLE hThread; + DWORD dwProcessId; + DWORD dwThreadId; +} PROCESS_INFORMATION, *LPPROCESS_INFORMATION; + +/* Job Objects: */ +typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION { + LARGE_INTEGER PerProcessUserTimeLimit; + LARGE_INTEGER PerJobUserTimeLimit; + DWORD LimitFlags; + SIZE_T MinimumWorkingSetSize; + SIZE_T MaximumWorkingSetSize; + DWORD ActiveProcessLimit; + ULONG_PTR Affinity; + DWORD PriorityClass; + DWORD SchedulingClass; +} JOBOBJECT_BASIC_LIMIT_INFORMATION, *PJOBOBJECT_BASIC_LIMIT_INFORMATION; + +typedef struct _IO_COUNTERS { + ULONGLONG ReadOperationCount; + ULONGLONG WriteOperationCount; + ULONGLONG OtherOperationCount; + ULONGLONG ReadTransferCount; + ULONGLONG WriteTransferCount; + ULONGLONG OtherTransferCount; +} IO_COUNTERS, *PIO_COUNTERS; + +typedef struct _JOBOBJECT_EXTENDED_LIMIT_INFORMATION { + JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation; + IO_COUNTERS IoInfo; + SIZE_T ProcessMemoryLimit; + SIZE_T JobMemoryLimit; + SIZE_T PeakProcessMemoryUsed; + SIZE_T PeakJobMemoryUsed; +} JOBOBJECT_EXTENDED_LIMIT_INFORMATION, *PJOBOBJECT_EXTENDED_LIMIT_INFORMATION; + + +/* ========================================================================== */ +/* Process: */ +HANDLE WINAPI GetCurrentProcess(void); +DWORD WINAPI GetCurrentProcessId(void); +void WINAPI ExitProcess(UINT uExitCode); +HANDLE WINAPI OpenProcess( + DWORD dwDesiredAccess, + BOOL bInheritHandle, + DWORD dwProcessId); +BOOL WINAPI CreateProcessA( + LPCSTR lpApplicationName, + LPSTR lpCommandLine, + LPSECURITY_ATTRIBUTES lpProcessAttributes, + LPSECURITY_ATTRIBUTES lpThreadAttributes, + BOOL bInheritHandles, + DWORD dwCreationFlags, + LPVOID lpEnvironment, + LPCSTR lpCurrentDirectory, + LPSTARTUPINFOA lpStartupInfo, + LPPROCESS_INFORMATION lpProcessInformation); +BOOL WINAPI CreateProcessW( + LPCWSTR lpApplicationName, + LPWSTR lpCommandLine, + LPSECURITY_ATTRIBUTES lpProcessAttributes, + LPSECURITY_ATTRIBUTES lpThreadAttributes, + BOOL bInheritHandles, + DWORD dwCreationFlags, + LPVOID lpEnvironment, + LPCWSTR lpCurrentDirectory, + LPSTARTUPINFOW lpStartupInfo, + LPPROCESS_INFORMATION lpProcessInformation); +BOOL WINAPI TerminateProcess( + HANDLE hProcess, + UINT uExitCode); +BOOL WINAPI EnumProcessModules( + HANDLE hProcess, + HMODULE * lphModule, + DWORD cb, + LPDWORD lpcbNeeded); +DWORD WINAPI WaitForInputIdle( + HANDLE hProcess, + DWORD dwMilliseconds); +BOOL WINAPI GetExitCodeProcess( + HANDLE hProcess, + LPDWORD lpExitCode); + +/* ========================================================================== */ +/* Jobs: */ +HANDLE WINAPI CreateJobObjectA( + LPSECURITY_ATTRIBUTES lpJobAttributes, + LPCSTR lpName); +HANDLE WINAPI CreateJobObjectW( + LPSECURITY_ATTRIBUTES lpJobAttributes, + LPCWSTR lpName); +BOOL WINAPI SetInformationJobObject( + HANDLE hJob, + JOBOBJECTINFOCLASS JobObjectInfoClass, + LPVOID lpJobObjectInfo, + DWORD cbJobObjectInfoLength); +BOOL WINAPI AssignProcessToJobObject( + HANDLE hJob, + HANDLE hProcess); + + +#if defined(__cplusplus) +} +#endif + +/* Enable all warnings */ +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + +#endif /* WINDOWS_PROCESS_H */ +#endif /* _WINDOWS_ */ + diff --git a/exe_load/include/sysinfo.h b/exe_load/include/sysinfo.h new file mode 100644 index 0000000..9aa8334 --- /dev/null +++ b/exe_load/include/sysinfo.h @@ -0,0 +1,596 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Arvid Gerstmann. All rights reserved. + */ +#ifndef _WINDOWS_ +#ifndef WINDOWS_SYSINFO_H +#define WINDOWS_SYSINFO_H + +/* Disable all warnings */ +#if defined(_MSC_VER) + #pragma warning(push, 0) +#endif + +#ifndef WINDOWS_BASE_H +#include "windows_base.h" +#endif +#if defined(__cplusplus) +extern "C" { +#endif + +/* Display Devices: */ +#define DISPLAY_DEVICE_ACTIVE 0x00000001 +#define DISPLAY_DEVICE_ATTACHED 0x00000002 +#define DISPLAY_DEVICE_PRIMARY_DEVICE 0x00000004 + +/* System Metrics */ +#define SM_CXSCREEN 0 +#define SM_CYSCREEN 1 +#define SM_CMONITORS 80 + +/* Versions */ +#define VER_EQUAL 1 +#define VER_GREATER 2 +#define VER_GREATER_EQUAL 3 +#define VER_LESS 4 +#define VER_LESS_EQUAL 5 +#define VER_AND 6 +#define VER_OR 7 + +#define _WIN32_WINNT_WINXP 0x0501 +#define _WIN32_WINNT_WS03 0x0502 +#define _WIN32_WINNT_VISTA 0x0600 +#define _WIN32_WINNT_WS08 0x0600 +#define _WIN32_WINNT_WIN7 0x0601 +#define _WIN32_WINNT_WIN8 0x0602 +#define _WIN32_WINNT_WIN81 0x0603 +#define _WIN32_WINNT_WIN10 0x0A00 + +#define VER_MINORVERSION 0x0000001 +#define VER_MAJORVERSION 0x0000002 +#define VER_BUILDNUMBER 0x0000004 +#define VER_PLATFORMID 0x0000008 +#define VER_SERVICEPACKMINOR 0x0000010 +#define VER_SERVICEPACKMAJOR 0x0000020 + +/* Registry Key Classes */ +#define HKEY_CLASSES_ROOT ((HKEY)(ULONG_PTR)((LONG)0x80000000)) +#define HKEY_CURRENT_USER ((HKEY)(ULONG_PTR)((LONG)0x80000001)) +#define HKEY_LOCAL_MACHINE ((HKEY)(ULONG_PTR)((LONG)0x80000002)) +#define HKEY_USERS ((HKEY)(ULONG_PTR)((LONG)0x80000003)) + +/* Registry Types */ +#define REG_NONE 0 +#define REG_SZ 1 +#define REG_EXPAND_SZ 2 + +#define REG_BINARY 3 +#define REG_DWORD 4 +#define REG_DWORD_LITTLE_ENDIAN 4 +#define REG_DWORD_BIG_ENDIAN 5 +#define REG_LINK 6 +#define REG_MULTI_SZ 7 +#define REG_RESOURCE_LIST 8 +#define REG_FULL_RESOURCE_DESCRIPTOR 9 +#define REG_RESOURCE_REQUIREMENTS_LIST 10 +#define REG_QWORD 11 +#define REG_QWORD_LITTLE_ENDIAN 11 + + +/* Registry Access Rights */ +#define KEY_QUERY_VALUE 0x0001 +#define KEY_SET_VALUE 0x0002 +#define KEY_CREATE_SUB_KEY 0x0004 +#define KEY_ENUMERATE_SUB_KEYS 0x0008 +#define KEY_NOTIFY 0x0010 +#define KEY_CREATE_LINK 0x0020 +#define KEY_WOW64_32KEY 0x0200 +#define KEY_WOW64_64KEY 0x0100 +#define KEY_WOW64_RES 0x0300 + +#define KEY_READ \ + ((STANDARD_RIGHTS_READ \ + | KEY_QUERY_VALUE \ + | KEY_ENUMERATE_SUB_KEYS \ + | KEY_NOTIFY) \ + & (~SYNCHRONIZE)) + +#define KEY_WRITE \ + ((STANDARD_RIGHTS_WRITE \ + | KEY_SET_VALUE \ + | KEY_CREATE_SUB_KEY) \ + & (~SYNCHRONIZE)) + +#define KEY_EXECUTE \ + ((KEY_READ) \ + & (~SYNCHRONIZE)) + +#define KEY_ALL_ACCESS \ + ((STANDARD_RIGHTS_ALL \ + | KEY_QUERY_VALUE \ + | KEY_SET_VALUE \ + | KEY_CREATE_SUB_KEY \ + | KEY_ENUMERATE_SUB_KEYS \ + | KEY_NOTIFY \ + | KEY_CREATE_LINK) \ + & (~SYNCHRONIZE)) + + +/* ========================================================================== */ +/* Structures: */ +typedef struct _SYSTEM_INFO { + union { + DWORD dwOemId; + struct { + WORD wProcessorArchitecture; + WORD wReserved; + }; + }; + + DWORD dwPageSize; + LPVOID lpMinimumApplicationAddress; + LPVOID lpMaximumApplicationAddress; + DWORD_PTR dwActiveProcessorMask; + DWORD dwNumberOfProcessors; + DWORD dwProcessorType; + DWORD dwAllocationGranularity; + WORD wProcessorLevel; + WORD wProcessorRevision; +} SYSTEM_INFO, *LPSYSTEM_INFO; + +/* Device Context: */ +typedef struct _DISPLAY_DEVICEA { + DWORD cb; + CHAR DeviceName[32]; + CHAR DeviceString[128]; + DWORD StateFlags; + CHAR DeviceID[128]; + CHAR DeviceKey[128]; +} DISPLAY_DEVICEA, *PDISPLAY_DEVICEA; +typedef struct _DISPLAY_DEVICEW { + DWORD cb; + WCHAR DeviceName[32]; + WCHAR DeviceString[128]; + DWORD StateFlags; + WCHAR DeviceID[128]; + WCHAR DeviceKey[128]; +} DISPLAY_DEVICEW, *PDISPLAY_DEVICEW; + +/* Version: */ +typedef struct _OSVERSIONINFOEXA { + DWORD dwOSVersionInfoSize; + DWORD dwMajorVersion; + DWORD dwMinorVersion; + DWORD dwBuildNumber; + DWORD dwPlatformId; + CHAR szCSDVersion[128]; + WORD wServicePackMajor; + WORD wServicePackMinor; + WORD wSuiteMask; + BYTE wProductType; + BYTE wReserved; +} OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA; +typedef struct _OSVERSIONINFOEXW { + DWORD dwOSVersionInfoSize; + DWORD dwMajorVersion; + DWORD dwMinorVersion; + DWORD dwBuildNumber; + DWORD dwPlatformId; + WCHAR szCSDVersion[128]; + WORD wServicePackMajor; + WORD wServicePackMinor; + WORD wSuiteMask; + BYTE wProductType; + BYTE wReserved; +} OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW; + +/* SysInfo: */ +typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP { + RelationProcessorCore, + RelationNumaNode, + RelationCache, + RelationProcessorPackage, + RelationGroup, + RelationAll = 0xffff +} LOGICAL_PROCESSOR_RELATIONSHIP; +typedef enum _PROCESSOR_CACHE_TYPE { + CacheUnified, + CacheInstruction, + CacheData, + CacheTrace +} PROCESSOR_CACHE_TYPE; +typedef struct _CACHE_DESCRIPTOR { + BYTE Level; + BYTE Associativity; + WORD LineSize; + DWORD Size; + PROCESSOR_CACHE_TYPE Type; +} CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR; +typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION { + ULONG_PTR ProcessorMask; + LOGICAL_PROCESSOR_RELATIONSHIP Relationship; + union { + struct { + BYTE Flags; + } ProcessorCore; + struct { + DWORD NodeNumber; + } NumaNode; + CACHE_DESCRIPTOR Cache; + ULONGLONG Reserved[2]; + }; +} SYSTEM_LOGICAL_PROCESSOR_INFORMATION, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION; + +/* Processor Information Extended */ +typedef ULONG_PTR KAFFINITY; +typedef struct _GROUP_AFFINITY { + KAFFINITY Mask; + WORD Group; + WORD Reserved[3]; +} GROUP_AFFINITY, *PGROUP_AFFINITY; +typedef struct _NUMA_NODE_RELATIONSHIP { + DWORD NodeNumber; + BYTE Reserved[20]; + GROUP_AFFINITY GroupMask; +} NUMA_NODE_RELATIONSHIP, *PNUMA_NODE_RELATIONSHIP; + +typedef struct _PROCESSOR_GROUP_INFO { + BYTE MaximumProcessorCount; + BYTE ActiveProcessorCount; + BYTE Reserved[38]; + KAFFINITY ActiveProcessorMask; +} PROCESSOR_GROUP_INFO, *PPROCESSOR_GROUP_INFO; +typedef struct _GROUP_RELATIONSHIP { + WORD MaximumGroupCount; + WORD ActiveGroupCount; + BYTE Reserved[20]; + PROCESSOR_GROUP_INFO GroupInfo[1]; +} GROUP_RELATIONSHIP, *PGROUP_RELATIONSHIP; + +typedef struct _CACHE_RELATIONSHIP { + BYTE Level; + BYTE Associativity; + WORD LineSize; + DWORD CacheSize; + PROCESSOR_CACHE_TYPE Type; + BYTE Reserved[20]; + GROUP_AFFINITY GroupMask; +} CACHE_RELATIONSHIP, *PCACHE_RELATIONSHIP; + +typedef struct _PROCESSOR_RELATIONSHIP { + BYTE Flags; + BYTE EfficiencyClass; + BYTE Reserved[21]; + WORD GroupCount; + GROUP_AFFINITY GroupMask[1]; +} PROCESSOR_RELATIONSHIP, *PPROCESSOR_RELATIONSHIP; + +typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX { + LOGICAL_PROCESSOR_RELATIONSHIP Relationship; + DWORD Size; + union { + PROCESSOR_RELATIONSHIP Processor; + NUMA_NODE_RELATIONSHIP NumaNode; + CACHE_RELATIONSHIP Cache; + GROUP_RELATIONSHIP Group; + }; +} SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX; + +typedef struct _PROCESS_MEMORY_COUNTERS { + DWORD cb; + DWORD PageFaultCount; + SIZE_T PeakWorkingSetSize; + SIZE_T WorkingSetSize; + SIZE_T QuotaPeakPagedPoolUsage; + SIZE_T QuotaPagedPoolUsage; + SIZE_T QuotaPeakNonPagedPoolUsage; + SIZE_T QuotaNonPagedPoolUsage; + SIZE_T PagefileUsage; + SIZE_T PeakPagefileUsage; +} PROCESS_MEMORY_COUNTERS, *PPROCESS_MEMORY_COUNTERS; + +/* Memory: */ +typedef struct _MEMORYSTATUSEX { + DWORD dwLength; + DWORD dwMemoryLoad; + DWORDLONG ullTotalPhys; + DWORDLONG ullAvailPhys; + DWORDLONG ullTotalPageFile; + DWORDLONG ullAvailPageFile; + DWORDLONG ullTotalVirtual; + DWORDLONG ullAvailVirtual; + DWORDLONG ullAvailExtendedVirtual; +} MEMORYSTATUSEX, *LPMEMORYSTATUSEX; + +/* Processor: */ +typedef struct _PROCESSOR_NUMBER { + WORD Group; + BYTE Number; + BYTE Reserved; +} PROCESSOR_NUMBER, *PPROCESSOR_NUMBER; + + +/* ========================================================================== */ +/* System Info Functions: */ +void WINAPI GetSystemInfo( + LPSYSTEM_INFO lpSystemInfo); +BOOL WINAPI GlobalMemoryStatusEx( + LPMEMORYSTATUSEX lpBuffer); +BOOL WINAPI GetLogicalProcessorInformation( + PSYSTEM_LOGICAL_PROCESSOR_INFORMATION Buffer, + PDWORD ReturnedLength); +BOOL GetLogicalProcessorInformationEx( + LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType, + PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Buffer, + PDWORD ReturnedLength); +BOOL WINAPI GetProcessMemoryInfo( + HANDLE hProcess, + PPROCESS_MEMORY_COUNTERS ppsmemCounters, + DWORD cb); +BOOL WINAPI GetProcessTimes( + HANDLE hProcess, + LPFILETIME lpCreationTime, + LPFILETIME lpExitTime, + LPFILETIME lpKernelTime, + LPFILETIME lpUserTime); + +/* ========================================================================== */ +/* Processor Functions */ +DWORD WINAPI GetCurrentProcessorNumber(void); +void GetCurrentProcessorNumberEx(PPROCESSOR_NUMBER ProcNumber); +#define ALL_PROCESSOR_GROUPS 0xffff +DWORD GetActiveProcessorCount(WORD GroupNumber); + + +#define MAX_COMPUTERNAME_LENGTH 31 +BOOL WINAPI GetComputerNameA( + LPSTR lpBuffer, + LPDWORD lpnSize); +BOOL WINAPI GetComputerNameW( + LPWSTR lpBuffer, + LPDWORD lpnSize); + +/* Version: */ +BOOL WINAPI VerifyVersionInfoA( + LPOSVERSIONINFOEXA lpVersionInfo, + DWORD dwTypeMask, + DWORDLONG dwlConditionMask); +BOOL WINAPI VerifyVersionInfoW( + LPOSVERSIONINFOEXW lpVersionInfo, + DWORD dwTypeMask, + DWORDLONG dwlConditionMask); +ULONGLONG WINAPI VerSetConditionMask( + ULONGLONG ConditionMask, + DWORD TypeMask, + BYTE Condition); + +FORCEINLINE BOOL +IsWindowsVersionOrGreater(WORD major, WORD minor, WORD servpack) +{ + OSVERSIONINFOEXW vi = { sizeof(vi), major, minor, 0, 0, {0}, servpack }; + return VerifyVersionInfoW(&vi, + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, + VerSetConditionMask( + VerSetConditionMask( + VerSetConditionMask(0, + VER_MAJORVERSION, VER_GREATER_EQUAL), + VER_MINORVERSION,VER_GREATER_EQUAL), + VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL)); +} + +FORCEINLINE BOOL +IsWindowsVersionOrLess(WORD major, WORD minor, WORD servpack) +{ + OSVERSIONINFOEXW vi = { sizeof(vi), major, minor, 0, 0, {0}, servpack }; + return VerifyVersionInfoW(&vi, + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, + VerSetConditionMask( + VerSetConditionMask( + VerSetConditionMask(0, + VER_MAJORVERSION, VER_LESS_EQUAL), + VER_MINORVERSION,VER_LESS_EQUAL), + VER_SERVICEPACKMAJOR, VER_LESS_EQUAL)); +} + +#define GREATER IsWindowsVersionOrGreater +FORCEINLINE void +GetWindowsVersionCUSTOM(PWORD major, PWORD minor, PWORD srvpack) +{ + if (GREATER(HIBYTE(_WIN32_WINNT_WIN10), LOBYTE(_WIN32_WINNT_WIN10), 0)) { + *major = 10; + *minor = 0; + *srvpack = 0; + } else if (GREATER(HIBYTE(_WIN32_WINNT_WIN81), LOBYTE(_WIN32_WINNT_WIN81), 0)) { + *major = 6; + *minor = 3; + *srvpack = 0; + } else if (GREATER(HIBYTE(_WIN32_WINNT_WIN8), LOBYTE(_WIN32_WINNT_WIN8), 0)) { + *major = 6; + *minor = 2; + *srvpack = 0; + } else if (GREATER(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 1)) { + *major = 6; + *minor = 1; + *srvpack = 1; + } else if (GREATER(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0)) { + *major = 6; + *minor = 1; + *srvpack = 0; + } else if (GREATER(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 2)) { + *major = 6; + *minor = 0; + *srvpack = 2; + } else if (GREATER(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 1)) { + *major = 6; + *minor = 0; + *srvpack = 1; + } else if (GREATER(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0)) { + *major = 6; + *minor = 0; + *srvpack = 0; + } else if (GREATER(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 3)) { + *major = 5; + *minor = 1; + *srvpack = 2; + } else if (GREATER(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 1)) { + *major = 5; + *minor = 1; + *srvpack = 1; + } else if (GREATER(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0)) { + *major = 5; + *minor = 1; + *srvpack = 0; + } else { + *major = 0; + *minor = 0; + *srvpack = 0; + } +} +#undef GREATER + + +/* ========================================================================== */ +/* CPUID: */ +void __cpuid(int cpuInfo[4], int function_id); +void __cpuidex(int cpuInfo[4], int function_id, int subfunction_id); + +/* ========================================================================== */ +/* Device Context: */ +BOOL WINAPI EnumDisplayDevicesA( + LPCSTR lpDevice, + DWORD iDevNum, + PDISPLAY_DEVICEA lpDisplayDevice, + DWORD dwFlags); +BOOL WINAPI EnumDisplayDevicesW( + LPCWSTR lpDevice, + DWORD iDevNum, + PDISPLAY_DEVICEW lpDisplayDevice, + DWORD dwFlags); + +/* ========================================================================== */ +/* Registry: */ +LONG WINAPI RegOpenKeyExA( + HKEY hKey, + LPCSTR lpSubKey, + DWORD ulOptions, + REGSAM samDesired, + PHKEY phkResult); +LONG WINAPI RegOpenKeyExW( + HKEY hKey, + LPCWSTR lpSubKey, + DWORD ulOptions, + REGSAM samDesired, + PHKEY phkResult); +LONG WINAPI RegQueryValueExA( + HKEY hKey, + LPCSTR lpValueName, + LPDWORD lpReserved, + LPDWORD lpType, + LPBYTE lpData, + LPDWORD lpcbData); +LONG WINAPI RegQueryValueExW( + HKEY hKey, + LPCWSTR lpValueName, + LPDWORD lpReserved, + LPDWORD lpType, + LPBYTE lpData, + LPDWORD lpcbData); +LONG WINAPI RegCreateKeyExA( + HKEY hKey, + LPCSTR lpSubKey, + DWORD Reserved, + LPSTR lpClass, + DWORD dwOptions, + REGSAM samDesired, + LPSECURITY_ATTRIBUTES lpSecurityAttributes, + PHKEY phkResult, + LPDWORD lpdwDisposition); +LONG WINAPI RegCreateKeyExW( + HKEY hKey, + LPCWSTR lpSubKey, + DWORD Reserved, + LPWSTR lpClass, + DWORD dwOptions, + REGSAM samDesired, + LPSECURITY_ATTRIBUTES lpSecurityAttributes, + PHKEY phkResult, + LPDWORD lpdwDisposition); +LONG WINAPI RegEnumValueA( + HKEY hKey, + DWORD dwIndex, + LPSTR lpValueName, + LPDWORD lpcchValueName, + LPDWORD lpReserved, + LPDWORD lpType, + LPBYTE lpData, + LPDWORD lpcbData); +LONG WINAPI RegEnumValueW( + HKEY hKey, + DWORD dwIndex, + LPWSTR lpValueName, + LPDWORD lpcchValueName, + LPDWORD lpReserved, + LPDWORD lpType, + LPBYTE lpData, + LPDWORD lpcbData); +LONG WINAPI RegQueryInfoKeyA( + HKEY hKey, + LPSTR lpClass, + LPDWORD lpcClass, + LPDWORD lpReserved, + LPDWORD lpcSubKeys, + LPDWORD lpcMaxSubKeyLen, + LPDWORD lpcMaxClassLen, + LPDWORD lpcValues, + LPDWORD lpcMaxValueNameLen, + LPDWORD lpcMaxValueLen, + LPDWORD lpcbSecurityDescriptor, + PFILETIME lpftLastWriteTime); +LONG WINAPI RegQueryInfoKeyW( + HKEY hKey, + LPWSTR lpClass, + LPDWORD lpcClass, + LPDWORD lpReserved, + LPDWORD lpcSubKeys, + LPDWORD lpcMaxSubKeyLen, + LPDWORD lpcMaxClassLen, + LPDWORD lpcValues, + LPDWORD lpcMaxValueNameLen, + LPDWORD lpcMaxValueLen, + LPDWORD lpcbSecurityDescriptor, + PFILETIME lpftLastWriteTime); +LONG WINAPI RegEnumKeyExA( + HKEY hKey, + DWORD dwIndex, + LPSTR lpName, + LPDWORD lpcName, + LPDWORD lpReserved, + LPSTR lpClass, + LPDWORD lpcClass, + PFILETIME lpftLastWriteTime); +LONG WINAPI RegEnumKeyExW( + HKEY hKey, + DWORD dwIndex, + LPWSTR lpName, + LPDWORD lpcName, + LPDWORD lpReserved, + LPWSTR lpClass, + LPDWORD lpcClass, + PFILETIME lpftLastWriteTime); +LONG WINAPI RegCloseKey( + HKEY hKey); +LONG WINAPI RegFlushKey( + HKEY hKey); + +#if defined(__cplusplus) +} +#endif + +/* Enable all warnings */ +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + +#endif /* WINDOWS_SYSINFO_H */ +#endif /* _WINDOWS_ */ + diff --git a/exe_load/include/threads.h b/exe_load/include/threads.h new file mode 100644 index 0000000..7120ff1 --- /dev/null +++ b/exe_load/include/threads.h @@ -0,0 +1,356 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Arvid Gerstmann. All rights reserved. + */ +#ifndef _WINDOWS_ +#ifndef WINDOWS_THREADS_H +#define WINDOWS_THREADS_H + +/* Disable all warnings */ +#if defined(_MSC_VER) + #pragma warning(push, 0) +#endif + +#ifndef WINDOWS_BASE_H +#include "windows_base.h" +#endif +#if defined(__cplusplus) +extern "C" { +#endif + +/* WaitForSingleObject, WaitForMultipleObjects, etc: */ +#define INFINITE 0xffffffff + +/* Originally defined in file.h */ +#ifndef STANDARD_RIGHTS_REQUIRED +#define STANDARD_RIGHTS_REQUIRED 0x000F0000L +#endif +#ifndef SYNCHRONIZE +#define SYNCHRONIZE 0x00100000L +#endif + +#define STATUS_WAIT_0 ((DWORD)0x00000000L) +#define STATUS_ABANDONED_WAIT_0 ((DWORD)0x00000080L) +#define STATUS_TIMEOUT ((DWORD)0x00000102L) +#define STATUS_PENDING ((DWORD)0x00000103L) + +#define WAIT_FAILED ((DWORD)0xffffffff) +#define WAIT_OBJECT_0 ((STATUS_WAIT_0) + 0) +#define WAIT_ABANDONED ((STATUS_ABANDONED_WAIT_0) + 0) +#define WAIT_TIMEOUT 258L + +/* TLS: */ +#ifndef TLS_OUT_OF_INDEXES +#define TLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF) +#endif +#ifndef FLS_OUT_OF_INDEXES +#define FLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF) +#endif + + +/* Thread creation flags: */ +#define CREATE_NEW_CONSOLE 0x00000010 +#define CREATE_NO_WINDOW 0x08000000 +#define CREATE_SUSPENDED 0x00000004 +#define DETACHED_PROCESS 0x00000008 + +/* Thread Access Rights: */ +#define THREAD_GET_CONTEXT (0x0008) +#define THREAD_QUERY_INFORMATION (0x0040) +#define THREAD_SUSPEND_RESUME (0x0002) +#define THREAD_TERMINATE (0x0001) +#define THREAD_ALL_ACCESS \ + (STANDARD_RIGHTS_REQUIRED | \ + SYNCHRONIZE | \ + 0xFFFF) + +/* Semaphore Access Rights: */ +#define SEMAPHORE_ALL_ACCESS 0x1F0003 +#define SEMAPHORE_MODIFY_STATE 0x0002 +#define EVENT_ALL_ACCESS 0x1F0003 +#define EVENT_MODIFY_STATE 0x0002 + + +/* ========================================================================== */ +/* Structures: */ +/* Magic for Thread Local Storage: */ +typedef void (NTAPI *PIMAGE_TLS_CALLBACK)( + PVOID DllHandle, + DWORD Reason, + PVOID Reserved); +typedef struct _IMAGE_TLS_DIRECTORY32 { + DWORD StartAddressOfRawData; + DWORD EndAddressOfRawData; + DWORD AddressOfIndex; + DWORD AddressOfCallbacks; + DWORD SizeOfZeroFill; + DWORD Characteristics; +} IMAGE_TLS_DIRECTORY32, *PIMAGE_TLS_DIRECTORY32; +typedef struct _IMAGE_TLS_DIRECTORY64 { + ULONGLONG StartAddressOfRawData; + ULONGLONG EndAddressOfRawData; + ULONGLONG AddressOfIndex; + ULONGLONG AddressOfCallbacks; + DWORD SizeOfZeroFill; + DWORD Characteristics; +} IMAGE_TLS_DIRECTORY64, *PIMAGE_TLS_DIRECTORY64; +#if defined(_WIN64) +typedef IMAGE_TLS_DIRECTORY64 IMAGE_TLS_DIRECTORY; +typedef PIMAGE_TLS_DIRECTORY64 PIMAGE_TLS_DIRECTORY; +#else +typedef IMAGE_TLS_DIRECTORY32 IMAGE_TLS_DIRECTORY; +typedef PIMAGE_TLS_DIRECTORY32 PIMAGE_TLS_DIRECTORY; +#endif + +/* Linked List */ +typedef struct _LIST_ENTRY { + struct _LIST_ENTRY *Flink; + struct _LIST_ENTRY *Blink; +} LIST_ENTRY, *PLIST_ENTRY; + +typedef struct _RTL_CRITICAL_SECTION_DEBUG { + WORD Type; + WORD CreatorBackTraceIndex; + struct _RTL_CRITICAL_SECTION *CriticalSection; + LIST_ENTRY ProcessLocksList; + DWORD EntryCount; + DWORD ContentionCount; + DWORD Flags; + WORD CreatorBackTraceIndexHigh; + WORD SpareWORD; +} RTL_CRITICAL_SECTION_DEBUG, *PRTL_CRITICAL_SECTION_DEBUG; + +#pragma pack(push, 8) +typedef struct _RTL_CRITICAL_SECTION { + PRTL_CRITICAL_SECTION_DEBUG DebugInfo; + LONG LockCount; + LONG RecursionCount; + HANDLE OwningThread; + HANDLE LockSemaphore; + ULONG_PTR SpinCount; +} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION; +typedef RTL_CRITICAL_SECTION CRITICAL_SECTION; +typedef PRTL_CRITICAL_SECTION PCRITICAL_SECTION; +typedef PRTL_CRITICAL_SECTION LPCRITICAL_SECTION; +#pragma pack(pop) + +typedef struct _RTL_CONDITION_VARIABLE { + PVOID Ptr; +} RTL_CONDITION_VARIABLE, *PRTL_CONDITION_VARIABLE; +#define RTL_CONDITION_VARIABLE_INIT {0} +#define RTL_CONDITION_VARIABLE_LOCKMODE_SHARED 0x1 +typedef RTL_CONDITION_VARIABLE CONDITION_VARIABLE; +typedef PRTL_CONDITION_VARIABLE PCONDITION_VARIABLE; + +#define SRWLOCK_INIT {0} +typedef struct _RTL_SRWLOCK { + PVOID Ptr; +} RTL_SRWLOCK, *PRTL_SRWLOCK; +typedef RTL_SRWLOCK SRWLOCK, *PSRWLOCK; + +/* ========================================================================== */ +/* Waiting Functions: */ +DWORD WINAPI WaitForSingleObject( + HANDLE hHandle, + DWORD dwMilliseconds); +DWORD WINAPI WaitForMultipleObjects( + DWORD nCount, + const HANDLE *lpHandles, + BOOL bWaitAll, + DWORD dwMilliseconds); + +DWORD WINAPI WaitForSingleObjectEx( + HANDLE hHandle, + DWORD dwMilliseconds, + BOOL bAlertable); +DWORD WINAPI WaitForMultipleObjectsEx( + DWORD nCount, + const HANDLE *lpHandles, + BOOL bWaitAll, + DWORD dwMilliseconds, + BOOL bAlertable); + +/* ========================================================================== */ +/* Threading Functions: */ +typedef DWORD (WINAPI *PTHREAD_START_ROUTINE)(LPVOID); +typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE; +HANDLE WINAPI CreateThread( + LPSECURITY_ATTRIBUTES lpThreadAttributes, + SIZE_T dwStackSize, + LPTHREAD_START_ROUTINE lpStartAddress, + LPVOID lpParameter, + DWORD dwCreationFlags, + LPDWORD lpThreadId); +HANDLE WINAPI GetCurrentThread(void); +DWORD WINAPI GetCurrentThreadId(void); +DWORD_PTR WINAPI SetThreadAffinityMask( + HANDLE hThread, + DWORD_PTR dwThreadAffinityMask); +HANDLE WINAPI OpenThread( + DWORD dwDesiredAccess, + BOOL bInheritHandle, + DWORD dwThreadId); +DWORD WINAPI SuspendThread( + HANDLE hThread); +DWORD WINAPI ResumeThread( + HANDLE hThread); +void WINAPI ExitThread( + DWORD dwExitCode); +BOOL WINAPI GetProcessAffinityMask( + HANDLE hProcess, + PDWORD_PTR lpProcessAffinityMask, + PDWORD_PTR lpSystemAffinityMask); +BOOL WINAPI SetProcessAffinityMask( + HANDLE hProcess, + DWORD_PTR dwProcessAffinityMask); +BOOL WINAPI SwitchToThread(void); + +/* ========================================================================== */ +/* CriticalSection Functions: */ +void WINAPI InitializeCriticalSection( + LPCRITICAL_SECTION lpCriticalSection); +BOOL WINAPI InitializeCriticalSectionAndSpinCount( + LPCRITICAL_SECTION lpCriticalSection, + DWORD dwSpinCount); +DWORD WINAPI SetCriticalSectionSpinCount( + LPCRITICAL_SECTION lpCriticalSection, + DWORD dwSpinCount); +void WINAPI EnterCriticalSection( + LPCRITICAL_SECTION lpCriticalSection); +BOOL WINAPI TryEnterCriticalSection( + LPCRITICAL_SECTION lpCriticalSection); +void WINAPI LeaveCriticalSection( + LPCRITICAL_SECTION lpCriticalSection); +void WINAPI DeleteCriticalSection( + LPCRITICAL_SECTION lpCriticalSection); + +/* ========================================================================== */ +/* Condition Variable: */ +void WINAPI InitializeConditionVariable( + PCONDITION_VARIABLE ConditionVariable); +BOOL WINAPI SleepConditionVariableCS( + PCONDITION_VARIABLE ConditionVariable, + PCRITICAL_SECTION CriticalSection, + DWORD dwMilliseconds); +void WINAPI WakeAllConditionVariable( + PCONDITION_VARIABLE ConditionVariable); +void WINAPI WakeConditionVariable( + PCONDITION_VARIABLE ConditionVariable); + +/* ========================================================================== */ +/* Mutex Functions: */ +HANDLE WINAPI CreateMutexA( + LPSECURITY_ATTRIBUTES lpMutexAttributes, + BOOL bInitialOwner, + LPCSTR lpName); +HANDLE WINAPI CreateMutexW( + LPSECURITY_ATTRIBUTES lpMutexAttributes, + BOOL bInitialOwner, + LPCWSTR lpName); +BOOL WINAPI ReleaseMutex( + HANDLE hMutex); + +/* ========================================================================== */ +/* Semaphore Functions: */ +HANDLE WINAPI CreateSemaphoreA( + LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, + LONG lInitialCount, + LONG lMaximumCount, + LPCSTR lpName); +HANDLE WINAPI CreateSemaphoreW( + LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, + LONG lInitialCount, + LONG lMaximumCount, + LPCWSTR lpName); +BOOL WINAPI ReleaseSemaphore( + HANDLE hSemaphore, + LONG lReleaseCount, + LPLONG lpPreviousCount); +HANDLE WINAPI OpenSemaphoreA( + DWORD dwDesiredAccess, + BOOL bInheritHandle, + LPCSTR lpName); +HANDLE WINAPI OpenSemaphoreW( + DWORD dwDesiredAccess, + BOOL bInheritHandle, + LPCWSTR lpName); + + +/* ========================================================================== */ +/* Thread-Local Storage: */ +DWORD WINAPI TlsAlloc(void); +BOOL WINAPI TlsSetValue( + DWORD dwTlsIndex, + LPVOID lpTlsValue); +LPVOID WINAPI TlsGetValue( + DWORD dwTlsIndex); +DWORD WINAPI TlsFree( + DWORD dwTlsIndex); + +typedef void(WINAPI *PFLS_CALLBACK_FUNCTION)(PVOID); +DWORD WINAPI FlsAlloc(PFLS_CALLBACK_FUNCTION lpCallback); +BOOL WINAPI FlsFree(DWORD dwFlsIndex); +BOOL WINAPI FlsSetValue(DWORD dwFlsIndex, PVOID lpFlsData); +PVOID WINAPI FlsGetValue(DWORD dwFlsIndex); + + +/* ========================================================================== */ +/* SRW Lock Functions: */ +void WINAPI InitializeSRWLock(PSRWLOCK SRWLock); + +void WINAPI AcquireSRWLockExclusive(PSRWLOCK SRWLock); +void WINAPI AcquireSRWLockShared(PSRWLOCK SRWLock); + +void WINAPI ReleaseSRWLockExclusive(PSRWLOCK SRWLock); +void WINAPI ReleaseSRWLockShared(PSRWLOCK SRWLock); + +BOOL WINAPI TryAcquireSRWLockExclusive(PSRWLOCK SRWLock); +BOOL WINAPI TryAcquireSRWLockShared(PSRWLOCK SRWLock); + +BOOL WINAPI SleepConditionVariableSRW( + PCONDITION_VARIABLE ConditionVariable, + PSRWLOCK SRWLock, + DWORD dwMilliseconds, + ULONG Flags); + +/* ========================================================================== */ +/* Waiting: */ +BOOL WINAPI WaitOnAddress( + void volatile *Address, + PVOID CompareAddress, + SIZE_T AddressSize, + DWORD dwMilliseconds); +void WINAPI WakeByAddressSingle( + PVOID Address); +void WINAPI WakeByAddressAll( + PVOID Address); + +/* ========================================================================== */ +/* Events: */ +HANDLE WINAPI CreateEvent( + LPSECURITY_ATTRIBUTES lpEventAttributes, + BOOL bManualReset, + BOOL bInitialState, + LPCTSTR lpName); +HANDLE WINAPI OpenEvent( + DWORD dwDesiredAccess, + BOOL bInheritHandle, + LPCTSTR lpName); +BOOL WINAPI SetEvent( + HANDLE hEvent); +BOOL WINAPI ResetEvent( + HANDLE hEvent); + + +#if defined(__cplusplus) +} +#endif + +/* Enable all warnings */ +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + +#endif /* WINDOWS_THREADS_H */ +#endif /* _WINDOWS_ */ + diff --git a/exe_load/include/window.h b/exe_load/include/window.h new file mode 100644 index 0000000..65765e3 --- /dev/null +++ b/exe_load/include/window.h @@ -0,0 +1,386 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Arvid Gerstmann. All rights reserved. + */ +#ifndef _WINDOWS_ +#ifndef WINDOWS_WINDOW_H +#define WINDOWS_WINDOW_H + +/* Disable all warnings */ +#if defined(_MSC_VER) + #pragma warning(push, 0) +#endif + +#ifndef WINDOWS_BASE_H +#include "windows_base.h" +#endif +#if defined(__cplusplus) +extern "C" { +#endif + +/* MessageBox customizations: */ +#define MB_ABORTRETRYIGNORE 0x00000002L +#define MB_CANCELTRYCONTINUE 0x00000006L +#define MB_HELP 0x00004000L +#define MB_OK 0x00000000L +#define MB_OKCANCEL 0x00000001L +#define MB_RETRYCANCEL 0x00000005L +#define MB_YESNO 0x00000004L +#define MB_YESNOCANCEL 0x00000003L + +#define MB_ICONEXCLAMATION 0x00000030L +#define MB_ICONWARNING 0x00000030L +#define MB_ICONINFORMATION 0x00000040L +#define MB_ICONASTERISK 0x00000040L +#define MB_ICONQUESTION 0x00000020L +#define MB_ICONSTOP 0x00000010L +#define MB_ICONERROR 0x00000010L +#define MB_ICONHAND 0x00000010L + +#define MB_DEFBUTTON1 0x00000000L +#define MB_DEFBUTTON2 0x00000100L +#define MB_DEFBUTTON3 0x00000200L +#define MB_DEFBUTTON4 0x00000300L + +#define MB_APPLMODAL 0x00000000L +#define MB_SYSTEMMODAL 0x00001000L +#define MB_TASKMODAL 0x00002000L + +#define MB_DEFAULT_DESKTOP_ONLY 0x00020000L +#define MB_RIGHT 0x00080000L +#define MB_RTLREADING 0x00100000L +#define MB_SETFOREGROUND 0x00010000L +#define MB_TOPMOST 0x00040000L +#define MB_SERVICE_NOTIFICATION 0x00200000L + +#define IDABORT (3) +#define IDCANCEL (2) +#define IDCONTINUE (11) +#define IDIGNORE (5) +#define IDNO (7) +#define IDOK (1) +#define IDRETRY (4) +#define IDTRYAGAIN (10) +#define IDYES (6) + +/* Window Styles: */ +#define WS_OVERLAPPED 0x00000000L +#define WS_POPUP 0x80000000L +#define WS_CHILD 0x40000000L +#define WS_MINIMIZE 0x20000000L +#define WS_VISIBLE 0x10000000L +#define WS_DISABLED 0x08000000L +#define WS_CLIPSIBLINGS 0x04000000L +#define WS_CLIPCHILDREN 0x02000000L +#define WS_MAXIMIZE 0x01000000L +#define WS_CAPTION 0x00C00000L +#define WS_BORDER 0x00800000L +#define WS_DLGFRAME 0x00400000L +#define WS_VSCROLL 0x00200000L +#define WS_HSCROLL 0x00100000L +#define WS_SYSMENU 0x00080000L +#define WS_THICKFRAME 0x00040000L +#define WS_GROUP 0x00020000L +#define WS_TABSTOP 0x00010000L + +#define WS_MINIMIZEBOX 0x00020000L +#define WS_MAXIMIZEBOX 0x00010000L + + +#define WS_TILED WS_OVERLAPPED +#define WS_ICONIC WS_MINIMIZE +#define WS_SIZEBOX WS_THICKFRAME +#define WS_TILEDWINDOW WS_OVERLAPPEDWINDOW + +/* Common Window Styles: */ +#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED | \ + WS_CAPTION | \ + WS_SYSMENU | \ + WS_THICKFRAME | \ + WS_MINIMIZEBOX | \ + WS_MAXIMIZEBOX) +#define WS_POPUPWINDOW (WS_POPUP | \ + WS_BORDER | \ + WS_SYSMENU) +#define WS_CHILDWINDOW (WS_CHILD) + +#define CW_USEDEFAULT ((int)0x80000000) + +/* Class Styles: */ +#define CS_OWNDC 0x0020 +#define CS_VREDRAW 0x0001 +#define CS_HREDRAW 0x0002 + +/* Messages: */ +#define PM_NOREMOVE 0x0000 +#define PM_REMOVE 0x0001 +#define PM_NOYIELD 0x0002 + +#define WM_NULL 0x0000 +#define WM_CREATE 0x0001 +#define WM_DESTROY 0x0002 +#define WM_MOVE 0x0003 +#define WM_SIZE 0x0005 +#define WM_SETFOCUS 0x0007 +#define WM_KILLFOCUS 0x0008 +#define WM_ENABLE 0x000A +#define WM_SETREDRAW 0x000B +#define WM_SETTEXT 0x000C +#define WM_GETTEXT 0x000D +#define WM_GETTEXTLENGTH 0x000E +#define WM_PAINT 0x000F +#define WM_CLOSE 0x0010 +#define WM_QUIT 0x0012 +#define WM_ERASEBKGND 0x0014 +#define WM_SYSCOLORCHANGE 0x0015 +#define WM_SHOWWINDOW 0x0018 +#define WM_WININICHANGE 0x001A +#define WM_NCDESTROY 0x0082 + +#define WM_KEYDOWN 0x0100 +#define WM_KEYUP 0x0101 +#define WM_SYSKEYDOWN 0x0104 +#define WM_SYSKEYUP 0x0105 + +#define WM_SYSCOMMAND 0x0112 + +#define WM_ENTERSIZEMOVE 0x0231 +#define WM_EXITSIZEMOVE 0x0232 + +#define WM_ACTIVATE 0x0006 +#define WA_INACTIVE 0 +#define WA_ACTIVE 1 +#define WA_CLICKACTIVE 2 + +#define SC_KEYMENU 0xF100 + +/* Events: */ +#define EVENT_ALL_ACCESS 0x1F0003 +#define EVENT_MODIFY_STATE 0x0002 + +/* Virtual Keys: */ +#define VK_BACK 0x08 +#define VK_TAB 0x09 +#define VK_SHIFT 0x10 +#define VK_CONTROL 0x11 +#define VK_MENU 0x12 +#define VK_RETURN 0x0D + +#define VK_ESCAPE 0x1B + +#define VK_SPACE 0x20 +#define VK_PRIOR 0x21 +#define VK_NEXT 0x22 +#define VK_END 0x23 +#define VK_HOME 0x24 +#define VK_LEFT 0x25 +#define VK_UP 0x26 +#define VK_RIGHT 0x27 +#define VK_DOWN 0x28 +#define VK_SELECT 0x29 +#define VK_PRINT 0x2A +#define VK_EXECUTE 0x2B +#define VK_SNAPSHOT 0x2C +#define VK_INSERT 0x2D +#define VK_DELETE 0x2E +#define VK_HELP 0x2F + +#define VK_LWIN 0x5B +#define VK_RWIN 0x5C +#define VK_PROCESSKEY 0xE5 + +// Show window commands +#define SW_HIDE 0 +#define SW_SHOWNORMAL 1 +#define SW_NORMAL 1 +#define SW_SHOWMINIMIZED 2 +#define SW_SHOWMAXIMIZED 3 +#define SW_MAXIMIZE 3 +#define SW_SHOWNOACTIVATE 4 +#define SW_SHOW 5 +#define SW_MINIMIZE 6 +#define SW_SHOWMINNOACTIVE 7 +#define SW_SHOWNA 8 +#define SW_RESTORE 9 +#define SW_SHOWDEFAULT 10 +#define SW_FORCEMINIMIZE 11 +#define SW_MAX 11 + +/* ========================================================================== */ +/* Structures: */ +typedef struct _RECT { + LONG left; + LONG top; + LONG right; + LONG bottom; +} RECT, *PRECT, *LPRECT; + +/* Window: */ +typedef LRESULT (CALLBACK *WNDPROC)(HWND, UINT, WPARAM, LPARAM); +typedef struct tagWNDCLASS { + UINT style; + WNDPROC lpfnWndProc; + int cbClsExtra; + int cbWndExtra; + HINSTANCE hInstance; + HICON hIcon; + HCURSOR hCursor; + HBRUSH hbrBackground; + LPCTSTR lpszMenuName; + LPCTSTR lpszClassName; +} WNDCLASS, *PWNDCLASS; + +/* Messages: */ +typedef struct tagPOINT { + LONG x; + LONG y; +} POINT, *PPOINT; + +typedef struct tagMSG { + HWND hwnd; + UINT message; + WPARAM wParam; + LPARAM lParam; + DWORD time; + POINT pt; +} MSG, *PMSG, *LPMSG; + + +/* ========================================================================== */ +/* Window Functions: */ +int WINAPI MessageBoxA( + HWND hWND, + LPCSTR lpText, + LPCSTR lpCaption, + UINT uType); +int WINAPI MessageBoxW( + HWND hWND, + LPCWSTR lpText, + LPCWSTR lpCaption, + UINT uType); +ATOM WINAPI RegisterClassA( + WNDCLASS *lpWndClass); +ATOM WINAPI RegisterClassW( + WNDCLASS *lpWndClass); +BOOL WINAPI UnregisterClassA( + LPCSTR lpClassName, + HINSTANCE hInstance); +BOOL WINAPI UnregisterClassW( + LPCWSTR lpClassName, + HINSTANCE hInstance); +HWND WINAPI CreateWindowExA( + DWORD dwExStyle, + LPCSTR lpClassName, + LPCSTR lpWindowName, + DWORD dwStyle, + int x, + int y, + int nWidth, + int nHeight, + HWND hWndParent, + HMENU hMenu, + HINSTANCE hInstance, + LPVOID lpParam); +HWND WINAPI CreateWindowExW( + DWORD dwExStyle, + LPCWSTR lpClassName, + LPCWSTR lpWindowName, + DWORD dwStyle, + int x, + int y, + int nWidth, + int nHeight, + HWND hWndParent, + HMENU hMenu, + HINSTANCE hInstance, + LPVOID lpParam); +BOOL WINAPI ShowWindow( + HWND hWnd, + int nCmdShow); +BOOL WINAPI UpdateWindow( + HWND hWnd); +LRESULT WINAPI DefWindowProcA( + HWND hWnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam); +LRESULT WINAPI DefWindowProcW( + HWND hWnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam); +BOOL WINAPI DestroyWindow( + HWND hWnd); +BOOL WINAPI AdjustWindowRectEx( + LPRECT lpRect, + DWORD dwStyle, + BOOL bMenu, + DWORD dwExStyle); +BOOL WINAPI GetClientRect( + HWND hWnd, + LPRECT lpRect); +int WINAPI GetSystemMetrics( + int nIndex); + +/* ========================================================================== */ +/* Message Queue: */ +BOOL WINAPI PeekMessageA( + LPMSG lpMsg, + HWND hWnd, + UINT wMsgFilterMin, + UINT wMsgFilterMax, + UINT wRemoveMsg); +BOOL WINAPI PeekMessageW( + LPMSG lpMsg, + HWND hWnd, + UINT wMsgFilterMin, + UINT wMsgFilterMax, + UINT wRemoveMsg); +BOOL WINAPI TranslateMessage( + const MSG *lpMsg); +LRESULT WINAPI DispatchMessageA( + const MSG *lpMsg); +LRESULT WINAPI DispatchMessageW( + const MSG *lpMsg); +void WINAPI PostQuitMessage( + int nExitCode); + +/* ========================================================================== */ +/* Events: */ +HANDLE WINAPI CreateEventA( + LPSECURITY_ATTRIBUTES lpEventAttributes, + BOOL bManualReset, + BOOL bInitialState, + LPCSTR lpName); +HANDLE WINAPI CreateEventW( + LPSECURITY_ATTRIBUTES lpEventAttributes, + BOOL bManualReset, + BOOL bInitialState, + LPCWSTR lpName); +HANDLE WINAPI OpenEventA( + DWORD dwDesiredAccess, + BOOL bInheritHandle, + LPCSTR lpName); +HANDLE WINAPI OpenEventW( + DWORD dwDesiredAccess, + BOOL bInheritHandle, + LPCWSTR lpName); +BOOL WINAPI ResetEvent( + HANDLE hEvent); +BOOL WINAPI SetEvent( + HANDLE hEvent); +SHORT WINAPI GetKeyState( + int nVirtKey); + +#if defined(__cplusplus) +} +#endif + +/* Enable all warnings */ +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + +#endif /* WINDOWS_WINDOW_H */ +#endif /* _WINDOWS_ */ + diff --git a/exe_load/include/windows.h b/exe_load/include/windows.h new file mode 100644 index 0000000..5539cd6 --- /dev/null +++ b/exe_load/include/windows.h @@ -0,0 +1,4695 @@ +#ifndef _WINDOWS_ +#pragma once +#ifndef _INC_WINDOWS +#define _INC_WINDOWS +#ifndef WINDOWS_H +#define WINDOWS_H + + +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Arvid Gerstmann. All rights reserved. + */ +#ifndef _WINDOWS_ +#ifndef WINDOWS_BASE_H +#define WINDOWS_BASE_H + +/* Disable all warnings */ +#if defined(_MSC_VER) + #pragma warning(push, 0) +#endif +#if defined(__cplusplus) +extern "C" { +#endif + +/* size_t */ +/* #include */ + + +/* + * Windows Version requirements: Vista + * See here for more information regarding this define: + * https://msdn.microsoft.com/en-us/library/aa383745(VS.85).aspx + */ +#ifndef _WIN32_WINNT + #define _WIN32_WINNT 0x0600 +#endif + +/* Magic: */ +#define _CRTALLOC(x) __declspec(allocate(x)) +#define DECLSPEC_ALIGN(x) __declspec(align(x)) + +/* Basic Defines: */ +#define NTAPI __stdcall +#define WINAPI __stdcall +#define APIENTRY __stdcall +#define CALLBACK __stdcall +#define TRUE (1) +#define FALSE (0) +#ifndef FORCEINLINE +#define FORCEINLINE __forceinline +#endif +#ifdef UNICODE +#define __TEXT(x) L ## x +#define TEXT(x) __TEXT(x) +#else +#define TEXT(x) x +#endif +#define PATH_MAX 260 +#define MAX_PATH 260 + +#define MAKEWORD(a, b) \ + ((WORD)(((BYTE)(((DWORD_PTR)(a)) & 0xff)) | \ + ((WORD)((BYTE)(((DWORD_PTR)(b)) & 0xff))) << 8)) +#define MAKELONG(a, b) \ + ((LONG)(((WORD)(((DWORD_PTR)(a)) & 0xffff)) | \ + ((DWORD)((WORD)(((DWORD_PTR)(b)) & 0xffff))) << 16)) +#define LOWORD(l) ((WORD)(((DWORD_PTR)(l)) & 0xffff)) +#define HIWORD(l) ((WORD)((((DWORD_PTR)(l)) >> 16) & 0xffff)) +#define LOBYTE(w) ((BYTE)(((DWORD_PTR)(w)) & 0xff)) +#define HIBYTE(w) ((BYTE)((((DWORD_PTR)(w)) >> 8) & 0xff)) + +#if !defined(_68K_) \ + && !defined(_MPPC_) \ + && !defined(_X86_) \ + && !defined(_IA64_) \ + && !defined(_AMD64_) \ + && defined(_M_AMD64) +#define _AMD64_ +#endif + +/* + * Windows uses the `interface` define to create interfaces for both C and C++. + * Only the C version is defined here and not the C++ version. + * Both can be found in BaseTyps.h + */ +#define STDMETHODCALLTYPE __stdcall +#define STDMETHODVCALLTYPE __cdecl +#define STDAPICALLTYPE __stdcall +#define STDAPIVCALLTYPE __cdecl + +#define interface struct +#define PURE +#define THIS_ INTERFACE * This, +#define THIS INTERFACE * This +#define STDMETHOD(method) HRESULT (STDMETHODCALLTYPE * method) +#define STDMETHOD_(type, method) type (STDMETHODCALLTYPE * method) +#define STDMETHODV(method) HRESULT (STDMETHODVCALLTYPE * method) +#define STDMETHODV_(type, method) type (STDMETHODVCALLTYPE * method) + +#define IFACEMETHOD(method) __override STDMETHOD(method) +#define IFACEMETHOD_(type, method) __override STDMETHOD_(type,method) +#define IFACEMETHODV(method) __override STDMETHODV(method) +#define IFACEMETHODV_(type, method) __override STDMETHODV_(type,method) + +#define BEGIN_INTERFACE +#define END_INTERFACE + +#ifdef CONST_VTABLE +#undef CONST_VTBL +#define CONST_VTBL const +#define DECLARE_INTERFACE(iface) \ + typedef interface iface { \ + const struct iface##Vtbl * lpVtbl; \ + } iface; \ + typedef const struct iface##Vtbl iface##Vtbl; \ + const struct iface##Vtbl + +#else + +#undef CONST_VTBL +#define CONST_VTBL +#define DECLARE_INTERFACE(iface) \ + typedef interface iface { \ + struct iface##Vtbl * lpVtbl; \ + } iface; \ + typedef struct iface##Vtbl iface##Vtbl; \ + struct iface##Vtbl + +#endif /* CONST_VTABLE */ + +#define DECLARE_INTERFACE_(iface, baseiface) DECLARE_INTERFACE(iface) + + +#define HRESULT_IS_WIN32(x) \ + ((((x) >> 16) & 0xFFFF) == 0x8) +#define HRESULT_IS_FAILURE(x) \ + ((((x) >> 31) & 0x1) == 0x1) +#define HRESULT_FACILITY(x) \ + (((x) >> 16) & 0xFFFF) +#define HRESULT_CODE(x) \ + ((x) & 0xFFFF) +#define HRESULT_FROM_WIN32(x) \ + (0x80070000 | (x)) + + +/* ========================================================================== */ +/* Basic Types: */ +/* https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx */ +/* ========================================================================== */ + +#if defined(_MSC_VER) + /* 1300 == VC 6.0 */ + #if _MSC_VER < 1300 + typedef signed char int8_t; + typedef unsigned char uint8_t; + typedef signed short int16_t; + typedef unsigned short uint16_t; + typedef signed int int32_t; + typedef unsigned int uint32_t; + #else + typedef signed __int8 int8_t; + typedef unsigned __int8 uint8_t; + typedef signed __int16 int16_t; + typedef unsigned __int16 uint16_t; + typedef signed __int32 int32_t; + typedef unsigned __int32 uint32_t; + #endif + typedef signed __int64 int64_t; + typedef unsigned __int64 uint64_t; +#else + #include +#endif + + +typedef int BOOL; +typedef char CHAR; +typedef short SHORT; +typedef int INT; +typedef long LONG; +typedef unsigned char UCHAR; +typedef unsigned short USHORT; +typedef unsigned int UINT; +typedef unsigned long ULONG; +typedef unsigned char BYTE; +typedef unsigned short WORD; +typedef float FLOAT; +typedef unsigned long DWORD; +#ifndef HAVE_WCHAR_T +#define HAVE_WCHAR_T +#if !defined(__cplusplus) +typedef unsigned short wchar_t; +#endif +#endif +typedef wchar_t WCHAR; +typedef wchar_t * PWCHAR; +typedef WORD ATOM; +typedef unsigned int ULONG32; +typedef uint64_t DWORD64; +typedef uint64_t ULONG64; +typedef signed int INT32; +typedef signed __int64 INT64; +typedef uint64_t DWORDLONG; + +typedef CHAR * PCHAR; +typedef ULONG * PULONG; +typedef ULONG64 * PULONG64; +typedef DWORD64 * PDWORD64; + +#if !defined(_M_IX86) +typedef int64_t LONGLONG; +typedef uint64_t ULONGLONG; +#else +typedef double LONGLONG; +typedef double ULONGLONG; +#endif + +typedef void VOID; +typedef void * PVOID; +typedef void * LPVOID; +typedef BOOL * PBOOL; +typedef BOOL * LPBOOL; +typedef WORD * PWORD; +typedef LONG * PLONG; +typedef LONG * LPLONG; +typedef DWORD * PDWORD; + +typedef LPVOID HANDLE; +typedef HANDLE HINSTANCE; +typedef HANDLE HWND; +typedef HINSTANCE HMODULE; +typedef HANDLE HDC; +typedef HANDLE HGLRC; +typedef HANDLE HMENU; +typedef HANDLE * PHANDLE; +typedef HANDLE * LPHANDLE; + +#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name + +typedef WCHAR * PWSTR; +typedef BYTE * LPBYTE; +typedef long * LPLONG; +typedef DWORD * LPDWORD; +typedef const void * LPCVOID; + +#if defined(_WIN64) +typedef int64_t INT_PTR; +typedef int64_t LONG_PTR; +typedef uint64_t UINT_PTR; +typedef uint64_t ULONG_PTR; +#else +typedef int INT_PTR; +typedef long LONG_PTR; +typedef unsigned int UINT_PTR; +typedef unsigned long ULONG_PTR; +#endif +typedef ULONG_PTR DWORD_PTR; +typedef DWORD_PTR * PDWORD_PTR; + +typedef ULONG_PTR SIZE_T; +typedef LONG_PTR SSIZE_T; + +typedef CHAR * LPSTR; +typedef WCHAR * LPWSTR; +typedef const CHAR * LPCSTR; +typedef const WCHAR * LPCWSTR; +#if defined(UNICODE) +typedef WCHAR TCHAR; +typedef WCHAR TBYTE; +typedef LPCWSTR LPCTSTR; +typedef LPWSTR LPTSTR; +#else +typedef char TCHAR; +typedef unsigned char TBYTE; +typedef LPCSTR LPCTSTR; +typedef LPSTR LPTSTR; +#endif + +#define MINCHAR 0x80 +#define MAXCHAR 0x7f +#define MINSHORT 0x8000 +#define MAXSHORT 0x7fff +#define MINLONG 0x80000000 +#define MAXLONG 0x7fffffff +#define MAXBYTE 0xff +#define MAXWORD 0xffff +#define MAXDWORD 0xffffffff + +#if defined(_WIN64) +typedef INT_PTR (WINAPI *FARPROC)(void); +typedef INT_PTR (WINAPI *NEARPROC)(void); +typedef INT_PTR (WINAPI *PROC)(void); +#else +typedef int (WINAPI *FARPROC)(void); +typedef int (WINAPI *NEARPROC)(void); +typedef int (WINAPI *PROC)(void); +#endif + +typedef DWORD ACCESS_MASK; +typedef ACCESS_MASK * PACCESS_MASK; + +typedef HANDLE HICON; +typedef HANDLE HBRUSH; +typedef HICON HCURSOR; + +typedef LONG HRESULT; +typedef LONG_PTR LRESULT; +typedef LONG_PTR LPARAM; +typedef UINT_PTR WPARAM; + +typedef void * HGDIOBJ; + +typedef HANDLE HKEY; +typedef HKEY * PHKEY; +typedef ACCESS_MASK REGSAM; + + +/* ========================================================================== */ +/* Errors: */ +/* ========================================================================== */ +#define ERROR_SUCCESS 0L +#define ERROR_FILE_NOT_FOUND 2L +#define ERROR_PATH_NOT_FOUND 3L +#define ERROR_TOO_MANY_OPEN_FILES 4L +#define ERROR_ACCESS_DENIED 5L +#define ERROR_NO_MORE_FILES 18L +#define ERROR_SHARING_VIOLATION 32L +#define ERROR_FILE_EXISTS 80L +#define ERROR_INSUFFICIENT_BUFFER 122L +#define ERROR_ALREADY_EXISTS 183L +#define ERROR_MORE_DATA 234L + + +/* ========================================================================== */ +/* Enums */ +/* ========================================================================== */ +/* DllMain Reason: */ +#define DLL_PROCESS_ATTACH (1) +#define DLL_PROCESS_DETACH (0) +#define DLL_THREAD_ATTACH (2) +#define DLL_THREAD_DETACH (3) + + +/* ========================================================================== */ +/* Structures: */ +/* ========================================================================== */ +typedef struct _SECURITY_ATTRIBUTES { + DWORD nLength; + LPVOID lpSecurityDescriptor; + BOOL bInheritHandle; +} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES; + +typedef union _LARGE_INTEGER { + struct { + DWORD LowPart; + LONG HighPart; + }; + struct { + DWORD LowPart; + LONG HighPart; + } u; + LONGLONG QuadPart; +} LARGE_INTEGER, *PLARGE_INTEGER; + +typedef union _ULARGE_INTEGER { + struct { + DWORD LowPart; + DWORD HighPart; + }; + struct { + DWORD LowPart; + DWORD HighPart; + } u; + ULONGLONG QuadPart; +} ULARGE_INTEGER, *PULARGE_INTEGER; + +/* Filetime: */ +typedef struct _FILETIME { + DWORD dwLowDateTime; + DWORD dwHighDateTime; +} FILETIME, *PFILETIME, *LPFILETIME; + + +#if defined(__cplusplus) +} +#endif +/* Enable all warnings */ +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + +#endif /* WINDOWS_BASE_H */ +#endif /* _WINDOWS_ */ + + +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Arvid Gerstmann. All rights reserved. + */ +#ifndef _WINDOWS_ +#ifndef WINDOWS_ATOMIC_H +#define WINDOWS_ATOMIC_H + +/* Disable all warnings */ +#if defined(_MSC_VER) + #pragma warning(push, 0) +#endif + +#include "intrin.h" + +#if defined(__cplusplus) +extern "C" { +#endif + + +/* ========================================================================== */ +/* Atomic Functions: */ +/* ========================================================================== */ + +/* ========================================================================== */ +/* 8-Bit Atomic Intrinsics: */ +/* Exchange */ +char _InterlockedExchange8( + char volatile *Target, + char Value); +char _InterlockedExchangeAdd8( + char volatile *Addend, + char Value); + +/* Bit Operations */ +char _InterlockedExchangeAnd8( + char volatile *Destination, + char Value); +char _InterlockedExchangeOr8( + char volatile *Destination, + char Value); +char _InterlockedExchangeXor8( + char volatile *Destination, + char Value); + +/* Increment & Decrement */ +char _InterlockedDecrement8( + char volatile *Addend); +char _InterlockedIncrement8( + char volatile *Addend); + +/* Compare & Exchang */ +char _InterlockedCompareExchange8( + char volatile *Destination, + char Exchange, + char Comparand); +char _InterlockedCompareExchange8_HLEAcquire( + char volatile *Destination, + char Exchange, + char Comparand); +char _InterlockedCompareExchange8_HLERelease( + char volatile *Destination, + char Exchange, + char Comparand); + + +/* ========================================================================== */ +/* 16-Bit Atomic Intrinsics: */ +/* Exchange */ +short _InterlockedExchange16( + short volatile *Target, + short Value); +short _InterlockedExchangeAdd16( + short volatile *Addend, + short Value); + +/* Bit Operations */ +short _InterlockedExchangeAnd16( + short volatile *Destination, + short Value); +short _InterlockedExchangeOr16( + short volatile *Destination, + short Value); +short _InterlockedExchangeXor16( + short volatile *Destination, + short Value); + +/* Increment & Decrement */ +short _InterlockedDecrement16( + short volatile *Addend); +short _InterlockedIncrement16( + short volatile *Addend); + +/* Compare & Exchang */ +short _InterlockedCompareExchange16( + short volatile *Destination, + short Exchange, + short Comparand); +short _InterlockedCompareExchange16_HLEAcquire( + short volatile *Destination, + short Exchange, + short Comparand); +short _InterlockedCompareExchange16_HLERelease( + short volatile *Destination, + short Exchange, + short Comparand); + + +/* ========================================================================== */ +/* 32-Bit Atomic Intrinsics: */ +/* Exchange */ +long _InterlockedExchange( + long volatile *Target, + long Value); +long _InterlockedExchangeAdd( + long volatile *Addend, + long Value); + +/* Bit Operations */ +long _InterlockedExchangeAnd( + long volatile *Destination, + long Value); +long _InterlockedExchangeOr( + long volatile *Destination, + long Value); +long _InterlockedExchangeXor( + long volatile *Destination, + long Value); + +/* Increment & Decrement */ +long _InterlockedDecrement( + long volatile *Addend); +long _InterlockedIncrement( + long volatile *Addend); + +/* Compare & Exchang */ +long _InterlockedCompareExchange( + long volatile *Destination, + long Exchange, + long Comparand); +long _InterlockedCompareExchange_HLEAcquire( + long volatile *Destination, + long Exchange, + long Comparand); +long _InterlockedCompareExchange_HLERelease( + long volatile *Destination, + long Exchange, + long Comparand); + +/* ========================================================================== */ +/* 64-Bit Atomic Intrinsics: */ +#ifdef _AMD64_ +/* Exchange */ +__int64 _InterlockedExchange64( + __int64 volatile *Target, + __int64 Value); +__int64 _InterlockedExchangeAdd64( + __int64 volatile *Addend, + __int64 Value); + +/* Bit Operations */ +__int64 _InterlockedExchangeAnd64( + __int64 volatile *Destination, + __int64 Value); +__int64 _InterlockedExchangeOr64( + __int64 volatile *Destination, + __int64 Value); +__int64 _InterlockedExchangeXor64( + __int64 volatile *Destination, + __int64 Value); + +/* Increment & Decrement */ +__int64 _InterlockedDecrement64( + __int64 volatile *Addend); +__int64 _InterlockedIncrement64( + __int64 volatile *Addend); + +/* Compare & Exchang */ +__int64 _InterlockedCompareExchange64( + __int64 volatile *Destination, + __int64 Exchange, + __int64 Comparand); +__int64 _InterlockedCompareExchange64_HLEAcquire( + __int64 volatile *Destination, + __int64 Exchange, + __int64 Comparand); +__int64 _InterlockedCompareExchange64_HLERelease( + __int64 volatile *Destination, + __int64 Exchange, + __int64 Comparand); + +/* ========================================================================== */ +/* 128-Bit Atomic Intrinsics: */ +/* Exchange */ +unsigned char _InterlockedCompareExchange128( + __int64 volatile *Destination, + __int64 ExchangeHigh, + __int64 ExchangeLow, + __int64 *ComparandResult); + +#endif + +/* Win32 InterlockedXX functions are defined as macros */ +#define InterlockedExchange8 _InterlockedExchange8 +#define InterlockedExchangeAdd8 _InterlockedExchangeAdd8 +#define InterlockedExchangeAnd8 _InterlockedExchangeAnd8 +#define InterlockedExchangeOr8 _InterlockedExchangeOr8 +#define InterlockedExchangeXor8 _InterlockedExchangeXor8 +#define InterlockedDecrement8 _InterlockedDecrement8 +#define InterlockedIncrement8 _InterlockedIncrement8 +#define InterlockedCompareExchange8 _InterlockedCompareExchange8 + +#define InterlockedExchange16 _InterlockedExchange16 +#define InterlockedExchangeAdd16 _InterlockedExchangeAdd16 +#define InterlockedExchangeAnd16 _InterlockedExchangeAnd16 +#define InterlockedExchangeOr16 _InterlockedExchangeOr16 +#define InterlockedExchangeXor16 _InterlockedExchangeXor16 +#define InterlockedDecrement16 _InterlockedDecrement16 +#define InterlockedIncrement16 _InterlockedIncrement16 +#define InterlockedCompareExchange16 _InterlockedCompareExchange16 + +#define InterlockedExchange _InterlockedExchange +#define InterlockedExchangeAdd _InterlockedExchangeAdd +#define InterlockedExchangeAnd _InterlockedExchangeAnd +#define InterlockedExchangeOr _InterlockedExchangeOr +#define InterlockedExchangeXor _InterlockedExchangeXor +#define InterlockedDecrement _InterlockedDecrement +#define InterlockedIncrement _InterlockedIncrement +#define InterlockedCompareExchange _InterlockedCompareExchange + +#ifdef _AMD64_ + #define InterlockedExchange64 _InterlockedExchange64 + #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64 + #define InterlockedExchangeAnd64 _InterlockedExchangeAnd64 + #define InterlockedExchangeOr64 _InterlockedExchangeOr64 + #define InterlockedExchangeXor64 _InterlockedExchangeXor64 + #define InterlockedDecrement64 _InterlockedDecrement64 + #define InterlockedIncrement64 _InterlockedIncrement64 + #define InterlockedCompareExchange64 _InterlockedCompareExchange64 + + #define InterlockedCompareExchange128 _InterlockedCompareExchange128 +#endif + + +/* ========================================================================== */ +/* Barriers: */ +void _ReadWriteBarrier(void); +#pragma intrinsic(_ReadWriteBarrier) + +#ifdef _AMD64_ + #define MemoryBarrier __faststorefence + #define YieldProcessor _mm_pause + +#elif defined(_M_IX86) + FORCEINLINE void + MemoryBarrier(void) + { + LONG Barrier; + __asm { + xchg Barrier, eax + } + } + #define YieldProcessor __asm { rep nop } +#endif + +#if defined(__cplusplus) +} +#endif + +/* Enable all warnings */ +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + +#endif /* WINDOWS_ATOMIC_H */ +#endif /* _WINDOWS_ */ + + +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Arvid Gerstmann. All rights reserved. + */ +#ifndef _WINDOWS_ +#ifndef WINDOWS_DBGHELP_H +#define WINDOWS_DBGHELP_H + +/* Disable all warnings */ +#if defined(_MSC_VER) + #pragma warning(push, 0) +#endif + +#ifndef WINDOWS_BASE_H +#include "windows_base.h" +#endif +#if defined(__cplusplus) +extern "C" { +#endif + +/* Exceptions: */ +#define EXCEPTION_MAXIMUM_PARAMETERS 15 +#define EXCEPTION_EXECUTE_HANDLER 0x1 +#define EXCEPTION_CONTINUE_EXECUTION 0xFFFFFFFF +#define EXCEPTION_CONTINUE_SEARCH 0x0 + +#define EXCEPTION_ACCESS_VIOLATION ((DWORD)0xC0000005L) +#define EXCEPTION_DATATYPE_MISALIGNMENT ((DWORD)0x80000002L) +#define EXCEPTION_BREAKPOINT ((DWORD)0x80000003L) +#define EXCEPTION_SINGLE_STEP ((DWORD)0x80000004L) +#define EXCEPTION_ARRAY_BOUNDS_EXCEEDED ((DWORD)0xC000008CL) +#define EXCEPTION_FLT_DENORMAL_OPERAND ((DWORD)0xC000008DL) +#define EXCEPTION_FLT_DIVIDE_BY_ZERO ((DWORD)0xC000008EL) +#define EXCEPTION_FLT_INEXACT_RESULT ((DWORD)0xC000008FL) +#define EXCEPTION_FLT_INVALID_OPERATION ((DWORD)0xC0000090L) +#define EXCEPTION_FLT_OVERFLOW ((DWORD)0xC0000091L) +#define EXCEPTION_FLT_STACK_CHECK ((DWORD)0xC0000092L) +#define EXCEPTION_FLT_UNDERFLOW ((DWORD)0xC0000093L) +#define EXCEPTION_INT_DIVIDE_BY_ZERO ((DWORD)0xC0000094L) +#define EXCEPTION_INT_OVERFLOW ((DWORD)0xC0000095L) +#define EXCEPTION_PRIV_INSTRUCTION ((DWORD)0xC0000096L) +#define EXCEPTION_IN_PAGE_ERROR ((DWORD)0xC0000006L) +#define EXCEPTION_STACK_OVERFLOW ((DWORD)0xC00000FDL) +#define EXCEPTION_ILLEGAL_INSTRUCTION ((DWORD)0xC000001DL) +#define EXCEPTION_NONCONTINUABLE_EXCEPTION ((DWORD)0xC0000025L) +#define EXCEPTION_INVALID_DISPOSITION ((DWORD)0xC0000026L) +#define EXCEPTION_GUARD_PAGE ((DWORD)0x80000001L) +#define EXCEPTION_INVALID_HANDLE ((DWORD)0xC0000008L) +#define EXCEPTION_POSSIBLE_DEADLOCK ((DWORD)0xC0000194L) +#define CONTROL_C_EXIT ((DWORD)0xC000013AL) + +/* User defined. */ +#ifndef EXCEPTION_ASSERTION +#define EXCEPTION_ASSERTION ((DWORD)0xEF000001L) +#endif + +/* Snapshotting: */ +#define TH32CS_SNAPTHREAD 0x00000004 +#define IMAGE_FILE_MACHINE_I386 0x014c +#define IMAGE_FILE_MACHINE_AMD64 0x8664 +#define CONTEXT_AMD64 0x100000 +#define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L) +#define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L) +#define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L) +#define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L) +#define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L) + + +#define CONTEXT_FULL \ + (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT) + +#define CONTEXT_ALL \ + (CONTEXT_CONTROL |\ + CONTEXT_INTEGER |\ + CONTEXT_SEGMENTS |\ + CONTEXT_FLOATING_POINT |\ + CONTEXT_DEBUG_REGISTERS) + +/* Symbol Options: */ +#define SYMOPT_CASE_INSENSITIVE 0x00000001 +#define SYMOPT_UNDNAME 0x00000002 +#define SYMOPT_DEFERRED_LOADS 0x00000004 +#define SYMOPT_NO_CPP 0x00000008 +#define SYMOPT_LOAD_LINES 0x00000010 +#define SYMOPT_OMAP_FIND_NEAREST 0x00000020 +#define SYMOPT_LOAD_ANYTHING 0x00000040 +#define SYMOPT_IGNORE_CVREC 0x00000080 +#define SYMOPT_NO_UNQUALIFIED_LOADS 0x00000100 +#define SYMOPT_FAIL_CRITICAL_ERRORS 0x00000200 +#define SYMOPT_EXACT_SYMBOLS 0x00000400 +#define SYMOPT_ALLOW_ABSOLUTE_SYMBOLS 0x00000800 +#define SYMOPT_IGNORE_NT_SYMPATH 0x00001000 +#define SYMOPT_INCLUDE_32BIT_MODULES 0x00002000 +#define SYMOPT_PUBLICS_ONLY 0x00004000 +#define SYMOPT_NO_PUBLICS 0x00008000 +#define SYMOPT_AUTO_PUBLICS 0x00010000 +#define SYMOPT_NO_IMAGE_SEARCH 0x00020000 +#define SYMOPT_SECURE 0x00040000 +#define SYMOPT_NO_PROMPTS 0x00080000 +#define SYMOPT_OVERWRITE 0x00100000 +#define SYMOPT_IGNORE_IMAGEDIR 0x00200000 +#define SYMOPT_FLAT_DIRECTORY 0x00400000 +#define SYMOPT_FAVOR_COMPRESSED 0x00800000 +#define SYMOPT_ALLOW_ZERO_ADDRESS 0x01000000 +#define SYMOPT_DISABLE_SYMSRV_AUTODETECT 0x02000000 + +#define SYMOPT_DEBUG 0x80000000 + +enum SymTagEnum { + SymTagNull, + SymTagExe, + SymTagCompiland, + SymTagCompilandDetails, + SymTagCompilandEnv, + SymTagFunction, + SymTagBlock, + SymTagData, + SymTagAnnotation, + SymTagLabel, + SymTagPublicSymbol, + SymTagUDT, + SymTagEnum, + SymTagFunctionType, + SymTagPointerType, + SymTagArrayType, + SymTagBaseType, + SymTagTypedef, + SymTagBaseClass, + SymTagFriend, + SymTagFunctionArgType, + SymTagFuncDebugStart, + SymTagFuncDebugEnd, + SymTagUsingNamespace, + SymTagVTableShape, + SymTagVTable, + SymTagCustom, + SymTagThunk, + SymTagCustomType, + SymTagManagedType, + SymTagDimension, + SymTagCallSite, + SymTagInlineSite, + SymTagBaseInterface, + SymTagVectorType, + SymTagMatrixType, + SymTagHLSLType +}; + +/* Thread-Information Block: */ +typedef struct _NT_TIB { /* x86 / x64 */ + void * ExceptionList; /* 0x0000 / 0x0000 */ + void * StackBase; /* 0x0004 / 0x0008 */ + void * StackLimit; /* 0x0008 / 0x0010 */ + void * SubSystemTib; /* 0x000c / 0x0018 */ + union { + void * FiberData; /* 0x0010 / 0x0020 */ + DWORD Version; /* 0x0010 / 0x0020 */ + }; + void * ArbitraryUserPointer; /* 0x0014 / 0x0028 */ + struct _NT_TIB *Self; /* 0x0018 / 0x0030 */ +} NT_TIB, *LPNT_TIB, *PNT_TIB; + +/* Exceptions: */ +#if defined(_WIN64) +typedef struct DECLSPEC_ALIGN(16) _M128A { + ULONGLONG Low; + LONGLONG High; +} M128A, *PM128A; +typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT { + WORD ControlWord; + WORD StatusWord; + BYTE TagWord; + BYTE Reserved1; + WORD ErrorOpcode; + DWORD ErrorOffset; + WORD ErrorSelector; + WORD Reserved2; + DWORD DataOffset; + WORD DataSelector; + WORD Reserved3; + DWORD MxCsr; + DWORD MxCsr_Mask; + M128A FloatRegisters[8]; + +#if defined(_WIN64) + M128A XmmRegisters[16]; + BYTE Reserved4[96]; +#else + M128A XmmRegisters[8]; + BYTE Reserved4[192]; + + DWORD StackControl[7]; + DWORD Cr0NpxState; +#endif +} XSAVE_FORMAT, *PXSAVE_FORMAT; +typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32; + +typedef struct DECLSPEC_ALIGN(16) _CONTEXT { + DWORD64 P1Home; + DWORD64 P2Home; + DWORD64 P3Home; + DWORD64 P4Home; + DWORD64 P5Home; + DWORD64 P6Home; + + DWORD ContextFlags; + DWORD MxCsr; + + WORD SegCs; + WORD SegDs; + WORD SegEs; + WORD SegFs; + WORD SegGs; + WORD SegSs; + DWORD EFlags; + + DWORD64 Dr0; + DWORD64 Dr1; + DWORD64 Dr2; + DWORD64 Dr3; + DWORD64 Dr6; + DWORD64 Dr7; + + DWORD64 Rax; + DWORD64 Rcx; + DWORD64 Rdx; + DWORD64 Rbx; + DWORD64 Rsp; + DWORD64 Rbp; + DWORD64 Rsi; + DWORD64 Rdi; + DWORD64 R8; + DWORD64 R9; + DWORD64 R10; + DWORD64 R11; + DWORD64 R12; + DWORD64 R13; + DWORD64 R14; + DWORD64 R15; + DWORD64 Rip; + + union { + XMM_SAVE_AREA32 FltSave; + struct { + M128A Header[2]; + M128A Legacy[8]; + M128A Xmm0; + M128A Xmm1; + M128A Xmm2; + M128A Xmm3; + M128A Xmm4; + M128A Xmm5; + M128A Xmm6; + M128A Xmm7; + M128A Xmm8; + M128A Xmm9; + M128A Xmm10; + M128A Xmm11; + M128A Xmm12; + M128A Xmm13; + M128A Xmm14; + M128A Xmm15; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME; + + M128A VectorRegister[26]; + DWORD64 VectorControl; + + DWORD64 DebugControl; + DWORD64 LastBranchToRip; + DWORD64 LastBranchFromRip; + DWORD64 LastExceptionToRip; + DWORD64 LastExceptionFromRip; +} CONTEXT, *PCONTEXT; +typedef PCONTEXT LPCONTEXT; +#elif _WIN32 +typedef struct _FLOATING_SAVE_AREA +{ + ULONG ControlWord; + ULONG StatusWord; + ULONG TagWord; + ULONG ErrorOffset; + ULONG ErrorSelector; + ULONG DataOffset; + ULONG DataSelector; + UCHAR RegisterArea[80]; + ULONG Cr0NpxState; +} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA; +#define MAXIMUM_SUPPORTED_EXTENSION 512 +typedef struct _CONTEXT { + DWORD ContextFlags; + DWORD Dr0; + DWORD Dr1; + DWORD Dr2; + DWORD Dr3; + DWORD Dr6; + DWORD Dr7; + + FLOATING_SAVE_AREA FloatSave; + + DWORD SegGs; + DWORD SegFs; + DWORD SegEs; + DWORD SegDs; + + DWORD Edi; + DWORD Esi; + DWORD Ebx; + DWORD Edx; + DWORD Ecx; + DWORD Eax; + + DWORD Ebp; + DWORD Eip; + DWORD SegCs; + DWORD EFlags; + DWORD Esp; + DWORD SegSs; + + BYTE ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION]; + +} CONTEXT, *PCONTEXT; +typedef PCONTEXT LPCONTEXT; +#endif +typedef struct _EXCEPTION_RECORD { + DWORD ExceptionCode; + DWORD ExceptionFlags; + struct _EXCEPTION_RECORD * ExceptionRecord; + PVOID ExceptionAddress; + DWORD NumberParameters; + ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; +} EXCEPTION_RECORD, *PEXCEPTION_RECORD; +typedef struct _EXCEPTION_POINTERS { + PEXCEPTION_RECORD ExceptionRecord; + PCONTEXT ContextRecord; +} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS; +typedef PEXCEPTION_POINTERS LPEXCEPTION_POINTERS; +typedef LONG (WINAPI *PTOP_LEVEL_EXCEPTION_FILTER)( + struct _EXCEPTION_POINTERS *ExceptionInfo); +typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER; +typedef LONG (WINAPI *PVECTORED_EXCEPTION_HANDLER)( + struct _EXCEPTION_POINTERS *ExceptionInfo); + +/* Symbols: */ +typedef struct _SYMBOL_INFO { + ULONG SizeOfStruct; + ULONG TypeIndex; + ULONG64 Reserved[2]; + ULONG Index; + ULONG Size; + ULONG64 ModBase; + ULONG Flags; + ULONG64 Value; + ULONG64 Address; + ULONG Register; + ULONG Scope; + ULONG Tag; + ULONG NameLen; + ULONG MaxNameLen; + CHAR Name[1]; +} SYMBOL_INFO, *PSYMBOL_INFO; + +typedef struct _SYMBOL_INFOW { + ULONG SizeOfStruct; + ULONG TypeIndex; + ULONG64 Reserved[2]; + ULONG Index; + ULONG Size; + ULONG64 ModBase; + ULONG Flags; + ULONG64 Value; + ULONG64 Address; + ULONG Register; + ULONG Scope; + ULONG Tag; + ULONG NameLen; + ULONG MaxNameLen; + WCHAR Name[1]; +} SYMBOL_INFOW, *PSYMBOL_INFOW; + +typedef struct _IMAGEHLP_LINE64 { + DWORD SizeOfStruct; + PVOID Key; + DWORD LineNumber; + PCHAR FileName; + DWORD64 Address; +} IMAGEHLP_LINE64, *PIMAGEHLP_LINE64; + +typedef struct _IMAGEHLP_LINEW64 { + DWORD SizeOfStruct; + PVOID Key; + DWORD LineNumber; + PWSTR FileName; + DWORD64 Address; +} IMAGEHLP_LINEW64, *PIMAGEHLP_LINEW64; + +/* Thread Walking: */ +typedef struct tagTHREADENTRY32 { + DWORD dwSize; + DWORD cntUsage; + DWORD th32ThreadID; + DWORD th32OwnerProcessID; + LONG tpBasePri; + LONG tpDeltaPri; + DWORD dwFlags; +} THREADENTRY32, *PTHREADENTRY32; +typedef PTHREADENTRY32 LPTHREADENTRY32; + +/* Stack Walking: */ +typedef enum { + AddrMode1616, + AddrMode1632, + AddrModeReal, + AddrModeFlat +} ADDRESS_MODE; +typedef struct _tagADDRESS64 { + DWORD64 Offset; + WORD Segment; + ADDRESS_MODE Mode; +} ADDRESS64, *LPADDRESS64; +typedef struct _KDHELP64 { + DWORD64 Thread; + DWORD ThCallbackStack; + DWORD ThCallbackBStore; + DWORD NextCallback; + DWORD FramePointer; + DWORD64 KiCallUserMode; + DWORD64 KeUserCallbackDispatcher; + DWORD64 SystemRangeStart; + DWORD64 KiUserExceptionDispatcher; + DWORD64 StackBase; + DWORD64 StackLimit; + DWORD64 Reserved[5]; +} KDHELP64, *PKDHELP64; +typedef struct _tagSTACKFRAME64 { + ADDRESS64 AddrPC; + ADDRESS64 AddrReturn; + ADDRESS64 AddrFrame; + ADDRESS64 AddrStack; + ADDRESS64 AddrBStore; + PVOID FuncTableEntry; + DWORD64 Params[4]; + BOOL Far; + BOOL Virtual; + DWORD64 Reserved[3]; + KDHELP64 KdHelp; +} STACKFRAME64, *LPSTACKFRAME64; + +/* Some weird stuff: */ +typedef struct _LUID { + DWORD LowPart; + LONG HighPart; +} LUID, *PLUID; +#pragma pack(push,4) +typedef struct _LUID_AND_ATTRIBUTES { + LUID Luid; + DWORD Attributes; +} LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES; +#pragma pack(pop) +typedef struct _TOKEN_PRIVILEGES { + DWORD PrivilegeCount; + LUID_AND_ATTRIBUTES Privileges[1]; +} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES; + + +/* ========================================================================== */ +/* Debugging: */ +void WINAPI DebugBreak(void); +BOOL WINAPI IsDebuggerPresent(void); +BOOL WINAPI CheckRemoteDebuggerPresent( + HANDLE hProcess, + PBOOL hbDebuggerPresent); +void WINAPI OutputDebugStringA( + LPCSTR lpOutputString); +void WINAPI OutputDebugStringW( + LPCWSTR lpOutputString); +BOOL WINAPI GetThreadContext( + HANDLE hThread, + LPCONTEXT lpContext); +BOOL WINAPI DebugActiveProcess( + DWORD dwProcessId); +BOOL WINAPI DebugActiveProcessStop( + DWORD dwProcessId); + +/* ========================================================================== */ +/* Symbols: */ +DWORD WINAPI SymSetOptions( + DWORD SymOptions); +BOOL WINAPI SymInitialize( + HANDLE hProcess, + LPCSTR UserSearchPath, + BOOL fInvadeProcess); +BOOL WINAPI SymInitializeW( + HANDLE hProcess, + LPCWSTR UserSearchPath, + BOOL fInvadeProcess); +BOOL WINAPI SymFromAddr( + HANDLE hProcess, + DWORD64 Address, + PDWORD64 Displacement, + PSYMBOL_INFO Symbol); +BOOL WINAPI SymFromAddrW( + HANDLE hProcess, + DWORD64 Address, + PDWORD64 Displacement, + PSYMBOL_INFOW Symbol); +PVOID WINAPI SymFunctionTableAccess64( + HANDLE hProcess, + DWORD64 AddrBase); +DWORD64 WINAPI SymGetModuleBase64( + HANDLE hProcess, + DWORD64 dwAddr); +typedef BOOL (*PSYM_ENUMERATESYMBOLS_CALLBACK)( + PSYMBOL_INFO pSymInfo, + ULONG SymbolSize, + PVOID UserContext +); +typedef BOOL (*PSYM_ENUMERATESYMBOLS_CALLBACKW)( + PSYMBOL_INFOW pSymInfo, + ULONG SymbolSize, + PVOID UserContext +); +BOOL WINAPI SymSearch( + HANDLE hProcess, + ULONG64 BaseOfDll, + DWORD Index, + DWORD SymTag, + LPCSTR Mask, + DWORD64 Address, + PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback, + PVOID UserContext, + DWORD Options); +BOOL WINAPI SymSearchW( + HANDLE hProcess, + ULONG64 BaseOfDll, + DWORD Index, + DWORD SymTag, + LPCWSTR Mask, + DWORD64 Address, + PSYM_ENUMERATESYMBOLS_CALLBACKW EnumSymbolsCallback, + PVOID UserContext, + DWORD Options); +BOOL WINAPI SymRefreshModuleList( + HANDLE hProcess); + +typedef BOOL (*PSYM_ENUMMODULES_CALLBACK64)( + LPCSTR ModuleName, + DWORD64 BaseOfDll, + PVOID UserContext +); +typedef BOOL (*PSYM_ENUMMODULES_CALLBACKW64)( + LPCWSTR ModuleName, + DWORD64 BaseOfDll, + PVOID UserContext +); +BOOL WINAPI SymEnumerateModules64( + HANDLE hProcess, + PSYM_ENUMMODULES_CALLBACK64 EnumModulesCallback, + PVOID UserContext +); +BOOL WINAPI SymEnumerateModulesW64( + HANDLE hProcess, + PSYM_ENUMMODULES_CALLBACKW64 EnumModulesCallback, + PVOID UserContext +); + +BOOL WINAPI SymSetSearchPath( + HANDLE hProcess, + LPCSTR SearchPath); +BOOL WINAPI SymSetSearchPathW( + HANDLE hProcess, + LPCWSTR SearchPath); + +BOOL WINAPI SymGetSearchPath( + HANDLE hProcess, + LPSTR SearchPath, + DWORD SearchPathLength); +BOOL WINAPI SymGetSearchPathW( + HANDLE hProcess, + LPWSTR SearchPath, + DWORD SearchPathLength); + +BOOL WINAPI SymCleanup( + HANDLE hProcess); + +BOOL WINAPI SymGetLineFromAddr64( + HANDLE hProcess, + DWORD64 dwAddr, + PDWORD pdwDisplacement, + PIMAGEHLP_LINE64 Line +); + +BOOL WINAPI SymGetLineFromAddrW64( + HANDLE hProcess, + DWORD64 dwAddr, + PDWORD pdwDisplacement, + PIMAGEHLP_LINEW64 Line +); + +/* ========================================================================== */ +/* Exceptions: */ +LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter( + LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter); +LONG WINAPI UnhandledExceptionFilter( + struct _EXCEPTION_POINTERS * ExceptionInfo); + +PVOID WINAPI AddVectoredExceptionHandler( + ULONG FirstHandler, + PVECTORED_EXCEPTION_HANDLER VectoredHandler); + +ULONG WINAPI RemoveVectoredExceptionHandler( + PVOID Handler); + +#define CaptureStackBackTrace RtlCaptureStackBackTrace +USHORT WINAPI RtlCaptureStackBackTrace( + ULONG FramesToSkip, + ULONG FramesToCapture, + PVOID * BackTrace, + PULONG BackTraceHash); +void WINAPI RtlCaptureContext( + PCONTEXT ContextRecord); +void WINAPI RaiseException( + DWORD dwExceptionCode, + DWORD dwExceptionFlags, + DWORD nNumberOfArguments, + const ULONG_PTR * lpArguments); + +/* ========================================================================== */ +/* Thread Walking: */ +HANDLE WINAPI CreateToolhelp32Snapshot( + DWORD dwFlags, + DWORD th32ProcessID); +BOOL WINAPI Thread32First( + HANDLE hSnapshot, + LPTHREADENTRY32 lpte); +BOOL WINAPI Thread32Next( + HANDLE hSnapshot, + LPTHREADENTRY32 lpte); + +/* ========================================================================== */ +/* Stack Walking: */ +typedef BOOL (__stdcall *PREAD_PROCESS_MEMORY_ROUTINE64)( + HANDLE hProcess, + DWORD64 qwBaseAddress, + PVOID lpBuffer, + DWORD nSize, + LPDWORD lpNumberOfBytesRead); + +typedef PVOID (__stdcall *PFUNCTION_TABLE_ACCESS_ROUTINE64)( + HANDLE ahProcess, + DWORD64 AddrBase); + +typedef DWORD64 (__stdcall *PGET_MODULE_BASE_ROUTINE64)( + HANDLE hProcess, + DWORD64 Address); + +typedef DWORD64 (__stdcall *PTRANSLATE_ADDRESS_ROUTINE64)( + HANDLE hProcess, + HANDLE hThread, + LPADDRESS64 lpaddr); + +BOOL WINAPI StackWalk64( + DWORD MachineType, + HANDLE hProcess, + HANDLE hThread, + LPSTACKFRAME64 StackFrame, + PVOID ContextRecord, + PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, + PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, + PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine, + PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress +); + +/* ========================================================================== */ +/* Minidumps: */ +/* == VS Version == */ +typedef struct tagVS_FIXEDFILEINFO +{ + DWORD dwSignature; /* e.g. 0xfeef04bd */ + DWORD dwStrucVersion; /* e.g. 0x00000042 = "0.42" */ + DWORD dwFileVersionMS; /* e.g. 0x00030075 = "3.75" */ + DWORD dwFileVersionLS; /* e.g. 0x00000031 = "0.31" */ + DWORD dwProductVersionMS; /* e.g. 0x00030010 = "3.10" */ + DWORD dwProductVersionLS; /* e.g. 0x00000031 = "0.31" */ + DWORD dwFileFlagsMask; /* = 0x3F for version "0.42" */ + DWORD dwFileFlags; /* e.g. VFF_DEBUG | VFF_PRERELEASE */ + DWORD dwFileOS; /* e.g. VOS_DOS_WINDOWS16 */ + DWORD dwFileType; /* e.g. VFT_DRIVER */ + DWORD dwFileSubtype; /* e.g. VFT2_DRV_KEYBOARD */ + DWORD dwFileDateMS; /* e.g. 0 */ + DWORD dwFileDateLS; /* e.g. 0 */ +} VS_FIXEDFILEINFO; + +/* == Type == */ +typedef enum _MINIDUMP_TYPE { + MiniDumpNormal = 0x00000000, + MiniDumpWithDataSegs = 0x00000001, + MiniDumpWithFullMemory = 0x00000002, + MiniDumpWithHandleData = 0x00000004, + MiniDumpFilterMemory = 0x00000008, + MiniDumpScanMemory = 0x00000010, + MiniDumpWithUnloadedModules = 0x00000020, + MiniDumpWithIndirectlyReferencedMemory = 0x00000040, + MiniDumpFilterModulePaths = 0x00000080, + MiniDumpWithProcessThreadData = 0x00000100, + MiniDumpWithPrivateReadWriteMemory = 0x00000200, + MiniDumpWithoutOptionalData = 0x00000400, + MiniDumpWithFullMemoryInfo = 0x00000800, + MiniDumpWithThreadInfo = 0x00001000, + MiniDumpWithCodeSegs = 0x00002000, + MiniDumpWithoutAuxiliaryState = 0x00004000, + MiniDumpWithFullAuxiliaryState = 0x00008000, + MiniDumpWithPrivateWriteCopyMemory = 0x00010000, + MiniDumpIgnoreInaccessibleMemory = 0x00020000, + MiniDumpWithTokenInformation = 0x00040000, + MiniDumpValidTypeFlags = 0x0007ffff, +} MINIDUMP_TYPE; + +/* == Exception Info == */ +typedef struct _MINIDUMP_EXCEPTION_INFORMATION { + DWORD ThreadId; + PEXCEPTION_POINTERS ExceptionPointers; + BOOL ClientPointers; +} MINIDUMP_EXCEPTION_INFORMATION, *PMINIDUMP_EXCEPTION_INFORMATION; +typedef struct _MINIDUMP_EXCEPTION_INFORMATION64 { + DWORD ThreadId; + ULONG64 ExceptionRecord; + ULONG64 ContextRecord; + BOOL ClientPointers; +} MINIDUMP_EXCEPTION_INFORMATION64, *PMINIDUMP_EXCEPTION_INFORMATION64; + +/* == Callback Input Hell == */ +typedef struct _MINIDUMP_THREAD_CALLBACK { + ULONG ThreadId; + HANDLE ThreadHandle; + CONTEXT Context; + ULONG SizeOfContext; + ULONG64 StackBase; + ULONG64 StackEnd; +} MINIDUMP_THREAD_CALLBACK, *PMINIDUMP_THREAD_CALLBACK; +typedef struct _MINIDUMP_THREAD_EX_CALLBACK { + ULONG ThreadId; + HANDLE ThreadHandle; + CONTEXT Context; + ULONG SizeOfContext; + ULONG64 StackBase; + ULONG64 StackEnd; + ULONG64 BackingStoreBase; + ULONG64 BackingStoreEnd; +} MINIDUMP_THREAD_EX_CALLBACK, *PMINIDUMP_THREAD_EX_CALLBACK; +typedef struct _MINIDUMP_MODULE_CALLBACK { + PWCHAR FullPath; + ULONG64 BaseOfImage; + ULONG SizeOfImage; + ULONG CheckSum; + ULONG TimeDateStamp; + VS_FIXEDFILEINFO VersionInfo; + PVOID CvRecord; + ULONG SizeOfCvRecord; + PVOID MiscRecord; + ULONG SizeOfMiscRecord; +} MINIDUMP_MODULE_CALLBACK, *PMINIDUMP_MODULE_CALLBACK; +typedef struct _MINIDUMP_INCLUDE_THREAD_CALLBACK { + ULONG ThreadId; +} MINIDUMP_INCLUDE_THREAD_CALLBACK, *PMINIDUMP_INCLUDE_THREAD_CALLBACK; +typedef struct _MINIDUMP_INCLUDE_MODULE_CALLBACK { + ULONG64 BaseOfImage; +} MINIDUMP_INCLUDE_MODULE_CALLBACK, *PMINIDUMP_INCLUDE_MODULE_CALLBACK; +typedef struct _MINIDUMP_IO_CALLBACK { + HANDLE Handle; + ULONG64 Offset; + PVOID Buffer; + ULONG BufferBytes; +} MINIDUMP_IO_CALLBACK, *PMINIDUMP_IO_CALLBACK; +typedef struct _MINIDUMP_READ_MEMORY_FAILURE_CALLBACK +{ + ULONG64 Offset; + ULONG Bytes; + HRESULT FailureStatus; +} MINIDUMP_READ_MEMORY_FAILURE_CALLBACK, + *PMINIDUMP_READ_MEMORY_FAILURE_CALLBACK; +typedef struct _MINIDUMP_CALLBACK_INPUT { + ULONG ProcessId; + HANDLE ProcessHandle; + ULONG CallbackType; + union { + HRESULT Status; + MINIDUMP_THREAD_CALLBACK Thread; + MINIDUMP_THREAD_EX_CALLBACK ThreadEx; + MINIDUMP_MODULE_CALLBACK Module; + MINIDUMP_INCLUDE_THREAD_CALLBACK IncludeThread; + MINIDUMP_INCLUDE_MODULE_CALLBACK IncludeModule; + MINIDUMP_IO_CALLBACK Io; + MINIDUMP_READ_MEMORY_FAILURE_CALLBACK ReadMemoryFailure; + ULONG SecondaryFlags; + }; +} MINIDUMP_CALLBACK_INPUT, *PMINIDUMP_CALLBACK_INPUT; + +/* == Callback Output Hell == */ +typedef struct _MINIDUMP_MEMORY_INFO { + ULONG64 BaseAddress; + ULONG64 AllocationBase; + ULONG32 AllocationProtect; + ULONG32 __alignment1; + ULONG64 RegionSize; + ULONG32 State; + ULONG32 Protect; + ULONG32 Type; + ULONG32 __alignment2; +} MINIDUMP_MEMORY_INFO, *PMINIDUMP_MEMORY_INFO; +typedef struct _MINIDUMP_CALLBACK_OUTPUT { + union { + ULONG ModuleWriteFlags; + ULONG ThreadWriteFlags; + ULONG SecondaryFlags; + struct { + ULONG64 MemoryBase; + ULONG MemorySize; + }; + struct { + BOOL CheckCancel; + BOOL Cancel; + }; + HANDLE Handle; + struct { + MINIDUMP_MEMORY_INFO VmRegion; + BOOL Continue; + }; + HRESULT Status; + }; +} MINIDUMP_CALLBACK_OUTPUT, *PMINIDUMP_CALLBACK_OUTPUT; + +/* == Callback Hell == */ +typedef BOOL (WINAPI *MINIDUMP_CALLBACK_ROUTINE)( + PVOID CallbackParam, + PMINIDUMP_CALLBACK_INPUT CallbackInput, + PMINIDUMP_CALLBACK_OUTPUT CallbackOutput); +typedef struct _MINIDUMP_CALLBACK_INFORMATION { + MINIDUMP_CALLBACK_ROUTINE CallbackRoutine; + PVOID CallbackParam; +} MINIDUMP_CALLBACK_INFORMATION, *PMINIDUMP_CALLBACK_INFORMATION; + +/* == User Stream Information == */ +typedef struct _MINIDUMP_USER_STREAM { + ULONG32 Type; + ULONG BufferSize; + PVOID Buffer; +} MINIDUMP_USER_STREAM, *PMINIDUMP_USER_STREAM; +typedef struct _MINIDUMP_USER_STREAM_INFORMATION { + ULONG UserStreamCount; + PMINIDUMP_USER_STREAM UserStreamArray; +} MINIDUMP_USER_STREAM_INFORMATION, *PMINIDUMP_USER_STREAM_INFORMATION; + +/* Function (all this shit above is required for this simple function). */ +BOOL WINAPI MiniDumpWriteDump( + HANDLE hProcess, + DWORD ProcessId, + HANDLE hFile, + MINIDUMP_TYPE DumpType, + PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, + PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, + PMINIDUMP_CALLBACK_INFORMATION CallbackParam); + +/* Priviliges: */ +BOOL WINAPI OpenProcessToken ( + HANDLE ProcessHandle, + DWORD DesiredAccess, + PHANDLE TokenHandle); +BOOL WINAPI LookupPrivilegeValueA( + LPCSTR lpSystemName, + LPCSTR lpName, + PLUID lpLuid); +BOOL WINAPI LookupPrivilegeValueW( + LPCWSTR lpSystemName, + LPCWSTR lpName, + PLUID lpLuid); +BOOL WINAPI AdjustTokenPrivileges( + HANDLE TokenHandle, + BOOL DisableAllPrivileges, + PTOKEN_PRIVILEGES NewState, + DWORD BufferLength, + PTOKEN_PRIVILEGES PreviousState, + PDWORD ReturnLength); + +/* ========================================================================== */ +/* Segment Registers: */ +void __debugbreak(void); +#if _WIN64 +unsigned char __readgsbyte(unsigned long Offset); +unsigned short __readgsword(unsigned long Offset); +unsigned long __readgsdword(unsigned long Offset); +unsigned __int64 __readgsqword(unsigned long Offset); +#else +unsigned char __readfsbyte(unsigned long Offset); +unsigned short __readfsword(unsigned long Offset); +unsigned long __readfsdword(unsigned long Offset); +unsigned __int64 __readfsqword(unsigned long Offset); +#endif + +static NT_TIB * +GetTib(void) +{ +#if _WIN64 + return (NT_TIB *)__readgsqword(0x30); +#else + return (NT_TIB *)__readfsdword(0x18); +#endif +} + + +#if defined(__cplusplus) +} +#endif + +/* Enable all warnings */ +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + +#endif /* WINDOWS_DBGHELP_H */ +#endif /* _WINDOWS_ */ + + +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Arvid Gerstmann. All rights reserved. + */ +#ifndef _WINDOWS_ +#ifndef WINDOWS_DDS_H +#define WINDOWS_DDS_H + +/* Disable all warnings */ +#if defined(_MSC_VER) + #pragma warning(push, 0) +#endif + +#ifndef WINDOWS_BASE_H +#include "windows_base.h" +#endif +#if defined(__cplusplus) +extern "C" { +#endif + +#ifndef DXGI_FORMAT_DEFINED +#define DXGI_FORMAT_DEFINED 1 +typedef enum DXGI_FORMAT +{ + DXGI_FORMAT_UNKNOWN = 0, + DXGI_FORMAT_R32G32B32A32_TYPELESS = 1, + DXGI_FORMAT_R32G32B32A32_FLOAT = 2, + DXGI_FORMAT_R32G32B32A32_UINT = 3, + DXGI_FORMAT_R32G32B32A32_SINT = 4, + DXGI_FORMAT_R32G32B32_TYPELESS = 5, + DXGI_FORMAT_R32G32B32_FLOAT = 6, + DXGI_FORMAT_R32G32B32_UINT = 7, + DXGI_FORMAT_R32G32B32_SINT = 8, + DXGI_FORMAT_R16G16B16A16_TYPELESS = 9, + DXGI_FORMAT_R16G16B16A16_FLOAT = 10, + DXGI_FORMAT_R16G16B16A16_UNORM = 11, + DXGI_FORMAT_R16G16B16A16_UINT = 12, + DXGI_FORMAT_R16G16B16A16_SNORM = 13, + DXGI_FORMAT_R16G16B16A16_SINT = 14, + DXGI_FORMAT_R32G32_TYPELESS = 15, + DXGI_FORMAT_R32G32_FLOAT = 16, + DXGI_FORMAT_R32G32_UINT = 17, + DXGI_FORMAT_R32G32_SINT = 18, + DXGI_FORMAT_R32G8X24_TYPELESS = 19, + DXGI_FORMAT_D32_FLOAT_S8X24_UINT = 20, + DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS = 21, + DXGI_FORMAT_X32_TYPELESS_G8X24_UINT = 22, + DXGI_FORMAT_R10G10B10A2_TYPELESS = 23, + DXGI_FORMAT_R10G10B10A2_UNORM = 24, + DXGI_FORMAT_R10G10B10A2_UINT = 25, + DXGI_FORMAT_R11G11B10_FLOAT = 26, + DXGI_FORMAT_R8G8B8A8_TYPELESS = 27, + DXGI_FORMAT_R8G8B8A8_UNORM = 28, + DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = 29, + DXGI_FORMAT_R8G8B8A8_UINT = 30, + DXGI_FORMAT_R8G8B8A8_SNORM = 31, + DXGI_FORMAT_R8G8B8A8_SINT = 32, + DXGI_FORMAT_R16G16_TYPELESS = 33, + DXGI_FORMAT_R16G16_FLOAT = 34, + DXGI_FORMAT_R16G16_UNORM = 35, + DXGI_FORMAT_R16G16_UINT = 36, + DXGI_FORMAT_R16G16_SNORM = 37, + DXGI_FORMAT_R16G16_SINT = 38, + DXGI_FORMAT_R32_TYPELESS = 39, + DXGI_FORMAT_D32_FLOAT = 40, + DXGI_FORMAT_R32_FLOAT = 41, + DXGI_FORMAT_R32_UINT = 42, + DXGI_FORMAT_R32_SINT = 43, + DXGI_FORMAT_R24G8_TYPELESS = 44, + DXGI_FORMAT_D24_UNORM_S8_UINT = 45, + DXGI_FORMAT_R24_UNORM_X8_TYPELESS = 46, + DXGI_FORMAT_X24_TYPELESS_G8_UINT = 47, + DXGI_FORMAT_R8G8_TYPELESS = 48, + DXGI_FORMAT_R8G8_UNORM = 49, + DXGI_FORMAT_R8G8_UINT = 50, + DXGI_FORMAT_R8G8_SNORM = 51, + DXGI_FORMAT_R8G8_SINT = 52, + DXGI_FORMAT_R16_TYPELESS = 53, + DXGI_FORMAT_R16_FLOAT = 54, + DXGI_FORMAT_D16_UNORM = 55, + DXGI_FORMAT_R16_UNORM = 56, + DXGI_FORMAT_R16_UINT = 57, + DXGI_FORMAT_R16_SNORM = 58, + DXGI_FORMAT_R16_SINT = 59, + DXGI_FORMAT_R8_TYPELESS = 60, + DXGI_FORMAT_R8_UNORM = 61, + DXGI_FORMAT_R8_UINT = 62, + DXGI_FORMAT_R8_SNORM = 63, + DXGI_FORMAT_R8_SINT = 64, + DXGI_FORMAT_A8_UNORM = 65, + DXGI_FORMAT_R1_UNORM = 66, + DXGI_FORMAT_R9G9B9E5_SHAREDEXP = 67, + DXGI_FORMAT_R8G8_B8G8_UNORM = 68, + DXGI_FORMAT_G8R8_G8B8_UNORM = 69, + DXGI_FORMAT_BC1_TYPELESS = 70, + DXGI_FORMAT_BC1_UNORM = 71, + DXGI_FORMAT_BC1_UNORM_SRGB = 72, + DXGI_FORMAT_BC2_TYPELESS = 73, + DXGI_FORMAT_BC2_UNORM = 74, + DXGI_FORMAT_BC2_UNORM_SRGB = 75, + DXGI_FORMAT_BC3_TYPELESS = 76, + DXGI_FORMAT_BC3_UNORM = 77, + DXGI_FORMAT_BC3_UNORM_SRGB = 78, + DXGI_FORMAT_BC4_TYPELESS = 79, + DXGI_FORMAT_BC4_UNORM = 80, + DXGI_FORMAT_BC4_SNORM = 81, + DXGI_FORMAT_BC5_TYPELESS = 82, + DXGI_FORMAT_BC5_UNORM = 83, + DXGI_FORMAT_BC5_SNORM = 84, + DXGI_FORMAT_B5G6R5_UNORM = 85, + DXGI_FORMAT_B5G5R5A1_UNORM = 86, + DXGI_FORMAT_B8G8R8A8_UNORM = 87, + DXGI_FORMAT_B8G8R8X8_UNORM = 88, + DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM = 89, + DXGI_FORMAT_B8G8R8A8_TYPELESS = 90, + DXGI_FORMAT_B8G8R8A8_UNORM_SRGB = 91, + DXGI_FORMAT_B8G8R8X8_TYPELESS = 92, + DXGI_FORMAT_B8G8R8X8_UNORM_SRGB = 93, + DXGI_FORMAT_BC6H_TYPELESS = 94, + DXGI_FORMAT_BC6H_UF16 = 95, + DXGI_FORMAT_BC6H_SF16 = 96, + DXGI_FORMAT_BC7_TYPELESS = 97, + DXGI_FORMAT_BC7_UNORM = 98, + DXGI_FORMAT_BC7_UNORM_SRGB = 99, + DXGI_FORMAT_FORCE_UINT = 0xffffffff +} DXGI_FORMAT; +#endif + +/* Value for magic header */ +#define FOURCC_DDS (0x20534444) + +/* Values for DDS_PIXELFORMAT.dwFlags */ +#define DDPF_FOURCC (0x00000004) + +#pragma pack(push,1) + +typedef struct { + DWORD dwSize; + DWORD dwFlags; + DWORD dwFourCC; + DWORD dwRGBBitCount; + DWORD dwRBitMask; + DWORD dwGBitMask; + DWORD dwBBitMask; + DWORD dwABitMask; +} DDS_PIXELFORMAT; + +typedef struct { + DWORD dwSize; + DWORD dwHeaderFlags; + DWORD dwHeight; + DWORD dwWidth; + DWORD dwPitchOrLinearSize; + DWORD dwDepth; // only if DDS_HEADER_FLAGS_VOLUME is set in dwHeaderFlags + DWORD dwMipMapCount; + DWORD dwReserved1[11]; + DDS_PIXELFORMAT ddspf; + DWORD dwSurfaceFlags; + DWORD dwCubemapFlags; + DWORD dwReserved2[3]; +} DDS_HEADER; + +typedef struct { + DXGI_FORMAT dxgiFormat; + UINT resourceDimension; + UINT miscFlag; + UINT arraySize; + UINT reserved; +} DDS_HEADER_DXT10; + +/* Values for DDS_PIXELFORMAT.dwFourCC */ +#define FMT_DX10 (0x30315844) +#define FMT_DXT1 (0x31545844) /* DXGI_FORMAT_BC1_UNORM */ +#define FMT_DXT3 (0x33545844) /* DXGI_FORMAT_BC2_UNORM */ +#define FMT_DXT5 (0x35545844) /* DXGI_FORMAT_BC3_UNORM */ + +/* Values for dwFlags */ +#define DDSD_CAPS 0x00000001 +#define DDSD_HEIGHT 0x00000002 +#define DDSD_WIDTH 0x00000004 +#define DDSD_PITCH 0x00000008 +#define DDSD_PIXELFORMAT 0x00001000 +#define DDSD_MIPMAPCOUNT 0x00020000 +#define DDSD_LINEARSIZE 0x00080000 +#define DDSD_DEPTH 0x00800000 + +/* Values for dwCaps */ +#define DDSCAPS_COMPLEX 0x00000008 +#define DDSCAPS_MIPMAP 0x04000000 +#define DDSCAPS_TEXTURE 0x00001000 + +/* Blocksizes */ +#define BLOCKSIZE_DXT1 0x8 +#define BLOCKSIZE_DXT3 0x10 +#define BLOCKSIZE_DXT5 0x10 + +#pragma pack(pop) + + +#if defined(__cplusplus) +} +#endif + +/* Enable all warnings */ +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + +#endif /* WINDOWS_DDS_H */ +#endif /* _WINDOWS_ */ + + +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Arvid Gerstmann. All rights reserved. + */ +#ifndef _WINDOWS_ +#ifndef WINDOWS_FILE_H +#define WINDOWS_FILE_H + +/* Disable all warnings */ +#if defined(_MSC_VER) + #pragma warning(push, 0) +#endif + +#ifndef WINDOWS_BASE_H +#include "windows_base.h" +#endif +#if defined(__cplusplus) +extern "C" { +#endif + +/* CreateFile.dwShareMode Enums: */ +#define FILE_SHARE_DELETE 0x00000004 +#define FILE_SHARE_READ 0x00000001 +#define FILE_SHARE_WRITE 0x00000002 + +/* Generic Access Rights: */ +#define GENERIC_READ 0x80000000L +#define GENERIC_WRITE 0x40000000L +#define GENERIC_EXECUTE 0x20000000L +#define GENERIC_ALL 0x10000000L + +/* Standard Access Rights: */ +#define DELETE 0x00010000L +#define READ_CONTROL 0x00020000L +#define WRITE_DAC 0x00040000L +#define WRITE_OWNER 0x00080000L +#define SYNCHRONIZE 0x00100000L + +#define STANDARD_RIGHTS_REQUIRED 0x000F0000L + +#define STANDARD_RIGHTS_READ READ_CONTROL +#define STANDARD_RIGHTS_WRITE READ_CONTROL +#define STANDARD_RIGHTS_EXECUTE READ_CONTROL + +#define STANDARD_RIGHTS_ALL 0x001F0000L +#define SPECIFIC_RIGHTS_ALL 0x0000FFFFL + +/* Commulated Access Rights: */ +#define FILE_READ_DATA 0x0001 +#define FILE_LIST_DIRECTORY 0x0001 +#define FILE_WRITE_DATA 0x0002 +#define FILE_ADD_FILE 0x0002 +#define FILE_APPEND_DATA 0x0004 +#define FILE_ADD_SUBDIRECTORY 0x0004 +#define FILE_CREATE_PIPE_INSTANCE 0x0004 +#define FILE_READ_EA 0x0008 +#define FILE_WRITE_EA 0x0010 +#define FILE_EXECUTE 0x0020 +#define FILE_TRAVERSE 0x0020 +#define FILE_DELETE_CHILD 0x0040 +#define FILE_READ_ATTRIBUTES 0x0080 +#define FILE_WRITE_ATTRIBUTES 0x0100 +#define FILE_ALL_ACCESS \ + (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF) + +#define FILE_GENERIC_READ \ + (STANDARD_RIGHTS_READ | \ + FILE_READ_DATA | \ + FILE_READ_ATTRIBUTES | \ + FILE_READ_EA | \ + SYNCHRONIZE) + +#define FILE_GENERIC_WRITE \ + (STANDARD_RIGHTS_WRITE | \ + FILE_WRITE_DATA | \ + FILE_WRITE_ATTRIBUTES | \ + FILE_WRITE_EA | \ + FILE_APPEND_DATA | \ + SYNCHRONIZE) + +#define FILE_GENERIC_EXECUTE \ + (STANDARD_RIGHTS_EXECUTE | \ + FILE_READ_ATTRIBUTES | \ + FILE_EXECUTE | \ + SYNCHRONIZE) + +/* Creation Disposition: */ +#define CREATE_ALWAYS 2 +#define CREATE_NEW 1 +#define OPEN_ALWAYS 4 +#define OPEN_EXISTING 3 +#define TRUNCATE_EXISTING 5 + +/* File Attributes: */ +#define INVALID_FILE_ATTRIBUTES 0xffffffff +#define FILE_ATTRIBUTE_HIDDEN 0x2 +#define FILE_ATTRIBUTE_NORMAL 0x80 +#define FILE_ATTRIBUTE_DIRECTORY 0x10 +#define FILE_ATTRIBUTE_TEMPORARY 0x100 +#define FILE_ATTRIBUTE_REPARSE_POINT 0x400 + +/* File Offsets: */ +#define FILE_BEGIN 0 +#define FILE_CURRENT 1 +#define FILE_END 2 + +/* File Mapping: */ +#define SECTION_QUERY 0x0001 +#define SECTION_MAP_WRITE 0x0002 +#define SECTION_MAP_READ 0x0004 +#define SECTION_MAP_EXECUTE 0x0008 +#define SECTION_EXTEND_SIZE 0x0010 +#define SECTION_MAP_EXECUTE_EXPLICIT 0x0020 +#define SECTION_ALL_ACCESS \ + (STANDARD_RIGHTS_REQUIRED |\ + SECTION_QUERY |\ + SECTION_MAP_WRITE |\ + SECTION_MAP_READ |\ + SECTION_MAP_EXECUTE |\ + SECTION_EXTEND_SIZE) + +#define FILE_MAP_COPY SECTION_QUERY +#define FILE_MAP_WRITE SECTION_MAP_WRITE +#define FILE_MAP_READ SECTION_MAP_READ +#define FILE_MAP_ALL_ACCESS SECTION_ALL_ACCESS +#define FILE_MAP_EXECUTE SECTION_MAP_EXECUTE_EXPLICIT + +#define PAGE_EXECUTE_READ 0x20 +#define PAGE_EXECUTE_READWRITE 0x40 +#define PAGE_EXECUTE_WRITECOPY 0x80 +#define PAGE_READONLY 0x02 +#define PAGE_READWRITE 0x04 +#define PAGE_WRITECOPY 0x08 + +/* File Change Notifications: */ +#define FILE_NOTIFY_CHANGE_FILE_NAME 0x00000001 +#define FILE_NOTIFY_CHANGE_DIR_NAME 0x00000002 +#define FILE_NOTIFY_CHANGE_ATTRIBUTES 0x00000004 +#define FILE_NOTIFY_CHANGE_SIZE 0x00000008 +#define FILE_NOTIFY_CHANGE_LAST_WRITE 0x00000010 +#define FILE_NOTIFY_CHANGE_SECURITY 0x00000100 + +/* File Type: */ +#define FILE_TYPE_UNKNOWN 0x0000 +#define FILE_TYPE_DISK 0x0001 +#define FILE_TYPE_CHAR 0x0002 +#define FILE_TYPE_PIPE 0x0003 +#define FILE_TYPE_REMOTE 0x8000 + +/* Move Flags: */ +#define MOVEFILE_COPY_ALLOWED 0x2 +#define MOVEFILE_REPLACE_EXISTING 0x1 + +typedef DWORD SECURITY_INFORMATION, *PSECURITY_INFORMATION; +typedef HANDLE PSECURITY_DESCRIPTOR; + + +/* ========================================================================== */ +/* Structures: */ +typedef struct _OVERLAPPED { + ULONG_PTR Internal; + ULONG_PTR InternalHigh; + union { + struct { + DWORD Offset; + DWORD OffsetHigh; + }; + PVOID Pointer; + }; + HANDLE hEvent; +} OVERLAPPED, *LPOVERLAPPED; + +/* File Iteration: */ +typedef struct _WIN32_FIND_DATAA { + DWORD dwFileAttributes; + FILETIME ftCreationTime; + FILETIME ftLastAccessTime; + FILETIME ftLastWriteTime; + DWORD nFileSizeHigh; + DWORD nFileSizeLow; + DWORD dwReserved0; + DWORD dwReserved1; + CHAR cFileName[MAX_PATH]; + CHAR cAlternateFileName[14]; +} WIN32_FIND_DATAA, *PWIN32_FIND_DATAA, *LPWIN32_FIND_DATAA; +typedef struct _WIN32_FIND_DATAW { + DWORD dwFileAttributes; + FILETIME ftCreationTime; + FILETIME ftLastAccessTime; + FILETIME ftLastWriteTime; + DWORD nFileSizeHigh; + DWORD nFileSizeLow; + DWORD dwReserved0; + DWORD dwReserved1; + WCHAR cFileName[MAX_PATH]; + WCHAR cAlternateFileName[14]; +} WIN32_FIND_DATAW, *PWIN32_FIND_DATAW, *LPWIN32_FIND_DATAW; + + +/* ========================================================================== */ +/* File I/O Functions: */ +HANDLE WINAPI CreateFileA( + LPCSTR lpFileName, + DWORD dwDesiredAccess, + DWORD dwShareMode, + LPSECURITY_ATTRIBUTES lpSecurityAttributes, + DWORD dwCreationDisposition, + DWORD dwFlagsAndAttributes, + HANDLE hTemplateFile); +HANDLE WINAPI CreateFileW( + LPCWSTR lpFileName, + DWORD dwDesiredAccess, + DWORD dwShareMode, + LPSECURITY_ATTRIBUTES lpSecurityAttributes, + DWORD dwCreationDisposition, + DWORD dwFlagsAndAttributes, + HANDLE hTemplateFile); + +BOOL WINAPI WriteFile( + HANDLE hFile, + LPCVOID lpBuffer, + DWORD nNumberOfBytesToWrite, + LPDWORD lpNumberOfBytesWritten, + LPOVERLAPPED lpOverlapped); +BOOL WINAPI ReadFile( + HANDLE hFile, + LPVOID lpBuffer, + DWORD nNumberOfBytesToRead, + LPDWORD lpNumberOfBytesRead, + LPOVERLAPPED lpOverlapped); +DWORD WINAPI SetFilePointer( + HANDLE hFile, + LONG lDistanceToMove, + PLONG lpDistanceToMoveHigh, + DWORD dwMoveMethod); +BOOL WINAPI SetFilePointerEx( + HANDLE hFile, + LARGE_INTEGER liDistanceToMove, + PLARGE_INTEGER lpNewFilePointer, + DWORD dwMoveMethod); +BOOL WINAPI FlushFileBuffers( + HANDLE hFile); +DWORD WINAPI GetModuleFileNameA( + HMODULE hModule, + LPSTR lpFileName, + DWORD nSize); +DWORD WINAPI GetModuleFileNameW( + HMODULE hModule, + LPWSTR lpFileName, + DWORD nSize); +DWORD WINAPI GetModuleFileNameExA( + HANDLE hProcess, + HMODULE hModule, + LPSTR lpFileName, + DWORD nSize); +DWORD WINAPI GetModuleFileNameExW( + HANDLE hProcess, + HMODULE hModule, + LPWSTR lpFileName, + DWORD nSize); +HANDLE WINAPI OpenFileMappingA( + DWORD dwDesiredAccess, + BOOL bInheritHandle, + LPCSTR lpName); +HANDLE WINAPI OpenFileMappingW( + DWORD dwDesiredAccess, + BOOL bInheritHandle, + LPCWSTR lpName); +LPVOID WINAPI MapViewOfFile( + HANDLE hFileMappingObject, + DWORD dwDesiredAccess, + DWORD dwFileOffsetHigh, + DWORD dwFileOffsetLow, + SIZE_T dwNumberOfBytesToMap); +LPVOID WINAPI MapViewOfFileEx( + HANDLE hFileMappingObject, + DWORD dwDesiredAccess, + DWORD dwFileOffsetHigh, + DWORD dwFileOffsetLow, + SIZE_T dwNumberOfBytesToMap, + LPVOID lpBaseAddress); +HANDLE WINAPI CreateFileMappingA( + HANDLE hFile, + LPSECURITY_ATTRIBUTES lpAttributes, + DWORD flProtect, + DWORD dwMaximumSizeHigh, + DWORD dwMaximumSizeLow, + LPCSTR lpName); +HANDLE WINAPI CreateFileMappingW( + HANDLE hFile, + LPSECURITY_ATTRIBUTES lpAttributes, + DWORD flProtect, + DWORD dwMaximumSizeHigh, + DWORD dwMaximumSizeLow, + LPCWSTR lpName); +BOOL WINAPI UnmapViewOfFile( + LPCVOID lpBaseAddress); +DWORD WINAPI GetFileAttributesA( + LPCSTR lpFileName); +DWORD WINAPI GetFileAttributesW( + LPCWSTR lpFileName); + +typedef enum _GET_FILEEX_INFO_LEVELS { + GetFileExInfoStandard, + GetFileExMaxInfoLevel +} GET_FILEEX_INFO_LEVELS; +typedef struct _WIN32_FILE_ATTRIBUTE_DATA { + DWORD dwFileAttributes; + FILETIME ftCreationTime; + FILETIME ftLastAccessTime; + FILETIME ftLastWriteTime; + DWORD nFileSizeHigh; + DWORD nFileSizeLow; +} WIN32_FILE_ATTRIBUTE_DATA, *LPWIN32_FILE_ATTRIBUTE_DATA; +BOOL WINAPI GetFileAttributesExA( + LPCSTR lpFileName, + GET_FILEEX_INFO_LEVELS fInfoLevelId, + LPVOID lpFileInformation); +BOOL WINAPI GetFileAttributesExW( + LPCWSTR lpFileName, + GET_FILEEX_INFO_LEVELS fInfoLevelId, + LPVOID lpFileInformation); + +BOOL WINAPI GetFileTime( + HANDLE hFile, + LPFILETIME lpCreationTime, + LPFILETIME lpLastAccessTime, + LPFILETIME lpLastWriteTime); +BOOL WINAPI SetEndOfFile( + HANDLE hFile); +BOOL WINAPI CreateDirectoryA( + LPCSTR lpPathName, + LPSECURITY_ATTRIBUTES lpSecurityAttributes); +BOOL WINAPI CreateDirectoryW( + LPCWSTR lpPathName, + LPSECURITY_ATTRIBUTES lpSecurityAttributes); +BOOL WINAPI CopyFileA( + LPCSTR lpExistingFileName, + LPCSTR lpNewFileName, + BOOL bFailIfExists); +BOOL WINAPI CopyFileW( + LPCWSTR lpExistingFileName, + LPCWSTR lpNewFileName, + BOOL bFailIfExists); +BOOL WINAPI DeleteFileA( + LPCSTR lpFileName); +BOOL WINAPI DeleteFileW( + LPCWSTR lpFileName); +BOOL WINAPI MoveFileA( + LPCSTR lpExistingFileName, + LPCSTR lpNewFileName); +BOOL WINAPI MoveFileW( + LPCWSTR lpExistingFileName, + LPCWSTR lpNewFileName); +BOOL WINAPI MoveFileExA( + LPCSTR lpExistingFileName, + LPCSTR lpNewFileName, + DWORD dwFlags); +BOOL WINAPI MoveFileExW( + LPCWSTR lpExistingFileName, + LPCWSTR lpNewFileName, + DWORD dwFlags); +BOOL WINAPI RemoveDirectoryA( + LPCSTR lpPathName); +BOOL WINAPI RemoveDirectoryW( + LPCWSTR lpPathName); +BOOL WINAPI GetFileSizeEx( + HANDLE hFile, + PLARGE_INTEGER lpFileSize); +BOOL WINAPI FlushViewOfFile( + LPCVOID lpBaseAddress, + SIZE_T dwNumberOfBytesToFlush); + + +/* ========================================================================== */ +/* File Iteration Functions: */ +HANDLE WINAPI FindFirstFileA( + LPCSTR lpFileName, + LPWIN32_FIND_DATAA lpFindFileData); +HANDLE WINAPI FindFirstFileW( + LPCWSTR lpFileName, + LPWIN32_FIND_DATAW lpFindFileData); +BOOL WINAPI FindNextFileA( + HANDLE hFindFile, + LPWIN32_FIND_DATAA lpFindFileData); +BOOL WINAPI FindNextFileW( + HANDLE hFindFile, + LPWIN32_FIND_DATAW lpFindFileData); +BOOL WINAPI FindClose( + HANDLE hFindFile); + +/* ========================================================================== */ +/* File Change Functions: */ +HANDLE WINAPI FindFirstChangeNotificationA( + LPCSTR lpPathName, + BOOL bWatchSubtree, + DWORD dwNotifyFilter); +HANDLE WINAPI FindFirstChangeNotificationW( + LPCWSTR lpPathName, + BOOL bWatchSubtree, + DWORD dwNotifyFilter); +BOOL WINAPI FindNextChangeNotification( + HANDLE hChangeHandle); +BOOL WINAPI FindCloseChangeNotification( + HANDLE hChangeHandle); + +/* ========================================================================== */ +/* File Misc: */ +DWORD WINAPI GetFileType( + HANDLE hFile); + +/* ========================================================================== */ +/* Temp File: */ +UINT WINAPI GetTempFileNameW( + LPCWSTR lpPathName, + LPCWSTR lpPrefixString, + UINT uUnique, + LPWSTR lpTempFileName +); + +DWORD WINAPI GetTempPathW( + DWORD nBufferLength, + LPWSTR lpBuffer +); + +/* ========================================================================== */ +/* File Security: */ +BOOL WINAPI GetFileSecurityA( + LPCSTR lpFileName, + SECURITY_INFORMATION RequestedInformation, + PSECURITY_DESCRIPTOR pSecurityDescriptor, + DWORD nLength, + LPDWORD lpnLengthNeeded); +BOOL WINAPI GetFileSecurityW( + LPCWSTR lpFileName, + SECURITY_INFORMATION RequestedInformation, + PSECURITY_DESCRIPTOR pSecurityDescriptor, + DWORD nLength, + LPDWORD lpnLengthNeeded); + + +#if defined(__cplusplus) +} +#endif + +/* Enable all warnings */ +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + +#endif /* WINDOWS_FILE_H */ +#endif /* _WINDOWS_ */ + + +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Arvid Gerstmann. All rights reserved. + */ +#ifndef _WINDOWS_ +#ifndef WINDOWS_GDI_H +#define WINDOWS_GDI_H + +/* Disable all warnings */ +#if defined(_MSC_VER) + #pragma warning(push, 0) +#endif + +#ifndef WINDOWS_BASE_H +#include "windows_base.h" +#endif +#if defined(__cplusplus) +extern "C" { +#endif + +/* GDI: */ +#define BLACK_BRUSH 4 + + +/* Icons / Cursor: */ +#define MAKEINTRESOURCE(res) ((ULONG_PTR)(USHORT)res) +#define IDI_APPLICATION MAKEINTRESOURCE(32512) +#define IDC_ARROW MAKEINTRESOURCE(32512) + + +/* ========================================================================= */ +/* Functions */ +HCURSOR WINAPI LoadCursorA( + HINSTANCE hInstance, + LPCSTR lpCursorName); +HCURSOR WINAPI LoadCursorW( + HINSTANCE hInstance, + LPCWSTR lpCursorName); +HICON WINAPI LoadIconA( + HINSTANCE hInstance, + LPCSTR lpIconName); +HICON WINAPI LoadIconW( + HINSTANCE hInstance, + LPCWSTR lpIconName); +HGDIOBJ WINAPI GetStockObject( + int fnObject); +HCURSOR WINAPI SetCursor( + HCURSOR hCursor); + + +#if defined(__cplusplus) +} +#endif + +/* Enable all warnings */ +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + +#endif /* WINDOWS_GDI_H */ +#endif /* _WINDOWS_ */ + + +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Arvid Gerstmann. All rights reserved. + */ +#ifndef _WINDOWS_ +#ifndef WINDOWS_IO_H +#define WINDOWS_IO_H + +/* Disable all warnings */ +#if defined(_MSC_VER) + #pragma warning(push, 0) +#endif + +#ifndef WINDOWS_BASE_H +#include "windows_base.h" +#endif +#if defined(__cplusplus) +extern "C" { +#endif + +/* GetStdHandle: */ +#define STD_INPUT_HANDLE ((DWORD)-10) +#define STD_OUTPUT_HANDLE ((DWORD)-11) +#define STD_ERROR_HANDLE ((DWORD)-12) +#define INVALID_HANDLE_VALUE ((HANDLE)(LONG_PTR)-1) +#define ATTACH_PARENT_PROCESS ((DWORD)-1) + +#define HANDLE_FLAG_INHERIT 0x00000001 +#define HANDLE_FLAG_PROTECT_FROM_CLOSE 0x00000002 + +/* Console Colors: */ +#define FOREGROUND_BLUE 0x0001 +#define FOREGROUND_GREEN 0x0002 +#define FOREGROUND_RED 0x0004 +#define FOREGROUND_INTENSITY 0x0008 +#define BACKGROUND_BLUE 0x0010 +#define BACKGROUND_GREEN 0x0020 +#define BACKGROUND_RED 0x0040 +#define BACKGROUND_INTENSITY 0x0080 + +/* Console Handler */ +#define CTRL_C_EVENT 0x0 +#define CTRL_BREAK_EVENT 0x1 +#define CTRL_CLOSE_EVENT 0x2 +#define CTRL_LOGOFF_EVENT 0x5 +#define CTRL_SHUTDOWN_EVENT 0x6 + +/* HeapAlloc, HeapReAlloc, etc: */ +#define HEAP_NO_SERIALIZE 0x00000001 +#define HEAP_ZERO_MEMORY 0x00000008 +#define HEAP_REALLOC_IN_PLACE_ONLY 0x00000010 + +/* Heap / Memory: */ +typedef enum _HEAP_INFORMATION_CLASS { + HeapCompatibilityInformation = 0, + HeapEneableTerminationOnCorruption = 1, + HeapOptimizeResources = 3 +} HEAP_INFORMATION_CLASS; + +/* VirtualAlloc.flAllocationType: */ +#define MEM_COMMIT 0x00001000 +#define MEM_RESERVE 0x00002000 +#define MEM_RESET 0x00080000 +#define MEM_RESET_UNDO 0x01000000 +#define MEM_LARGE_PAGES 0x20000000 +#define MEM_PHYSICAL 0x00400000 +#define MEM_TOP_DOWN 0x00100000 +#define MEM_WRITE_WATCH 0x00200000 + +/* VirtualAlloc.flProtect: */ +#define PAGE_EXECUTE 0x10 +#define PAGE_EXECUTE_READ 0x20 +#define PAGE_EXECUTE_READWRITE 0x40 +#define PAGE_EXECUTE_WRITECOPY 0x80 +#define PAGE_NOACCESS 0x01 +#define PAGE_READONLY 0x02 +#define PAGE_READWRITE 0x04 +#define PAGE_WRITECOPY 0x08 +#define PAGE_TARGETS_INVALID 0x40000000 +#define PAGE_TARGETS_NO_UPDATE 0x40000000 +#define PAGE_GUARD 0x100 +#define PAGE_NOCACHE 0x200 +#define PAGE_WRITECOMBINE 0x400 + +/* VirtualFree.dwFreeType: */ +#define MEM_DECOMMIT 0x4000 +#define MEM_RELEASE 0x8000 + +/* VirtualQuery State and Type: */ +#define MEM_FREE 0x10000 +#define MEM_IMAGE 0x1000000 +#define MEM_MAPPED 0x40000 +#define MEM_PRIVATE 0x20000 + + +/* ========================================================================== */ +/* Structures: */ +typedef struct _COORD { + SHORT X; + SHORT Y; +} COORD, *PCOORD; + +typedef struct _SMALL_RECT { + SHORT Left; + SHORT Top; + SHORT Right; + SHORT Bottom; +} SMALL_RECT; + +typedef struct _CONSOLE_SCREEN_BUFFER_INFO { + COORD dwSize; + COORD dwCursorPosition; + WORD wAttributes; + SMALL_RECT srWindow; + COORD dwMaximumWindowSize; +} CONSOLE_SCREEN_BUFFER_INFO, *PCONSOLE_SCREEN_BUFFER_INFO; + +typedef BOOL (WINAPI *PHANDLER_ROUTINE)(DWORD dwCtrlType); + +typedef struct _MEMORY_BASIC_INFORMATION32 { + DWORD BaseAddress; + DWORD AllocationBase; + DWORD AllocationProtect; + DWORD RegionSize; + DWORD State; + DWORD Protect; + DWORD Type; +} MEMORY_BASIC_INFORMATION32, *PMEMORY_BASIC_INFORMATION32; + +typedef struct __declspec(align(16)) _MEMORY_BASIC_INFORMATION64 { + ULONGLONG BaseAddress; + ULONGLONG AllocationBase; + DWORD AllocationProtect; + DWORD __alignment1; + ULONGLONG RegionSize; + DWORD State; + DWORD Protect; + DWORD Type; + DWORD __alignment2; +} MEMORY_BASIC_INFORMATION64, *PMEMORY_BASIC_INFORMATION64; +#if defined(_WIN64) +typedef MEMORY_BASIC_INFORMATION64 MEMORY_BASIC_INFORMATION; +typedef PMEMORY_BASIC_INFORMATION64 PMEMORY_BASIC_INFORMATION; +#else +typedef MEMORY_BASIC_INFORMATION32 MEMORY_BASIC_INFORMATION; +typedef PMEMORY_BASIC_INFORMATION32 PMEMORY_BASIC_INFORMATION; +#endif + + +/* ========================================================================== */ +/* I/O Functions: */ +HANDLE WINAPI GetStdHandle( + DWORD nStdHandle); +BOOL WINAPI GetConsoleScreenBufferInfo( + HANDLE hConsoleOutput, + PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo); +BOOL WINAPI SetConsoleTextAttribute( + HANDLE hConsoleOutput, + WORD wAttributes); +BOOL WINAPI CloseHandle( + HANDLE hObject); +BOOL WINAPI SetHandleInformation( + HANDLE hObject, + DWORD dwMask, + DWORD dwFlags); +BOOL WINAPI DuplicateHandle( + HANDLE hSourceProcessHandle, + HANDLE hSourceHandle, + HANDLE hTargetProcessHandle, + LPHANDLE lpTargetHandle, + DWORD dwDesiredAccess, + BOOL bInheritHandle, + DWORD dwOptions); + + +LPSTR WINAPI GetCommandLineA(void); +LPWSTR WINAPI GetCommandLineW(void); +#ifdef UNICODE +#define GetCommandLine GetCommandLineW +#else +#define GetCommandLine GetCommandLineA +#endif + +/* ========================================================================== */ +/* Console Functions: */ +BOOL WINAPI AllocConsole(void); +BOOL WINAPI FreeConsole(void); +BOOL WINAPI AttachConsole( + DWORD dwProcessId); +BOOL WINAPI WriteConsoleA( + HANDLE hConsoleOutput, + const void *lpBuffer, + DWORD nNumberOfCharsToWrite, + LPDWORD lpNumberOfCHarsWritten, + LPVOID lpReserved); +BOOL WINAPI WriteConsoleW( + HANDLE hConsoleOutput, + const void *lpBuffer, + DWORD nNumberOfCharsToWrite, + LPDWORD lpNumberOfCHarsWritten, + LPVOID lpReserved); +BOOL WINAPI SetConsoleCtrlHandler( + PHANDLER_ROUTINE HandlerRoutine, + BOOL Add); +HWND WINAPI GetConsoleWindow(void); +BOOL WINAPI SetConsoleOutputCP( + UINT wCodePageID); +UINT WINAPI GetConsoleOutputCP(void); + +/* ========================================================================== */ +/* Heap Functions: */ +HANDLE WINAPI GetProcessHeap(void); +LPVOID WINAPI HeapAlloc( + HANDLE hHeap, + DWORD dwFlags, + SIZE_T dwBytes); +LPVOID WINAPI HeapReAlloc( + HANDLE hHeap, + DWORD dwFlags, + LPVOID lpMem, + SIZE_T dwBytes); +BOOL WINAPI HeapFree( + HANDLE hHeap, + DWORD dwFlags, + LPVOID lpMem); +BOOL WINAPI HeapsetInformation( + HANDLE HeapHandle, + HEAP_INFORMATION_CLASS HeapInformationClass, + PVOID HeapInformation, + SIZE_T HeapInformationLength); +LPVOID WINAPI VirtualAlloc( + LPVOID lpAddress, + SIZE_T dwSize, + DWORD flAllocationType, + DWORD flProtect); +SIZE_T WINAPI VirtualQuery( + LPCVOID lpAddress, + PMEMORY_BASIC_INFORMATION lpBuffer, + SIZE_T dwLength); +BOOL WINAPI VirtualFree( + LPVOID lpAddress, + SIZE_T dwSize, + DWORD dwFreeType); +BOOL WINAPI VirtualProtect( + LPVOID lpAddress, + SIZE_T dwSize, + DWORD flNewProtect, + PDWORD lpflOldProtect); +BOOL WINAPI FlushInstructionCache( + HANDLE hProcess, + LPCVOID lpBaseAddress, + SIZE_T dwSize); + + +/* ========================================================================== */ +/* Pipe Functions: */ +BOOL WINAPI CreatePipe( + PHANDLE hReadPipe, + PHANDLE hWritePipe, + LPSECURITY_ATTRIBUTES lpPipeAttributes, + DWORD nSize); +BOOL WINAPI PeekNamedPipe( + HANDLE hNamedPipe, + LPVOID lpBuffer, + DWORD nBufferSize, + LPDWORD lpBytesRead, + LPDWORD lpTotalBytesAvail, + LPDWORD lpBytesLeftThisMessage); + +/* ========================================================================== */ +/* Path Functions: */ +DWORD WINAPI GetFullPathNameA( + LPCSTR lpFileName, + DWORD nBufferLength, + LPSTR lpBuffer, + LPSTR *lpFilePart); +DWORD WINAPI GetFullPathNameW( + LPCWSTR lpFileName, + DWORD nBufferLength, + LPWSTR lpBuffer, + LPWSTR *lpFilePart); +BOOL WINAPI SetCurrentDirectoryA( + LPCSTR lpPathName); +BOOL WINAPI SetCurrentDirectoryW( + LPCWSTR lpPathName); +DWORD WINAPI GetCurrentDirectoryA( + DWORD nBufferLength, + LPSTR lpBuffer); +DWORD WINAPI GetCurrentDirectoryW( + DWORD nBufferLength, + LPWSTR lpBuffer); + +#if defined(__cplusplus) +} +#endif + +/* Enable all warnings */ +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + +#endif /* WINDOWS_IO_H */ +#endif /* _WINDOWS_ */ + + +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Arvid Gerstmann. All rights reserved. + */ +#ifndef _WINDOWS_ +#ifndef WINDOWS_MISC_H +#define WINDOWS_MISC_H + +/* Disable all warnings */ +#if defined(_MSC_VER) + #pragma warning(push, 0) +#endif + +#include + +#ifndef WINDOWS_BASE_H +#include "windows_base.h" +#endif +#if defined(__cplusplus) +extern "C" { +#endif + +/* MMRESULT: */ +typedef UINT MMRESULT; +#define TIMERR_BASE 96 +#define TIMERR_NOERROR (0) +#define TIMERR_NOCANDO (TIMERR_BASE+1) +#define TIMERR_STRUCT (TIMERR_BASE+33) + +/* Code Pages: */ +#define CP_INSTALLED 0x00000001 +#define CP_SUPPORTED 0x00000002 +#define CP_ACP 0 +#define CP_OEMCP 1 +#define CP_MACCP 2 +#define CP_THREAD_ACP 3 +#define CP_SYMBOL 42 +#define CP_UTF7 65000 +#define CP_UTF8 65001 + +/* Format: */ +#define FORMAT_MESSAGE_ALLOCATE_BUFFER 0x00000100 +#define FORMAT_MESSAGE_ARGUMENT_ARRAY 0x00002000 +#define FORMAT_MESSAGE_FROM_SYSTEM 0x00001000 +#define FORMAT_MESSAGE_IGNORE_INSERTS 0x00000200 +#define FORMAT_MESSAGE_FROM_HMODULE 0x00000800 +#define FORMAT_MESSAGE_FROM_STRING 0x00000400 + +/* Language ID: */ +#define MAKELANGID(p, s) ((((WORD)(s)) << 10) | (WORD )(p)) +#define PRIMARYLANGID(lgid) ((WORD)(lgid) & 0x3ff) +#define SUBLANGID(lgid) ((WORD)(lgid) >> 10) + +#define LANG_NEUTRAL 0x00 +#define LANG_INVARIANT 0x7f +#define LANG_ENGLISH 0x09 +#define LANG_GERMAN 0x07 + +#define SUBLANG_NEUTRAL 0x00 +#define SUBLANG_DEFAULT 0x01 +#define SUBLANG_SYS_DEFAULT 0x02 +#define SUBLANG_CUSTOM_DEFAULT 0x03 +#define SUBLANG_CUSTOM_UNSPECIFIED 0x04 +#define SUBLANG_UI_CUSTOM_DEFAULT 0x05 +#define SUBLANG_ENGLISH_US 0x01 +#define SUBLANG_ENGLISH_UK 0x02 +#define SUBLANG_GERMAN 0x01 + + +/* ========================================================================== */ +/* Structures: */ +/* Time: */ +typedef struct _SYSTEMTIME { + WORD wYear; + WORD wMonth; + WORD wDayOfWeek; + WORD wDay; + WORD wHour; + WORD wMinute; + WORD wSecond; + WORD wMilliseconds; +} SYSTEMTIME, *PSYSTEMTIME; +typedef PSYSTEMTIME LPSYSTEMTIME; + +typedef struct _TIME_ZONE_INFORMATION { + LONG Bias; + WCHAR StandardName[32]; + SYSTEMTIME StandardDate; + LONG StandardBias; + WCHAR DaylightName[32]; + SYSTEMTIME DaylightDate; + LONG DaylightBias; +} TIME_ZONE_INFORMATION, *PTIME_ZONE_INFORMATION; +typedef PTIME_ZONE_INFORMATION LPTIME_ZONE_INFORMATION; + + +/* ========================================================================== */ +/* Functions: */ +/* + * I could've implemented them in assembly, they're like 4 lines, but this is + * avoiding the cost of a function call, if optimizations are turned on. + */ +#ifdef WIN32_BYTESWAP_MACROS +#define _byteswap_ulong(x) (((unsigned long)(x) << 24) | \ + (((unsigned long)(x) << 8) & 0xff0000) | \ + (((unsigned long)(x) >> 8) & 0xff00) | \ + ((unsigned long)(x) >> 24)) +#define _byteswap_uint64(x) (((unsigned __int64)(x) << 56) | \ + (((unsigned __int64)(x) << 40) & 0xff000000000000ULL) | \ + (((unsigned __int64)(x) << 24) & 0xff0000000000ULL) | \ + (((unsigned __int64)(x) << 8) & 0xff00000000ULL) | \ + (((unsigned __int64)(x) >> 8) & 0xff000000ULL) | \ + (((unsigned __int64)(x) >> 24) & 0xff0000ULL) | \ + (((unsigned __int64)(x) >> 40) & 0xff00ULL) | \ + ((unsigned __int64)(x) >> 56)) +#else +unsigned short __cdecl _byteswap_ushort(unsigned short Number); +unsigned long __cdecl _byteswap_ulong (unsigned long Number); +unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64 Number); +#endif + +unsigned int _rotl(unsigned int value, int shift); +unsigned __int64 _rotl64(unsigned __int64 value, int shift); +unsigned char _BitScanForward(unsigned long * Index, unsigned long Mask); +unsigned char _BitScanForward64(unsigned long * Index, unsigned __int64 Mask); + + +/* ========================================================================== */ +/* UTF-16 <-> UTF-8 conversion Functions: */ +int WINAPI WideCharToMultiByte( + UINT CodePage, + DWORD dwFlags, + LPCWSTR lpWideCharStr, + int cchWideChar, + LPSTR lpMultiByteStr, + int cbMultiByte, + LPCSTR lpDefaultChar, + LPBOOL lpUsedDefaultChar); +int WINAPI MultiByteToWideChar( + UINT CodePage, + DWORD dwFlags, + LPCSTR lpMultiByteStr, + int cbMultiByte, + LPWSTR lpWideCharStr, + int cchWideChar); +int WINAPI lstrlenA( + LPCSTR lpString); +int WINAPI lstrlenW( + LPCWSTR lpString); +LPCSTR WINAPI lstrcpyA( + LPCSTR lpString1, + LPCSTR lpString2); +LPCWSTR WINAPI lstrcpyW( + LPCWSTR lpString1, + LPCWSTR lpString2); + +/* ========================================================================== */ +/* Time: */ +void WINAPI GetSystemTime( + LPSYSTEMTIME lpSystemTime); +void WINAPI GetLocalTime( + LPSYSTEMTIME lpSystemTime); +BOOL WINAPI QueryProcessCycleTime( + HANDLE hProcess, + PULONG64 CycleTime); +BOOL WINAPI SystemTimeToFileTime( + const SYSTEMTIME * lpSystemTime, + LPFILETIME lpFileTime); +BOOL WINAPI FileTimeToSystemTime( + const FILETIME * lpFileTime, + LPSYSTEMTIME lpSystemTime); +LONG WINAPI CompareFileTime( + const FILETIME * lpFileTime1, + const FILETIME * lpFileTime2); +void WINAPI GetSystemTimeAsFileTime( + LPFILETIME lpSystemTimeAsFileTime); +BOOL WINAPI SystemTimeToTzSpecificLocalTime( + LPTIME_ZONE_INFORMATION lpTimeZone, + LPSYSTEMTIME lpUniversalTime, + LPSYSTEMTIME lpLocalTime); +DWORD timeGetTime(void); + +/* ========================================================================== */ +/* Environment: */ +BOOL WINAPI SetEnvironmentVariableA( + LPCSTR lpName, + LPCSTR lpValue); +BOOL WINAPI SetEnvironmentVariableW( + LPCWSTR lpName, + LPCWSTR lpValue); +DWORD WINAPI GetEnvironmentVariableA( + LPCSTR lpName, + LPCSTR lpBuffer, + DWORD nSize); +DWORD WINAPI GetEnvironmentVariableW( + LPCWSTR lpName, + LPCWSTR lpBuffer, + DWORD nSize); + +/* ========================================================================== */ +/* Misc Functions: */ +BOOL WINAPI DisableThreadLibraryCalls( + HMODULE hModule); +DWORD WINAPI GetLastError(void); +void WINAPI Sleep( + DWORD dwMilliseconds); +DWORD WINAPI SleepEx( + DWORD dwMilliseconds, + BOOL bAlertable); +HMODULE WINAPI GetModuleHandleA( + LPCSTR lpModuleName); +HMODULE WINAPI GetModuleHandleW( + LPCWSTR lpModuleName); +DWORD WINAPI FormatMessageA( + DWORD dwFlags, + LPCVOID lpSource, + DWORD dwMessageId, + DWORD dwLanguageId, + LPSTR lpBuffer, + DWORD nSize, + va_list *Arguments); +DWORD WINAPI FormatMessageW( + DWORD dwFlags, + LPCVOID lpSource, + DWORD dwMessageId, + DWORD dwLanguageId, + LPWSTR lpBuffer, + DWORD nSize, + va_list *Arguments); + + +/* ========================================================================== */ +/* Timer Functions: */ +DWORD WINAPI GetTickCount(void); +ULONGLONG WINAPI GetTickCount64(void); +BOOL WINAPI QueryPerformanceFrequency( + LARGE_INTEGER *lpFrequency); +BOOL WINAPI QueryPerformanceCounter( + LARGE_INTEGER *lpPerformanceCount); + + +/* ========================================================================== */ +/* Multi Media Timer: */ +#define TIMERR_NOERROR (0) /* no error */ +#define TIMERR_NOCANDO (TIMERR_BASE+1) /* request not completed */ +#define TIMERR_STRUCT (TIMERR_BASE+33) /* time struct size */ + +typedef struct timecaps_tag { + UINT wPeriodMin; /* minimum period supported */ + UINT wPeriodMax; /* maximum period supported */ +} TIMECAPS, *PTIMECAPS, *NPTIMECAPS, *LPTIMECAPS; +typedef UINT MMRESULT; + +MMRESULT WINAPI timeGetDevCaps(LPTIMECAPS ptc, UINT cbtc); +MMRESULT WINAPI timeBeginPeriod(UINT uPeriod); +MMRESULT WINAPI timeEndPeriod(UINT uPeriod); + + +/* ========================================================================== */ +/* DLL Functions: */ +HMODULE WINAPI LoadLibraryA( + LPCSTR lpFileName); +HMODULE WINAPI LoadLibraryW( + LPCWSTR lpFileName); +HMODULE WINAPI LoadLibraryExA( + LPCSTR lpLibFileName, + HANDLE hFile, + DWORD dwFlags); +HMODULE WINAPI LoadLibraryExW( + LPCWSTR lpLibFileName, + HANDLE hFile, + DWORD dwFlags); +FARPROC WINAPI GetProcAddress( + HMODULE hModule, + LPCSTR lProcName); +PROC WINAPI wglGetProcAddress( + LPCSTR lpszProc); +BOOL WINAPI FreeLibrary( + HMODULE hModule); + +/* ========================================================================== */ +/* Libc Replacements: */ +PVOID SecureZeroMemory( + PVOID ptr, + SIZE_T cnt); + +#if defined(__cplusplus) +} +#endif + +/* Enable all warnings */ +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + +#endif /* WINDOWS_MISC_H */ +#endif /* _WINDOWS_ */ + + +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Arvid Gerstmann. All rights reserved. + */ +#ifndef _WINDOWS_ +#ifndef WINDOWS_PROCESS_H +#define WINDOWS_PROCESS_H + +/* Disable all warnings */ +#if defined(_MSC_VER) + #pragma warning(push, 0) +#endif + +#ifndef WINDOWS_BASE_H +#include "windows_base.h" +#endif +#if defined(__cplusplus) +extern "C" { +#endif + +/* Originally defined in threads.h */ +#ifndef INFINITE +#define INFINITE 0xffffffff +#endif + +/* Originally defined in file.h */ +#ifndef STANDARD_RIGHTS_REQUIRED +#define STANDARD_RIGHTS_REQUIRED 0x000F0000L +#endif +#ifndef SYNCHRONIZE +#define SYNCHRONIZE 0x00100000L +#endif + +/* Process Access Rights: */ +#define PROCESS_DUP_HANDLE (0x0040) +#define PROCESS_QUERY_INFORMATION (0x0400) +#define PROCESS_SUSPEND_RESUME (0x0800) +#define PROCESS_TERMINATE (0x0001) +#define PROCESS_VM_READ (0x0010) +#define PROCESS_ALL_ACCESS \ + (STANDARD_RIGHTS_REQUIRED | \ + SYNCHRONIZE | \ + 0xFFFF) + +/* Tokens: */ +#define TOKEN_ASSIGN_PRIMARY (0x0001) +#define TOKEN_DUPLICATE (0x0002) +#define TOKEN_IMPERSONATE (0x0004) +#define TOKEN_QUERY (0x0008) +#define TOKEN_QUERY_SOURCE (0x0010) +#define TOKEN_ADJUST_PRIVILEGES (0x0020) +#define TOKEN_ADJUST_GROUPS (0x0040) +#define TOKEN_ADJUST_DEFAULT (0x0080) +#define TOKEN_ADJUST_SESSIONID (0x0100) + +#define TOKEN_ALL_ACCESS_P (STANDARD_RIGHTS_REQUIRED | \ + TOKEN_ASSIGN_PRIMARY | \ + TOKEN_DUPLICATE | \ + TOKEN_IMPERSONATE | \ + TOKEN_QUERY | \ + TOKEN_QUERY_SOURCE | \ + TOKEN_ADJUST_PRIVILEGES | \ + TOKEN_ADJUST_GROUPS | \ + TOKEN_ADJUST_DEFAULT) + +#define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L) +#define SE_PRIVILEGE_ENABLED (0x00000002L) +#define SE_PRIVILEGE_REMOVED (0X00000004L) +#define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L) + +/* Status */ +#define STATUS_WAIT_0 ((DWORD)0x00000000L) +#define STATUS_TIMEOUT ((DWORD)0x00000102L) +#define STATUS_PENDING ((DWORD)0x00000103L) +#define STILL_ACTIVE STATUS_PENDING + +/* Startupinfo */ +#define STARTF_USESHOWWINDOW 0x00000001 +#define STARTF_USESIZE 0x00000002 +#define STARTF_USEPOSITION 0x00000004 +#define STARTF_USECOUNTCHARS 0x00000008 +#define STARTF_USEFILLATTRIBUTE 0x00000010 +#define STARTF_RUNFULLSCREEN 0x00000020 +#define STARTF_FORCEONFEEDBACK 0x00000040 +#define STARTF_FORCEOFFFEEDBACK 0x00000080 +#define STARTF_USESTDHANDLES 0x00000100 + + +/* Priority Classes / CreateProcess: */ +#define NORMAL_PRIORITY_CLASS 0x00000020 + +/* Job Objects: */ +#define JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE 0x00002000 +typedef enum _JOBOBJECTINFOCLASS { + JobObjectBasicAccountingInformation = 1, + JobObjectBasicLimitInformation, + JobObjectBasicProcessIdList, + JobObjectBasicUIRestrictions, + JobObjectSecurityLimitInformation, // deprecated + JobObjectEndOfJobTimeInformation, + JobObjectAssociateCompletionPortInformation, + JobObjectBasicAndIoAccountingInformation, + JobObjectExtendedLimitInformation, + JobObjectJobSetInformation, + JobObjectGroupInformation, + JobObjectNotificationLimitInformation, + JobObjectLimitViolationInformation, + JobObjectGroupInformationEx, + JobObjectCpuRateControlInformation, + JobObjectCompletionFilter, + JobObjectCompletionCounter, + JobObjectReserved1Information = 18, + JobObjectReserved2Information, + JobObjectReserved3Information, + JobObjectReserved4Information, + JobObjectReserved5Information, + JobObjectReserved6Information, + JobObjectReserved7Information, + JobObjectReserved8Information, + JobObjectReserved9Information, + MaxJobObjectInfoClass +} JOBOBJECTINFOCLASS; + +/* Process: */ +typedef struct _STARTUPINFOA { + DWORD cb; + LPSTR lpReserved; + LPSTR lpDesktop; + LPSTR lpTitle; + DWORD dwX; + DWORD dwY; + DWORD dwXSize; + DWORD dwYSize; + DWORD dwXCountChars; + DWORD dwYCountChars; + DWORD dwFillAttribute; + DWORD dwFlags; + WORD wShowWindow; + WORD cbReserved2; + LPBYTE lpReserved2; + HANDLE hStdInput; + HANDLE hStdOutput; + HANDLE hStdError; +} STARTUPINFOA, *LPSTARTUPINFOA; +typedef struct _STARTUPINFOW { + DWORD cb; + LPWSTR lpReserved; + LPWSTR lpDesktop; + LPWSTR lpTitle; + DWORD dwX; + DWORD dwY; + DWORD dwXSize; + DWORD dwYSize; + DWORD dwXCountChars; + DWORD dwYCountChars; + DWORD dwFillAttribute; + DWORD dwFlags; + WORD wShowWindow; + WORD cbReserved2; + LPBYTE lpReserved2; + HANDLE hStdInput; + HANDLE hStdOutput; + HANDLE hStdError; +} STARTUPINFOW, *LPSTARTUPINFOW; + +typedef struct _PROC_THREAD_ATTRIBUTE_LIST +*PPROC_THREAD_ATTRIBUTE_LIST, *LPPROC_THREAD_ATTRIBUTE_LIST; +typedef struct _STARTUPINFOEXA { + STARTUPINFOA StartupInfo; + PPROC_THREAD_ATTRIBUTE_LIST lpAttributeList; +} STARTUPINFOEXA, *LPSTARTUPINFOEXA; +typedef struct _STARTUPINFOEXW { + STARTUPINFOW StartupInfo; + PPROC_THREAD_ATTRIBUTE_LIST lpAttributeList; +} STARTUPINFOEXW, *LPSTARTUPINFOEXW; +typedef struct _PROCESS_INFORMATION { + HANDLE hProcess; + HANDLE hThread; + DWORD dwProcessId; + DWORD dwThreadId; +} PROCESS_INFORMATION, *LPPROCESS_INFORMATION; + +/* Job Objects: */ +typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION { + LARGE_INTEGER PerProcessUserTimeLimit; + LARGE_INTEGER PerJobUserTimeLimit; + DWORD LimitFlags; + SIZE_T MinimumWorkingSetSize; + SIZE_T MaximumWorkingSetSize; + DWORD ActiveProcessLimit; + ULONG_PTR Affinity; + DWORD PriorityClass; + DWORD SchedulingClass; +} JOBOBJECT_BASIC_LIMIT_INFORMATION, *PJOBOBJECT_BASIC_LIMIT_INFORMATION; + +typedef struct _IO_COUNTERS { + ULONGLONG ReadOperationCount; + ULONGLONG WriteOperationCount; + ULONGLONG OtherOperationCount; + ULONGLONG ReadTransferCount; + ULONGLONG WriteTransferCount; + ULONGLONG OtherTransferCount; +} IO_COUNTERS, *PIO_COUNTERS; + +typedef struct _JOBOBJECT_EXTENDED_LIMIT_INFORMATION { + JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation; + IO_COUNTERS IoInfo; + SIZE_T ProcessMemoryLimit; + SIZE_T JobMemoryLimit; + SIZE_T PeakProcessMemoryUsed; + SIZE_T PeakJobMemoryUsed; +} JOBOBJECT_EXTENDED_LIMIT_INFORMATION, *PJOBOBJECT_EXTENDED_LIMIT_INFORMATION; + + +/* ========================================================================== */ +/* Process: */ +HANDLE WINAPI GetCurrentProcess(void); +DWORD WINAPI GetCurrentProcessId(void); +void WINAPI ExitProcess(UINT uExitCode); +HANDLE WINAPI OpenProcess( + DWORD dwDesiredAccess, + BOOL bInheritHandle, + DWORD dwProcessId); +BOOL WINAPI CreateProcessA( + LPCSTR lpApplicationName, + LPSTR lpCommandLine, + LPSECURITY_ATTRIBUTES lpProcessAttributes, + LPSECURITY_ATTRIBUTES lpThreadAttributes, + BOOL bInheritHandles, + DWORD dwCreationFlags, + LPVOID lpEnvironment, + LPCSTR lpCurrentDirectory, + LPSTARTUPINFOA lpStartupInfo, + LPPROCESS_INFORMATION lpProcessInformation); +BOOL WINAPI CreateProcessW( + LPCWSTR lpApplicationName, + LPWSTR lpCommandLine, + LPSECURITY_ATTRIBUTES lpProcessAttributes, + LPSECURITY_ATTRIBUTES lpThreadAttributes, + BOOL bInheritHandles, + DWORD dwCreationFlags, + LPVOID lpEnvironment, + LPCWSTR lpCurrentDirectory, + LPSTARTUPINFOW lpStartupInfo, + LPPROCESS_INFORMATION lpProcessInformation); +BOOL WINAPI TerminateProcess( + HANDLE hProcess, + UINT uExitCode); +BOOL WINAPI EnumProcessModules( + HANDLE hProcess, + HMODULE * lphModule, + DWORD cb, + LPDWORD lpcbNeeded); +DWORD WINAPI WaitForInputIdle( + HANDLE hProcess, + DWORD dwMilliseconds); +BOOL WINAPI GetExitCodeProcess( + HANDLE hProcess, + LPDWORD lpExitCode); + +/* ========================================================================== */ +/* Jobs: */ +HANDLE WINAPI CreateJobObjectA( + LPSECURITY_ATTRIBUTES lpJobAttributes, + LPCSTR lpName); +HANDLE WINAPI CreateJobObjectW( + LPSECURITY_ATTRIBUTES lpJobAttributes, + LPCWSTR lpName); +BOOL WINAPI SetInformationJobObject( + HANDLE hJob, + JOBOBJECTINFOCLASS JobObjectInfoClass, + LPVOID lpJobObjectInfo, + DWORD cbJobObjectInfoLength); +BOOL WINAPI AssignProcessToJobObject( + HANDLE hJob, + HANDLE hProcess); + + +#if defined(__cplusplus) +} +#endif + +/* Enable all warnings */ +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + +#endif /* WINDOWS_PROCESS_H */ +#endif /* _WINDOWS_ */ + + +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Arvid Gerstmann. All rights reserved. + */ +#ifndef _WINDOWS_ +#ifndef WINDOWS_SYSINFO_H +#define WINDOWS_SYSINFO_H + +/* Disable all warnings */ +#if defined(_MSC_VER) + #pragma warning(push, 0) +#endif + +#ifndef WINDOWS_BASE_H +#include "windows_base.h" +#endif +#if defined(__cplusplus) +extern "C" { +#endif + +/* Display Devices: */ +#define DISPLAY_DEVICE_ACTIVE 0x00000001 +#define DISPLAY_DEVICE_ATTACHED 0x00000002 +#define DISPLAY_DEVICE_PRIMARY_DEVICE 0x00000004 + +/* System Metrics */ +#define SM_CXSCREEN 0 +#define SM_CYSCREEN 1 +#define SM_CMONITORS 80 + +/* Versions */ +#define VER_EQUAL 1 +#define VER_GREATER 2 +#define VER_GREATER_EQUAL 3 +#define VER_LESS 4 +#define VER_LESS_EQUAL 5 +#define VER_AND 6 +#define VER_OR 7 + +#define _WIN32_WINNT_WINXP 0x0501 +#define _WIN32_WINNT_WS03 0x0502 +#define _WIN32_WINNT_VISTA 0x0600 +#define _WIN32_WINNT_WS08 0x0600 +#define _WIN32_WINNT_WIN7 0x0601 +#define _WIN32_WINNT_WIN8 0x0602 +#define _WIN32_WINNT_WIN81 0x0603 +#define _WIN32_WINNT_WIN10 0x0A00 + +#define VER_MINORVERSION 0x0000001 +#define VER_MAJORVERSION 0x0000002 +#define VER_BUILDNUMBER 0x0000004 +#define VER_PLATFORMID 0x0000008 +#define VER_SERVICEPACKMINOR 0x0000010 +#define VER_SERVICEPACKMAJOR 0x0000020 + +/* Registry Key Classes */ +#define HKEY_CLASSES_ROOT ((HKEY)(ULONG_PTR)((LONG)0x80000000)) +#define HKEY_CURRENT_USER ((HKEY)(ULONG_PTR)((LONG)0x80000001)) +#define HKEY_LOCAL_MACHINE ((HKEY)(ULONG_PTR)((LONG)0x80000002)) +#define HKEY_USERS ((HKEY)(ULONG_PTR)((LONG)0x80000003)) + +/* Registry Types */ +#define REG_NONE 0 +#define REG_SZ 1 +#define REG_EXPAND_SZ 2 + +#define REG_BINARY 3 +#define REG_DWORD 4 +#define REG_DWORD_LITTLE_ENDIAN 4 +#define REG_DWORD_BIG_ENDIAN 5 +#define REG_LINK 6 +#define REG_MULTI_SZ 7 +#define REG_RESOURCE_LIST 8 +#define REG_FULL_RESOURCE_DESCRIPTOR 9 +#define REG_RESOURCE_REQUIREMENTS_LIST 10 +#define REG_QWORD 11 +#define REG_QWORD_LITTLE_ENDIAN 11 + + +/* Registry Access Rights */ +#define KEY_QUERY_VALUE 0x0001 +#define KEY_SET_VALUE 0x0002 +#define KEY_CREATE_SUB_KEY 0x0004 +#define KEY_ENUMERATE_SUB_KEYS 0x0008 +#define KEY_NOTIFY 0x0010 +#define KEY_CREATE_LINK 0x0020 +#define KEY_WOW64_32KEY 0x0200 +#define KEY_WOW64_64KEY 0x0100 +#define KEY_WOW64_RES 0x0300 + +#define KEY_READ \ + ((STANDARD_RIGHTS_READ \ + | KEY_QUERY_VALUE \ + | KEY_ENUMERATE_SUB_KEYS \ + | KEY_NOTIFY) \ + & (~SYNCHRONIZE)) + +#define KEY_WRITE \ + ((STANDARD_RIGHTS_WRITE \ + | KEY_SET_VALUE \ + | KEY_CREATE_SUB_KEY) \ + & (~SYNCHRONIZE)) + +#define KEY_EXECUTE \ + ((KEY_READ) \ + & (~SYNCHRONIZE)) + +#define KEY_ALL_ACCESS \ + ((STANDARD_RIGHTS_ALL \ + | KEY_QUERY_VALUE \ + | KEY_SET_VALUE \ + | KEY_CREATE_SUB_KEY \ + | KEY_ENUMERATE_SUB_KEYS \ + | KEY_NOTIFY \ + | KEY_CREATE_LINK) \ + & (~SYNCHRONIZE)) + + +/* ========================================================================== */ +/* Structures: */ +typedef struct _SYSTEM_INFO { + union { + DWORD dwOemId; + struct { + WORD wProcessorArchitecture; + WORD wReserved; + }; + }; + + DWORD dwPageSize; + LPVOID lpMinimumApplicationAddress; + LPVOID lpMaximumApplicationAddress; + DWORD_PTR dwActiveProcessorMask; + DWORD dwNumberOfProcessors; + DWORD dwProcessorType; + DWORD dwAllocationGranularity; + WORD wProcessorLevel; + WORD wProcessorRevision; +} SYSTEM_INFO, *LPSYSTEM_INFO; + +/* Device Context: */ +typedef struct _DISPLAY_DEVICEA { + DWORD cb; + CHAR DeviceName[32]; + CHAR DeviceString[128]; + DWORD StateFlags; + CHAR DeviceID[128]; + CHAR DeviceKey[128]; +} DISPLAY_DEVICEA, *PDISPLAY_DEVICEA; +typedef struct _DISPLAY_DEVICEW { + DWORD cb; + WCHAR DeviceName[32]; + WCHAR DeviceString[128]; + DWORD StateFlags; + WCHAR DeviceID[128]; + WCHAR DeviceKey[128]; +} DISPLAY_DEVICEW, *PDISPLAY_DEVICEW; + +/* Version: */ +typedef struct _OSVERSIONINFOEXA { + DWORD dwOSVersionInfoSize; + DWORD dwMajorVersion; + DWORD dwMinorVersion; + DWORD dwBuildNumber; + DWORD dwPlatformId; + CHAR szCSDVersion[128]; + WORD wServicePackMajor; + WORD wServicePackMinor; + WORD wSuiteMask; + BYTE wProductType; + BYTE wReserved; +} OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA; +typedef struct _OSVERSIONINFOEXW { + DWORD dwOSVersionInfoSize; + DWORD dwMajorVersion; + DWORD dwMinorVersion; + DWORD dwBuildNumber; + DWORD dwPlatformId; + WCHAR szCSDVersion[128]; + WORD wServicePackMajor; + WORD wServicePackMinor; + WORD wSuiteMask; + BYTE wProductType; + BYTE wReserved; +} OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW; + +/* SysInfo: */ +typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP { + RelationProcessorCore, + RelationNumaNode, + RelationCache, + RelationProcessorPackage, + RelationGroup, + RelationAll = 0xffff +} LOGICAL_PROCESSOR_RELATIONSHIP; +typedef enum _PROCESSOR_CACHE_TYPE { + CacheUnified, + CacheInstruction, + CacheData, + CacheTrace +} PROCESSOR_CACHE_TYPE; +typedef struct _CACHE_DESCRIPTOR { + BYTE Level; + BYTE Associativity; + WORD LineSize; + DWORD Size; + PROCESSOR_CACHE_TYPE Type; +} CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR; +typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION { + ULONG_PTR ProcessorMask; + LOGICAL_PROCESSOR_RELATIONSHIP Relationship; + union { + struct { + BYTE Flags; + } ProcessorCore; + struct { + DWORD NodeNumber; + } NumaNode; + CACHE_DESCRIPTOR Cache; + ULONGLONG Reserved[2]; + }; +} SYSTEM_LOGICAL_PROCESSOR_INFORMATION, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION; + +/* Processor Information Extended */ +typedef ULONG_PTR KAFFINITY; +typedef struct _GROUP_AFFINITY { + KAFFINITY Mask; + WORD Group; + WORD Reserved[3]; +} GROUP_AFFINITY, *PGROUP_AFFINITY; +typedef struct _NUMA_NODE_RELATIONSHIP { + DWORD NodeNumber; + BYTE Reserved[20]; + GROUP_AFFINITY GroupMask; +} NUMA_NODE_RELATIONSHIP, *PNUMA_NODE_RELATIONSHIP; + +typedef struct _PROCESSOR_GROUP_INFO { + BYTE MaximumProcessorCount; + BYTE ActiveProcessorCount; + BYTE Reserved[38]; + KAFFINITY ActiveProcessorMask; +} PROCESSOR_GROUP_INFO, *PPROCESSOR_GROUP_INFO; +typedef struct _GROUP_RELATIONSHIP { + WORD MaximumGroupCount; + WORD ActiveGroupCount; + BYTE Reserved[20]; + PROCESSOR_GROUP_INFO GroupInfo[1]; +} GROUP_RELATIONSHIP, *PGROUP_RELATIONSHIP; + +typedef struct _CACHE_RELATIONSHIP { + BYTE Level; + BYTE Associativity; + WORD LineSize; + DWORD CacheSize; + PROCESSOR_CACHE_TYPE Type; + BYTE Reserved[20]; + GROUP_AFFINITY GroupMask; +} CACHE_RELATIONSHIP, *PCACHE_RELATIONSHIP; + +typedef struct _PROCESSOR_RELATIONSHIP { + BYTE Flags; + BYTE EfficiencyClass; + BYTE Reserved[21]; + WORD GroupCount; + GROUP_AFFINITY GroupMask[1]; +} PROCESSOR_RELATIONSHIP, *PPROCESSOR_RELATIONSHIP; + +typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX { + LOGICAL_PROCESSOR_RELATIONSHIP Relationship; + DWORD Size; + union { + PROCESSOR_RELATIONSHIP Processor; + NUMA_NODE_RELATIONSHIP NumaNode; + CACHE_RELATIONSHIP Cache; + GROUP_RELATIONSHIP Group; + }; +} SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX; + +typedef struct _PROCESS_MEMORY_COUNTERS { + DWORD cb; + DWORD PageFaultCount; + SIZE_T PeakWorkingSetSize; + SIZE_T WorkingSetSize; + SIZE_T QuotaPeakPagedPoolUsage; + SIZE_T QuotaPagedPoolUsage; + SIZE_T QuotaPeakNonPagedPoolUsage; + SIZE_T QuotaNonPagedPoolUsage; + SIZE_T PagefileUsage; + SIZE_T PeakPagefileUsage; +} PROCESS_MEMORY_COUNTERS, *PPROCESS_MEMORY_COUNTERS; + +/* Memory: */ +typedef struct _MEMORYSTATUSEX { + DWORD dwLength; + DWORD dwMemoryLoad; + DWORDLONG ullTotalPhys; + DWORDLONG ullAvailPhys; + DWORDLONG ullTotalPageFile; + DWORDLONG ullAvailPageFile; + DWORDLONG ullTotalVirtual; + DWORDLONG ullAvailVirtual; + DWORDLONG ullAvailExtendedVirtual; +} MEMORYSTATUSEX, *LPMEMORYSTATUSEX; + +/* Processor: */ +typedef struct _PROCESSOR_NUMBER { + WORD Group; + BYTE Number; + BYTE Reserved; +} PROCESSOR_NUMBER, *PPROCESSOR_NUMBER; + + +/* ========================================================================== */ +/* System Info Functions: */ +void WINAPI GetSystemInfo( + LPSYSTEM_INFO lpSystemInfo); +BOOL WINAPI GlobalMemoryStatusEx( + LPMEMORYSTATUSEX lpBuffer); +BOOL WINAPI GetLogicalProcessorInformation( + PSYSTEM_LOGICAL_PROCESSOR_INFORMATION Buffer, + PDWORD ReturnedLength); +BOOL GetLogicalProcessorInformationEx( + LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType, + PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Buffer, + PDWORD ReturnedLength); +BOOL WINAPI GetProcessMemoryInfo( + HANDLE hProcess, + PPROCESS_MEMORY_COUNTERS ppsmemCounters, + DWORD cb); +BOOL WINAPI GetProcessTimes( + HANDLE hProcess, + LPFILETIME lpCreationTime, + LPFILETIME lpExitTime, + LPFILETIME lpKernelTime, + LPFILETIME lpUserTime); + +/* ========================================================================== */ +/* Processor Functions */ +DWORD WINAPI GetCurrentProcessorNumber(void); +void GetCurrentProcessorNumberEx(PPROCESSOR_NUMBER ProcNumber); +#define ALL_PROCESSOR_GROUPS 0xffff +DWORD GetActiveProcessorCount(WORD GroupNumber); + + +#define MAX_COMPUTERNAME_LENGTH 31 +BOOL WINAPI GetComputerNameA( + LPSTR lpBuffer, + LPDWORD lpnSize); +BOOL WINAPI GetComputerNameW( + LPWSTR lpBuffer, + LPDWORD lpnSize); + +/* Version: */ +BOOL WINAPI VerifyVersionInfoA( + LPOSVERSIONINFOEXA lpVersionInfo, + DWORD dwTypeMask, + DWORDLONG dwlConditionMask); +BOOL WINAPI VerifyVersionInfoW( + LPOSVERSIONINFOEXW lpVersionInfo, + DWORD dwTypeMask, + DWORDLONG dwlConditionMask); +ULONGLONG WINAPI VerSetConditionMask( + ULONGLONG ConditionMask, + DWORD TypeMask, + BYTE Condition); + +FORCEINLINE BOOL +IsWindowsVersionOrGreater(WORD major, WORD minor, WORD servpack) +{ + OSVERSIONINFOEXW vi = { sizeof(vi), major, minor, 0, 0, {0}, servpack }; + return VerifyVersionInfoW(&vi, + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, + VerSetConditionMask( + VerSetConditionMask( + VerSetConditionMask(0, + VER_MAJORVERSION, VER_GREATER_EQUAL), + VER_MINORVERSION,VER_GREATER_EQUAL), + VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL)); +} + +FORCEINLINE BOOL +IsWindowsVersionOrLess(WORD major, WORD minor, WORD servpack) +{ + OSVERSIONINFOEXW vi = { sizeof(vi), major, minor, 0, 0, {0}, servpack }; + return VerifyVersionInfoW(&vi, + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, + VerSetConditionMask( + VerSetConditionMask( + VerSetConditionMask(0, + VER_MAJORVERSION, VER_LESS_EQUAL), + VER_MINORVERSION,VER_LESS_EQUAL), + VER_SERVICEPACKMAJOR, VER_LESS_EQUAL)); +} + +#define GREATER IsWindowsVersionOrGreater +FORCEINLINE void +GetWindowsVersionCUSTOM(PWORD major, PWORD minor, PWORD srvpack) +{ + if (GREATER(HIBYTE(_WIN32_WINNT_WIN10), LOBYTE(_WIN32_WINNT_WIN10), 0)) { + *major = 10; + *minor = 0; + *srvpack = 0; + } else if (GREATER(HIBYTE(_WIN32_WINNT_WIN81), LOBYTE(_WIN32_WINNT_WIN81), 0)) { + *major = 6; + *minor = 3; + *srvpack = 0; + } else if (GREATER(HIBYTE(_WIN32_WINNT_WIN8), LOBYTE(_WIN32_WINNT_WIN8), 0)) { + *major = 6; + *minor = 2; + *srvpack = 0; + } else if (GREATER(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 1)) { + *major = 6; + *minor = 1; + *srvpack = 1; + } else if (GREATER(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0)) { + *major = 6; + *minor = 1; + *srvpack = 0; + } else if (GREATER(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 2)) { + *major = 6; + *minor = 0; + *srvpack = 2; + } else if (GREATER(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 1)) { + *major = 6; + *minor = 0; + *srvpack = 1; + } else if (GREATER(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0)) { + *major = 6; + *minor = 0; + *srvpack = 0; + } else if (GREATER(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 3)) { + *major = 5; + *minor = 1; + *srvpack = 2; + } else if (GREATER(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 1)) { + *major = 5; + *minor = 1; + *srvpack = 1; + } else if (GREATER(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0)) { + *major = 5; + *minor = 1; + *srvpack = 0; + } else { + *major = 0; + *minor = 0; + *srvpack = 0; + } +} +#undef GREATER + + +/* ========================================================================== */ +/* CPUID: */ +void __cpuid(int cpuInfo[4], int function_id); +void __cpuidex(int cpuInfo[4], int function_id, int subfunction_id); + +/* ========================================================================== */ +/* Device Context: */ +BOOL WINAPI EnumDisplayDevicesA( + LPCSTR lpDevice, + DWORD iDevNum, + PDISPLAY_DEVICEA lpDisplayDevice, + DWORD dwFlags); +BOOL WINAPI EnumDisplayDevicesW( + LPCWSTR lpDevice, + DWORD iDevNum, + PDISPLAY_DEVICEW lpDisplayDevice, + DWORD dwFlags); + +/* ========================================================================== */ +/* Registry: */ +LONG WINAPI RegOpenKeyExA( + HKEY hKey, + LPCSTR lpSubKey, + DWORD ulOptions, + REGSAM samDesired, + PHKEY phkResult); +LONG WINAPI RegOpenKeyExW( + HKEY hKey, + LPCWSTR lpSubKey, + DWORD ulOptions, + REGSAM samDesired, + PHKEY phkResult); +LONG WINAPI RegQueryValueExA( + HKEY hKey, + LPCSTR lpValueName, + LPDWORD lpReserved, + LPDWORD lpType, + LPBYTE lpData, + LPDWORD lpcbData); +LONG WINAPI RegQueryValueExW( + HKEY hKey, + LPCWSTR lpValueName, + LPDWORD lpReserved, + LPDWORD lpType, + LPBYTE lpData, + LPDWORD lpcbData); +LONG WINAPI RegCreateKeyExA( + HKEY hKey, + LPCSTR lpSubKey, + DWORD Reserved, + LPSTR lpClass, + DWORD dwOptions, + REGSAM samDesired, + LPSECURITY_ATTRIBUTES lpSecurityAttributes, + PHKEY phkResult, + LPDWORD lpdwDisposition); +LONG WINAPI RegCreateKeyExW( + HKEY hKey, + LPCWSTR lpSubKey, + DWORD Reserved, + LPWSTR lpClass, + DWORD dwOptions, + REGSAM samDesired, + LPSECURITY_ATTRIBUTES lpSecurityAttributes, + PHKEY phkResult, + LPDWORD lpdwDisposition); +LONG WINAPI RegEnumValueA( + HKEY hKey, + DWORD dwIndex, + LPSTR lpValueName, + LPDWORD lpcchValueName, + LPDWORD lpReserved, + LPDWORD lpType, + LPBYTE lpData, + LPDWORD lpcbData); +LONG WINAPI RegEnumValueW( + HKEY hKey, + DWORD dwIndex, + LPWSTR lpValueName, + LPDWORD lpcchValueName, + LPDWORD lpReserved, + LPDWORD lpType, + LPBYTE lpData, + LPDWORD lpcbData); +LONG WINAPI RegQueryInfoKeyA( + HKEY hKey, + LPSTR lpClass, + LPDWORD lpcClass, + LPDWORD lpReserved, + LPDWORD lpcSubKeys, + LPDWORD lpcMaxSubKeyLen, + LPDWORD lpcMaxClassLen, + LPDWORD lpcValues, + LPDWORD lpcMaxValueNameLen, + LPDWORD lpcMaxValueLen, + LPDWORD lpcbSecurityDescriptor, + PFILETIME lpftLastWriteTime); +LONG WINAPI RegQueryInfoKeyW( + HKEY hKey, + LPWSTR lpClass, + LPDWORD lpcClass, + LPDWORD lpReserved, + LPDWORD lpcSubKeys, + LPDWORD lpcMaxSubKeyLen, + LPDWORD lpcMaxClassLen, + LPDWORD lpcValues, + LPDWORD lpcMaxValueNameLen, + LPDWORD lpcMaxValueLen, + LPDWORD lpcbSecurityDescriptor, + PFILETIME lpftLastWriteTime); +LONG WINAPI RegEnumKeyExA( + HKEY hKey, + DWORD dwIndex, + LPSTR lpName, + LPDWORD lpcName, + LPDWORD lpReserved, + LPSTR lpClass, + LPDWORD lpcClass, + PFILETIME lpftLastWriteTime); +LONG WINAPI RegEnumKeyExW( + HKEY hKey, + DWORD dwIndex, + LPWSTR lpName, + LPDWORD lpcName, + LPDWORD lpReserved, + LPWSTR lpClass, + LPDWORD lpcClass, + PFILETIME lpftLastWriteTime); +LONG WINAPI RegCloseKey( + HKEY hKey); +LONG WINAPI RegFlushKey( + HKEY hKey); + +#if defined(__cplusplus) +} +#endif + +/* Enable all warnings */ +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + +#endif /* WINDOWS_SYSINFO_H */ +#endif /* _WINDOWS_ */ + + +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Arvid Gerstmann. All rights reserved. + */ +#ifndef _WINDOWS_ +#ifndef WINDOWS_THREADS_H +#define WINDOWS_THREADS_H + +/* Disable all warnings */ +#if defined(_MSC_VER) + #pragma warning(push, 0) +#endif + +#ifndef WINDOWS_BASE_H +#include "windows_base.h" +#endif +#if defined(__cplusplus) +extern "C" { +#endif + +/* WaitForSingleObject, WaitForMultipleObjects, etc: */ +#define INFINITE 0xffffffff + +/* Originally defined in file.h */ +#ifndef STANDARD_RIGHTS_REQUIRED +#define STANDARD_RIGHTS_REQUIRED 0x000F0000L +#endif +#ifndef SYNCHRONIZE +#define SYNCHRONIZE 0x00100000L +#endif + +#define STATUS_WAIT_0 ((DWORD)0x00000000L) +#define STATUS_ABANDONED_WAIT_0 ((DWORD)0x00000080L) +#define STATUS_TIMEOUT ((DWORD)0x00000102L) +#define STATUS_PENDING ((DWORD)0x00000103L) + +#define WAIT_FAILED ((DWORD)0xffffffff) +#define WAIT_OBJECT_0 ((STATUS_WAIT_0) + 0) +#define WAIT_ABANDONED ((STATUS_ABANDONED_WAIT_0) + 0) +#define WAIT_TIMEOUT 258L + +/* TLS: */ +#ifndef TLS_OUT_OF_INDEXES +#define TLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF) +#endif +#ifndef FLS_OUT_OF_INDEXES +#define FLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF) +#endif + + +/* Thread creation flags: */ +#define CREATE_NEW_CONSOLE 0x00000010 +#define CREATE_NO_WINDOW 0x08000000 +#define CREATE_SUSPENDED 0x00000004 +#define DETACHED_PROCESS 0x00000008 + +/* Thread Access Rights: */ +#define THREAD_GET_CONTEXT (0x0008) +#define THREAD_QUERY_INFORMATION (0x0040) +#define THREAD_SUSPEND_RESUME (0x0002) +#define THREAD_TERMINATE (0x0001) +#define THREAD_ALL_ACCESS \ + (STANDARD_RIGHTS_REQUIRED | \ + SYNCHRONIZE | \ + 0xFFFF) + +/* Semaphore Access Rights: */ +#define SEMAPHORE_ALL_ACCESS 0x1F0003 +#define SEMAPHORE_MODIFY_STATE 0x0002 +#define EVENT_ALL_ACCESS 0x1F0003 +#define EVENT_MODIFY_STATE 0x0002 + + +/* ========================================================================== */ +/* Structures: */ +/* Magic for Thread Local Storage: */ +typedef void (NTAPI *PIMAGE_TLS_CALLBACK)( + PVOID DllHandle, + DWORD Reason, + PVOID Reserved); +typedef struct _IMAGE_TLS_DIRECTORY32 { + DWORD StartAddressOfRawData; + DWORD EndAddressOfRawData; + DWORD AddressOfIndex; + DWORD AddressOfCallbacks; + DWORD SizeOfZeroFill; + DWORD Characteristics; +} IMAGE_TLS_DIRECTORY32, *PIMAGE_TLS_DIRECTORY32; +typedef struct _IMAGE_TLS_DIRECTORY64 { + ULONGLONG StartAddressOfRawData; + ULONGLONG EndAddressOfRawData; + ULONGLONG AddressOfIndex; + ULONGLONG AddressOfCallbacks; + DWORD SizeOfZeroFill; + DWORD Characteristics; +} IMAGE_TLS_DIRECTORY64, *PIMAGE_TLS_DIRECTORY64; +#if defined(_WIN64) +typedef IMAGE_TLS_DIRECTORY64 IMAGE_TLS_DIRECTORY; +typedef PIMAGE_TLS_DIRECTORY64 PIMAGE_TLS_DIRECTORY; +#else +typedef IMAGE_TLS_DIRECTORY32 IMAGE_TLS_DIRECTORY; +typedef PIMAGE_TLS_DIRECTORY32 PIMAGE_TLS_DIRECTORY; +#endif + +/* Linked List */ +typedef struct _LIST_ENTRY { + struct _LIST_ENTRY *Flink; + struct _LIST_ENTRY *Blink; +} LIST_ENTRY, *PLIST_ENTRY; + +typedef struct _RTL_CRITICAL_SECTION_DEBUG { + WORD Type; + WORD CreatorBackTraceIndex; + struct _RTL_CRITICAL_SECTION *CriticalSection; + LIST_ENTRY ProcessLocksList; + DWORD EntryCount; + DWORD ContentionCount; + DWORD Flags; + WORD CreatorBackTraceIndexHigh; + WORD SpareWORD; +} RTL_CRITICAL_SECTION_DEBUG, *PRTL_CRITICAL_SECTION_DEBUG; + +#pragma pack(push, 8) +typedef struct _RTL_CRITICAL_SECTION { + PRTL_CRITICAL_SECTION_DEBUG DebugInfo; + LONG LockCount; + LONG RecursionCount; + HANDLE OwningThread; + HANDLE LockSemaphore; + ULONG_PTR SpinCount; +} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION; +typedef RTL_CRITICAL_SECTION CRITICAL_SECTION; +typedef PRTL_CRITICAL_SECTION PCRITICAL_SECTION; +typedef PRTL_CRITICAL_SECTION LPCRITICAL_SECTION; +#pragma pack(pop) + +typedef struct _RTL_CONDITION_VARIABLE { + PVOID Ptr; +} RTL_CONDITION_VARIABLE, *PRTL_CONDITION_VARIABLE; +#define RTL_CONDITION_VARIABLE_INIT {0} +#define RTL_CONDITION_VARIABLE_LOCKMODE_SHARED 0x1 +typedef RTL_CONDITION_VARIABLE CONDITION_VARIABLE; +typedef PRTL_CONDITION_VARIABLE PCONDITION_VARIABLE; + +#define SRWLOCK_INIT {0} +typedef struct _RTL_SRWLOCK { + PVOID Ptr; +} RTL_SRWLOCK, *PRTL_SRWLOCK; +typedef RTL_SRWLOCK SRWLOCK, *PSRWLOCK; + +/* ========================================================================== */ +/* Waiting Functions: */ +DWORD WINAPI WaitForSingleObject( + HANDLE hHandle, + DWORD dwMilliseconds); +DWORD WINAPI WaitForMultipleObjects( + DWORD nCount, + const HANDLE *lpHandles, + BOOL bWaitAll, + DWORD dwMilliseconds); + +DWORD WINAPI WaitForSingleObjectEx( + HANDLE hHandle, + DWORD dwMilliseconds, + BOOL bAlertable); +DWORD WINAPI WaitForMultipleObjectsEx( + DWORD nCount, + const HANDLE *lpHandles, + BOOL bWaitAll, + DWORD dwMilliseconds, + BOOL bAlertable); + +/* ========================================================================== */ +/* Threading Functions: */ +typedef DWORD (WINAPI *PTHREAD_START_ROUTINE)(LPVOID); +typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE; +HANDLE WINAPI CreateThread( + LPSECURITY_ATTRIBUTES lpThreadAttributes, + SIZE_T dwStackSize, + LPTHREAD_START_ROUTINE lpStartAddress, + LPVOID lpParameter, + DWORD dwCreationFlags, + LPDWORD lpThreadId); +HANDLE WINAPI GetCurrentThread(void); +DWORD WINAPI GetCurrentThreadId(void); +DWORD_PTR WINAPI SetThreadAffinityMask( + HANDLE hThread, + DWORD_PTR dwThreadAffinityMask); +HANDLE WINAPI OpenThread( + DWORD dwDesiredAccess, + BOOL bInheritHandle, + DWORD dwThreadId); +DWORD WINAPI SuspendThread( + HANDLE hThread); +DWORD WINAPI ResumeThread( + HANDLE hThread); +void WINAPI ExitThread( + DWORD dwExitCode); +BOOL WINAPI GetProcessAffinityMask( + HANDLE hProcess, + PDWORD_PTR lpProcessAffinityMask, + PDWORD_PTR lpSystemAffinityMask); +BOOL WINAPI SetProcessAffinityMask( + HANDLE hProcess, + DWORD_PTR dwProcessAffinityMask); +BOOL WINAPI SwitchToThread(void); + +/* ========================================================================== */ +/* CriticalSection Functions: */ +void WINAPI InitializeCriticalSection( + LPCRITICAL_SECTION lpCriticalSection); +BOOL WINAPI InitializeCriticalSectionAndSpinCount( + LPCRITICAL_SECTION lpCriticalSection, + DWORD dwSpinCount); +DWORD WINAPI SetCriticalSectionSpinCount( + LPCRITICAL_SECTION lpCriticalSection, + DWORD dwSpinCount); +void WINAPI EnterCriticalSection( + LPCRITICAL_SECTION lpCriticalSection); +BOOL WINAPI TryEnterCriticalSection( + LPCRITICAL_SECTION lpCriticalSection); +void WINAPI LeaveCriticalSection( + LPCRITICAL_SECTION lpCriticalSection); +void WINAPI DeleteCriticalSection( + LPCRITICAL_SECTION lpCriticalSection); + +/* ========================================================================== */ +/* Condition Variable: */ +void WINAPI InitializeConditionVariable( + PCONDITION_VARIABLE ConditionVariable); +BOOL WINAPI SleepConditionVariableCS( + PCONDITION_VARIABLE ConditionVariable, + PCRITICAL_SECTION CriticalSection, + DWORD dwMilliseconds); +void WINAPI WakeAllConditionVariable( + PCONDITION_VARIABLE ConditionVariable); +void WINAPI WakeConditionVariable( + PCONDITION_VARIABLE ConditionVariable); + +/* ========================================================================== */ +/* Mutex Functions: */ +HANDLE WINAPI CreateMutexA( + LPSECURITY_ATTRIBUTES lpMutexAttributes, + BOOL bInitialOwner, + LPCSTR lpName); +HANDLE WINAPI CreateMutexW( + LPSECURITY_ATTRIBUTES lpMutexAttributes, + BOOL bInitialOwner, + LPCWSTR lpName); +BOOL WINAPI ReleaseMutex( + HANDLE hMutex); + +/* ========================================================================== */ +/* Semaphore Functions: */ +HANDLE WINAPI CreateSemaphoreA( + LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, + LONG lInitialCount, + LONG lMaximumCount, + LPCSTR lpName); +HANDLE WINAPI CreateSemaphoreW( + LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, + LONG lInitialCount, + LONG lMaximumCount, + LPCWSTR lpName); +BOOL WINAPI ReleaseSemaphore( + HANDLE hSemaphore, + LONG lReleaseCount, + LPLONG lpPreviousCount); +HANDLE WINAPI OpenSemaphoreA( + DWORD dwDesiredAccess, + BOOL bInheritHandle, + LPCSTR lpName); +HANDLE WINAPI OpenSemaphoreW( + DWORD dwDesiredAccess, + BOOL bInheritHandle, + LPCWSTR lpName); + + +/* ========================================================================== */ +/* Thread-Local Storage: */ +DWORD WINAPI TlsAlloc(void); +BOOL WINAPI TlsSetValue( + DWORD dwTlsIndex, + LPVOID lpTlsValue); +LPVOID WINAPI TlsGetValue( + DWORD dwTlsIndex); +DWORD WINAPI TlsFree( + DWORD dwTlsIndex); + +typedef void(WINAPI *PFLS_CALLBACK_FUNCTION)(PVOID); +DWORD WINAPI FlsAlloc(PFLS_CALLBACK_FUNCTION lpCallback); +BOOL WINAPI FlsFree(DWORD dwFlsIndex); +BOOL WINAPI FlsSetValue(DWORD dwFlsIndex, PVOID lpFlsData); +PVOID WINAPI FlsGetValue(DWORD dwFlsIndex); + + +/* ========================================================================== */ +/* SRW Lock Functions: */ +void WINAPI InitializeSRWLock(PSRWLOCK SRWLock); + +void WINAPI AcquireSRWLockExclusive(PSRWLOCK SRWLock); +void WINAPI AcquireSRWLockShared(PSRWLOCK SRWLock); + +void WINAPI ReleaseSRWLockExclusive(PSRWLOCK SRWLock); +void WINAPI ReleaseSRWLockShared(PSRWLOCK SRWLock); + +BOOL WINAPI TryAcquireSRWLockExclusive(PSRWLOCK SRWLock); +BOOL WINAPI TryAcquireSRWLockShared(PSRWLOCK SRWLock); + +BOOL WINAPI SleepConditionVariableSRW( + PCONDITION_VARIABLE ConditionVariable, + PSRWLOCK SRWLock, + DWORD dwMilliseconds, + ULONG Flags); + +/* ========================================================================== */ +/* Waiting: */ +BOOL WINAPI WaitOnAddress( + void volatile *Address, + PVOID CompareAddress, + SIZE_T AddressSize, + DWORD dwMilliseconds); +void WINAPI WakeByAddressSingle( + PVOID Address); +void WINAPI WakeByAddressAll( + PVOID Address); + +/* ========================================================================== */ +/* Events: */ +HANDLE WINAPI CreateEvent( + LPSECURITY_ATTRIBUTES lpEventAttributes, + BOOL bManualReset, + BOOL bInitialState, + LPCTSTR lpName); +HANDLE WINAPI OpenEvent( + DWORD dwDesiredAccess, + BOOL bInheritHandle, + LPCTSTR lpName); +BOOL WINAPI SetEvent( + HANDLE hEvent); +BOOL WINAPI ResetEvent( + HANDLE hEvent); + + +#if defined(__cplusplus) +} +#endif + +/* Enable all warnings */ +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + +#endif /* WINDOWS_THREADS_H */ +#endif /* _WINDOWS_ */ + + +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Arvid Gerstmann. All rights reserved. + */ +#ifndef _WINDOWS_ +#ifndef WINDOWS_WINDOW_H +#define WINDOWS_WINDOW_H + +/* Disable all warnings */ +#if defined(_MSC_VER) + #pragma warning(push, 0) +#endif + +#ifndef WINDOWS_BASE_H +#include "windows_base.h" +#endif +#if defined(__cplusplus) +extern "C" { +#endif + +/* MessageBox customizations: */ +#define MB_ABORTRETRYIGNORE 0x00000002L +#define MB_CANCELTRYCONTINUE 0x00000006L +#define MB_HELP 0x00004000L +#define MB_OK 0x00000000L +#define MB_OKCANCEL 0x00000001L +#define MB_RETRYCANCEL 0x00000005L +#define MB_YESNO 0x00000004L +#define MB_YESNOCANCEL 0x00000003L + +#define MB_ICONEXCLAMATION 0x00000030L +#define MB_ICONWARNING 0x00000030L +#define MB_ICONINFORMATION 0x00000040L +#define MB_ICONASTERISK 0x00000040L +#define MB_ICONQUESTION 0x00000020L +#define MB_ICONSTOP 0x00000010L +#define MB_ICONERROR 0x00000010L +#define MB_ICONHAND 0x00000010L + +#define MB_DEFBUTTON1 0x00000000L +#define MB_DEFBUTTON2 0x00000100L +#define MB_DEFBUTTON3 0x00000200L +#define MB_DEFBUTTON4 0x00000300L + +#define MB_APPLMODAL 0x00000000L +#define MB_SYSTEMMODAL 0x00001000L +#define MB_TASKMODAL 0x00002000L + +#define MB_DEFAULT_DESKTOP_ONLY 0x00020000L +#define MB_RIGHT 0x00080000L +#define MB_RTLREADING 0x00100000L +#define MB_SETFOREGROUND 0x00010000L +#define MB_TOPMOST 0x00040000L +#define MB_SERVICE_NOTIFICATION 0x00200000L + +#define IDABORT (3) +#define IDCANCEL (2) +#define IDCONTINUE (11) +#define IDIGNORE (5) +#define IDNO (7) +#define IDOK (1) +#define IDRETRY (4) +#define IDTRYAGAIN (10) +#define IDYES (6) + +/* Window Styles: */ +#define WS_OVERLAPPED 0x00000000L +#define WS_POPUP 0x80000000L +#define WS_CHILD 0x40000000L +#define WS_MINIMIZE 0x20000000L +#define WS_VISIBLE 0x10000000L +#define WS_DISABLED 0x08000000L +#define WS_CLIPSIBLINGS 0x04000000L +#define WS_CLIPCHILDREN 0x02000000L +#define WS_MAXIMIZE 0x01000000L +#define WS_CAPTION 0x00C00000L +#define WS_BORDER 0x00800000L +#define WS_DLGFRAME 0x00400000L +#define WS_VSCROLL 0x00200000L +#define WS_HSCROLL 0x00100000L +#define WS_SYSMENU 0x00080000L +#define WS_THICKFRAME 0x00040000L +#define WS_GROUP 0x00020000L +#define WS_TABSTOP 0x00010000L + +#define WS_MINIMIZEBOX 0x00020000L +#define WS_MAXIMIZEBOX 0x00010000L + + +#define WS_TILED WS_OVERLAPPED +#define WS_ICONIC WS_MINIMIZE +#define WS_SIZEBOX WS_THICKFRAME +#define WS_TILEDWINDOW WS_OVERLAPPEDWINDOW + +/* Common Window Styles: */ +#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED | \ + WS_CAPTION | \ + WS_SYSMENU | \ + WS_THICKFRAME | \ + WS_MINIMIZEBOX | \ + WS_MAXIMIZEBOX) +#define WS_POPUPWINDOW (WS_POPUP | \ + WS_BORDER | \ + WS_SYSMENU) +#define WS_CHILDWINDOW (WS_CHILD) + +#define CW_USEDEFAULT ((int)0x80000000) + +/* Class Styles: */ +#define CS_OWNDC 0x0020 +#define CS_VREDRAW 0x0001 +#define CS_HREDRAW 0x0002 + +/* Messages: */ +#define PM_NOREMOVE 0x0000 +#define PM_REMOVE 0x0001 +#define PM_NOYIELD 0x0002 + +#define WM_NULL 0x0000 +#define WM_CREATE 0x0001 +#define WM_DESTROY 0x0002 +#define WM_MOVE 0x0003 +#define WM_SIZE 0x0005 +#define WM_SETFOCUS 0x0007 +#define WM_KILLFOCUS 0x0008 +#define WM_ENABLE 0x000A +#define WM_SETREDRAW 0x000B +#define WM_SETTEXT 0x000C +#define WM_GETTEXT 0x000D +#define WM_GETTEXTLENGTH 0x000E +#define WM_PAINT 0x000F +#define WM_CLOSE 0x0010 +#define WM_QUIT 0x0012 +#define WM_ERASEBKGND 0x0014 +#define WM_SYSCOLORCHANGE 0x0015 +#define WM_SHOWWINDOW 0x0018 +#define WM_WININICHANGE 0x001A +#define WM_NCDESTROY 0x0082 + +#define WM_KEYDOWN 0x0100 +#define WM_KEYUP 0x0101 +#define WM_SYSKEYDOWN 0x0104 +#define WM_SYSKEYUP 0x0105 + +#define WM_SYSCOMMAND 0x0112 + +#define WM_ENTERSIZEMOVE 0x0231 +#define WM_EXITSIZEMOVE 0x0232 + +#define WM_ACTIVATE 0x0006 +#define WA_INACTIVE 0 +#define WA_ACTIVE 1 +#define WA_CLICKACTIVE 2 + +#define SC_KEYMENU 0xF100 + +/* Events: */ +#define EVENT_ALL_ACCESS 0x1F0003 +#define EVENT_MODIFY_STATE 0x0002 + +/* Virtual Keys: */ +#define VK_BACK 0x08 +#define VK_TAB 0x09 +#define VK_SHIFT 0x10 +#define VK_CONTROL 0x11 +#define VK_MENU 0x12 +#define VK_RETURN 0x0D + +#define VK_ESCAPE 0x1B + +#define VK_SPACE 0x20 +#define VK_PRIOR 0x21 +#define VK_NEXT 0x22 +#define VK_END 0x23 +#define VK_HOME 0x24 +#define VK_LEFT 0x25 +#define VK_UP 0x26 +#define VK_RIGHT 0x27 +#define VK_DOWN 0x28 +#define VK_SELECT 0x29 +#define VK_PRINT 0x2A +#define VK_EXECUTE 0x2B +#define VK_SNAPSHOT 0x2C +#define VK_INSERT 0x2D +#define VK_DELETE 0x2E +#define VK_HELP 0x2F + +#define VK_LWIN 0x5B +#define VK_RWIN 0x5C +#define VK_PROCESSKEY 0xE5 + + +/* ========================================================================== */ +/* Structures: */ +typedef struct _RECT { + LONG left; + LONG top; + LONG right; + LONG bottom; +} RECT, *PRECT, *LPRECT; + +/* Window: */ +typedef LRESULT (CALLBACK *WNDPROC)(HWND, UINT, WPARAM, LPARAM); +typedef struct tagWNDCLASS { + UINT style; + WNDPROC lpfnWndProc; + int cbClsExtra; + int cbWndExtra; + HINSTANCE hInstance; + HICON hIcon; + HCURSOR hCursor; + HBRUSH hbrBackground; + LPCTSTR lpszMenuName; + LPCTSTR lpszClassName; +} WNDCLASS, *PWNDCLASS; + +/* Messages: */ +typedef struct tagPOINT { + LONG x; + LONG y; +} POINT, *PPOINT; + +typedef struct tagMSG { + HWND hwnd; + UINT message; + WPARAM wParam; + LPARAM lParam; + DWORD time; + POINT pt; +} MSG, *PMSG, *LPMSG; + + +/* ========================================================================== */ +/* Window Functions: */ +int WINAPI MessageBoxA( + HWND hWND, + LPCSTR lpText, + LPCSTR lpCaption, + UINT uType); +int WINAPI MessageBoxW( + HWND hWND, + LPCWSTR lpText, + LPCWSTR lpCaption, + UINT uType); +ATOM WINAPI RegisterClassA( + WNDCLASS *lpWndClass); +ATOM WINAPI RegisterClassW( + WNDCLASS *lpWndClass); +BOOL WINAPI UnregisterClassA( + LPCSTR lpClassName, + HINSTANCE hInstance); +BOOL WINAPI UnregisterClassW( + LPCWSTR lpClassName, + HINSTANCE hInstance); +HWND WINAPI CreateWindowExA( + DWORD dwExStyle, + LPCSTR lpClassName, + LPCSTR lpWindowName, + DWORD dwStyle, + int x, + int y, + int nWidth, + int nHeight, + HWND hWndParent, + HMENU hMenu, + HINSTANCE hInstance, + LPVOID lpParam); +HWND WINAPI CreateWindowExW( + DWORD dwExStyle, + LPCWSTR lpClassName, + LPCWSTR lpWindowName, + DWORD dwStyle, + int x, + int y, + int nWidth, + int nHeight, + HWND hWndParent, + HMENU hMenu, + HINSTANCE hInstance, + LPVOID lpParam); +BOOL WINAPI ShowWindow( + HWND hWnd, + int nCmdShow); +BOOL WINAPI UpdateWindow( + HWND hWnd); +LRESULT WINAPI DefWindowProcA( + HWND hWnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam); +LRESULT WINAPI DefWindowProcW( + HWND hWnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam); +BOOL WINAPI DestroyWindow( + HWND hWnd); +BOOL WINAPI AdjustWindowRectEx( + LPRECT lpRect, + DWORD dwStyle, + BOOL bMenu, + DWORD dwExStyle); +BOOL WINAPI GetClientRect( + HWND hWnd, + LPRECT lpRect); +int WINAPI GetSystemMetrics( + int nIndex); + +/* ========================================================================== */ +/* Message Queue: */ +BOOL WINAPI PeekMessageA( + LPMSG lpMsg, + HWND hWnd, + UINT wMsgFilterMin, + UINT wMsgFilterMax, + UINT wRemoveMsg); +BOOL WINAPI PeekMessageW( + LPMSG lpMsg, + HWND hWnd, + UINT wMsgFilterMin, + UINT wMsgFilterMax, + UINT wRemoveMsg); +BOOL WINAPI TranslateMessage( + const MSG *lpMsg); +LRESULT WINAPI DispatchMessageA( + const MSG *lpMsg); +LRESULT WINAPI DispatchMessageW( + const MSG *lpMsg); +void WINAPI PostQuitMessage( + int nExitCode); + +/* ========================================================================== */ +/* Events: */ +HANDLE WINAPI CreateEventA( + LPSECURITY_ATTRIBUTES lpEventAttributes, + BOOL bManualReset, + BOOL bInitialState, + LPCSTR lpName); +HANDLE WINAPI CreateEventW( + LPSECURITY_ATTRIBUTES lpEventAttributes, + BOOL bManualReset, + BOOL bInitialState, + LPCWSTR lpName); +HANDLE WINAPI OpenEventA( + DWORD dwDesiredAccess, + BOOL bInheritHandle, + LPCSTR lpName); +HANDLE WINAPI OpenEventW( + DWORD dwDesiredAccess, + BOOL bInheritHandle, + LPCWSTR lpName); +BOOL WINAPI ResetEvent( + HANDLE hEvent); +BOOL WINAPI SetEvent( + HANDLE hEvent); +SHORT WINAPI GetKeyState( + int nVirtKey); + +#if defined(__cplusplus) +} +#endif + +/* Enable all warnings */ +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + +#endif /* WINDOWS_WINDOW_H */ +#endif /* _WINDOWS_ */ + + +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Arvid Gerstmann. All rights reserved. + */ +#ifndef _WINDOWS_ +#ifndef WINDOWS_INTRIN_H +#define WINDOWS_INTRIN_H + +/* Disable all warnings */ +#if defined(_MSC_VER) + #pragma warning(push, 0) +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + + +/* ========================================================================== */ +/* Intrinsics */ +/* ========================================================================== */ + +extern void _mm_pause(void); +#pragma intrinsic(_mm_pause) + +extern void _ReadWriteBarrier(void); +#pragma intrinsic(_ReadWriteBarrier) + + + +#if defined(__cplusplus) +} +#endif + +/* Enable all warnings */ +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + +#endif /* WINDOWS_INTRIN_H */ +#endif /* _WINDOWS_ */ + + +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Arvid Gerstmann. All rights reserved. + */ +#ifndef _WINDOWS_ +#ifndef WINDOWS_FIBER_H +#define WINDOWS_FIBER_H + +/* Disable all warnings */ +#if defined(_MSC_VER) + #pragma warning(push, 0) +#endif + +#ifndef WINDOWS_BASE_H + #include "windows_base.h" +#endif + +/* dbghelp contains __readfsdword / __readgsqword */ +#ifndef WINDOWS_DBGHELP_H + #include "dbghelp.h" +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + + +/* ========================================================================= */ +/* Fiber */ +/* ========================================================================= */ +typedef void (WINAPI *PFIBER_START_ROUTINE)(LPVOID lpFiberParameter); +typedef PFIBER_START_ROUTINE LPFIBER_START_ROUTINE; +typedef void(NTAPI *PFLS_CALLBACK_FUNCTION)(PVOID lpFlsData); + +BOOL WINAPI IsThreadAFiber(void); + +void WINAPI SwitchToFiber(LPVOID lpFiber); +void WINAPI DeleteFiber(LPVOID lpFiber); + +BOOL WINAPI ConvertFiberToThread(void); + +LPVOID WINAPI CreateFiber( + SIZE_T dwStackSize, + LPFIBER_START_ROUTINE lpStartAddress, + LPVOID lpParameter); +LPVOID WINAPI CreateFiberEx( + SIZE_T dwStackCommitSize, + SIZE_T dwStackReserveSize, + DWORD dwFlags, + LPFIBER_START_ROUTINE lpStartAddress, + LPVOID lpParameter); + +LPVOID WINAPI ConvertThreadToFiber(LPVOID lpParameter); +LPVOID WINAPI ConvertThreadToFiberEx( + LPVOID lpParameter, + DWORD dwFlags); + +#ifdef _AMD64_ +__inline PVOID +GetCurrentFiber(void) +{ + return (PVOID)(ULONG_PTR)__readgsqword(0x20); +} +#else +__inline PVOID +GetCurrentFiber(void) +{ + return (PVOID)(ULONG_PTR)__readfsdword(0x10); +} +#endif + +__forceinline PVOID +GetFiberData(void) +{ + return *(PVOID *)GetCurrentFiber(); +} + + +/* ========================================================================= */ +/* Fiber Local Storage */ +/* ========================================================================= */ +#ifndef FLS_OUT_OF_INDEXES +#define FLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF) +#endif + +DWORD WINAPI FlsAlloc(PFLS_CALLBACK_FUNCTION lpCallback); +PVOID WINAPI FlsGetValue(DWORD dwFlsIndex); +BOOL WINAPI FlsSetValue(DWORD dwFlsIndex, PVOID lpFlsData); +BOOL WINAPI FlsFree(DWORD dwFlsIndex); + + +#if defined(__cplusplus) +} +#endif + +/* Enable all warnings */ +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + +#endif /* WINDOWS_FIBER_H */ +#endif /* _WINDOWS_ */ + + +#endif +#endif +#define _WINDOWS_ +#endif diff --git a/exe_load/include/windows_base.h b/exe_load/include/windows_base.h new file mode 100644 index 0000000..6f78714 --- /dev/null +++ b/exe_load/include/windows_base.h @@ -0,0 +1,393 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Arvid Gerstmann. All rights reserved. + */ +#ifndef _WINDOWS_ +#ifndef WINDOWS_BASE_H +#define WINDOWS_BASE_H + +/* Disable all warnings */ +#if defined(_MSC_VER) + #pragma warning(push, 0) +#endif +#if defined(__cplusplus) +extern "C" { +#endif + +/* size_t */ +/* #include */ + + +/* + * Windows Version requirements: Vista + * See here for more information regarding this define: + * https://msdn.microsoft.com/en-us/library/aa383745(VS.85).aspx + */ +#ifndef _WIN32_WINNT + #define _WIN32_WINNT 0x0600 +#endif + +/* Magic: */ +#define _CRTALLOC(x) __declspec(allocate(x)) +#define DECLSPEC_ALIGN(x) __declspec(align(x)) + +/* Basic Defines: */ +#define NTAPI __stdcall +#define WINAPI __stdcall +#define APIENTRY __stdcall +#define CALLBACK __stdcall +#define TRUE (1) +#define FALSE (0) +#ifndef NULL +# ifdef __cplusplus +# define NULL __nullptr +# else +# define NULL ((void *)0) +# endif +#endif +#ifndef FORCEINLINE +#define FORCEINLINE __forceinline +#endif +#ifdef UNICODE +#define __TEXT(x) L ## x +#define TEXT(x) __TEXT(x) +#else +#define TEXT(x) x +#endif +#define PATH_MAX 260 +#define MAX_PATH 260 + +#define MAKEWORD(a, b) \ + ((WORD)(((BYTE)(((DWORD_PTR)(a)) & 0xff)) | \ + ((WORD)((BYTE)(((DWORD_PTR)(b)) & 0xff))) << 8)) +#define MAKELONG(a, b) \ + ((LONG)(((WORD)(((DWORD_PTR)(a)) & 0xffff)) | \ + ((DWORD)((WORD)(((DWORD_PTR)(b)) & 0xffff))) << 16)) +#define LOWORD(l) ((WORD)(((DWORD_PTR)(l)) & 0xffff)) +#define HIWORD(l) ((WORD)((((DWORD_PTR)(l)) >> 16) & 0xffff)) +#define LOBYTE(w) ((BYTE)(((DWORD_PTR)(w)) & 0xff)) +#define HIBYTE(w) ((BYTE)((((DWORD_PTR)(w)) >> 8) & 0xff)) + +#if !defined(_68K_) \ + && !defined(_MPPC_) \ + && !defined(_X86_) \ + && !defined(_IA64_) \ + && !defined(_AMD64_) \ + && defined(_M_AMD64) +#define _AMD64_ +#endif + +/* + * Windows uses the `interface` define to create interfaces for both C and C++. + * Only the C version is defined here and not the C++ version. + * Both can be found in BaseTyps.h + */ +#define STDMETHODCALLTYPE __stdcall +#define STDMETHODVCALLTYPE __cdecl +#define STDAPICALLTYPE __stdcall +#define STDAPIVCALLTYPE __cdecl + +#define interface struct +#define PURE +#define THIS_ INTERFACE * This, +#define THIS INTERFACE * This +#define STDMETHOD(method) HRESULT (STDMETHODCALLTYPE * method) +#define STDMETHOD_(type, method) type (STDMETHODCALLTYPE * method) +#define STDMETHODV(method) HRESULT (STDMETHODVCALLTYPE * method) +#define STDMETHODV_(type, method) type (STDMETHODVCALLTYPE * method) + +#define IFACEMETHOD(method) __override STDMETHOD(method) +#define IFACEMETHOD_(type, method) __override STDMETHOD_(type,method) +#define IFACEMETHODV(method) __override STDMETHODV(method) +#define IFACEMETHODV_(type, method) __override STDMETHODV_(type,method) + +#define BEGIN_INTERFACE +#define END_INTERFACE + +#ifdef CONST_VTABLE +#undef CONST_VTBL +#define CONST_VTBL const +#define DECLARE_INTERFACE(iface) \ + typedef interface iface { \ + const struct iface##Vtbl * lpVtbl; \ + } iface; \ + typedef const struct iface##Vtbl iface##Vtbl; \ + const struct iface##Vtbl + +#else + +#undef CONST_VTBL +#define CONST_VTBL +#define DECLARE_INTERFACE(iface) \ + typedef interface iface { \ + struct iface##Vtbl * lpVtbl; \ + } iface; \ + typedef struct iface##Vtbl iface##Vtbl; \ + struct iface##Vtbl + +#endif /* CONST_VTABLE */ + +#define DECLARE_INTERFACE_(iface, baseiface) DECLARE_INTERFACE(iface) + + +#define HRESULT_IS_WIN32(x) \ + ((((x) >> 16) & 0xFFFF) == 0x8) +#define HRESULT_IS_FAILURE(x) \ + ((((x) >> 31) & 0x1) == 0x1) +#define HRESULT_FACILITY(x) \ + (((x) >> 16) & 0xFFFF) +#define HRESULT_CODE(x) \ + ((x) & 0xFFFF) +#define HRESULT_FROM_WIN32(x) \ + (0x80070000 | (x)) + + +/* ========================================================================== */ +/* Basic Types: */ +/* https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx */ +/* ========================================================================== */ + +#if defined(_MSC_VER) + /* 1300 == VC 6.0 */ + #if _MSC_VER < 1300 + typedef signed char int8_t; + typedef unsigned char uint8_t; + typedef signed short int16_t; + typedef unsigned short uint16_t; + typedef signed int int32_t; + typedef unsigned int uint32_t; + #else + typedef signed __int8 int8_t; + typedef unsigned __int8 uint8_t; + typedef signed __int16 int16_t; + typedef unsigned __int16 uint16_t; + typedef signed __int32 int32_t; + typedef unsigned __int32 uint32_t; + #endif + typedef signed __int64 int64_t; + typedef unsigned __int64 uint64_t; +#else + #include +#endif + + +typedef int BOOL; +typedef char CHAR; +typedef short SHORT; +typedef int INT; +typedef long LONG; +typedef unsigned char UCHAR; +typedef unsigned short USHORT; +typedef unsigned int UINT; +typedef unsigned long ULONG; +typedef unsigned char BYTE; +typedef unsigned short WORD; +typedef float FLOAT; +typedef unsigned long DWORD; +#ifndef HAVE_WCHAR_T +#define HAVE_WCHAR_T +#if !defined(__cplusplus) +typedef unsigned short wchar_t; +#endif +#endif +typedef wchar_t WCHAR; +typedef wchar_t * PWCHAR; +typedef WORD ATOM; +typedef unsigned int ULONG32; +typedef uint64_t DWORD64; +typedef uint64_t ULONG64; +typedef signed int INT32; +typedef signed __int64 INT64; +typedef uint64_t DWORDLONG; + +typedef CHAR * PCHAR; +typedef ULONG * PULONG; +typedef BYTE * PBYTE; +typedef ULONG64 * PULONG64; +typedef DWORD64 * PDWORD64; + +#if !defined(_M_IX86) +typedef int64_t LONGLONG; +typedef uint64_t ULONGLONG; +#else +typedef double LONGLONG; +typedef double ULONGLONG; +#endif + +typedef void VOID; +typedef void * PVOID; +typedef void * LPVOID; +typedef BOOL * PBOOL; +typedef BOOL * LPBOOL; +typedef WORD * PWORD; +typedef LONG * PLONG; +typedef LONG * LPLONG; +typedef DWORD * PDWORD; + +typedef LPVOID HANDLE; +typedef HANDLE HINSTANCE; +typedef HANDLE HWND; +typedef HINSTANCE HMODULE; +typedef HANDLE HDC; +typedef HANDLE HGLRC; +typedef HANDLE HMENU; +typedef HANDLE * PHANDLE; +typedef HANDLE * LPHANDLE; + +#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name + +typedef WCHAR * PWSTR; +typedef BYTE * LPBYTE; +typedef long * LPLONG; +typedef DWORD * LPDWORD; +typedef const void * LPCVOID; + +#if defined(_WIN64) +typedef int64_t INT_PTR; +typedef int64_t LONG_PTR; +typedef uint64_t UINT_PTR; +typedef uint64_t ULONG_PTR; +#else +typedef int INT_PTR; +typedef long LONG_PTR; +typedef unsigned int UINT_PTR; +typedef unsigned long ULONG_PTR; +#endif +typedef ULONG_PTR DWORD_PTR; +typedef DWORD_PTR * PDWORD_PTR; + +typedef ULONG_PTR SIZE_T; +typedef LONG_PTR SSIZE_T; + +typedef CHAR * LPSTR; +typedef WCHAR * LPWSTR; +typedef const CHAR * LPCSTR; +typedef const WCHAR * LPCWSTR; +#if defined(UNICODE) +typedef WCHAR TCHAR; +typedef WCHAR TBYTE; +typedef LPCWSTR LPCTSTR; +typedef LPWSTR LPTSTR; +#else +typedef char TCHAR; +typedef unsigned char TBYTE; +typedef LPCSTR LPCTSTR; +typedef LPSTR LPTSTR; +#endif + +#define MINCHAR 0x80 +#define MAXCHAR 0x7f +#define MINSHORT 0x8000 +#define MAXSHORT 0x7fff +#define MINLONG 0x80000000 +#define MAXLONG 0x7fffffff +#define MAXBYTE 0xff +#define MAXWORD 0xffff +#define MAXDWORD 0xffffffff + +#if defined(_WIN64) +typedef INT_PTR (WINAPI *FARPROC)(void); +typedef INT_PTR (WINAPI *NEARPROC)(void); +typedef INT_PTR (WINAPI *PROC)(void); +#else +typedef int (WINAPI *FARPROC)(void); +typedef int (WINAPI *NEARPROC)(void); +typedef int (WINAPI *PROC)(void); +#endif + +typedef DWORD ACCESS_MASK; +typedef ACCESS_MASK * PACCESS_MASK; + +typedef HANDLE HICON; +typedef HANDLE HBRUSH; +typedef HICON HCURSOR; + +typedef LONG HRESULT; +typedef LONG_PTR LRESULT; +typedef LONG_PTR LPARAM; +typedef UINT_PTR WPARAM; + +typedef void * HGDIOBJ; + +typedef HANDLE HKEY; +typedef HKEY * PHKEY; +typedef ACCESS_MASK REGSAM; + + +/* ========================================================================== */ +/* Errors: */ +/* ========================================================================== */ +#define ERROR_SUCCESS 0L +#define ERROR_FILE_NOT_FOUND 2L +#define ERROR_PATH_NOT_FOUND 3L +#define ERROR_TOO_MANY_OPEN_FILES 4L +#define ERROR_ACCESS_DENIED 5L +#define ERROR_NO_MORE_FILES 18L +#define ERROR_SHARING_VIOLATION 32L +#define ERROR_FILE_EXISTS 80L +#define ERROR_INSUFFICIENT_BUFFER 122L +#define ERROR_ALREADY_EXISTS 183L +#define ERROR_MORE_DATA 234L + + +/* ========================================================================== */ +/* Enums */ +/* ========================================================================== */ +/* DllMain Reason: */ +#define DLL_PROCESS_ATTACH (1) +#define DLL_PROCESS_DETACH (0) +#define DLL_THREAD_ATTACH (2) +#define DLL_THREAD_DETACH (3) + + +/* ========================================================================== */ +/* Structures: */ +/* ========================================================================== */ +typedef struct _SECURITY_ATTRIBUTES { + DWORD nLength; + LPVOID lpSecurityDescriptor; + BOOL bInheritHandle; +} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES; + +typedef union _LARGE_INTEGER { + struct { + DWORD LowPart; + LONG HighPart; + }; + struct { + DWORD LowPart; + LONG HighPart; + } u; + LONGLONG QuadPart; +} LARGE_INTEGER, *PLARGE_INTEGER; + +typedef union _ULARGE_INTEGER { + struct { + DWORD LowPart; + DWORD HighPart; + }; + struct { + DWORD LowPart; + DWORD HighPart; + } u; + ULONGLONG QuadPart; +} ULARGE_INTEGER, *PULARGE_INTEGER; + +/* Filetime: */ +typedef struct _FILETIME { + DWORD dwLowDateTime; + DWORD dwHighDateTime; +} FILETIME, *PFILETIME, *LPFILETIME; + + +#if defined(__cplusplus) +} +#endif +/* Enable all warnings */ +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + +#endif /* WINDOWS_BASE_H */ +#endif /* _WINDOWS_ */ + diff --git a/exe_load/include/windows_modular.h b/exe_load/include/windows_modular.h new file mode 100644 index 0000000..87aff71 --- /dev/null +++ b/exe_load/include/windows_modular.h @@ -0,0 +1,85 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Arvid Gerstmann. All rights reserved. + */ + +/* + * This are the macros from the original windows.h. + * Defining them will prevent inclusion of this enormous header file. + */ +#ifndef _WINDOWS_ +#define _WINDOWS_ + +#ifndef _INC_WINDOWS +#define _INC_WINDOWS + +#ifndef WINDOWS_H +#define WINDOWS_H + +/* ========================================================================== */ +/* BASE */ +/* ========================================================================== */ +#include "windows_base.h" + + + +/* ========================================================================== */ +/* Atomic */ +/* ========================================================================== */ +#include "atomic.h" + +/* ========================================================================= */ +/* DbgHelp */ +/* ========================================================================= */ +#include "dbghelp.h" + +/* ========================================================================= */ +/* DDS */ +/* ========================================================================= */ +#include "dds.h" + +/* ========================================================================== */ +/* File I/O */ +/* ========================================================================== */ +#include "file.h" + +/* ========================================================================== */ +/* GDI */ +/* ========================================================================== */ +#include "gdi.h" + +/* ========================================================================== */ +/* I/O */ +/* ========================================================================== */ +#include "io.h" + +/* ========================================================================== */ +/* Misc */ +/* ========================================================================== */ +#include "misc.h" + +/* ========================================================================== */ +/* Process */ +/* ========================================================================== */ +#include "process.h" + +/* ========================================================================== */ +/* SysInfo */ +/* ========================================================================== */ +#include "sysinfo.h" + +/* ========================================================================== */ +/* Threads */ +/* ========================================================================== */ +#include "threads.h" + +/* ========================================================================== */ +/* Window */ +/* ========================================================================== */ +#include "window.h" + + +#endif /* WINDOWS_H */ +#endif /* _INC_WINDOWS */ +#endif /* _WINDOWS_ */ + From 22e980ebd406cae4d688dbddc3abf7bb5890d1f5 Mon Sep 17 00:00:00 2001 From: Phinehas Beresford <78656905+Cracko298@users.noreply.github.com> Date: Sun, 15 Oct 2023 20:24:35 -0400 Subject: [PATCH 07/11] Update README.md --- README.md | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/README.md b/README.md index d317c97..8d638be 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,51 @@ #### Why do I need/want this? - **You don't "need" it. However if you want to automatically open an executable when UMU loads. You might want to check this out.** +```cpp +bool TerminateSecondInstance(const wchar_t* processName) { + bool foundFirstInstance = false; + + HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + + if (hSnapshot == INVALID_HANDLE_VALUE) { + return false; + } + + PROCESSENTRY32 pe32; + pe32.dwSize = sizeof(PROCESSENTRY32); + + if (Process32First(hSnapshot, &pe32)) { + do { + // Converts the process name to wide char string + wchar_t wProcessName[MAX_PATH]; + if (MultiByteToWideChar(CP_ACP, 0, pe32.szExeFile, -1, wProcessName, MAX_PATH) > 0) { + if (wcscmp(wProcessName, processName) == 0) { + if (foundFirstInstance) { + // Terminate the second instance + HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pe32.th32ProcessID); + if (hProcess != nullptr) { + TerminateProcess(hProcess, 0); + CloseHandle(hProcess); + CloseHandle(hSnapshot); + return true; // Terminated the second instance (successful termanation) + } + } + foundFirstInstance = true; + } + } + } while (Process32Next(hSnapshot, &pe32)); + } + + CloseHandle(hSnapshot); + return false; // Second instance not found or couldn't be terminated +} + +const wchar_t* processName = L"PluginLoader.exe"; +TerminateSecondInstance(processName); + +``` + + ## General Information: UnrealModUnlocker Public and UnrealModUnlocker Basic are NOT from the same codebase. From 5a5d9bc70a2760ef153f435a6d92cf8923f71b43 Mon Sep 17 00:00:00 2001 From: Phinehas Beresford <78656905+Cracko298@users.noreply.github.com> Date: Sun, 15 Oct 2023 20:41:12 -0400 Subject: [PATCH 08/11] Delete exe_load directory --- exe_load/exe_loader(not_finished).cpp | 71 - exe_load/include/atomic.h | 277 -- exe_load/include/dbghelp.h | 922 ----- exe_load/include/dds.h | 211 -- exe_load/include/fiber.h | 103 - exe_load/include/file.h | 505 --- exe_load/include/gdi.h | 62 - exe_load/include/intrin.h | 42 - exe_load/include/io.h | 366 -- exe_load/include/make.bat | 51 - exe_load/include/misc.h | 390 -- exe_load/include/process.h | 290 -- exe_load/include/sysinfo.h | 596 ---- exe_load/include/threads.h | 356 -- exe_load/include/window.h | 386 -- exe_load/include/windows.h | 4695 ------------------------- exe_load/include/windows_base.h | 393 --- exe_load/include/windows_modular.h | 85 - exe_load/isz_plg.config | 2 - 19 files changed, 9803 deletions(-) delete mode 100644 exe_load/exe_loader(not_finished).cpp delete mode 100644 exe_load/include/atomic.h delete mode 100644 exe_load/include/dbghelp.h delete mode 100644 exe_load/include/dds.h delete mode 100644 exe_load/include/fiber.h delete mode 100644 exe_load/include/file.h delete mode 100644 exe_load/include/gdi.h delete mode 100644 exe_load/include/intrin.h delete mode 100644 exe_load/include/io.h delete mode 100644 exe_load/include/make.bat delete mode 100644 exe_load/include/misc.h delete mode 100644 exe_load/include/process.h delete mode 100644 exe_load/include/sysinfo.h delete mode 100644 exe_load/include/threads.h delete mode 100644 exe_load/include/window.h delete mode 100644 exe_load/include/windows.h delete mode 100644 exe_load/include/windows_base.h delete mode 100644 exe_load/include/windows_modular.h delete mode 100644 exe_load/isz_plg.config diff --git a/exe_load/exe_loader(not_finished).cpp b/exe_load/exe_loader(not_finished).cpp deleted file mode 100644 index 1b6bf1f..0000000 --- a/exe_load/exe_loader(not_finished).cpp +++ /dev/null @@ -1,71 +0,0 @@ -#include - -extern "C" -{ -int printf(const char *format, ...); -} - -void LoadISZPlugin() { - printf("Plugin Has Been Loaded.\n"); - char currentDirectory[MAX_PATH]; - GetCurrentDirectory(MAX_PATH, currentDirectory); // Current Path - - std::string configFile = currentDirectory; - configFile += "\\isz_plg.config"; // Set 'isz_plg.config' as config file (required) - - // Open the config file - HANDLE hFile = CreateFile(configFile.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - - if (hFile == INVALID_HANDLE_VALUE) { // If file doesn't exist - return; - } - - char buffer[1024]; - DWORD bytesRead; - int lineCount = 0; - - while (lineCount < 2) { - if (!ReadFile(hFile, buffer, sizeof(buffer), &bytesRead, NULL)) { - CloseHandle(hFile); - return; - } - - if (bytesRead == 0) { // Error Handle (eof) - CloseHandle(hFile); - return; - } - - for (DWORD i = 0; i < bytesRead; i++) { - if (buffer[i] == '\n') { - lineCount++; - if (lineCount == 2) { - buffer[i] = '\0'; - break; - } - } - } - } - - CloseHandle(hFile); - - char* secondLine = strchr(buffer, '\0') + 1; // Path to EXE (To Execute) - - while (1==1){ - printf("Example Code. Will put more here."); - printf(secondLine); - Sleep(100); - } -} - -BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { - switch (ul_reason_for_call) { - case DLL_PROCESS_ATTACH: - LoadISZPlugin(); - break; - case DLL_PROCESS_DETACH: - break; - default: - break; - } - return TRUE; -} diff --git a/exe_load/include/atomic.h b/exe_load/include/atomic.h deleted file mode 100644 index b86d76f..0000000 --- a/exe_load/include/atomic.h +++ /dev/null @@ -1,277 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Arvid Gerstmann. All rights reserved. - */ -#ifndef _WINDOWS_ -#ifndef WINDOWS_ATOMIC_H -#define WINDOWS_ATOMIC_H - -/* Disable all warnings */ -#if defined(_MSC_VER) - #pragma warning(push, 0) -#endif - -#include "intrin.h" - -#if defined(__cplusplus) -extern "C" { -#endif - - -/* ========================================================================== */ -/* Atomic Functions: */ -/* ========================================================================== */ - -/* ========================================================================== */ -/* 8-Bit Atomic Intrinsics: */ -/* Exchange */ -char _InterlockedExchange8( - char volatile *Target, - char Value); -char _InterlockedExchangeAdd8( - char volatile *Addend, - char Value); - -/* Bit Operations */ -char _InterlockedExchangeAnd8( - char volatile *Destination, - char Value); -char _InterlockedExchangeOr8( - char volatile *Destination, - char Value); -char _InterlockedExchangeXor8( - char volatile *Destination, - char Value); - -/* Increment & Decrement */ -char _InterlockedDecrement8( - char volatile *Addend); -char _InterlockedIncrement8( - char volatile *Addend); - -/* Compare & Exchang */ -char _InterlockedCompareExchange8( - char volatile *Destination, - char Exchange, - char Comparand); -char _InterlockedCompareExchange8_HLEAcquire( - char volatile *Destination, - char Exchange, - char Comparand); -char _InterlockedCompareExchange8_HLERelease( - char volatile *Destination, - char Exchange, - char Comparand); - - -/* ========================================================================== */ -/* 16-Bit Atomic Intrinsics: */ -/* Exchange */ -short _InterlockedExchange16( - short volatile *Target, - short Value); -short _InterlockedExchangeAdd16( - short volatile *Addend, - short Value); - -/* Bit Operations */ -short _InterlockedExchangeAnd16( - short volatile *Destination, - short Value); -short _InterlockedExchangeOr16( - short volatile *Destination, - short Value); -short _InterlockedExchangeXor16( - short volatile *Destination, - short Value); - -/* Increment & Decrement */ -short _InterlockedDecrement16( - short volatile *Addend); -short _InterlockedIncrement16( - short volatile *Addend); - -/* Compare & Exchang */ -short _InterlockedCompareExchange16( - short volatile *Destination, - short Exchange, - short Comparand); -short _InterlockedCompareExchange16_HLEAcquire( - short volatile *Destination, - short Exchange, - short Comparand); -short _InterlockedCompareExchange16_HLERelease( - short volatile *Destination, - short Exchange, - short Comparand); - - -/* ========================================================================== */ -/* 32-Bit Atomic Intrinsics: */ -/* Exchange */ -long _InterlockedExchange( - long volatile *Target, - long Value); -long _InterlockedExchangeAdd( - long volatile *Addend, - long Value); - -/* Bit Operations */ -long _InterlockedExchangeAnd( - long volatile *Destination, - long Value); -long _InterlockedExchangeOr( - long volatile *Destination, - long Value); -long _InterlockedExchangeXor( - long volatile *Destination, - long Value); - -/* Increment & Decrement */ -long _InterlockedDecrement( - long volatile *Addend); -long _InterlockedIncrement( - long volatile *Addend); - -/* Compare & Exchang */ -long _InterlockedCompareExchange( - long volatile *Destination, - long Exchange, - long Comparand); -long _InterlockedCompareExchange_HLEAcquire( - long volatile *Destination, - long Exchange, - long Comparand); -long _InterlockedCompareExchange_HLERelease( - long volatile *Destination, - long Exchange, - long Comparand); - -/* ========================================================================== */ -/* 64-Bit Atomic Intrinsics: */ -#ifdef _AMD64_ -/* Exchange */ -__int64 _InterlockedExchange64( - __int64 volatile *Target, - __int64 Value); -__int64 _InterlockedExchangeAdd64( - __int64 volatile *Addend, - __int64 Value); - -/* Bit Operations */ -__int64 _InterlockedExchangeAnd64( - __int64 volatile *Destination, - __int64 Value); -__int64 _InterlockedExchangeOr64( - __int64 volatile *Destination, - __int64 Value); -__int64 _InterlockedExchangeXor64( - __int64 volatile *Destination, - __int64 Value); - -/* Increment & Decrement */ -__int64 _InterlockedDecrement64( - __int64 volatile *Addend); -__int64 _InterlockedIncrement64( - __int64 volatile *Addend); - -/* Compare & Exchang */ -__int64 _InterlockedCompareExchange64( - __int64 volatile *Destination, - __int64 Exchange, - __int64 Comparand); -__int64 _InterlockedCompareExchange64_HLEAcquire( - __int64 volatile *Destination, - __int64 Exchange, - __int64 Comparand); -__int64 _InterlockedCompareExchange64_HLERelease( - __int64 volatile *Destination, - __int64 Exchange, - __int64 Comparand); - -/* ========================================================================== */ -/* 128-Bit Atomic Intrinsics: */ -/* Exchange */ -unsigned char _InterlockedCompareExchange128( - __int64 volatile *Destination, - __int64 ExchangeHigh, - __int64 ExchangeLow, - __int64 *ComparandResult); - -#endif - -/* Win32 InterlockedXX functions are defined as macros */ -#define InterlockedExchange8 _InterlockedExchange8 -#define InterlockedExchangeAdd8 _InterlockedExchangeAdd8 -#define InterlockedExchangeAnd8 _InterlockedExchangeAnd8 -#define InterlockedExchangeOr8 _InterlockedExchangeOr8 -#define InterlockedExchangeXor8 _InterlockedExchangeXor8 -#define InterlockedDecrement8 _InterlockedDecrement8 -#define InterlockedIncrement8 _InterlockedIncrement8 -#define InterlockedCompareExchange8 _InterlockedCompareExchange8 - -#define InterlockedExchange16 _InterlockedExchange16 -#define InterlockedExchangeAdd16 _InterlockedExchangeAdd16 -#define InterlockedExchangeAnd16 _InterlockedExchangeAnd16 -#define InterlockedExchangeOr16 _InterlockedExchangeOr16 -#define InterlockedExchangeXor16 _InterlockedExchangeXor16 -#define InterlockedDecrement16 _InterlockedDecrement16 -#define InterlockedIncrement16 _InterlockedIncrement16 -#define InterlockedCompareExchange16 _InterlockedCompareExchange16 - -#define InterlockedExchange _InterlockedExchange -#define InterlockedExchangeAdd _InterlockedExchangeAdd -#define InterlockedExchangeAnd _InterlockedExchangeAnd -#define InterlockedExchangeOr _InterlockedExchangeOr -#define InterlockedExchangeXor _InterlockedExchangeXor -#define InterlockedDecrement _InterlockedDecrement -#define InterlockedIncrement _InterlockedIncrement -#define InterlockedCompareExchange _InterlockedCompareExchange - -#ifdef _AMD64_ - #define InterlockedExchange64 _InterlockedExchange64 - #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64 - #define InterlockedExchangeAnd64 _InterlockedExchangeAnd64 - #define InterlockedExchangeOr64 _InterlockedExchangeOr64 - #define InterlockedExchangeXor64 _InterlockedExchangeXor64 - #define InterlockedDecrement64 _InterlockedDecrement64 - #define InterlockedIncrement64 _InterlockedIncrement64 - #define InterlockedCompareExchange64 _InterlockedCompareExchange64 - - #define InterlockedCompareExchange128 _InterlockedCompareExchange128 -#endif - - -/* ========================================================================== */ -/* Barriers: */ -void _ReadWriteBarrier(void); -#pragma intrinsic(_ReadWriteBarrier) - -#ifdef _AMD64_ - #define MemoryBarrier __faststorefence - #define YieldProcessor _mm_pause - -#elif defined(_M_IX86) - FORCEINLINE void - MemoryBarrier(void) - { - LONG Barrier; - __asm { - xchg Barrier, eax - } - } - #define YieldProcessor __asm { rep nop } -#endif - -#if defined(__cplusplus) -} -#endif - -/* Enable all warnings */ -#if defined(_MSC_VER) - #pragma warning(pop) -#endif - -#endif /* WINDOWS_ATOMIC_H */ -#endif /* _WINDOWS_ */ - diff --git a/exe_load/include/dbghelp.h b/exe_load/include/dbghelp.h deleted file mode 100644 index ef9e2fd..0000000 --- a/exe_load/include/dbghelp.h +++ /dev/null @@ -1,922 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Arvid Gerstmann. All rights reserved. - */ -#ifndef _WINDOWS_ -#ifndef WINDOWS_DBGHELP_H -#define WINDOWS_DBGHELP_H - -/* Disable all warnings */ -#if defined(_MSC_VER) - #pragma warning(push, 0) -#endif - -#ifndef WINDOWS_BASE_H -#include "windows_base.h" -#endif -#if defined(__cplusplus) -extern "C" { -#endif - -/* Exceptions: */ -#define EXCEPTION_MAXIMUM_PARAMETERS 15 -#define EXCEPTION_EXECUTE_HANDLER 0x1 -#define EXCEPTION_CONTINUE_EXECUTION 0xFFFFFFFF -#define EXCEPTION_CONTINUE_SEARCH 0x0 - -#define EXCEPTION_ACCESS_VIOLATION ((DWORD)0xC0000005L) -#define EXCEPTION_DATATYPE_MISALIGNMENT ((DWORD)0x80000002L) -#define EXCEPTION_BREAKPOINT ((DWORD)0x80000003L) -#define EXCEPTION_SINGLE_STEP ((DWORD)0x80000004L) -#define EXCEPTION_ARRAY_BOUNDS_EXCEEDED ((DWORD)0xC000008CL) -#define EXCEPTION_FLT_DENORMAL_OPERAND ((DWORD)0xC000008DL) -#define EXCEPTION_FLT_DIVIDE_BY_ZERO ((DWORD)0xC000008EL) -#define EXCEPTION_FLT_INEXACT_RESULT ((DWORD)0xC000008FL) -#define EXCEPTION_FLT_INVALID_OPERATION ((DWORD)0xC0000090L) -#define EXCEPTION_FLT_OVERFLOW ((DWORD)0xC0000091L) -#define EXCEPTION_FLT_STACK_CHECK ((DWORD)0xC0000092L) -#define EXCEPTION_FLT_UNDERFLOW ((DWORD)0xC0000093L) -#define EXCEPTION_INT_DIVIDE_BY_ZERO ((DWORD)0xC0000094L) -#define EXCEPTION_INT_OVERFLOW ((DWORD)0xC0000095L) -#define EXCEPTION_PRIV_INSTRUCTION ((DWORD)0xC0000096L) -#define EXCEPTION_IN_PAGE_ERROR ((DWORD)0xC0000006L) -#define EXCEPTION_STACK_OVERFLOW ((DWORD)0xC00000FDL) -#define EXCEPTION_ILLEGAL_INSTRUCTION ((DWORD)0xC000001DL) -#define EXCEPTION_NONCONTINUABLE_EXCEPTION ((DWORD)0xC0000025L) -#define EXCEPTION_INVALID_DISPOSITION ((DWORD)0xC0000026L) -#define EXCEPTION_GUARD_PAGE ((DWORD)0x80000001L) -#define EXCEPTION_INVALID_HANDLE ((DWORD)0xC0000008L) -#define EXCEPTION_POSSIBLE_DEADLOCK ((DWORD)0xC0000194L) -#define CONTROL_C_EXIT ((DWORD)0xC000013AL) - -/* User defined. */ -#ifndef EXCEPTION_ASSERTION -#define EXCEPTION_ASSERTION ((DWORD)0xEF000001L) -#endif - -/* Snapshotting: */ -#define TH32CS_SNAPTHREAD 0x00000004 -#define IMAGE_FILE_MACHINE_I386 0x014c -#define IMAGE_FILE_MACHINE_AMD64 0x8664 -#define CONTEXT_AMD64 0x100000 -#define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L) -#define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L) -#define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L) -#define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L) -#define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L) - - -#define CONTEXT_FULL \ - (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT) - -#define CONTEXT_ALL \ - (CONTEXT_CONTROL |\ - CONTEXT_INTEGER |\ - CONTEXT_SEGMENTS |\ - CONTEXT_FLOATING_POINT |\ - CONTEXT_DEBUG_REGISTERS) - -/* Symbol Options: */ -#define SYMOPT_CASE_INSENSITIVE 0x00000001 -#define SYMOPT_UNDNAME 0x00000002 -#define SYMOPT_DEFERRED_LOADS 0x00000004 -#define SYMOPT_NO_CPP 0x00000008 -#define SYMOPT_LOAD_LINES 0x00000010 -#define SYMOPT_OMAP_FIND_NEAREST 0x00000020 -#define SYMOPT_LOAD_ANYTHING 0x00000040 -#define SYMOPT_IGNORE_CVREC 0x00000080 -#define SYMOPT_NO_UNQUALIFIED_LOADS 0x00000100 -#define SYMOPT_FAIL_CRITICAL_ERRORS 0x00000200 -#define SYMOPT_EXACT_SYMBOLS 0x00000400 -#define SYMOPT_ALLOW_ABSOLUTE_SYMBOLS 0x00000800 -#define SYMOPT_IGNORE_NT_SYMPATH 0x00001000 -#define SYMOPT_INCLUDE_32BIT_MODULES 0x00002000 -#define SYMOPT_PUBLICS_ONLY 0x00004000 -#define SYMOPT_NO_PUBLICS 0x00008000 -#define SYMOPT_AUTO_PUBLICS 0x00010000 -#define SYMOPT_NO_IMAGE_SEARCH 0x00020000 -#define SYMOPT_SECURE 0x00040000 -#define SYMOPT_NO_PROMPTS 0x00080000 -#define SYMOPT_OVERWRITE 0x00100000 -#define SYMOPT_IGNORE_IMAGEDIR 0x00200000 -#define SYMOPT_FLAT_DIRECTORY 0x00400000 -#define SYMOPT_FAVOR_COMPRESSED 0x00800000 -#define SYMOPT_ALLOW_ZERO_ADDRESS 0x01000000 -#define SYMOPT_DISABLE_SYMSRV_AUTODETECT 0x02000000 - -#define SYMOPT_DEBUG 0x80000000 - -enum SymTagEnum { - SymTagNull, - SymTagExe, - SymTagCompiland, - SymTagCompilandDetails, - SymTagCompilandEnv, - SymTagFunction, - SymTagBlock, - SymTagData, - SymTagAnnotation, - SymTagLabel, - SymTagPublicSymbol, - SymTagUDT, - SymTagEnum, - SymTagFunctionType, - SymTagPointerType, - SymTagArrayType, - SymTagBaseType, - SymTagTypedef, - SymTagBaseClass, - SymTagFriend, - SymTagFunctionArgType, - SymTagFuncDebugStart, - SymTagFuncDebugEnd, - SymTagUsingNamespace, - SymTagVTableShape, - SymTagVTable, - SymTagCustom, - SymTagThunk, - SymTagCustomType, - SymTagManagedType, - SymTagDimension, - SymTagCallSite, - SymTagInlineSite, - SymTagBaseInterface, - SymTagVectorType, - SymTagMatrixType, - SymTagHLSLType -}; - -/* Thread-Information Block: */ -typedef struct _NT_TIB { /* x86 / x64 */ - void * ExceptionList; /* 0x0000 / 0x0000 */ - void * StackBase; /* 0x0004 / 0x0008 */ - void * StackLimit; /* 0x0008 / 0x0010 */ - void * SubSystemTib; /* 0x000c / 0x0018 */ - union { - void * FiberData; /* 0x0010 / 0x0020 */ - DWORD Version; /* 0x0010 / 0x0020 */ - }; - void * ArbitraryUserPointer; /* 0x0014 / 0x0028 */ - struct _NT_TIB *Self; /* 0x0018 / 0x0030 */ -} NT_TIB, *LPNT_TIB, *PNT_TIB; - -/* Exceptions: */ -#if defined(_WIN64) -typedef struct DECLSPEC_ALIGN(16) _M128A { - ULONGLONG Low; - LONGLONG High; -} M128A, *PM128A; -typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT { - WORD ControlWord; - WORD StatusWord; - BYTE TagWord; - BYTE Reserved1; - WORD ErrorOpcode; - DWORD ErrorOffset; - WORD ErrorSelector; - WORD Reserved2; - DWORD DataOffset; - WORD DataSelector; - WORD Reserved3; - DWORD MxCsr; - DWORD MxCsr_Mask; - M128A FloatRegisters[8]; - -#if defined(_WIN64) - M128A XmmRegisters[16]; - BYTE Reserved4[96]; -#else - M128A XmmRegisters[8]; - BYTE Reserved4[192]; - - DWORD StackControl[7]; - DWORD Cr0NpxState; -#endif -} XSAVE_FORMAT, *PXSAVE_FORMAT; -typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32; - -typedef struct DECLSPEC_ALIGN(16) _CONTEXT { - DWORD64 P1Home; - DWORD64 P2Home; - DWORD64 P3Home; - DWORD64 P4Home; - DWORD64 P5Home; - DWORD64 P6Home; - - DWORD ContextFlags; - DWORD MxCsr; - - WORD SegCs; - WORD SegDs; - WORD SegEs; - WORD SegFs; - WORD SegGs; - WORD SegSs; - DWORD EFlags; - - DWORD64 Dr0; - DWORD64 Dr1; - DWORD64 Dr2; - DWORD64 Dr3; - DWORD64 Dr6; - DWORD64 Dr7; - - DWORD64 Rax; - DWORD64 Rcx; - DWORD64 Rdx; - DWORD64 Rbx; - DWORD64 Rsp; - DWORD64 Rbp; - DWORD64 Rsi; - DWORD64 Rdi; - DWORD64 R8; - DWORD64 R9; - DWORD64 R10; - DWORD64 R11; - DWORD64 R12; - DWORD64 R13; - DWORD64 R14; - DWORD64 R15; - DWORD64 Rip; - - union { - XMM_SAVE_AREA32 FltSave; - struct { - M128A Header[2]; - M128A Legacy[8]; - M128A Xmm0; - M128A Xmm1; - M128A Xmm2; - M128A Xmm3; - M128A Xmm4; - M128A Xmm5; - M128A Xmm6; - M128A Xmm7; - M128A Xmm8; - M128A Xmm9; - M128A Xmm10; - M128A Xmm11; - M128A Xmm12; - M128A Xmm13; - M128A Xmm14; - M128A Xmm15; - } DUMMYSTRUCTNAME; - } DUMMYUNIONNAME; - - M128A VectorRegister[26]; - DWORD64 VectorControl; - - DWORD64 DebugControl; - DWORD64 LastBranchToRip; - DWORD64 LastBranchFromRip; - DWORD64 LastExceptionToRip; - DWORD64 LastExceptionFromRip; -} CONTEXT, *PCONTEXT; -typedef PCONTEXT LPCONTEXT; -#elif _WIN32 -typedef struct _FLOATING_SAVE_AREA -{ - ULONG ControlWord; - ULONG StatusWord; - ULONG TagWord; - ULONG ErrorOffset; - ULONG ErrorSelector; - ULONG DataOffset; - ULONG DataSelector; - UCHAR RegisterArea[80]; - ULONG Cr0NpxState; -} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA; -#define MAXIMUM_SUPPORTED_EXTENSION 512 -typedef struct _CONTEXT { - DWORD ContextFlags; - DWORD Dr0; - DWORD Dr1; - DWORD Dr2; - DWORD Dr3; - DWORD Dr6; - DWORD Dr7; - - FLOATING_SAVE_AREA FloatSave; - - DWORD SegGs; - DWORD SegFs; - DWORD SegEs; - DWORD SegDs; - - DWORD Edi; - DWORD Esi; - DWORD Ebx; - DWORD Edx; - DWORD Ecx; - DWORD Eax; - - DWORD Ebp; - DWORD Eip; - DWORD SegCs; - DWORD EFlags; - DWORD Esp; - DWORD SegSs; - - BYTE ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION]; - -} CONTEXT, *PCONTEXT; -typedef PCONTEXT LPCONTEXT; -#endif -typedef struct _EXCEPTION_RECORD { - DWORD ExceptionCode; - DWORD ExceptionFlags; - struct _EXCEPTION_RECORD * ExceptionRecord; - PVOID ExceptionAddress; - DWORD NumberParameters; - ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; -} EXCEPTION_RECORD, *PEXCEPTION_RECORD; -typedef struct _EXCEPTION_POINTERS { - PEXCEPTION_RECORD ExceptionRecord; - PCONTEXT ContextRecord; -} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS; -typedef PEXCEPTION_POINTERS LPEXCEPTION_POINTERS; -typedef LONG (WINAPI *PTOP_LEVEL_EXCEPTION_FILTER)( - struct _EXCEPTION_POINTERS *ExceptionInfo); -typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER; -typedef LONG (WINAPI *PVECTORED_EXCEPTION_HANDLER)( - struct _EXCEPTION_POINTERS *ExceptionInfo); - -/* Symbols: */ -typedef struct _SYMBOL_INFO { - ULONG SizeOfStruct; - ULONG TypeIndex; - ULONG64 Reserved[2]; - ULONG Index; - ULONG Size; - ULONG64 ModBase; - ULONG Flags; - ULONG64 Value; - ULONG64 Address; - ULONG Register; - ULONG Scope; - ULONG Tag; - ULONG NameLen; - ULONG MaxNameLen; - CHAR Name[1]; -} SYMBOL_INFO, *PSYMBOL_INFO; - -typedef struct _SYMBOL_INFOW { - ULONG SizeOfStruct; - ULONG TypeIndex; - ULONG64 Reserved[2]; - ULONG Index; - ULONG Size; - ULONG64 ModBase; - ULONG Flags; - ULONG64 Value; - ULONG64 Address; - ULONG Register; - ULONG Scope; - ULONG Tag; - ULONG NameLen; - ULONG MaxNameLen; - WCHAR Name[1]; -} SYMBOL_INFOW, *PSYMBOL_INFOW; - -typedef struct _IMAGEHLP_LINE64 { - DWORD SizeOfStruct; - PVOID Key; - DWORD LineNumber; - PCHAR FileName; - DWORD64 Address; -} IMAGEHLP_LINE64, *PIMAGEHLP_LINE64; - -typedef struct _IMAGEHLP_LINEW64 { - DWORD SizeOfStruct; - PVOID Key; - DWORD LineNumber; - PWSTR FileName; - DWORD64 Address; -} IMAGEHLP_LINEW64, *PIMAGEHLP_LINEW64; - -/* Thread Walking: */ -typedef struct tagTHREADENTRY32 { - DWORD dwSize; - DWORD cntUsage; - DWORD th32ThreadID; - DWORD th32OwnerProcessID; - LONG tpBasePri; - LONG tpDeltaPri; - DWORD dwFlags; -} THREADENTRY32, *PTHREADENTRY32; -typedef PTHREADENTRY32 LPTHREADENTRY32; - -/* Stack Walking: */ -typedef enum { - AddrMode1616, - AddrMode1632, - AddrModeReal, - AddrModeFlat -} ADDRESS_MODE; -typedef struct _tagADDRESS64 { - DWORD64 Offset; - WORD Segment; - ADDRESS_MODE Mode; -} ADDRESS64, *LPADDRESS64; -typedef struct _KDHELP64 { - DWORD64 Thread; - DWORD ThCallbackStack; - DWORD ThCallbackBStore; - DWORD NextCallback; - DWORD FramePointer; - DWORD64 KiCallUserMode; - DWORD64 KeUserCallbackDispatcher; - DWORD64 SystemRangeStart; - DWORD64 KiUserExceptionDispatcher; - DWORD64 StackBase; - DWORD64 StackLimit; - DWORD64 Reserved[5]; -} KDHELP64, *PKDHELP64; -typedef struct _tagSTACKFRAME64 { - ADDRESS64 AddrPC; - ADDRESS64 AddrReturn; - ADDRESS64 AddrFrame; - ADDRESS64 AddrStack; - ADDRESS64 AddrBStore; - PVOID FuncTableEntry; - DWORD64 Params[4]; - BOOL Far; - BOOL Virtual; - DWORD64 Reserved[3]; - KDHELP64 KdHelp; -} STACKFRAME64, *LPSTACKFRAME64; - -/* Some weird stuff: */ -typedef struct _LUID { - DWORD LowPart; - LONG HighPart; -} LUID, *PLUID; -#pragma pack(push,4) -typedef struct _LUID_AND_ATTRIBUTES { - LUID Luid; - DWORD Attributes; -} LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES; -#pragma pack(pop) -typedef struct _TOKEN_PRIVILEGES { - DWORD PrivilegeCount; - LUID_AND_ATTRIBUTES Privileges[1]; -} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES; - - -/* ========================================================================== */ -/* Debugging: */ -void WINAPI DebugBreak(void); -BOOL WINAPI IsDebuggerPresent(void); -BOOL WINAPI CheckRemoteDebuggerPresent( - HANDLE hProcess, - PBOOL hbDebuggerPresent); -void WINAPI OutputDebugStringA( - LPCSTR lpOutputString); -void WINAPI OutputDebugStringW( - LPCWSTR lpOutputString); -BOOL WINAPI GetThreadContext( - HANDLE hThread, - LPCONTEXT lpContext); -BOOL WINAPI DebugActiveProcess( - DWORD dwProcessId); -BOOL WINAPI DebugActiveProcessStop( - DWORD dwProcessId); - -/* ========================================================================== */ -/* Symbols: */ -DWORD WINAPI SymSetOptions( - DWORD SymOptions); -BOOL WINAPI SymInitialize( - HANDLE hProcess, - LPCSTR UserSearchPath, - BOOL fInvadeProcess); -BOOL WINAPI SymInitializeW( - HANDLE hProcess, - LPCWSTR UserSearchPath, - BOOL fInvadeProcess); -BOOL WINAPI SymFromAddr( - HANDLE hProcess, - DWORD64 Address, - PDWORD64 Displacement, - PSYMBOL_INFO Symbol); -BOOL WINAPI SymFromAddrW( - HANDLE hProcess, - DWORD64 Address, - PDWORD64 Displacement, - PSYMBOL_INFOW Symbol); -PVOID WINAPI SymFunctionTableAccess64( - HANDLE hProcess, - DWORD64 AddrBase); -DWORD64 WINAPI SymGetModuleBase64( - HANDLE hProcess, - DWORD64 dwAddr); -typedef BOOL (*PSYM_ENUMERATESYMBOLS_CALLBACK)( - PSYMBOL_INFO pSymInfo, - ULONG SymbolSize, - PVOID UserContext -); -typedef BOOL (*PSYM_ENUMERATESYMBOLS_CALLBACKW)( - PSYMBOL_INFOW pSymInfo, - ULONG SymbolSize, - PVOID UserContext -); -BOOL WINAPI SymSearch( - HANDLE hProcess, - ULONG64 BaseOfDll, - DWORD Index, - DWORD SymTag, - LPCSTR Mask, - DWORD64 Address, - PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback, - PVOID UserContext, - DWORD Options); -BOOL WINAPI SymSearchW( - HANDLE hProcess, - ULONG64 BaseOfDll, - DWORD Index, - DWORD SymTag, - LPCWSTR Mask, - DWORD64 Address, - PSYM_ENUMERATESYMBOLS_CALLBACKW EnumSymbolsCallback, - PVOID UserContext, - DWORD Options); -BOOL WINAPI SymRefreshModuleList( - HANDLE hProcess); - -typedef BOOL (*PSYM_ENUMMODULES_CALLBACK64)( - LPCSTR ModuleName, - DWORD64 BaseOfDll, - PVOID UserContext -); -typedef BOOL (*PSYM_ENUMMODULES_CALLBACKW64)( - LPCWSTR ModuleName, - DWORD64 BaseOfDll, - PVOID UserContext -); -BOOL WINAPI SymEnumerateModules64( - HANDLE hProcess, - PSYM_ENUMMODULES_CALLBACK64 EnumModulesCallback, - PVOID UserContext -); -BOOL WINAPI SymEnumerateModulesW64( - HANDLE hProcess, - PSYM_ENUMMODULES_CALLBACKW64 EnumModulesCallback, - PVOID UserContext -); - -BOOL WINAPI SymSetSearchPath( - HANDLE hProcess, - LPCSTR SearchPath); -BOOL WINAPI SymSetSearchPathW( - HANDLE hProcess, - LPCWSTR SearchPath); - -BOOL WINAPI SymGetSearchPath( - HANDLE hProcess, - LPSTR SearchPath, - DWORD SearchPathLength); -BOOL WINAPI SymGetSearchPathW( - HANDLE hProcess, - LPWSTR SearchPath, - DWORD SearchPathLength); - -BOOL WINAPI SymCleanup( - HANDLE hProcess); - -BOOL WINAPI SymGetLineFromAddr64( - HANDLE hProcess, - DWORD64 dwAddr, - PDWORD pdwDisplacement, - PIMAGEHLP_LINE64 Line -); - -BOOL WINAPI SymGetLineFromAddrW64( - HANDLE hProcess, - DWORD64 dwAddr, - PDWORD pdwDisplacement, - PIMAGEHLP_LINEW64 Line -); - -/* ========================================================================== */ -/* Exceptions: */ -LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter( - LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter); -LONG WINAPI UnhandledExceptionFilter( - struct _EXCEPTION_POINTERS * ExceptionInfo); - -PVOID WINAPI AddVectoredExceptionHandler( - ULONG FirstHandler, - PVECTORED_EXCEPTION_HANDLER VectoredHandler); - -ULONG WINAPI RemoveVectoredExceptionHandler( - PVOID Handler); - -#define CaptureStackBackTrace RtlCaptureStackBackTrace -USHORT WINAPI RtlCaptureStackBackTrace( - ULONG FramesToSkip, - ULONG FramesToCapture, - PVOID * BackTrace, - PULONG BackTraceHash); -void WINAPI RtlCaptureContext( - PCONTEXT ContextRecord); -void WINAPI RaiseException( - DWORD dwExceptionCode, - DWORD dwExceptionFlags, - DWORD nNumberOfArguments, - const ULONG_PTR * lpArguments); - -/* ========================================================================== */ -/* Thread Walking: */ -HANDLE WINAPI CreateToolhelp32Snapshot( - DWORD dwFlags, - DWORD th32ProcessID); -BOOL WINAPI Thread32First( - HANDLE hSnapshot, - LPTHREADENTRY32 lpte); -BOOL WINAPI Thread32Next( - HANDLE hSnapshot, - LPTHREADENTRY32 lpte); - -/* ========================================================================== */ -/* Stack Walking: */ -typedef BOOL (__stdcall *PREAD_PROCESS_MEMORY_ROUTINE64)( - HANDLE hProcess, - DWORD64 qwBaseAddress, - PVOID lpBuffer, - DWORD nSize, - LPDWORD lpNumberOfBytesRead); - -typedef PVOID (__stdcall *PFUNCTION_TABLE_ACCESS_ROUTINE64)( - HANDLE ahProcess, - DWORD64 AddrBase); - -typedef DWORD64 (__stdcall *PGET_MODULE_BASE_ROUTINE64)( - HANDLE hProcess, - DWORD64 Address); - -typedef DWORD64 (__stdcall *PTRANSLATE_ADDRESS_ROUTINE64)( - HANDLE hProcess, - HANDLE hThread, - LPADDRESS64 lpaddr); - -BOOL WINAPI StackWalk64( - DWORD MachineType, - HANDLE hProcess, - HANDLE hThread, - LPSTACKFRAME64 StackFrame, - PVOID ContextRecord, - PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, - PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, - PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine, - PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress -); - -/* ========================================================================== */ -/* Minidumps: */ -/* == VS Version == */ -typedef struct tagVS_FIXEDFILEINFO -{ - DWORD dwSignature; /* e.g. 0xfeef04bd */ - DWORD dwStrucVersion; /* e.g. 0x00000042 = "0.42" */ - DWORD dwFileVersionMS; /* e.g. 0x00030075 = "3.75" */ - DWORD dwFileVersionLS; /* e.g. 0x00000031 = "0.31" */ - DWORD dwProductVersionMS; /* e.g. 0x00030010 = "3.10" */ - DWORD dwProductVersionLS; /* e.g. 0x00000031 = "0.31" */ - DWORD dwFileFlagsMask; /* = 0x3F for version "0.42" */ - DWORD dwFileFlags; /* e.g. VFF_DEBUG | VFF_PRERELEASE */ - DWORD dwFileOS; /* e.g. VOS_DOS_WINDOWS16 */ - DWORD dwFileType; /* e.g. VFT_DRIVER */ - DWORD dwFileSubtype; /* e.g. VFT2_DRV_KEYBOARD */ - DWORD dwFileDateMS; /* e.g. 0 */ - DWORD dwFileDateLS; /* e.g. 0 */ -} VS_FIXEDFILEINFO; - -/* == Type == */ -typedef enum _MINIDUMP_TYPE { - MiniDumpNormal = 0x00000000, - MiniDumpWithDataSegs = 0x00000001, - MiniDumpWithFullMemory = 0x00000002, - MiniDumpWithHandleData = 0x00000004, - MiniDumpFilterMemory = 0x00000008, - MiniDumpScanMemory = 0x00000010, - MiniDumpWithUnloadedModules = 0x00000020, - MiniDumpWithIndirectlyReferencedMemory = 0x00000040, - MiniDumpFilterModulePaths = 0x00000080, - MiniDumpWithProcessThreadData = 0x00000100, - MiniDumpWithPrivateReadWriteMemory = 0x00000200, - MiniDumpWithoutOptionalData = 0x00000400, - MiniDumpWithFullMemoryInfo = 0x00000800, - MiniDumpWithThreadInfo = 0x00001000, - MiniDumpWithCodeSegs = 0x00002000, - MiniDumpWithoutAuxiliaryState = 0x00004000, - MiniDumpWithFullAuxiliaryState = 0x00008000, - MiniDumpWithPrivateWriteCopyMemory = 0x00010000, - MiniDumpIgnoreInaccessibleMemory = 0x00020000, - MiniDumpWithTokenInformation = 0x00040000, - MiniDumpValidTypeFlags = 0x0007ffff, -} MINIDUMP_TYPE; - -/* == Exception Info == */ -typedef struct _MINIDUMP_EXCEPTION_INFORMATION { - DWORD ThreadId; - PEXCEPTION_POINTERS ExceptionPointers; - BOOL ClientPointers; -} MINIDUMP_EXCEPTION_INFORMATION, *PMINIDUMP_EXCEPTION_INFORMATION; -typedef struct _MINIDUMP_EXCEPTION_INFORMATION64 { - DWORD ThreadId; - ULONG64 ExceptionRecord; - ULONG64 ContextRecord; - BOOL ClientPointers; -} MINIDUMP_EXCEPTION_INFORMATION64, *PMINIDUMP_EXCEPTION_INFORMATION64; - -/* == Callback Input Hell == */ -typedef struct _MINIDUMP_THREAD_CALLBACK { - ULONG ThreadId; - HANDLE ThreadHandle; - CONTEXT Context; - ULONG SizeOfContext; - ULONG64 StackBase; - ULONG64 StackEnd; -} MINIDUMP_THREAD_CALLBACK, *PMINIDUMP_THREAD_CALLBACK; -typedef struct _MINIDUMP_THREAD_EX_CALLBACK { - ULONG ThreadId; - HANDLE ThreadHandle; - CONTEXT Context; - ULONG SizeOfContext; - ULONG64 StackBase; - ULONG64 StackEnd; - ULONG64 BackingStoreBase; - ULONG64 BackingStoreEnd; -} MINIDUMP_THREAD_EX_CALLBACK, *PMINIDUMP_THREAD_EX_CALLBACK; -typedef struct _MINIDUMP_MODULE_CALLBACK { - PWCHAR FullPath; - ULONG64 BaseOfImage; - ULONG SizeOfImage; - ULONG CheckSum; - ULONG TimeDateStamp; - VS_FIXEDFILEINFO VersionInfo; - PVOID CvRecord; - ULONG SizeOfCvRecord; - PVOID MiscRecord; - ULONG SizeOfMiscRecord; -} MINIDUMP_MODULE_CALLBACK, *PMINIDUMP_MODULE_CALLBACK; -typedef struct _MINIDUMP_INCLUDE_THREAD_CALLBACK { - ULONG ThreadId; -} MINIDUMP_INCLUDE_THREAD_CALLBACK, *PMINIDUMP_INCLUDE_THREAD_CALLBACK; -typedef struct _MINIDUMP_INCLUDE_MODULE_CALLBACK { - ULONG64 BaseOfImage; -} MINIDUMP_INCLUDE_MODULE_CALLBACK, *PMINIDUMP_INCLUDE_MODULE_CALLBACK; -typedef struct _MINIDUMP_IO_CALLBACK { - HANDLE Handle; - ULONG64 Offset; - PVOID Buffer; - ULONG BufferBytes; -} MINIDUMP_IO_CALLBACK, *PMINIDUMP_IO_CALLBACK; -typedef struct _MINIDUMP_READ_MEMORY_FAILURE_CALLBACK -{ - ULONG64 Offset; - ULONG Bytes; - HRESULT FailureStatus; -} MINIDUMP_READ_MEMORY_FAILURE_CALLBACK, - *PMINIDUMP_READ_MEMORY_FAILURE_CALLBACK; -typedef struct _MINIDUMP_CALLBACK_INPUT { - ULONG ProcessId; - HANDLE ProcessHandle; - ULONG CallbackType; - union { - HRESULT Status; - MINIDUMP_THREAD_CALLBACK Thread; - MINIDUMP_THREAD_EX_CALLBACK ThreadEx; - MINIDUMP_MODULE_CALLBACK Module; - MINIDUMP_INCLUDE_THREAD_CALLBACK IncludeThread; - MINIDUMP_INCLUDE_MODULE_CALLBACK IncludeModule; - MINIDUMP_IO_CALLBACK Io; - MINIDUMP_READ_MEMORY_FAILURE_CALLBACK ReadMemoryFailure; - ULONG SecondaryFlags; - }; -} MINIDUMP_CALLBACK_INPUT, *PMINIDUMP_CALLBACK_INPUT; - -/* == Callback Output Hell == */ -typedef struct _MINIDUMP_MEMORY_INFO { - ULONG64 BaseAddress; - ULONG64 AllocationBase; - ULONG32 AllocationProtect; - ULONG32 __alignment1; - ULONG64 RegionSize; - ULONG32 State; - ULONG32 Protect; - ULONG32 Type; - ULONG32 __alignment2; -} MINIDUMP_MEMORY_INFO, *PMINIDUMP_MEMORY_INFO; -typedef struct _MINIDUMP_CALLBACK_OUTPUT { - union { - ULONG ModuleWriteFlags; - ULONG ThreadWriteFlags; - ULONG SecondaryFlags; - struct { - ULONG64 MemoryBase; - ULONG MemorySize; - }; - struct { - BOOL CheckCancel; - BOOL Cancel; - }; - HANDLE Handle; - struct { - MINIDUMP_MEMORY_INFO VmRegion; - BOOL Continue; - }; - HRESULT Status; - }; -} MINIDUMP_CALLBACK_OUTPUT, *PMINIDUMP_CALLBACK_OUTPUT; - -/* == Callback Hell == */ -typedef BOOL (WINAPI *MINIDUMP_CALLBACK_ROUTINE)( - PVOID CallbackParam, - PMINIDUMP_CALLBACK_INPUT CallbackInput, - PMINIDUMP_CALLBACK_OUTPUT CallbackOutput); -typedef struct _MINIDUMP_CALLBACK_INFORMATION { - MINIDUMP_CALLBACK_ROUTINE CallbackRoutine; - PVOID CallbackParam; -} MINIDUMP_CALLBACK_INFORMATION, *PMINIDUMP_CALLBACK_INFORMATION; - -/* == User Stream Information == */ -typedef struct _MINIDUMP_USER_STREAM { - ULONG32 Type; - ULONG BufferSize; - PVOID Buffer; -} MINIDUMP_USER_STREAM, *PMINIDUMP_USER_STREAM; -typedef struct _MINIDUMP_USER_STREAM_INFORMATION { - ULONG UserStreamCount; - PMINIDUMP_USER_STREAM UserStreamArray; -} MINIDUMP_USER_STREAM_INFORMATION, *PMINIDUMP_USER_STREAM_INFORMATION; - -/* Function (all this shit above is required for this simple function). */ -BOOL WINAPI MiniDumpWriteDump( - HANDLE hProcess, - DWORD ProcessId, - HANDLE hFile, - MINIDUMP_TYPE DumpType, - PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, - PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, - PMINIDUMP_CALLBACK_INFORMATION CallbackParam); - -/* Priviliges: */ -BOOL WINAPI OpenProcessToken ( - HANDLE ProcessHandle, - DWORD DesiredAccess, - PHANDLE TokenHandle); -BOOL WINAPI LookupPrivilegeValueA( - LPCSTR lpSystemName, - LPCSTR lpName, - PLUID lpLuid); -BOOL WINAPI LookupPrivilegeValueW( - LPCWSTR lpSystemName, - LPCWSTR lpName, - PLUID lpLuid); -BOOL WINAPI AdjustTokenPrivileges( - HANDLE TokenHandle, - BOOL DisableAllPrivileges, - PTOKEN_PRIVILEGES NewState, - DWORD BufferLength, - PTOKEN_PRIVILEGES PreviousState, - PDWORD ReturnLength); - -/* ========================================================================== */ -/* Segment Registers: */ -void __debugbreak(void); -#if _WIN64 -unsigned char __readgsbyte(unsigned long Offset); -unsigned short __readgsword(unsigned long Offset); -unsigned long __readgsdword(unsigned long Offset); -unsigned __int64 __readgsqword(unsigned long Offset); -#else -unsigned char __readfsbyte(unsigned long Offset); -unsigned short __readfsword(unsigned long Offset); -unsigned long __readfsdword(unsigned long Offset); -unsigned __int64 __readfsqword(unsigned long Offset); -#endif - -static NT_TIB * -GetTib(void) -{ -#if _WIN64 - return (NT_TIB *)__readgsqword(0x30); -#else - return (NT_TIB *)__readfsdword(0x18); -#endif -} - - -#if defined(__cplusplus) -} -#endif - -/* Enable all warnings */ -#if defined(_MSC_VER) - #pragma warning(pop) -#endif - -#endif /* WINDOWS_DBGHELP_H */ -#endif /* _WINDOWS_ */ - diff --git a/exe_load/include/dds.h b/exe_load/include/dds.h deleted file mode 100644 index 5b0d343..0000000 --- a/exe_load/include/dds.h +++ /dev/null @@ -1,211 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Arvid Gerstmann. All rights reserved. - */ -#ifndef _WINDOWS_ -#ifndef WINDOWS_DDS_H -#define WINDOWS_DDS_H - -/* Disable all warnings */ -#if defined(_MSC_VER) - #pragma warning(push, 0) -#endif - -#ifndef WINDOWS_BASE_H -#include "windows_base.h" -#endif -#if defined(__cplusplus) -extern "C" { -#endif - -#ifndef DXGI_FORMAT_DEFINED -#define DXGI_FORMAT_DEFINED 1 -typedef enum DXGI_FORMAT -{ - DXGI_FORMAT_UNKNOWN = 0, - DXGI_FORMAT_R32G32B32A32_TYPELESS = 1, - DXGI_FORMAT_R32G32B32A32_FLOAT = 2, - DXGI_FORMAT_R32G32B32A32_UINT = 3, - DXGI_FORMAT_R32G32B32A32_SINT = 4, - DXGI_FORMAT_R32G32B32_TYPELESS = 5, - DXGI_FORMAT_R32G32B32_FLOAT = 6, - DXGI_FORMAT_R32G32B32_UINT = 7, - DXGI_FORMAT_R32G32B32_SINT = 8, - DXGI_FORMAT_R16G16B16A16_TYPELESS = 9, - DXGI_FORMAT_R16G16B16A16_FLOAT = 10, - DXGI_FORMAT_R16G16B16A16_UNORM = 11, - DXGI_FORMAT_R16G16B16A16_UINT = 12, - DXGI_FORMAT_R16G16B16A16_SNORM = 13, - DXGI_FORMAT_R16G16B16A16_SINT = 14, - DXGI_FORMAT_R32G32_TYPELESS = 15, - DXGI_FORMAT_R32G32_FLOAT = 16, - DXGI_FORMAT_R32G32_UINT = 17, - DXGI_FORMAT_R32G32_SINT = 18, - DXGI_FORMAT_R32G8X24_TYPELESS = 19, - DXGI_FORMAT_D32_FLOAT_S8X24_UINT = 20, - DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS = 21, - DXGI_FORMAT_X32_TYPELESS_G8X24_UINT = 22, - DXGI_FORMAT_R10G10B10A2_TYPELESS = 23, - DXGI_FORMAT_R10G10B10A2_UNORM = 24, - DXGI_FORMAT_R10G10B10A2_UINT = 25, - DXGI_FORMAT_R11G11B10_FLOAT = 26, - DXGI_FORMAT_R8G8B8A8_TYPELESS = 27, - DXGI_FORMAT_R8G8B8A8_UNORM = 28, - DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = 29, - DXGI_FORMAT_R8G8B8A8_UINT = 30, - DXGI_FORMAT_R8G8B8A8_SNORM = 31, - DXGI_FORMAT_R8G8B8A8_SINT = 32, - DXGI_FORMAT_R16G16_TYPELESS = 33, - DXGI_FORMAT_R16G16_FLOAT = 34, - DXGI_FORMAT_R16G16_UNORM = 35, - DXGI_FORMAT_R16G16_UINT = 36, - DXGI_FORMAT_R16G16_SNORM = 37, - DXGI_FORMAT_R16G16_SINT = 38, - DXGI_FORMAT_R32_TYPELESS = 39, - DXGI_FORMAT_D32_FLOAT = 40, - DXGI_FORMAT_R32_FLOAT = 41, - DXGI_FORMAT_R32_UINT = 42, - DXGI_FORMAT_R32_SINT = 43, - DXGI_FORMAT_R24G8_TYPELESS = 44, - DXGI_FORMAT_D24_UNORM_S8_UINT = 45, - DXGI_FORMAT_R24_UNORM_X8_TYPELESS = 46, - DXGI_FORMAT_X24_TYPELESS_G8_UINT = 47, - DXGI_FORMAT_R8G8_TYPELESS = 48, - DXGI_FORMAT_R8G8_UNORM = 49, - DXGI_FORMAT_R8G8_UINT = 50, - DXGI_FORMAT_R8G8_SNORM = 51, - DXGI_FORMAT_R8G8_SINT = 52, - DXGI_FORMAT_R16_TYPELESS = 53, - DXGI_FORMAT_R16_FLOAT = 54, - DXGI_FORMAT_D16_UNORM = 55, - DXGI_FORMAT_R16_UNORM = 56, - DXGI_FORMAT_R16_UINT = 57, - DXGI_FORMAT_R16_SNORM = 58, - DXGI_FORMAT_R16_SINT = 59, - DXGI_FORMAT_R8_TYPELESS = 60, - DXGI_FORMAT_R8_UNORM = 61, - DXGI_FORMAT_R8_UINT = 62, - DXGI_FORMAT_R8_SNORM = 63, - DXGI_FORMAT_R8_SINT = 64, - DXGI_FORMAT_A8_UNORM = 65, - DXGI_FORMAT_R1_UNORM = 66, - DXGI_FORMAT_R9G9B9E5_SHAREDEXP = 67, - DXGI_FORMAT_R8G8_B8G8_UNORM = 68, - DXGI_FORMAT_G8R8_G8B8_UNORM = 69, - DXGI_FORMAT_BC1_TYPELESS = 70, - DXGI_FORMAT_BC1_UNORM = 71, - DXGI_FORMAT_BC1_UNORM_SRGB = 72, - DXGI_FORMAT_BC2_TYPELESS = 73, - DXGI_FORMAT_BC2_UNORM = 74, - DXGI_FORMAT_BC2_UNORM_SRGB = 75, - DXGI_FORMAT_BC3_TYPELESS = 76, - DXGI_FORMAT_BC3_UNORM = 77, - DXGI_FORMAT_BC3_UNORM_SRGB = 78, - DXGI_FORMAT_BC4_TYPELESS = 79, - DXGI_FORMAT_BC4_UNORM = 80, - DXGI_FORMAT_BC4_SNORM = 81, - DXGI_FORMAT_BC5_TYPELESS = 82, - DXGI_FORMAT_BC5_UNORM = 83, - DXGI_FORMAT_BC5_SNORM = 84, - DXGI_FORMAT_B5G6R5_UNORM = 85, - DXGI_FORMAT_B5G5R5A1_UNORM = 86, - DXGI_FORMAT_B8G8R8A8_UNORM = 87, - DXGI_FORMAT_B8G8R8X8_UNORM = 88, - DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM = 89, - DXGI_FORMAT_B8G8R8A8_TYPELESS = 90, - DXGI_FORMAT_B8G8R8A8_UNORM_SRGB = 91, - DXGI_FORMAT_B8G8R8X8_TYPELESS = 92, - DXGI_FORMAT_B8G8R8X8_UNORM_SRGB = 93, - DXGI_FORMAT_BC6H_TYPELESS = 94, - DXGI_FORMAT_BC6H_UF16 = 95, - DXGI_FORMAT_BC6H_SF16 = 96, - DXGI_FORMAT_BC7_TYPELESS = 97, - DXGI_FORMAT_BC7_UNORM = 98, - DXGI_FORMAT_BC7_UNORM_SRGB = 99, - DXGI_FORMAT_FORCE_UINT = 0xffffffff -} DXGI_FORMAT; -#endif - -/* Value for magic header */ -#define FOURCC_DDS (0x20534444) - -/* Values for DDS_PIXELFORMAT.dwFlags */ -#define DDPF_FOURCC (0x00000004) - -#pragma pack(push,1) - -typedef struct { - DWORD dwSize; - DWORD dwFlags; - DWORD dwFourCC; - DWORD dwRGBBitCount; - DWORD dwRBitMask; - DWORD dwGBitMask; - DWORD dwBBitMask; - DWORD dwABitMask; -} DDS_PIXELFORMAT; - -typedef struct { - DWORD dwSize; - DWORD dwHeaderFlags; - DWORD dwHeight; - DWORD dwWidth; - DWORD dwPitchOrLinearSize; - DWORD dwDepth; // only if DDS_HEADER_FLAGS_VOLUME is set in dwHeaderFlags - DWORD dwMipMapCount; - DWORD dwReserved1[11]; - DDS_PIXELFORMAT ddspf; - DWORD dwSurfaceFlags; - DWORD dwCubemapFlags; - DWORD dwReserved2[3]; -} DDS_HEADER; - -typedef struct { - DXGI_FORMAT dxgiFormat; - UINT resourceDimension; - UINT miscFlag; - UINT arraySize; - UINT reserved; -} DDS_HEADER_DXT10; - -/* Values for DDS_PIXELFORMAT.dwFourCC */ -#define FMT_DX10 (0x30315844) -#define FMT_DXT1 (0x31545844) /* DXGI_FORMAT_BC1_UNORM */ -#define FMT_DXT3 (0x33545844) /* DXGI_FORMAT_BC2_UNORM */ -#define FMT_DXT5 (0x35545844) /* DXGI_FORMAT_BC3_UNORM */ - -/* Values for dwFlags */ -#define DDSD_CAPS 0x00000001 -#define DDSD_HEIGHT 0x00000002 -#define DDSD_WIDTH 0x00000004 -#define DDSD_PITCH 0x00000008 -#define DDSD_PIXELFORMAT 0x00001000 -#define DDSD_MIPMAPCOUNT 0x00020000 -#define DDSD_LINEARSIZE 0x00080000 -#define DDSD_DEPTH 0x00800000 - -/* Values for dwCaps */ -#define DDSCAPS_COMPLEX 0x00000008 -#define DDSCAPS_MIPMAP 0x04000000 -#define DDSCAPS_TEXTURE 0x00001000 - -/* Blocksizes */ -#define BLOCKSIZE_DXT1 0x8 -#define BLOCKSIZE_DXT3 0x10 -#define BLOCKSIZE_DXT5 0x10 - -#pragma pack(pop) - - -#if defined(__cplusplus) -} -#endif - -/* Enable all warnings */ -#if defined(_MSC_VER) - #pragma warning(pop) -#endif - -#endif /* WINDOWS_DDS_H */ -#endif /* _WINDOWS_ */ - diff --git a/exe_load/include/fiber.h b/exe_load/include/fiber.h deleted file mode 100644 index 4c7038c..0000000 --- a/exe_load/include/fiber.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Arvid Gerstmann. All rights reserved. - */ -#ifndef _WINDOWS_ -#ifndef WINDOWS_FIBER_H -#define WINDOWS_FIBER_H - -/* Disable all warnings */ -#if defined(_MSC_VER) - #pragma warning(push, 0) -#endif - -#ifndef WINDOWS_BASE_H - #include "windows_base.h" -#endif - -/* dbghelp contains __readfsdword / __readgsqword */ -#ifndef WINDOWS_DBGHELP_H - #include "dbghelp.h" -#endif - -#if defined(__cplusplus) -extern "C" { -#endif - - -/* ========================================================================= */ -/* Fiber */ -/* ========================================================================= */ -typedef void (WINAPI *PFIBER_START_ROUTINE)(LPVOID lpFiberParameter); -typedef PFIBER_START_ROUTINE LPFIBER_START_ROUTINE; -typedef void(NTAPI *PFLS_CALLBACK_FUNCTION)(PVOID lpFlsData); - -BOOL WINAPI IsThreadAFiber(void); - -void WINAPI SwitchToFiber(LPVOID lpFiber); -void WINAPI DeleteFiber(LPVOID lpFiber); - -BOOL WINAPI ConvertFiberToThread(void); - -LPVOID WINAPI CreateFiber( - SIZE_T dwStackSize, - LPFIBER_START_ROUTINE lpStartAddress, - LPVOID lpParameter); -LPVOID WINAPI CreateFiberEx( - SIZE_T dwStackCommitSize, - SIZE_T dwStackReserveSize, - DWORD dwFlags, - LPFIBER_START_ROUTINE lpStartAddress, - LPVOID lpParameter); - -LPVOID WINAPI ConvertThreadToFiber(LPVOID lpParameter); -LPVOID WINAPI ConvertThreadToFiberEx( - LPVOID lpParameter, - DWORD dwFlags); - -#ifdef _AMD64_ -__inline PVOID -GetCurrentFiber(void) -{ - return (PVOID)(ULONG_PTR)__readgsqword(0x20); -} -#else -__inline PVOID -GetCurrentFiber(void) -{ - return (PVOID)(ULONG_PTR)__readfsdword(0x10); -} -#endif - -__forceinline PVOID -GetFiberData(void) -{ - return *(PVOID *)GetCurrentFiber(); -} - - -/* ========================================================================= */ -/* Fiber Local Storage */ -/* ========================================================================= */ -#ifndef FLS_OUT_OF_INDEXES -#define FLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF) -#endif - -DWORD WINAPI FlsAlloc(PFLS_CALLBACK_FUNCTION lpCallback); -PVOID WINAPI FlsGetValue(DWORD dwFlsIndex); -BOOL WINAPI FlsSetValue(DWORD dwFlsIndex, PVOID lpFlsData); -BOOL WINAPI FlsFree(DWORD dwFlsIndex); - - -#if defined(__cplusplus) -} -#endif - -/* Enable all warnings */ -#if defined(_MSC_VER) - #pragma warning(pop) -#endif - -#endif /* WINDOWS_FIBER_H */ -#endif /* _WINDOWS_ */ - diff --git a/exe_load/include/file.h b/exe_load/include/file.h deleted file mode 100644 index 1babd25..0000000 --- a/exe_load/include/file.h +++ /dev/null @@ -1,505 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Arvid Gerstmann. All rights reserved. - */ -#ifndef _WINDOWS_ -#ifndef WINDOWS_FILE_H -#define WINDOWS_FILE_H - -/* Disable all warnings */ -#if defined(_MSC_VER) - #pragma warning(push, 0) -#endif - -#ifndef WINDOWS_BASE_H -#include "windows_base.h" -#endif -#if defined(__cplusplus) -extern "C" { -#endif - -/* CreateFile.dwShareMode Enums: */ -#define FILE_SHARE_DELETE 0x00000004 -#define FILE_SHARE_READ 0x00000001 -#define FILE_SHARE_WRITE 0x00000002 - -/* Generic Access Rights: */ -#define GENERIC_READ 0x80000000L -#define GENERIC_WRITE 0x40000000L -#define GENERIC_EXECUTE 0x20000000L -#define GENERIC_ALL 0x10000000L - -/* Standard Access Rights: */ -#define DELETE 0x00010000L -#define READ_CONTROL 0x00020000L -#define WRITE_DAC 0x00040000L -#define WRITE_OWNER 0x00080000L -#define SYNCHRONIZE 0x00100000L - -#define STANDARD_RIGHTS_REQUIRED 0x000F0000L - -#define STANDARD_RIGHTS_READ READ_CONTROL -#define STANDARD_RIGHTS_WRITE READ_CONTROL -#define STANDARD_RIGHTS_EXECUTE READ_CONTROL - -#define STANDARD_RIGHTS_ALL 0x001F0000L -#define SPECIFIC_RIGHTS_ALL 0x0000FFFFL - -/* Commulated Access Rights: */ -#define FILE_READ_DATA 0x0001 -#define FILE_LIST_DIRECTORY 0x0001 -#define FILE_WRITE_DATA 0x0002 -#define FILE_ADD_FILE 0x0002 -#define FILE_APPEND_DATA 0x0004 -#define FILE_ADD_SUBDIRECTORY 0x0004 -#define FILE_CREATE_PIPE_INSTANCE 0x0004 -#define FILE_READ_EA 0x0008 -#define FILE_WRITE_EA 0x0010 -#define FILE_EXECUTE 0x0020 -#define FILE_TRAVERSE 0x0020 -#define FILE_DELETE_CHILD 0x0040 -#define FILE_READ_ATTRIBUTES 0x0080 -#define FILE_WRITE_ATTRIBUTES 0x0100 -#define FILE_ALL_ACCESS \ - (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF) - -#define FILE_GENERIC_READ \ - (STANDARD_RIGHTS_READ | \ - FILE_READ_DATA | \ - FILE_READ_ATTRIBUTES | \ - FILE_READ_EA | \ - SYNCHRONIZE) - -#define FILE_GENERIC_WRITE \ - (STANDARD_RIGHTS_WRITE | \ - FILE_WRITE_DATA | \ - FILE_WRITE_ATTRIBUTES | \ - FILE_WRITE_EA | \ - FILE_APPEND_DATA | \ - SYNCHRONIZE) - -#define FILE_GENERIC_EXECUTE \ - (STANDARD_RIGHTS_EXECUTE | \ - FILE_READ_ATTRIBUTES | \ - FILE_EXECUTE | \ - SYNCHRONIZE) - -/* Creation Disposition: */ -#define CREATE_ALWAYS 2 -#define CREATE_NEW 1 -#define OPEN_ALWAYS 4 -#define OPEN_EXISTING 3 -#define TRUNCATE_EXISTING 5 - -/* File Attributes: */ -#define INVALID_FILE_ATTRIBUTES 0xffffffff -#define FILE_ATTRIBUTE_HIDDEN 0x2 -#define FILE_ATTRIBUTE_NORMAL 0x80 -#define FILE_ATTRIBUTE_DIRECTORY 0x10 -#define FILE_ATTRIBUTE_TEMPORARY 0x100 -#define FILE_ATTRIBUTE_REPARSE_POINT 0x400 - -/* File Offsets: */ -#define FILE_BEGIN 0 -#define FILE_CURRENT 1 -#define FILE_END 2 - -/* File Mapping: */ -#define SECTION_QUERY 0x0001 -#define SECTION_MAP_WRITE 0x0002 -#define SECTION_MAP_READ 0x0004 -#define SECTION_MAP_EXECUTE 0x0008 -#define SECTION_EXTEND_SIZE 0x0010 -#define SECTION_MAP_EXECUTE_EXPLICIT 0x0020 -#define SECTION_ALL_ACCESS \ - (STANDARD_RIGHTS_REQUIRED |\ - SECTION_QUERY |\ - SECTION_MAP_WRITE |\ - SECTION_MAP_READ |\ - SECTION_MAP_EXECUTE |\ - SECTION_EXTEND_SIZE) - -#define FILE_MAP_COPY SECTION_QUERY -#define FILE_MAP_WRITE SECTION_MAP_WRITE -#define FILE_MAP_READ SECTION_MAP_READ -#define FILE_MAP_ALL_ACCESS SECTION_ALL_ACCESS -#define FILE_MAP_EXECUTE SECTION_MAP_EXECUTE_EXPLICIT - -#define PAGE_EXECUTE_READ 0x20 -#define PAGE_EXECUTE_READWRITE 0x40 -#define PAGE_EXECUTE_WRITECOPY 0x80 -#define PAGE_READONLY 0x02 -#define PAGE_READWRITE 0x04 -#define PAGE_WRITECOPY 0x08 - -/* File Change Notifications: */ -#define FILE_NOTIFY_CHANGE_FILE_NAME 0x00000001 -#define FILE_NOTIFY_CHANGE_DIR_NAME 0x00000002 -#define FILE_NOTIFY_CHANGE_ATTRIBUTES 0x00000004 -#define FILE_NOTIFY_CHANGE_SIZE 0x00000008 -#define FILE_NOTIFY_CHANGE_LAST_WRITE 0x00000010 -#define FILE_NOTIFY_CHANGE_SECURITY 0x00000100 - -/* File Type: */ -#define FILE_TYPE_UNKNOWN 0x0000 -#define FILE_TYPE_DISK 0x0001 -#define FILE_TYPE_CHAR 0x0002 -#define FILE_TYPE_PIPE 0x0003 -#define FILE_TYPE_REMOTE 0x8000 - -/* Move Flags: */ -#define MOVEFILE_COPY_ALLOWED 0x2 -#define MOVEFILE_REPLACE_EXISTING 0x1 - -typedef DWORD SECURITY_INFORMATION, *PSECURITY_INFORMATION; -typedef HANDLE PSECURITY_DESCRIPTOR; - - -/* ========================================================================== */ -/* Structures: */ -typedef struct _OVERLAPPED { - ULONG_PTR Internal; - ULONG_PTR InternalHigh; - union { - struct { - DWORD Offset; - DWORD OffsetHigh; - }; - PVOID Pointer; - }; - HANDLE hEvent; -} OVERLAPPED, *LPOVERLAPPED; - -/* File Iteration: */ -typedef struct _WIN32_FIND_DATAA { - DWORD dwFileAttributes; - FILETIME ftCreationTime; - FILETIME ftLastAccessTime; - FILETIME ftLastWriteTime; - DWORD nFileSizeHigh; - DWORD nFileSizeLow; - DWORD dwReserved0; - DWORD dwReserved1; - CHAR cFileName[MAX_PATH]; - CHAR cAlternateFileName[14]; -} WIN32_FIND_DATAA, *PWIN32_FIND_DATAA, *LPWIN32_FIND_DATAA; -typedef struct _WIN32_FIND_DATAW { - DWORD dwFileAttributes; - FILETIME ftCreationTime; - FILETIME ftLastAccessTime; - FILETIME ftLastWriteTime; - DWORD nFileSizeHigh; - DWORD nFileSizeLow; - DWORD dwReserved0; - DWORD dwReserved1; - WCHAR cFileName[MAX_PATH]; - WCHAR cAlternateFileName[14]; -} WIN32_FIND_DATAW, *PWIN32_FIND_DATAW, *LPWIN32_FIND_DATAW; - - -/* ========================================================================== */ -/* File I/O Functions: */ -HANDLE WINAPI CreateFileA( - LPCSTR lpFileName, - DWORD dwDesiredAccess, - DWORD dwShareMode, - LPSECURITY_ATTRIBUTES lpSecurityAttributes, - DWORD dwCreationDisposition, - DWORD dwFlagsAndAttributes, - HANDLE hTemplateFile); -HANDLE WINAPI CreateFileW( - LPCWSTR lpFileName, - DWORD dwDesiredAccess, - DWORD dwShareMode, - LPSECURITY_ATTRIBUTES lpSecurityAttributes, - DWORD dwCreationDisposition, - DWORD dwFlagsAndAttributes, - HANDLE hTemplateFile); - -BOOL WINAPI WriteFile( - HANDLE hFile, - LPCVOID lpBuffer, - DWORD nNumberOfBytesToWrite, - LPDWORD lpNumberOfBytesWritten, - LPOVERLAPPED lpOverlapped); -BOOL WINAPI ReadFile( - HANDLE hFile, - LPVOID lpBuffer, - DWORD nNumberOfBytesToRead, - LPDWORD lpNumberOfBytesRead, - LPOVERLAPPED lpOverlapped); -DWORD WINAPI SetFilePointer( - HANDLE hFile, - LONG lDistanceToMove, - PLONG lpDistanceToMoveHigh, - DWORD dwMoveMethod); -BOOL WINAPI SetFilePointerEx( - HANDLE hFile, - LARGE_INTEGER liDistanceToMove, - PLARGE_INTEGER lpNewFilePointer, - DWORD dwMoveMethod); -BOOL WINAPI FlushFileBuffers( - HANDLE hFile); -DWORD WINAPI GetModuleFileNameA( - HMODULE hModule, - LPSTR lpFileName, - DWORD nSize); -DWORD WINAPI GetModuleFileNameW( - HMODULE hModule, - LPWSTR lpFileName, - DWORD nSize); -DWORD WINAPI GetModuleFileNameExA( - HANDLE hProcess, - HMODULE hModule, - LPSTR lpFileName, - DWORD nSize); -DWORD WINAPI GetModuleFileNameExW( - HANDLE hProcess, - HMODULE hModule, - LPWSTR lpFileName, - DWORD nSize); -HANDLE WINAPI OpenFileMappingA( - DWORD dwDesiredAccess, - BOOL bInheritHandle, - LPCSTR lpName); -HANDLE WINAPI OpenFileMappingW( - DWORD dwDesiredAccess, - BOOL bInheritHandle, - LPCWSTR lpName); -LPVOID WINAPI MapViewOfFile( - HANDLE hFileMappingObject, - DWORD dwDesiredAccess, - DWORD dwFileOffsetHigh, - DWORD dwFileOffsetLow, - SIZE_T dwNumberOfBytesToMap); -LPVOID WINAPI MapViewOfFileEx( - HANDLE hFileMappingObject, - DWORD dwDesiredAccess, - DWORD dwFileOffsetHigh, - DWORD dwFileOffsetLow, - SIZE_T dwNumberOfBytesToMap, - LPVOID lpBaseAddress); -HANDLE WINAPI CreateFileMappingA( - HANDLE hFile, - LPSECURITY_ATTRIBUTES lpAttributes, - DWORD flProtect, - DWORD dwMaximumSizeHigh, - DWORD dwMaximumSizeLow, - LPCSTR lpName); -HANDLE WINAPI CreateFileMappingW( - HANDLE hFile, - LPSECURITY_ATTRIBUTES lpAttributes, - DWORD flProtect, - DWORD dwMaximumSizeHigh, - DWORD dwMaximumSizeLow, - LPCWSTR lpName); -BOOL WINAPI UnmapViewOfFile( - LPCVOID lpBaseAddress); -DWORD WINAPI GetFileAttributesA( - LPCSTR lpFileName); -DWORD WINAPI GetFileAttributesW( - LPCWSTR lpFileName); - -typedef enum _GET_FILEEX_INFO_LEVELS { - GetFileExInfoStandard, - GetFileExMaxInfoLevel -} GET_FILEEX_INFO_LEVELS; -typedef struct _WIN32_FILE_ATTRIBUTE_DATA { - DWORD dwFileAttributes; - FILETIME ftCreationTime; - FILETIME ftLastAccessTime; - FILETIME ftLastWriteTime; - DWORD nFileSizeHigh; - DWORD nFileSizeLow; -} WIN32_FILE_ATTRIBUTE_DATA, *LPWIN32_FILE_ATTRIBUTE_DATA; -BOOL WINAPI GetFileAttributesExA( - LPCSTR lpFileName, - GET_FILEEX_INFO_LEVELS fInfoLevelId, - LPVOID lpFileInformation); -BOOL WINAPI GetFileAttributesExW( - LPCWSTR lpFileName, - GET_FILEEX_INFO_LEVELS fInfoLevelId, - LPVOID lpFileInformation); -BOOL SetFileAttributesA(LPCSTR lpFileName, DWORD dwFileAttributes); -BOOL SetFileAttributesW(LPCWSTR lpFileName, DWORD dwFileAttributes); - - -BOOL WINAPI GetFileTime( - HANDLE hFile, - LPFILETIME lpCreationTime, - LPFILETIME lpLastAccessTime, - LPFILETIME lpLastWriteTime); -BOOL WINAPI SetEndOfFile( - HANDLE hFile); -BOOL WINAPI CreateDirectoryA( - LPCSTR lpPathName, - LPSECURITY_ATTRIBUTES lpSecurityAttributes); -BOOL WINAPI CreateDirectoryW( - LPCWSTR lpPathName, - LPSECURITY_ATTRIBUTES lpSecurityAttributes); -BOOL WINAPI CopyFileA( - LPCSTR lpExistingFileName, - LPCSTR lpNewFileName, - BOOL bFailIfExists); -BOOL WINAPI CopyFileW( - LPCWSTR lpExistingFileName, - LPCWSTR lpNewFileName, - BOOL bFailIfExists); -BOOL WINAPI DeleteFileA( - LPCSTR lpFileName); -BOOL WINAPI DeleteFileW( - LPCWSTR lpFileName); -BOOL WINAPI MoveFileA( - LPCSTR lpExistingFileName, - LPCSTR lpNewFileName); -BOOL WINAPI MoveFileW( - LPCWSTR lpExistingFileName, - LPCWSTR lpNewFileName); -BOOL WINAPI MoveFileExA( - LPCSTR lpExistingFileName, - LPCSTR lpNewFileName, - DWORD dwFlags); -BOOL WINAPI MoveFileExW( - LPCWSTR lpExistingFileName, - LPCWSTR lpNewFileName, - DWORD dwFlags); -BOOL WINAPI RemoveDirectoryA( - LPCSTR lpPathName); -BOOL WINAPI RemoveDirectoryW( - LPCWSTR lpPathName); -BOOL WINAPI GetFileSizeEx( - HANDLE hFile, - PLARGE_INTEGER lpFileSize); -BOOL WINAPI FlushViewOfFile( - LPCVOID lpBaseAddress, - SIZE_T dwNumberOfBytesToFlush); - - -/* ========================================================================== */ -/* File Iteration Functions: */ -HANDLE WINAPI FindFirstFileA( - LPCSTR lpFileName, - LPWIN32_FIND_DATAA lpFindFileData); -HANDLE WINAPI FindFirstFileW( - LPCWSTR lpFileName, - LPWIN32_FIND_DATAW lpFindFileData); -BOOL WINAPI FindNextFileA( - HANDLE hFindFile, - LPWIN32_FIND_DATAA lpFindFileData); -BOOL WINAPI FindNextFileW( - HANDLE hFindFile, - LPWIN32_FIND_DATAW lpFindFileData); -BOOL WINAPI FindClose( - HANDLE hFindFile); - -/* ========================================================================== */ -/* File Change Functions: */ -HANDLE WINAPI FindFirstChangeNotificationA( - LPCSTR lpPathName, - BOOL bWatchSubtree, - DWORD dwNotifyFilter); -HANDLE WINAPI FindFirstChangeNotificationW( - LPCWSTR lpPathName, - BOOL bWatchSubtree, - DWORD dwNotifyFilter); -BOOL WINAPI FindNextChangeNotification( - HANDLE hChangeHandle); -BOOL WINAPI FindCloseChangeNotification( - HANDLE hChangeHandle); - -/* ========================================================================== */ -/* File Misc: */ -DWORD WINAPI GetFileType( - HANDLE hFile); - -/* ========================================================================== */ -/* Temp File: */ -UINT WINAPI GetTempFileNameW( - LPCWSTR lpPathName, - LPCWSTR lpPrefixString, - UINT uUnique, - LPWSTR lpTempFileName -); - -DWORD WINAPI GetTempPathW( - DWORD nBufferLength, - LPWSTR lpBuffer -); - -/* ========================================================================== */ -/* File Security: */ -BOOL WINAPI GetFileSecurityA( - LPCSTR lpFileName, - SECURITY_INFORMATION RequestedInformation, - PSECURITY_DESCRIPTOR pSecurityDescriptor, - DWORD nLength, - LPDWORD lpnLengthNeeded); -BOOL WINAPI GetFileSecurityW( - LPCWSTR lpFileName, - SECURITY_INFORMATION RequestedInformation, - PSECURITY_DESCRIPTOR pSecurityDescriptor, - DWORD nLength, - LPDWORD lpnLengthNeeded); - -/* ========================================================================== */ -/* Directory Changes: */ -#define FILE_ACTION_ADDED 0x00000001 -#define FILE_ACTION_REMOVED 0x00000002 -#define FILE_ACTION_MODIFIED 0x00000003 -#define FILE_ACTION_RENAMED_OLD_NAME 0x00000004 -#define FILE_ACTION_RENAMED_NEW_NAME 0x00000005 - -#define STATUS_WAIT_0 ((DWORD)0x00000000L) -#define STATUS_TIMEOUT ((DWORD)0x00000102L) -#define STATUS_PENDING ((DWORD)0x00000103L) -#define STILL_ACTIVE STATUS_PENDING - -#define FILE_FLAG_WRITE_THROUGH 0x80000000 -#define FILE_FLAG_OVERLAPPED 0x40000000 -#define FILE_FLAG_NO_BUFFERING 0x20000000 -#define FILE_FLAG_RANDOM_ACCESS 0x10000000 -#define FILE_FLAG_SEQUENTIAL_SCAN 0x08000000 -#define FILE_FLAG_DELETE_ON_CLOSE 0x04000000 -#define FILE_FLAG_BACKUP_SEMANTICS 0x02000000 -#define FILE_FLAG_POSIX_SEMANTICS 0x01000000 -#define FILE_FLAG_SESSION_AWARE 0x00800000 -#define FILE_FLAG_OPEN_REPARSE_POINT 0x00200000 -#define FILE_FLAG_OPEN_NO_RECALL 0x00100000 -#define FILE_FLAG_FIRST_PIPE_INSTANCE 0x00080000 - -#define HasOverlappedIoCompleted(lpOverlapped) (((DWORD)(lpOverlapped)->Internal) != STATUS_PENDING) - -typedef VOID(WINAPI* LPOVERLAPPED_COMPLETION_ROUTINE)(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped); - -typedef struct FILE_NOTIFY_INFORMATION { - DWORD NextEntryOffset; - DWORD Action; - DWORD FileNameLength; - WCHAR FileName[1]; -} FILE_NOTIFY_INFORMATION; - -BOOL WINAPI ReadDirectoryChangesW( - HANDLE hDirectory, - LPVOID lpBuffer, - DWORD nBufferLength, - BOOL bWatchSubtree, - DWORD dwNotifyFilter, - LPDWORD lpBytesReturned, - LPOVERLAPPED lpOverlapped, - LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine -); - - - -#if defined(__cplusplus) -} -#endif - -/* Enable all warnings */ -#if defined(_MSC_VER) - #pragma warning(pop) -#endif - -#endif /* WINDOWS_FILE_H */ -#endif /* _WINDOWS_ */ - diff --git a/exe_load/include/gdi.h b/exe_load/include/gdi.h deleted file mode 100644 index 1b82311..0000000 --- a/exe_load/include/gdi.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Arvid Gerstmann. All rights reserved. - */ -#ifndef _WINDOWS_ -#ifndef WINDOWS_GDI_H -#define WINDOWS_GDI_H - -/* Disable all warnings */ -#if defined(_MSC_VER) - #pragma warning(push, 0) -#endif - -#ifndef WINDOWS_BASE_H -#include "windows_base.h" -#endif -#if defined(__cplusplus) -extern "C" { -#endif - -/* GDI: */ -#define BLACK_BRUSH 4 - - -/* Icons / Cursor: */ -#define MAKEINTRESOURCE(res) ((ULONG_PTR)(USHORT)res) -#define IDI_APPLICATION MAKEINTRESOURCE(32512) -#define IDC_ARROW MAKEINTRESOURCE(32512) - - -/* ========================================================================= */ -/* Functions */ -HCURSOR WINAPI LoadCursorA( - HINSTANCE hInstance, - LPCSTR lpCursorName); -HCURSOR WINAPI LoadCursorW( - HINSTANCE hInstance, - LPCWSTR lpCursorName); -HICON WINAPI LoadIconA( - HINSTANCE hInstance, - LPCSTR lpIconName); -HICON WINAPI LoadIconW( - HINSTANCE hInstance, - LPCWSTR lpIconName); -HGDIOBJ WINAPI GetStockObject( - int fnObject); -HCURSOR WINAPI SetCursor( - HCURSOR hCursor); - - -#if defined(__cplusplus) -} -#endif - -/* Enable all warnings */ -#if defined(_MSC_VER) - #pragma warning(pop) -#endif - -#endif /* WINDOWS_GDI_H */ -#endif /* _WINDOWS_ */ - diff --git a/exe_load/include/intrin.h b/exe_load/include/intrin.h deleted file mode 100644 index 3e6df0f..0000000 --- a/exe_load/include/intrin.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Arvid Gerstmann. All rights reserved. - */ -#ifndef _WINDOWS_ -#ifndef WINDOWS_INTRIN_H -#define WINDOWS_INTRIN_H - -/* Disable all warnings */ -#if defined(_MSC_VER) - #pragma warning(push, 0) -#endif - -#if defined(__cplusplus) -extern "C" { -#endif - - -/* ========================================================================== */ -/* Intrinsics */ -/* ========================================================================== */ - -extern void _mm_pause(void); -#pragma intrinsic(_mm_pause) - -extern void _ReadWriteBarrier(void); -#pragma intrinsic(_ReadWriteBarrier) - - - -#if defined(__cplusplus) -} -#endif - -/* Enable all warnings */ -#if defined(_MSC_VER) - #pragma warning(pop) -#endif - -#endif /* WINDOWS_INTRIN_H */ -#endif /* _WINDOWS_ */ - diff --git a/exe_load/include/io.h b/exe_load/include/io.h deleted file mode 100644 index 9cc5f30..0000000 --- a/exe_load/include/io.h +++ /dev/null @@ -1,366 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Arvid Gerstmann. All rights reserved. - */ -#ifndef _WINDOWS_ -#ifndef WINDOWS_IO_H -#define WINDOWS_IO_H - -/* Disable all warnings */ -#if defined(_MSC_VER) - #pragma warning(push, 0) -#endif - -#ifndef WINDOWS_BASE_H -#include "windows_base.h" -#endif -#if defined(__cplusplus) -extern "C" { -#endif - -/* GetStdHandle: */ -#define STD_INPUT_HANDLE ((DWORD)-10) -#define STD_OUTPUT_HANDLE ((DWORD)-11) -#define STD_ERROR_HANDLE ((DWORD)-12) -#define INVALID_HANDLE_VALUE ((HANDLE)(LONG_PTR)-1) -#define ATTACH_PARENT_PROCESS ((DWORD)-1) - -#define HANDLE_FLAG_INHERIT 0x00000001 -#define HANDLE_FLAG_PROTECT_FROM_CLOSE 0x00000002 - -/* Console Colors: */ -#define FOREGROUND_BLUE 0x0001 -#define FOREGROUND_GREEN 0x0002 -#define FOREGROUND_RED 0x0004 -#define FOREGROUND_INTENSITY 0x0008 -#define BACKGROUND_BLUE 0x0010 -#define BACKGROUND_GREEN 0x0020 -#define BACKGROUND_RED 0x0040 -#define BACKGROUND_INTENSITY 0x0080 - -/* Console Handler */ -#define CTRL_C_EVENT 0x0 -#define CTRL_BREAK_EVENT 0x1 -#define CTRL_CLOSE_EVENT 0x2 -#define CTRL_LOGOFF_EVENT 0x5 -#define CTRL_SHUTDOWN_EVENT 0x6 - -/* Console Input Mode flags */ -#define ENABLE_PROCESSED_INPUT 0x0001 -#define ENABLE_LINE_INPUT 0x0002 -#define ENABLE_ECHO_INPUT 0x0004 -#define ENABLE_WINDOW_INPUT 0x0008 -#define ENABLE_MOUSE_INPUT 0x0010 -#define ENABLE_INSERT_MODE 0x0020 -#define ENABLE_QUICK_EDIT_MODE 0x0040 -#define ENABLE_EXTENDED_FLAGS 0x0080 -#define ENABLE_AUTO_POSITION 0x0100 -#define ENABLE_VIRTUAL_TERMINAL_INPUT 0x0200 - -/* Console Output Mode flags */ -#define ENABLE_PROCESSED_OUTPUT 0x0001 -#define ENABLE_WRAP_AT_EOL_OUTPUT 0x0002 -#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004 -#define DISABLE_NEWLINE_AUTO_RETURN 0x0008 -#define ENABLE_LVB_GRID_WORLDWIDE 0x0010 - -/* HeapAlloc, HeapReAlloc, etc: */ -#define HEAP_NO_SERIALIZE 0x00000001 -#define HEAP_ZERO_MEMORY 0x00000008 -#define HEAP_REALLOC_IN_PLACE_ONLY 0x00000010 - -/* Heap / Memory: */ -typedef enum _HEAP_INFORMATION_CLASS { - HeapCompatibilityInformation = 0, - HeapEneableTerminationOnCorruption = 1, - HeapOptimizeResources = 3 -} HEAP_INFORMATION_CLASS; - -/* VirtualAlloc.flAllocationType: */ -#define MEM_COMMIT 0x00001000 -#define MEM_RESERVE 0x00002000 -#define MEM_RESET 0x00080000 -#define MEM_RESET_UNDO 0x01000000 -#define MEM_LARGE_PAGES 0x20000000 -#define MEM_PHYSICAL 0x00400000 -#define MEM_TOP_DOWN 0x00100000 -#define MEM_WRITE_WATCH 0x00200000 - -/* VirtualAlloc.flProtect: */ -#define PAGE_EXECUTE 0x10 -#define PAGE_EXECUTE_READ 0x20 -#define PAGE_EXECUTE_READWRITE 0x40 -#define PAGE_EXECUTE_WRITECOPY 0x80 -#define PAGE_NOACCESS 0x01 -#define PAGE_READONLY 0x02 -#define PAGE_READWRITE 0x04 -#define PAGE_WRITECOPY 0x08 -#define PAGE_TARGETS_INVALID 0x40000000 -#define PAGE_TARGETS_NO_UPDATE 0x40000000 -#define PAGE_GUARD 0x100 -#define PAGE_NOCACHE 0x200 -#define PAGE_WRITECOMBINE 0x400 - -/* VirtualFree.dwFreeType: */ -#define MEM_DECOMMIT 0x4000 -#define MEM_RELEASE 0x8000 - -/* VirtualQuery State and Type: */ -#define MEM_FREE 0x10000 -#define MEM_IMAGE 0x1000000 -#define MEM_MAPPED 0x40000 -#define MEM_PRIVATE 0x20000 - - -/* ========================================================================== */ -/* Structures: */ -typedef struct _COORD { - SHORT X; - SHORT Y; -} COORD, *PCOORD; - -typedef struct _SMALL_RECT { - SHORT Left; - SHORT Top; - SHORT Right; - SHORT Bottom; -} SMALL_RECT; - -typedef struct _CONSOLE_SCREEN_BUFFER_INFO { - COORD dwSize; - COORD dwCursorPosition; - WORD wAttributes; - SMALL_RECT srWindow; - COORD dwMaximumWindowSize; -} CONSOLE_SCREEN_BUFFER_INFO, *PCONSOLE_SCREEN_BUFFER_INFO; - -typedef BOOL (WINAPI *PHANDLER_ROUTINE)(DWORD dwCtrlType); - -typedef struct _MEMORY_BASIC_INFORMATION32 { - DWORD BaseAddress; - DWORD AllocationBase; - DWORD AllocationProtect; - DWORD RegionSize; - DWORD State; - DWORD Protect; - DWORD Type; -} MEMORY_BASIC_INFORMATION32, *PMEMORY_BASIC_INFORMATION32; - -typedef struct __declspec(align(16)) _MEMORY_BASIC_INFORMATION64 { - ULONGLONG BaseAddress; - ULONGLONG AllocationBase; - DWORD AllocationProtect; - DWORD __alignment1; - ULONGLONG RegionSize; - DWORD State; - DWORD Protect; - DWORD Type; - DWORD __alignment2; -} MEMORY_BASIC_INFORMATION64, *PMEMORY_BASIC_INFORMATION64; -#if defined(_WIN64) -typedef MEMORY_BASIC_INFORMATION64 MEMORY_BASIC_INFORMATION; -typedef PMEMORY_BASIC_INFORMATION64 PMEMORY_BASIC_INFORMATION; -#else -typedef MEMORY_BASIC_INFORMATION32 MEMORY_BASIC_INFORMATION; -typedef PMEMORY_BASIC_INFORMATION32 PMEMORY_BASIC_INFORMATION; -#endif - - -/* ========================================================================== */ -/* I/O Functions: */ -HANDLE WINAPI GetStdHandle( - DWORD nStdHandle); -BOOL WINAPI GetConsoleScreenBufferInfo( - HANDLE hConsoleOutput, - PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo); -BOOL WINAPI SetConsoleTextAttribute( - HANDLE hConsoleOutput, - WORD wAttributes); -BOOL WINAPI GetConsoleMode( - HANDLE hConsoleHandle, - LPDWORD lpMode); -BOOL WINAPI SetConsoleMode( - HANDLE hConsoleHandle, - DWORD dwMode); -BOOL WINAPI CloseHandle( - HANDLE hObject); -BOOL WINAPI SetHandleInformation( - HANDLE hObject, - DWORD dwMask, - DWORD dwFlags); -BOOL WINAPI DuplicateHandle( - HANDLE hSourceProcessHandle, - HANDLE hSourceHandle, - HANDLE hTargetProcessHandle, - LPHANDLE lpTargetHandle, - DWORD dwDesiredAccess, - BOOL bInheritHandle, - DWORD dwOptions); - - -LPSTR WINAPI GetCommandLineA(void); -LPWSTR WINAPI GetCommandLineW(void); -#ifdef UNICODE -#define GetCommandLine GetCommandLineW -#else -#define GetCommandLine GetCommandLineA -#endif - -/* ========================================================================== */ -/* Console Functions: */ -BOOL WINAPI AllocConsole(void); -BOOL WINAPI FreeConsole(void); -BOOL WINAPI AttachConsole( - DWORD dwProcessId); -BOOL WINAPI WriteConsoleA( - HANDLE hConsoleOutput, - const void *lpBuffer, - DWORD nNumberOfCharsToWrite, - LPDWORD lpNumberOfCHarsWritten, - LPVOID lpReserved); -BOOL WINAPI WriteConsoleW( - HANDLE hConsoleOutput, - const void *lpBuffer, - DWORD nNumberOfCharsToWrite, - LPDWORD lpNumberOfCHarsWritten, - LPVOID lpReserved); -BOOL WINAPI SetConsoleCtrlHandler( - PHANDLER_ROUTINE HandlerRoutine, - BOOL Add); -HWND WINAPI GetConsoleWindow(void); -BOOL WINAPI SetConsoleOutputCP( - UINT wCodePageID); -UINT WINAPI GetConsoleOutputCP(void); - -/* ========================================================================== */ -/* Heap Functions: */ -HANDLE WINAPI GetProcessHeap(void); -LPVOID WINAPI HeapAlloc( - HANDLE hHeap, - DWORD dwFlags, - SIZE_T dwBytes); -LPVOID WINAPI HeapReAlloc( - HANDLE hHeap, - DWORD dwFlags, - LPVOID lpMem, - SIZE_T dwBytes); -BOOL WINAPI HeapFree( - HANDLE hHeap, - DWORD dwFlags, - LPVOID lpMem); -BOOL WINAPI HeapsetInformation( - HANDLE HeapHandle, - HEAP_INFORMATION_CLASS HeapInformationClass, - PVOID HeapInformation, - SIZE_T HeapInformationLength); -LPVOID WINAPI VirtualAlloc( - LPVOID lpAddress, - SIZE_T dwSize, - DWORD flAllocationType, - DWORD flProtect); -SIZE_T WINAPI VirtualQuery( - LPCVOID lpAddress, - PMEMORY_BASIC_INFORMATION lpBuffer, - SIZE_T dwLength); -BOOL WINAPI VirtualFree( - LPVOID lpAddress, - SIZE_T dwSize, - DWORD dwFreeType); -BOOL WINAPI VirtualProtect( - LPVOID lpAddress, - SIZE_T dwSize, - DWORD flNewProtect, - PDWORD lpflOldProtect); -BOOL WINAPI FlushInstructionCache( - HANDLE hProcess, - LPCVOID lpBaseAddress, - SIZE_T dwSize); - - -/* ========================================================================== */ -/* Pipe Functions: */ -#define PIPE_WAIT 0x00000000 -#define PIPE_NOWAIT 0x00000001 -#define PIPE_READMODE_BYTE 0x00000000 -#define PIPE_READMODE_MESSAGE 0x00000002 -#define PIPE_TYPE_BYTE 0x00000000 -#define PIPE_TYPE_MESSAGE 0x00000004 -#define PIPE_ACCEPT_REMOTE_CLIENTS 0x00000000 -#define PIPE_REJECT_REMOTE_CLIENTS 0x00000008 - -#define PIPE_ACCESS_INBOUND 0x00000001 -#define PIPE_ACCESS_OUTBOUND 0x00000002 -#define PIPE_ACCESS_DUPLEX 0x00000003 - -#define PIPE_UNLIMITED_INSTANCES 255 -#define ERROR_PIPE_BUSY 231L - -HANDLE WINAPI CreateNamedPipeA( - LPCSTR lpName, - DWORD dwOpenMode, - DWORD dwPipeMode, - DWORD nMaxInstances, - DWORD nOutBufferSize, - DWORD nInBufferSize, - DWORD nDefaultTimeOut, - LPSECURITY_ATTRIBUTES lpSecurityAttributes); -HANDLE WINAPI CreateNamedPipeW( - LPCWSTR lpName, - DWORD dwOpenMode, - DWORD dwPipeMode, - DWORD nMaxInstances, - DWORD nOutBufferSize, - DWORD nInBufferSize, - DWORD nDefaultTimeOut, - LPSECURITY_ATTRIBUTES lpSecurityAttributes); -BOOL WINAPI CreatePipe( - PHANDLE hReadPipe, - PHANDLE hWritePipe, - LPSECURITY_ATTRIBUTES lpPipeAttributes, - DWORD nSize); -BOOL WINAPI ConnectNamedPipe(HANDLE hNamedPipe, LPOVERLAPPED lpOverlapped); -BOOL WINAPI PeekNamedPipe( - HANDLE hNamedPipe, - LPVOID lpBuffer, - DWORD nBufferSize, - LPDWORD lpBytesRead, - LPDWORD lpTotalBytesAvail, - LPDWORD lpBytesLeftThisMessage); -BOOL WINAPI WaitNamedPipeA(LPCSTR lpNamedPipeName, DWORD nTimeOut); -BOOL WINAPI WaitNamedPipeW(LPCWSTR lpNamedPipeName, DWORD nTimeOut); - -/* ========================================================================== */ -/* Path Functions: */ -DWORD WINAPI GetFullPathNameA( - LPCSTR lpFileName, - DWORD nBufferLength, - LPSTR lpBuffer, - LPSTR *lpFilePart); -DWORD WINAPI GetFullPathNameW( - LPCWSTR lpFileName, - DWORD nBufferLength, - LPWSTR lpBuffer, - LPWSTR *lpFilePart); -BOOL WINAPI SetCurrentDirectoryA( - LPCSTR lpPathName); -BOOL WINAPI SetCurrentDirectoryW( - LPCWSTR lpPathName); -DWORD WINAPI GetCurrentDirectoryA( - DWORD nBufferLength, - LPSTR lpBuffer); -DWORD WINAPI GetCurrentDirectoryW( - DWORD nBufferLength, - LPWSTR lpBuffer); - -#if defined(__cplusplus) -} -#endif - -/* Enable all warnings */ -#if defined(_MSC_VER) - #pragma warning(pop) -#endif - -#endif /* WINDOWS_IO_H */ -#endif /* _WINDOWS_ */ - diff --git a/exe_load/include/make.bat b/exe_load/include/make.bat deleted file mode 100644 index 4fc8055..0000000 --- a/exe_load/include/make.bat +++ /dev/null @@ -1,51 +0,0 @@ -@echo off - -:: Remove old windows.h header, if present. -del /F /Q windows.h - -:: Generate skeleton -echo #ifndef _WINDOWS_>> windows.h -echo #pragma once>> windows.h -echo #ifndef _INC_WINDOWS>> windows.h -echo #define _INC_WINDOWS>> windows.h -echo #ifndef WINDOWS_H>> windows.h -echo #define WINDOWS_H>> windows.h -echo:>> windows.h - -:: Append files -echo:>> windows.h -type windows_base.h >> windows.h -echo:>> windows.h -type atomic.h >> windows.h -echo:>> windows.h -type dbghelp.h >> windows.h -echo:>> windows.h -type dds.h >> windows.h -echo:>> windows.h -type file.h >> windows.h -echo:>> windows.h -type gdi.h >> windows.h -echo:>> windows.h -type io.h >> windows.h -echo:>> windows.h -type misc.h >> windows.h -echo:>> windows.h -type process.h >> windows.h -echo:>> windows.h -type sysinfo.h >> windows.h -echo:>> windows.h -type threads.h >> windows.h -echo:>> windows.h -type window.h >> windows.h -echo:>> windows.h -type intrin.h >> windows.h -echo:>> windows.h -type fiber.h >> windows.h -echo:>> windows.h - -:: Finish skeleton -echo #endif>> windows.h -echo #endif>> windows.h -echo #define _WINDOWS_>> windows.h -echo #endif>> windows.h - diff --git a/exe_load/include/misc.h b/exe_load/include/misc.h deleted file mode 100644 index 90edd56..0000000 --- a/exe_load/include/misc.h +++ /dev/null @@ -1,390 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Arvid Gerstmann. All rights reserved. - */ -#ifndef _WINDOWS_ -#ifndef WINDOWS_MISC_H -#define WINDOWS_MISC_H - -/* Disable all warnings */ -#if defined(_MSC_VER) - #pragma warning(push, 0) -#endif - -#include - -#ifndef WINDOWS_BASE_H -#include "windows_base.h" -#endif -#if defined(__cplusplus) -extern "C" { -#endif - -/* MMRESULT: */ -typedef UINT MMRESULT; -#define TIMERR_BASE 96 -#define TIMERR_NOERROR (0) -#define TIMERR_NOCANDO (TIMERR_BASE+1) -#define TIMERR_STRUCT (TIMERR_BASE+33) - -/* Code Pages: */ -#define CP_INSTALLED 0x00000001 -#define CP_SUPPORTED 0x00000002 -#define CP_ACP 0 -#define CP_OEMCP 1 -#define CP_MACCP 2 -#define CP_THREAD_ACP 3 -#define CP_SYMBOL 42 -#define CP_UTF7 65000 -#define CP_UTF8 65001 - -/* Format: */ -#define FORMAT_MESSAGE_ALLOCATE_BUFFER 0x00000100 -#define FORMAT_MESSAGE_ARGUMENT_ARRAY 0x00002000 -#define FORMAT_MESSAGE_FROM_SYSTEM 0x00001000 -#define FORMAT_MESSAGE_IGNORE_INSERTS 0x00000200 -#define FORMAT_MESSAGE_FROM_HMODULE 0x00000800 -#define FORMAT_MESSAGE_FROM_STRING 0x00000400 - -/* Language ID: */ -#define MAKELANGID(p, s) ((((WORD)(s)) << 10) | (WORD )(p)) -#define PRIMARYLANGID(lgid) ((WORD)(lgid) & 0x3ff) -#define SUBLANGID(lgid) ((WORD)(lgid) >> 10) - -#define LANG_NEUTRAL 0x00 -#define LANG_INVARIANT 0x7f -#define LANG_ENGLISH 0x09 -#define LANG_GERMAN 0x07 - -#define SUBLANG_NEUTRAL 0x00 -#define SUBLANG_DEFAULT 0x01 -#define SUBLANG_SYS_DEFAULT 0x02 -#define SUBLANG_CUSTOM_DEFAULT 0x03 -#define SUBLANG_CUSTOM_UNSPECIFIED 0x04 -#define SUBLANG_UI_CUSTOM_DEFAULT 0x05 -#define SUBLANG_ENGLISH_US 0x01 -#define SUBLANG_ENGLISH_UK 0x02 -#define SUBLANG_GERMAN 0x01 - - -/* ========================================================================== */ -/* Structures: */ -/* Time: */ -typedef struct _SYSTEMTIME { - WORD wYear; - WORD wMonth; - WORD wDayOfWeek; - WORD wDay; - WORD wHour; - WORD wMinute; - WORD wSecond; - WORD wMilliseconds; -} SYSTEMTIME, *PSYSTEMTIME; -typedef PSYSTEMTIME LPSYSTEMTIME; - -typedef struct _TIME_ZONE_INFORMATION { - LONG Bias; - WCHAR StandardName[32]; - SYSTEMTIME StandardDate; - LONG StandardBias; - WCHAR DaylightName[32]; - SYSTEMTIME DaylightDate; - LONG DaylightBias; -} TIME_ZONE_INFORMATION, *PTIME_ZONE_INFORMATION; -typedef PTIME_ZONE_INFORMATION LPTIME_ZONE_INFORMATION; - - -/* ========================================================================== */ -/* Functions: */ -/* - * I could've implemented them in assembly, they're like 4 lines, but this is - * avoiding the cost of a function call, if optimizations are turned on. - */ -#ifdef WIN32_BYTESWAP_MACROS -#define _byteswap_ulong(x) (((unsigned long)(x) << 24) | \ - (((unsigned long)(x) << 8) & 0xff0000) | \ - (((unsigned long)(x) >> 8) & 0xff00) | \ - ((unsigned long)(x) >> 24)) -#define _byteswap_uint64(x) (((unsigned __int64)(x) << 56) | \ - (((unsigned __int64)(x) << 40) & 0xff000000000000ULL) | \ - (((unsigned __int64)(x) << 24) & 0xff0000000000ULL) | \ - (((unsigned __int64)(x) << 8) & 0xff00000000ULL) | \ - (((unsigned __int64)(x) >> 8) & 0xff000000ULL) | \ - (((unsigned __int64)(x) >> 24) & 0xff0000ULL) | \ - (((unsigned __int64)(x) >> 40) & 0xff00ULL) | \ - ((unsigned __int64)(x) >> 56)) -#else -unsigned short __cdecl _byteswap_ushort(unsigned short Number); -unsigned long __cdecl _byteswap_ulong (unsigned long Number); -unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64 Number); -#endif - -unsigned int _rotl(unsigned int value, int shift); -unsigned __int64 _rotl64(unsigned __int64 value, int shift); -unsigned char _BitScanForward(unsigned long * Index, unsigned long Mask); -unsigned char _BitScanForward64(unsigned long * Index, unsigned __int64 Mask); - - -/* ========================================================================== */ -/* UTF-16 <-> UTF-8 conversion Functions: */ -int WINAPI WideCharToMultiByte( - UINT CodePage, - DWORD dwFlags, - LPCWSTR lpWideCharStr, - int cchWideChar, - LPSTR lpMultiByteStr, - int cbMultiByte, - LPCSTR lpDefaultChar, - LPBOOL lpUsedDefaultChar); -int WINAPI MultiByteToWideChar( - UINT CodePage, - DWORD dwFlags, - LPCSTR lpMultiByteStr, - int cbMultiByte, - LPWSTR lpWideCharStr, - int cchWideChar); -int WINAPI lstrlenA( - LPCSTR lpString); -int WINAPI lstrlenW( - LPCWSTR lpString); -LPCSTR WINAPI lstrcpyA( - LPCSTR lpString1, - LPCSTR lpString2); -LPCWSTR WINAPI lstrcpyW( - LPCWSTR lpString1, - LPCWSTR lpString2); - -/* ========================================================================== */ -/* Time: */ -void WINAPI GetSystemTime( - LPSYSTEMTIME lpSystemTime); -void WINAPI GetLocalTime( - LPSYSTEMTIME lpSystemTime); -BOOL WINAPI QueryProcessCycleTime( - HANDLE hProcess, - PULONG64 CycleTime); -BOOL WINAPI SystemTimeToFileTime( - const SYSTEMTIME * lpSystemTime, - LPFILETIME lpFileTime); -BOOL WINAPI FileTimeToSystemTime( - const FILETIME * lpFileTime, - LPSYSTEMTIME lpSystemTime); -LONG WINAPI CompareFileTime( - const FILETIME * lpFileTime1, - const FILETIME * lpFileTime2); -void WINAPI GetSystemTimeAsFileTime( - LPFILETIME lpSystemTimeAsFileTime); -BOOL WINAPI SystemTimeToTzSpecificLocalTime( - LPTIME_ZONE_INFORMATION lpTimeZone, - LPSYSTEMTIME lpUniversalTime, - LPSYSTEMTIME lpLocalTime); -DWORD timeGetTime(void); - -/* ========================================================================== */ -/* Environment: */ -BOOL WINAPI SetEnvironmentVariableA( - LPCSTR lpName, - LPCSTR lpValue); -BOOL WINAPI SetEnvironmentVariableW( - LPCWSTR lpName, - LPCWSTR lpValue); -DWORD WINAPI GetEnvironmentVariableA( - LPCSTR lpName, - LPCSTR lpBuffer, - DWORD nSize); -DWORD WINAPI GetEnvironmentVariableW( - LPCWSTR lpName, - LPCWSTR lpBuffer, - DWORD nSize); - -/* ========================================================================== */ -/* Misc Functions: */ -BOOL WINAPI DisableThreadLibraryCalls( - HMODULE hModule); -DWORD WINAPI GetLastError(void); -void WINAPI Sleep( - DWORD dwMilliseconds); -DWORD WINAPI SleepEx( - DWORD dwMilliseconds, - BOOL bAlertable); -HMODULE WINAPI GetModuleHandleA( - LPCSTR lpModuleName); -HMODULE WINAPI GetModuleHandleW( - LPCWSTR lpModuleName); -DWORD WINAPI FormatMessageA( - DWORD dwFlags, - LPCVOID lpSource, - DWORD dwMessageId, - DWORD dwLanguageId, - LPSTR lpBuffer, - DWORD nSize, - va_list *Arguments); -DWORD WINAPI FormatMessageW( - DWORD dwFlags, - LPCVOID lpSource, - DWORD dwMessageId, - DWORD dwLanguageId, - LPWSTR lpBuffer, - DWORD nSize, - va_list *Arguments); - - -/* ========================================================================== */ -/* Timer Functions: */ -DWORD WINAPI GetTickCount(void); -ULONGLONG WINAPI GetTickCount64(void); -BOOL WINAPI QueryPerformanceFrequency( - LARGE_INTEGER *lpFrequency); -BOOL WINAPI QueryPerformanceCounter( - LARGE_INTEGER *lpPerformanceCount); - - -/* ========================================================================== */ -/* Multi Media Timer: */ -#define TIMERR_NOERROR (0) /* no error */ -#define TIMERR_NOCANDO (TIMERR_BASE+1) /* request not completed */ -#define TIMERR_STRUCT (TIMERR_BASE+33) /* time struct size */ - -typedef struct timecaps_tag { - UINT wPeriodMin; /* minimum period supported */ - UINT wPeriodMax; /* maximum period supported */ -} TIMECAPS, *PTIMECAPS, *NPTIMECAPS, *LPTIMECAPS; -typedef UINT MMRESULT; - -MMRESULT WINAPI timeGetDevCaps(LPTIMECAPS ptc, UINT cbtc); -MMRESULT WINAPI timeBeginPeriod(UINT uPeriod); -MMRESULT WINAPI timeEndPeriod(UINT uPeriod); - - -/* ========================================================================== */ -/* DLL Functions: */ -HMODULE WINAPI LoadLibraryA( - LPCSTR lpFileName); -HMODULE WINAPI LoadLibraryW( - LPCWSTR lpFileName); -HMODULE WINAPI LoadLibraryExA( - LPCSTR lpLibFileName, - HANDLE hFile, - DWORD dwFlags); -HMODULE WINAPI LoadLibraryExW( - LPCWSTR lpLibFileName, - HANDLE hFile, - DWORD dwFlags); -FARPROC WINAPI GetProcAddress( - HMODULE hModule, - LPCSTR lProcName); -PROC WINAPI wglGetProcAddress( - LPCSTR lpszProc); -BOOL WINAPI FreeLibrary( - HMODULE hModule); - -/* ========================================================================== */ -/* Libc Replacements: */ -PVOID SecureZeroMemory( - PVOID ptr, - SIZE_T cnt); - -VOID __stosb( - PBYTE Destination, - BYTE Value, - SIZE_T Count); - -VOID __stosw( - PWORD Destination, - WORD Value, - SIZE_T Count); - -VOID __stosd( - PDWORD Destination, - DWORD Value, - SIZE_T Count); - -VOID __stosq( - PDWORD64 Destination, - DWORD64 Value, - SIZE_T Count); - -#pragma intrinsic(__stosb) -#pragma intrinsic(__stosw) -#pragma intrinsic(__stosd) -#pragma intrinsic(__stosq) - -FORCEINLINE PVOID SecureZeroMemory( - PVOID ptr, - SIZE_T cnt) -{ - volatile char* vptr = (volatile char*)ptr; - -#if defined(_M_AMD64) - __stosb((PBYTE)((DWORD64)vptr), 0, cnt); -#else - while (cnt) - { -# if !defined(_M_CEE) && (defined(_M_ARM) || defined(_M_ARM64)) - __iso_volatile_store8(vptr, 0); -# else - * vptr = 0; -# endif - - vptr++; - cnt--; - } - -#endif // _M_AMD64 - - return ptr; -} - -_NODISCARD _Check_return_ -int __cdecl memcmp( - _In_reads_bytes_(_Size) void const* _Buf1, - _In_reads_bytes_(_Size) void const* _Buf2, - _In_ size_t _Size -); - -_CRT_INSECURE_DEPRECATE_MEMORY(memmove_s) -_VCRTIMP void* __cdecl memmove( - _Out_writes_bytes_all_opt_(_Size) void* _Dst, - _In_reads_bytes_opt_(_Size) void const* _Src, - _In_ size_t _Size -); - -void* __cdecl memcpy( - _Out_writes_bytes_all_(_Size) void* _Dst, - _In_reads_bytes_(_Size) void const* _Src, - _In_ size_t _Size -); - -void* __cdecl memset( - _Out_writes_bytes_all_(_Size) void* _Dst, - _In_ int _Val, - _In_ size_t _Size -); - - -#define RtlEqualMemory(Destination,Source,Length) (!memcmp((Destination),(Source),(Length))) -#define RtlMoveMemory(Destination,Source,Length) memmove((Destination),(Source),(Length)) -#define RtlCopyMemory(Destination,Source,Length) memcpy((Destination),(Source),(Length)) -#define RtlFillMemory(Destination,Length,Fill) memset((Destination),(Fill),(Length)) -#define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length)) - -#define MoveMemory RtlMoveMemory -#define CopyMemory RtlCopyMemory -#define FillMemory RtlFillMemory -#define ZeroMemory RtlZeroMemory - -UINT WINAPI GetDoubleClickTime(VOID); -BOOL WINAPI SetDoubleClickTime(UINT); - -#if defined(__cplusplus) -} -#endif - -/* Enable all warnings */ -#if defined(_MSC_VER) - #pragma warning(pop) -#endif - -#endif /* WINDOWS_MISC_H */ -#endif /* _WINDOWS_ */ - diff --git a/exe_load/include/process.h b/exe_load/include/process.h deleted file mode 100644 index b277257..0000000 --- a/exe_load/include/process.h +++ /dev/null @@ -1,290 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Arvid Gerstmann. All rights reserved. - */ -#ifndef _WINDOWS_ -#ifndef WINDOWS_PROCESS_H -#define WINDOWS_PROCESS_H - -/* Disable all warnings */ -#if defined(_MSC_VER) - #pragma warning(push, 0) -#endif - -#ifndef WINDOWS_BASE_H -#include "windows_base.h" -#endif -#if defined(__cplusplus) -extern "C" { -#endif - -/* Originally defined in threads.h */ -#ifndef INFINITE -#define INFINITE 0xffffffff -#endif - -/* Originally defined in file.h */ -#ifndef STANDARD_RIGHTS_REQUIRED -#define STANDARD_RIGHTS_REQUIRED 0x000F0000L -#endif -#ifndef SYNCHRONIZE -#define SYNCHRONIZE 0x00100000L -#endif - -/* Process Access Rights: */ -#define PROCESS_DUP_HANDLE (0x0040) -#define PROCESS_QUERY_INFORMATION (0x0400) -#define PROCESS_SUSPEND_RESUME (0x0800) -#define PROCESS_TERMINATE (0x0001) -#define PROCESS_VM_READ (0x0010) -#define PROCESS_ALL_ACCESS \ - (STANDARD_RIGHTS_REQUIRED | \ - SYNCHRONIZE | \ - 0xFFFF) - -/* Tokens: */ -#define TOKEN_ASSIGN_PRIMARY (0x0001) -#define TOKEN_DUPLICATE (0x0002) -#define TOKEN_IMPERSONATE (0x0004) -#define TOKEN_QUERY (0x0008) -#define TOKEN_QUERY_SOURCE (0x0010) -#define TOKEN_ADJUST_PRIVILEGES (0x0020) -#define TOKEN_ADJUST_GROUPS (0x0040) -#define TOKEN_ADJUST_DEFAULT (0x0080) -#define TOKEN_ADJUST_SESSIONID (0x0100) - -#define TOKEN_ALL_ACCESS_P (STANDARD_RIGHTS_REQUIRED | \ - TOKEN_ASSIGN_PRIMARY | \ - TOKEN_DUPLICATE | \ - TOKEN_IMPERSONATE | \ - TOKEN_QUERY | \ - TOKEN_QUERY_SOURCE | \ - TOKEN_ADJUST_PRIVILEGES | \ - TOKEN_ADJUST_GROUPS | \ - TOKEN_ADJUST_DEFAULT) - -#define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L) -#define SE_PRIVILEGE_ENABLED (0x00000002L) -#define SE_PRIVILEGE_REMOVED (0X00000004L) -#define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L) - -/* Status */ -#define STATUS_WAIT_0 ((DWORD)0x00000000L) -#define STATUS_TIMEOUT ((DWORD)0x00000102L) -#define STATUS_PENDING ((DWORD)0x00000103L) -#define STILL_ACTIVE STATUS_PENDING - -/* Startupinfo */ -#define STARTF_USESHOWWINDOW 0x00000001 -#define STARTF_USESIZE 0x00000002 -#define STARTF_USEPOSITION 0x00000004 -#define STARTF_USECOUNTCHARS 0x00000008 -#define STARTF_USEFILLATTRIBUTE 0x00000010 -#define STARTF_RUNFULLSCREEN 0x00000020 -#define STARTF_FORCEONFEEDBACK 0x00000040 -#define STARTF_FORCEOFFFEEDBACK 0x00000080 -#define STARTF_USESTDHANDLES 0x00000100 - - -/* Priority Classes / CreateProcess: */ -#define NORMAL_PRIORITY_CLASS 0x00000020 - -/* Job Objects: */ -#define JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE 0x00002000 -typedef enum _JOBOBJECTINFOCLASS { - JobObjectBasicAccountingInformation = 1, - JobObjectBasicLimitInformation, - JobObjectBasicProcessIdList, - JobObjectBasicUIRestrictions, - JobObjectSecurityLimitInformation, // deprecated - JobObjectEndOfJobTimeInformation, - JobObjectAssociateCompletionPortInformation, - JobObjectBasicAndIoAccountingInformation, - JobObjectExtendedLimitInformation, - JobObjectJobSetInformation, - JobObjectGroupInformation, - JobObjectNotificationLimitInformation, - JobObjectLimitViolationInformation, - JobObjectGroupInformationEx, - JobObjectCpuRateControlInformation, - JobObjectCompletionFilter, - JobObjectCompletionCounter, - JobObjectReserved1Information = 18, - JobObjectReserved2Information, - JobObjectReserved3Information, - JobObjectReserved4Information, - JobObjectReserved5Information, - JobObjectReserved6Information, - JobObjectReserved7Information, - JobObjectReserved8Information, - JobObjectReserved9Information, - MaxJobObjectInfoClass -} JOBOBJECTINFOCLASS; - -/* Process: */ -typedef struct _STARTUPINFOA { - DWORD cb; - LPSTR lpReserved; - LPSTR lpDesktop; - LPSTR lpTitle; - DWORD dwX; - DWORD dwY; - DWORD dwXSize; - DWORD dwYSize; - DWORD dwXCountChars; - DWORD dwYCountChars; - DWORD dwFillAttribute; - DWORD dwFlags; - WORD wShowWindow; - WORD cbReserved2; - LPBYTE lpReserved2; - HANDLE hStdInput; - HANDLE hStdOutput; - HANDLE hStdError; -} STARTUPINFOA, *LPSTARTUPINFOA; -typedef struct _STARTUPINFOW { - DWORD cb; - LPWSTR lpReserved; - LPWSTR lpDesktop; - LPWSTR lpTitle; - DWORD dwX; - DWORD dwY; - DWORD dwXSize; - DWORD dwYSize; - DWORD dwXCountChars; - DWORD dwYCountChars; - DWORD dwFillAttribute; - DWORD dwFlags; - WORD wShowWindow; - WORD cbReserved2; - LPBYTE lpReserved2; - HANDLE hStdInput; - HANDLE hStdOutput; - HANDLE hStdError; -} STARTUPINFOW, *LPSTARTUPINFOW; - -typedef struct _PROC_THREAD_ATTRIBUTE_LIST -*PPROC_THREAD_ATTRIBUTE_LIST, *LPPROC_THREAD_ATTRIBUTE_LIST; -typedef struct _STARTUPINFOEXA { - STARTUPINFOA StartupInfo; - PPROC_THREAD_ATTRIBUTE_LIST lpAttributeList; -} STARTUPINFOEXA, *LPSTARTUPINFOEXA; -typedef struct _STARTUPINFOEXW { - STARTUPINFOW StartupInfo; - PPROC_THREAD_ATTRIBUTE_LIST lpAttributeList; -} STARTUPINFOEXW, *LPSTARTUPINFOEXW; -typedef struct _PROCESS_INFORMATION { - HANDLE hProcess; - HANDLE hThread; - DWORD dwProcessId; - DWORD dwThreadId; -} PROCESS_INFORMATION, *LPPROCESS_INFORMATION; - -/* Job Objects: */ -typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION { - LARGE_INTEGER PerProcessUserTimeLimit; - LARGE_INTEGER PerJobUserTimeLimit; - DWORD LimitFlags; - SIZE_T MinimumWorkingSetSize; - SIZE_T MaximumWorkingSetSize; - DWORD ActiveProcessLimit; - ULONG_PTR Affinity; - DWORD PriorityClass; - DWORD SchedulingClass; -} JOBOBJECT_BASIC_LIMIT_INFORMATION, *PJOBOBJECT_BASIC_LIMIT_INFORMATION; - -typedef struct _IO_COUNTERS { - ULONGLONG ReadOperationCount; - ULONGLONG WriteOperationCount; - ULONGLONG OtherOperationCount; - ULONGLONG ReadTransferCount; - ULONGLONG WriteTransferCount; - ULONGLONG OtherTransferCount; -} IO_COUNTERS, *PIO_COUNTERS; - -typedef struct _JOBOBJECT_EXTENDED_LIMIT_INFORMATION { - JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation; - IO_COUNTERS IoInfo; - SIZE_T ProcessMemoryLimit; - SIZE_T JobMemoryLimit; - SIZE_T PeakProcessMemoryUsed; - SIZE_T PeakJobMemoryUsed; -} JOBOBJECT_EXTENDED_LIMIT_INFORMATION, *PJOBOBJECT_EXTENDED_LIMIT_INFORMATION; - - -/* ========================================================================== */ -/* Process: */ -HANDLE WINAPI GetCurrentProcess(void); -DWORD WINAPI GetCurrentProcessId(void); -void WINAPI ExitProcess(UINT uExitCode); -HANDLE WINAPI OpenProcess( - DWORD dwDesiredAccess, - BOOL bInheritHandle, - DWORD dwProcessId); -BOOL WINAPI CreateProcessA( - LPCSTR lpApplicationName, - LPSTR lpCommandLine, - LPSECURITY_ATTRIBUTES lpProcessAttributes, - LPSECURITY_ATTRIBUTES lpThreadAttributes, - BOOL bInheritHandles, - DWORD dwCreationFlags, - LPVOID lpEnvironment, - LPCSTR lpCurrentDirectory, - LPSTARTUPINFOA lpStartupInfo, - LPPROCESS_INFORMATION lpProcessInformation); -BOOL WINAPI CreateProcessW( - LPCWSTR lpApplicationName, - LPWSTR lpCommandLine, - LPSECURITY_ATTRIBUTES lpProcessAttributes, - LPSECURITY_ATTRIBUTES lpThreadAttributes, - BOOL bInheritHandles, - DWORD dwCreationFlags, - LPVOID lpEnvironment, - LPCWSTR lpCurrentDirectory, - LPSTARTUPINFOW lpStartupInfo, - LPPROCESS_INFORMATION lpProcessInformation); -BOOL WINAPI TerminateProcess( - HANDLE hProcess, - UINT uExitCode); -BOOL WINAPI EnumProcessModules( - HANDLE hProcess, - HMODULE * lphModule, - DWORD cb, - LPDWORD lpcbNeeded); -DWORD WINAPI WaitForInputIdle( - HANDLE hProcess, - DWORD dwMilliseconds); -BOOL WINAPI GetExitCodeProcess( - HANDLE hProcess, - LPDWORD lpExitCode); - -/* ========================================================================== */ -/* Jobs: */ -HANDLE WINAPI CreateJobObjectA( - LPSECURITY_ATTRIBUTES lpJobAttributes, - LPCSTR lpName); -HANDLE WINAPI CreateJobObjectW( - LPSECURITY_ATTRIBUTES lpJobAttributes, - LPCWSTR lpName); -BOOL WINAPI SetInformationJobObject( - HANDLE hJob, - JOBOBJECTINFOCLASS JobObjectInfoClass, - LPVOID lpJobObjectInfo, - DWORD cbJobObjectInfoLength); -BOOL WINAPI AssignProcessToJobObject( - HANDLE hJob, - HANDLE hProcess); - - -#if defined(__cplusplus) -} -#endif - -/* Enable all warnings */ -#if defined(_MSC_VER) - #pragma warning(pop) -#endif - -#endif /* WINDOWS_PROCESS_H */ -#endif /* _WINDOWS_ */ - diff --git a/exe_load/include/sysinfo.h b/exe_load/include/sysinfo.h deleted file mode 100644 index 9aa8334..0000000 --- a/exe_load/include/sysinfo.h +++ /dev/null @@ -1,596 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Arvid Gerstmann. All rights reserved. - */ -#ifndef _WINDOWS_ -#ifndef WINDOWS_SYSINFO_H -#define WINDOWS_SYSINFO_H - -/* Disable all warnings */ -#if defined(_MSC_VER) - #pragma warning(push, 0) -#endif - -#ifndef WINDOWS_BASE_H -#include "windows_base.h" -#endif -#if defined(__cplusplus) -extern "C" { -#endif - -/* Display Devices: */ -#define DISPLAY_DEVICE_ACTIVE 0x00000001 -#define DISPLAY_DEVICE_ATTACHED 0x00000002 -#define DISPLAY_DEVICE_PRIMARY_DEVICE 0x00000004 - -/* System Metrics */ -#define SM_CXSCREEN 0 -#define SM_CYSCREEN 1 -#define SM_CMONITORS 80 - -/* Versions */ -#define VER_EQUAL 1 -#define VER_GREATER 2 -#define VER_GREATER_EQUAL 3 -#define VER_LESS 4 -#define VER_LESS_EQUAL 5 -#define VER_AND 6 -#define VER_OR 7 - -#define _WIN32_WINNT_WINXP 0x0501 -#define _WIN32_WINNT_WS03 0x0502 -#define _WIN32_WINNT_VISTA 0x0600 -#define _WIN32_WINNT_WS08 0x0600 -#define _WIN32_WINNT_WIN7 0x0601 -#define _WIN32_WINNT_WIN8 0x0602 -#define _WIN32_WINNT_WIN81 0x0603 -#define _WIN32_WINNT_WIN10 0x0A00 - -#define VER_MINORVERSION 0x0000001 -#define VER_MAJORVERSION 0x0000002 -#define VER_BUILDNUMBER 0x0000004 -#define VER_PLATFORMID 0x0000008 -#define VER_SERVICEPACKMINOR 0x0000010 -#define VER_SERVICEPACKMAJOR 0x0000020 - -/* Registry Key Classes */ -#define HKEY_CLASSES_ROOT ((HKEY)(ULONG_PTR)((LONG)0x80000000)) -#define HKEY_CURRENT_USER ((HKEY)(ULONG_PTR)((LONG)0x80000001)) -#define HKEY_LOCAL_MACHINE ((HKEY)(ULONG_PTR)((LONG)0x80000002)) -#define HKEY_USERS ((HKEY)(ULONG_PTR)((LONG)0x80000003)) - -/* Registry Types */ -#define REG_NONE 0 -#define REG_SZ 1 -#define REG_EXPAND_SZ 2 - -#define REG_BINARY 3 -#define REG_DWORD 4 -#define REG_DWORD_LITTLE_ENDIAN 4 -#define REG_DWORD_BIG_ENDIAN 5 -#define REG_LINK 6 -#define REG_MULTI_SZ 7 -#define REG_RESOURCE_LIST 8 -#define REG_FULL_RESOURCE_DESCRIPTOR 9 -#define REG_RESOURCE_REQUIREMENTS_LIST 10 -#define REG_QWORD 11 -#define REG_QWORD_LITTLE_ENDIAN 11 - - -/* Registry Access Rights */ -#define KEY_QUERY_VALUE 0x0001 -#define KEY_SET_VALUE 0x0002 -#define KEY_CREATE_SUB_KEY 0x0004 -#define KEY_ENUMERATE_SUB_KEYS 0x0008 -#define KEY_NOTIFY 0x0010 -#define KEY_CREATE_LINK 0x0020 -#define KEY_WOW64_32KEY 0x0200 -#define KEY_WOW64_64KEY 0x0100 -#define KEY_WOW64_RES 0x0300 - -#define KEY_READ \ - ((STANDARD_RIGHTS_READ \ - | KEY_QUERY_VALUE \ - | KEY_ENUMERATE_SUB_KEYS \ - | KEY_NOTIFY) \ - & (~SYNCHRONIZE)) - -#define KEY_WRITE \ - ((STANDARD_RIGHTS_WRITE \ - | KEY_SET_VALUE \ - | KEY_CREATE_SUB_KEY) \ - & (~SYNCHRONIZE)) - -#define KEY_EXECUTE \ - ((KEY_READ) \ - & (~SYNCHRONIZE)) - -#define KEY_ALL_ACCESS \ - ((STANDARD_RIGHTS_ALL \ - | KEY_QUERY_VALUE \ - | KEY_SET_VALUE \ - | KEY_CREATE_SUB_KEY \ - | KEY_ENUMERATE_SUB_KEYS \ - | KEY_NOTIFY \ - | KEY_CREATE_LINK) \ - & (~SYNCHRONIZE)) - - -/* ========================================================================== */ -/* Structures: */ -typedef struct _SYSTEM_INFO { - union { - DWORD dwOemId; - struct { - WORD wProcessorArchitecture; - WORD wReserved; - }; - }; - - DWORD dwPageSize; - LPVOID lpMinimumApplicationAddress; - LPVOID lpMaximumApplicationAddress; - DWORD_PTR dwActiveProcessorMask; - DWORD dwNumberOfProcessors; - DWORD dwProcessorType; - DWORD dwAllocationGranularity; - WORD wProcessorLevel; - WORD wProcessorRevision; -} SYSTEM_INFO, *LPSYSTEM_INFO; - -/* Device Context: */ -typedef struct _DISPLAY_DEVICEA { - DWORD cb; - CHAR DeviceName[32]; - CHAR DeviceString[128]; - DWORD StateFlags; - CHAR DeviceID[128]; - CHAR DeviceKey[128]; -} DISPLAY_DEVICEA, *PDISPLAY_DEVICEA; -typedef struct _DISPLAY_DEVICEW { - DWORD cb; - WCHAR DeviceName[32]; - WCHAR DeviceString[128]; - DWORD StateFlags; - WCHAR DeviceID[128]; - WCHAR DeviceKey[128]; -} DISPLAY_DEVICEW, *PDISPLAY_DEVICEW; - -/* Version: */ -typedef struct _OSVERSIONINFOEXA { - DWORD dwOSVersionInfoSize; - DWORD dwMajorVersion; - DWORD dwMinorVersion; - DWORD dwBuildNumber; - DWORD dwPlatformId; - CHAR szCSDVersion[128]; - WORD wServicePackMajor; - WORD wServicePackMinor; - WORD wSuiteMask; - BYTE wProductType; - BYTE wReserved; -} OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA; -typedef struct _OSVERSIONINFOEXW { - DWORD dwOSVersionInfoSize; - DWORD dwMajorVersion; - DWORD dwMinorVersion; - DWORD dwBuildNumber; - DWORD dwPlatformId; - WCHAR szCSDVersion[128]; - WORD wServicePackMajor; - WORD wServicePackMinor; - WORD wSuiteMask; - BYTE wProductType; - BYTE wReserved; -} OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW; - -/* SysInfo: */ -typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP { - RelationProcessorCore, - RelationNumaNode, - RelationCache, - RelationProcessorPackage, - RelationGroup, - RelationAll = 0xffff -} LOGICAL_PROCESSOR_RELATIONSHIP; -typedef enum _PROCESSOR_CACHE_TYPE { - CacheUnified, - CacheInstruction, - CacheData, - CacheTrace -} PROCESSOR_CACHE_TYPE; -typedef struct _CACHE_DESCRIPTOR { - BYTE Level; - BYTE Associativity; - WORD LineSize; - DWORD Size; - PROCESSOR_CACHE_TYPE Type; -} CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR; -typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION { - ULONG_PTR ProcessorMask; - LOGICAL_PROCESSOR_RELATIONSHIP Relationship; - union { - struct { - BYTE Flags; - } ProcessorCore; - struct { - DWORD NodeNumber; - } NumaNode; - CACHE_DESCRIPTOR Cache; - ULONGLONG Reserved[2]; - }; -} SYSTEM_LOGICAL_PROCESSOR_INFORMATION, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION; - -/* Processor Information Extended */ -typedef ULONG_PTR KAFFINITY; -typedef struct _GROUP_AFFINITY { - KAFFINITY Mask; - WORD Group; - WORD Reserved[3]; -} GROUP_AFFINITY, *PGROUP_AFFINITY; -typedef struct _NUMA_NODE_RELATIONSHIP { - DWORD NodeNumber; - BYTE Reserved[20]; - GROUP_AFFINITY GroupMask; -} NUMA_NODE_RELATIONSHIP, *PNUMA_NODE_RELATIONSHIP; - -typedef struct _PROCESSOR_GROUP_INFO { - BYTE MaximumProcessorCount; - BYTE ActiveProcessorCount; - BYTE Reserved[38]; - KAFFINITY ActiveProcessorMask; -} PROCESSOR_GROUP_INFO, *PPROCESSOR_GROUP_INFO; -typedef struct _GROUP_RELATIONSHIP { - WORD MaximumGroupCount; - WORD ActiveGroupCount; - BYTE Reserved[20]; - PROCESSOR_GROUP_INFO GroupInfo[1]; -} GROUP_RELATIONSHIP, *PGROUP_RELATIONSHIP; - -typedef struct _CACHE_RELATIONSHIP { - BYTE Level; - BYTE Associativity; - WORD LineSize; - DWORD CacheSize; - PROCESSOR_CACHE_TYPE Type; - BYTE Reserved[20]; - GROUP_AFFINITY GroupMask; -} CACHE_RELATIONSHIP, *PCACHE_RELATIONSHIP; - -typedef struct _PROCESSOR_RELATIONSHIP { - BYTE Flags; - BYTE EfficiencyClass; - BYTE Reserved[21]; - WORD GroupCount; - GROUP_AFFINITY GroupMask[1]; -} PROCESSOR_RELATIONSHIP, *PPROCESSOR_RELATIONSHIP; - -typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX { - LOGICAL_PROCESSOR_RELATIONSHIP Relationship; - DWORD Size; - union { - PROCESSOR_RELATIONSHIP Processor; - NUMA_NODE_RELATIONSHIP NumaNode; - CACHE_RELATIONSHIP Cache; - GROUP_RELATIONSHIP Group; - }; -} SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX; - -typedef struct _PROCESS_MEMORY_COUNTERS { - DWORD cb; - DWORD PageFaultCount; - SIZE_T PeakWorkingSetSize; - SIZE_T WorkingSetSize; - SIZE_T QuotaPeakPagedPoolUsage; - SIZE_T QuotaPagedPoolUsage; - SIZE_T QuotaPeakNonPagedPoolUsage; - SIZE_T QuotaNonPagedPoolUsage; - SIZE_T PagefileUsage; - SIZE_T PeakPagefileUsage; -} PROCESS_MEMORY_COUNTERS, *PPROCESS_MEMORY_COUNTERS; - -/* Memory: */ -typedef struct _MEMORYSTATUSEX { - DWORD dwLength; - DWORD dwMemoryLoad; - DWORDLONG ullTotalPhys; - DWORDLONG ullAvailPhys; - DWORDLONG ullTotalPageFile; - DWORDLONG ullAvailPageFile; - DWORDLONG ullTotalVirtual; - DWORDLONG ullAvailVirtual; - DWORDLONG ullAvailExtendedVirtual; -} MEMORYSTATUSEX, *LPMEMORYSTATUSEX; - -/* Processor: */ -typedef struct _PROCESSOR_NUMBER { - WORD Group; - BYTE Number; - BYTE Reserved; -} PROCESSOR_NUMBER, *PPROCESSOR_NUMBER; - - -/* ========================================================================== */ -/* System Info Functions: */ -void WINAPI GetSystemInfo( - LPSYSTEM_INFO lpSystemInfo); -BOOL WINAPI GlobalMemoryStatusEx( - LPMEMORYSTATUSEX lpBuffer); -BOOL WINAPI GetLogicalProcessorInformation( - PSYSTEM_LOGICAL_PROCESSOR_INFORMATION Buffer, - PDWORD ReturnedLength); -BOOL GetLogicalProcessorInformationEx( - LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType, - PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Buffer, - PDWORD ReturnedLength); -BOOL WINAPI GetProcessMemoryInfo( - HANDLE hProcess, - PPROCESS_MEMORY_COUNTERS ppsmemCounters, - DWORD cb); -BOOL WINAPI GetProcessTimes( - HANDLE hProcess, - LPFILETIME lpCreationTime, - LPFILETIME lpExitTime, - LPFILETIME lpKernelTime, - LPFILETIME lpUserTime); - -/* ========================================================================== */ -/* Processor Functions */ -DWORD WINAPI GetCurrentProcessorNumber(void); -void GetCurrentProcessorNumberEx(PPROCESSOR_NUMBER ProcNumber); -#define ALL_PROCESSOR_GROUPS 0xffff -DWORD GetActiveProcessorCount(WORD GroupNumber); - - -#define MAX_COMPUTERNAME_LENGTH 31 -BOOL WINAPI GetComputerNameA( - LPSTR lpBuffer, - LPDWORD lpnSize); -BOOL WINAPI GetComputerNameW( - LPWSTR lpBuffer, - LPDWORD lpnSize); - -/* Version: */ -BOOL WINAPI VerifyVersionInfoA( - LPOSVERSIONINFOEXA lpVersionInfo, - DWORD dwTypeMask, - DWORDLONG dwlConditionMask); -BOOL WINAPI VerifyVersionInfoW( - LPOSVERSIONINFOEXW lpVersionInfo, - DWORD dwTypeMask, - DWORDLONG dwlConditionMask); -ULONGLONG WINAPI VerSetConditionMask( - ULONGLONG ConditionMask, - DWORD TypeMask, - BYTE Condition); - -FORCEINLINE BOOL -IsWindowsVersionOrGreater(WORD major, WORD minor, WORD servpack) -{ - OSVERSIONINFOEXW vi = { sizeof(vi), major, minor, 0, 0, {0}, servpack }; - return VerifyVersionInfoW(&vi, - VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, - VerSetConditionMask( - VerSetConditionMask( - VerSetConditionMask(0, - VER_MAJORVERSION, VER_GREATER_EQUAL), - VER_MINORVERSION,VER_GREATER_EQUAL), - VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL)); -} - -FORCEINLINE BOOL -IsWindowsVersionOrLess(WORD major, WORD minor, WORD servpack) -{ - OSVERSIONINFOEXW vi = { sizeof(vi), major, minor, 0, 0, {0}, servpack }; - return VerifyVersionInfoW(&vi, - VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, - VerSetConditionMask( - VerSetConditionMask( - VerSetConditionMask(0, - VER_MAJORVERSION, VER_LESS_EQUAL), - VER_MINORVERSION,VER_LESS_EQUAL), - VER_SERVICEPACKMAJOR, VER_LESS_EQUAL)); -} - -#define GREATER IsWindowsVersionOrGreater -FORCEINLINE void -GetWindowsVersionCUSTOM(PWORD major, PWORD minor, PWORD srvpack) -{ - if (GREATER(HIBYTE(_WIN32_WINNT_WIN10), LOBYTE(_WIN32_WINNT_WIN10), 0)) { - *major = 10; - *minor = 0; - *srvpack = 0; - } else if (GREATER(HIBYTE(_WIN32_WINNT_WIN81), LOBYTE(_WIN32_WINNT_WIN81), 0)) { - *major = 6; - *minor = 3; - *srvpack = 0; - } else if (GREATER(HIBYTE(_WIN32_WINNT_WIN8), LOBYTE(_WIN32_WINNT_WIN8), 0)) { - *major = 6; - *minor = 2; - *srvpack = 0; - } else if (GREATER(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 1)) { - *major = 6; - *minor = 1; - *srvpack = 1; - } else if (GREATER(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0)) { - *major = 6; - *minor = 1; - *srvpack = 0; - } else if (GREATER(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 2)) { - *major = 6; - *minor = 0; - *srvpack = 2; - } else if (GREATER(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 1)) { - *major = 6; - *minor = 0; - *srvpack = 1; - } else if (GREATER(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0)) { - *major = 6; - *minor = 0; - *srvpack = 0; - } else if (GREATER(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 3)) { - *major = 5; - *minor = 1; - *srvpack = 2; - } else if (GREATER(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 1)) { - *major = 5; - *minor = 1; - *srvpack = 1; - } else if (GREATER(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0)) { - *major = 5; - *minor = 1; - *srvpack = 0; - } else { - *major = 0; - *minor = 0; - *srvpack = 0; - } -} -#undef GREATER - - -/* ========================================================================== */ -/* CPUID: */ -void __cpuid(int cpuInfo[4], int function_id); -void __cpuidex(int cpuInfo[4], int function_id, int subfunction_id); - -/* ========================================================================== */ -/* Device Context: */ -BOOL WINAPI EnumDisplayDevicesA( - LPCSTR lpDevice, - DWORD iDevNum, - PDISPLAY_DEVICEA lpDisplayDevice, - DWORD dwFlags); -BOOL WINAPI EnumDisplayDevicesW( - LPCWSTR lpDevice, - DWORD iDevNum, - PDISPLAY_DEVICEW lpDisplayDevice, - DWORD dwFlags); - -/* ========================================================================== */ -/* Registry: */ -LONG WINAPI RegOpenKeyExA( - HKEY hKey, - LPCSTR lpSubKey, - DWORD ulOptions, - REGSAM samDesired, - PHKEY phkResult); -LONG WINAPI RegOpenKeyExW( - HKEY hKey, - LPCWSTR lpSubKey, - DWORD ulOptions, - REGSAM samDesired, - PHKEY phkResult); -LONG WINAPI RegQueryValueExA( - HKEY hKey, - LPCSTR lpValueName, - LPDWORD lpReserved, - LPDWORD lpType, - LPBYTE lpData, - LPDWORD lpcbData); -LONG WINAPI RegQueryValueExW( - HKEY hKey, - LPCWSTR lpValueName, - LPDWORD lpReserved, - LPDWORD lpType, - LPBYTE lpData, - LPDWORD lpcbData); -LONG WINAPI RegCreateKeyExA( - HKEY hKey, - LPCSTR lpSubKey, - DWORD Reserved, - LPSTR lpClass, - DWORD dwOptions, - REGSAM samDesired, - LPSECURITY_ATTRIBUTES lpSecurityAttributes, - PHKEY phkResult, - LPDWORD lpdwDisposition); -LONG WINAPI RegCreateKeyExW( - HKEY hKey, - LPCWSTR lpSubKey, - DWORD Reserved, - LPWSTR lpClass, - DWORD dwOptions, - REGSAM samDesired, - LPSECURITY_ATTRIBUTES lpSecurityAttributes, - PHKEY phkResult, - LPDWORD lpdwDisposition); -LONG WINAPI RegEnumValueA( - HKEY hKey, - DWORD dwIndex, - LPSTR lpValueName, - LPDWORD lpcchValueName, - LPDWORD lpReserved, - LPDWORD lpType, - LPBYTE lpData, - LPDWORD lpcbData); -LONG WINAPI RegEnumValueW( - HKEY hKey, - DWORD dwIndex, - LPWSTR lpValueName, - LPDWORD lpcchValueName, - LPDWORD lpReserved, - LPDWORD lpType, - LPBYTE lpData, - LPDWORD lpcbData); -LONG WINAPI RegQueryInfoKeyA( - HKEY hKey, - LPSTR lpClass, - LPDWORD lpcClass, - LPDWORD lpReserved, - LPDWORD lpcSubKeys, - LPDWORD lpcMaxSubKeyLen, - LPDWORD lpcMaxClassLen, - LPDWORD lpcValues, - LPDWORD lpcMaxValueNameLen, - LPDWORD lpcMaxValueLen, - LPDWORD lpcbSecurityDescriptor, - PFILETIME lpftLastWriteTime); -LONG WINAPI RegQueryInfoKeyW( - HKEY hKey, - LPWSTR lpClass, - LPDWORD lpcClass, - LPDWORD lpReserved, - LPDWORD lpcSubKeys, - LPDWORD lpcMaxSubKeyLen, - LPDWORD lpcMaxClassLen, - LPDWORD lpcValues, - LPDWORD lpcMaxValueNameLen, - LPDWORD lpcMaxValueLen, - LPDWORD lpcbSecurityDescriptor, - PFILETIME lpftLastWriteTime); -LONG WINAPI RegEnumKeyExA( - HKEY hKey, - DWORD dwIndex, - LPSTR lpName, - LPDWORD lpcName, - LPDWORD lpReserved, - LPSTR lpClass, - LPDWORD lpcClass, - PFILETIME lpftLastWriteTime); -LONG WINAPI RegEnumKeyExW( - HKEY hKey, - DWORD dwIndex, - LPWSTR lpName, - LPDWORD lpcName, - LPDWORD lpReserved, - LPWSTR lpClass, - LPDWORD lpcClass, - PFILETIME lpftLastWriteTime); -LONG WINAPI RegCloseKey( - HKEY hKey); -LONG WINAPI RegFlushKey( - HKEY hKey); - -#if defined(__cplusplus) -} -#endif - -/* Enable all warnings */ -#if defined(_MSC_VER) - #pragma warning(pop) -#endif - -#endif /* WINDOWS_SYSINFO_H */ -#endif /* _WINDOWS_ */ - diff --git a/exe_load/include/threads.h b/exe_load/include/threads.h deleted file mode 100644 index 7120ff1..0000000 --- a/exe_load/include/threads.h +++ /dev/null @@ -1,356 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Arvid Gerstmann. All rights reserved. - */ -#ifndef _WINDOWS_ -#ifndef WINDOWS_THREADS_H -#define WINDOWS_THREADS_H - -/* Disable all warnings */ -#if defined(_MSC_VER) - #pragma warning(push, 0) -#endif - -#ifndef WINDOWS_BASE_H -#include "windows_base.h" -#endif -#if defined(__cplusplus) -extern "C" { -#endif - -/* WaitForSingleObject, WaitForMultipleObjects, etc: */ -#define INFINITE 0xffffffff - -/* Originally defined in file.h */ -#ifndef STANDARD_RIGHTS_REQUIRED -#define STANDARD_RIGHTS_REQUIRED 0x000F0000L -#endif -#ifndef SYNCHRONIZE -#define SYNCHRONIZE 0x00100000L -#endif - -#define STATUS_WAIT_0 ((DWORD)0x00000000L) -#define STATUS_ABANDONED_WAIT_0 ((DWORD)0x00000080L) -#define STATUS_TIMEOUT ((DWORD)0x00000102L) -#define STATUS_PENDING ((DWORD)0x00000103L) - -#define WAIT_FAILED ((DWORD)0xffffffff) -#define WAIT_OBJECT_0 ((STATUS_WAIT_0) + 0) -#define WAIT_ABANDONED ((STATUS_ABANDONED_WAIT_0) + 0) -#define WAIT_TIMEOUT 258L - -/* TLS: */ -#ifndef TLS_OUT_OF_INDEXES -#define TLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF) -#endif -#ifndef FLS_OUT_OF_INDEXES -#define FLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF) -#endif - - -/* Thread creation flags: */ -#define CREATE_NEW_CONSOLE 0x00000010 -#define CREATE_NO_WINDOW 0x08000000 -#define CREATE_SUSPENDED 0x00000004 -#define DETACHED_PROCESS 0x00000008 - -/* Thread Access Rights: */ -#define THREAD_GET_CONTEXT (0x0008) -#define THREAD_QUERY_INFORMATION (0x0040) -#define THREAD_SUSPEND_RESUME (0x0002) -#define THREAD_TERMINATE (0x0001) -#define THREAD_ALL_ACCESS \ - (STANDARD_RIGHTS_REQUIRED | \ - SYNCHRONIZE | \ - 0xFFFF) - -/* Semaphore Access Rights: */ -#define SEMAPHORE_ALL_ACCESS 0x1F0003 -#define SEMAPHORE_MODIFY_STATE 0x0002 -#define EVENT_ALL_ACCESS 0x1F0003 -#define EVENT_MODIFY_STATE 0x0002 - - -/* ========================================================================== */ -/* Structures: */ -/* Magic for Thread Local Storage: */ -typedef void (NTAPI *PIMAGE_TLS_CALLBACK)( - PVOID DllHandle, - DWORD Reason, - PVOID Reserved); -typedef struct _IMAGE_TLS_DIRECTORY32 { - DWORD StartAddressOfRawData; - DWORD EndAddressOfRawData; - DWORD AddressOfIndex; - DWORD AddressOfCallbacks; - DWORD SizeOfZeroFill; - DWORD Characteristics; -} IMAGE_TLS_DIRECTORY32, *PIMAGE_TLS_DIRECTORY32; -typedef struct _IMAGE_TLS_DIRECTORY64 { - ULONGLONG StartAddressOfRawData; - ULONGLONG EndAddressOfRawData; - ULONGLONG AddressOfIndex; - ULONGLONG AddressOfCallbacks; - DWORD SizeOfZeroFill; - DWORD Characteristics; -} IMAGE_TLS_DIRECTORY64, *PIMAGE_TLS_DIRECTORY64; -#if defined(_WIN64) -typedef IMAGE_TLS_DIRECTORY64 IMAGE_TLS_DIRECTORY; -typedef PIMAGE_TLS_DIRECTORY64 PIMAGE_TLS_DIRECTORY; -#else -typedef IMAGE_TLS_DIRECTORY32 IMAGE_TLS_DIRECTORY; -typedef PIMAGE_TLS_DIRECTORY32 PIMAGE_TLS_DIRECTORY; -#endif - -/* Linked List */ -typedef struct _LIST_ENTRY { - struct _LIST_ENTRY *Flink; - struct _LIST_ENTRY *Blink; -} LIST_ENTRY, *PLIST_ENTRY; - -typedef struct _RTL_CRITICAL_SECTION_DEBUG { - WORD Type; - WORD CreatorBackTraceIndex; - struct _RTL_CRITICAL_SECTION *CriticalSection; - LIST_ENTRY ProcessLocksList; - DWORD EntryCount; - DWORD ContentionCount; - DWORD Flags; - WORD CreatorBackTraceIndexHigh; - WORD SpareWORD; -} RTL_CRITICAL_SECTION_DEBUG, *PRTL_CRITICAL_SECTION_DEBUG; - -#pragma pack(push, 8) -typedef struct _RTL_CRITICAL_SECTION { - PRTL_CRITICAL_SECTION_DEBUG DebugInfo; - LONG LockCount; - LONG RecursionCount; - HANDLE OwningThread; - HANDLE LockSemaphore; - ULONG_PTR SpinCount; -} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION; -typedef RTL_CRITICAL_SECTION CRITICAL_SECTION; -typedef PRTL_CRITICAL_SECTION PCRITICAL_SECTION; -typedef PRTL_CRITICAL_SECTION LPCRITICAL_SECTION; -#pragma pack(pop) - -typedef struct _RTL_CONDITION_VARIABLE { - PVOID Ptr; -} RTL_CONDITION_VARIABLE, *PRTL_CONDITION_VARIABLE; -#define RTL_CONDITION_VARIABLE_INIT {0} -#define RTL_CONDITION_VARIABLE_LOCKMODE_SHARED 0x1 -typedef RTL_CONDITION_VARIABLE CONDITION_VARIABLE; -typedef PRTL_CONDITION_VARIABLE PCONDITION_VARIABLE; - -#define SRWLOCK_INIT {0} -typedef struct _RTL_SRWLOCK { - PVOID Ptr; -} RTL_SRWLOCK, *PRTL_SRWLOCK; -typedef RTL_SRWLOCK SRWLOCK, *PSRWLOCK; - -/* ========================================================================== */ -/* Waiting Functions: */ -DWORD WINAPI WaitForSingleObject( - HANDLE hHandle, - DWORD dwMilliseconds); -DWORD WINAPI WaitForMultipleObjects( - DWORD nCount, - const HANDLE *lpHandles, - BOOL bWaitAll, - DWORD dwMilliseconds); - -DWORD WINAPI WaitForSingleObjectEx( - HANDLE hHandle, - DWORD dwMilliseconds, - BOOL bAlertable); -DWORD WINAPI WaitForMultipleObjectsEx( - DWORD nCount, - const HANDLE *lpHandles, - BOOL bWaitAll, - DWORD dwMilliseconds, - BOOL bAlertable); - -/* ========================================================================== */ -/* Threading Functions: */ -typedef DWORD (WINAPI *PTHREAD_START_ROUTINE)(LPVOID); -typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE; -HANDLE WINAPI CreateThread( - LPSECURITY_ATTRIBUTES lpThreadAttributes, - SIZE_T dwStackSize, - LPTHREAD_START_ROUTINE lpStartAddress, - LPVOID lpParameter, - DWORD dwCreationFlags, - LPDWORD lpThreadId); -HANDLE WINAPI GetCurrentThread(void); -DWORD WINAPI GetCurrentThreadId(void); -DWORD_PTR WINAPI SetThreadAffinityMask( - HANDLE hThread, - DWORD_PTR dwThreadAffinityMask); -HANDLE WINAPI OpenThread( - DWORD dwDesiredAccess, - BOOL bInheritHandle, - DWORD dwThreadId); -DWORD WINAPI SuspendThread( - HANDLE hThread); -DWORD WINAPI ResumeThread( - HANDLE hThread); -void WINAPI ExitThread( - DWORD dwExitCode); -BOOL WINAPI GetProcessAffinityMask( - HANDLE hProcess, - PDWORD_PTR lpProcessAffinityMask, - PDWORD_PTR lpSystemAffinityMask); -BOOL WINAPI SetProcessAffinityMask( - HANDLE hProcess, - DWORD_PTR dwProcessAffinityMask); -BOOL WINAPI SwitchToThread(void); - -/* ========================================================================== */ -/* CriticalSection Functions: */ -void WINAPI InitializeCriticalSection( - LPCRITICAL_SECTION lpCriticalSection); -BOOL WINAPI InitializeCriticalSectionAndSpinCount( - LPCRITICAL_SECTION lpCriticalSection, - DWORD dwSpinCount); -DWORD WINAPI SetCriticalSectionSpinCount( - LPCRITICAL_SECTION lpCriticalSection, - DWORD dwSpinCount); -void WINAPI EnterCriticalSection( - LPCRITICAL_SECTION lpCriticalSection); -BOOL WINAPI TryEnterCriticalSection( - LPCRITICAL_SECTION lpCriticalSection); -void WINAPI LeaveCriticalSection( - LPCRITICAL_SECTION lpCriticalSection); -void WINAPI DeleteCriticalSection( - LPCRITICAL_SECTION lpCriticalSection); - -/* ========================================================================== */ -/* Condition Variable: */ -void WINAPI InitializeConditionVariable( - PCONDITION_VARIABLE ConditionVariable); -BOOL WINAPI SleepConditionVariableCS( - PCONDITION_VARIABLE ConditionVariable, - PCRITICAL_SECTION CriticalSection, - DWORD dwMilliseconds); -void WINAPI WakeAllConditionVariable( - PCONDITION_VARIABLE ConditionVariable); -void WINAPI WakeConditionVariable( - PCONDITION_VARIABLE ConditionVariable); - -/* ========================================================================== */ -/* Mutex Functions: */ -HANDLE WINAPI CreateMutexA( - LPSECURITY_ATTRIBUTES lpMutexAttributes, - BOOL bInitialOwner, - LPCSTR lpName); -HANDLE WINAPI CreateMutexW( - LPSECURITY_ATTRIBUTES lpMutexAttributes, - BOOL bInitialOwner, - LPCWSTR lpName); -BOOL WINAPI ReleaseMutex( - HANDLE hMutex); - -/* ========================================================================== */ -/* Semaphore Functions: */ -HANDLE WINAPI CreateSemaphoreA( - LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, - LONG lInitialCount, - LONG lMaximumCount, - LPCSTR lpName); -HANDLE WINAPI CreateSemaphoreW( - LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, - LONG lInitialCount, - LONG lMaximumCount, - LPCWSTR lpName); -BOOL WINAPI ReleaseSemaphore( - HANDLE hSemaphore, - LONG lReleaseCount, - LPLONG lpPreviousCount); -HANDLE WINAPI OpenSemaphoreA( - DWORD dwDesiredAccess, - BOOL bInheritHandle, - LPCSTR lpName); -HANDLE WINAPI OpenSemaphoreW( - DWORD dwDesiredAccess, - BOOL bInheritHandle, - LPCWSTR lpName); - - -/* ========================================================================== */ -/* Thread-Local Storage: */ -DWORD WINAPI TlsAlloc(void); -BOOL WINAPI TlsSetValue( - DWORD dwTlsIndex, - LPVOID lpTlsValue); -LPVOID WINAPI TlsGetValue( - DWORD dwTlsIndex); -DWORD WINAPI TlsFree( - DWORD dwTlsIndex); - -typedef void(WINAPI *PFLS_CALLBACK_FUNCTION)(PVOID); -DWORD WINAPI FlsAlloc(PFLS_CALLBACK_FUNCTION lpCallback); -BOOL WINAPI FlsFree(DWORD dwFlsIndex); -BOOL WINAPI FlsSetValue(DWORD dwFlsIndex, PVOID lpFlsData); -PVOID WINAPI FlsGetValue(DWORD dwFlsIndex); - - -/* ========================================================================== */ -/* SRW Lock Functions: */ -void WINAPI InitializeSRWLock(PSRWLOCK SRWLock); - -void WINAPI AcquireSRWLockExclusive(PSRWLOCK SRWLock); -void WINAPI AcquireSRWLockShared(PSRWLOCK SRWLock); - -void WINAPI ReleaseSRWLockExclusive(PSRWLOCK SRWLock); -void WINAPI ReleaseSRWLockShared(PSRWLOCK SRWLock); - -BOOL WINAPI TryAcquireSRWLockExclusive(PSRWLOCK SRWLock); -BOOL WINAPI TryAcquireSRWLockShared(PSRWLOCK SRWLock); - -BOOL WINAPI SleepConditionVariableSRW( - PCONDITION_VARIABLE ConditionVariable, - PSRWLOCK SRWLock, - DWORD dwMilliseconds, - ULONG Flags); - -/* ========================================================================== */ -/* Waiting: */ -BOOL WINAPI WaitOnAddress( - void volatile *Address, - PVOID CompareAddress, - SIZE_T AddressSize, - DWORD dwMilliseconds); -void WINAPI WakeByAddressSingle( - PVOID Address); -void WINAPI WakeByAddressAll( - PVOID Address); - -/* ========================================================================== */ -/* Events: */ -HANDLE WINAPI CreateEvent( - LPSECURITY_ATTRIBUTES lpEventAttributes, - BOOL bManualReset, - BOOL bInitialState, - LPCTSTR lpName); -HANDLE WINAPI OpenEvent( - DWORD dwDesiredAccess, - BOOL bInheritHandle, - LPCTSTR lpName); -BOOL WINAPI SetEvent( - HANDLE hEvent); -BOOL WINAPI ResetEvent( - HANDLE hEvent); - - -#if defined(__cplusplus) -} -#endif - -/* Enable all warnings */ -#if defined(_MSC_VER) - #pragma warning(pop) -#endif - -#endif /* WINDOWS_THREADS_H */ -#endif /* _WINDOWS_ */ - diff --git a/exe_load/include/window.h b/exe_load/include/window.h deleted file mode 100644 index 65765e3..0000000 --- a/exe_load/include/window.h +++ /dev/null @@ -1,386 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Arvid Gerstmann. All rights reserved. - */ -#ifndef _WINDOWS_ -#ifndef WINDOWS_WINDOW_H -#define WINDOWS_WINDOW_H - -/* Disable all warnings */ -#if defined(_MSC_VER) - #pragma warning(push, 0) -#endif - -#ifndef WINDOWS_BASE_H -#include "windows_base.h" -#endif -#if defined(__cplusplus) -extern "C" { -#endif - -/* MessageBox customizations: */ -#define MB_ABORTRETRYIGNORE 0x00000002L -#define MB_CANCELTRYCONTINUE 0x00000006L -#define MB_HELP 0x00004000L -#define MB_OK 0x00000000L -#define MB_OKCANCEL 0x00000001L -#define MB_RETRYCANCEL 0x00000005L -#define MB_YESNO 0x00000004L -#define MB_YESNOCANCEL 0x00000003L - -#define MB_ICONEXCLAMATION 0x00000030L -#define MB_ICONWARNING 0x00000030L -#define MB_ICONINFORMATION 0x00000040L -#define MB_ICONASTERISK 0x00000040L -#define MB_ICONQUESTION 0x00000020L -#define MB_ICONSTOP 0x00000010L -#define MB_ICONERROR 0x00000010L -#define MB_ICONHAND 0x00000010L - -#define MB_DEFBUTTON1 0x00000000L -#define MB_DEFBUTTON2 0x00000100L -#define MB_DEFBUTTON3 0x00000200L -#define MB_DEFBUTTON4 0x00000300L - -#define MB_APPLMODAL 0x00000000L -#define MB_SYSTEMMODAL 0x00001000L -#define MB_TASKMODAL 0x00002000L - -#define MB_DEFAULT_DESKTOP_ONLY 0x00020000L -#define MB_RIGHT 0x00080000L -#define MB_RTLREADING 0x00100000L -#define MB_SETFOREGROUND 0x00010000L -#define MB_TOPMOST 0x00040000L -#define MB_SERVICE_NOTIFICATION 0x00200000L - -#define IDABORT (3) -#define IDCANCEL (2) -#define IDCONTINUE (11) -#define IDIGNORE (5) -#define IDNO (7) -#define IDOK (1) -#define IDRETRY (4) -#define IDTRYAGAIN (10) -#define IDYES (6) - -/* Window Styles: */ -#define WS_OVERLAPPED 0x00000000L -#define WS_POPUP 0x80000000L -#define WS_CHILD 0x40000000L -#define WS_MINIMIZE 0x20000000L -#define WS_VISIBLE 0x10000000L -#define WS_DISABLED 0x08000000L -#define WS_CLIPSIBLINGS 0x04000000L -#define WS_CLIPCHILDREN 0x02000000L -#define WS_MAXIMIZE 0x01000000L -#define WS_CAPTION 0x00C00000L -#define WS_BORDER 0x00800000L -#define WS_DLGFRAME 0x00400000L -#define WS_VSCROLL 0x00200000L -#define WS_HSCROLL 0x00100000L -#define WS_SYSMENU 0x00080000L -#define WS_THICKFRAME 0x00040000L -#define WS_GROUP 0x00020000L -#define WS_TABSTOP 0x00010000L - -#define WS_MINIMIZEBOX 0x00020000L -#define WS_MAXIMIZEBOX 0x00010000L - - -#define WS_TILED WS_OVERLAPPED -#define WS_ICONIC WS_MINIMIZE -#define WS_SIZEBOX WS_THICKFRAME -#define WS_TILEDWINDOW WS_OVERLAPPEDWINDOW - -/* Common Window Styles: */ -#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED | \ - WS_CAPTION | \ - WS_SYSMENU | \ - WS_THICKFRAME | \ - WS_MINIMIZEBOX | \ - WS_MAXIMIZEBOX) -#define WS_POPUPWINDOW (WS_POPUP | \ - WS_BORDER | \ - WS_SYSMENU) -#define WS_CHILDWINDOW (WS_CHILD) - -#define CW_USEDEFAULT ((int)0x80000000) - -/* Class Styles: */ -#define CS_OWNDC 0x0020 -#define CS_VREDRAW 0x0001 -#define CS_HREDRAW 0x0002 - -/* Messages: */ -#define PM_NOREMOVE 0x0000 -#define PM_REMOVE 0x0001 -#define PM_NOYIELD 0x0002 - -#define WM_NULL 0x0000 -#define WM_CREATE 0x0001 -#define WM_DESTROY 0x0002 -#define WM_MOVE 0x0003 -#define WM_SIZE 0x0005 -#define WM_SETFOCUS 0x0007 -#define WM_KILLFOCUS 0x0008 -#define WM_ENABLE 0x000A -#define WM_SETREDRAW 0x000B -#define WM_SETTEXT 0x000C -#define WM_GETTEXT 0x000D -#define WM_GETTEXTLENGTH 0x000E -#define WM_PAINT 0x000F -#define WM_CLOSE 0x0010 -#define WM_QUIT 0x0012 -#define WM_ERASEBKGND 0x0014 -#define WM_SYSCOLORCHANGE 0x0015 -#define WM_SHOWWINDOW 0x0018 -#define WM_WININICHANGE 0x001A -#define WM_NCDESTROY 0x0082 - -#define WM_KEYDOWN 0x0100 -#define WM_KEYUP 0x0101 -#define WM_SYSKEYDOWN 0x0104 -#define WM_SYSKEYUP 0x0105 - -#define WM_SYSCOMMAND 0x0112 - -#define WM_ENTERSIZEMOVE 0x0231 -#define WM_EXITSIZEMOVE 0x0232 - -#define WM_ACTIVATE 0x0006 -#define WA_INACTIVE 0 -#define WA_ACTIVE 1 -#define WA_CLICKACTIVE 2 - -#define SC_KEYMENU 0xF100 - -/* Events: */ -#define EVENT_ALL_ACCESS 0x1F0003 -#define EVENT_MODIFY_STATE 0x0002 - -/* Virtual Keys: */ -#define VK_BACK 0x08 -#define VK_TAB 0x09 -#define VK_SHIFT 0x10 -#define VK_CONTROL 0x11 -#define VK_MENU 0x12 -#define VK_RETURN 0x0D - -#define VK_ESCAPE 0x1B - -#define VK_SPACE 0x20 -#define VK_PRIOR 0x21 -#define VK_NEXT 0x22 -#define VK_END 0x23 -#define VK_HOME 0x24 -#define VK_LEFT 0x25 -#define VK_UP 0x26 -#define VK_RIGHT 0x27 -#define VK_DOWN 0x28 -#define VK_SELECT 0x29 -#define VK_PRINT 0x2A -#define VK_EXECUTE 0x2B -#define VK_SNAPSHOT 0x2C -#define VK_INSERT 0x2D -#define VK_DELETE 0x2E -#define VK_HELP 0x2F - -#define VK_LWIN 0x5B -#define VK_RWIN 0x5C -#define VK_PROCESSKEY 0xE5 - -// Show window commands -#define SW_HIDE 0 -#define SW_SHOWNORMAL 1 -#define SW_NORMAL 1 -#define SW_SHOWMINIMIZED 2 -#define SW_SHOWMAXIMIZED 3 -#define SW_MAXIMIZE 3 -#define SW_SHOWNOACTIVATE 4 -#define SW_SHOW 5 -#define SW_MINIMIZE 6 -#define SW_SHOWMINNOACTIVE 7 -#define SW_SHOWNA 8 -#define SW_RESTORE 9 -#define SW_SHOWDEFAULT 10 -#define SW_FORCEMINIMIZE 11 -#define SW_MAX 11 - -/* ========================================================================== */ -/* Structures: */ -typedef struct _RECT { - LONG left; - LONG top; - LONG right; - LONG bottom; -} RECT, *PRECT, *LPRECT; - -/* Window: */ -typedef LRESULT (CALLBACK *WNDPROC)(HWND, UINT, WPARAM, LPARAM); -typedef struct tagWNDCLASS { - UINT style; - WNDPROC lpfnWndProc; - int cbClsExtra; - int cbWndExtra; - HINSTANCE hInstance; - HICON hIcon; - HCURSOR hCursor; - HBRUSH hbrBackground; - LPCTSTR lpszMenuName; - LPCTSTR lpszClassName; -} WNDCLASS, *PWNDCLASS; - -/* Messages: */ -typedef struct tagPOINT { - LONG x; - LONG y; -} POINT, *PPOINT; - -typedef struct tagMSG { - HWND hwnd; - UINT message; - WPARAM wParam; - LPARAM lParam; - DWORD time; - POINT pt; -} MSG, *PMSG, *LPMSG; - - -/* ========================================================================== */ -/* Window Functions: */ -int WINAPI MessageBoxA( - HWND hWND, - LPCSTR lpText, - LPCSTR lpCaption, - UINT uType); -int WINAPI MessageBoxW( - HWND hWND, - LPCWSTR lpText, - LPCWSTR lpCaption, - UINT uType); -ATOM WINAPI RegisterClassA( - WNDCLASS *lpWndClass); -ATOM WINAPI RegisterClassW( - WNDCLASS *lpWndClass); -BOOL WINAPI UnregisterClassA( - LPCSTR lpClassName, - HINSTANCE hInstance); -BOOL WINAPI UnregisterClassW( - LPCWSTR lpClassName, - HINSTANCE hInstance); -HWND WINAPI CreateWindowExA( - DWORD dwExStyle, - LPCSTR lpClassName, - LPCSTR lpWindowName, - DWORD dwStyle, - int x, - int y, - int nWidth, - int nHeight, - HWND hWndParent, - HMENU hMenu, - HINSTANCE hInstance, - LPVOID lpParam); -HWND WINAPI CreateWindowExW( - DWORD dwExStyle, - LPCWSTR lpClassName, - LPCWSTR lpWindowName, - DWORD dwStyle, - int x, - int y, - int nWidth, - int nHeight, - HWND hWndParent, - HMENU hMenu, - HINSTANCE hInstance, - LPVOID lpParam); -BOOL WINAPI ShowWindow( - HWND hWnd, - int nCmdShow); -BOOL WINAPI UpdateWindow( - HWND hWnd); -LRESULT WINAPI DefWindowProcA( - HWND hWnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam); -LRESULT WINAPI DefWindowProcW( - HWND hWnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam); -BOOL WINAPI DestroyWindow( - HWND hWnd); -BOOL WINAPI AdjustWindowRectEx( - LPRECT lpRect, - DWORD dwStyle, - BOOL bMenu, - DWORD dwExStyle); -BOOL WINAPI GetClientRect( - HWND hWnd, - LPRECT lpRect); -int WINAPI GetSystemMetrics( - int nIndex); - -/* ========================================================================== */ -/* Message Queue: */ -BOOL WINAPI PeekMessageA( - LPMSG lpMsg, - HWND hWnd, - UINT wMsgFilterMin, - UINT wMsgFilterMax, - UINT wRemoveMsg); -BOOL WINAPI PeekMessageW( - LPMSG lpMsg, - HWND hWnd, - UINT wMsgFilterMin, - UINT wMsgFilterMax, - UINT wRemoveMsg); -BOOL WINAPI TranslateMessage( - const MSG *lpMsg); -LRESULT WINAPI DispatchMessageA( - const MSG *lpMsg); -LRESULT WINAPI DispatchMessageW( - const MSG *lpMsg); -void WINAPI PostQuitMessage( - int nExitCode); - -/* ========================================================================== */ -/* Events: */ -HANDLE WINAPI CreateEventA( - LPSECURITY_ATTRIBUTES lpEventAttributes, - BOOL bManualReset, - BOOL bInitialState, - LPCSTR lpName); -HANDLE WINAPI CreateEventW( - LPSECURITY_ATTRIBUTES lpEventAttributes, - BOOL bManualReset, - BOOL bInitialState, - LPCWSTR lpName); -HANDLE WINAPI OpenEventA( - DWORD dwDesiredAccess, - BOOL bInheritHandle, - LPCSTR lpName); -HANDLE WINAPI OpenEventW( - DWORD dwDesiredAccess, - BOOL bInheritHandle, - LPCWSTR lpName); -BOOL WINAPI ResetEvent( - HANDLE hEvent); -BOOL WINAPI SetEvent( - HANDLE hEvent); -SHORT WINAPI GetKeyState( - int nVirtKey); - -#if defined(__cplusplus) -} -#endif - -/* Enable all warnings */ -#if defined(_MSC_VER) - #pragma warning(pop) -#endif - -#endif /* WINDOWS_WINDOW_H */ -#endif /* _WINDOWS_ */ - diff --git a/exe_load/include/windows.h b/exe_load/include/windows.h deleted file mode 100644 index 5539cd6..0000000 --- a/exe_load/include/windows.h +++ /dev/null @@ -1,4695 +0,0 @@ -#ifndef _WINDOWS_ -#pragma once -#ifndef _INC_WINDOWS -#define _INC_WINDOWS -#ifndef WINDOWS_H -#define WINDOWS_H - - -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Arvid Gerstmann. All rights reserved. - */ -#ifndef _WINDOWS_ -#ifndef WINDOWS_BASE_H -#define WINDOWS_BASE_H - -/* Disable all warnings */ -#if defined(_MSC_VER) - #pragma warning(push, 0) -#endif -#if defined(__cplusplus) -extern "C" { -#endif - -/* size_t */ -/* #include */ - - -/* - * Windows Version requirements: Vista - * See here for more information regarding this define: - * https://msdn.microsoft.com/en-us/library/aa383745(VS.85).aspx - */ -#ifndef _WIN32_WINNT - #define _WIN32_WINNT 0x0600 -#endif - -/* Magic: */ -#define _CRTALLOC(x) __declspec(allocate(x)) -#define DECLSPEC_ALIGN(x) __declspec(align(x)) - -/* Basic Defines: */ -#define NTAPI __stdcall -#define WINAPI __stdcall -#define APIENTRY __stdcall -#define CALLBACK __stdcall -#define TRUE (1) -#define FALSE (0) -#ifndef FORCEINLINE -#define FORCEINLINE __forceinline -#endif -#ifdef UNICODE -#define __TEXT(x) L ## x -#define TEXT(x) __TEXT(x) -#else -#define TEXT(x) x -#endif -#define PATH_MAX 260 -#define MAX_PATH 260 - -#define MAKEWORD(a, b) \ - ((WORD)(((BYTE)(((DWORD_PTR)(a)) & 0xff)) | \ - ((WORD)((BYTE)(((DWORD_PTR)(b)) & 0xff))) << 8)) -#define MAKELONG(a, b) \ - ((LONG)(((WORD)(((DWORD_PTR)(a)) & 0xffff)) | \ - ((DWORD)((WORD)(((DWORD_PTR)(b)) & 0xffff))) << 16)) -#define LOWORD(l) ((WORD)(((DWORD_PTR)(l)) & 0xffff)) -#define HIWORD(l) ((WORD)((((DWORD_PTR)(l)) >> 16) & 0xffff)) -#define LOBYTE(w) ((BYTE)(((DWORD_PTR)(w)) & 0xff)) -#define HIBYTE(w) ((BYTE)((((DWORD_PTR)(w)) >> 8) & 0xff)) - -#if !defined(_68K_) \ - && !defined(_MPPC_) \ - && !defined(_X86_) \ - && !defined(_IA64_) \ - && !defined(_AMD64_) \ - && defined(_M_AMD64) -#define _AMD64_ -#endif - -/* - * Windows uses the `interface` define to create interfaces for both C and C++. - * Only the C version is defined here and not the C++ version. - * Both can be found in BaseTyps.h - */ -#define STDMETHODCALLTYPE __stdcall -#define STDMETHODVCALLTYPE __cdecl -#define STDAPICALLTYPE __stdcall -#define STDAPIVCALLTYPE __cdecl - -#define interface struct -#define PURE -#define THIS_ INTERFACE * This, -#define THIS INTERFACE * This -#define STDMETHOD(method) HRESULT (STDMETHODCALLTYPE * method) -#define STDMETHOD_(type, method) type (STDMETHODCALLTYPE * method) -#define STDMETHODV(method) HRESULT (STDMETHODVCALLTYPE * method) -#define STDMETHODV_(type, method) type (STDMETHODVCALLTYPE * method) - -#define IFACEMETHOD(method) __override STDMETHOD(method) -#define IFACEMETHOD_(type, method) __override STDMETHOD_(type,method) -#define IFACEMETHODV(method) __override STDMETHODV(method) -#define IFACEMETHODV_(type, method) __override STDMETHODV_(type,method) - -#define BEGIN_INTERFACE -#define END_INTERFACE - -#ifdef CONST_VTABLE -#undef CONST_VTBL -#define CONST_VTBL const -#define DECLARE_INTERFACE(iface) \ - typedef interface iface { \ - const struct iface##Vtbl * lpVtbl; \ - } iface; \ - typedef const struct iface##Vtbl iface##Vtbl; \ - const struct iface##Vtbl - -#else - -#undef CONST_VTBL -#define CONST_VTBL -#define DECLARE_INTERFACE(iface) \ - typedef interface iface { \ - struct iface##Vtbl * lpVtbl; \ - } iface; \ - typedef struct iface##Vtbl iface##Vtbl; \ - struct iface##Vtbl - -#endif /* CONST_VTABLE */ - -#define DECLARE_INTERFACE_(iface, baseiface) DECLARE_INTERFACE(iface) - - -#define HRESULT_IS_WIN32(x) \ - ((((x) >> 16) & 0xFFFF) == 0x8) -#define HRESULT_IS_FAILURE(x) \ - ((((x) >> 31) & 0x1) == 0x1) -#define HRESULT_FACILITY(x) \ - (((x) >> 16) & 0xFFFF) -#define HRESULT_CODE(x) \ - ((x) & 0xFFFF) -#define HRESULT_FROM_WIN32(x) \ - (0x80070000 | (x)) - - -/* ========================================================================== */ -/* Basic Types: */ -/* https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx */ -/* ========================================================================== */ - -#if defined(_MSC_VER) - /* 1300 == VC 6.0 */ - #if _MSC_VER < 1300 - typedef signed char int8_t; - typedef unsigned char uint8_t; - typedef signed short int16_t; - typedef unsigned short uint16_t; - typedef signed int int32_t; - typedef unsigned int uint32_t; - #else - typedef signed __int8 int8_t; - typedef unsigned __int8 uint8_t; - typedef signed __int16 int16_t; - typedef unsigned __int16 uint16_t; - typedef signed __int32 int32_t; - typedef unsigned __int32 uint32_t; - #endif - typedef signed __int64 int64_t; - typedef unsigned __int64 uint64_t; -#else - #include -#endif - - -typedef int BOOL; -typedef char CHAR; -typedef short SHORT; -typedef int INT; -typedef long LONG; -typedef unsigned char UCHAR; -typedef unsigned short USHORT; -typedef unsigned int UINT; -typedef unsigned long ULONG; -typedef unsigned char BYTE; -typedef unsigned short WORD; -typedef float FLOAT; -typedef unsigned long DWORD; -#ifndef HAVE_WCHAR_T -#define HAVE_WCHAR_T -#if !defined(__cplusplus) -typedef unsigned short wchar_t; -#endif -#endif -typedef wchar_t WCHAR; -typedef wchar_t * PWCHAR; -typedef WORD ATOM; -typedef unsigned int ULONG32; -typedef uint64_t DWORD64; -typedef uint64_t ULONG64; -typedef signed int INT32; -typedef signed __int64 INT64; -typedef uint64_t DWORDLONG; - -typedef CHAR * PCHAR; -typedef ULONG * PULONG; -typedef ULONG64 * PULONG64; -typedef DWORD64 * PDWORD64; - -#if !defined(_M_IX86) -typedef int64_t LONGLONG; -typedef uint64_t ULONGLONG; -#else -typedef double LONGLONG; -typedef double ULONGLONG; -#endif - -typedef void VOID; -typedef void * PVOID; -typedef void * LPVOID; -typedef BOOL * PBOOL; -typedef BOOL * LPBOOL; -typedef WORD * PWORD; -typedef LONG * PLONG; -typedef LONG * LPLONG; -typedef DWORD * PDWORD; - -typedef LPVOID HANDLE; -typedef HANDLE HINSTANCE; -typedef HANDLE HWND; -typedef HINSTANCE HMODULE; -typedef HANDLE HDC; -typedef HANDLE HGLRC; -typedef HANDLE HMENU; -typedef HANDLE * PHANDLE; -typedef HANDLE * LPHANDLE; - -#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name - -typedef WCHAR * PWSTR; -typedef BYTE * LPBYTE; -typedef long * LPLONG; -typedef DWORD * LPDWORD; -typedef const void * LPCVOID; - -#if defined(_WIN64) -typedef int64_t INT_PTR; -typedef int64_t LONG_PTR; -typedef uint64_t UINT_PTR; -typedef uint64_t ULONG_PTR; -#else -typedef int INT_PTR; -typedef long LONG_PTR; -typedef unsigned int UINT_PTR; -typedef unsigned long ULONG_PTR; -#endif -typedef ULONG_PTR DWORD_PTR; -typedef DWORD_PTR * PDWORD_PTR; - -typedef ULONG_PTR SIZE_T; -typedef LONG_PTR SSIZE_T; - -typedef CHAR * LPSTR; -typedef WCHAR * LPWSTR; -typedef const CHAR * LPCSTR; -typedef const WCHAR * LPCWSTR; -#if defined(UNICODE) -typedef WCHAR TCHAR; -typedef WCHAR TBYTE; -typedef LPCWSTR LPCTSTR; -typedef LPWSTR LPTSTR; -#else -typedef char TCHAR; -typedef unsigned char TBYTE; -typedef LPCSTR LPCTSTR; -typedef LPSTR LPTSTR; -#endif - -#define MINCHAR 0x80 -#define MAXCHAR 0x7f -#define MINSHORT 0x8000 -#define MAXSHORT 0x7fff -#define MINLONG 0x80000000 -#define MAXLONG 0x7fffffff -#define MAXBYTE 0xff -#define MAXWORD 0xffff -#define MAXDWORD 0xffffffff - -#if defined(_WIN64) -typedef INT_PTR (WINAPI *FARPROC)(void); -typedef INT_PTR (WINAPI *NEARPROC)(void); -typedef INT_PTR (WINAPI *PROC)(void); -#else -typedef int (WINAPI *FARPROC)(void); -typedef int (WINAPI *NEARPROC)(void); -typedef int (WINAPI *PROC)(void); -#endif - -typedef DWORD ACCESS_MASK; -typedef ACCESS_MASK * PACCESS_MASK; - -typedef HANDLE HICON; -typedef HANDLE HBRUSH; -typedef HICON HCURSOR; - -typedef LONG HRESULT; -typedef LONG_PTR LRESULT; -typedef LONG_PTR LPARAM; -typedef UINT_PTR WPARAM; - -typedef void * HGDIOBJ; - -typedef HANDLE HKEY; -typedef HKEY * PHKEY; -typedef ACCESS_MASK REGSAM; - - -/* ========================================================================== */ -/* Errors: */ -/* ========================================================================== */ -#define ERROR_SUCCESS 0L -#define ERROR_FILE_NOT_FOUND 2L -#define ERROR_PATH_NOT_FOUND 3L -#define ERROR_TOO_MANY_OPEN_FILES 4L -#define ERROR_ACCESS_DENIED 5L -#define ERROR_NO_MORE_FILES 18L -#define ERROR_SHARING_VIOLATION 32L -#define ERROR_FILE_EXISTS 80L -#define ERROR_INSUFFICIENT_BUFFER 122L -#define ERROR_ALREADY_EXISTS 183L -#define ERROR_MORE_DATA 234L - - -/* ========================================================================== */ -/* Enums */ -/* ========================================================================== */ -/* DllMain Reason: */ -#define DLL_PROCESS_ATTACH (1) -#define DLL_PROCESS_DETACH (0) -#define DLL_THREAD_ATTACH (2) -#define DLL_THREAD_DETACH (3) - - -/* ========================================================================== */ -/* Structures: */ -/* ========================================================================== */ -typedef struct _SECURITY_ATTRIBUTES { - DWORD nLength; - LPVOID lpSecurityDescriptor; - BOOL bInheritHandle; -} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES; - -typedef union _LARGE_INTEGER { - struct { - DWORD LowPart; - LONG HighPart; - }; - struct { - DWORD LowPart; - LONG HighPart; - } u; - LONGLONG QuadPart; -} LARGE_INTEGER, *PLARGE_INTEGER; - -typedef union _ULARGE_INTEGER { - struct { - DWORD LowPart; - DWORD HighPart; - }; - struct { - DWORD LowPart; - DWORD HighPart; - } u; - ULONGLONG QuadPart; -} ULARGE_INTEGER, *PULARGE_INTEGER; - -/* Filetime: */ -typedef struct _FILETIME { - DWORD dwLowDateTime; - DWORD dwHighDateTime; -} FILETIME, *PFILETIME, *LPFILETIME; - - -#if defined(__cplusplus) -} -#endif -/* Enable all warnings */ -#if defined(_MSC_VER) - #pragma warning(pop) -#endif - -#endif /* WINDOWS_BASE_H */ -#endif /* _WINDOWS_ */ - - -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Arvid Gerstmann. All rights reserved. - */ -#ifndef _WINDOWS_ -#ifndef WINDOWS_ATOMIC_H -#define WINDOWS_ATOMIC_H - -/* Disable all warnings */ -#if defined(_MSC_VER) - #pragma warning(push, 0) -#endif - -#include "intrin.h" - -#if defined(__cplusplus) -extern "C" { -#endif - - -/* ========================================================================== */ -/* Atomic Functions: */ -/* ========================================================================== */ - -/* ========================================================================== */ -/* 8-Bit Atomic Intrinsics: */ -/* Exchange */ -char _InterlockedExchange8( - char volatile *Target, - char Value); -char _InterlockedExchangeAdd8( - char volatile *Addend, - char Value); - -/* Bit Operations */ -char _InterlockedExchangeAnd8( - char volatile *Destination, - char Value); -char _InterlockedExchangeOr8( - char volatile *Destination, - char Value); -char _InterlockedExchangeXor8( - char volatile *Destination, - char Value); - -/* Increment & Decrement */ -char _InterlockedDecrement8( - char volatile *Addend); -char _InterlockedIncrement8( - char volatile *Addend); - -/* Compare & Exchang */ -char _InterlockedCompareExchange8( - char volatile *Destination, - char Exchange, - char Comparand); -char _InterlockedCompareExchange8_HLEAcquire( - char volatile *Destination, - char Exchange, - char Comparand); -char _InterlockedCompareExchange8_HLERelease( - char volatile *Destination, - char Exchange, - char Comparand); - - -/* ========================================================================== */ -/* 16-Bit Atomic Intrinsics: */ -/* Exchange */ -short _InterlockedExchange16( - short volatile *Target, - short Value); -short _InterlockedExchangeAdd16( - short volatile *Addend, - short Value); - -/* Bit Operations */ -short _InterlockedExchangeAnd16( - short volatile *Destination, - short Value); -short _InterlockedExchangeOr16( - short volatile *Destination, - short Value); -short _InterlockedExchangeXor16( - short volatile *Destination, - short Value); - -/* Increment & Decrement */ -short _InterlockedDecrement16( - short volatile *Addend); -short _InterlockedIncrement16( - short volatile *Addend); - -/* Compare & Exchang */ -short _InterlockedCompareExchange16( - short volatile *Destination, - short Exchange, - short Comparand); -short _InterlockedCompareExchange16_HLEAcquire( - short volatile *Destination, - short Exchange, - short Comparand); -short _InterlockedCompareExchange16_HLERelease( - short volatile *Destination, - short Exchange, - short Comparand); - - -/* ========================================================================== */ -/* 32-Bit Atomic Intrinsics: */ -/* Exchange */ -long _InterlockedExchange( - long volatile *Target, - long Value); -long _InterlockedExchangeAdd( - long volatile *Addend, - long Value); - -/* Bit Operations */ -long _InterlockedExchangeAnd( - long volatile *Destination, - long Value); -long _InterlockedExchangeOr( - long volatile *Destination, - long Value); -long _InterlockedExchangeXor( - long volatile *Destination, - long Value); - -/* Increment & Decrement */ -long _InterlockedDecrement( - long volatile *Addend); -long _InterlockedIncrement( - long volatile *Addend); - -/* Compare & Exchang */ -long _InterlockedCompareExchange( - long volatile *Destination, - long Exchange, - long Comparand); -long _InterlockedCompareExchange_HLEAcquire( - long volatile *Destination, - long Exchange, - long Comparand); -long _InterlockedCompareExchange_HLERelease( - long volatile *Destination, - long Exchange, - long Comparand); - -/* ========================================================================== */ -/* 64-Bit Atomic Intrinsics: */ -#ifdef _AMD64_ -/* Exchange */ -__int64 _InterlockedExchange64( - __int64 volatile *Target, - __int64 Value); -__int64 _InterlockedExchangeAdd64( - __int64 volatile *Addend, - __int64 Value); - -/* Bit Operations */ -__int64 _InterlockedExchangeAnd64( - __int64 volatile *Destination, - __int64 Value); -__int64 _InterlockedExchangeOr64( - __int64 volatile *Destination, - __int64 Value); -__int64 _InterlockedExchangeXor64( - __int64 volatile *Destination, - __int64 Value); - -/* Increment & Decrement */ -__int64 _InterlockedDecrement64( - __int64 volatile *Addend); -__int64 _InterlockedIncrement64( - __int64 volatile *Addend); - -/* Compare & Exchang */ -__int64 _InterlockedCompareExchange64( - __int64 volatile *Destination, - __int64 Exchange, - __int64 Comparand); -__int64 _InterlockedCompareExchange64_HLEAcquire( - __int64 volatile *Destination, - __int64 Exchange, - __int64 Comparand); -__int64 _InterlockedCompareExchange64_HLERelease( - __int64 volatile *Destination, - __int64 Exchange, - __int64 Comparand); - -/* ========================================================================== */ -/* 128-Bit Atomic Intrinsics: */ -/* Exchange */ -unsigned char _InterlockedCompareExchange128( - __int64 volatile *Destination, - __int64 ExchangeHigh, - __int64 ExchangeLow, - __int64 *ComparandResult); - -#endif - -/* Win32 InterlockedXX functions are defined as macros */ -#define InterlockedExchange8 _InterlockedExchange8 -#define InterlockedExchangeAdd8 _InterlockedExchangeAdd8 -#define InterlockedExchangeAnd8 _InterlockedExchangeAnd8 -#define InterlockedExchangeOr8 _InterlockedExchangeOr8 -#define InterlockedExchangeXor8 _InterlockedExchangeXor8 -#define InterlockedDecrement8 _InterlockedDecrement8 -#define InterlockedIncrement8 _InterlockedIncrement8 -#define InterlockedCompareExchange8 _InterlockedCompareExchange8 - -#define InterlockedExchange16 _InterlockedExchange16 -#define InterlockedExchangeAdd16 _InterlockedExchangeAdd16 -#define InterlockedExchangeAnd16 _InterlockedExchangeAnd16 -#define InterlockedExchangeOr16 _InterlockedExchangeOr16 -#define InterlockedExchangeXor16 _InterlockedExchangeXor16 -#define InterlockedDecrement16 _InterlockedDecrement16 -#define InterlockedIncrement16 _InterlockedIncrement16 -#define InterlockedCompareExchange16 _InterlockedCompareExchange16 - -#define InterlockedExchange _InterlockedExchange -#define InterlockedExchangeAdd _InterlockedExchangeAdd -#define InterlockedExchangeAnd _InterlockedExchangeAnd -#define InterlockedExchangeOr _InterlockedExchangeOr -#define InterlockedExchangeXor _InterlockedExchangeXor -#define InterlockedDecrement _InterlockedDecrement -#define InterlockedIncrement _InterlockedIncrement -#define InterlockedCompareExchange _InterlockedCompareExchange - -#ifdef _AMD64_ - #define InterlockedExchange64 _InterlockedExchange64 - #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64 - #define InterlockedExchangeAnd64 _InterlockedExchangeAnd64 - #define InterlockedExchangeOr64 _InterlockedExchangeOr64 - #define InterlockedExchangeXor64 _InterlockedExchangeXor64 - #define InterlockedDecrement64 _InterlockedDecrement64 - #define InterlockedIncrement64 _InterlockedIncrement64 - #define InterlockedCompareExchange64 _InterlockedCompareExchange64 - - #define InterlockedCompareExchange128 _InterlockedCompareExchange128 -#endif - - -/* ========================================================================== */ -/* Barriers: */ -void _ReadWriteBarrier(void); -#pragma intrinsic(_ReadWriteBarrier) - -#ifdef _AMD64_ - #define MemoryBarrier __faststorefence - #define YieldProcessor _mm_pause - -#elif defined(_M_IX86) - FORCEINLINE void - MemoryBarrier(void) - { - LONG Barrier; - __asm { - xchg Barrier, eax - } - } - #define YieldProcessor __asm { rep nop } -#endif - -#if defined(__cplusplus) -} -#endif - -/* Enable all warnings */ -#if defined(_MSC_VER) - #pragma warning(pop) -#endif - -#endif /* WINDOWS_ATOMIC_H */ -#endif /* _WINDOWS_ */ - - -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Arvid Gerstmann. All rights reserved. - */ -#ifndef _WINDOWS_ -#ifndef WINDOWS_DBGHELP_H -#define WINDOWS_DBGHELP_H - -/* Disable all warnings */ -#if defined(_MSC_VER) - #pragma warning(push, 0) -#endif - -#ifndef WINDOWS_BASE_H -#include "windows_base.h" -#endif -#if defined(__cplusplus) -extern "C" { -#endif - -/* Exceptions: */ -#define EXCEPTION_MAXIMUM_PARAMETERS 15 -#define EXCEPTION_EXECUTE_HANDLER 0x1 -#define EXCEPTION_CONTINUE_EXECUTION 0xFFFFFFFF -#define EXCEPTION_CONTINUE_SEARCH 0x0 - -#define EXCEPTION_ACCESS_VIOLATION ((DWORD)0xC0000005L) -#define EXCEPTION_DATATYPE_MISALIGNMENT ((DWORD)0x80000002L) -#define EXCEPTION_BREAKPOINT ((DWORD)0x80000003L) -#define EXCEPTION_SINGLE_STEP ((DWORD)0x80000004L) -#define EXCEPTION_ARRAY_BOUNDS_EXCEEDED ((DWORD)0xC000008CL) -#define EXCEPTION_FLT_DENORMAL_OPERAND ((DWORD)0xC000008DL) -#define EXCEPTION_FLT_DIVIDE_BY_ZERO ((DWORD)0xC000008EL) -#define EXCEPTION_FLT_INEXACT_RESULT ((DWORD)0xC000008FL) -#define EXCEPTION_FLT_INVALID_OPERATION ((DWORD)0xC0000090L) -#define EXCEPTION_FLT_OVERFLOW ((DWORD)0xC0000091L) -#define EXCEPTION_FLT_STACK_CHECK ((DWORD)0xC0000092L) -#define EXCEPTION_FLT_UNDERFLOW ((DWORD)0xC0000093L) -#define EXCEPTION_INT_DIVIDE_BY_ZERO ((DWORD)0xC0000094L) -#define EXCEPTION_INT_OVERFLOW ((DWORD)0xC0000095L) -#define EXCEPTION_PRIV_INSTRUCTION ((DWORD)0xC0000096L) -#define EXCEPTION_IN_PAGE_ERROR ((DWORD)0xC0000006L) -#define EXCEPTION_STACK_OVERFLOW ((DWORD)0xC00000FDL) -#define EXCEPTION_ILLEGAL_INSTRUCTION ((DWORD)0xC000001DL) -#define EXCEPTION_NONCONTINUABLE_EXCEPTION ((DWORD)0xC0000025L) -#define EXCEPTION_INVALID_DISPOSITION ((DWORD)0xC0000026L) -#define EXCEPTION_GUARD_PAGE ((DWORD)0x80000001L) -#define EXCEPTION_INVALID_HANDLE ((DWORD)0xC0000008L) -#define EXCEPTION_POSSIBLE_DEADLOCK ((DWORD)0xC0000194L) -#define CONTROL_C_EXIT ((DWORD)0xC000013AL) - -/* User defined. */ -#ifndef EXCEPTION_ASSERTION -#define EXCEPTION_ASSERTION ((DWORD)0xEF000001L) -#endif - -/* Snapshotting: */ -#define TH32CS_SNAPTHREAD 0x00000004 -#define IMAGE_FILE_MACHINE_I386 0x014c -#define IMAGE_FILE_MACHINE_AMD64 0x8664 -#define CONTEXT_AMD64 0x100000 -#define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L) -#define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L) -#define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L) -#define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L) -#define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L) - - -#define CONTEXT_FULL \ - (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT) - -#define CONTEXT_ALL \ - (CONTEXT_CONTROL |\ - CONTEXT_INTEGER |\ - CONTEXT_SEGMENTS |\ - CONTEXT_FLOATING_POINT |\ - CONTEXT_DEBUG_REGISTERS) - -/* Symbol Options: */ -#define SYMOPT_CASE_INSENSITIVE 0x00000001 -#define SYMOPT_UNDNAME 0x00000002 -#define SYMOPT_DEFERRED_LOADS 0x00000004 -#define SYMOPT_NO_CPP 0x00000008 -#define SYMOPT_LOAD_LINES 0x00000010 -#define SYMOPT_OMAP_FIND_NEAREST 0x00000020 -#define SYMOPT_LOAD_ANYTHING 0x00000040 -#define SYMOPT_IGNORE_CVREC 0x00000080 -#define SYMOPT_NO_UNQUALIFIED_LOADS 0x00000100 -#define SYMOPT_FAIL_CRITICAL_ERRORS 0x00000200 -#define SYMOPT_EXACT_SYMBOLS 0x00000400 -#define SYMOPT_ALLOW_ABSOLUTE_SYMBOLS 0x00000800 -#define SYMOPT_IGNORE_NT_SYMPATH 0x00001000 -#define SYMOPT_INCLUDE_32BIT_MODULES 0x00002000 -#define SYMOPT_PUBLICS_ONLY 0x00004000 -#define SYMOPT_NO_PUBLICS 0x00008000 -#define SYMOPT_AUTO_PUBLICS 0x00010000 -#define SYMOPT_NO_IMAGE_SEARCH 0x00020000 -#define SYMOPT_SECURE 0x00040000 -#define SYMOPT_NO_PROMPTS 0x00080000 -#define SYMOPT_OVERWRITE 0x00100000 -#define SYMOPT_IGNORE_IMAGEDIR 0x00200000 -#define SYMOPT_FLAT_DIRECTORY 0x00400000 -#define SYMOPT_FAVOR_COMPRESSED 0x00800000 -#define SYMOPT_ALLOW_ZERO_ADDRESS 0x01000000 -#define SYMOPT_DISABLE_SYMSRV_AUTODETECT 0x02000000 - -#define SYMOPT_DEBUG 0x80000000 - -enum SymTagEnum { - SymTagNull, - SymTagExe, - SymTagCompiland, - SymTagCompilandDetails, - SymTagCompilandEnv, - SymTagFunction, - SymTagBlock, - SymTagData, - SymTagAnnotation, - SymTagLabel, - SymTagPublicSymbol, - SymTagUDT, - SymTagEnum, - SymTagFunctionType, - SymTagPointerType, - SymTagArrayType, - SymTagBaseType, - SymTagTypedef, - SymTagBaseClass, - SymTagFriend, - SymTagFunctionArgType, - SymTagFuncDebugStart, - SymTagFuncDebugEnd, - SymTagUsingNamespace, - SymTagVTableShape, - SymTagVTable, - SymTagCustom, - SymTagThunk, - SymTagCustomType, - SymTagManagedType, - SymTagDimension, - SymTagCallSite, - SymTagInlineSite, - SymTagBaseInterface, - SymTagVectorType, - SymTagMatrixType, - SymTagHLSLType -}; - -/* Thread-Information Block: */ -typedef struct _NT_TIB { /* x86 / x64 */ - void * ExceptionList; /* 0x0000 / 0x0000 */ - void * StackBase; /* 0x0004 / 0x0008 */ - void * StackLimit; /* 0x0008 / 0x0010 */ - void * SubSystemTib; /* 0x000c / 0x0018 */ - union { - void * FiberData; /* 0x0010 / 0x0020 */ - DWORD Version; /* 0x0010 / 0x0020 */ - }; - void * ArbitraryUserPointer; /* 0x0014 / 0x0028 */ - struct _NT_TIB *Self; /* 0x0018 / 0x0030 */ -} NT_TIB, *LPNT_TIB, *PNT_TIB; - -/* Exceptions: */ -#if defined(_WIN64) -typedef struct DECLSPEC_ALIGN(16) _M128A { - ULONGLONG Low; - LONGLONG High; -} M128A, *PM128A; -typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT { - WORD ControlWord; - WORD StatusWord; - BYTE TagWord; - BYTE Reserved1; - WORD ErrorOpcode; - DWORD ErrorOffset; - WORD ErrorSelector; - WORD Reserved2; - DWORD DataOffset; - WORD DataSelector; - WORD Reserved3; - DWORD MxCsr; - DWORD MxCsr_Mask; - M128A FloatRegisters[8]; - -#if defined(_WIN64) - M128A XmmRegisters[16]; - BYTE Reserved4[96]; -#else - M128A XmmRegisters[8]; - BYTE Reserved4[192]; - - DWORD StackControl[7]; - DWORD Cr0NpxState; -#endif -} XSAVE_FORMAT, *PXSAVE_FORMAT; -typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32; - -typedef struct DECLSPEC_ALIGN(16) _CONTEXT { - DWORD64 P1Home; - DWORD64 P2Home; - DWORD64 P3Home; - DWORD64 P4Home; - DWORD64 P5Home; - DWORD64 P6Home; - - DWORD ContextFlags; - DWORD MxCsr; - - WORD SegCs; - WORD SegDs; - WORD SegEs; - WORD SegFs; - WORD SegGs; - WORD SegSs; - DWORD EFlags; - - DWORD64 Dr0; - DWORD64 Dr1; - DWORD64 Dr2; - DWORD64 Dr3; - DWORD64 Dr6; - DWORD64 Dr7; - - DWORD64 Rax; - DWORD64 Rcx; - DWORD64 Rdx; - DWORD64 Rbx; - DWORD64 Rsp; - DWORD64 Rbp; - DWORD64 Rsi; - DWORD64 Rdi; - DWORD64 R8; - DWORD64 R9; - DWORD64 R10; - DWORD64 R11; - DWORD64 R12; - DWORD64 R13; - DWORD64 R14; - DWORD64 R15; - DWORD64 Rip; - - union { - XMM_SAVE_AREA32 FltSave; - struct { - M128A Header[2]; - M128A Legacy[8]; - M128A Xmm0; - M128A Xmm1; - M128A Xmm2; - M128A Xmm3; - M128A Xmm4; - M128A Xmm5; - M128A Xmm6; - M128A Xmm7; - M128A Xmm8; - M128A Xmm9; - M128A Xmm10; - M128A Xmm11; - M128A Xmm12; - M128A Xmm13; - M128A Xmm14; - M128A Xmm15; - } DUMMYSTRUCTNAME; - } DUMMYUNIONNAME; - - M128A VectorRegister[26]; - DWORD64 VectorControl; - - DWORD64 DebugControl; - DWORD64 LastBranchToRip; - DWORD64 LastBranchFromRip; - DWORD64 LastExceptionToRip; - DWORD64 LastExceptionFromRip; -} CONTEXT, *PCONTEXT; -typedef PCONTEXT LPCONTEXT; -#elif _WIN32 -typedef struct _FLOATING_SAVE_AREA -{ - ULONG ControlWord; - ULONG StatusWord; - ULONG TagWord; - ULONG ErrorOffset; - ULONG ErrorSelector; - ULONG DataOffset; - ULONG DataSelector; - UCHAR RegisterArea[80]; - ULONG Cr0NpxState; -} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA; -#define MAXIMUM_SUPPORTED_EXTENSION 512 -typedef struct _CONTEXT { - DWORD ContextFlags; - DWORD Dr0; - DWORD Dr1; - DWORD Dr2; - DWORD Dr3; - DWORD Dr6; - DWORD Dr7; - - FLOATING_SAVE_AREA FloatSave; - - DWORD SegGs; - DWORD SegFs; - DWORD SegEs; - DWORD SegDs; - - DWORD Edi; - DWORD Esi; - DWORD Ebx; - DWORD Edx; - DWORD Ecx; - DWORD Eax; - - DWORD Ebp; - DWORD Eip; - DWORD SegCs; - DWORD EFlags; - DWORD Esp; - DWORD SegSs; - - BYTE ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION]; - -} CONTEXT, *PCONTEXT; -typedef PCONTEXT LPCONTEXT; -#endif -typedef struct _EXCEPTION_RECORD { - DWORD ExceptionCode; - DWORD ExceptionFlags; - struct _EXCEPTION_RECORD * ExceptionRecord; - PVOID ExceptionAddress; - DWORD NumberParameters; - ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; -} EXCEPTION_RECORD, *PEXCEPTION_RECORD; -typedef struct _EXCEPTION_POINTERS { - PEXCEPTION_RECORD ExceptionRecord; - PCONTEXT ContextRecord; -} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS; -typedef PEXCEPTION_POINTERS LPEXCEPTION_POINTERS; -typedef LONG (WINAPI *PTOP_LEVEL_EXCEPTION_FILTER)( - struct _EXCEPTION_POINTERS *ExceptionInfo); -typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER; -typedef LONG (WINAPI *PVECTORED_EXCEPTION_HANDLER)( - struct _EXCEPTION_POINTERS *ExceptionInfo); - -/* Symbols: */ -typedef struct _SYMBOL_INFO { - ULONG SizeOfStruct; - ULONG TypeIndex; - ULONG64 Reserved[2]; - ULONG Index; - ULONG Size; - ULONG64 ModBase; - ULONG Flags; - ULONG64 Value; - ULONG64 Address; - ULONG Register; - ULONG Scope; - ULONG Tag; - ULONG NameLen; - ULONG MaxNameLen; - CHAR Name[1]; -} SYMBOL_INFO, *PSYMBOL_INFO; - -typedef struct _SYMBOL_INFOW { - ULONG SizeOfStruct; - ULONG TypeIndex; - ULONG64 Reserved[2]; - ULONG Index; - ULONG Size; - ULONG64 ModBase; - ULONG Flags; - ULONG64 Value; - ULONG64 Address; - ULONG Register; - ULONG Scope; - ULONG Tag; - ULONG NameLen; - ULONG MaxNameLen; - WCHAR Name[1]; -} SYMBOL_INFOW, *PSYMBOL_INFOW; - -typedef struct _IMAGEHLP_LINE64 { - DWORD SizeOfStruct; - PVOID Key; - DWORD LineNumber; - PCHAR FileName; - DWORD64 Address; -} IMAGEHLP_LINE64, *PIMAGEHLP_LINE64; - -typedef struct _IMAGEHLP_LINEW64 { - DWORD SizeOfStruct; - PVOID Key; - DWORD LineNumber; - PWSTR FileName; - DWORD64 Address; -} IMAGEHLP_LINEW64, *PIMAGEHLP_LINEW64; - -/* Thread Walking: */ -typedef struct tagTHREADENTRY32 { - DWORD dwSize; - DWORD cntUsage; - DWORD th32ThreadID; - DWORD th32OwnerProcessID; - LONG tpBasePri; - LONG tpDeltaPri; - DWORD dwFlags; -} THREADENTRY32, *PTHREADENTRY32; -typedef PTHREADENTRY32 LPTHREADENTRY32; - -/* Stack Walking: */ -typedef enum { - AddrMode1616, - AddrMode1632, - AddrModeReal, - AddrModeFlat -} ADDRESS_MODE; -typedef struct _tagADDRESS64 { - DWORD64 Offset; - WORD Segment; - ADDRESS_MODE Mode; -} ADDRESS64, *LPADDRESS64; -typedef struct _KDHELP64 { - DWORD64 Thread; - DWORD ThCallbackStack; - DWORD ThCallbackBStore; - DWORD NextCallback; - DWORD FramePointer; - DWORD64 KiCallUserMode; - DWORD64 KeUserCallbackDispatcher; - DWORD64 SystemRangeStart; - DWORD64 KiUserExceptionDispatcher; - DWORD64 StackBase; - DWORD64 StackLimit; - DWORD64 Reserved[5]; -} KDHELP64, *PKDHELP64; -typedef struct _tagSTACKFRAME64 { - ADDRESS64 AddrPC; - ADDRESS64 AddrReturn; - ADDRESS64 AddrFrame; - ADDRESS64 AddrStack; - ADDRESS64 AddrBStore; - PVOID FuncTableEntry; - DWORD64 Params[4]; - BOOL Far; - BOOL Virtual; - DWORD64 Reserved[3]; - KDHELP64 KdHelp; -} STACKFRAME64, *LPSTACKFRAME64; - -/* Some weird stuff: */ -typedef struct _LUID { - DWORD LowPart; - LONG HighPart; -} LUID, *PLUID; -#pragma pack(push,4) -typedef struct _LUID_AND_ATTRIBUTES { - LUID Luid; - DWORD Attributes; -} LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES; -#pragma pack(pop) -typedef struct _TOKEN_PRIVILEGES { - DWORD PrivilegeCount; - LUID_AND_ATTRIBUTES Privileges[1]; -} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES; - - -/* ========================================================================== */ -/* Debugging: */ -void WINAPI DebugBreak(void); -BOOL WINAPI IsDebuggerPresent(void); -BOOL WINAPI CheckRemoteDebuggerPresent( - HANDLE hProcess, - PBOOL hbDebuggerPresent); -void WINAPI OutputDebugStringA( - LPCSTR lpOutputString); -void WINAPI OutputDebugStringW( - LPCWSTR lpOutputString); -BOOL WINAPI GetThreadContext( - HANDLE hThread, - LPCONTEXT lpContext); -BOOL WINAPI DebugActiveProcess( - DWORD dwProcessId); -BOOL WINAPI DebugActiveProcessStop( - DWORD dwProcessId); - -/* ========================================================================== */ -/* Symbols: */ -DWORD WINAPI SymSetOptions( - DWORD SymOptions); -BOOL WINAPI SymInitialize( - HANDLE hProcess, - LPCSTR UserSearchPath, - BOOL fInvadeProcess); -BOOL WINAPI SymInitializeW( - HANDLE hProcess, - LPCWSTR UserSearchPath, - BOOL fInvadeProcess); -BOOL WINAPI SymFromAddr( - HANDLE hProcess, - DWORD64 Address, - PDWORD64 Displacement, - PSYMBOL_INFO Symbol); -BOOL WINAPI SymFromAddrW( - HANDLE hProcess, - DWORD64 Address, - PDWORD64 Displacement, - PSYMBOL_INFOW Symbol); -PVOID WINAPI SymFunctionTableAccess64( - HANDLE hProcess, - DWORD64 AddrBase); -DWORD64 WINAPI SymGetModuleBase64( - HANDLE hProcess, - DWORD64 dwAddr); -typedef BOOL (*PSYM_ENUMERATESYMBOLS_CALLBACK)( - PSYMBOL_INFO pSymInfo, - ULONG SymbolSize, - PVOID UserContext -); -typedef BOOL (*PSYM_ENUMERATESYMBOLS_CALLBACKW)( - PSYMBOL_INFOW pSymInfo, - ULONG SymbolSize, - PVOID UserContext -); -BOOL WINAPI SymSearch( - HANDLE hProcess, - ULONG64 BaseOfDll, - DWORD Index, - DWORD SymTag, - LPCSTR Mask, - DWORD64 Address, - PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback, - PVOID UserContext, - DWORD Options); -BOOL WINAPI SymSearchW( - HANDLE hProcess, - ULONG64 BaseOfDll, - DWORD Index, - DWORD SymTag, - LPCWSTR Mask, - DWORD64 Address, - PSYM_ENUMERATESYMBOLS_CALLBACKW EnumSymbolsCallback, - PVOID UserContext, - DWORD Options); -BOOL WINAPI SymRefreshModuleList( - HANDLE hProcess); - -typedef BOOL (*PSYM_ENUMMODULES_CALLBACK64)( - LPCSTR ModuleName, - DWORD64 BaseOfDll, - PVOID UserContext -); -typedef BOOL (*PSYM_ENUMMODULES_CALLBACKW64)( - LPCWSTR ModuleName, - DWORD64 BaseOfDll, - PVOID UserContext -); -BOOL WINAPI SymEnumerateModules64( - HANDLE hProcess, - PSYM_ENUMMODULES_CALLBACK64 EnumModulesCallback, - PVOID UserContext -); -BOOL WINAPI SymEnumerateModulesW64( - HANDLE hProcess, - PSYM_ENUMMODULES_CALLBACKW64 EnumModulesCallback, - PVOID UserContext -); - -BOOL WINAPI SymSetSearchPath( - HANDLE hProcess, - LPCSTR SearchPath); -BOOL WINAPI SymSetSearchPathW( - HANDLE hProcess, - LPCWSTR SearchPath); - -BOOL WINAPI SymGetSearchPath( - HANDLE hProcess, - LPSTR SearchPath, - DWORD SearchPathLength); -BOOL WINAPI SymGetSearchPathW( - HANDLE hProcess, - LPWSTR SearchPath, - DWORD SearchPathLength); - -BOOL WINAPI SymCleanup( - HANDLE hProcess); - -BOOL WINAPI SymGetLineFromAddr64( - HANDLE hProcess, - DWORD64 dwAddr, - PDWORD pdwDisplacement, - PIMAGEHLP_LINE64 Line -); - -BOOL WINAPI SymGetLineFromAddrW64( - HANDLE hProcess, - DWORD64 dwAddr, - PDWORD pdwDisplacement, - PIMAGEHLP_LINEW64 Line -); - -/* ========================================================================== */ -/* Exceptions: */ -LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter( - LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter); -LONG WINAPI UnhandledExceptionFilter( - struct _EXCEPTION_POINTERS * ExceptionInfo); - -PVOID WINAPI AddVectoredExceptionHandler( - ULONG FirstHandler, - PVECTORED_EXCEPTION_HANDLER VectoredHandler); - -ULONG WINAPI RemoveVectoredExceptionHandler( - PVOID Handler); - -#define CaptureStackBackTrace RtlCaptureStackBackTrace -USHORT WINAPI RtlCaptureStackBackTrace( - ULONG FramesToSkip, - ULONG FramesToCapture, - PVOID * BackTrace, - PULONG BackTraceHash); -void WINAPI RtlCaptureContext( - PCONTEXT ContextRecord); -void WINAPI RaiseException( - DWORD dwExceptionCode, - DWORD dwExceptionFlags, - DWORD nNumberOfArguments, - const ULONG_PTR * lpArguments); - -/* ========================================================================== */ -/* Thread Walking: */ -HANDLE WINAPI CreateToolhelp32Snapshot( - DWORD dwFlags, - DWORD th32ProcessID); -BOOL WINAPI Thread32First( - HANDLE hSnapshot, - LPTHREADENTRY32 lpte); -BOOL WINAPI Thread32Next( - HANDLE hSnapshot, - LPTHREADENTRY32 lpte); - -/* ========================================================================== */ -/* Stack Walking: */ -typedef BOOL (__stdcall *PREAD_PROCESS_MEMORY_ROUTINE64)( - HANDLE hProcess, - DWORD64 qwBaseAddress, - PVOID lpBuffer, - DWORD nSize, - LPDWORD lpNumberOfBytesRead); - -typedef PVOID (__stdcall *PFUNCTION_TABLE_ACCESS_ROUTINE64)( - HANDLE ahProcess, - DWORD64 AddrBase); - -typedef DWORD64 (__stdcall *PGET_MODULE_BASE_ROUTINE64)( - HANDLE hProcess, - DWORD64 Address); - -typedef DWORD64 (__stdcall *PTRANSLATE_ADDRESS_ROUTINE64)( - HANDLE hProcess, - HANDLE hThread, - LPADDRESS64 lpaddr); - -BOOL WINAPI StackWalk64( - DWORD MachineType, - HANDLE hProcess, - HANDLE hThread, - LPSTACKFRAME64 StackFrame, - PVOID ContextRecord, - PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, - PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, - PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine, - PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress -); - -/* ========================================================================== */ -/* Minidumps: */ -/* == VS Version == */ -typedef struct tagVS_FIXEDFILEINFO -{ - DWORD dwSignature; /* e.g. 0xfeef04bd */ - DWORD dwStrucVersion; /* e.g. 0x00000042 = "0.42" */ - DWORD dwFileVersionMS; /* e.g. 0x00030075 = "3.75" */ - DWORD dwFileVersionLS; /* e.g. 0x00000031 = "0.31" */ - DWORD dwProductVersionMS; /* e.g. 0x00030010 = "3.10" */ - DWORD dwProductVersionLS; /* e.g. 0x00000031 = "0.31" */ - DWORD dwFileFlagsMask; /* = 0x3F for version "0.42" */ - DWORD dwFileFlags; /* e.g. VFF_DEBUG | VFF_PRERELEASE */ - DWORD dwFileOS; /* e.g. VOS_DOS_WINDOWS16 */ - DWORD dwFileType; /* e.g. VFT_DRIVER */ - DWORD dwFileSubtype; /* e.g. VFT2_DRV_KEYBOARD */ - DWORD dwFileDateMS; /* e.g. 0 */ - DWORD dwFileDateLS; /* e.g. 0 */ -} VS_FIXEDFILEINFO; - -/* == Type == */ -typedef enum _MINIDUMP_TYPE { - MiniDumpNormal = 0x00000000, - MiniDumpWithDataSegs = 0x00000001, - MiniDumpWithFullMemory = 0x00000002, - MiniDumpWithHandleData = 0x00000004, - MiniDumpFilterMemory = 0x00000008, - MiniDumpScanMemory = 0x00000010, - MiniDumpWithUnloadedModules = 0x00000020, - MiniDumpWithIndirectlyReferencedMemory = 0x00000040, - MiniDumpFilterModulePaths = 0x00000080, - MiniDumpWithProcessThreadData = 0x00000100, - MiniDumpWithPrivateReadWriteMemory = 0x00000200, - MiniDumpWithoutOptionalData = 0x00000400, - MiniDumpWithFullMemoryInfo = 0x00000800, - MiniDumpWithThreadInfo = 0x00001000, - MiniDumpWithCodeSegs = 0x00002000, - MiniDumpWithoutAuxiliaryState = 0x00004000, - MiniDumpWithFullAuxiliaryState = 0x00008000, - MiniDumpWithPrivateWriteCopyMemory = 0x00010000, - MiniDumpIgnoreInaccessibleMemory = 0x00020000, - MiniDumpWithTokenInformation = 0x00040000, - MiniDumpValidTypeFlags = 0x0007ffff, -} MINIDUMP_TYPE; - -/* == Exception Info == */ -typedef struct _MINIDUMP_EXCEPTION_INFORMATION { - DWORD ThreadId; - PEXCEPTION_POINTERS ExceptionPointers; - BOOL ClientPointers; -} MINIDUMP_EXCEPTION_INFORMATION, *PMINIDUMP_EXCEPTION_INFORMATION; -typedef struct _MINIDUMP_EXCEPTION_INFORMATION64 { - DWORD ThreadId; - ULONG64 ExceptionRecord; - ULONG64 ContextRecord; - BOOL ClientPointers; -} MINIDUMP_EXCEPTION_INFORMATION64, *PMINIDUMP_EXCEPTION_INFORMATION64; - -/* == Callback Input Hell == */ -typedef struct _MINIDUMP_THREAD_CALLBACK { - ULONG ThreadId; - HANDLE ThreadHandle; - CONTEXT Context; - ULONG SizeOfContext; - ULONG64 StackBase; - ULONG64 StackEnd; -} MINIDUMP_THREAD_CALLBACK, *PMINIDUMP_THREAD_CALLBACK; -typedef struct _MINIDUMP_THREAD_EX_CALLBACK { - ULONG ThreadId; - HANDLE ThreadHandle; - CONTEXT Context; - ULONG SizeOfContext; - ULONG64 StackBase; - ULONG64 StackEnd; - ULONG64 BackingStoreBase; - ULONG64 BackingStoreEnd; -} MINIDUMP_THREAD_EX_CALLBACK, *PMINIDUMP_THREAD_EX_CALLBACK; -typedef struct _MINIDUMP_MODULE_CALLBACK { - PWCHAR FullPath; - ULONG64 BaseOfImage; - ULONG SizeOfImage; - ULONG CheckSum; - ULONG TimeDateStamp; - VS_FIXEDFILEINFO VersionInfo; - PVOID CvRecord; - ULONG SizeOfCvRecord; - PVOID MiscRecord; - ULONG SizeOfMiscRecord; -} MINIDUMP_MODULE_CALLBACK, *PMINIDUMP_MODULE_CALLBACK; -typedef struct _MINIDUMP_INCLUDE_THREAD_CALLBACK { - ULONG ThreadId; -} MINIDUMP_INCLUDE_THREAD_CALLBACK, *PMINIDUMP_INCLUDE_THREAD_CALLBACK; -typedef struct _MINIDUMP_INCLUDE_MODULE_CALLBACK { - ULONG64 BaseOfImage; -} MINIDUMP_INCLUDE_MODULE_CALLBACK, *PMINIDUMP_INCLUDE_MODULE_CALLBACK; -typedef struct _MINIDUMP_IO_CALLBACK { - HANDLE Handle; - ULONG64 Offset; - PVOID Buffer; - ULONG BufferBytes; -} MINIDUMP_IO_CALLBACK, *PMINIDUMP_IO_CALLBACK; -typedef struct _MINIDUMP_READ_MEMORY_FAILURE_CALLBACK -{ - ULONG64 Offset; - ULONG Bytes; - HRESULT FailureStatus; -} MINIDUMP_READ_MEMORY_FAILURE_CALLBACK, - *PMINIDUMP_READ_MEMORY_FAILURE_CALLBACK; -typedef struct _MINIDUMP_CALLBACK_INPUT { - ULONG ProcessId; - HANDLE ProcessHandle; - ULONG CallbackType; - union { - HRESULT Status; - MINIDUMP_THREAD_CALLBACK Thread; - MINIDUMP_THREAD_EX_CALLBACK ThreadEx; - MINIDUMP_MODULE_CALLBACK Module; - MINIDUMP_INCLUDE_THREAD_CALLBACK IncludeThread; - MINIDUMP_INCLUDE_MODULE_CALLBACK IncludeModule; - MINIDUMP_IO_CALLBACK Io; - MINIDUMP_READ_MEMORY_FAILURE_CALLBACK ReadMemoryFailure; - ULONG SecondaryFlags; - }; -} MINIDUMP_CALLBACK_INPUT, *PMINIDUMP_CALLBACK_INPUT; - -/* == Callback Output Hell == */ -typedef struct _MINIDUMP_MEMORY_INFO { - ULONG64 BaseAddress; - ULONG64 AllocationBase; - ULONG32 AllocationProtect; - ULONG32 __alignment1; - ULONG64 RegionSize; - ULONG32 State; - ULONG32 Protect; - ULONG32 Type; - ULONG32 __alignment2; -} MINIDUMP_MEMORY_INFO, *PMINIDUMP_MEMORY_INFO; -typedef struct _MINIDUMP_CALLBACK_OUTPUT { - union { - ULONG ModuleWriteFlags; - ULONG ThreadWriteFlags; - ULONG SecondaryFlags; - struct { - ULONG64 MemoryBase; - ULONG MemorySize; - }; - struct { - BOOL CheckCancel; - BOOL Cancel; - }; - HANDLE Handle; - struct { - MINIDUMP_MEMORY_INFO VmRegion; - BOOL Continue; - }; - HRESULT Status; - }; -} MINIDUMP_CALLBACK_OUTPUT, *PMINIDUMP_CALLBACK_OUTPUT; - -/* == Callback Hell == */ -typedef BOOL (WINAPI *MINIDUMP_CALLBACK_ROUTINE)( - PVOID CallbackParam, - PMINIDUMP_CALLBACK_INPUT CallbackInput, - PMINIDUMP_CALLBACK_OUTPUT CallbackOutput); -typedef struct _MINIDUMP_CALLBACK_INFORMATION { - MINIDUMP_CALLBACK_ROUTINE CallbackRoutine; - PVOID CallbackParam; -} MINIDUMP_CALLBACK_INFORMATION, *PMINIDUMP_CALLBACK_INFORMATION; - -/* == User Stream Information == */ -typedef struct _MINIDUMP_USER_STREAM { - ULONG32 Type; - ULONG BufferSize; - PVOID Buffer; -} MINIDUMP_USER_STREAM, *PMINIDUMP_USER_STREAM; -typedef struct _MINIDUMP_USER_STREAM_INFORMATION { - ULONG UserStreamCount; - PMINIDUMP_USER_STREAM UserStreamArray; -} MINIDUMP_USER_STREAM_INFORMATION, *PMINIDUMP_USER_STREAM_INFORMATION; - -/* Function (all this shit above is required for this simple function). */ -BOOL WINAPI MiniDumpWriteDump( - HANDLE hProcess, - DWORD ProcessId, - HANDLE hFile, - MINIDUMP_TYPE DumpType, - PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, - PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, - PMINIDUMP_CALLBACK_INFORMATION CallbackParam); - -/* Priviliges: */ -BOOL WINAPI OpenProcessToken ( - HANDLE ProcessHandle, - DWORD DesiredAccess, - PHANDLE TokenHandle); -BOOL WINAPI LookupPrivilegeValueA( - LPCSTR lpSystemName, - LPCSTR lpName, - PLUID lpLuid); -BOOL WINAPI LookupPrivilegeValueW( - LPCWSTR lpSystemName, - LPCWSTR lpName, - PLUID lpLuid); -BOOL WINAPI AdjustTokenPrivileges( - HANDLE TokenHandle, - BOOL DisableAllPrivileges, - PTOKEN_PRIVILEGES NewState, - DWORD BufferLength, - PTOKEN_PRIVILEGES PreviousState, - PDWORD ReturnLength); - -/* ========================================================================== */ -/* Segment Registers: */ -void __debugbreak(void); -#if _WIN64 -unsigned char __readgsbyte(unsigned long Offset); -unsigned short __readgsword(unsigned long Offset); -unsigned long __readgsdword(unsigned long Offset); -unsigned __int64 __readgsqword(unsigned long Offset); -#else -unsigned char __readfsbyte(unsigned long Offset); -unsigned short __readfsword(unsigned long Offset); -unsigned long __readfsdword(unsigned long Offset); -unsigned __int64 __readfsqword(unsigned long Offset); -#endif - -static NT_TIB * -GetTib(void) -{ -#if _WIN64 - return (NT_TIB *)__readgsqword(0x30); -#else - return (NT_TIB *)__readfsdword(0x18); -#endif -} - - -#if defined(__cplusplus) -} -#endif - -/* Enable all warnings */ -#if defined(_MSC_VER) - #pragma warning(pop) -#endif - -#endif /* WINDOWS_DBGHELP_H */ -#endif /* _WINDOWS_ */ - - -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Arvid Gerstmann. All rights reserved. - */ -#ifndef _WINDOWS_ -#ifndef WINDOWS_DDS_H -#define WINDOWS_DDS_H - -/* Disable all warnings */ -#if defined(_MSC_VER) - #pragma warning(push, 0) -#endif - -#ifndef WINDOWS_BASE_H -#include "windows_base.h" -#endif -#if defined(__cplusplus) -extern "C" { -#endif - -#ifndef DXGI_FORMAT_DEFINED -#define DXGI_FORMAT_DEFINED 1 -typedef enum DXGI_FORMAT -{ - DXGI_FORMAT_UNKNOWN = 0, - DXGI_FORMAT_R32G32B32A32_TYPELESS = 1, - DXGI_FORMAT_R32G32B32A32_FLOAT = 2, - DXGI_FORMAT_R32G32B32A32_UINT = 3, - DXGI_FORMAT_R32G32B32A32_SINT = 4, - DXGI_FORMAT_R32G32B32_TYPELESS = 5, - DXGI_FORMAT_R32G32B32_FLOAT = 6, - DXGI_FORMAT_R32G32B32_UINT = 7, - DXGI_FORMAT_R32G32B32_SINT = 8, - DXGI_FORMAT_R16G16B16A16_TYPELESS = 9, - DXGI_FORMAT_R16G16B16A16_FLOAT = 10, - DXGI_FORMAT_R16G16B16A16_UNORM = 11, - DXGI_FORMAT_R16G16B16A16_UINT = 12, - DXGI_FORMAT_R16G16B16A16_SNORM = 13, - DXGI_FORMAT_R16G16B16A16_SINT = 14, - DXGI_FORMAT_R32G32_TYPELESS = 15, - DXGI_FORMAT_R32G32_FLOAT = 16, - DXGI_FORMAT_R32G32_UINT = 17, - DXGI_FORMAT_R32G32_SINT = 18, - DXGI_FORMAT_R32G8X24_TYPELESS = 19, - DXGI_FORMAT_D32_FLOAT_S8X24_UINT = 20, - DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS = 21, - DXGI_FORMAT_X32_TYPELESS_G8X24_UINT = 22, - DXGI_FORMAT_R10G10B10A2_TYPELESS = 23, - DXGI_FORMAT_R10G10B10A2_UNORM = 24, - DXGI_FORMAT_R10G10B10A2_UINT = 25, - DXGI_FORMAT_R11G11B10_FLOAT = 26, - DXGI_FORMAT_R8G8B8A8_TYPELESS = 27, - DXGI_FORMAT_R8G8B8A8_UNORM = 28, - DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = 29, - DXGI_FORMAT_R8G8B8A8_UINT = 30, - DXGI_FORMAT_R8G8B8A8_SNORM = 31, - DXGI_FORMAT_R8G8B8A8_SINT = 32, - DXGI_FORMAT_R16G16_TYPELESS = 33, - DXGI_FORMAT_R16G16_FLOAT = 34, - DXGI_FORMAT_R16G16_UNORM = 35, - DXGI_FORMAT_R16G16_UINT = 36, - DXGI_FORMAT_R16G16_SNORM = 37, - DXGI_FORMAT_R16G16_SINT = 38, - DXGI_FORMAT_R32_TYPELESS = 39, - DXGI_FORMAT_D32_FLOAT = 40, - DXGI_FORMAT_R32_FLOAT = 41, - DXGI_FORMAT_R32_UINT = 42, - DXGI_FORMAT_R32_SINT = 43, - DXGI_FORMAT_R24G8_TYPELESS = 44, - DXGI_FORMAT_D24_UNORM_S8_UINT = 45, - DXGI_FORMAT_R24_UNORM_X8_TYPELESS = 46, - DXGI_FORMAT_X24_TYPELESS_G8_UINT = 47, - DXGI_FORMAT_R8G8_TYPELESS = 48, - DXGI_FORMAT_R8G8_UNORM = 49, - DXGI_FORMAT_R8G8_UINT = 50, - DXGI_FORMAT_R8G8_SNORM = 51, - DXGI_FORMAT_R8G8_SINT = 52, - DXGI_FORMAT_R16_TYPELESS = 53, - DXGI_FORMAT_R16_FLOAT = 54, - DXGI_FORMAT_D16_UNORM = 55, - DXGI_FORMAT_R16_UNORM = 56, - DXGI_FORMAT_R16_UINT = 57, - DXGI_FORMAT_R16_SNORM = 58, - DXGI_FORMAT_R16_SINT = 59, - DXGI_FORMAT_R8_TYPELESS = 60, - DXGI_FORMAT_R8_UNORM = 61, - DXGI_FORMAT_R8_UINT = 62, - DXGI_FORMAT_R8_SNORM = 63, - DXGI_FORMAT_R8_SINT = 64, - DXGI_FORMAT_A8_UNORM = 65, - DXGI_FORMAT_R1_UNORM = 66, - DXGI_FORMAT_R9G9B9E5_SHAREDEXP = 67, - DXGI_FORMAT_R8G8_B8G8_UNORM = 68, - DXGI_FORMAT_G8R8_G8B8_UNORM = 69, - DXGI_FORMAT_BC1_TYPELESS = 70, - DXGI_FORMAT_BC1_UNORM = 71, - DXGI_FORMAT_BC1_UNORM_SRGB = 72, - DXGI_FORMAT_BC2_TYPELESS = 73, - DXGI_FORMAT_BC2_UNORM = 74, - DXGI_FORMAT_BC2_UNORM_SRGB = 75, - DXGI_FORMAT_BC3_TYPELESS = 76, - DXGI_FORMAT_BC3_UNORM = 77, - DXGI_FORMAT_BC3_UNORM_SRGB = 78, - DXGI_FORMAT_BC4_TYPELESS = 79, - DXGI_FORMAT_BC4_UNORM = 80, - DXGI_FORMAT_BC4_SNORM = 81, - DXGI_FORMAT_BC5_TYPELESS = 82, - DXGI_FORMAT_BC5_UNORM = 83, - DXGI_FORMAT_BC5_SNORM = 84, - DXGI_FORMAT_B5G6R5_UNORM = 85, - DXGI_FORMAT_B5G5R5A1_UNORM = 86, - DXGI_FORMAT_B8G8R8A8_UNORM = 87, - DXGI_FORMAT_B8G8R8X8_UNORM = 88, - DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM = 89, - DXGI_FORMAT_B8G8R8A8_TYPELESS = 90, - DXGI_FORMAT_B8G8R8A8_UNORM_SRGB = 91, - DXGI_FORMAT_B8G8R8X8_TYPELESS = 92, - DXGI_FORMAT_B8G8R8X8_UNORM_SRGB = 93, - DXGI_FORMAT_BC6H_TYPELESS = 94, - DXGI_FORMAT_BC6H_UF16 = 95, - DXGI_FORMAT_BC6H_SF16 = 96, - DXGI_FORMAT_BC7_TYPELESS = 97, - DXGI_FORMAT_BC7_UNORM = 98, - DXGI_FORMAT_BC7_UNORM_SRGB = 99, - DXGI_FORMAT_FORCE_UINT = 0xffffffff -} DXGI_FORMAT; -#endif - -/* Value for magic header */ -#define FOURCC_DDS (0x20534444) - -/* Values for DDS_PIXELFORMAT.dwFlags */ -#define DDPF_FOURCC (0x00000004) - -#pragma pack(push,1) - -typedef struct { - DWORD dwSize; - DWORD dwFlags; - DWORD dwFourCC; - DWORD dwRGBBitCount; - DWORD dwRBitMask; - DWORD dwGBitMask; - DWORD dwBBitMask; - DWORD dwABitMask; -} DDS_PIXELFORMAT; - -typedef struct { - DWORD dwSize; - DWORD dwHeaderFlags; - DWORD dwHeight; - DWORD dwWidth; - DWORD dwPitchOrLinearSize; - DWORD dwDepth; // only if DDS_HEADER_FLAGS_VOLUME is set in dwHeaderFlags - DWORD dwMipMapCount; - DWORD dwReserved1[11]; - DDS_PIXELFORMAT ddspf; - DWORD dwSurfaceFlags; - DWORD dwCubemapFlags; - DWORD dwReserved2[3]; -} DDS_HEADER; - -typedef struct { - DXGI_FORMAT dxgiFormat; - UINT resourceDimension; - UINT miscFlag; - UINT arraySize; - UINT reserved; -} DDS_HEADER_DXT10; - -/* Values for DDS_PIXELFORMAT.dwFourCC */ -#define FMT_DX10 (0x30315844) -#define FMT_DXT1 (0x31545844) /* DXGI_FORMAT_BC1_UNORM */ -#define FMT_DXT3 (0x33545844) /* DXGI_FORMAT_BC2_UNORM */ -#define FMT_DXT5 (0x35545844) /* DXGI_FORMAT_BC3_UNORM */ - -/* Values for dwFlags */ -#define DDSD_CAPS 0x00000001 -#define DDSD_HEIGHT 0x00000002 -#define DDSD_WIDTH 0x00000004 -#define DDSD_PITCH 0x00000008 -#define DDSD_PIXELFORMAT 0x00001000 -#define DDSD_MIPMAPCOUNT 0x00020000 -#define DDSD_LINEARSIZE 0x00080000 -#define DDSD_DEPTH 0x00800000 - -/* Values for dwCaps */ -#define DDSCAPS_COMPLEX 0x00000008 -#define DDSCAPS_MIPMAP 0x04000000 -#define DDSCAPS_TEXTURE 0x00001000 - -/* Blocksizes */ -#define BLOCKSIZE_DXT1 0x8 -#define BLOCKSIZE_DXT3 0x10 -#define BLOCKSIZE_DXT5 0x10 - -#pragma pack(pop) - - -#if defined(__cplusplus) -} -#endif - -/* Enable all warnings */ -#if defined(_MSC_VER) - #pragma warning(pop) -#endif - -#endif /* WINDOWS_DDS_H */ -#endif /* _WINDOWS_ */ - - -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Arvid Gerstmann. All rights reserved. - */ -#ifndef _WINDOWS_ -#ifndef WINDOWS_FILE_H -#define WINDOWS_FILE_H - -/* Disable all warnings */ -#if defined(_MSC_VER) - #pragma warning(push, 0) -#endif - -#ifndef WINDOWS_BASE_H -#include "windows_base.h" -#endif -#if defined(__cplusplus) -extern "C" { -#endif - -/* CreateFile.dwShareMode Enums: */ -#define FILE_SHARE_DELETE 0x00000004 -#define FILE_SHARE_READ 0x00000001 -#define FILE_SHARE_WRITE 0x00000002 - -/* Generic Access Rights: */ -#define GENERIC_READ 0x80000000L -#define GENERIC_WRITE 0x40000000L -#define GENERIC_EXECUTE 0x20000000L -#define GENERIC_ALL 0x10000000L - -/* Standard Access Rights: */ -#define DELETE 0x00010000L -#define READ_CONTROL 0x00020000L -#define WRITE_DAC 0x00040000L -#define WRITE_OWNER 0x00080000L -#define SYNCHRONIZE 0x00100000L - -#define STANDARD_RIGHTS_REQUIRED 0x000F0000L - -#define STANDARD_RIGHTS_READ READ_CONTROL -#define STANDARD_RIGHTS_WRITE READ_CONTROL -#define STANDARD_RIGHTS_EXECUTE READ_CONTROL - -#define STANDARD_RIGHTS_ALL 0x001F0000L -#define SPECIFIC_RIGHTS_ALL 0x0000FFFFL - -/* Commulated Access Rights: */ -#define FILE_READ_DATA 0x0001 -#define FILE_LIST_DIRECTORY 0x0001 -#define FILE_WRITE_DATA 0x0002 -#define FILE_ADD_FILE 0x0002 -#define FILE_APPEND_DATA 0x0004 -#define FILE_ADD_SUBDIRECTORY 0x0004 -#define FILE_CREATE_PIPE_INSTANCE 0x0004 -#define FILE_READ_EA 0x0008 -#define FILE_WRITE_EA 0x0010 -#define FILE_EXECUTE 0x0020 -#define FILE_TRAVERSE 0x0020 -#define FILE_DELETE_CHILD 0x0040 -#define FILE_READ_ATTRIBUTES 0x0080 -#define FILE_WRITE_ATTRIBUTES 0x0100 -#define FILE_ALL_ACCESS \ - (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF) - -#define FILE_GENERIC_READ \ - (STANDARD_RIGHTS_READ | \ - FILE_READ_DATA | \ - FILE_READ_ATTRIBUTES | \ - FILE_READ_EA | \ - SYNCHRONIZE) - -#define FILE_GENERIC_WRITE \ - (STANDARD_RIGHTS_WRITE | \ - FILE_WRITE_DATA | \ - FILE_WRITE_ATTRIBUTES | \ - FILE_WRITE_EA | \ - FILE_APPEND_DATA | \ - SYNCHRONIZE) - -#define FILE_GENERIC_EXECUTE \ - (STANDARD_RIGHTS_EXECUTE | \ - FILE_READ_ATTRIBUTES | \ - FILE_EXECUTE | \ - SYNCHRONIZE) - -/* Creation Disposition: */ -#define CREATE_ALWAYS 2 -#define CREATE_NEW 1 -#define OPEN_ALWAYS 4 -#define OPEN_EXISTING 3 -#define TRUNCATE_EXISTING 5 - -/* File Attributes: */ -#define INVALID_FILE_ATTRIBUTES 0xffffffff -#define FILE_ATTRIBUTE_HIDDEN 0x2 -#define FILE_ATTRIBUTE_NORMAL 0x80 -#define FILE_ATTRIBUTE_DIRECTORY 0x10 -#define FILE_ATTRIBUTE_TEMPORARY 0x100 -#define FILE_ATTRIBUTE_REPARSE_POINT 0x400 - -/* File Offsets: */ -#define FILE_BEGIN 0 -#define FILE_CURRENT 1 -#define FILE_END 2 - -/* File Mapping: */ -#define SECTION_QUERY 0x0001 -#define SECTION_MAP_WRITE 0x0002 -#define SECTION_MAP_READ 0x0004 -#define SECTION_MAP_EXECUTE 0x0008 -#define SECTION_EXTEND_SIZE 0x0010 -#define SECTION_MAP_EXECUTE_EXPLICIT 0x0020 -#define SECTION_ALL_ACCESS \ - (STANDARD_RIGHTS_REQUIRED |\ - SECTION_QUERY |\ - SECTION_MAP_WRITE |\ - SECTION_MAP_READ |\ - SECTION_MAP_EXECUTE |\ - SECTION_EXTEND_SIZE) - -#define FILE_MAP_COPY SECTION_QUERY -#define FILE_MAP_WRITE SECTION_MAP_WRITE -#define FILE_MAP_READ SECTION_MAP_READ -#define FILE_MAP_ALL_ACCESS SECTION_ALL_ACCESS -#define FILE_MAP_EXECUTE SECTION_MAP_EXECUTE_EXPLICIT - -#define PAGE_EXECUTE_READ 0x20 -#define PAGE_EXECUTE_READWRITE 0x40 -#define PAGE_EXECUTE_WRITECOPY 0x80 -#define PAGE_READONLY 0x02 -#define PAGE_READWRITE 0x04 -#define PAGE_WRITECOPY 0x08 - -/* File Change Notifications: */ -#define FILE_NOTIFY_CHANGE_FILE_NAME 0x00000001 -#define FILE_NOTIFY_CHANGE_DIR_NAME 0x00000002 -#define FILE_NOTIFY_CHANGE_ATTRIBUTES 0x00000004 -#define FILE_NOTIFY_CHANGE_SIZE 0x00000008 -#define FILE_NOTIFY_CHANGE_LAST_WRITE 0x00000010 -#define FILE_NOTIFY_CHANGE_SECURITY 0x00000100 - -/* File Type: */ -#define FILE_TYPE_UNKNOWN 0x0000 -#define FILE_TYPE_DISK 0x0001 -#define FILE_TYPE_CHAR 0x0002 -#define FILE_TYPE_PIPE 0x0003 -#define FILE_TYPE_REMOTE 0x8000 - -/* Move Flags: */ -#define MOVEFILE_COPY_ALLOWED 0x2 -#define MOVEFILE_REPLACE_EXISTING 0x1 - -typedef DWORD SECURITY_INFORMATION, *PSECURITY_INFORMATION; -typedef HANDLE PSECURITY_DESCRIPTOR; - - -/* ========================================================================== */ -/* Structures: */ -typedef struct _OVERLAPPED { - ULONG_PTR Internal; - ULONG_PTR InternalHigh; - union { - struct { - DWORD Offset; - DWORD OffsetHigh; - }; - PVOID Pointer; - }; - HANDLE hEvent; -} OVERLAPPED, *LPOVERLAPPED; - -/* File Iteration: */ -typedef struct _WIN32_FIND_DATAA { - DWORD dwFileAttributes; - FILETIME ftCreationTime; - FILETIME ftLastAccessTime; - FILETIME ftLastWriteTime; - DWORD nFileSizeHigh; - DWORD nFileSizeLow; - DWORD dwReserved0; - DWORD dwReserved1; - CHAR cFileName[MAX_PATH]; - CHAR cAlternateFileName[14]; -} WIN32_FIND_DATAA, *PWIN32_FIND_DATAA, *LPWIN32_FIND_DATAA; -typedef struct _WIN32_FIND_DATAW { - DWORD dwFileAttributes; - FILETIME ftCreationTime; - FILETIME ftLastAccessTime; - FILETIME ftLastWriteTime; - DWORD nFileSizeHigh; - DWORD nFileSizeLow; - DWORD dwReserved0; - DWORD dwReserved1; - WCHAR cFileName[MAX_PATH]; - WCHAR cAlternateFileName[14]; -} WIN32_FIND_DATAW, *PWIN32_FIND_DATAW, *LPWIN32_FIND_DATAW; - - -/* ========================================================================== */ -/* File I/O Functions: */ -HANDLE WINAPI CreateFileA( - LPCSTR lpFileName, - DWORD dwDesiredAccess, - DWORD dwShareMode, - LPSECURITY_ATTRIBUTES lpSecurityAttributes, - DWORD dwCreationDisposition, - DWORD dwFlagsAndAttributes, - HANDLE hTemplateFile); -HANDLE WINAPI CreateFileW( - LPCWSTR lpFileName, - DWORD dwDesiredAccess, - DWORD dwShareMode, - LPSECURITY_ATTRIBUTES lpSecurityAttributes, - DWORD dwCreationDisposition, - DWORD dwFlagsAndAttributes, - HANDLE hTemplateFile); - -BOOL WINAPI WriteFile( - HANDLE hFile, - LPCVOID lpBuffer, - DWORD nNumberOfBytesToWrite, - LPDWORD lpNumberOfBytesWritten, - LPOVERLAPPED lpOverlapped); -BOOL WINAPI ReadFile( - HANDLE hFile, - LPVOID lpBuffer, - DWORD nNumberOfBytesToRead, - LPDWORD lpNumberOfBytesRead, - LPOVERLAPPED lpOverlapped); -DWORD WINAPI SetFilePointer( - HANDLE hFile, - LONG lDistanceToMove, - PLONG lpDistanceToMoveHigh, - DWORD dwMoveMethod); -BOOL WINAPI SetFilePointerEx( - HANDLE hFile, - LARGE_INTEGER liDistanceToMove, - PLARGE_INTEGER lpNewFilePointer, - DWORD dwMoveMethod); -BOOL WINAPI FlushFileBuffers( - HANDLE hFile); -DWORD WINAPI GetModuleFileNameA( - HMODULE hModule, - LPSTR lpFileName, - DWORD nSize); -DWORD WINAPI GetModuleFileNameW( - HMODULE hModule, - LPWSTR lpFileName, - DWORD nSize); -DWORD WINAPI GetModuleFileNameExA( - HANDLE hProcess, - HMODULE hModule, - LPSTR lpFileName, - DWORD nSize); -DWORD WINAPI GetModuleFileNameExW( - HANDLE hProcess, - HMODULE hModule, - LPWSTR lpFileName, - DWORD nSize); -HANDLE WINAPI OpenFileMappingA( - DWORD dwDesiredAccess, - BOOL bInheritHandle, - LPCSTR lpName); -HANDLE WINAPI OpenFileMappingW( - DWORD dwDesiredAccess, - BOOL bInheritHandle, - LPCWSTR lpName); -LPVOID WINAPI MapViewOfFile( - HANDLE hFileMappingObject, - DWORD dwDesiredAccess, - DWORD dwFileOffsetHigh, - DWORD dwFileOffsetLow, - SIZE_T dwNumberOfBytesToMap); -LPVOID WINAPI MapViewOfFileEx( - HANDLE hFileMappingObject, - DWORD dwDesiredAccess, - DWORD dwFileOffsetHigh, - DWORD dwFileOffsetLow, - SIZE_T dwNumberOfBytesToMap, - LPVOID lpBaseAddress); -HANDLE WINAPI CreateFileMappingA( - HANDLE hFile, - LPSECURITY_ATTRIBUTES lpAttributes, - DWORD flProtect, - DWORD dwMaximumSizeHigh, - DWORD dwMaximumSizeLow, - LPCSTR lpName); -HANDLE WINAPI CreateFileMappingW( - HANDLE hFile, - LPSECURITY_ATTRIBUTES lpAttributes, - DWORD flProtect, - DWORD dwMaximumSizeHigh, - DWORD dwMaximumSizeLow, - LPCWSTR lpName); -BOOL WINAPI UnmapViewOfFile( - LPCVOID lpBaseAddress); -DWORD WINAPI GetFileAttributesA( - LPCSTR lpFileName); -DWORD WINAPI GetFileAttributesW( - LPCWSTR lpFileName); - -typedef enum _GET_FILEEX_INFO_LEVELS { - GetFileExInfoStandard, - GetFileExMaxInfoLevel -} GET_FILEEX_INFO_LEVELS; -typedef struct _WIN32_FILE_ATTRIBUTE_DATA { - DWORD dwFileAttributes; - FILETIME ftCreationTime; - FILETIME ftLastAccessTime; - FILETIME ftLastWriteTime; - DWORD nFileSizeHigh; - DWORD nFileSizeLow; -} WIN32_FILE_ATTRIBUTE_DATA, *LPWIN32_FILE_ATTRIBUTE_DATA; -BOOL WINAPI GetFileAttributesExA( - LPCSTR lpFileName, - GET_FILEEX_INFO_LEVELS fInfoLevelId, - LPVOID lpFileInformation); -BOOL WINAPI GetFileAttributesExW( - LPCWSTR lpFileName, - GET_FILEEX_INFO_LEVELS fInfoLevelId, - LPVOID lpFileInformation); - -BOOL WINAPI GetFileTime( - HANDLE hFile, - LPFILETIME lpCreationTime, - LPFILETIME lpLastAccessTime, - LPFILETIME lpLastWriteTime); -BOOL WINAPI SetEndOfFile( - HANDLE hFile); -BOOL WINAPI CreateDirectoryA( - LPCSTR lpPathName, - LPSECURITY_ATTRIBUTES lpSecurityAttributes); -BOOL WINAPI CreateDirectoryW( - LPCWSTR lpPathName, - LPSECURITY_ATTRIBUTES lpSecurityAttributes); -BOOL WINAPI CopyFileA( - LPCSTR lpExistingFileName, - LPCSTR lpNewFileName, - BOOL bFailIfExists); -BOOL WINAPI CopyFileW( - LPCWSTR lpExistingFileName, - LPCWSTR lpNewFileName, - BOOL bFailIfExists); -BOOL WINAPI DeleteFileA( - LPCSTR lpFileName); -BOOL WINAPI DeleteFileW( - LPCWSTR lpFileName); -BOOL WINAPI MoveFileA( - LPCSTR lpExistingFileName, - LPCSTR lpNewFileName); -BOOL WINAPI MoveFileW( - LPCWSTR lpExistingFileName, - LPCWSTR lpNewFileName); -BOOL WINAPI MoveFileExA( - LPCSTR lpExistingFileName, - LPCSTR lpNewFileName, - DWORD dwFlags); -BOOL WINAPI MoveFileExW( - LPCWSTR lpExistingFileName, - LPCWSTR lpNewFileName, - DWORD dwFlags); -BOOL WINAPI RemoveDirectoryA( - LPCSTR lpPathName); -BOOL WINAPI RemoveDirectoryW( - LPCWSTR lpPathName); -BOOL WINAPI GetFileSizeEx( - HANDLE hFile, - PLARGE_INTEGER lpFileSize); -BOOL WINAPI FlushViewOfFile( - LPCVOID lpBaseAddress, - SIZE_T dwNumberOfBytesToFlush); - - -/* ========================================================================== */ -/* File Iteration Functions: */ -HANDLE WINAPI FindFirstFileA( - LPCSTR lpFileName, - LPWIN32_FIND_DATAA lpFindFileData); -HANDLE WINAPI FindFirstFileW( - LPCWSTR lpFileName, - LPWIN32_FIND_DATAW lpFindFileData); -BOOL WINAPI FindNextFileA( - HANDLE hFindFile, - LPWIN32_FIND_DATAA lpFindFileData); -BOOL WINAPI FindNextFileW( - HANDLE hFindFile, - LPWIN32_FIND_DATAW lpFindFileData); -BOOL WINAPI FindClose( - HANDLE hFindFile); - -/* ========================================================================== */ -/* File Change Functions: */ -HANDLE WINAPI FindFirstChangeNotificationA( - LPCSTR lpPathName, - BOOL bWatchSubtree, - DWORD dwNotifyFilter); -HANDLE WINAPI FindFirstChangeNotificationW( - LPCWSTR lpPathName, - BOOL bWatchSubtree, - DWORD dwNotifyFilter); -BOOL WINAPI FindNextChangeNotification( - HANDLE hChangeHandle); -BOOL WINAPI FindCloseChangeNotification( - HANDLE hChangeHandle); - -/* ========================================================================== */ -/* File Misc: */ -DWORD WINAPI GetFileType( - HANDLE hFile); - -/* ========================================================================== */ -/* Temp File: */ -UINT WINAPI GetTempFileNameW( - LPCWSTR lpPathName, - LPCWSTR lpPrefixString, - UINT uUnique, - LPWSTR lpTempFileName -); - -DWORD WINAPI GetTempPathW( - DWORD nBufferLength, - LPWSTR lpBuffer -); - -/* ========================================================================== */ -/* File Security: */ -BOOL WINAPI GetFileSecurityA( - LPCSTR lpFileName, - SECURITY_INFORMATION RequestedInformation, - PSECURITY_DESCRIPTOR pSecurityDescriptor, - DWORD nLength, - LPDWORD lpnLengthNeeded); -BOOL WINAPI GetFileSecurityW( - LPCWSTR lpFileName, - SECURITY_INFORMATION RequestedInformation, - PSECURITY_DESCRIPTOR pSecurityDescriptor, - DWORD nLength, - LPDWORD lpnLengthNeeded); - - -#if defined(__cplusplus) -} -#endif - -/* Enable all warnings */ -#if defined(_MSC_VER) - #pragma warning(pop) -#endif - -#endif /* WINDOWS_FILE_H */ -#endif /* _WINDOWS_ */ - - -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Arvid Gerstmann. All rights reserved. - */ -#ifndef _WINDOWS_ -#ifndef WINDOWS_GDI_H -#define WINDOWS_GDI_H - -/* Disable all warnings */ -#if defined(_MSC_VER) - #pragma warning(push, 0) -#endif - -#ifndef WINDOWS_BASE_H -#include "windows_base.h" -#endif -#if defined(__cplusplus) -extern "C" { -#endif - -/* GDI: */ -#define BLACK_BRUSH 4 - - -/* Icons / Cursor: */ -#define MAKEINTRESOURCE(res) ((ULONG_PTR)(USHORT)res) -#define IDI_APPLICATION MAKEINTRESOURCE(32512) -#define IDC_ARROW MAKEINTRESOURCE(32512) - - -/* ========================================================================= */ -/* Functions */ -HCURSOR WINAPI LoadCursorA( - HINSTANCE hInstance, - LPCSTR lpCursorName); -HCURSOR WINAPI LoadCursorW( - HINSTANCE hInstance, - LPCWSTR lpCursorName); -HICON WINAPI LoadIconA( - HINSTANCE hInstance, - LPCSTR lpIconName); -HICON WINAPI LoadIconW( - HINSTANCE hInstance, - LPCWSTR lpIconName); -HGDIOBJ WINAPI GetStockObject( - int fnObject); -HCURSOR WINAPI SetCursor( - HCURSOR hCursor); - - -#if defined(__cplusplus) -} -#endif - -/* Enable all warnings */ -#if defined(_MSC_VER) - #pragma warning(pop) -#endif - -#endif /* WINDOWS_GDI_H */ -#endif /* _WINDOWS_ */ - - -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Arvid Gerstmann. All rights reserved. - */ -#ifndef _WINDOWS_ -#ifndef WINDOWS_IO_H -#define WINDOWS_IO_H - -/* Disable all warnings */ -#if defined(_MSC_VER) - #pragma warning(push, 0) -#endif - -#ifndef WINDOWS_BASE_H -#include "windows_base.h" -#endif -#if defined(__cplusplus) -extern "C" { -#endif - -/* GetStdHandle: */ -#define STD_INPUT_HANDLE ((DWORD)-10) -#define STD_OUTPUT_HANDLE ((DWORD)-11) -#define STD_ERROR_HANDLE ((DWORD)-12) -#define INVALID_HANDLE_VALUE ((HANDLE)(LONG_PTR)-1) -#define ATTACH_PARENT_PROCESS ((DWORD)-1) - -#define HANDLE_FLAG_INHERIT 0x00000001 -#define HANDLE_FLAG_PROTECT_FROM_CLOSE 0x00000002 - -/* Console Colors: */ -#define FOREGROUND_BLUE 0x0001 -#define FOREGROUND_GREEN 0x0002 -#define FOREGROUND_RED 0x0004 -#define FOREGROUND_INTENSITY 0x0008 -#define BACKGROUND_BLUE 0x0010 -#define BACKGROUND_GREEN 0x0020 -#define BACKGROUND_RED 0x0040 -#define BACKGROUND_INTENSITY 0x0080 - -/* Console Handler */ -#define CTRL_C_EVENT 0x0 -#define CTRL_BREAK_EVENT 0x1 -#define CTRL_CLOSE_EVENT 0x2 -#define CTRL_LOGOFF_EVENT 0x5 -#define CTRL_SHUTDOWN_EVENT 0x6 - -/* HeapAlloc, HeapReAlloc, etc: */ -#define HEAP_NO_SERIALIZE 0x00000001 -#define HEAP_ZERO_MEMORY 0x00000008 -#define HEAP_REALLOC_IN_PLACE_ONLY 0x00000010 - -/* Heap / Memory: */ -typedef enum _HEAP_INFORMATION_CLASS { - HeapCompatibilityInformation = 0, - HeapEneableTerminationOnCorruption = 1, - HeapOptimizeResources = 3 -} HEAP_INFORMATION_CLASS; - -/* VirtualAlloc.flAllocationType: */ -#define MEM_COMMIT 0x00001000 -#define MEM_RESERVE 0x00002000 -#define MEM_RESET 0x00080000 -#define MEM_RESET_UNDO 0x01000000 -#define MEM_LARGE_PAGES 0x20000000 -#define MEM_PHYSICAL 0x00400000 -#define MEM_TOP_DOWN 0x00100000 -#define MEM_WRITE_WATCH 0x00200000 - -/* VirtualAlloc.flProtect: */ -#define PAGE_EXECUTE 0x10 -#define PAGE_EXECUTE_READ 0x20 -#define PAGE_EXECUTE_READWRITE 0x40 -#define PAGE_EXECUTE_WRITECOPY 0x80 -#define PAGE_NOACCESS 0x01 -#define PAGE_READONLY 0x02 -#define PAGE_READWRITE 0x04 -#define PAGE_WRITECOPY 0x08 -#define PAGE_TARGETS_INVALID 0x40000000 -#define PAGE_TARGETS_NO_UPDATE 0x40000000 -#define PAGE_GUARD 0x100 -#define PAGE_NOCACHE 0x200 -#define PAGE_WRITECOMBINE 0x400 - -/* VirtualFree.dwFreeType: */ -#define MEM_DECOMMIT 0x4000 -#define MEM_RELEASE 0x8000 - -/* VirtualQuery State and Type: */ -#define MEM_FREE 0x10000 -#define MEM_IMAGE 0x1000000 -#define MEM_MAPPED 0x40000 -#define MEM_PRIVATE 0x20000 - - -/* ========================================================================== */ -/* Structures: */ -typedef struct _COORD { - SHORT X; - SHORT Y; -} COORD, *PCOORD; - -typedef struct _SMALL_RECT { - SHORT Left; - SHORT Top; - SHORT Right; - SHORT Bottom; -} SMALL_RECT; - -typedef struct _CONSOLE_SCREEN_BUFFER_INFO { - COORD dwSize; - COORD dwCursorPosition; - WORD wAttributes; - SMALL_RECT srWindow; - COORD dwMaximumWindowSize; -} CONSOLE_SCREEN_BUFFER_INFO, *PCONSOLE_SCREEN_BUFFER_INFO; - -typedef BOOL (WINAPI *PHANDLER_ROUTINE)(DWORD dwCtrlType); - -typedef struct _MEMORY_BASIC_INFORMATION32 { - DWORD BaseAddress; - DWORD AllocationBase; - DWORD AllocationProtect; - DWORD RegionSize; - DWORD State; - DWORD Protect; - DWORD Type; -} MEMORY_BASIC_INFORMATION32, *PMEMORY_BASIC_INFORMATION32; - -typedef struct __declspec(align(16)) _MEMORY_BASIC_INFORMATION64 { - ULONGLONG BaseAddress; - ULONGLONG AllocationBase; - DWORD AllocationProtect; - DWORD __alignment1; - ULONGLONG RegionSize; - DWORD State; - DWORD Protect; - DWORD Type; - DWORD __alignment2; -} MEMORY_BASIC_INFORMATION64, *PMEMORY_BASIC_INFORMATION64; -#if defined(_WIN64) -typedef MEMORY_BASIC_INFORMATION64 MEMORY_BASIC_INFORMATION; -typedef PMEMORY_BASIC_INFORMATION64 PMEMORY_BASIC_INFORMATION; -#else -typedef MEMORY_BASIC_INFORMATION32 MEMORY_BASIC_INFORMATION; -typedef PMEMORY_BASIC_INFORMATION32 PMEMORY_BASIC_INFORMATION; -#endif - - -/* ========================================================================== */ -/* I/O Functions: */ -HANDLE WINAPI GetStdHandle( - DWORD nStdHandle); -BOOL WINAPI GetConsoleScreenBufferInfo( - HANDLE hConsoleOutput, - PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo); -BOOL WINAPI SetConsoleTextAttribute( - HANDLE hConsoleOutput, - WORD wAttributes); -BOOL WINAPI CloseHandle( - HANDLE hObject); -BOOL WINAPI SetHandleInformation( - HANDLE hObject, - DWORD dwMask, - DWORD dwFlags); -BOOL WINAPI DuplicateHandle( - HANDLE hSourceProcessHandle, - HANDLE hSourceHandle, - HANDLE hTargetProcessHandle, - LPHANDLE lpTargetHandle, - DWORD dwDesiredAccess, - BOOL bInheritHandle, - DWORD dwOptions); - - -LPSTR WINAPI GetCommandLineA(void); -LPWSTR WINAPI GetCommandLineW(void); -#ifdef UNICODE -#define GetCommandLine GetCommandLineW -#else -#define GetCommandLine GetCommandLineA -#endif - -/* ========================================================================== */ -/* Console Functions: */ -BOOL WINAPI AllocConsole(void); -BOOL WINAPI FreeConsole(void); -BOOL WINAPI AttachConsole( - DWORD dwProcessId); -BOOL WINAPI WriteConsoleA( - HANDLE hConsoleOutput, - const void *lpBuffer, - DWORD nNumberOfCharsToWrite, - LPDWORD lpNumberOfCHarsWritten, - LPVOID lpReserved); -BOOL WINAPI WriteConsoleW( - HANDLE hConsoleOutput, - const void *lpBuffer, - DWORD nNumberOfCharsToWrite, - LPDWORD lpNumberOfCHarsWritten, - LPVOID lpReserved); -BOOL WINAPI SetConsoleCtrlHandler( - PHANDLER_ROUTINE HandlerRoutine, - BOOL Add); -HWND WINAPI GetConsoleWindow(void); -BOOL WINAPI SetConsoleOutputCP( - UINT wCodePageID); -UINT WINAPI GetConsoleOutputCP(void); - -/* ========================================================================== */ -/* Heap Functions: */ -HANDLE WINAPI GetProcessHeap(void); -LPVOID WINAPI HeapAlloc( - HANDLE hHeap, - DWORD dwFlags, - SIZE_T dwBytes); -LPVOID WINAPI HeapReAlloc( - HANDLE hHeap, - DWORD dwFlags, - LPVOID lpMem, - SIZE_T dwBytes); -BOOL WINAPI HeapFree( - HANDLE hHeap, - DWORD dwFlags, - LPVOID lpMem); -BOOL WINAPI HeapsetInformation( - HANDLE HeapHandle, - HEAP_INFORMATION_CLASS HeapInformationClass, - PVOID HeapInformation, - SIZE_T HeapInformationLength); -LPVOID WINAPI VirtualAlloc( - LPVOID lpAddress, - SIZE_T dwSize, - DWORD flAllocationType, - DWORD flProtect); -SIZE_T WINAPI VirtualQuery( - LPCVOID lpAddress, - PMEMORY_BASIC_INFORMATION lpBuffer, - SIZE_T dwLength); -BOOL WINAPI VirtualFree( - LPVOID lpAddress, - SIZE_T dwSize, - DWORD dwFreeType); -BOOL WINAPI VirtualProtect( - LPVOID lpAddress, - SIZE_T dwSize, - DWORD flNewProtect, - PDWORD lpflOldProtect); -BOOL WINAPI FlushInstructionCache( - HANDLE hProcess, - LPCVOID lpBaseAddress, - SIZE_T dwSize); - - -/* ========================================================================== */ -/* Pipe Functions: */ -BOOL WINAPI CreatePipe( - PHANDLE hReadPipe, - PHANDLE hWritePipe, - LPSECURITY_ATTRIBUTES lpPipeAttributes, - DWORD nSize); -BOOL WINAPI PeekNamedPipe( - HANDLE hNamedPipe, - LPVOID lpBuffer, - DWORD nBufferSize, - LPDWORD lpBytesRead, - LPDWORD lpTotalBytesAvail, - LPDWORD lpBytesLeftThisMessage); - -/* ========================================================================== */ -/* Path Functions: */ -DWORD WINAPI GetFullPathNameA( - LPCSTR lpFileName, - DWORD nBufferLength, - LPSTR lpBuffer, - LPSTR *lpFilePart); -DWORD WINAPI GetFullPathNameW( - LPCWSTR lpFileName, - DWORD nBufferLength, - LPWSTR lpBuffer, - LPWSTR *lpFilePart); -BOOL WINAPI SetCurrentDirectoryA( - LPCSTR lpPathName); -BOOL WINAPI SetCurrentDirectoryW( - LPCWSTR lpPathName); -DWORD WINAPI GetCurrentDirectoryA( - DWORD nBufferLength, - LPSTR lpBuffer); -DWORD WINAPI GetCurrentDirectoryW( - DWORD nBufferLength, - LPWSTR lpBuffer); - -#if defined(__cplusplus) -} -#endif - -/* Enable all warnings */ -#if defined(_MSC_VER) - #pragma warning(pop) -#endif - -#endif /* WINDOWS_IO_H */ -#endif /* _WINDOWS_ */ - - -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Arvid Gerstmann. All rights reserved. - */ -#ifndef _WINDOWS_ -#ifndef WINDOWS_MISC_H -#define WINDOWS_MISC_H - -/* Disable all warnings */ -#if defined(_MSC_VER) - #pragma warning(push, 0) -#endif - -#include - -#ifndef WINDOWS_BASE_H -#include "windows_base.h" -#endif -#if defined(__cplusplus) -extern "C" { -#endif - -/* MMRESULT: */ -typedef UINT MMRESULT; -#define TIMERR_BASE 96 -#define TIMERR_NOERROR (0) -#define TIMERR_NOCANDO (TIMERR_BASE+1) -#define TIMERR_STRUCT (TIMERR_BASE+33) - -/* Code Pages: */ -#define CP_INSTALLED 0x00000001 -#define CP_SUPPORTED 0x00000002 -#define CP_ACP 0 -#define CP_OEMCP 1 -#define CP_MACCP 2 -#define CP_THREAD_ACP 3 -#define CP_SYMBOL 42 -#define CP_UTF7 65000 -#define CP_UTF8 65001 - -/* Format: */ -#define FORMAT_MESSAGE_ALLOCATE_BUFFER 0x00000100 -#define FORMAT_MESSAGE_ARGUMENT_ARRAY 0x00002000 -#define FORMAT_MESSAGE_FROM_SYSTEM 0x00001000 -#define FORMAT_MESSAGE_IGNORE_INSERTS 0x00000200 -#define FORMAT_MESSAGE_FROM_HMODULE 0x00000800 -#define FORMAT_MESSAGE_FROM_STRING 0x00000400 - -/* Language ID: */ -#define MAKELANGID(p, s) ((((WORD)(s)) << 10) | (WORD )(p)) -#define PRIMARYLANGID(lgid) ((WORD)(lgid) & 0x3ff) -#define SUBLANGID(lgid) ((WORD)(lgid) >> 10) - -#define LANG_NEUTRAL 0x00 -#define LANG_INVARIANT 0x7f -#define LANG_ENGLISH 0x09 -#define LANG_GERMAN 0x07 - -#define SUBLANG_NEUTRAL 0x00 -#define SUBLANG_DEFAULT 0x01 -#define SUBLANG_SYS_DEFAULT 0x02 -#define SUBLANG_CUSTOM_DEFAULT 0x03 -#define SUBLANG_CUSTOM_UNSPECIFIED 0x04 -#define SUBLANG_UI_CUSTOM_DEFAULT 0x05 -#define SUBLANG_ENGLISH_US 0x01 -#define SUBLANG_ENGLISH_UK 0x02 -#define SUBLANG_GERMAN 0x01 - - -/* ========================================================================== */ -/* Structures: */ -/* Time: */ -typedef struct _SYSTEMTIME { - WORD wYear; - WORD wMonth; - WORD wDayOfWeek; - WORD wDay; - WORD wHour; - WORD wMinute; - WORD wSecond; - WORD wMilliseconds; -} SYSTEMTIME, *PSYSTEMTIME; -typedef PSYSTEMTIME LPSYSTEMTIME; - -typedef struct _TIME_ZONE_INFORMATION { - LONG Bias; - WCHAR StandardName[32]; - SYSTEMTIME StandardDate; - LONG StandardBias; - WCHAR DaylightName[32]; - SYSTEMTIME DaylightDate; - LONG DaylightBias; -} TIME_ZONE_INFORMATION, *PTIME_ZONE_INFORMATION; -typedef PTIME_ZONE_INFORMATION LPTIME_ZONE_INFORMATION; - - -/* ========================================================================== */ -/* Functions: */ -/* - * I could've implemented them in assembly, they're like 4 lines, but this is - * avoiding the cost of a function call, if optimizations are turned on. - */ -#ifdef WIN32_BYTESWAP_MACROS -#define _byteswap_ulong(x) (((unsigned long)(x) << 24) | \ - (((unsigned long)(x) << 8) & 0xff0000) | \ - (((unsigned long)(x) >> 8) & 0xff00) | \ - ((unsigned long)(x) >> 24)) -#define _byteswap_uint64(x) (((unsigned __int64)(x) << 56) | \ - (((unsigned __int64)(x) << 40) & 0xff000000000000ULL) | \ - (((unsigned __int64)(x) << 24) & 0xff0000000000ULL) | \ - (((unsigned __int64)(x) << 8) & 0xff00000000ULL) | \ - (((unsigned __int64)(x) >> 8) & 0xff000000ULL) | \ - (((unsigned __int64)(x) >> 24) & 0xff0000ULL) | \ - (((unsigned __int64)(x) >> 40) & 0xff00ULL) | \ - ((unsigned __int64)(x) >> 56)) -#else -unsigned short __cdecl _byteswap_ushort(unsigned short Number); -unsigned long __cdecl _byteswap_ulong (unsigned long Number); -unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64 Number); -#endif - -unsigned int _rotl(unsigned int value, int shift); -unsigned __int64 _rotl64(unsigned __int64 value, int shift); -unsigned char _BitScanForward(unsigned long * Index, unsigned long Mask); -unsigned char _BitScanForward64(unsigned long * Index, unsigned __int64 Mask); - - -/* ========================================================================== */ -/* UTF-16 <-> UTF-8 conversion Functions: */ -int WINAPI WideCharToMultiByte( - UINT CodePage, - DWORD dwFlags, - LPCWSTR lpWideCharStr, - int cchWideChar, - LPSTR lpMultiByteStr, - int cbMultiByte, - LPCSTR lpDefaultChar, - LPBOOL lpUsedDefaultChar); -int WINAPI MultiByteToWideChar( - UINT CodePage, - DWORD dwFlags, - LPCSTR lpMultiByteStr, - int cbMultiByte, - LPWSTR lpWideCharStr, - int cchWideChar); -int WINAPI lstrlenA( - LPCSTR lpString); -int WINAPI lstrlenW( - LPCWSTR lpString); -LPCSTR WINAPI lstrcpyA( - LPCSTR lpString1, - LPCSTR lpString2); -LPCWSTR WINAPI lstrcpyW( - LPCWSTR lpString1, - LPCWSTR lpString2); - -/* ========================================================================== */ -/* Time: */ -void WINAPI GetSystemTime( - LPSYSTEMTIME lpSystemTime); -void WINAPI GetLocalTime( - LPSYSTEMTIME lpSystemTime); -BOOL WINAPI QueryProcessCycleTime( - HANDLE hProcess, - PULONG64 CycleTime); -BOOL WINAPI SystemTimeToFileTime( - const SYSTEMTIME * lpSystemTime, - LPFILETIME lpFileTime); -BOOL WINAPI FileTimeToSystemTime( - const FILETIME * lpFileTime, - LPSYSTEMTIME lpSystemTime); -LONG WINAPI CompareFileTime( - const FILETIME * lpFileTime1, - const FILETIME * lpFileTime2); -void WINAPI GetSystemTimeAsFileTime( - LPFILETIME lpSystemTimeAsFileTime); -BOOL WINAPI SystemTimeToTzSpecificLocalTime( - LPTIME_ZONE_INFORMATION lpTimeZone, - LPSYSTEMTIME lpUniversalTime, - LPSYSTEMTIME lpLocalTime); -DWORD timeGetTime(void); - -/* ========================================================================== */ -/* Environment: */ -BOOL WINAPI SetEnvironmentVariableA( - LPCSTR lpName, - LPCSTR lpValue); -BOOL WINAPI SetEnvironmentVariableW( - LPCWSTR lpName, - LPCWSTR lpValue); -DWORD WINAPI GetEnvironmentVariableA( - LPCSTR lpName, - LPCSTR lpBuffer, - DWORD nSize); -DWORD WINAPI GetEnvironmentVariableW( - LPCWSTR lpName, - LPCWSTR lpBuffer, - DWORD nSize); - -/* ========================================================================== */ -/* Misc Functions: */ -BOOL WINAPI DisableThreadLibraryCalls( - HMODULE hModule); -DWORD WINAPI GetLastError(void); -void WINAPI Sleep( - DWORD dwMilliseconds); -DWORD WINAPI SleepEx( - DWORD dwMilliseconds, - BOOL bAlertable); -HMODULE WINAPI GetModuleHandleA( - LPCSTR lpModuleName); -HMODULE WINAPI GetModuleHandleW( - LPCWSTR lpModuleName); -DWORD WINAPI FormatMessageA( - DWORD dwFlags, - LPCVOID lpSource, - DWORD dwMessageId, - DWORD dwLanguageId, - LPSTR lpBuffer, - DWORD nSize, - va_list *Arguments); -DWORD WINAPI FormatMessageW( - DWORD dwFlags, - LPCVOID lpSource, - DWORD dwMessageId, - DWORD dwLanguageId, - LPWSTR lpBuffer, - DWORD nSize, - va_list *Arguments); - - -/* ========================================================================== */ -/* Timer Functions: */ -DWORD WINAPI GetTickCount(void); -ULONGLONG WINAPI GetTickCount64(void); -BOOL WINAPI QueryPerformanceFrequency( - LARGE_INTEGER *lpFrequency); -BOOL WINAPI QueryPerformanceCounter( - LARGE_INTEGER *lpPerformanceCount); - - -/* ========================================================================== */ -/* Multi Media Timer: */ -#define TIMERR_NOERROR (0) /* no error */ -#define TIMERR_NOCANDO (TIMERR_BASE+1) /* request not completed */ -#define TIMERR_STRUCT (TIMERR_BASE+33) /* time struct size */ - -typedef struct timecaps_tag { - UINT wPeriodMin; /* minimum period supported */ - UINT wPeriodMax; /* maximum period supported */ -} TIMECAPS, *PTIMECAPS, *NPTIMECAPS, *LPTIMECAPS; -typedef UINT MMRESULT; - -MMRESULT WINAPI timeGetDevCaps(LPTIMECAPS ptc, UINT cbtc); -MMRESULT WINAPI timeBeginPeriod(UINT uPeriod); -MMRESULT WINAPI timeEndPeriod(UINT uPeriod); - - -/* ========================================================================== */ -/* DLL Functions: */ -HMODULE WINAPI LoadLibraryA( - LPCSTR lpFileName); -HMODULE WINAPI LoadLibraryW( - LPCWSTR lpFileName); -HMODULE WINAPI LoadLibraryExA( - LPCSTR lpLibFileName, - HANDLE hFile, - DWORD dwFlags); -HMODULE WINAPI LoadLibraryExW( - LPCWSTR lpLibFileName, - HANDLE hFile, - DWORD dwFlags); -FARPROC WINAPI GetProcAddress( - HMODULE hModule, - LPCSTR lProcName); -PROC WINAPI wglGetProcAddress( - LPCSTR lpszProc); -BOOL WINAPI FreeLibrary( - HMODULE hModule); - -/* ========================================================================== */ -/* Libc Replacements: */ -PVOID SecureZeroMemory( - PVOID ptr, - SIZE_T cnt); - -#if defined(__cplusplus) -} -#endif - -/* Enable all warnings */ -#if defined(_MSC_VER) - #pragma warning(pop) -#endif - -#endif /* WINDOWS_MISC_H */ -#endif /* _WINDOWS_ */ - - -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Arvid Gerstmann. All rights reserved. - */ -#ifndef _WINDOWS_ -#ifndef WINDOWS_PROCESS_H -#define WINDOWS_PROCESS_H - -/* Disable all warnings */ -#if defined(_MSC_VER) - #pragma warning(push, 0) -#endif - -#ifndef WINDOWS_BASE_H -#include "windows_base.h" -#endif -#if defined(__cplusplus) -extern "C" { -#endif - -/* Originally defined in threads.h */ -#ifndef INFINITE -#define INFINITE 0xffffffff -#endif - -/* Originally defined in file.h */ -#ifndef STANDARD_RIGHTS_REQUIRED -#define STANDARD_RIGHTS_REQUIRED 0x000F0000L -#endif -#ifndef SYNCHRONIZE -#define SYNCHRONIZE 0x00100000L -#endif - -/* Process Access Rights: */ -#define PROCESS_DUP_HANDLE (0x0040) -#define PROCESS_QUERY_INFORMATION (0x0400) -#define PROCESS_SUSPEND_RESUME (0x0800) -#define PROCESS_TERMINATE (0x0001) -#define PROCESS_VM_READ (0x0010) -#define PROCESS_ALL_ACCESS \ - (STANDARD_RIGHTS_REQUIRED | \ - SYNCHRONIZE | \ - 0xFFFF) - -/* Tokens: */ -#define TOKEN_ASSIGN_PRIMARY (0x0001) -#define TOKEN_DUPLICATE (0x0002) -#define TOKEN_IMPERSONATE (0x0004) -#define TOKEN_QUERY (0x0008) -#define TOKEN_QUERY_SOURCE (0x0010) -#define TOKEN_ADJUST_PRIVILEGES (0x0020) -#define TOKEN_ADJUST_GROUPS (0x0040) -#define TOKEN_ADJUST_DEFAULT (0x0080) -#define TOKEN_ADJUST_SESSIONID (0x0100) - -#define TOKEN_ALL_ACCESS_P (STANDARD_RIGHTS_REQUIRED | \ - TOKEN_ASSIGN_PRIMARY | \ - TOKEN_DUPLICATE | \ - TOKEN_IMPERSONATE | \ - TOKEN_QUERY | \ - TOKEN_QUERY_SOURCE | \ - TOKEN_ADJUST_PRIVILEGES | \ - TOKEN_ADJUST_GROUPS | \ - TOKEN_ADJUST_DEFAULT) - -#define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L) -#define SE_PRIVILEGE_ENABLED (0x00000002L) -#define SE_PRIVILEGE_REMOVED (0X00000004L) -#define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L) - -/* Status */ -#define STATUS_WAIT_0 ((DWORD)0x00000000L) -#define STATUS_TIMEOUT ((DWORD)0x00000102L) -#define STATUS_PENDING ((DWORD)0x00000103L) -#define STILL_ACTIVE STATUS_PENDING - -/* Startupinfo */ -#define STARTF_USESHOWWINDOW 0x00000001 -#define STARTF_USESIZE 0x00000002 -#define STARTF_USEPOSITION 0x00000004 -#define STARTF_USECOUNTCHARS 0x00000008 -#define STARTF_USEFILLATTRIBUTE 0x00000010 -#define STARTF_RUNFULLSCREEN 0x00000020 -#define STARTF_FORCEONFEEDBACK 0x00000040 -#define STARTF_FORCEOFFFEEDBACK 0x00000080 -#define STARTF_USESTDHANDLES 0x00000100 - - -/* Priority Classes / CreateProcess: */ -#define NORMAL_PRIORITY_CLASS 0x00000020 - -/* Job Objects: */ -#define JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE 0x00002000 -typedef enum _JOBOBJECTINFOCLASS { - JobObjectBasicAccountingInformation = 1, - JobObjectBasicLimitInformation, - JobObjectBasicProcessIdList, - JobObjectBasicUIRestrictions, - JobObjectSecurityLimitInformation, // deprecated - JobObjectEndOfJobTimeInformation, - JobObjectAssociateCompletionPortInformation, - JobObjectBasicAndIoAccountingInformation, - JobObjectExtendedLimitInformation, - JobObjectJobSetInformation, - JobObjectGroupInformation, - JobObjectNotificationLimitInformation, - JobObjectLimitViolationInformation, - JobObjectGroupInformationEx, - JobObjectCpuRateControlInformation, - JobObjectCompletionFilter, - JobObjectCompletionCounter, - JobObjectReserved1Information = 18, - JobObjectReserved2Information, - JobObjectReserved3Information, - JobObjectReserved4Information, - JobObjectReserved5Information, - JobObjectReserved6Information, - JobObjectReserved7Information, - JobObjectReserved8Information, - JobObjectReserved9Information, - MaxJobObjectInfoClass -} JOBOBJECTINFOCLASS; - -/* Process: */ -typedef struct _STARTUPINFOA { - DWORD cb; - LPSTR lpReserved; - LPSTR lpDesktop; - LPSTR lpTitle; - DWORD dwX; - DWORD dwY; - DWORD dwXSize; - DWORD dwYSize; - DWORD dwXCountChars; - DWORD dwYCountChars; - DWORD dwFillAttribute; - DWORD dwFlags; - WORD wShowWindow; - WORD cbReserved2; - LPBYTE lpReserved2; - HANDLE hStdInput; - HANDLE hStdOutput; - HANDLE hStdError; -} STARTUPINFOA, *LPSTARTUPINFOA; -typedef struct _STARTUPINFOW { - DWORD cb; - LPWSTR lpReserved; - LPWSTR lpDesktop; - LPWSTR lpTitle; - DWORD dwX; - DWORD dwY; - DWORD dwXSize; - DWORD dwYSize; - DWORD dwXCountChars; - DWORD dwYCountChars; - DWORD dwFillAttribute; - DWORD dwFlags; - WORD wShowWindow; - WORD cbReserved2; - LPBYTE lpReserved2; - HANDLE hStdInput; - HANDLE hStdOutput; - HANDLE hStdError; -} STARTUPINFOW, *LPSTARTUPINFOW; - -typedef struct _PROC_THREAD_ATTRIBUTE_LIST -*PPROC_THREAD_ATTRIBUTE_LIST, *LPPROC_THREAD_ATTRIBUTE_LIST; -typedef struct _STARTUPINFOEXA { - STARTUPINFOA StartupInfo; - PPROC_THREAD_ATTRIBUTE_LIST lpAttributeList; -} STARTUPINFOEXA, *LPSTARTUPINFOEXA; -typedef struct _STARTUPINFOEXW { - STARTUPINFOW StartupInfo; - PPROC_THREAD_ATTRIBUTE_LIST lpAttributeList; -} STARTUPINFOEXW, *LPSTARTUPINFOEXW; -typedef struct _PROCESS_INFORMATION { - HANDLE hProcess; - HANDLE hThread; - DWORD dwProcessId; - DWORD dwThreadId; -} PROCESS_INFORMATION, *LPPROCESS_INFORMATION; - -/* Job Objects: */ -typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION { - LARGE_INTEGER PerProcessUserTimeLimit; - LARGE_INTEGER PerJobUserTimeLimit; - DWORD LimitFlags; - SIZE_T MinimumWorkingSetSize; - SIZE_T MaximumWorkingSetSize; - DWORD ActiveProcessLimit; - ULONG_PTR Affinity; - DWORD PriorityClass; - DWORD SchedulingClass; -} JOBOBJECT_BASIC_LIMIT_INFORMATION, *PJOBOBJECT_BASIC_LIMIT_INFORMATION; - -typedef struct _IO_COUNTERS { - ULONGLONG ReadOperationCount; - ULONGLONG WriteOperationCount; - ULONGLONG OtherOperationCount; - ULONGLONG ReadTransferCount; - ULONGLONG WriteTransferCount; - ULONGLONG OtherTransferCount; -} IO_COUNTERS, *PIO_COUNTERS; - -typedef struct _JOBOBJECT_EXTENDED_LIMIT_INFORMATION { - JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation; - IO_COUNTERS IoInfo; - SIZE_T ProcessMemoryLimit; - SIZE_T JobMemoryLimit; - SIZE_T PeakProcessMemoryUsed; - SIZE_T PeakJobMemoryUsed; -} JOBOBJECT_EXTENDED_LIMIT_INFORMATION, *PJOBOBJECT_EXTENDED_LIMIT_INFORMATION; - - -/* ========================================================================== */ -/* Process: */ -HANDLE WINAPI GetCurrentProcess(void); -DWORD WINAPI GetCurrentProcessId(void); -void WINAPI ExitProcess(UINT uExitCode); -HANDLE WINAPI OpenProcess( - DWORD dwDesiredAccess, - BOOL bInheritHandle, - DWORD dwProcessId); -BOOL WINAPI CreateProcessA( - LPCSTR lpApplicationName, - LPSTR lpCommandLine, - LPSECURITY_ATTRIBUTES lpProcessAttributes, - LPSECURITY_ATTRIBUTES lpThreadAttributes, - BOOL bInheritHandles, - DWORD dwCreationFlags, - LPVOID lpEnvironment, - LPCSTR lpCurrentDirectory, - LPSTARTUPINFOA lpStartupInfo, - LPPROCESS_INFORMATION lpProcessInformation); -BOOL WINAPI CreateProcessW( - LPCWSTR lpApplicationName, - LPWSTR lpCommandLine, - LPSECURITY_ATTRIBUTES lpProcessAttributes, - LPSECURITY_ATTRIBUTES lpThreadAttributes, - BOOL bInheritHandles, - DWORD dwCreationFlags, - LPVOID lpEnvironment, - LPCWSTR lpCurrentDirectory, - LPSTARTUPINFOW lpStartupInfo, - LPPROCESS_INFORMATION lpProcessInformation); -BOOL WINAPI TerminateProcess( - HANDLE hProcess, - UINT uExitCode); -BOOL WINAPI EnumProcessModules( - HANDLE hProcess, - HMODULE * lphModule, - DWORD cb, - LPDWORD lpcbNeeded); -DWORD WINAPI WaitForInputIdle( - HANDLE hProcess, - DWORD dwMilliseconds); -BOOL WINAPI GetExitCodeProcess( - HANDLE hProcess, - LPDWORD lpExitCode); - -/* ========================================================================== */ -/* Jobs: */ -HANDLE WINAPI CreateJobObjectA( - LPSECURITY_ATTRIBUTES lpJobAttributes, - LPCSTR lpName); -HANDLE WINAPI CreateJobObjectW( - LPSECURITY_ATTRIBUTES lpJobAttributes, - LPCWSTR lpName); -BOOL WINAPI SetInformationJobObject( - HANDLE hJob, - JOBOBJECTINFOCLASS JobObjectInfoClass, - LPVOID lpJobObjectInfo, - DWORD cbJobObjectInfoLength); -BOOL WINAPI AssignProcessToJobObject( - HANDLE hJob, - HANDLE hProcess); - - -#if defined(__cplusplus) -} -#endif - -/* Enable all warnings */ -#if defined(_MSC_VER) - #pragma warning(pop) -#endif - -#endif /* WINDOWS_PROCESS_H */ -#endif /* _WINDOWS_ */ - - -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Arvid Gerstmann. All rights reserved. - */ -#ifndef _WINDOWS_ -#ifndef WINDOWS_SYSINFO_H -#define WINDOWS_SYSINFO_H - -/* Disable all warnings */ -#if defined(_MSC_VER) - #pragma warning(push, 0) -#endif - -#ifndef WINDOWS_BASE_H -#include "windows_base.h" -#endif -#if defined(__cplusplus) -extern "C" { -#endif - -/* Display Devices: */ -#define DISPLAY_DEVICE_ACTIVE 0x00000001 -#define DISPLAY_DEVICE_ATTACHED 0x00000002 -#define DISPLAY_DEVICE_PRIMARY_DEVICE 0x00000004 - -/* System Metrics */ -#define SM_CXSCREEN 0 -#define SM_CYSCREEN 1 -#define SM_CMONITORS 80 - -/* Versions */ -#define VER_EQUAL 1 -#define VER_GREATER 2 -#define VER_GREATER_EQUAL 3 -#define VER_LESS 4 -#define VER_LESS_EQUAL 5 -#define VER_AND 6 -#define VER_OR 7 - -#define _WIN32_WINNT_WINXP 0x0501 -#define _WIN32_WINNT_WS03 0x0502 -#define _WIN32_WINNT_VISTA 0x0600 -#define _WIN32_WINNT_WS08 0x0600 -#define _WIN32_WINNT_WIN7 0x0601 -#define _WIN32_WINNT_WIN8 0x0602 -#define _WIN32_WINNT_WIN81 0x0603 -#define _WIN32_WINNT_WIN10 0x0A00 - -#define VER_MINORVERSION 0x0000001 -#define VER_MAJORVERSION 0x0000002 -#define VER_BUILDNUMBER 0x0000004 -#define VER_PLATFORMID 0x0000008 -#define VER_SERVICEPACKMINOR 0x0000010 -#define VER_SERVICEPACKMAJOR 0x0000020 - -/* Registry Key Classes */ -#define HKEY_CLASSES_ROOT ((HKEY)(ULONG_PTR)((LONG)0x80000000)) -#define HKEY_CURRENT_USER ((HKEY)(ULONG_PTR)((LONG)0x80000001)) -#define HKEY_LOCAL_MACHINE ((HKEY)(ULONG_PTR)((LONG)0x80000002)) -#define HKEY_USERS ((HKEY)(ULONG_PTR)((LONG)0x80000003)) - -/* Registry Types */ -#define REG_NONE 0 -#define REG_SZ 1 -#define REG_EXPAND_SZ 2 - -#define REG_BINARY 3 -#define REG_DWORD 4 -#define REG_DWORD_LITTLE_ENDIAN 4 -#define REG_DWORD_BIG_ENDIAN 5 -#define REG_LINK 6 -#define REG_MULTI_SZ 7 -#define REG_RESOURCE_LIST 8 -#define REG_FULL_RESOURCE_DESCRIPTOR 9 -#define REG_RESOURCE_REQUIREMENTS_LIST 10 -#define REG_QWORD 11 -#define REG_QWORD_LITTLE_ENDIAN 11 - - -/* Registry Access Rights */ -#define KEY_QUERY_VALUE 0x0001 -#define KEY_SET_VALUE 0x0002 -#define KEY_CREATE_SUB_KEY 0x0004 -#define KEY_ENUMERATE_SUB_KEYS 0x0008 -#define KEY_NOTIFY 0x0010 -#define KEY_CREATE_LINK 0x0020 -#define KEY_WOW64_32KEY 0x0200 -#define KEY_WOW64_64KEY 0x0100 -#define KEY_WOW64_RES 0x0300 - -#define KEY_READ \ - ((STANDARD_RIGHTS_READ \ - | KEY_QUERY_VALUE \ - | KEY_ENUMERATE_SUB_KEYS \ - | KEY_NOTIFY) \ - & (~SYNCHRONIZE)) - -#define KEY_WRITE \ - ((STANDARD_RIGHTS_WRITE \ - | KEY_SET_VALUE \ - | KEY_CREATE_SUB_KEY) \ - & (~SYNCHRONIZE)) - -#define KEY_EXECUTE \ - ((KEY_READ) \ - & (~SYNCHRONIZE)) - -#define KEY_ALL_ACCESS \ - ((STANDARD_RIGHTS_ALL \ - | KEY_QUERY_VALUE \ - | KEY_SET_VALUE \ - | KEY_CREATE_SUB_KEY \ - | KEY_ENUMERATE_SUB_KEYS \ - | KEY_NOTIFY \ - | KEY_CREATE_LINK) \ - & (~SYNCHRONIZE)) - - -/* ========================================================================== */ -/* Structures: */ -typedef struct _SYSTEM_INFO { - union { - DWORD dwOemId; - struct { - WORD wProcessorArchitecture; - WORD wReserved; - }; - }; - - DWORD dwPageSize; - LPVOID lpMinimumApplicationAddress; - LPVOID lpMaximumApplicationAddress; - DWORD_PTR dwActiveProcessorMask; - DWORD dwNumberOfProcessors; - DWORD dwProcessorType; - DWORD dwAllocationGranularity; - WORD wProcessorLevel; - WORD wProcessorRevision; -} SYSTEM_INFO, *LPSYSTEM_INFO; - -/* Device Context: */ -typedef struct _DISPLAY_DEVICEA { - DWORD cb; - CHAR DeviceName[32]; - CHAR DeviceString[128]; - DWORD StateFlags; - CHAR DeviceID[128]; - CHAR DeviceKey[128]; -} DISPLAY_DEVICEA, *PDISPLAY_DEVICEA; -typedef struct _DISPLAY_DEVICEW { - DWORD cb; - WCHAR DeviceName[32]; - WCHAR DeviceString[128]; - DWORD StateFlags; - WCHAR DeviceID[128]; - WCHAR DeviceKey[128]; -} DISPLAY_DEVICEW, *PDISPLAY_DEVICEW; - -/* Version: */ -typedef struct _OSVERSIONINFOEXA { - DWORD dwOSVersionInfoSize; - DWORD dwMajorVersion; - DWORD dwMinorVersion; - DWORD dwBuildNumber; - DWORD dwPlatformId; - CHAR szCSDVersion[128]; - WORD wServicePackMajor; - WORD wServicePackMinor; - WORD wSuiteMask; - BYTE wProductType; - BYTE wReserved; -} OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA; -typedef struct _OSVERSIONINFOEXW { - DWORD dwOSVersionInfoSize; - DWORD dwMajorVersion; - DWORD dwMinorVersion; - DWORD dwBuildNumber; - DWORD dwPlatformId; - WCHAR szCSDVersion[128]; - WORD wServicePackMajor; - WORD wServicePackMinor; - WORD wSuiteMask; - BYTE wProductType; - BYTE wReserved; -} OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW; - -/* SysInfo: */ -typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP { - RelationProcessorCore, - RelationNumaNode, - RelationCache, - RelationProcessorPackage, - RelationGroup, - RelationAll = 0xffff -} LOGICAL_PROCESSOR_RELATIONSHIP; -typedef enum _PROCESSOR_CACHE_TYPE { - CacheUnified, - CacheInstruction, - CacheData, - CacheTrace -} PROCESSOR_CACHE_TYPE; -typedef struct _CACHE_DESCRIPTOR { - BYTE Level; - BYTE Associativity; - WORD LineSize; - DWORD Size; - PROCESSOR_CACHE_TYPE Type; -} CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR; -typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION { - ULONG_PTR ProcessorMask; - LOGICAL_PROCESSOR_RELATIONSHIP Relationship; - union { - struct { - BYTE Flags; - } ProcessorCore; - struct { - DWORD NodeNumber; - } NumaNode; - CACHE_DESCRIPTOR Cache; - ULONGLONG Reserved[2]; - }; -} SYSTEM_LOGICAL_PROCESSOR_INFORMATION, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION; - -/* Processor Information Extended */ -typedef ULONG_PTR KAFFINITY; -typedef struct _GROUP_AFFINITY { - KAFFINITY Mask; - WORD Group; - WORD Reserved[3]; -} GROUP_AFFINITY, *PGROUP_AFFINITY; -typedef struct _NUMA_NODE_RELATIONSHIP { - DWORD NodeNumber; - BYTE Reserved[20]; - GROUP_AFFINITY GroupMask; -} NUMA_NODE_RELATIONSHIP, *PNUMA_NODE_RELATIONSHIP; - -typedef struct _PROCESSOR_GROUP_INFO { - BYTE MaximumProcessorCount; - BYTE ActiveProcessorCount; - BYTE Reserved[38]; - KAFFINITY ActiveProcessorMask; -} PROCESSOR_GROUP_INFO, *PPROCESSOR_GROUP_INFO; -typedef struct _GROUP_RELATIONSHIP { - WORD MaximumGroupCount; - WORD ActiveGroupCount; - BYTE Reserved[20]; - PROCESSOR_GROUP_INFO GroupInfo[1]; -} GROUP_RELATIONSHIP, *PGROUP_RELATIONSHIP; - -typedef struct _CACHE_RELATIONSHIP { - BYTE Level; - BYTE Associativity; - WORD LineSize; - DWORD CacheSize; - PROCESSOR_CACHE_TYPE Type; - BYTE Reserved[20]; - GROUP_AFFINITY GroupMask; -} CACHE_RELATIONSHIP, *PCACHE_RELATIONSHIP; - -typedef struct _PROCESSOR_RELATIONSHIP { - BYTE Flags; - BYTE EfficiencyClass; - BYTE Reserved[21]; - WORD GroupCount; - GROUP_AFFINITY GroupMask[1]; -} PROCESSOR_RELATIONSHIP, *PPROCESSOR_RELATIONSHIP; - -typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX { - LOGICAL_PROCESSOR_RELATIONSHIP Relationship; - DWORD Size; - union { - PROCESSOR_RELATIONSHIP Processor; - NUMA_NODE_RELATIONSHIP NumaNode; - CACHE_RELATIONSHIP Cache; - GROUP_RELATIONSHIP Group; - }; -} SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX; - -typedef struct _PROCESS_MEMORY_COUNTERS { - DWORD cb; - DWORD PageFaultCount; - SIZE_T PeakWorkingSetSize; - SIZE_T WorkingSetSize; - SIZE_T QuotaPeakPagedPoolUsage; - SIZE_T QuotaPagedPoolUsage; - SIZE_T QuotaPeakNonPagedPoolUsage; - SIZE_T QuotaNonPagedPoolUsage; - SIZE_T PagefileUsage; - SIZE_T PeakPagefileUsage; -} PROCESS_MEMORY_COUNTERS, *PPROCESS_MEMORY_COUNTERS; - -/* Memory: */ -typedef struct _MEMORYSTATUSEX { - DWORD dwLength; - DWORD dwMemoryLoad; - DWORDLONG ullTotalPhys; - DWORDLONG ullAvailPhys; - DWORDLONG ullTotalPageFile; - DWORDLONG ullAvailPageFile; - DWORDLONG ullTotalVirtual; - DWORDLONG ullAvailVirtual; - DWORDLONG ullAvailExtendedVirtual; -} MEMORYSTATUSEX, *LPMEMORYSTATUSEX; - -/* Processor: */ -typedef struct _PROCESSOR_NUMBER { - WORD Group; - BYTE Number; - BYTE Reserved; -} PROCESSOR_NUMBER, *PPROCESSOR_NUMBER; - - -/* ========================================================================== */ -/* System Info Functions: */ -void WINAPI GetSystemInfo( - LPSYSTEM_INFO lpSystemInfo); -BOOL WINAPI GlobalMemoryStatusEx( - LPMEMORYSTATUSEX lpBuffer); -BOOL WINAPI GetLogicalProcessorInformation( - PSYSTEM_LOGICAL_PROCESSOR_INFORMATION Buffer, - PDWORD ReturnedLength); -BOOL GetLogicalProcessorInformationEx( - LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType, - PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Buffer, - PDWORD ReturnedLength); -BOOL WINAPI GetProcessMemoryInfo( - HANDLE hProcess, - PPROCESS_MEMORY_COUNTERS ppsmemCounters, - DWORD cb); -BOOL WINAPI GetProcessTimes( - HANDLE hProcess, - LPFILETIME lpCreationTime, - LPFILETIME lpExitTime, - LPFILETIME lpKernelTime, - LPFILETIME lpUserTime); - -/* ========================================================================== */ -/* Processor Functions */ -DWORD WINAPI GetCurrentProcessorNumber(void); -void GetCurrentProcessorNumberEx(PPROCESSOR_NUMBER ProcNumber); -#define ALL_PROCESSOR_GROUPS 0xffff -DWORD GetActiveProcessorCount(WORD GroupNumber); - - -#define MAX_COMPUTERNAME_LENGTH 31 -BOOL WINAPI GetComputerNameA( - LPSTR lpBuffer, - LPDWORD lpnSize); -BOOL WINAPI GetComputerNameW( - LPWSTR lpBuffer, - LPDWORD lpnSize); - -/* Version: */ -BOOL WINAPI VerifyVersionInfoA( - LPOSVERSIONINFOEXA lpVersionInfo, - DWORD dwTypeMask, - DWORDLONG dwlConditionMask); -BOOL WINAPI VerifyVersionInfoW( - LPOSVERSIONINFOEXW lpVersionInfo, - DWORD dwTypeMask, - DWORDLONG dwlConditionMask); -ULONGLONG WINAPI VerSetConditionMask( - ULONGLONG ConditionMask, - DWORD TypeMask, - BYTE Condition); - -FORCEINLINE BOOL -IsWindowsVersionOrGreater(WORD major, WORD minor, WORD servpack) -{ - OSVERSIONINFOEXW vi = { sizeof(vi), major, minor, 0, 0, {0}, servpack }; - return VerifyVersionInfoW(&vi, - VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, - VerSetConditionMask( - VerSetConditionMask( - VerSetConditionMask(0, - VER_MAJORVERSION, VER_GREATER_EQUAL), - VER_MINORVERSION,VER_GREATER_EQUAL), - VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL)); -} - -FORCEINLINE BOOL -IsWindowsVersionOrLess(WORD major, WORD minor, WORD servpack) -{ - OSVERSIONINFOEXW vi = { sizeof(vi), major, minor, 0, 0, {0}, servpack }; - return VerifyVersionInfoW(&vi, - VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, - VerSetConditionMask( - VerSetConditionMask( - VerSetConditionMask(0, - VER_MAJORVERSION, VER_LESS_EQUAL), - VER_MINORVERSION,VER_LESS_EQUAL), - VER_SERVICEPACKMAJOR, VER_LESS_EQUAL)); -} - -#define GREATER IsWindowsVersionOrGreater -FORCEINLINE void -GetWindowsVersionCUSTOM(PWORD major, PWORD minor, PWORD srvpack) -{ - if (GREATER(HIBYTE(_WIN32_WINNT_WIN10), LOBYTE(_WIN32_WINNT_WIN10), 0)) { - *major = 10; - *minor = 0; - *srvpack = 0; - } else if (GREATER(HIBYTE(_WIN32_WINNT_WIN81), LOBYTE(_WIN32_WINNT_WIN81), 0)) { - *major = 6; - *minor = 3; - *srvpack = 0; - } else if (GREATER(HIBYTE(_WIN32_WINNT_WIN8), LOBYTE(_WIN32_WINNT_WIN8), 0)) { - *major = 6; - *minor = 2; - *srvpack = 0; - } else if (GREATER(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 1)) { - *major = 6; - *minor = 1; - *srvpack = 1; - } else if (GREATER(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0)) { - *major = 6; - *minor = 1; - *srvpack = 0; - } else if (GREATER(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 2)) { - *major = 6; - *minor = 0; - *srvpack = 2; - } else if (GREATER(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 1)) { - *major = 6; - *minor = 0; - *srvpack = 1; - } else if (GREATER(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0)) { - *major = 6; - *minor = 0; - *srvpack = 0; - } else if (GREATER(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 3)) { - *major = 5; - *minor = 1; - *srvpack = 2; - } else if (GREATER(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 1)) { - *major = 5; - *minor = 1; - *srvpack = 1; - } else if (GREATER(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0)) { - *major = 5; - *minor = 1; - *srvpack = 0; - } else { - *major = 0; - *minor = 0; - *srvpack = 0; - } -} -#undef GREATER - - -/* ========================================================================== */ -/* CPUID: */ -void __cpuid(int cpuInfo[4], int function_id); -void __cpuidex(int cpuInfo[4], int function_id, int subfunction_id); - -/* ========================================================================== */ -/* Device Context: */ -BOOL WINAPI EnumDisplayDevicesA( - LPCSTR lpDevice, - DWORD iDevNum, - PDISPLAY_DEVICEA lpDisplayDevice, - DWORD dwFlags); -BOOL WINAPI EnumDisplayDevicesW( - LPCWSTR lpDevice, - DWORD iDevNum, - PDISPLAY_DEVICEW lpDisplayDevice, - DWORD dwFlags); - -/* ========================================================================== */ -/* Registry: */ -LONG WINAPI RegOpenKeyExA( - HKEY hKey, - LPCSTR lpSubKey, - DWORD ulOptions, - REGSAM samDesired, - PHKEY phkResult); -LONG WINAPI RegOpenKeyExW( - HKEY hKey, - LPCWSTR lpSubKey, - DWORD ulOptions, - REGSAM samDesired, - PHKEY phkResult); -LONG WINAPI RegQueryValueExA( - HKEY hKey, - LPCSTR lpValueName, - LPDWORD lpReserved, - LPDWORD lpType, - LPBYTE lpData, - LPDWORD lpcbData); -LONG WINAPI RegQueryValueExW( - HKEY hKey, - LPCWSTR lpValueName, - LPDWORD lpReserved, - LPDWORD lpType, - LPBYTE lpData, - LPDWORD lpcbData); -LONG WINAPI RegCreateKeyExA( - HKEY hKey, - LPCSTR lpSubKey, - DWORD Reserved, - LPSTR lpClass, - DWORD dwOptions, - REGSAM samDesired, - LPSECURITY_ATTRIBUTES lpSecurityAttributes, - PHKEY phkResult, - LPDWORD lpdwDisposition); -LONG WINAPI RegCreateKeyExW( - HKEY hKey, - LPCWSTR lpSubKey, - DWORD Reserved, - LPWSTR lpClass, - DWORD dwOptions, - REGSAM samDesired, - LPSECURITY_ATTRIBUTES lpSecurityAttributes, - PHKEY phkResult, - LPDWORD lpdwDisposition); -LONG WINAPI RegEnumValueA( - HKEY hKey, - DWORD dwIndex, - LPSTR lpValueName, - LPDWORD lpcchValueName, - LPDWORD lpReserved, - LPDWORD lpType, - LPBYTE lpData, - LPDWORD lpcbData); -LONG WINAPI RegEnumValueW( - HKEY hKey, - DWORD dwIndex, - LPWSTR lpValueName, - LPDWORD lpcchValueName, - LPDWORD lpReserved, - LPDWORD lpType, - LPBYTE lpData, - LPDWORD lpcbData); -LONG WINAPI RegQueryInfoKeyA( - HKEY hKey, - LPSTR lpClass, - LPDWORD lpcClass, - LPDWORD lpReserved, - LPDWORD lpcSubKeys, - LPDWORD lpcMaxSubKeyLen, - LPDWORD lpcMaxClassLen, - LPDWORD lpcValues, - LPDWORD lpcMaxValueNameLen, - LPDWORD lpcMaxValueLen, - LPDWORD lpcbSecurityDescriptor, - PFILETIME lpftLastWriteTime); -LONG WINAPI RegQueryInfoKeyW( - HKEY hKey, - LPWSTR lpClass, - LPDWORD lpcClass, - LPDWORD lpReserved, - LPDWORD lpcSubKeys, - LPDWORD lpcMaxSubKeyLen, - LPDWORD lpcMaxClassLen, - LPDWORD lpcValues, - LPDWORD lpcMaxValueNameLen, - LPDWORD lpcMaxValueLen, - LPDWORD lpcbSecurityDescriptor, - PFILETIME lpftLastWriteTime); -LONG WINAPI RegEnumKeyExA( - HKEY hKey, - DWORD dwIndex, - LPSTR lpName, - LPDWORD lpcName, - LPDWORD lpReserved, - LPSTR lpClass, - LPDWORD lpcClass, - PFILETIME lpftLastWriteTime); -LONG WINAPI RegEnumKeyExW( - HKEY hKey, - DWORD dwIndex, - LPWSTR lpName, - LPDWORD lpcName, - LPDWORD lpReserved, - LPWSTR lpClass, - LPDWORD lpcClass, - PFILETIME lpftLastWriteTime); -LONG WINAPI RegCloseKey( - HKEY hKey); -LONG WINAPI RegFlushKey( - HKEY hKey); - -#if defined(__cplusplus) -} -#endif - -/* Enable all warnings */ -#if defined(_MSC_VER) - #pragma warning(pop) -#endif - -#endif /* WINDOWS_SYSINFO_H */ -#endif /* _WINDOWS_ */ - - -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Arvid Gerstmann. All rights reserved. - */ -#ifndef _WINDOWS_ -#ifndef WINDOWS_THREADS_H -#define WINDOWS_THREADS_H - -/* Disable all warnings */ -#if defined(_MSC_VER) - #pragma warning(push, 0) -#endif - -#ifndef WINDOWS_BASE_H -#include "windows_base.h" -#endif -#if defined(__cplusplus) -extern "C" { -#endif - -/* WaitForSingleObject, WaitForMultipleObjects, etc: */ -#define INFINITE 0xffffffff - -/* Originally defined in file.h */ -#ifndef STANDARD_RIGHTS_REQUIRED -#define STANDARD_RIGHTS_REQUIRED 0x000F0000L -#endif -#ifndef SYNCHRONIZE -#define SYNCHRONIZE 0x00100000L -#endif - -#define STATUS_WAIT_0 ((DWORD)0x00000000L) -#define STATUS_ABANDONED_WAIT_0 ((DWORD)0x00000080L) -#define STATUS_TIMEOUT ((DWORD)0x00000102L) -#define STATUS_PENDING ((DWORD)0x00000103L) - -#define WAIT_FAILED ((DWORD)0xffffffff) -#define WAIT_OBJECT_0 ((STATUS_WAIT_0) + 0) -#define WAIT_ABANDONED ((STATUS_ABANDONED_WAIT_0) + 0) -#define WAIT_TIMEOUT 258L - -/* TLS: */ -#ifndef TLS_OUT_OF_INDEXES -#define TLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF) -#endif -#ifndef FLS_OUT_OF_INDEXES -#define FLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF) -#endif - - -/* Thread creation flags: */ -#define CREATE_NEW_CONSOLE 0x00000010 -#define CREATE_NO_WINDOW 0x08000000 -#define CREATE_SUSPENDED 0x00000004 -#define DETACHED_PROCESS 0x00000008 - -/* Thread Access Rights: */ -#define THREAD_GET_CONTEXT (0x0008) -#define THREAD_QUERY_INFORMATION (0x0040) -#define THREAD_SUSPEND_RESUME (0x0002) -#define THREAD_TERMINATE (0x0001) -#define THREAD_ALL_ACCESS \ - (STANDARD_RIGHTS_REQUIRED | \ - SYNCHRONIZE | \ - 0xFFFF) - -/* Semaphore Access Rights: */ -#define SEMAPHORE_ALL_ACCESS 0x1F0003 -#define SEMAPHORE_MODIFY_STATE 0x0002 -#define EVENT_ALL_ACCESS 0x1F0003 -#define EVENT_MODIFY_STATE 0x0002 - - -/* ========================================================================== */ -/* Structures: */ -/* Magic for Thread Local Storage: */ -typedef void (NTAPI *PIMAGE_TLS_CALLBACK)( - PVOID DllHandle, - DWORD Reason, - PVOID Reserved); -typedef struct _IMAGE_TLS_DIRECTORY32 { - DWORD StartAddressOfRawData; - DWORD EndAddressOfRawData; - DWORD AddressOfIndex; - DWORD AddressOfCallbacks; - DWORD SizeOfZeroFill; - DWORD Characteristics; -} IMAGE_TLS_DIRECTORY32, *PIMAGE_TLS_DIRECTORY32; -typedef struct _IMAGE_TLS_DIRECTORY64 { - ULONGLONG StartAddressOfRawData; - ULONGLONG EndAddressOfRawData; - ULONGLONG AddressOfIndex; - ULONGLONG AddressOfCallbacks; - DWORD SizeOfZeroFill; - DWORD Characteristics; -} IMAGE_TLS_DIRECTORY64, *PIMAGE_TLS_DIRECTORY64; -#if defined(_WIN64) -typedef IMAGE_TLS_DIRECTORY64 IMAGE_TLS_DIRECTORY; -typedef PIMAGE_TLS_DIRECTORY64 PIMAGE_TLS_DIRECTORY; -#else -typedef IMAGE_TLS_DIRECTORY32 IMAGE_TLS_DIRECTORY; -typedef PIMAGE_TLS_DIRECTORY32 PIMAGE_TLS_DIRECTORY; -#endif - -/* Linked List */ -typedef struct _LIST_ENTRY { - struct _LIST_ENTRY *Flink; - struct _LIST_ENTRY *Blink; -} LIST_ENTRY, *PLIST_ENTRY; - -typedef struct _RTL_CRITICAL_SECTION_DEBUG { - WORD Type; - WORD CreatorBackTraceIndex; - struct _RTL_CRITICAL_SECTION *CriticalSection; - LIST_ENTRY ProcessLocksList; - DWORD EntryCount; - DWORD ContentionCount; - DWORD Flags; - WORD CreatorBackTraceIndexHigh; - WORD SpareWORD; -} RTL_CRITICAL_SECTION_DEBUG, *PRTL_CRITICAL_SECTION_DEBUG; - -#pragma pack(push, 8) -typedef struct _RTL_CRITICAL_SECTION { - PRTL_CRITICAL_SECTION_DEBUG DebugInfo; - LONG LockCount; - LONG RecursionCount; - HANDLE OwningThread; - HANDLE LockSemaphore; - ULONG_PTR SpinCount; -} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION; -typedef RTL_CRITICAL_SECTION CRITICAL_SECTION; -typedef PRTL_CRITICAL_SECTION PCRITICAL_SECTION; -typedef PRTL_CRITICAL_SECTION LPCRITICAL_SECTION; -#pragma pack(pop) - -typedef struct _RTL_CONDITION_VARIABLE { - PVOID Ptr; -} RTL_CONDITION_VARIABLE, *PRTL_CONDITION_VARIABLE; -#define RTL_CONDITION_VARIABLE_INIT {0} -#define RTL_CONDITION_VARIABLE_LOCKMODE_SHARED 0x1 -typedef RTL_CONDITION_VARIABLE CONDITION_VARIABLE; -typedef PRTL_CONDITION_VARIABLE PCONDITION_VARIABLE; - -#define SRWLOCK_INIT {0} -typedef struct _RTL_SRWLOCK { - PVOID Ptr; -} RTL_SRWLOCK, *PRTL_SRWLOCK; -typedef RTL_SRWLOCK SRWLOCK, *PSRWLOCK; - -/* ========================================================================== */ -/* Waiting Functions: */ -DWORD WINAPI WaitForSingleObject( - HANDLE hHandle, - DWORD dwMilliseconds); -DWORD WINAPI WaitForMultipleObjects( - DWORD nCount, - const HANDLE *lpHandles, - BOOL bWaitAll, - DWORD dwMilliseconds); - -DWORD WINAPI WaitForSingleObjectEx( - HANDLE hHandle, - DWORD dwMilliseconds, - BOOL bAlertable); -DWORD WINAPI WaitForMultipleObjectsEx( - DWORD nCount, - const HANDLE *lpHandles, - BOOL bWaitAll, - DWORD dwMilliseconds, - BOOL bAlertable); - -/* ========================================================================== */ -/* Threading Functions: */ -typedef DWORD (WINAPI *PTHREAD_START_ROUTINE)(LPVOID); -typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE; -HANDLE WINAPI CreateThread( - LPSECURITY_ATTRIBUTES lpThreadAttributes, - SIZE_T dwStackSize, - LPTHREAD_START_ROUTINE lpStartAddress, - LPVOID lpParameter, - DWORD dwCreationFlags, - LPDWORD lpThreadId); -HANDLE WINAPI GetCurrentThread(void); -DWORD WINAPI GetCurrentThreadId(void); -DWORD_PTR WINAPI SetThreadAffinityMask( - HANDLE hThread, - DWORD_PTR dwThreadAffinityMask); -HANDLE WINAPI OpenThread( - DWORD dwDesiredAccess, - BOOL bInheritHandle, - DWORD dwThreadId); -DWORD WINAPI SuspendThread( - HANDLE hThread); -DWORD WINAPI ResumeThread( - HANDLE hThread); -void WINAPI ExitThread( - DWORD dwExitCode); -BOOL WINAPI GetProcessAffinityMask( - HANDLE hProcess, - PDWORD_PTR lpProcessAffinityMask, - PDWORD_PTR lpSystemAffinityMask); -BOOL WINAPI SetProcessAffinityMask( - HANDLE hProcess, - DWORD_PTR dwProcessAffinityMask); -BOOL WINAPI SwitchToThread(void); - -/* ========================================================================== */ -/* CriticalSection Functions: */ -void WINAPI InitializeCriticalSection( - LPCRITICAL_SECTION lpCriticalSection); -BOOL WINAPI InitializeCriticalSectionAndSpinCount( - LPCRITICAL_SECTION lpCriticalSection, - DWORD dwSpinCount); -DWORD WINAPI SetCriticalSectionSpinCount( - LPCRITICAL_SECTION lpCriticalSection, - DWORD dwSpinCount); -void WINAPI EnterCriticalSection( - LPCRITICAL_SECTION lpCriticalSection); -BOOL WINAPI TryEnterCriticalSection( - LPCRITICAL_SECTION lpCriticalSection); -void WINAPI LeaveCriticalSection( - LPCRITICAL_SECTION lpCriticalSection); -void WINAPI DeleteCriticalSection( - LPCRITICAL_SECTION lpCriticalSection); - -/* ========================================================================== */ -/* Condition Variable: */ -void WINAPI InitializeConditionVariable( - PCONDITION_VARIABLE ConditionVariable); -BOOL WINAPI SleepConditionVariableCS( - PCONDITION_VARIABLE ConditionVariable, - PCRITICAL_SECTION CriticalSection, - DWORD dwMilliseconds); -void WINAPI WakeAllConditionVariable( - PCONDITION_VARIABLE ConditionVariable); -void WINAPI WakeConditionVariable( - PCONDITION_VARIABLE ConditionVariable); - -/* ========================================================================== */ -/* Mutex Functions: */ -HANDLE WINAPI CreateMutexA( - LPSECURITY_ATTRIBUTES lpMutexAttributes, - BOOL bInitialOwner, - LPCSTR lpName); -HANDLE WINAPI CreateMutexW( - LPSECURITY_ATTRIBUTES lpMutexAttributes, - BOOL bInitialOwner, - LPCWSTR lpName); -BOOL WINAPI ReleaseMutex( - HANDLE hMutex); - -/* ========================================================================== */ -/* Semaphore Functions: */ -HANDLE WINAPI CreateSemaphoreA( - LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, - LONG lInitialCount, - LONG lMaximumCount, - LPCSTR lpName); -HANDLE WINAPI CreateSemaphoreW( - LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, - LONG lInitialCount, - LONG lMaximumCount, - LPCWSTR lpName); -BOOL WINAPI ReleaseSemaphore( - HANDLE hSemaphore, - LONG lReleaseCount, - LPLONG lpPreviousCount); -HANDLE WINAPI OpenSemaphoreA( - DWORD dwDesiredAccess, - BOOL bInheritHandle, - LPCSTR lpName); -HANDLE WINAPI OpenSemaphoreW( - DWORD dwDesiredAccess, - BOOL bInheritHandle, - LPCWSTR lpName); - - -/* ========================================================================== */ -/* Thread-Local Storage: */ -DWORD WINAPI TlsAlloc(void); -BOOL WINAPI TlsSetValue( - DWORD dwTlsIndex, - LPVOID lpTlsValue); -LPVOID WINAPI TlsGetValue( - DWORD dwTlsIndex); -DWORD WINAPI TlsFree( - DWORD dwTlsIndex); - -typedef void(WINAPI *PFLS_CALLBACK_FUNCTION)(PVOID); -DWORD WINAPI FlsAlloc(PFLS_CALLBACK_FUNCTION lpCallback); -BOOL WINAPI FlsFree(DWORD dwFlsIndex); -BOOL WINAPI FlsSetValue(DWORD dwFlsIndex, PVOID lpFlsData); -PVOID WINAPI FlsGetValue(DWORD dwFlsIndex); - - -/* ========================================================================== */ -/* SRW Lock Functions: */ -void WINAPI InitializeSRWLock(PSRWLOCK SRWLock); - -void WINAPI AcquireSRWLockExclusive(PSRWLOCK SRWLock); -void WINAPI AcquireSRWLockShared(PSRWLOCK SRWLock); - -void WINAPI ReleaseSRWLockExclusive(PSRWLOCK SRWLock); -void WINAPI ReleaseSRWLockShared(PSRWLOCK SRWLock); - -BOOL WINAPI TryAcquireSRWLockExclusive(PSRWLOCK SRWLock); -BOOL WINAPI TryAcquireSRWLockShared(PSRWLOCK SRWLock); - -BOOL WINAPI SleepConditionVariableSRW( - PCONDITION_VARIABLE ConditionVariable, - PSRWLOCK SRWLock, - DWORD dwMilliseconds, - ULONG Flags); - -/* ========================================================================== */ -/* Waiting: */ -BOOL WINAPI WaitOnAddress( - void volatile *Address, - PVOID CompareAddress, - SIZE_T AddressSize, - DWORD dwMilliseconds); -void WINAPI WakeByAddressSingle( - PVOID Address); -void WINAPI WakeByAddressAll( - PVOID Address); - -/* ========================================================================== */ -/* Events: */ -HANDLE WINAPI CreateEvent( - LPSECURITY_ATTRIBUTES lpEventAttributes, - BOOL bManualReset, - BOOL bInitialState, - LPCTSTR lpName); -HANDLE WINAPI OpenEvent( - DWORD dwDesiredAccess, - BOOL bInheritHandle, - LPCTSTR lpName); -BOOL WINAPI SetEvent( - HANDLE hEvent); -BOOL WINAPI ResetEvent( - HANDLE hEvent); - - -#if defined(__cplusplus) -} -#endif - -/* Enable all warnings */ -#if defined(_MSC_VER) - #pragma warning(pop) -#endif - -#endif /* WINDOWS_THREADS_H */ -#endif /* _WINDOWS_ */ - - -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Arvid Gerstmann. All rights reserved. - */ -#ifndef _WINDOWS_ -#ifndef WINDOWS_WINDOW_H -#define WINDOWS_WINDOW_H - -/* Disable all warnings */ -#if defined(_MSC_VER) - #pragma warning(push, 0) -#endif - -#ifndef WINDOWS_BASE_H -#include "windows_base.h" -#endif -#if defined(__cplusplus) -extern "C" { -#endif - -/* MessageBox customizations: */ -#define MB_ABORTRETRYIGNORE 0x00000002L -#define MB_CANCELTRYCONTINUE 0x00000006L -#define MB_HELP 0x00004000L -#define MB_OK 0x00000000L -#define MB_OKCANCEL 0x00000001L -#define MB_RETRYCANCEL 0x00000005L -#define MB_YESNO 0x00000004L -#define MB_YESNOCANCEL 0x00000003L - -#define MB_ICONEXCLAMATION 0x00000030L -#define MB_ICONWARNING 0x00000030L -#define MB_ICONINFORMATION 0x00000040L -#define MB_ICONASTERISK 0x00000040L -#define MB_ICONQUESTION 0x00000020L -#define MB_ICONSTOP 0x00000010L -#define MB_ICONERROR 0x00000010L -#define MB_ICONHAND 0x00000010L - -#define MB_DEFBUTTON1 0x00000000L -#define MB_DEFBUTTON2 0x00000100L -#define MB_DEFBUTTON3 0x00000200L -#define MB_DEFBUTTON4 0x00000300L - -#define MB_APPLMODAL 0x00000000L -#define MB_SYSTEMMODAL 0x00001000L -#define MB_TASKMODAL 0x00002000L - -#define MB_DEFAULT_DESKTOP_ONLY 0x00020000L -#define MB_RIGHT 0x00080000L -#define MB_RTLREADING 0x00100000L -#define MB_SETFOREGROUND 0x00010000L -#define MB_TOPMOST 0x00040000L -#define MB_SERVICE_NOTIFICATION 0x00200000L - -#define IDABORT (3) -#define IDCANCEL (2) -#define IDCONTINUE (11) -#define IDIGNORE (5) -#define IDNO (7) -#define IDOK (1) -#define IDRETRY (4) -#define IDTRYAGAIN (10) -#define IDYES (6) - -/* Window Styles: */ -#define WS_OVERLAPPED 0x00000000L -#define WS_POPUP 0x80000000L -#define WS_CHILD 0x40000000L -#define WS_MINIMIZE 0x20000000L -#define WS_VISIBLE 0x10000000L -#define WS_DISABLED 0x08000000L -#define WS_CLIPSIBLINGS 0x04000000L -#define WS_CLIPCHILDREN 0x02000000L -#define WS_MAXIMIZE 0x01000000L -#define WS_CAPTION 0x00C00000L -#define WS_BORDER 0x00800000L -#define WS_DLGFRAME 0x00400000L -#define WS_VSCROLL 0x00200000L -#define WS_HSCROLL 0x00100000L -#define WS_SYSMENU 0x00080000L -#define WS_THICKFRAME 0x00040000L -#define WS_GROUP 0x00020000L -#define WS_TABSTOP 0x00010000L - -#define WS_MINIMIZEBOX 0x00020000L -#define WS_MAXIMIZEBOX 0x00010000L - - -#define WS_TILED WS_OVERLAPPED -#define WS_ICONIC WS_MINIMIZE -#define WS_SIZEBOX WS_THICKFRAME -#define WS_TILEDWINDOW WS_OVERLAPPEDWINDOW - -/* Common Window Styles: */ -#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED | \ - WS_CAPTION | \ - WS_SYSMENU | \ - WS_THICKFRAME | \ - WS_MINIMIZEBOX | \ - WS_MAXIMIZEBOX) -#define WS_POPUPWINDOW (WS_POPUP | \ - WS_BORDER | \ - WS_SYSMENU) -#define WS_CHILDWINDOW (WS_CHILD) - -#define CW_USEDEFAULT ((int)0x80000000) - -/* Class Styles: */ -#define CS_OWNDC 0x0020 -#define CS_VREDRAW 0x0001 -#define CS_HREDRAW 0x0002 - -/* Messages: */ -#define PM_NOREMOVE 0x0000 -#define PM_REMOVE 0x0001 -#define PM_NOYIELD 0x0002 - -#define WM_NULL 0x0000 -#define WM_CREATE 0x0001 -#define WM_DESTROY 0x0002 -#define WM_MOVE 0x0003 -#define WM_SIZE 0x0005 -#define WM_SETFOCUS 0x0007 -#define WM_KILLFOCUS 0x0008 -#define WM_ENABLE 0x000A -#define WM_SETREDRAW 0x000B -#define WM_SETTEXT 0x000C -#define WM_GETTEXT 0x000D -#define WM_GETTEXTLENGTH 0x000E -#define WM_PAINT 0x000F -#define WM_CLOSE 0x0010 -#define WM_QUIT 0x0012 -#define WM_ERASEBKGND 0x0014 -#define WM_SYSCOLORCHANGE 0x0015 -#define WM_SHOWWINDOW 0x0018 -#define WM_WININICHANGE 0x001A -#define WM_NCDESTROY 0x0082 - -#define WM_KEYDOWN 0x0100 -#define WM_KEYUP 0x0101 -#define WM_SYSKEYDOWN 0x0104 -#define WM_SYSKEYUP 0x0105 - -#define WM_SYSCOMMAND 0x0112 - -#define WM_ENTERSIZEMOVE 0x0231 -#define WM_EXITSIZEMOVE 0x0232 - -#define WM_ACTIVATE 0x0006 -#define WA_INACTIVE 0 -#define WA_ACTIVE 1 -#define WA_CLICKACTIVE 2 - -#define SC_KEYMENU 0xF100 - -/* Events: */ -#define EVENT_ALL_ACCESS 0x1F0003 -#define EVENT_MODIFY_STATE 0x0002 - -/* Virtual Keys: */ -#define VK_BACK 0x08 -#define VK_TAB 0x09 -#define VK_SHIFT 0x10 -#define VK_CONTROL 0x11 -#define VK_MENU 0x12 -#define VK_RETURN 0x0D - -#define VK_ESCAPE 0x1B - -#define VK_SPACE 0x20 -#define VK_PRIOR 0x21 -#define VK_NEXT 0x22 -#define VK_END 0x23 -#define VK_HOME 0x24 -#define VK_LEFT 0x25 -#define VK_UP 0x26 -#define VK_RIGHT 0x27 -#define VK_DOWN 0x28 -#define VK_SELECT 0x29 -#define VK_PRINT 0x2A -#define VK_EXECUTE 0x2B -#define VK_SNAPSHOT 0x2C -#define VK_INSERT 0x2D -#define VK_DELETE 0x2E -#define VK_HELP 0x2F - -#define VK_LWIN 0x5B -#define VK_RWIN 0x5C -#define VK_PROCESSKEY 0xE5 - - -/* ========================================================================== */ -/* Structures: */ -typedef struct _RECT { - LONG left; - LONG top; - LONG right; - LONG bottom; -} RECT, *PRECT, *LPRECT; - -/* Window: */ -typedef LRESULT (CALLBACK *WNDPROC)(HWND, UINT, WPARAM, LPARAM); -typedef struct tagWNDCLASS { - UINT style; - WNDPROC lpfnWndProc; - int cbClsExtra; - int cbWndExtra; - HINSTANCE hInstance; - HICON hIcon; - HCURSOR hCursor; - HBRUSH hbrBackground; - LPCTSTR lpszMenuName; - LPCTSTR lpszClassName; -} WNDCLASS, *PWNDCLASS; - -/* Messages: */ -typedef struct tagPOINT { - LONG x; - LONG y; -} POINT, *PPOINT; - -typedef struct tagMSG { - HWND hwnd; - UINT message; - WPARAM wParam; - LPARAM lParam; - DWORD time; - POINT pt; -} MSG, *PMSG, *LPMSG; - - -/* ========================================================================== */ -/* Window Functions: */ -int WINAPI MessageBoxA( - HWND hWND, - LPCSTR lpText, - LPCSTR lpCaption, - UINT uType); -int WINAPI MessageBoxW( - HWND hWND, - LPCWSTR lpText, - LPCWSTR lpCaption, - UINT uType); -ATOM WINAPI RegisterClassA( - WNDCLASS *lpWndClass); -ATOM WINAPI RegisterClassW( - WNDCLASS *lpWndClass); -BOOL WINAPI UnregisterClassA( - LPCSTR lpClassName, - HINSTANCE hInstance); -BOOL WINAPI UnregisterClassW( - LPCWSTR lpClassName, - HINSTANCE hInstance); -HWND WINAPI CreateWindowExA( - DWORD dwExStyle, - LPCSTR lpClassName, - LPCSTR lpWindowName, - DWORD dwStyle, - int x, - int y, - int nWidth, - int nHeight, - HWND hWndParent, - HMENU hMenu, - HINSTANCE hInstance, - LPVOID lpParam); -HWND WINAPI CreateWindowExW( - DWORD dwExStyle, - LPCWSTR lpClassName, - LPCWSTR lpWindowName, - DWORD dwStyle, - int x, - int y, - int nWidth, - int nHeight, - HWND hWndParent, - HMENU hMenu, - HINSTANCE hInstance, - LPVOID lpParam); -BOOL WINAPI ShowWindow( - HWND hWnd, - int nCmdShow); -BOOL WINAPI UpdateWindow( - HWND hWnd); -LRESULT WINAPI DefWindowProcA( - HWND hWnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam); -LRESULT WINAPI DefWindowProcW( - HWND hWnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam); -BOOL WINAPI DestroyWindow( - HWND hWnd); -BOOL WINAPI AdjustWindowRectEx( - LPRECT lpRect, - DWORD dwStyle, - BOOL bMenu, - DWORD dwExStyle); -BOOL WINAPI GetClientRect( - HWND hWnd, - LPRECT lpRect); -int WINAPI GetSystemMetrics( - int nIndex); - -/* ========================================================================== */ -/* Message Queue: */ -BOOL WINAPI PeekMessageA( - LPMSG lpMsg, - HWND hWnd, - UINT wMsgFilterMin, - UINT wMsgFilterMax, - UINT wRemoveMsg); -BOOL WINAPI PeekMessageW( - LPMSG lpMsg, - HWND hWnd, - UINT wMsgFilterMin, - UINT wMsgFilterMax, - UINT wRemoveMsg); -BOOL WINAPI TranslateMessage( - const MSG *lpMsg); -LRESULT WINAPI DispatchMessageA( - const MSG *lpMsg); -LRESULT WINAPI DispatchMessageW( - const MSG *lpMsg); -void WINAPI PostQuitMessage( - int nExitCode); - -/* ========================================================================== */ -/* Events: */ -HANDLE WINAPI CreateEventA( - LPSECURITY_ATTRIBUTES lpEventAttributes, - BOOL bManualReset, - BOOL bInitialState, - LPCSTR lpName); -HANDLE WINAPI CreateEventW( - LPSECURITY_ATTRIBUTES lpEventAttributes, - BOOL bManualReset, - BOOL bInitialState, - LPCWSTR lpName); -HANDLE WINAPI OpenEventA( - DWORD dwDesiredAccess, - BOOL bInheritHandle, - LPCSTR lpName); -HANDLE WINAPI OpenEventW( - DWORD dwDesiredAccess, - BOOL bInheritHandle, - LPCWSTR lpName); -BOOL WINAPI ResetEvent( - HANDLE hEvent); -BOOL WINAPI SetEvent( - HANDLE hEvent); -SHORT WINAPI GetKeyState( - int nVirtKey); - -#if defined(__cplusplus) -} -#endif - -/* Enable all warnings */ -#if defined(_MSC_VER) - #pragma warning(pop) -#endif - -#endif /* WINDOWS_WINDOW_H */ -#endif /* _WINDOWS_ */ - - -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Arvid Gerstmann. All rights reserved. - */ -#ifndef _WINDOWS_ -#ifndef WINDOWS_INTRIN_H -#define WINDOWS_INTRIN_H - -/* Disable all warnings */ -#if defined(_MSC_VER) - #pragma warning(push, 0) -#endif - -#if defined(__cplusplus) -extern "C" { -#endif - - -/* ========================================================================== */ -/* Intrinsics */ -/* ========================================================================== */ - -extern void _mm_pause(void); -#pragma intrinsic(_mm_pause) - -extern void _ReadWriteBarrier(void); -#pragma intrinsic(_ReadWriteBarrier) - - - -#if defined(__cplusplus) -} -#endif - -/* Enable all warnings */ -#if defined(_MSC_VER) - #pragma warning(pop) -#endif - -#endif /* WINDOWS_INTRIN_H */ -#endif /* _WINDOWS_ */ - - -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Arvid Gerstmann. All rights reserved. - */ -#ifndef _WINDOWS_ -#ifndef WINDOWS_FIBER_H -#define WINDOWS_FIBER_H - -/* Disable all warnings */ -#if defined(_MSC_VER) - #pragma warning(push, 0) -#endif - -#ifndef WINDOWS_BASE_H - #include "windows_base.h" -#endif - -/* dbghelp contains __readfsdword / __readgsqword */ -#ifndef WINDOWS_DBGHELP_H - #include "dbghelp.h" -#endif - -#if defined(__cplusplus) -extern "C" { -#endif - - -/* ========================================================================= */ -/* Fiber */ -/* ========================================================================= */ -typedef void (WINAPI *PFIBER_START_ROUTINE)(LPVOID lpFiberParameter); -typedef PFIBER_START_ROUTINE LPFIBER_START_ROUTINE; -typedef void(NTAPI *PFLS_CALLBACK_FUNCTION)(PVOID lpFlsData); - -BOOL WINAPI IsThreadAFiber(void); - -void WINAPI SwitchToFiber(LPVOID lpFiber); -void WINAPI DeleteFiber(LPVOID lpFiber); - -BOOL WINAPI ConvertFiberToThread(void); - -LPVOID WINAPI CreateFiber( - SIZE_T dwStackSize, - LPFIBER_START_ROUTINE lpStartAddress, - LPVOID lpParameter); -LPVOID WINAPI CreateFiberEx( - SIZE_T dwStackCommitSize, - SIZE_T dwStackReserveSize, - DWORD dwFlags, - LPFIBER_START_ROUTINE lpStartAddress, - LPVOID lpParameter); - -LPVOID WINAPI ConvertThreadToFiber(LPVOID lpParameter); -LPVOID WINAPI ConvertThreadToFiberEx( - LPVOID lpParameter, - DWORD dwFlags); - -#ifdef _AMD64_ -__inline PVOID -GetCurrentFiber(void) -{ - return (PVOID)(ULONG_PTR)__readgsqword(0x20); -} -#else -__inline PVOID -GetCurrentFiber(void) -{ - return (PVOID)(ULONG_PTR)__readfsdword(0x10); -} -#endif - -__forceinline PVOID -GetFiberData(void) -{ - return *(PVOID *)GetCurrentFiber(); -} - - -/* ========================================================================= */ -/* Fiber Local Storage */ -/* ========================================================================= */ -#ifndef FLS_OUT_OF_INDEXES -#define FLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF) -#endif - -DWORD WINAPI FlsAlloc(PFLS_CALLBACK_FUNCTION lpCallback); -PVOID WINAPI FlsGetValue(DWORD dwFlsIndex); -BOOL WINAPI FlsSetValue(DWORD dwFlsIndex, PVOID lpFlsData); -BOOL WINAPI FlsFree(DWORD dwFlsIndex); - - -#if defined(__cplusplus) -} -#endif - -/* Enable all warnings */ -#if defined(_MSC_VER) - #pragma warning(pop) -#endif - -#endif /* WINDOWS_FIBER_H */ -#endif /* _WINDOWS_ */ - - -#endif -#endif -#define _WINDOWS_ -#endif diff --git a/exe_load/include/windows_base.h b/exe_load/include/windows_base.h deleted file mode 100644 index 6f78714..0000000 --- a/exe_load/include/windows_base.h +++ /dev/null @@ -1,393 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Arvid Gerstmann. All rights reserved. - */ -#ifndef _WINDOWS_ -#ifndef WINDOWS_BASE_H -#define WINDOWS_BASE_H - -/* Disable all warnings */ -#if defined(_MSC_VER) - #pragma warning(push, 0) -#endif -#if defined(__cplusplus) -extern "C" { -#endif - -/* size_t */ -/* #include */ - - -/* - * Windows Version requirements: Vista - * See here for more information regarding this define: - * https://msdn.microsoft.com/en-us/library/aa383745(VS.85).aspx - */ -#ifndef _WIN32_WINNT - #define _WIN32_WINNT 0x0600 -#endif - -/* Magic: */ -#define _CRTALLOC(x) __declspec(allocate(x)) -#define DECLSPEC_ALIGN(x) __declspec(align(x)) - -/* Basic Defines: */ -#define NTAPI __stdcall -#define WINAPI __stdcall -#define APIENTRY __stdcall -#define CALLBACK __stdcall -#define TRUE (1) -#define FALSE (0) -#ifndef NULL -# ifdef __cplusplus -# define NULL __nullptr -# else -# define NULL ((void *)0) -# endif -#endif -#ifndef FORCEINLINE -#define FORCEINLINE __forceinline -#endif -#ifdef UNICODE -#define __TEXT(x) L ## x -#define TEXT(x) __TEXT(x) -#else -#define TEXT(x) x -#endif -#define PATH_MAX 260 -#define MAX_PATH 260 - -#define MAKEWORD(a, b) \ - ((WORD)(((BYTE)(((DWORD_PTR)(a)) & 0xff)) | \ - ((WORD)((BYTE)(((DWORD_PTR)(b)) & 0xff))) << 8)) -#define MAKELONG(a, b) \ - ((LONG)(((WORD)(((DWORD_PTR)(a)) & 0xffff)) | \ - ((DWORD)((WORD)(((DWORD_PTR)(b)) & 0xffff))) << 16)) -#define LOWORD(l) ((WORD)(((DWORD_PTR)(l)) & 0xffff)) -#define HIWORD(l) ((WORD)((((DWORD_PTR)(l)) >> 16) & 0xffff)) -#define LOBYTE(w) ((BYTE)(((DWORD_PTR)(w)) & 0xff)) -#define HIBYTE(w) ((BYTE)((((DWORD_PTR)(w)) >> 8) & 0xff)) - -#if !defined(_68K_) \ - && !defined(_MPPC_) \ - && !defined(_X86_) \ - && !defined(_IA64_) \ - && !defined(_AMD64_) \ - && defined(_M_AMD64) -#define _AMD64_ -#endif - -/* - * Windows uses the `interface` define to create interfaces for both C and C++. - * Only the C version is defined here and not the C++ version. - * Both can be found in BaseTyps.h - */ -#define STDMETHODCALLTYPE __stdcall -#define STDMETHODVCALLTYPE __cdecl -#define STDAPICALLTYPE __stdcall -#define STDAPIVCALLTYPE __cdecl - -#define interface struct -#define PURE -#define THIS_ INTERFACE * This, -#define THIS INTERFACE * This -#define STDMETHOD(method) HRESULT (STDMETHODCALLTYPE * method) -#define STDMETHOD_(type, method) type (STDMETHODCALLTYPE * method) -#define STDMETHODV(method) HRESULT (STDMETHODVCALLTYPE * method) -#define STDMETHODV_(type, method) type (STDMETHODVCALLTYPE * method) - -#define IFACEMETHOD(method) __override STDMETHOD(method) -#define IFACEMETHOD_(type, method) __override STDMETHOD_(type,method) -#define IFACEMETHODV(method) __override STDMETHODV(method) -#define IFACEMETHODV_(type, method) __override STDMETHODV_(type,method) - -#define BEGIN_INTERFACE -#define END_INTERFACE - -#ifdef CONST_VTABLE -#undef CONST_VTBL -#define CONST_VTBL const -#define DECLARE_INTERFACE(iface) \ - typedef interface iface { \ - const struct iface##Vtbl * lpVtbl; \ - } iface; \ - typedef const struct iface##Vtbl iface##Vtbl; \ - const struct iface##Vtbl - -#else - -#undef CONST_VTBL -#define CONST_VTBL -#define DECLARE_INTERFACE(iface) \ - typedef interface iface { \ - struct iface##Vtbl * lpVtbl; \ - } iface; \ - typedef struct iface##Vtbl iface##Vtbl; \ - struct iface##Vtbl - -#endif /* CONST_VTABLE */ - -#define DECLARE_INTERFACE_(iface, baseiface) DECLARE_INTERFACE(iface) - - -#define HRESULT_IS_WIN32(x) \ - ((((x) >> 16) & 0xFFFF) == 0x8) -#define HRESULT_IS_FAILURE(x) \ - ((((x) >> 31) & 0x1) == 0x1) -#define HRESULT_FACILITY(x) \ - (((x) >> 16) & 0xFFFF) -#define HRESULT_CODE(x) \ - ((x) & 0xFFFF) -#define HRESULT_FROM_WIN32(x) \ - (0x80070000 | (x)) - - -/* ========================================================================== */ -/* Basic Types: */ -/* https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx */ -/* ========================================================================== */ - -#if defined(_MSC_VER) - /* 1300 == VC 6.0 */ - #if _MSC_VER < 1300 - typedef signed char int8_t; - typedef unsigned char uint8_t; - typedef signed short int16_t; - typedef unsigned short uint16_t; - typedef signed int int32_t; - typedef unsigned int uint32_t; - #else - typedef signed __int8 int8_t; - typedef unsigned __int8 uint8_t; - typedef signed __int16 int16_t; - typedef unsigned __int16 uint16_t; - typedef signed __int32 int32_t; - typedef unsigned __int32 uint32_t; - #endif - typedef signed __int64 int64_t; - typedef unsigned __int64 uint64_t; -#else - #include -#endif - - -typedef int BOOL; -typedef char CHAR; -typedef short SHORT; -typedef int INT; -typedef long LONG; -typedef unsigned char UCHAR; -typedef unsigned short USHORT; -typedef unsigned int UINT; -typedef unsigned long ULONG; -typedef unsigned char BYTE; -typedef unsigned short WORD; -typedef float FLOAT; -typedef unsigned long DWORD; -#ifndef HAVE_WCHAR_T -#define HAVE_WCHAR_T -#if !defined(__cplusplus) -typedef unsigned short wchar_t; -#endif -#endif -typedef wchar_t WCHAR; -typedef wchar_t * PWCHAR; -typedef WORD ATOM; -typedef unsigned int ULONG32; -typedef uint64_t DWORD64; -typedef uint64_t ULONG64; -typedef signed int INT32; -typedef signed __int64 INT64; -typedef uint64_t DWORDLONG; - -typedef CHAR * PCHAR; -typedef ULONG * PULONG; -typedef BYTE * PBYTE; -typedef ULONG64 * PULONG64; -typedef DWORD64 * PDWORD64; - -#if !defined(_M_IX86) -typedef int64_t LONGLONG; -typedef uint64_t ULONGLONG; -#else -typedef double LONGLONG; -typedef double ULONGLONG; -#endif - -typedef void VOID; -typedef void * PVOID; -typedef void * LPVOID; -typedef BOOL * PBOOL; -typedef BOOL * LPBOOL; -typedef WORD * PWORD; -typedef LONG * PLONG; -typedef LONG * LPLONG; -typedef DWORD * PDWORD; - -typedef LPVOID HANDLE; -typedef HANDLE HINSTANCE; -typedef HANDLE HWND; -typedef HINSTANCE HMODULE; -typedef HANDLE HDC; -typedef HANDLE HGLRC; -typedef HANDLE HMENU; -typedef HANDLE * PHANDLE; -typedef HANDLE * LPHANDLE; - -#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name - -typedef WCHAR * PWSTR; -typedef BYTE * LPBYTE; -typedef long * LPLONG; -typedef DWORD * LPDWORD; -typedef const void * LPCVOID; - -#if defined(_WIN64) -typedef int64_t INT_PTR; -typedef int64_t LONG_PTR; -typedef uint64_t UINT_PTR; -typedef uint64_t ULONG_PTR; -#else -typedef int INT_PTR; -typedef long LONG_PTR; -typedef unsigned int UINT_PTR; -typedef unsigned long ULONG_PTR; -#endif -typedef ULONG_PTR DWORD_PTR; -typedef DWORD_PTR * PDWORD_PTR; - -typedef ULONG_PTR SIZE_T; -typedef LONG_PTR SSIZE_T; - -typedef CHAR * LPSTR; -typedef WCHAR * LPWSTR; -typedef const CHAR * LPCSTR; -typedef const WCHAR * LPCWSTR; -#if defined(UNICODE) -typedef WCHAR TCHAR; -typedef WCHAR TBYTE; -typedef LPCWSTR LPCTSTR; -typedef LPWSTR LPTSTR; -#else -typedef char TCHAR; -typedef unsigned char TBYTE; -typedef LPCSTR LPCTSTR; -typedef LPSTR LPTSTR; -#endif - -#define MINCHAR 0x80 -#define MAXCHAR 0x7f -#define MINSHORT 0x8000 -#define MAXSHORT 0x7fff -#define MINLONG 0x80000000 -#define MAXLONG 0x7fffffff -#define MAXBYTE 0xff -#define MAXWORD 0xffff -#define MAXDWORD 0xffffffff - -#if defined(_WIN64) -typedef INT_PTR (WINAPI *FARPROC)(void); -typedef INT_PTR (WINAPI *NEARPROC)(void); -typedef INT_PTR (WINAPI *PROC)(void); -#else -typedef int (WINAPI *FARPROC)(void); -typedef int (WINAPI *NEARPROC)(void); -typedef int (WINAPI *PROC)(void); -#endif - -typedef DWORD ACCESS_MASK; -typedef ACCESS_MASK * PACCESS_MASK; - -typedef HANDLE HICON; -typedef HANDLE HBRUSH; -typedef HICON HCURSOR; - -typedef LONG HRESULT; -typedef LONG_PTR LRESULT; -typedef LONG_PTR LPARAM; -typedef UINT_PTR WPARAM; - -typedef void * HGDIOBJ; - -typedef HANDLE HKEY; -typedef HKEY * PHKEY; -typedef ACCESS_MASK REGSAM; - - -/* ========================================================================== */ -/* Errors: */ -/* ========================================================================== */ -#define ERROR_SUCCESS 0L -#define ERROR_FILE_NOT_FOUND 2L -#define ERROR_PATH_NOT_FOUND 3L -#define ERROR_TOO_MANY_OPEN_FILES 4L -#define ERROR_ACCESS_DENIED 5L -#define ERROR_NO_MORE_FILES 18L -#define ERROR_SHARING_VIOLATION 32L -#define ERROR_FILE_EXISTS 80L -#define ERROR_INSUFFICIENT_BUFFER 122L -#define ERROR_ALREADY_EXISTS 183L -#define ERROR_MORE_DATA 234L - - -/* ========================================================================== */ -/* Enums */ -/* ========================================================================== */ -/* DllMain Reason: */ -#define DLL_PROCESS_ATTACH (1) -#define DLL_PROCESS_DETACH (0) -#define DLL_THREAD_ATTACH (2) -#define DLL_THREAD_DETACH (3) - - -/* ========================================================================== */ -/* Structures: */ -/* ========================================================================== */ -typedef struct _SECURITY_ATTRIBUTES { - DWORD nLength; - LPVOID lpSecurityDescriptor; - BOOL bInheritHandle; -} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES; - -typedef union _LARGE_INTEGER { - struct { - DWORD LowPart; - LONG HighPart; - }; - struct { - DWORD LowPart; - LONG HighPart; - } u; - LONGLONG QuadPart; -} LARGE_INTEGER, *PLARGE_INTEGER; - -typedef union _ULARGE_INTEGER { - struct { - DWORD LowPart; - DWORD HighPart; - }; - struct { - DWORD LowPart; - DWORD HighPart; - } u; - ULONGLONG QuadPart; -} ULARGE_INTEGER, *PULARGE_INTEGER; - -/* Filetime: */ -typedef struct _FILETIME { - DWORD dwLowDateTime; - DWORD dwHighDateTime; -} FILETIME, *PFILETIME, *LPFILETIME; - - -#if defined(__cplusplus) -} -#endif -/* Enable all warnings */ -#if defined(_MSC_VER) - #pragma warning(pop) -#endif - -#endif /* WINDOWS_BASE_H */ -#endif /* _WINDOWS_ */ - diff --git a/exe_load/include/windows_modular.h b/exe_load/include/windows_modular.h deleted file mode 100644 index 87aff71..0000000 --- a/exe_load/include/windows_modular.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Copyright (c) Arvid Gerstmann. All rights reserved. - */ - -/* - * This are the macros from the original windows.h. - * Defining them will prevent inclusion of this enormous header file. - */ -#ifndef _WINDOWS_ -#define _WINDOWS_ - -#ifndef _INC_WINDOWS -#define _INC_WINDOWS - -#ifndef WINDOWS_H -#define WINDOWS_H - -/* ========================================================================== */ -/* BASE */ -/* ========================================================================== */ -#include "windows_base.h" - - - -/* ========================================================================== */ -/* Atomic */ -/* ========================================================================== */ -#include "atomic.h" - -/* ========================================================================= */ -/* DbgHelp */ -/* ========================================================================= */ -#include "dbghelp.h" - -/* ========================================================================= */ -/* DDS */ -/* ========================================================================= */ -#include "dds.h" - -/* ========================================================================== */ -/* File I/O */ -/* ========================================================================== */ -#include "file.h" - -/* ========================================================================== */ -/* GDI */ -/* ========================================================================== */ -#include "gdi.h" - -/* ========================================================================== */ -/* I/O */ -/* ========================================================================== */ -#include "io.h" - -/* ========================================================================== */ -/* Misc */ -/* ========================================================================== */ -#include "misc.h" - -/* ========================================================================== */ -/* Process */ -/* ========================================================================== */ -#include "process.h" - -/* ========================================================================== */ -/* SysInfo */ -/* ========================================================================== */ -#include "sysinfo.h" - -/* ========================================================================== */ -/* Threads */ -/* ========================================================================== */ -#include "threads.h" - -/* ========================================================================== */ -/* Window */ -/* ========================================================================== */ -#include "window.h" - - -#endif /* WINDOWS_H */ -#endif /* _INC_WINDOWS */ -#endif /* _WINDOWS_ */ - diff --git a/exe_load/isz_plg.config b/exe_load/isz_plg.config deleted file mode 100644 index e794bb6..0000000 --- a/exe_load/isz_plg.config +++ /dev/null @@ -1,2 +0,0 @@ -[EXE_PATH] -C:\Users\batch_7236\Documents\exe_load\ISZ-Plugin-Loader\PluginLoader.exe \ No newline at end of file From a40c4baf9e614c8bbf588d4e8a879277a0a9d782 Mon Sep 17 00:00:00 2001 From: Phinehas Beresford <78656905+Cracko298@users.noreply.github.com> Date: Sun, 15 Oct 2023 20:43:00 -0400 Subject: [PATCH 09/11] Update README.md --- README.md | 58 ------------------------------------------------------- 1 file changed, 58 deletions(-) diff --git a/README.md b/README.md index 8d638be..868dd44 100644 --- a/README.md +++ b/README.md @@ -1,63 +1,5 @@ # UnrealModUnlocker-Public 1.0.4 -## Notes: -- **I'm not the best programmer in the world (Keep that in mind).** -- **EXE Loader loads an Executable ModMenu/PluginLoader primarily for control over mods.** - - -### FaQ's: -#### Can this be used Maliciously? -- **Yes, it 100% can be. However you have to specific the executable you want to load in the 'isz_plg.config' file.** - -#### Why do I need/want this? -- **You don't "need" it. However if you want to automatically open an executable when UMU loads. You might want to check this out.** - -```cpp -bool TerminateSecondInstance(const wchar_t* processName) { - bool foundFirstInstance = false; - - HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); - - if (hSnapshot == INVALID_HANDLE_VALUE) { - return false; - } - - PROCESSENTRY32 pe32; - pe32.dwSize = sizeof(PROCESSENTRY32); - - if (Process32First(hSnapshot, &pe32)) { - do { - // Converts the process name to wide char string - wchar_t wProcessName[MAX_PATH]; - if (MultiByteToWideChar(CP_ACP, 0, pe32.szExeFile, -1, wProcessName, MAX_PATH) > 0) { - if (wcscmp(wProcessName, processName) == 0) { - if (foundFirstInstance) { - // Terminate the second instance - HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pe32.th32ProcessID); - if (hProcess != nullptr) { - TerminateProcess(hProcess, 0); - CloseHandle(hProcess); - CloseHandle(hSnapshot); - return true; // Terminated the second instance (successful termanation) - } - } - foundFirstInstance = true; - } - } - } while (Process32Next(hSnapshot, &pe32)); - } - - CloseHandle(hSnapshot); - return false; // Second instance not found or couldn't be terminated -} - -const wchar_t* processName = L"PluginLoader.exe"; -TerminateSecondInstance(processName); - -``` - - - ## General Information: UnrealModUnlocker Public and UnrealModUnlocker Basic are NOT from the same codebase. UnrealModUnlocker Public ONLY contains code for the loose file loading part of the UMU Project. From 028c99c903deecd139fe3d94548918734ab662bf Mon Sep 17 00:00:00 2001 From: Phinehas Beresford <78656905+Cracko298@users.noreply.github.com> Date: Sun, 15 Oct 2023 20:58:24 -0400 Subject: [PATCH 10/11] Add files via upload --- plugin_example/ExampleModMenuLoader.dll | Bin 0 -> 226304 bytes plugin_example/LoadThatModMenu.cpp | 43 +++++++++ plugin_example/exe_example/ModMenuExample.exe | Bin 0 -> 16384 bytes plugin_example/exe_example/ModMenuLoader.cpp | 86 ++++++++++++++++++ 4 files changed, 129 insertions(+) create mode 100644 plugin_example/ExampleModMenuLoader.dll create mode 100644 plugin_example/LoadThatModMenu.cpp create mode 100644 plugin_example/exe_example/ModMenuExample.exe create mode 100644 plugin_example/exe_example/ModMenuLoader.cpp diff --git a/plugin_example/ExampleModMenuLoader.dll b/plugin_example/ExampleModMenuLoader.dll new file mode 100644 index 0000000000000000000000000000000000000000..2ab62e1f382ee8dc4b8c10e65863bde96276c58c GIT binary patch literal 226304 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 literal 0 HcmV?d00001 diff --git a/plugin_example/LoadThatModMenu.cpp b/plugin_example/LoadThatModMenu.cpp new file mode 100644 index 0000000..5827ffe --- /dev/null +++ b/plugin_example/LoadThatModMenu.cpp @@ -0,0 +1,43 @@ +#include +#include + +BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) +{ + static bool initialized = false; + + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + if (!initialized) + { + initialized = true; + + HANDLE hMutex = CreateMutexW(NULL, TRUE, L"PluginLoaderW"); + if (GetLastError() == ERROR_ALREADY_EXISTS) + { + CloseHandle(hMutex); + return FALSE; + } + + Sleep(2000); + wchar_t dllPath[MAX_PATH]; + GetModuleFileNameW(hModule, dllPath, MAX_PATH); + + wcsrchr(dllPath, L'\\')[1] = L'\0'; + + wchar_t batchFilePath[MAX_PATH]; + wcscpy_s(batchFilePath, dllPath); + wcscat_s(batchFilePath, L"ModMenuExample.exe"); + + _wsystem((L"cmd.exe /C start \"\" \"" + std::wstring(batchFilePath) + L"\"").c_str()); + + CloseHandle(hMutex); + return FALSE; + } + break; + case DLL_PROCESS_DETACH: + return FALSE; + } + + return FALSE; +} diff --git a/plugin_example/exe_example/ModMenuExample.exe b/plugin_example/exe_example/ModMenuExample.exe new file mode 100644 index 0000000000000000000000000000000000000000..c973b885da9c15314af2535c160a73ab9bbef1d0 GIT binary patch literal 16384 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 +#include + +extern "C" // Allows 'printf' without need for standard lib include +{ +int printf(const char *format, ...); +} + +bool TerminateSecondInstance(const wchar_t* processName) { + bool foundFirstInstance = false; + + HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + + if (hSnapshot == INVALID_HANDLE_VALUE) { + return false; + } + + PROCESSENTRY32 pe32; + pe32.dwSize = sizeof(PROCESSENTRY32); + + if (Process32First(hSnapshot, &pe32)) { + do { + // Converts the process name to wide char string + wchar_t wProcessName[MAX_PATH]; + if (MultiByteToWideChar(CP_ACP, 0, pe32.szExeFile, -1, wProcessName, MAX_PATH) > 0) { + if (wcscmp(wProcessName, processName) == 0) { + if (foundFirstInstance) { + // Terminate the second instance + HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pe32.th32ProcessID); + if (hProcess != nullptr) { + TerminateProcess(hProcess, 0); + CloseHandle(hProcess); + CloseHandle(hSnapshot); + return true; // Terminated the second instance (successful termanation) + } + } + foundFirstInstance = true; + } + } + } while (Process32Next(hSnapshot, &pe32)); + } + + CloseHandle(hSnapshot); + return false; // Second instance not found or couldn't be terminated +} + +bool IsProcessRunning(const wchar_t* gameName) { // Could be used in a continuous loop (check if game is opened.) + HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + + if (hSnapshot == INVALID_HANDLE_VALUE) { + return false; + } + + PROCESSENTRY32 pe32; + pe32.dwSize = sizeof(PROCESSENTRY32); + + if (Process32First(hSnapshot, &pe32)) { + do { + // Convert pe32.szExeFile to a wchar_t* and then compare + wchar_t wideName[MAX_PATH]; + MultiByteToWideChar(CP_ACP, 0, pe32.szExeFile, -1, wideName, MAX_PATH); + + if (wcscmp(wideName, gameName) == 0) { + CloseHandle(hSnapshot); + return true; + } + } while (Process32Next(hSnapshot, &pe32)); + } + + CloseHandle(hSnapshot); + return false; +} + +int main() { + const wchar_t* processName = L"PluginLoader.exe"; // Defines Executable ModMenu/Plugin Name + const wchar_t* gameName = L"ISZ-Win64-Shipping.exe"; // Obv. can be changed to specific Game Name + TerminateSecondInstance(processName); + Sleep(100); + if (IsProcessRunning(processName)) { + MessageBoxW(NULL, L"The ModMenu/Plugin/Cheat was Loaded Successfully.", L"Cracko298's Super Secret ModMenu", MB_OK | MB_ICONINFORMATION); // Passes check, opens Message Diag + } + else { + MessageBoxW(NULL, L"The ModMenu/Plugin/Cheat was **NOT** Loaded (Game Not Present).", L"Cracko298's Super Sad ModMenu", MB_OK | MB_ICONINFORMATION); // Does NOT pass check, opens Message Diag error + } + return 0; +} From a91c9a6240162953b09d5a6d1ffdce550adc9c1c Mon Sep 17 00:00:00 2001 From: Phinehas Beresford <78656905+Cracko298@users.noreply.github.com> Date: Sun, 15 Oct 2023 21:01:32 -0400 Subject: [PATCH 11/11] Add files via upload --- plugin_example/ModMenuExample.zip | Bin 0 -> 95109 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 plugin_example/ModMenuExample.zip diff --git a/plugin_example/ModMenuExample.zip b/plugin_example/ModMenuExample.zip new file mode 100644 index 0000000000000000000000000000000000000000..f81f8a0816a8976368797503e1915cfa5f2aabb9 GIT binary patch literal 95109 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