1 module runtime.system.windows.windows_;
2 
3 version(Windows):
4 extern (Windows) @nogc nothrow:
5 
6 /++ HELPERS ++/
7 String GetLastErrorAsString()
8 {
9     char[1024] buffer;
10     const error = GetLastError();
11     const length = FormatMessageA(
12         FORMAT_MESSAGE_FROM_SYSTEM,
13         null,
14         error,
15         0,
16         buffer.ptr,
17         buffer.length,
18         null
19     );
20     return String(buffer[0..length]);
21 }
22 
23 /++ stuff to emulate things like _In, _Out, etc ++/
24 struct _Frees_ptr_opt_{}
25 struct _In_ {}
26 struct _Out_ {}
27 struct _Out_opt_ {}
28 
29 /++A bunch of types++/
30 alias BOOL = int;
31 alias BOOLEAN = bool;
32 alias BYTE = ubyte;
33 alias CCHAR = char; // Technically byte because D chars are UTF8, buuuuut it's super fucking annoying otherwise.
34 alias CHAR = char;
35 alias COLORREF = DWORD;
36 alias DWORD = uint;
37 alias DWORDLONG = ulong;
38 alias DWORD_PTR = ULONG_PTR;
39 alias DWORD32 = uint;
40 alias DWORD64 = ulong;
41 alias FLOAT = float;
42 alias HACCEL = HANDLE;
43 alias HALF_PTR = uint;
44 alias HANDLE = PVOID;
45 alias HBITMAP = HANDLE;
46 alias HBRUSH = HANDLE;
47 alias HCOLORSPACE = HANDLE;
48 alias HCONV = HANDLE;
49 alias HCONVLIST = HANDLE;
50 alias HCURSOR = HANDLE;
51 alias HDC = HANDLE;
52 alias HDDEDATA = HANDLE;
53 alias HDESK = HANDLE;
54 alias HDROP = HANDLE;
55 alias HDWP = HANDLE;
56 alias HENHMETAFILE = HANDLE;
57 alias HFILE = HANDLE;
58 alias HFONT = HANDLE;
59 alias HGDIOBJ = HANDLE;
60 alias HGLOBAL = HANDLE;
61 alias HHOOK = HANDLE;
62 alias HICON = HANDLE;
63 alias HINSTANCE = HANDLE;
64 alias HKEY = HANDLE;
65 alias HKL = HANDLE;
66 alias HLOCAL = HANDLE;
67 alias HMENU = HANDLE;
68 alias HMETAFILE = HANDLE;
69 alias HMODULE = HANDLE;
70 alias HMONITOR = HANDLE;
71 alias HPALETTE = HANDLE;
72 alias HPEN = HANDLE;
73 alias HRESULT = HANDLE;
74 alias HRGN = HANDLE;
75 alias HSRC = HANDLE;
76 alias HWINSTA = HANDLE;
77 alias HWND = HANDLE;
78 alias INT = int;
79 alias INT_PTR = long;
80 alias INT8 = byte;
81 alias INT16 = short;
82 alias INT32 = int;
83 alias INT64 = long;
84 alias LARGE_INTEGER = long;
85 alias LANGID = WORD;
86 alias LCID = DWORD;
87 alias LCTYPE = DWORD;
88 alias LGRPID = DWORD;
89 alias LONG = int;
90 alias LONGLONG = long;
91 alias LONG_PTR = long;
92 alias LONG32 = int;
93 alias LONG64 = long; // Microsoft make no fricking sense man.
94 alias LPARAM = LONG_PTR;
95 alias LPBOOL = BOOL*;
96 alias LPCOLORREF = COLORREF*;
97 alias LPCSTR = const CHAR*;
98 alias LPCTSTR = LPCWSTR;
99 alias LPCVOID = const void*;
100 alias LPCWSTR = const WCHAR*;
101 alias LPDWORD = DWORD*;
102 alias LPHANDLE = HANDLE*;
103 alias LPINT = INT*;
104 alias LPLONG = LONG*;
105 alias LPSTR = CHAR*;
106 alias LPTSTR = LPWSTR;
107 alias LPVOID = void*;
108 alias LPWSTR = WCHAR*;
109 alias LRESULT = LONG_PTR;
110 alias PBOOL = BOOL*;
111 alias PBOOLEAN = BOOLEAN*;
112 alias PBYTE = BYTE*;
113 alias PCHAR = CHAR*;
114 alias PCSTR = const CHAR*;
115 alias PCTSTR = const LPCWSTR*;
116 alias PCWSTR = const wchar*;
117 alias PDWORD = DWORD*;
118 alias PDWORDLONG = DWORDLONG*;
119 alias PDWORD_PTR = DWORD_PTR*;
120 alias PDWORD32 = DWORD32*;
121 alias PDWORD64 = DWORD64*;
122 alias PFLOAT = FLOAT*;
123 alias PHALF_PTR = HALF_PTR*;
124 alias PHANDLE = HANDLE*;
125 alias PLARGE_INTEGER = LARGE_INTEGER*;
126 // todo...
127 alias PULONG = ULONG*;
128 alias PVOID = void*;
129 alias QWORD = ulong;
130 alias SHORT = short;
131 alias SIZE_T = ulong;
132 alias SSIZE_T = long;
133 alias UINT = uint;
134 alias UINT_PTR = ulong;
135 alias UINT8 = ubyte;
136 alias UINT16 = ushort;
137 alias UINT32 = uint;
138 alias UINT64 = ulong;
139 alias ULONG = uint;
140 alias ULONG64 = ulong;
141 alias ULONG_PTR = ulong;
142 alias ULONGLONG = ulong;
143 alias USHORT = ushort;
144 alias WCHAR = wchar;
145 alias WORD = ushort;
146 
147 alias FARPROC = int function();
148 
149 enum : DWORD
150 {
151     GENERIC_ALL = 1 << 28,
152     GENERIC_EXECUTE = 1 << 29,
153     GENERIC_WRITE = 1 << 30,
154     GENERIC_READ = 1 << 31
155 }
156 
157 /++ liboaderapi.h ++/
158 alias DLL_DIRECTORY_COOKIE = HANDLE;
159 enum : DWORD
160 {
161     GET_MODULE_HANDLE_EX_FLAG_PIN = 0x00000001,
162     GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT = 0x00000002,
163     GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS = 0x00000004,
164 
165     DONT_RESOLVE_DLL_REFERENCES = 0x00000001,
166     LOAD_IGNORE_CODE_AUTHZ_LEVEL = 0x00000010,
167     LOAD_LIBRARY_AS_DATAFILE = 0x00000002,
168     LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE = 0x00000040,
169     LOAD_LIBRARY_AS_IMAGE_RESOURCE = 0x00000020,
170     LOAD_LIBRARY_SEARCH_APPLICATION_DIR = 0x00000200,
171     LOAD_LIBRARY_SEARCH_DEFAULT_DIRS = 0x00001000,
172     LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR = 0x00000100,
173     LOAD_LIBRARY_SEARCH_SYSTEM32 = 0x00000800,
174     LOAD_LIBRARY_SEARCH_USER_DIRS = 0x00000400,
175     LOAD_WITH_ALTERED_SEARCH_PATH = 0x00000008,
176     LOAD_LIBRARY_REQUIRE_SIGNED_TARGET = 0x00000080,
177     LOAD_LIBRARY_SAFE_CURRENT_DIRS = 0x00002000,
178 }
179 DLL_DIRECTORY_COOKIE AddDllDirectory(PCWSTR NewDirectory);
180 BOOL DisableThreadLibraryCalls(HMODULE hLibModule);
181 BOOL FreeLibrary(HMODULE hLibModule);
182 void FreeLibraryAndExitThread(HMODULE hLibModule, DWORD dwExitCode);
183 DWORD GetModuleFileNameA(HMODULE hModule, LPSTR lpFilename, DWORD nSize);
184 DWORD GetModuleFileNameW(HMODULE hModule, LPWSTR lpFilename, DWORD nSize);
185 HMODULE GetModuleHandleA(LPCSTR lpModuleName);
186 HMODULE GetModuleHandleW(LPCWSTR lpModuleName);
187 BOOL GetModuleHandleExA(DWORD dwFlags, LPCSTR lpModuleName, HMODULE* phModule);
188 BOOL GetModuleHandleExW(DWORD dwFlags, LPCWSTR lpModuleName, HMODULE* phModule);
189 FARPROC GetProcAddress(HMODULE hModule, LPCSTR lpProcName);
190 HMODULE LoadLibraryA(LPCSTR lpLibFileName);
191 HMODULE LoadLibraryW(LPCWSTR lpLibFileName);
192 HMODULE LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags);
193 HMODULE LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags);
194 BOOL RemoveDllDirectory(DLL_DIRECTORY_COOKIE Cookie);
195 BOOL SetDefaultDllDirectories(DWORD DirectoryFlags);
196 FARPROC GetProcAddress(
197     HMODULE hModule,
198     LPCSTR  lpProcName
199 );
200 
201 /++ memoryapi.h ++/
202 enum : DWORD
203 {
204     MEM_COMMIT = 0x00001000,
205     MEM_RESERVE = 0x00002000,
206     MEM_RESET = 0x00080000,
207     MEM_RESET_UNDO = 0x1000000,
208     MEM_LARGE_PAGES = 0x20000000,
209     MEM_PHYSICAL = 0x00400000,
210     MEM_TOP_DOWN = 0x00100000,
211     MEM_WRITE_WATCH = 0x00200000,
212     MEM_DECOMMIT = 0x00004000,
213     MEM_RELEASE = 0x00008000,
214     MEM_COALESCE_PLACEHOLDERS = 0x00000001,
215     MEM_PRESERVE_PLACEHOLDER = 0x00000002,
216 
217     PAGE_EXECUTE = 0x10,
218     PAGE_EXECUTE_READ = 0x20,
219     PAGE_EXECUTE_READWRITE = 0x40,
220     PAGE_EXECUTE_WRITECOPY = 0x80,
221     PAGE_NOACCESS = 0x01,
222     PAGE_READONLY = 0x02,
223     PAGE_READWRITE = 0x04,
224     PAGE_WRITECOPY = 0x08,
225     PAGE_TARGETS_INVALID = 0x40000000,
226     PAGE_TARGETS_NO_UPDATE = 0x40000000,
227     PAGE_GUARD = 0x100,
228     PAGE_NOCACHE = 0x200,
229     PAGE_WRITECOMBINE = 0x400,
230 }
231 LPVOID VirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect);
232 BOOL VirtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType);
233 BOOL VirtualProtect(LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect);
234 
235 /++ heapapi.h ++/
236 enum : DWORD
237 {
238     HEAP_NO_SERIALIZE = 0x00000001,
239     HEAP_GENERATE_EXCEPTIONS = 0x00000004,
240     HEAP_ZERO_MEMORY = 0x00000008,
241     HEAP_REALLOC_IN_PLACE_ONLY = 0x00000010,
242 }
243 LPVOID HeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes);
244 LPVOID HeapReAlloc(HANDLE hHeap, DWORD dwFlags, @_Frees_ptr_opt_ LPVOID lpMem, SIZE_T dwBytes);
245 BOOL HeapFree(HANDLE hHeap, DWORD dwFlags, @_Frees_ptr_opt_ LPVOID lpMem);
246 HANDLE GetProcessHeap();
247 
248 /++ systeminfoapi.h ++/
249 // One thing I love about the alias spam is: I can basically just copy-paste shit from MSDN and it'll compile with a few tweaks.
250 struct SYSTEM_INFO {
251     union {
252         DWORD dwOemId;
253         struct {
254             WORD wProcessorArchitecture;
255             WORD wReserved;
256         }
257     }
258     DWORD     dwPageSize;
259     LPVOID    lpMinimumApplicationAddress;
260     LPVOID    lpMaximumApplicationAddress;
261     DWORD_PTR dwActiveProcessorMask;
262     DWORD     dwNumberOfProcessors;
263     DWORD     dwProcessorType;
264     DWORD     dwAllocationGranularity;
265     WORD      wProcessorLevel;
266     WORD      wProcessorRevision;
267 }
268 alias LPSYSTEM_INFO = SYSTEM_INFO*;
269 void GetSystemInfo(LPSYSTEM_INFO lpSystemInfo);
270 
271 /++ fileapi.h ++/
272 enum HANDLE INVALID_HANDLE_VALUE = cast(HANDLE)-1;
273 struct SECURITY_ATTRIBUTES {
274     DWORD  nLength;
275     LPVOID lpSecurityDescriptor;
276     BOOL   bInheritHandle;
277 }
278 struct OVERLAPPED {
279     ULONG_PTR Internal;
280     ULONG_PTR InternalHigh;
281     union {
282         struct {
283         DWORD Offset;
284         DWORD OffsetHigh;
285         }
286         PVOID Pointer;
287     }
288     HANDLE    hEvent;
289 }
290 alias LPSECURITY_ATTRIBUTES = SECURITY_ATTRIBUTES*;
291 alias LPOVERLAPPED = OVERLAPPED*;
292 enum : DWORD
293 {
294     FILE_SHARE_DELETE = 0x00000004,
295     FILE_SHARE_READ = 0x00000001,
296     FILE_SHARE_WRITE = 0x00000002,
297 
298     CREATE_ALWAYS = 2,
299     CREATE_NEW = 1,
300     OPEN_ALWAYS = 4,
301     OPEN_EXISTING = 3,
302     TRUNCATE_EXISTING = 5,
303 
304     FILE_ATTRIBUTE_ARCHIVE = 32,
305     FILE_ATTRIBUTE_ENCRYPTED = 16384,
306     FILE_ATTRIBUTE_HIDDEN = 2,
307     FILE_ATTRIBUTE_NORMAL = 128,
308     FILE_ATTRIBUTE_OFFLINE = 4096,
309     FILE_ATTRIBUTE_READONLY = 1,
310     FILE_ATTRIBUTE_SYSTEM = 4,
311     FILE_ATTRIBUTE_TEMPORARY = 256,
312     FILE_FLAG_BACKUP_SEMANTICS = 0x02000000,
313     FILE_FLAG_DELETE_ON_CLOSE = 0x04000000,
314     FILE_FLAG_NO_BUFFERING = 0x20000000,
315     FILE_FLAG_OPEN_NO_RECALL = 0x00100000,
316     FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000,
317     FILE_FLAG_OVERLAPPED = 0x40000000,
318     FILE_FLAG_POSIX_SEMANTICS = 0x01000000,
319     FILE_FLAG_RANDOM_ACCESS = 0x10000000,
320     FILE_FLAG_SESSION_AWARE = 0x00800000,
321     FILE_FLAG_SEQUENTIAL_SCAN = 0x08000000,
322     FILE_FLAG_WRITE_THROUGH = 0x80000000,
323 }
324 HANDLE CreateFileA(
325     LPCSTR                lpFileName,
326     DWORD                 dwDesiredAccess,
327     DWORD                 dwShareMode,
328     LPSECURITY_ATTRIBUTES lpSecurityAttributes,
329     DWORD                 dwCreationDisposition,
330     DWORD                 dwFlagsAndAttributes,
331     HANDLE                hTemplateFile
332 );
333 BOOL WriteFile(
334     HANDLE       hFile,
335     LPCVOID      lpBuffer,
336     DWORD        nNumberOfBytesToWrite,
337     LPDWORD      lpNumberOfBytesWritten,
338     LPOVERLAPPED lpOverlapped
339 );
340 BOOL GetFileSizeEx(
341     HANDLE         hFile,
342     PLARGE_INTEGER lpFileSize
343 );
344 BOOL SetFilePointerEx(
345     HANDLE         hFile,
346     LARGE_INTEGER  liDistanceToMove,
347     PLARGE_INTEGER lpNewFilePointer,
348     DWORD          dwMoveMethod
349 );
350 BOOL ReadFile(
351     HANDLE       hFile,
352     LPVOID       lpBuffer,
353     DWORD        nNumberOfBytesToRead,
354     LPDWORD      lpNumberOfBytesRead,
355     LPOVERLAPPED lpOverlapped
356 );
357 BOOL PathFileExistsA(
358     LPCSTR pszPath
359 );
360 BOOL DeleteFileA(
361     LPCSTR lpFileName
362 );
363 
364 /++ handleapi.h ++/
365 BOOL CloseHandle(HANDLE hObject);
366 
367 /++ errhandlingapi.h ++/
368 enum : DWORD
369 {
370     ERROR_FILE_NOT_FOUND = 2,
371     ERROR_ACCESS_DENIED = 4,
372     ERROR_FILE_EXISTS = 80,
373     ERROR_ALREADY_EXISTS = 183,
374 }
375 DWORD GetLastError();
376 
377 /++ winbase.h ++/
378 enum : DWORD
379 {
380     FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100,
381     FORMAT_MESSAGE_ARGUMENT_ARRAY = 0x00002000,
382     FORMAT_MESSAGE_FROM_HMODULE = 0x00000800,
383     FORMAT_MESSAGE_FROM_STRING = 0x00000400,
384     FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000,
385     FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200
386 }
387 DWORD FormatMessageA(
388     DWORD   dwFlags,
389     LPCVOID lpSource,
390     DWORD   dwMessageId,
391     DWORD   dwLanguageId,
392     LPSTR   lpBuffer,
393     DWORD   nSize,
394     void   *Arguments
395 );
396 
397 /++ processthreadsapi.h ++/
398 void ExitProcess(
399     UINT uExitCode
400 );
401 HANDLE GetCurrentProcess();
402 
403 /++ console api ++/
404 enum : DWORD
405 {
406     STD_INPUT_HANDLE = -10,
407     STD_OUTPUT_HANDLE = -11,
408     STD_ERROR_HANDLE = -12,
409 
410     ENABLE_ECHO_INPUT = 0x0004,
411     ENABLE_INSERT_MODE = 0x0020,
412     ENABLE_LINE_INPUT = 0x0002,
413     ENABLE_MOUSE_INPUT = 0x0010,
414     ENABLE_PROCESSED_INPUT = 0x0001,
415     ENABLE_QUICK_EDIT_MODE = 0x0040,
416     ENABLE_WINDOW_INPUT = 0x0008,
417     ENABLE_VIRTUAL_TERMINAL_INPUT = 0x0200,
418     ENABLE_PROCESSED_OUTPUT = 0x0001,
419     ENABLE_WRAP_AT_EOL_OUTPUT = 0x0002,
420     ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004,
421     DISABLE_NEWLINE_AUTO_RETURN = 0x0008,
422     ENABLE_LVB_GRID_WORLDWIDE = 0x0010,
423 }
424 HANDLE GetStdHandle(
425     @_In_ DWORD nStdHandle
426 );
427 BOOL SetConsoleMode(
428     @_In_ HANDLE hConsoleHandle,
429     @_In_ DWORD  dwMode
430 );
431 BOOL GetConsoleMode(
432     @_In_  HANDLE  hConsoleHandle,
433     @_Out_ LPDWORD lpMode
434 );
435 
436 /++ processenv.h ++/
437 LPSTR GetCommandLineA();