Win32Minimal.h 14 KB

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