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();