Win32Minimal.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  1. // Copyright (C) 2009-2022, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. /// @file
  6. /// This file includes minimal declarations of Win32 API to avoid Windows.h polution.
  7. #pragma once
  8. // Minimal Windows.h declaration. Only what's needed.
  9. extern "C" {
  10. #define ANKI_WINAPI __stdcall
  11. #define ANKI_WINBASEAPI __declspec(dllimport)
  12. #define ANKI_DECLARE_HANDLE(name) \
  13. struct name##__; \
  14. typedef struct name##__* name
  15. // Types
  16. typedef void VOID;
  17. typedef int BOOL;
  18. typedef char CHAR;
  19. typedef short SHORT;
  20. typedef int INT;
  21. typedef long LONG;
  22. typedef unsigned char UCHAR;
  23. typedef unsigned short USHORT;
  24. typedef unsigned int UINT;
  25. typedef unsigned long ULONG;
  26. typedef unsigned char BYTE;
  27. typedef unsigned short WORD;
  28. typedef unsigned long DWORD;
  29. typedef unsigned __int64 ULONG_PTR;
  30. typedef __int64 LONG_PTR;
  31. typedef __int64 LONGLONG;
  32. typedef ULONG_PTR SIZE_T;
  33. typedef LONG HRESULT;
  34. typedef BYTE BOOLEAN;
  35. typedef ULONG_PTR DWORD_PTR;
  36. typedef DWORD* LPDWORD;
  37. typedef void* HANDLE;
  38. typedef void* PVOID;
  39. typedef void* LPVOID;
  40. typedef const CHAR *LPCSTR, *PCSTR;
  41. typedef const CHAR* PCZZSTR;
  42. typedef CHAR* LPSTR;
  43. typedef struct HINSTANCE__* HINSTANCE;
  44. typedef HINSTANCE HMODULE;
  45. ANKI_DECLARE_HANDLE(HWND);
  46. typedef struct _SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
  47. typedef DWORD(ANKI_WINAPI* PTHREAD_START_ROUTINE)(LPVOID lpThreadParameter);
  48. typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE;
  49. typedef struct _RTL_CRITICAL_SECTION RTL_CRITICAL_SECTION, CRITICAL_SECTION, *LPCRITICAL_SECTION, *PCRITICAL_SECTION;
  50. typedef struct _RTL_SRWLOCK RTL_SRWLOCK, *PSRWLOCK;
  51. typedef struct _RTL_CONDITION_VARIABLE RTL_CONDITION_VARIABLE, *PCONDITION_VARIABLE;
  52. typedef struct _SHFILEOPSTRUCTA* LPSHFILEOPSTRUCTA;
  53. typedef struct _WIN32_FIND_DATAA WIN32_FIND_DATAA, *PWIN32_FIND_DATAA, *LPWIN32_FIND_DATAA;
  54. typedef union _LARGE_INTEGER LARGE_INTEGER;
  55. typedef struct _CONSOLE_SCREEN_BUFFER_INFO CONSOLE_SCREEN_BUFFER_INFO, *PCONSOLE_SCREEN_BUFFER_INFO;
  56. typedef struct _SYSTEM_INFO SYSTEM_INFO, *LPSYSTEM_INFO;
  57. // Thread & locks
  58. ANKI_WINBASEAPI HANDLE ANKI_WINAPI CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize,
  59. LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter,
  60. DWORD dwCreationFlags, LPDWORD lpThreadId);
  61. ANKI_WINBASEAPI DWORD_PTR ANKI_WINAPI SetThreadAffinityMask(HANDLE hThread, DWORD_PTR dwThreadAffinityMask);
  62. ANKI_WINBASEAPI DWORD ANKI_WINAPI WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);
  63. ANKI_WINBASEAPI BOOL ANKI_WINAPI CloseHandle(HANDLE hObject);
  64. ANKI_WINBASEAPI DWORD ANKI_WINAPI GetCurrentThreadId(VOID);
  65. ANKI_WINBASEAPI VOID ANKI_WINAPI InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
  66. ANKI_WINBASEAPI VOID ANKI_WINAPI EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
  67. ANKI_WINBASEAPI BOOL ANKI_WINAPI TryEnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
  68. ANKI_WINBASEAPI VOID ANKI_WINAPI LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
  69. ANKI_WINBASEAPI VOID ANKI_WINAPI DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
  70. ANKI_WINBASEAPI VOID ANKI_WINAPI InitializeSRWLock(PSRWLOCK SRWLock);
  71. ANKI_WINBASEAPI VOID ANKI_WINAPI AcquireSRWLockExclusive(PSRWLOCK SRWLock);
  72. ANKI_WINBASEAPI VOID ANKI_WINAPI AcquireSRWLockShared(PSRWLOCK SRWLock);
  73. ANKI_WINBASEAPI VOID ANKI_WINAPI ReleaseSRWLockExclusive(PSRWLOCK SRWLock);
  74. ANKI_WINBASEAPI VOID ANKI_WINAPI ReleaseSRWLockShared(PSRWLOCK SRWLock);
  75. ANKI_WINBASEAPI BOOLEAN ANKI_WINAPI TryAcquireSRWLockExclusive(PSRWLOCK SRWLock);
  76. ANKI_WINBASEAPI BOOLEAN ANKI_WINAPI TryAcquireSRWLockShared(PSRWLOCK SRWLock);
  77. ANKI_WINBASEAPI VOID ANKI_WINAPI InitializeConditionVariable(PCONDITION_VARIABLE ConditionVariable);
  78. ANKI_WINBASEAPI BOOL ANKI_WINAPI SleepConditionVariableCS(PCONDITION_VARIABLE ConditionVariable,
  79. PCRITICAL_SECTION CriticalSection, DWORD dwMilliseconds);
  80. ANKI_WINBASEAPI VOID ANKI_WINAPI WakeAllConditionVariable(PCONDITION_VARIABLE ConditionVariable);
  81. ANKI_WINBASEAPI VOID ANKI_WINAPI WakeConditionVariable(PCONDITION_VARIABLE ConditionVariable);
  82. // Filesystem
  83. ANKI_WINBASEAPI DWORD ANKI_WINAPI GetFileAttributesA(LPCSTR lpFileName);
  84. ANKI_WINBASEAPI int ANKI_WINAPI SHFileOperationA(LPSHFILEOPSTRUCTA lpFileOp);
  85. ANKI_WINBASEAPI BOOL ANKI_WINAPI CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes);
  86. ANKI_WINBASEAPI HRESULT ANKI_WINAPI SHGetFolderPathA(HWND hwnd, int csidl, HANDLE hToken, DWORD dwFlags, LPSTR pszPath);
  87. ANKI_WINBASEAPI HANDLE ANKI_WINAPI FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData);
  88. ANKI_WINBASEAPI BOOL ANKI_WINAPI FindClose(HANDLE hFindFile);
  89. ANKI_WINBASEAPI BOOL ANKI_WINAPI FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData);
  90. ANKI_WINBASEAPI DWORD ANKI_WINAPI GetTempPathA(DWORD nBufferLength, LPSTR lpBuffer);
  91. // Other
  92. ANKI_WINBASEAPI DWORD ANKI_WINAPI GetLastError(VOID);
  93. ANKI_WINBASEAPI BOOL ANKI_WINAPI QueryPerformanceFrequency(LARGE_INTEGER* lpFrequency);
  94. ANKI_WINBASEAPI BOOL ANKI_WINAPI QueryPerformanceCounter(LARGE_INTEGER* lpPerformanceCount);
  95. ANKI_WINBASEAPI VOID ANKI_WINAPI Sleep(DWORD dwMilliseconds);
  96. ANKI_WINBASEAPI HANDLE ANKI_WINAPI GetStdHandle(DWORD nStdHandle);
  97. ANKI_WINBASEAPI BOOL ANKI_WINAPI GetConsoleScreenBufferInfo(HANDLE hConsoleOutput,
  98. PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo);
  99. ANKI_WINBASEAPI BOOL ANKI_WINAPI SetConsoleTextAttribute(HANDLE hConsoleOutput, WORD wAttributes);
  100. ANKI_WINBASEAPI VOID ANKI_WINAPI GetSystemInfo(LPSYSTEM_INFO lpSystemInfo);
  101. ANKI_WINBASEAPI DWORD GetModuleFileNameA(HMODULE hModule, LPSTR lpFilename, DWORD nSize);
  102. #undef ANKI_WINBASEAPI
  103. #undef ANKI_DECLARE_HANDLE
  104. } // end extern "C"
  105. // AnKi's wrappers for various Windows.h structs. Required because we can't declare those structs in the global
  106. // namespace since there are files that might include this header and Windows.h at the same time.
  107. namespace anki {
  108. // Consts
  109. constexpr DWORD INVALID_FILE_ATTRIBUTES = (DWORD)-1;
  110. constexpr DWORD FILE_ATTRIBUTE_DIRECTORY = 0x00000010;
  111. constexpr DWORD MAX_PATH = 260;
  112. static const HANDLE INVALID_HANDLE_VALUE = (HANDLE)(LONG_PTR)-1;
  113. constexpr DWORD ERROR_NO_MORE_FILES = 18L;
  114. constexpr WORD FO_DELETE = 0x0003;
  115. constexpr WORD FOF_NOCONFIRMATION = 0x0010;
  116. constexpr WORD FOF_NOERRORUI = 0x0400;
  117. constexpr WORD FOF_SILENT = 0x0004;
  118. constexpr WORD CSIDL_PROFILE = 0x0028;
  119. constexpr DWORD STD_OUTPUT_HANDLE = (DWORD)-11;
  120. constexpr HRESULT S_OK = 0;
  121. constexpr DWORD INFINITE = 0xFFFFFFFF;
  122. constexpr DWORD ERROR_INSUFFICIENT_BUFFER = 122l;
  123. constexpr DWORD ERROR_SUCCESS = 0;
  124. constexpr WORD FOREGROUND_BLUE = 0x0001;
  125. constexpr WORD FOREGROUND_GREEN = 0x0002;
  126. constexpr WORD FOREGROUND_RED = 0x0004;
  127. constexpr WORD FOREGROUND_INTENSITY = 0x0008;
  128. constexpr WORD BACKGROUND_BLUE = 0x0010;
  129. constexpr WORD BACKGROUND_GREEN = 0x0020;
  130. constexpr WORD BACKGROUND_RED = 0x0040;
  131. // Types
  132. typedef union _LARGE_INTEGER
  133. {
  134. struct
  135. {
  136. ULONG LowPart;
  137. LONG HighPart;
  138. } DUMMYSTRUCTNAME;
  139. struct
  140. {
  141. ULONG LowPart;
  142. LONG HighPart;
  143. } u;
  144. LONGLONG QuadPart;
  145. } LARGE_INTEGER;
  146. typedef struct _SECURITY_ATTRIBUTES
  147. {
  148. DWORD nLength;
  149. LPVOID lpSecurityDescriptor;
  150. BOOL bInheritHandle;
  151. } SECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
  152. typedef struct _LIST_ENTRY
  153. {
  154. struct _LIST_ENTRY* Flink;
  155. struct _LIST_ENTRY* Blink;
  156. } LIST_ENTRY, *PLIST_ENTRY;
  157. typedef struct _RTL_CRITICAL_SECTION_DEBUG
  158. {
  159. WORD Type;
  160. WORD CreatorBackTraceIndex;
  161. struct _RTL_CRITICAL_SECTION* CriticalSection;
  162. LIST_ENTRY ProcessLocksList;
  163. DWORD EntryCount;
  164. DWORD ContentionCount;
  165. DWORD Flags;
  166. WORD CreatorBackTraceIndexHigh;
  167. WORD SpareWORD;
  168. } RTL_CRITICAL_SECTION_DEBUG, *PRTL_CRITICAL_SECTION_DEBUG;
  169. #pragma pack(push, 8)
  170. typedef struct _RTL_CRITICAL_SECTION
  171. {
  172. PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
  173. LONG LockCount;
  174. LONG RecursionCount;
  175. HANDLE OwningThread;
  176. HANDLE LockSemaphore;
  177. ULONG_PTR SpinCount;
  178. } CRITICAL_SECTION, *LPCRITICAL_SECTION, *PCRITICAL_SECTION;
  179. #pragma pack(pop)
  180. typedef struct _RTL_SRWLOCK
  181. {
  182. PVOID Ptr;
  183. } SRWLOCK, *PSRWLOCK;
  184. typedef struct _RTL_CONDITION_VARIABLE
  185. {
  186. PVOID Ptr;
  187. } CONDITION_VARIABLE, *PRTL_CONDITION_VARIABLE, *PCONDITION_VARIABLE;
  188. typedef WORD FILEOP_FLAGS;
  189. typedef struct _SHFILEOPSTRUCTA
  190. {
  191. HWND hwnd;
  192. UINT wFunc;
  193. PCZZSTR pFrom;
  194. PCZZSTR pTo;
  195. FILEOP_FLAGS fFlags;
  196. BOOL fAnyOperationsAborted;
  197. LPVOID hNameMappings;
  198. PCSTR lpszProgressTitle;
  199. } SHFILEOPSTRUCTA, *LPSHFILEOPSTRUCTA;
  200. typedef struct _FILETIME
  201. {
  202. DWORD dwLowDateTime;
  203. DWORD dwHighDateTime;
  204. } FILETIME, *PFILETIME, *LPFILETIME;
  205. typedef struct _WIN32_FIND_DATAA
  206. {
  207. DWORD dwFileAttributes;
  208. FILETIME ftCreationTime;
  209. FILETIME ftLastAccessTime;
  210. FILETIME ftLastWriteTime;
  211. DWORD nFileSizeHigh;
  212. DWORD nFileSizeLow;
  213. DWORD dwReserved0;
  214. DWORD dwReserved1;
  215. CHAR cFileName[MAX_PATH];
  216. CHAR cAlternateFileName[14];
  217. } WIN32_FIND_DATAA, *PWIN32_FIND_DATAA, *LPWIN32_FIND_DATAA;
  218. typedef struct _COORD
  219. {
  220. SHORT X;
  221. SHORT Y;
  222. } COORD, *PCOORD;
  223. typedef struct _SMALL_RECT
  224. {
  225. SHORT Left;
  226. SHORT Top;
  227. SHORT Right;
  228. SHORT Bottom;
  229. } SMALL_RECT, *PSMALL_RECT;
  230. typedef struct _CONSOLE_SCREEN_BUFFER_INFO
  231. {
  232. COORD dwSize;
  233. COORD dwCursorPosition;
  234. WORD wAttributes;
  235. SMALL_RECT srWindow;
  236. COORD dwMaximumWindowSize;
  237. } CONSOLE_SCREEN_BUFFER_INFO, *PCONSOLE_SCREEN_BUFFER_INFO;
  238. typedef struct _SYSTEM_INFO
  239. {
  240. union
  241. {
  242. DWORD dwOemId; // Obsolete field...do not use
  243. struct
  244. {
  245. WORD wProcessorArchitecture;
  246. WORD wReserved;
  247. } DUMMYSTRUCTNAME;
  248. } DUMMYUNIONNAME;
  249. DWORD dwPageSize;
  250. LPVOID lpMinimumApplicationAddress;
  251. LPVOID lpMaximumApplicationAddress;
  252. DWORD_PTR dwActiveProcessorMask;
  253. DWORD dwNumberOfProcessors;
  254. DWORD dwProcessorType;
  255. DWORD dwAllocationGranularity;
  256. WORD wProcessorLevel;
  257. WORD wProcessorRevision;
  258. } SYSTEM_INFO, *LPSYSTEM_INFO;
  259. // Critical section
  260. inline void InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection)
  261. {
  262. ::InitializeCriticalSection(reinterpret_cast<::LPCRITICAL_SECTION>(lpCriticalSection));
  263. }
  264. inline void EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection)
  265. {
  266. ::EnterCriticalSection(reinterpret_cast<::LPCRITICAL_SECTION>(lpCriticalSection));
  267. }
  268. inline BOOL TryEnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection)
  269. {
  270. return ::TryEnterCriticalSection(reinterpret_cast<::LPCRITICAL_SECTION>(lpCriticalSection));
  271. }
  272. inline void LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection)
  273. {
  274. ::LeaveCriticalSection(reinterpret_cast<::LPCRITICAL_SECTION>(lpCriticalSection));
  275. }
  276. inline void DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection)
  277. {
  278. ::DeleteCriticalSection(reinterpret_cast<::LPCRITICAL_SECTION>(lpCriticalSection));
  279. }
  280. // Shared lock
  281. inline void InitializeSRWLock(PSRWLOCK SRWLock)
  282. {
  283. ::InitializeSRWLock(reinterpret_cast<::PSRWLOCK>(SRWLock));
  284. }
  285. inline void AcquireSRWLockExclusive(PSRWLOCK SRWLock)
  286. {
  287. ::AcquireSRWLockExclusive(reinterpret_cast<::PSRWLOCK>(SRWLock));
  288. }
  289. inline void AcquireSRWLockShared(PSRWLOCK SRWLock)
  290. {
  291. ::AcquireSRWLockShared(reinterpret_cast<::PSRWLOCK>(SRWLock));
  292. }
  293. inline void ReleaseSRWLockExclusive(PSRWLOCK SRWLock)
  294. {
  295. ::ReleaseSRWLockExclusive(reinterpret_cast<::PSRWLOCK>(SRWLock));
  296. }
  297. inline void ReleaseSRWLockShared(PSRWLOCK SRWLock)
  298. {
  299. ::ReleaseSRWLockShared(reinterpret_cast<::PSRWLOCK>(SRWLock));
  300. }
  301. inline BOOL TryAcquireSRWLockExclusive(PSRWLOCK SRWLock)
  302. {
  303. return ::TryAcquireSRWLockExclusive(reinterpret_cast<::PSRWLOCK>(SRWLock));
  304. }
  305. inline BOOL TryAcquireSRWLockShared(PSRWLOCK SRWLock)
  306. {
  307. return ::TryAcquireSRWLockShared(reinterpret_cast<::PSRWLOCK>(SRWLock));
  308. }
  309. // Condition var
  310. inline void InitializeConditionVariable(PCONDITION_VARIABLE ConditionVariable)
  311. {
  312. ::InitializeConditionVariable(reinterpret_cast<::PCONDITION_VARIABLE>(ConditionVariable));
  313. }
  314. inline BOOL SleepConditionVariableCS(PCONDITION_VARIABLE ConditionVariable, PCRITICAL_SECTION CriticalSection,
  315. DWORD dwMilliseconds)
  316. {
  317. return ::SleepConditionVariableCS(reinterpret_cast<::PCONDITION_VARIABLE>(ConditionVariable),
  318. reinterpret_cast<::PCRITICAL_SECTION>(CriticalSection), dwMilliseconds);
  319. }
  320. inline void WakeAllConditionVariable(PCONDITION_VARIABLE ConditionVariable)
  321. {
  322. ::WakeAllConditionVariable(reinterpret_cast<::PCONDITION_VARIABLE>(ConditionVariable));
  323. }
  324. inline void WakeConditionVariable(PCONDITION_VARIABLE ConditionVariable)
  325. {
  326. ::WakeConditionVariable(reinterpret_cast<::PCONDITION_VARIABLE>(ConditionVariable));
  327. }
  328. // Filesystem
  329. inline DWORD GetFileAttributesA(LPCSTR lpFileName)
  330. {
  331. return ::GetFileAttributesA(lpFileName);
  332. }
  333. inline int SHFileOperationA(LPSHFILEOPSTRUCTA lpFileOp)
  334. {
  335. return ::SHFileOperationA(reinterpret_cast<::LPSHFILEOPSTRUCTA>(lpFileOp));
  336. }
  337. inline BOOL CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes)
  338. {
  339. return ::CreateDirectoryA(lpPathName, reinterpret_cast<::LPSECURITY_ATTRIBUTES>(lpSecurityAttributes));
  340. }
  341. inline HRESULT SHGetFolderPathA(HWND hwnd, int csidl, HANDLE hToken, DWORD dwFlags, LPSTR pszPath)
  342. {
  343. return ::SHGetFolderPathA(hwnd, csidl, hToken, dwFlags, pszPath);
  344. }
  345. inline HANDLE FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData)
  346. {
  347. return ::FindFirstFileA(lpFileName, reinterpret_cast<::LPWIN32_FIND_DATAA>(lpFindFileData));
  348. }
  349. inline BOOL FindClose(HANDLE hFindFile)
  350. {
  351. return ::FindClose(hFindFile);
  352. }
  353. inline BOOL FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData)
  354. {
  355. return ::FindNextFileA(hFindFile, reinterpret_cast<::LPWIN32_FIND_DATAA>(lpFindFileData));
  356. }
  357. inline DWORD GetTempPathA(DWORD nBufferLength, LPSTR lpBuffer)
  358. {
  359. return ::GetTempPathA(nBufferLength, lpBuffer);
  360. }
  361. // Other
  362. inline BOOL QueryPerformanceFrequency(LARGE_INTEGER* lpFrequency)
  363. {
  364. return ::QueryPerformanceFrequency(reinterpret_cast<::LARGE_INTEGER*>(lpFrequency));
  365. }
  366. inline BOOL QueryPerformanceCounter(LARGE_INTEGER* lpPerformanceCount)
  367. {
  368. return ::QueryPerformanceCounter(reinterpret_cast<::LARGE_INTEGER*>(lpPerformanceCount));
  369. }
  370. inline BOOL GetConsoleScreenBufferInfo(HANDLE hConsoleOutput, PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo)
  371. {
  372. return ::GetConsoleScreenBufferInfo(hConsoleOutput,
  373. reinterpret_cast<::PCONSOLE_SCREEN_BUFFER_INFO>(lpConsoleScreenBufferInfo));
  374. }
  375. inline VOID GetSystemInfo(LPSYSTEM_INFO lpSystemInfo)
  376. {
  377. ::GetSystemInfo(reinterpret_cast<::LPSYSTEM_INFO>(lpSystemInfo));
  378. }
  379. inline DWORD GetModuleFileNameA(HMODULE hModule, LPSTR lpFilename, DWORD nSize)
  380. {
  381. return ::GetModuleFileNameA(hModule, lpFilename, nSize);
  382. }
  383. } // end namespace anki