Win32Minimal.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  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. {
  106. // Consts
  107. constexpr DWORD INVALID_FILE_ATTRIBUTES = (DWORD)-1;
  108. constexpr DWORD FILE_ATTRIBUTE_DIRECTORY = 0x00000010;
  109. constexpr DWORD MAX_PATH = 260;
  110. static const HANDLE INVALID_HANDLE_VALUE = (HANDLE)(LONG_PTR)-1;
  111. constexpr DWORD ERROR_NO_MORE_FILES = 18L;
  112. constexpr WORD FO_DELETE = 0x0003;
  113. constexpr WORD FOF_NOCONFIRMATION = 0x0010;
  114. constexpr WORD FOF_NOERRORUI = 0x0400;
  115. constexpr WORD FOF_SILENT = 0x0004;
  116. constexpr WORD CSIDL_PROFILE = 0x0028;
  117. constexpr DWORD STD_OUTPUT_HANDLE = (DWORD)-11;
  118. constexpr HRESULT S_OK = 0;
  119. constexpr DWORD INFINITE = 0xFFFFFFFF;
  120. constexpr WORD FOREGROUND_BLUE = 0x0001;
  121. constexpr WORD FOREGROUND_GREEN = 0x0002;
  122. constexpr WORD FOREGROUND_RED = 0x0004;
  123. constexpr WORD FOREGROUND_INTENSITY = 0x0008;
  124. constexpr WORD BACKGROUND_BLUE = 0x0010;
  125. constexpr WORD BACKGROUND_GREEN = 0x0020;
  126. constexpr WORD BACKGROUND_RED = 0x0040;
  127. // Types
  128. typedef union _LARGE_INTEGER
  129. {
  130. struct
  131. {
  132. ULONG LowPart;
  133. LONG HighPart;
  134. } DUMMYSTRUCTNAME;
  135. struct
  136. {
  137. ULONG LowPart;
  138. LONG HighPart;
  139. } u;
  140. LONGLONG QuadPart;
  141. } LARGE_INTEGER;
  142. typedef struct _SECURITY_ATTRIBUTES
  143. {
  144. DWORD nLength;
  145. LPVOID lpSecurityDescriptor;
  146. BOOL bInheritHandle;
  147. } SECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
  148. typedef struct _LIST_ENTRY
  149. {
  150. struct _LIST_ENTRY* Flink;
  151. struct _LIST_ENTRY* Blink;
  152. } LIST_ENTRY, *PLIST_ENTRY;
  153. typedef struct _RTL_CRITICAL_SECTION_DEBUG
  154. {
  155. WORD Type;
  156. WORD CreatorBackTraceIndex;
  157. struct _RTL_CRITICAL_SECTION* CriticalSection;
  158. LIST_ENTRY ProcessLocksList;
  159. DWORD EntryCount;
  160. DWORD ContentionCount;
  161. DWORD Flags;
  162. WORD CreatorBackTraceIndexHigh;
  163. WORD SpareWORD;
  164. } RTL_CRITICAL_SECTION_DEBUG, *PRTL_CRITICAL_SECTION_DEBUG;
  165. #pragma pack(push, 8)
  166. typedef struct _RTL_CRITICAL_SECTION
  167. {
  168. PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
  169. LONG LockCount;
  170. LONG RecursionCount;
  171. HANDLE OwningThread;
  172. HANDLE LockSemaphore;
  173. ULONG_PTR SpinCount;
  174. } CRITICAL_SECTION, *LPCRITICAL_SECTION, *PCRITICAL_SECTION;
  175. #pragma pack(pop)
  176. typedef struct _RTL_SRWLOCK
  177. {
  178. PVOID Ptr;
  179. } SRWLOCK, *PSRWLOCK;
  180. typedef struct _RTL_CONDITION_VARIABLE
  181. {
  182. PVOID Ptr;
  183. } CONDITION_VARIABLE, *PRTL_CONDITION_VARIABLE, *PCONDITION_VARIABLE;
  184. typedef WORD FILEOP_FLAGS;
  185. typedef struct _SHFILEOPSTRUCTA
  186. {
  187. HWND hwnd;
  188. UINT wFunc;
  189. PCZZSTR pFrom;
  190. PCZZSTR pTo;
  191. FILEOP_FLAGS fFlags;
  192. BOOL fAnyOperationsAborted;
  193. LPVOID hNameMappings;
  194. PCSTR lpszProgressTitle;
  195. } SHFILEOPSTRUCTA, *LPSHFILEOPSTRUCTA;
  196. typedef struct _FILETIME
  197. {
  198. DWORD dwLowDateTime;
  199. DWORD dwHighDateTime;
  200. } FILETIME, *PFILETIME, *LPFILETIME;
  201. typedef struct _WIN32_FIND_DATAA
  202. {
  203. DWORD dwFileAttributes;
  204. FILETIME ftCreationTime;
  205. FILETIME ftLastAccessTime;
  206. FILETIME ftLastWriteTime;
  207. DWORD nFileSizeHigh;
  208. DWORD nFileSizeLow;
  209. DWORD dwReserved0;
  210. DWORD dwReserved1;
  211. CHAR cFileName[MAX_PATH];
  212. CHAR cAlternateFileName[14];
  213. } WIN32_FIND_DATAA, *PWIN32_FIND_DATAA, *LPWIN32_FIND_DATAA;
  214. typedef struct _COORD
  215. {
  216. SHORT X;
  217. SHORT Y;
  218. } COORD, *PCOORD;
  219. typedef struct _SMALL_RECT
  220. {
  221. SHORT Left;
  222. SHORT Top;
  223. SHORT Right;
  224. SHORT Bottom;
  225. } SMALL_RECT, *PSMALL_RECT;
  226. typedef struct _CONSOLE_SCREEN_BUFFER_INFO
  227. {
  228. COORD dwSize;
  229. COORD dwCursorPosition;
  230. WORD wAttributes;
  231. SMALL_RECT srWindow;
  232. COORD dwMaximumWindowSize;
  233. } CONSOLE_SCREEN_BUFFER_INFO, *PCONSOLE_SCREEN_BUFFER_INFO;
  234. typedef struct _SYSTEM_INFO
  235. {
  236. union
  237. {
  238. DWORD dwOemId; // Obsolete field...do not use
  239. struct
  240. {
  241. WORD wProcessorArchitecture;
  242. WORD wReserved;
  243. } DUMMYSTRUCTNAME;
  244. } DUMMYUNIONNAME;
  245. DWORD dwPageSize;
  246. LPVOID lpMinimumApplicationAddress;
  247. LPVOID lpMaximumApplicationAddress;
  248. DWORD_PTR dwActiveProcessorMask;
  249. DWORD dwNumberOfProcessors;
  250. DWORD dwProcessorType;
  251. DWORD dwAllocationGranularity;
  252. WORD wProcessorLevel;
  253. WORD wProcessorRevision;
  254. } SYSTEM_INFO, *LPSYSTEM_INFO;
  255. // Critical section
  256. inline void InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection)
  257. {
  258. ::InitializeCriticalSection(reinterpret_cast<::LPCRITICAL_SECTION>(lpCriticalSection));
  259. }
  260. inline void EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection)
  261. {
  262. ::EnterCriticalSection(reinterpret_cast<::LPCRITICAL_SECTION>(lpCriticalSection));
  263. }
  264. inline BOOL TryEnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection)
  265. {
  266. return ::TryEnterCriticalSection(reinterpret_cast<::LPCRITICAL_SECTION>(lpCriticalSection));
  267. }
  268. inline void LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection)
  269. {
  270. ::LeaveCriticalSection(reinterpret_cast<::LPCRITICAL_SECTION>(lpCriticalSection));
  271. }
  272. inline void DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection)
  273. {
  274. ::DeleteCriticalSection(reinterpret_cast<::LPCRITICAL_SECTION>(lpCriticalSection));
  275. }
  276. // Shared lock
  277. inline void InitializeSRWLock(PSRWLOCK SRWLock)
  278. {
  279. ::InitializeSRWLock(reinterpret_cast<::PSRWLOCK>(SRWLock));
  280. }
  281. inline void AcquireSRWLockExclusive(PSRWLOCK SRWLock)
  282. {
  283. ::AcquireSRWLockExclusive(reinterpret_cast<::PSRWLOCK>(SRWLock));
  284. }
  285. inline void AcquireSRWLockShared(PSRWLOCK SRWLock)
  286. {
  287. ::AcquireSRWLockShared(reinterpret_cast<::PSRWLOCK>(SRWLock));
  288. }
  289. inline void ReleaseSRWLockExclusive(PSRWLOCK SRWLock)
  290. {
  291. ::ReleaseSRWLockExclusive(reinterpret_cast<::PSRWLOCK>(SRWLock));
  292. }
  293. inline void ReleaseSRWLockShared(PSRWLOCK SRWLock)
  294. {
  295. ::ReleaseSRWLockShared(reinterpret_cast<::PSRWLOCK>(SRWLock));
  296. }
  297. inline BOOL TryAcquireSRWLockExclusive(PSRWLOCK SRWLock)
  298. {
  299. return ::TryAcquireSRWLockExclusive(reinterpret_cast<::PSRWLOCK>(SRWLock));
  300. }
  301. inline BOOL TryAcquireSRWLockShared(PSRWLOCK SRWLock)
  302. {
  303. return ::TryAcquireSRWLockShared(reinterpret_cast<::PSRWLOCK>(SRWLock));
  304. }
  305. // Condition var
  306. inline void InitializeConditionVariable(PCONDITION_VARIABLE ConditionVariable)
  307. {
  308. ::InitializeConditionVariable(reinterpret_cast<::PCONDITION_VARIABLE>(ConditionVariable));
  309. }
  310. inline BOOL SleepConditionVariableCS(PCONDITION_VARIABLE ConditionVariable, PCRITICAL_SECTION CriticalSection,
  311. DWORD dwMilliseconds)
  312. {
  313. return ::SleepConditionVariableCS(reinterpret_cast<::PCONDITION_VARIABLE>(ConditionVariable),
  314. reinterpret_cast<::PCRITICAL_SECTION>(CriticalSection), dwMilliseconds);
  315. }
  316. inline void WakeAllConditionVariable(PCONDITION_VARIABLE ConditionVariable)
  317. {
  318. ::WakeAllConditionVariable(reinterpret_cast<::PCONDITION_VARIABLE>(ConditionVariable));
  319. }
  320. inline void WakeConditionVariable(PCONDITION_VARIABLE ConditionVariable)
  321. {
  322. ::WakeConditionVariable(reinterpret_cast<::PCONDITION_VARIABLE>(ConditionVariable));
  323. }
  324. // Filesystem
  325. inline DWORD GetFileAttributesA(LPCSTR lpFileName)
  326. {
  327. return ::GetFileAttributesA(lpFileName);
  328. }
  329. inline int SHFileOperationA(LPSHFILEOPSTRUCTA lpFileOp)
  330. {
  331. return ::SHFileOperationA(reinterpret_cast<::LPSHFILEOPSTRUCTA>(lpFileOp));
  332. }
  333. inline BOOL CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes)
  334. {
  335. return ::CreateDirectoryA(lpPathName, reinterpret_cast<::LPSECURITY_ATTRIBUTES>(lpSecurityAttributes));
  336. }
  337. inline HRESULT SHGetFolderPathA(HWND hwnd, int csidl, HANDLE hToken, DWORD dwFlags, LPSTR pszPath)
  338. {
  339. return ::SHGetFolderPathA(hwnd, csidl, hToken, dwFlags, pszPath);
  340. }
  341. inline HANDLE FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData)
  342. {
  343. return ::FindFirstFileA(lpFileName, reinterpret_cast<::LPWIN32_FIND_DATAA>(lpFindFileData));
  344. }
  345. inline BOOL FindClose(HANDLE hFindFile)
  346. {
  347. return ::FindClose(hFindFile);
  348. }
  349. inline BOOL FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData)
  350. {
  351. return ::FindNextFileA(hFindFile, reinterpret_cast<::LPWIN32_FIND_DATAA>(lpFindFileData));
  352. }
  353. inline DWORD GetTempPathA(DWORD nBufferLength, LPSTR lpBuffer)
  354. {
  355. return ::GetTempPathA(nBufferLength, lpBuffer);
  356. }
  357. // Other
  358. inline BOOL QueryPerformanceFrequency(LARGE_INTEGER* lpFrequency)
  359. {
  360. return ::QueryPerformanceFrequency(reinterpret_cast<::LARGE_INTEGER*>(lpFrequency));
  361. }
  362. inline BOOL QueryPerformanceCounter(LARGE_INTEGER* lpPerformanceCount)
  363. {
  364. return ::QueryPerformanceCounter(reinterpret_cast<::LARGE_INTEGER*>(lpPerformanceCount));
  365. }
  366. inline BOOL GetConsoleScreenBufferInfo(HANDLE hConsoleOutput, PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo)
  367. {
  368. return ::GetConsoleScreenBufferInfo(hConsoleOutput,
  369. reinterpret_cast<::PCONSOLE_SCREEN_BUFFER_INFO>(lpConsoleScreenBufferInfo));
  370. }
  371. inline VOID GetSystemInfo(LPSYSTEM_INFO lpSystemInfo)
  372. {
  373. ::GetSystemInfo(reinterpret_cast<::LPSYSTEM_INFO>(lpSystemInfo));
  374. }
  375. } // end namespace anki