kernel32.odin 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222
  1. #+build windows
  2. package sys_windows
  3. foreign import kernel32 "system:Kernel32.lib"
  4. foreign import one_core "system:OneCore.lib"
  5. FOREGROUND_BLUE :: WORD(0x0001)
  6. FOREGROUND_GREEN :: WORD(0x0002)
  7. FOREGROUND_RED :: WORD(0x0004)
  8. FOREGROUND_INTENSITY :: WORD(0x0008)
  9. BACKGROUND_BLUE :: WORD(0x0010)
  10. BACKGROUND_GREEN :: WORD(0x0020)
  11. BACKGROUND_RED :: WORD(0x0040)
  12. BACKGROUND_INTENSITY :: WORD(0x0080)
  13. COMMON_LVB_LEADING_BYTE :: WORD(0x0100)
  14. COMMON_LVB_TRAILING_BYTE :: WORD(0x0200)
  15. COMMON_LVB_GRID_HORIZONTAL :: WORD(0x0400)
  16. COMMON_LVB_GRID_LVERTICAL :: WORD(0x0800)
  17. COMMON_LVB_GRID_RVERTICAL :: WORD(0x1000)
  18. COMMON_LVB_REVERSE_VIDEO :: WORD(0x4000)
  19. COMMON_LVB_UNDERSCORE :: WORD(0x8000)
  20. COMMON_LVB_SBCSDBCS :: WORD(0x0300)
  21. @(default_calling_convention="system")
  22. foreign kernel32 {
  23. OutputDebugStringA :: proc(lpOutputString: LPCSTR) --- // The only A thing that is allowed
  24. OutputDebugStringW :: proc(lpOutputString: LPCWSTR) ---
  25. ReadConsoleW :: proc(hConsoleInput: HANDLE,
  26. lpBuffer: LPVOID,
  27. nNumberOfCharsToRead: DWORD,
  28. lpNumberOfCharsRead: LPDWORD,
  29. pInputControl: PCONSOLE_READCONSOLE_CONTROL) -> BOOL ---
  30. WriteConsoleW :: proc(hConsoleOutput: HANDLE,
  31. lpBuffer: LPCVOID,
  32. nNumberOfCharsToWrite: DWORD,
  33. lpNumberOfCharsWritten: LPDWORD,
  34. lpReserved: LPVOID) -> BOOL ---
  35. PeekConsoleInputW :: proc(hConsoleInput: HANDLE,
  36. lpBuffer: ^INPUT_RECORD,
  37. nLength: DWORD,
  38. lpNumberOfEventsRead: LPDWORD) -> BOOL ---
  39. ReadConsoleInputW :: proc(hConsoleInput: HANDLE,
  40. lpBuffer: ^INPUT_RECORD,
  41. nLength: DWORD,
  42. lpNumberOfEventsRead: LPDWORD) -> BOOL ---
  43. // https://learn.microsoft.com/en-us/windows/console/getnumberofconsoleinputevents
  44. GetNumberOfConsoleInputEvents :: proc(hConsoleInput: HANDLE, lpcNumberOfEvents: LPDWORD) -> BOOL ---
  45. GetConsoleMode :: proc(hConsoleHandle: HANDLE, lpMode: LPDWORD) -> BOOL ---
  46. SetConsoleMode :: proc(hConsoleHandle: HANDLE, dwMode: DWORD) -> BOOL ---
  47. SetConsoleCursorPosition :: proc(hConsoleHandle: HANDLE, dwCursorPosition: COORD) -> BOOL ---
  48. SetConsoleTextAttribute :: proc(hConsoleOutput: HANDLE, wAttributes: WORD) -> BOOL ---
  49. GetConsoleCP :: proc() -> CODEPAGE ---
  50. SetConsoleCP :: proc(wCodePageID: CODEPAGE) -> BOOL ---
  51. GetConsoleOutputCP :: proc() -> CODEPAGE ---
  52. SetConsoleOutputCP :: proc(wCodePageID: CODEPAGE) -> BOOL ---
  53. FlushConsoleInputBuffer :: proc(hConsoleInput: HANDLE) -> BOOL ---
  54. GetFileInformationByHandle :: proc(hFile: HANDLE, lpFileInformation: LPBY_HANDLE_FILE_INFORMATION) -> BOOL ---
  55. SetHandleInformation :: proc(hObject: HANDLE,
  56. dwMask: DWORD,
  57. dwFlags: DWORD) -> BOOL ---
  58. SetFileInformationByHandle :: proc(hFile: HANDLE,
  59. FileInformationClass: FILE_INFO_BY_HANDLE_CLASS,
  60. lpFileInformation: LPVOID,
  61. dwBufferSize: DWORD) -> BOOL ---
  62. AddVectoredExceptionHandler :: proc(FirstHandler: ULONG, VectoredHandler: PVECTORED_EXCEPTION_HANDLER) -> LPVOID ---
  63. AddVectoredContinueHandler :: proc(FirstHandler: ULONG, VectoredHandler: PVECTORED_EXCEPTION_HANDLER) -> LPVOID ---
  64. RemoveVectoredExceptionHandler :: proc(Handle: LPVOID) -> DWORD ---
  65. RemoveVectoredContinueHandler :: proc(Handle: LPVOID) -> DWORD ---
  66. RaiseException :: proc(dwExceptionCode, dwExceptionFlags, nNumberOfArguments: DWORD, lpArguments: ^ULONG_PTR) -> ! ---
  67. SetUnhandledExceptionFilter :: proc(lpTopLevelExceptionFilter: LPTOP_LEVEL_EXCEPTION_FILTER) -> LPTOP_LEVEL_EXCEPTION_FILTER ---
  68. CreateHardLinkW :: proc(lpSymlinkFileName: LPCWSTR,
  69. lpTargetFileName: LPCWSTR,
  70. lpSecurityAttributes: LPSECURITY_ATTRIBUTES) -> BOOL ---
  71. CreateSymbolicLinkW :: proc(lpSymlinkFileName: LPCWSTR,
  72. lpTargetFileName: LPCWSTR,
  73. dwFlags: DWORD) -> BOOLEAN ---
  74. GetFileInformationByHandleEx :: proc(hFile: HANDLE,
  75. fileInfoClass: FILE_INFO_BY_HANDLE_CLASS,
  76. lpFileInformation: LPVOID,
  77. dwBufferSize: DWORD) -> BOOL ---
  78. InitializeCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) ---
  79. InitializeCriticalSectionAndSpinCount :: proc(CriticalSection: ^CRITICAL_SECTION, dwSpinCount: DWORD) -> BOOL ---
  80. EnterCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) ---
  81. TryEnterCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) -> BOOLEAN ---
  82. LeaveCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) ---
  83. DeleteCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) ---
  84. RemoveDirectoryW :: proc(lpPathName: LPCWSTR) -> BOOL ---
  85. SetFileAttributesW :: proc(lpFileName: LPCWSTR, dwFileAttributes: DWORD) -> BOOL ---
  86. SetLastError :: proc(dwErrCode: DWORD) ---
  87. GetCommTimeouts :: proc(handle: HANDLE, timeouts: ^COMMTIMEOUTS) -> BOOL ---
  88. SetCommTimeouts :: proc(handle: HANDLE, timeouts: ^COMMTIMEOUTS) -> BOOL ---
  89. ClearCommError :: proc(hFile: HANDLE, lpErrors: ^Com_Error, lpStat: ^COMSTAT) -> BOOL ---
  90. GetCommState :: proc(handle: HANDLE, dcb: ^DCB) -> BOOL ---
  91. SetCommState :: proc(handle: HANDLE, dcb: ^DCB) -> BOOL ---
  92. GetCommPorts :: proc(lpPortNumbers: PULONG, uPortNumbersCount: ULONG, puPortNumbersFound: PULONG) -> ULONG ---
  93. GetCommandLineW :: proc() -> LPCWSTR ---
  94. GetTempPathW :: proc(nBufferLength: DWORD, lpBuffer: LPCWSTR) -> DWORD ---
  95. GetCurrentProcess :: proc() -> HANDLE ---
  96. GetCurrentProcessId :: proc() -> DWORD ---
  97. GetCurrentThread :: proc() -> HANDLE ---
  98. GetCurrentThreadId :: proc() -> DWORD ---
  99. GetProcessTimes :: proc(
  100. hProcess: HANDLE,
  101. lpCreationTime: LPFILETIME,
  102. lpExitTime: LPFILETIME,
  103. lpKernelTime: LPFILETIME,
  104. lpUserTime: LPFILETIME,
  105. ) -> BOOL ---
  106. GetStdHandle :: proc(which: DWORD) -> HANDLE ---
  107. ExitProcess :: proc(uExitCode: c_uint) -> ! ---
  108. DeviceIoControl :: proc(
  109. hDevice: HANDLE,
  110. dwIoControlCode: DWORD,
  111. lpInBuffer: LPVOID,
  112. nInBufferSize: DWORD,
  113. lpOutBuffer: LPVOID,
  114. nOutBufferSize: DWORD,
  115. lpBytesReturned: LPDWORD,
  116. lpOverlapped: LPOVERLAPPED,
  117. ) -> BOOL ---
  118. CreateThread :: proc(
  119. lpThreadAttributes: LPSECURITY_ATTRIBUTES,
  120. dwStackSize: SIZE_T,
  121. lpStartAddress: proc "system" (rawptr) -> DWORD,
  122. lpParameter: LPVOID,
  123. dwCreationFlags: DWORD,
  124. lpThreadId: LPDWORD,
  125. ) -> HANDLE ---
  126. CreateRemoteThread :: proc(
  127. hProcess: HANDLE,
  128. lpThreadAttributes: LPSECURITY_ATTRIBUTES,
  129. dwStackSize: SIZE_T,
  130. lpStartAddress: proc "system" (rawptr) -> DWORD,
  131. lpParameter: LPVOID,
  132. dwCreationFlags: DWORD,
  133. lpThreadId: LPDWORD,
  134. ) -> HANDLE ---
  135. SwitchToThread :: proc() -> BOOL ---
  136. ResumeThread :: proc(thread: HANDLE) -> DWORD ---
  137. GetThreadPriority :: proc(thread: HANDLE) -> c_int ---
  138. SetThreadPriority :: proc(thread: HANDLE, priority: c_int) -> BOOL ---
  139. SetThreadDescription :: proc(hThread: HANDLE, lpThreadDescription: PCWSTR) -> HRESULT ---
  140. GetExitCodeThread :: proc(thread: HANDLE, exit_code: ^DWORD) -> BOOL ---
  141. TerminateThread :: proc(thread: HANDLE, exit_code: DWORD) -> BOOL ---
  142. SuspendThread :: proc(hThread: HANDLE) -> DWORD ---
  143. GetProcessAffinityMask :: proc(
  144. hProcess: HANDLE,
  145. lpProcessAffinityMask: PDWORD_PTR,
  146. lpSystemAffinityMask: PDWORD_PTR,
  147. ) -> BOOL ---
  148. SetProcessAffinityMask :: proc(
  149. hProcess: HANDLE,
  150. dwProcessAffinityMask: DWORD_PTR,
  151. ) -> BOOL ---
  152. SetThreadAffinityMask :: proc(
  153. hThread: HANDLE,
  154. dwThreadAffinityMask: DWORD_PTR,
  155. ) -> DWORD_PTR ---
  156. CreateSemaphoreW :: proc(attributes: LPSECURITY_ATTRIBUTES, initial_count, maximum_count: LONG, name: LPCWSTR) -> HANDLE ---
  157. ReleaseSemaphore :: proc(semaphore: HANDLE, release_count: LONG, previous_count: ^LONG) -> BOOL ---
  158. CreateWaitableTimerW :: proc(
  159. lpTimerAttributes: LPSECURITY_ATTRIBUTES,
  160. bManualReset: BOOL,
  161. lpTimerName: LPCWSTR,
  162. ) -> HANDLE ---
  163. CreateWaitableTimerExW :: proc(
  164. lpTimerAttributes: LPSECURITY_ATTRIBUTES,
  165. lpTimerName: LPCWSTR,
  166. dwFlags: DWORD,
  167. dwDesiredAccess: DWORD,
  168. ) -> HANDLE ---
  169. SetWaitableTimerEx :: proc(
  170. hTimer: HANDLE,
  171. lpDueTime: ^LARGE_INTEGER,
  172. lPeriod: LONG,
  173. pfnCompletionRoutine: PTIMERAPCROUTINE,
  174. lpArgToCompletionRoutine: LPVOID,
  175. WakeContext: PREASON_CONTEXT,
  176. TolerableDelay: ULONG,
  177. ) -> BOOL ---
  178. WaitForSingleObject :: proc(hHandle: HANDLE, dwMilliseconds: DWORD) -> DWORD ---
  179. WaitForSingleObjectEx :: proc(hHandle: HANDLE, dwMilliseconds: DWORD, bAlterable: BOOL) -> DWORD ---
  180. Sleep :: proc(dwMilliseconds: DWORD) ---
  181. GetProcessId :: proc(handle: HANDLE) -> DWORD ---
  182. CopyFileW :: proc(
  183. lpExistingFileName: LPCWSTR,
  184. lpNewFileName: LPCWSTR,
  185. bFailIfExists: BOOL,
  186. ) -> BOOL ---
  187. CopyFileExW :: proc(
  188. lpExistingFileName: LPCWSTR,
  189. lpNewFileName: LPCWSTR,
  190. lpProgressRoutine: LPPROGRESS_ROUTINE,
  191. lpData: LPVOID,
  192. pbCancel: LPBOOL,
  193. dwCopyFlags: DWORD,
  194. ) -> BOOL ---
  195. FormatMessageW :: proc(
  196. flags: DWORD,
  197. lpSrc: LPVOID,
  198. msgId: DWORD,
  199. langId: DWORD,
  200. buf: LPWSTR,
  201. nsize: DWORD,
  202. args: rawptr,
  203. ) -> DWORD ---
  204. TlsAlloc :: proc() -> DWORD ---
  205. TlsFree :: proc(dwTlsIndex: DWORD) -> BOOL ---
  206. TlsGetValue :: proc(dwTlsIndex: DWORD) -> LPVOID ---
  207. TlsSetValue :: proc(dwTlsIndex: DWORD, lpTlsvalue: LPVOID) -> BOOL ---
  208. GetLastError :: proc() -> DWORD ---
  209. QueryPerformanceFrequency :: proc(lpFrequency: ^LARGE_INTEGER) -> BOOL ---
  210. QueryPerformanceCounter :: proc(lpPerformanceCount: ^LARGE_INTEGER) -> BOOL ---
  211. GetExitCodeProcess :: proc(hProcess: HANDLE, lpExitCode: LPDWORD) -> BOOL ---
  212. TerminateProcess :: proc(hProcess: HANDLE, uExitCode: UINT) -> BOOL ---
  213. OpenProcess :: proc(dwDesiredAccess: DWORD, bInheritHandle: BOOL, dwProcessId: DWORD) -> HANDLE ---
  214. OpenThread :: proc(dwDesiredAccess: DWORD, bInheritHandle: BOOL, dwThreadId: DWORD) -> HANDLE ---
  215. GetThreadContext :: proc(
  216. hThread: HANDLE,
  217. lpContext: LPCONTEXT,
  218. ) -> BOOL ---
  219. CreateProcessW :: proc(
  220. lpApplicationName: LPCWSTR,
  221. lpCommandLine: LPWSTR,
  222. lpProcessAttributes: LPSECURITY_ATTRIBUTES,
  223. lpThreadAttributes: LPSECURITY_ATTRIBUTES,
  224. bInheritHandles: BOOL,
  225. dwCreationFlags: DWORD,
  226. lpEnvironment: LPVOID,
  227. lpCurrentDirectory: LPCWSTR,
  228. lpStartupInfo: LPSTARTUPINFOW,
  229. lpProcessInformation: LPPROCESS_INFORMATION,
  230. ) -> BOOL ---
  231. GetStartupInfoW :: proc(lpStartupInfo: LPSTARTUPINFOW) ---
  232. GetEnvironmentVariableW :: proc(n: LPCWSTR, v: LPWSTR, nsize: DWORD) -> DWORD ---
  233. SetEnvironmentVariableW :: proc(n: LPCWSTR, v: LPCWSTR) -> BOOL ---
  234. GetEnvironmentStringsW :: proc() -> LPWCH ---
  235. FreeEnvironmentStringsW :: proc(env_ptr: LPWCH) -> BOOL ---
  236. ExpandEnvironmentStringsW :: proc(lpSrc: LPCWSTR, lpDst: LPWSTR, nSize: DWORD) -> DWORD ---
  237. GetModuleFileNameW :: proc(hModule: HMODULE, lpFilename: LPWSTR, nSize: DWORD) -> DWORD ---
  238. CreateDirectoryW :: proc(
  239. lpPathName: LPCWSTR,
  240. lpSecurityAttributes: LPSECURITY_ATTRIBUTES,
  241. ) -> BOOL ---
  242. DeleteFileW :: proc(lpPathName: LPCWSTR) -> BOOL ---
  243. GetCurrentDirectoryW :: proc(nBufferLength: DWORD, lpBuffer: LPWSTR) -> DWORD ---
  244. SetCurrentDirectoryW :: proc(lpPathName: LPCWSTR) -> BOOL ---
  245. WideCharToMultiByte :: proc(
  246. CodePage: UINT,
  247. dwFlags: DWORD,
  248. lpWideCharStr: LPCWSTR,
  249. cchWideChar: c_int,
  250. lpMultiByteStr: LPSTR,
  251. cbMultiByte: c_int,
  252. lpDefaultChar: LPCSTR,
  253. lpUsedDefaultChar: LPBOOL,
  254. ) -> c_int ---
  255. MultiByteToWideChar :: proc(
  256. CodePage: UINT,
  257. dwFlags: DWORD,
  258. lpMultiByteStr: LPSTR,
  259. cbMultiByte: c_int,
  260. lpWideCharStr: LPWSTR,
  261. cchWideChar: c_int,
  262. ) -> c_int ---
  263. DuplicateHandle :: proc(
  264. hSourceProcessHandle: HANDLE,
  265. hSourceHandle: HANDLE,
  266. hTargetProcessHandle: HANDLE,
  267. lpTargetHandle: LPHANDLE,
  268. dwDesiredAccess: DWORD,
  269. bInheritHandle: BOOL,
  270. dwOptions: DWORD,
  271. ) -> BOOL ---
  272. ReadFile :: proc(
  273. hFile: HANDLE,
  274. lpBuffer: LPVOID,
  275. nNumberOfBytesToRead: DWORD,
  276. lpNumberOfBytesRead: LPDWORD,
  277. lpOverlapped: LPOVERLAPPED,
  278. ) -> BOOL ---
  279. WriteFile :: proc(
  280. hFile: HANDLE,
  281. lpBuffer: LPVOID,
  282. nNumberOfBytesToWrite: DWORD,
  283. lpNumberOfBytesWritten: LPDWORD,
  284. lpOverlapped: LPOVERLAPPED,
  285. ) -> BOOL ---
  286. CloseHandle :: proc(hObject: HANDLE) -> BOOL ---
  287. MoveFileExW :: proc(lpExistingFileName: LPCWSTR, lpNewFileName: LPCWSTR, dwFlags: DWORD) -> BOOL ---
  288. SetFilePointerEx :: proc(
  289. hFile: HANDLE,
  290. liDistanceToMove: LARGE_INTEGER,
  291. lpNewFilePointer: PLARGE_INTEGER,
  292. dwMoveMethod: DWORD,
  293. ) -> BOOL ---
  294. FlushFileBuffers :: proc(hFile: HANDLE) -> BOOL ---
  295. CreateFileW :: proc(
  296. lpFileName: LPCWSTR,
  297. dwDesiredAccess: DWORD,
  298. dwShareMode: DWORD,
  299. lpSecurityAttributes: LPSECURITY_ATTRIBUTES,
  300. dwCreationDisposition: DWORD,
  301. dwFlagsAndAttributes: DWORD,
  302. hTemplateFile: HANDLE,
  303. ) -> HANDLE ---
  304. GetFileTime :: proc(
  305. hFile: HANDLE,
  306. lpCreationTime: LPFILETIME,
  307. lpLastAccessTime: LPFILETIME,
  308. lpLastWriteTime: LPFILETIME,
  309. ) -> BOOL ---
  310. CompareFileTime :: proc(lpFileTime1: LPFILETIME, lpFileTime2: LPFILETIME) -> LONG ---
  311. FindFirstFileW :: proc(fileName: LPCWSTR, findFileData: LPWIN32_FIND_DATAW) -> HANDLE ---
  312. FindNextFileW :: proc(findFile: HANDLE, findFileData: LPWIN32_FIND_DATAW) -> BOOL ---
  313. FindClose :: proc(findFile: HANDLE) -> BOOL ---
  314. GetModuleHandleW :: proc(lpModuleName: LPCWSTR) -> HMODULE ---
  315. GetModuleHandleA :: proc(lpModuleName: LPCSTR) -> HMODULE ---
  316. GetSystemTimeAsFileTime :: proc(lpSystemTimeAsFileTime: LPFILETIME) ---
  317. GetSystemTimePreciseAsFileTime :: proc(lpSystemTimeAsFileTime: LPFILETIME) ---
  318. FileTimeToSystemTime :: proc(lpFileTime: ^FILETIME, lpSystemTime: ^SYSTEMTIME) -> BOOL ---
  319. SystemTimeToTzSpecificLocalTime :: proc(
  320. lpTimeZoneInformation: ^TIME_ZONE_INFORMATION,
  321. lpUniversalTime: ^SYSTEMTIME,
  322. lpLocalTime: ^SYSTEMTIME,
  323. ) -> BOOL ---
  324. SystemTimeToFileTime :: proc(
  325. lpSystemTime: ^SYSTEMTIME,
  326. lpFileTime: LPFILETIME,
  327. ) -> BOOL ---
  328. CreateEventW :: proc(
  329. lpEventAttributes: LPSECURITY_ATTRIBUTES,
  330. bManualReset: BOOL,
  331. bInitialState: BOOL,
  332. lpName: LPCWSTR,
  333. ) -> HANDLE ---
  334. ResetEvent :: proc(hEvent: HANDLE) -> BOOL ---
  335. SetEvent :: proc(hEvent: HANDLE) -> BOOL ---
  336. WaitForMultipleObjects :: proc(
  337. nCount: DWORD,
  338. lpHandles: ^HANDLE,
  339. bWaitAll: BOOL,
  340. dwMilliseconds: DWORD,
  341. ) -> DWORD ---
  342. WaitForMultipleObjectsEx :: proc(
  343. nCount: DWORD,
  344. lpHandles: ^HANDLE,
  345. bWaitAll: BOOL,
  346. dwMilliseconds: DWORD,
  347. bAlterable: BOOL,
  348. ) -> DWORD ---
  349. CreateNamedPipeW :: proc(
  350. lpName: LPCWSTR,
  351. dwOpenMode: DWORD,
  352. dwPipeMode: DWORD,
  353. nMaxInstances: DWORD,
  354. nOutBufferSize: DWORD,
  355. nInBufferSize: DWORD,
  356. nDefaultTimeOut: DWORD,
  357. lpSecurityAttributes: LPSECURITY_ATTRIBUTES,
  358. ) -> HANDLE ---
  359. PeekNamedPipe :: proc(
  360. hNamedPipe: HANDLE,
  361. lpBuffer: rawptr,
  362. nBufferSize: u32,
  363. lpBytesRead: ^u32,
  364. lpTotalBytesAvail: ^u32,
  365. lpBytesLeftThisMessage: ^u32,
  366. ) -> BOOL ---
  367. CancelIo :: proc(handle: HANDLE) -> BOOL ---
  368. GetOverlappedResult :: proc(
  369. hFile: HANDLE,
  370. lpOverlapped: LPOVERLAPPED,
  371. lpNumberOfBytesTransferred: LPDWORD,
  372. bWait: BOOL,
  373. ) -> BOOL ---
  374. GetProcessHeap :: proc() -> HANDLE ---
  375. HeapAlloc :: proc(hHeap: HANDLE, dwFlags: DWORD, dwBytes: SIZE_T) -> LPVOID ---
  376. HeapReAlloc :: proc(hHeap: HANDLE, dwFlags: DWORD, lpMem: LPVOID, dwBytes: SIZE_T) -> LPVOID ---
  377. HeapFree :: proc(hHeap: HANDLE, dwFlags: DWORD, lpMem: LPVOID) -> BOOL ---
  378. LocalAlloc :: proc(flags: UINT, bytes: SIZE_T) -> LPVOID ---
  379. LocalReAlloc :: proc(mem: LPVOID, bytes: SIZE_T, flags: UINT) -> LPVOID ---
  380. LocalFree :: proc(mem: LPVOID) -> LPVOID ---
  381. GlobalAlloc :: proc(flags: UINT, bytes: SIZE_T) -> LPVOID ---
  382. GlobalReAlloc :: proc(mem: LPVOID, bytes: SIZE_T, flags: UINT) -> LPVOID ---
  383. GlobalFree :: proc(mem: LPVOID) -> LPVOID ---
  384. GlobalLock :: proc(hMem: HGLOBAL) -> LPVOID ---
  385. GlobalUnlock :: proc(hMem: HGLOBAL) -> BOOL ---
  386. ReadDirectoryChangesW :: proc(
  387. hDirectory: HANDLE,
  388. lpBuffer: LPVOID,
  389. nBufferLength: DWORD,
  390. bWatchSubtree: BOOL,
  391. dwNotifyFilter: DWORD,
  392. lpBytesReturned: LPDWORD,
  393. lpOverlapped: LPOVERLAPPED,
  394. lpCompletionRoutine: LPOVERLAPPED_COMPLETION_ROUTINE,
  395. ) -> BOOL ---
  396. FindFirstChangeNotificationW :: proc(
  397. lpPathName: LPWSTR,
  398. bWatchSubtree: BOOL,
  399. dwNotifyFilter: DWORD,
  400. ) -> HANDLE ---
  401. FindNextChangeNotification :: proc(hChangeHandle: HANDLE) -> BOOL ---
  402. FindCloseChangeNotification :: proc(hChangeHandle: HANDLE) -> BOOL ---
  403. InitializeSRWLock :: proc(SRWLock: ^SRWLOCK) ---
  404. AcquireSRWLockExclusive :: proc(SRWLock: ^SRWLOCK) ---
  405. TryAcquireSRWLockExclusive :: proc(SRWLock: ^SRWLOCK) -> BOOLEAN ---
  406. ReleaseSRWLockExclusive :: proc(SRWLock: ^SRWLOCK) ---
  407. AcquireSRWLockShared :: proc(SRWLock: ^SRWLOCK) ---
  408. TryAcquireSRWLockShared :: proc(SRWLock: ^SRWLOCK) -> BOOLEAN ---
  409. ReleaseSRWLockShared :: proc(SRWLock: ^SRWLOCK) ---
  410. InitializeConditionVariable :: proc(ConditionVariable: ^CONDITION_VARIABLE) ---
  411. WakeConditionVariable :: proc(ConditionVariable: ^CONDITION_VARIABLE) ---
  412. WakeAllConditionVariable :: proc(ConditionVariable: ^CONDITION_VARIABLE) ---
  413. SleepConditionVariableCS :: proc(ConditionVariable: ^CONDITION_VARIABLE, CriticalSection: ^CRITICAL_SECTION, dwMilliseconds: DWORD) -> BOOL ---
  414. SleepConditionVariableSRW :: proc(ConditionVariable: ^CONDITION_VARIABLE, SRWLock: ^SRWLOCK, dwMilliseconds: DWORD, Flags: LONG) -> BOOL ---
  415. GetFileType :: proc(file_handle: HANDLE) -> DWORD ---
  416. SetFilePointer :: proc(file_handle: HANDLE, distance_to_move: LONG, distance_to_move_high: ^LONG, move_method: DWORD) -> DWORD ---
  417. GetFileSizeEx :: proc(file_handle: HANDLE, file_size: ^LARGE_INTEGER) -> BOOL ---
  418. GetFileAttributesW :: proc(lpFileName: LPCWSTR) -> DWORD ---
  419. GetFileAttributesExW :: proc(lpFileName: LPCWSTR, fInfoLevelId: GET_FILEEX_INFO_LEVELS, lpFileInformation: LPVOID) -> BOOL ---
  420. GetSystemInfo :: proc(system_info: ^SYSTEM_INFO) ---
  421. GetVersionExW :: proc(osvi: ^OSVERSIONINFOEXW) ---
  422. GetSystemDirectoryW :: proc(lpBuffer: LPWSTR, uSize: UINT) -> UINT ---
  423. GetWindowsDirectoryW :: proc(lpBuffer: LPWSTR, uSize: UINT) -> UINT ---
  424. GetSystemDefaultLangID :: proc() -> LANGID ---
  425. GetSystemDefaultLCID :: proc() -> LCID ---
  426. GetSystemDefaultLocaleName :: proc(lpLocaleName: LPWSTR, cchLocaleName: INT) -> INT ---
  427. LCIDToLocaleName :: proc(Locale: LCID, lpName: LPWSTR, cchName: INT, dwFlags: DWORD) -> INT ---
  428. LocaleNameToLCID :: proc(lpName: LPCWSTR, dwFlags: DWORD) -> LCID ---
  429. SetDllDirectoryW :: proc(lpPathName: LPCWSTR) -> BOOL ---
  430. AddDllDirectory :: proc(NewDirectory: PCWSTR) -> rawptr ---
  431. RemoveDllDirectory :: proc(Cookie: rawptr) -> BOOL ---
  432. LoadLibraryW :: proc(c_str: LPCWSTR) -> HMODULE ---
  433. LoadLibraryExW :: proc(c_str: LPCWSTR, hFile: HANDLE, dwFlags: LoadLibraryEx_Flags) -> HMODULE ---
  434. FreeLibrary :: proc(h: HMODULE) -> BOOL ---
  435. GetProcAddress :: proc(h: HMODULE, c_str: LPCSTR) -> rawptr ---
  436. LoadResource :: proc(hModule: HMODULE, hResInfo: HRSRC) -> HGLOBAL ---
  437. FreeResource :: proc(hResData: HGLOBAL) -> BOOL ---
  438. LockResource :: proc(hResData: HGLOBAL) -> LPVOID ---
  439. SizeofResource :: proc(hModule: HMODULE, hResInfo: HRSRC) -> DWORD ---
  440. FindResourceW :: proc(hModule: HMODULE, lpName: LPCWSTR, lpType: LPCWSTR) -> HRSRC ---
  441. FindResourceExW :: proc(hModule: HMODULE, lpType: LPCWSTR, lpName: LPCWSTR, wLanguage: LANGID) -> HRSRC ---
  442. EnumResourceNamesW :: proc(hModule: HMODULE, lpType: LPCWSTR, lpEnumFunc: ENUMRESNAMEPROCW, lParam: LONG_PTR) -> BOOL ---
  443. EnumResourceNamesExW :: proc(hModule: HMODULE, lpType: LPCWSTR, lpEnumFunc: ENUMRESNAMEPROCW, lParam: LONG_PTR, dwFlags: DWORD, LangId: LANGID) -> BOOL ---
  444. EnumResourceTypesExW :: proc(hModule: HMODULE, lpEnumFunc: ENUMRESTYPEPROCW, lParam: LONG_PTR, dwFlags: DWORD, LangId: LANGID) -> BOOL ---
  445. EnumResourceLanguagesExW :: proc(hModule: HMODULE, lpType: LPCWSTR, lpName: LPCWSTR, lpEnumFunc: ENUMRESLANGPROCW, lParam: LONG_PTR, dwFlags: DWORD, LangId: LANGID) -> BOOL ---
  446. LookupIconIdFromDirectory :: proc(presbits: PBYTE, fIcon: BOOL) -> INT ---
  447. LookupIconIdFromDirectoryEx :: proc(presbits: PBYTE, fIcon: BOOL, cxDesired: INT, cyDesired: INT, Flags: UINT) -> INT ---
  448. CreateIconFromResourceEx :: proc(presbits: PBYTE, dwResSize: DWORD, fIcon: BOOL, dwVer: DWORD, cxDesired: INT, cyDesired: INT, Flags: UINT) -> HICON ---
  449. GetFullPathNameW :: proc(filename: LPCWSTR, buffer_length: DWORD, buffer: LPCWSTR, file_part: ^LPCWSTR) -> DWORD ---
  450. GetLongPathNameW :: proc(short, long: LPCWSTR, len: DWORD) -> DWORD ---
  451. GetShortPathNameW :: proc(long, short: LPCWSTR, len: DWORD) -> DWORD ---
  452. GetFinalPathNameByHandleW :: proc(hFile: HANDLE, lpszFilePath: LPCWSTR, cchFilePath: DWORD, dwFlags: DWORD) -> DWORD ---
  453. SetEndOfFile :: proc(hFile: HANDLE) -> BOOL ---
  454. CreatePipe :: proc(hReadPipe, hWritePipe: ^HANDLE, lpPipeAttributes: LPSECURITY_ATTRIBUTES, nSize: DWORD) -> BOOL ---
  455. ConnectNamedPipe :: proc(hNamedPipe: HANDLE, lpOverlapped: LPOVERLAPPED) -> BOOL ---
  456. DisconnectNamedPipe :: proc(hNamedPipe: HANDLE) -> BOOL ---
  457. WaitNamedPipeW :: proc(lpNamedPipeName: LPCWSTR, nTimeOut: DWORD) -> BOOL ---
  458. AllocConsole :: proc() -> BOOL ---
  459. AttachConsole :: proc(dwProcessId: DWORD) -> BOOL ---
  460. SetConsoleCtrlHandler :: proc(HandlerRoutine: PHANDLER_ROUTINE, Add: BOOL) -> BOOL ---
  461. GenerateConsoleCtrlEvent :: proc(dwCtrlEvent: DWORD, dwProcessGroupId: DWORD) -> BOOL ---
  462. FreeConsole :: proc() -> BOOL ---
  463. GetConsoleWindow :: proc() -> HWND ---
  464. GetConsoleScreenBufferInfo :: proc(hConsoleOutput: HANDLE, lpConsoleScreenBufferInfo: PCONSOLE_SCREEN_BUFFER_INFO) -> BOOL ---
  465. SetConsoleScreenBufferSize :: proc(hConsoleOutput: HANDLE, dwSize: COORD) -> BOOL ---
  466. SetConsoleWindowInfo :: proc(hConsoleOutput: HANDLE, bAbsolute: BOOL, lpConsoleWindow: ^SMALL_RECT) -> BOOL ---
  467. GetConsoleCursorInfo :: proc(hConsoleOutput: HANDLE, lpConsoleCursorInfo: PCONSOLE_CURSOR_INFO) -> BOOL ---
  468. SetConsoleCursorInfo :: proc(hConsoleOutput: HANDLE, lpConsoleCursorInfo: PCONSOLE_CURSOR_INFO) -> BOOL ---
  469. GetDiskFreeSpaceExW :: proc(
  470. lpDirectoryName: LPCWSTR,
  471. lpFreeBytesAvailableToCaller: PULARGE_INTEGER,
  472. lpTotalNumberOfBytes: PULARGE_INTEGER,
  473. lpTotalNumberOfFreeBytes: PULARGE_INTEGER,
  474. ) -> BOOL ---
  475. GetLogicalProcessorInformation :: proc(buffer: ^SYSTEM_LOGICAL_PROCESSOR_INFORMATION, returnedLength: PDWORD) -> BOOL ---
  476. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setfilecompletionnotificationmodes)
  477. SetFileCompletionNotificationModes :: proc(FileHandle: HANDLE, Flags: u8) -> BOOL ---
  478. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ioapiset/nf-ioapiset-createiocompletionport)
  479. CreateIoCompletionPort :: proc(FileHandle: HANDLE, ExistingCompletionPort: HANDLE, CompletionKey: ULONG_PTR, NumberOfConcurrentThreads: DWORD) -> HANDLE ---
  480. //[MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ioapiset/nf-ioapiset-getqueuedcompletionstatus)
  481. GetQueuedCompletionStatus :: proc(CompletionPort: HANDLE, lpNumberOfBytesTransferred: ^DWORD, lpCompletionKey: PULONG_PTR, lpOverlapped: ^^OVERLAPPED, dwMilliseconds: DWORD) -> BOOL ---
  482. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ioapiset/nf-ioapiset-getqueuedcompletionstatusex)
  483. GetQueuedCompletionStatusEx :: proc(CompletionPort: HANDLE, lpCompletionPortEntries: ^OVERLAPPED_ENTRY, ulCount: c_ulong, ulNumEntriesRemoved: ^c_ulong, dwMilliseconds: DWORD, fAlertable: BOOL) -> BOOL ---
  484. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ioapiset/nf-ioapiset-postqueuedcompletionstatus)
  485. PostQueuedCompletionStatus :: proc(CompletionPort: HANDLE, dwNumberOfBytesTransferred: DWORD, dwCompletionKey: c_ulong, lpOverlapped: ^OVERLAPPED) -> BOOL ---
  486. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-gethandleinformation)
  487. GetHandleInformation :: proc(hObject: HANDLE, lpdwFlags: ^DWORD) -> BOOL ---
  488. RtlCaptureStackBackTrace :: proc(FramesToSkip: ULONG, FramesToCapture: ULONG, BackTrace: [^]PVOID, BackTraceHash: PULONG) -> USHORT ---
  489. GetSystemPowerStatus :: proc(lpSystemPowerStatus: ^SYSTEM_POWER_STATUS) -> BOOL ---
  490. }
  491. DEBUG_PROCESS :: 0x00000001
  492. DEBUG_ONLY_THIS_PROCESS :: 0x00000002
  493. CREATE_SUSPENDED :: 0x00000004
  494. DETACHED_PROCESS :: 0x00000008
  495. CREATE_NEW_CONSOLE :: 0x00000010
  496. NORMAL_PRIORITY_CLASS :: 0x00000020
  497. IDLE_PRIORITY_CLASS :: 0x00000040
  498. HIGH_PRIORITY_CLASS :: 0x00000080
  499. REALTIME_PRIORITY_CLASS :: 0x00000100
  500. CREATE_NEW_PROCESS_GROUP :: 0x00000200
  501. CREATE_UNICODE_ENVIRONMENT :: 0x00000400
  502. CREATE_SEPARATE_WOW_VDM :: 0x00000800
  503. CREATE_SHARED_WOW_VDM :: 0x00001000
  504. CREATE_FORCEDOS :: 0x00002000
  505. BELOW_NORMAL_PRIORITY_CLASS :: 0x00004000
  506. ABOVE_NORMAL_PRIORITY_CLASS :: 0x00008000
  507. INHERIT_PARENT_AFFINITY :: 0x00010000
  508. INHERIT_CALLER_PRIORITY :: 0x00020000 // Deprecated
  509. CREATE_PROTECTED_PROCESS :: 0x00040000
  510. EXTENDED_STARTUPINFO_PRESENT :: 0x00080000
  511. PROCESS_MODE_BACKGROUND_BEGIN :: 0x00100000
  512. PROCESS_MODE_BACKGROUND_END :: 0x00200000
  513. CREATE_SECURE_PROCESS :: 0x00400000
  514. CREATE_BREAKAWAY_FROM_JOB :: 0x01000000
  515. CREATE_PRESERVE_CODE_AUTHZ_LEVEL :: 0x02000000
  516. CREATE_DEFAULT_ERROR_MODE :: 0x04000000
  517. CREATE_NO_WINDOW :: 0x08000000
  518. PROFILE_USER :: 0x10000000
  519. PROFILE_KERNEL :: 0x20000000
  520. PROFILE_SERVER :: 0x40000000
  521. CREATE_IGNORE_SYSTEM_DEFAULT :: 0x80000000
  522. THREAD_BASE_PRIORITY_LOWRT :: 15 // value that gets a thread to LowRealtime-1
  523. THREAD_BASE_PRIORITY_MAX :: 2 // maximum thread base priority boost
  524. THREAD_BASE_PRIORITY_MIN :: (-2) // minimum thread base priority boost
  525. THREAD_BASE_PRIORITY_IDLE :: (-15) // value that gets a thread to idle
  526. THREAD_PRIORITY_LOWEST :: THREAD_BASE_PRIORITY_MIN
  527. THREAD_PRIORITY_BELOW_NORMAL :: (THREAD_PRIORITY_LOWEST+1)
  528. THREAD_PRIORITY_NORMAL :: 0
  529. THREAD_PRIORITY_HIGHEST :: THREAD_BASE_PRIORITY_MAX
  530. THREAD_PRIORITY_ABOVE_NORMAL :: (THREAD_PRIORITY_HIGHEST-1)
  531. THREAD_PRIORITY_ERROR_RETURN :: (MAXLONG)
  532. THREAD_PRIORITY_TIME_CRITICAL :: THREAD_BASE_PRIORITY_LOWRT
  533. THREAD_PRIORITY_IDLE :: THREAD_BASE_PRIORITY_IDLE
  534. THREAD_MODE_BACKGROUND_BEGIN :: 0x00010000
  535. THREAD_MODE_BACKGROUND_END :: 0x00020000
  536. PROCESS_ALL_ACCESS :: 0x000F0000 | SYNCHRONIZE | 0xFFFF
  537. PROCESS_CREATE_PROCESS :: 0x0080
  538. PROCESS_CREATE_THREAD :: 0x0002
  539. PROCESS_DUP_HANDLE :: 0x0040
  540. PROCESS_QUERY_INFORMATION :: 0x0400
  541. PROCESS_QUERY_LIMITED_INFORMATION :: 0x1000
  542. PROCESS_SET_INFORMATION :: 0x0200
  543. PROCESS_SET_QUOTA :: 0x0100
  544. PROCESS_SUSPEND_RESUME :: 0x0800
  545. PROCESS_TERMINATE :: 0x0001
  546. PROCESS_VM_OPERATION :: 0x0008
  547. PROCESS_VM_READ :: 0x0010
  548. PROCESS_VM_WRITE :: 0x0020
  549. THREAD_ALL_ACCESS :: \
  550. THREAD_DIRECT_IMPERSONATION |
  551. THREAD_GET_CONTEXT |
  552. THREAD_IMPERSONATE |
  553. THREAD_QUERY_INFORMATION |
  554. THREAD_QUERY_LIMITED_INFORMATION |
  555. THREAD_SET_CONTEXT |
  556. THREAD_SET_INFORMATION |
  557. THREAD_SET_LIMITED_INFORMATION |
  558. THREAD_SET_THREAD_TOKEN |
  559. THREAD_SUSPEND_RESUME |
  560. THREAD_TERMINATE |
  561. SYNCHRONIZE
  562. THREAD_DIRECT_IMPERSONATION :: 0x0200
  563. THREAD_GET_CONTEXT :: 0x0008
  564. THREAD_IMPERSONATE :: 0x0100
  565. THREAD_QUERY_INFORMATION :: 0x0040
  566. THREAD_QUERY_LIMITED_INFORMATION :: 0x0800
  567. THREAD_SET_CONTEXT :: 0x0010
  568. THREAD_SET_INFORMATION :: 0x0020
  569. THREAD_SET_LIMITED_INFORMATION :: 0x0400
  570. THREAD_SET_THREAD_TOKEN :: 0x0080
  571. THREAD_SUSPEND_RESUME :: 0x0002
  572. THREAD_TERMINATE :: 0x0001
  573. COPY_FILE_FAIL_IF_EXISTS :: 0x00000001
  574. COPY_FILE_RESTARTABLE :: 0x00000002
  575. COPY_FILE_OPEN_SOURCE_FOR_WRITE :: 0x00000004
  576. COPY_FILE_ALLOW_DECRYPTED_DESTINATION :: 0x00000008
  577. COPY_FILE_COPY_SYMLINK :: 0x00000800
  578. COPY_FILE_NO_BUFFERING :: 0x00001000
  579. COPY_FILE_REQUEST_SECURITY_PRIVILEGES :: 0x00002000
  580. COPY_FILE_RESUME_FROM_PAUSE :: 0x00004000
  581. COPY_FILE_NO_OFFLOAD :: 0x00040000
  582. COPY_FILE_IGNORE_EDP_BLOCK :: 0x00400000
  583. COPY_FILE_IGNORE_SOURCE_ENCRYPTION :: 0x00800000
  584. COPY_FILE_DONT_REQUEST_DEST_WRITE_DAC :: 0x02000000
  585. COPY_FILE_REQUEST_COMPRESSED_TRAFFIC :: 0x10000000
  586. COPY_FILE_OPEN_AND_COPY_REPARSE_POINT :: 0x00200000
  587. COPY_FILE_DIRECTORY :: 0x00000080
  588. COPY_FILE_SKIP_ALTERNATE_STREAMS :: 0x00008000
  589. COPY_FILE_DISABLE_PRE_ALLOCATION :: 0x04000000
  590. COPY_FILE_ENABLE_LOW_FREE_SPACE_MODE :: 0x08000000
  591. SECTION_QUERY :: DWORD(0x0001)
  592. SECTION_MAP_WRITE :: DWORD(0x0002)
  593. SECTION_MAP_READ :: DWORD(0x0004)
  594. SECTION_MAP_EXECUTE :: DWORD(0x0008)
  595. SECTION_EXTEND_SIZE :: DWORD(0x0010)
  596. SECTION_ALL_ACCESS :: STANDARD_RIGHTS_REQUIRED | SECTION_QUERY | SECTION_MAP_WRITE | SECTION_MAP_READ | SECTION_MAP_EXECUTE | SECTION_EXTEND_SIZE
  597. SECTION_MAP_EXECUTE_EXPLICIT :: DWORD(0x0020)
  598. FILE_MAP_WRITE :: SECTION_MAP_WRITE
  599. FILE_MAP_READ :: SECTION_MAP_READ
  600. FILE_MAP_ALL_ACCESS :: SECTION_ALL_ACCESS
  601. FILE_MAP_EXECUTE :: SECTION_MAP_EXECUTE_EXPLICIT
  602. FILE_MAP_COPY :: DWORD(0x00000001)
  603. FILE_MAP_RESERVE :: DWORD(0x80000000)
  604. FILE_MAP_TARGETS_INVALID :: DWORD(0x40000000)
  605. FILE_MAP_LARGE_PAGES :: DWORD(0x20000000)
  606. // Flags for `SetFileCompletionNotificationModes`.
  607. FILE_SKIP_COMPLETION_PORT_ON_SUCCESS :: 0x1
  608. FILE_SKIP_SET_EVENT_ON_HANDLE :: 0x2
  609. PAGE_NOACCESS :: 0x01
  610. PAGE_READONLY :: 0x02
  611. PAGE_READWRITE :: 0x04
  612. PAGE_WRITECOPY :: 0x08
  613. PAGE_EXECUTE :: 0x10
  614. PAGE_EXECUTE_READ :: 0x20
  615. PAGE_EXECUTE_READWRITE :: 0x40
  616. PAGE_EXECUTE_WRITECOPY :: 0x80
  617. PAGE_GUARD :: 0x100
  618. PAGE_NOCACHE :: 0x200
  619. PAGE_WRITECOMBINE :: 0x400
  620. MEMORY_BASIC_INFORMATION :: struct {
  621. BaseAddress: PVOID,
  622. AllocationBase: PVOID,
  623. AllocationProtect: DWORD,
  624. PartitionId: WORD,
  625. RegionSize: SIZE_T,
  626. State: DWORD,
  627. Protect: DWORD,
  628. Type: DWORD,
  629. }
  630. PMEMORY_BASIC_INFORMATION :: ^MEMORY_BASIC_INFORMATION
  631. LPMEMORY_BASIC_INFORMATION :: ^MEMORY_BASIC_INFORMATION
  632. MEM_COMMIT :: 0x1000
  633. MEM_RESERVE :: 0x2000
  634. MEM_DECOMMIT :: 0x4000
  635. MEM_RELEASE :: 0x8000
  636. MEM_FREE :: 0x10000
  637. MEM_PRIVATE :: 0x20000
  638. MEM_MAPPED :: 0x40000
  639. MEM_RESET :: 0x80000
  640. MEM_TOP_DOWN :: 0x100000
  641. MEM_LARGE_PAGES :: 0x20000000
  642. MEM_4MB_PAGES :: 0x80000000
  643. @(default_calling_convention="system")
  644. foreign kernel32 {
  645. VirtualAlloc :: proc(
  646. lpAddress: LPVOID,
  647. dwSize: SIZE_T,
  648. flAllocationType: DWORD,
  649. flProtect: DWORD,
  650. ) -> LPVOID ---
  651. VirtualProtect :: proc(
  652. lpAddress: LPVOID,
  653. dwSize: SIZE_T,
  654. flNewProtect: DWORD,
  655. lpflOldProtect: PDWORD,
  656. ) -> BOOL ---
  657. VirtualFree :: proc(
  658. lpAddress: LPVOID,
  659. dwSize: SIZE_T,
  660. dwFreeType: DWORD,
  661. ) -> BOOL ---
  662. VirtualQuery :: proc(
  663. lpAddress: LPCVOID,
  664. lpBuffer: PMEMORY_BASIC_INFORMATION,
  665. dwLength: SIZE_T,
  666. ) -> SIZE_T ---
  667. VirtualAllocEx :: proc(
  668. hProcess: HANDLE,
  669. lpAddress: LPVOID,
  670. dwSize: SIZE_T,
  671. flAllocationType: DWORD,
  672. flProtect: DWORD,
  673. ) -> LPVOID ---
  674. VirtualFreeEx :: proc(
  675. hProcess: HANDLE,
  676. lpAddress: LPVOID,
  677. dwSize: SIZE_T,
  678. dwFreeType: DWORD,
  679. ) -> BOOL ---
  680. VirtualProtectEx :: proc(
  681. hProcess: HANDLE,
  682. lpAddress: LPVOID,
  683. dwSize: SIZE_T,
  684. flNewProtect: DWORD,
  685. lpflOldProtect: PDWORD,
  686. ) -> BOOL ---
  687. VirtualQueryEx :: proc(
  688. hProcess: HANDLE,
  689. lpAddress: LPCVOID,
  690. lpBuffer: PMEMORY_BASIC_INFORMATION,
  691. dwLength: SIZE_T,
  692. ) -> SIZE_T ---
  693. ReadProcessMemory :: proc(
  694. hProcess: HANDLE,
  695. lpBaseAddress: LPCVOID,
  696. lpBuffer: LPVOID,
  697. nSize: SIZE_T,
  698. lpNumberOfBytesRead: ^SIZE_T,
  699. ) -> BOOL ---
  700. WriteProcessMemory :: proc(
  701. hProcess: HANDLE,
  702. lpBaseAddress: LPVOID,
  703. lpBuffer: LPCVOID,
  704. nSize: SIZE_T,
  705. lpNumberOfBytesWritten: ^SIZE_T,
  706. ) -> BOOL ---
  707. CreateFileMappingW :: proc(
  708. hFile: HANDLE,
  709. lpFileMappingAttributes: LPSECURITY_ATTRIBUTES,
  710. flProtect: DWORD,
  711. dwMaximumSizeHigh: DWORD,
  712. dwMaximumSizeLow: DWORD,
  713. lpName: LPCWSTR,
  714. ) -> HANDLE ---
  715. OpenFileMappingW :: proc(
  716. dwDesiredAccess: DWORD,
  717. bInheritHandle: BOOL,
  718. lpName: LPCWSTR,
  719. ) -> HANDLE ---
  720. MapViewOfFile :: proc(
  721. hFileMappingObject: HANDLE,
  722. dwDesiredAccess: DWORD,
  723. dwFileOffsetHigh: DWORD,
  724. dwFileOffsetLow: DWORD,
  725. dwNumberOfBytesToMap: SIZE_T,
  726. ) -> LPVOID ---
  727. MapViewOfFileEx :: proc(
  728. hFileMappingObject: HANDLE,
  729. dwDesiredAccess: DWORD,
  730. dwFileOffsetHigh: DWORD,
  731. dwFileOffsetLow: DWORD,
  732. dwNumberOfBytesToMap: SIZE_T,
  733. lpBaseAddress: LPVOID,
  734. ) -> LPVOID ---
  735. FlushViewOfFile :: proc(
  736. lpBaseAddress: LPCVOID,
  737. dwNumberOfBytesToFlush: SIZE_T,
  738. ) -> BOOL ---
  739. UnmapViewOfFile :: proc(
  740. lpBaseAddress: LPCVOID,
  741. ) -> BOOL ---
  742. GetLargePageMinimum :: proc() -> SIZE_T ---
  743. GetProcessWorkingSetSizeEx :: proc(
  744. hProcess: HANDLE,
  745. lpMinimumWorkingSetSize: PSIZE_T,
  746. lpMaximumWorkingSetSize: PSIZE_T,
  747. Flags: PDWORD,
  748. ) -> BOOL ---
  749. SetProcessWorkingSetSizeEx :: proc(
  750. hProcess: HANDLE,
  751. dwMinimumWorkingSetSize: SIZE_T,
  752. dwMaximumWorkingSetSize: SIZE_T,
  753. Flags: DWORD,
  754. ) -> BOOL ---
  755. VirtualLock :: proc(
  756. lpAddress: LPVOID,
  757. dwSize: SIZE_T,
  758. ) -> BOOL ---
  759. VirtualUnlock :: proc(
  760. lpAddress: LPVOID,
  761. dwSize: SIZE_T,
  762. ) -> BOOL ---
  763. GetWriteWatch :: proc(
  764. dwFlags: DWORD,
  765. lpBaseAddress: PVOID,
  766. dwRegionSize: SIZE_T,
  767. lpAddresses: ^PVOID,
  768. lpdwCount: ^ULONG_PTR,
  769. lpdwGranularity: LPDWORD,
  770. ) -> UINT ---
  771. ResetWriteWatch :: proc(
  772. lpBaseAddress: LPVOID,
  773. dwRegionSize: SIZE_T,
  774. ) -> UINT ---
  775. }
  776. MEMORY_RESOURCE_NOTIFICATION_TYPE :: enum c_int {
  777. LowMemoryResourceNotification,
  778. HighMemoryResourceNotification,
  779. }
  780. LowMemoryResourceNotification :: MEMORY_RESOURCE_NOTIFICATION_TYPE.LowMemoryResourceNotification
  781. HighMemoryResourceNotification :: MEMORY_RESOURCE_NOTIFICATION_TYPE.HighMemoryResourceNotification
  782. @(default_calling_convention="system")
  783. foreign kernel32 {
  784. CreateMemoryResourceNotification :: proc(
  785. NotificationType: MEMORY_RESOURCE_NOTIFICATION_TYPE,
  786. ) -> HANDLE ---
  787. QueryMemoryResourceNotification :: proc(
  788. ResourceNotificationHandle: HANDLE,
  789. ResourceState: PBOOL,
  790. ) -> BOOL ---
  791. }
  792. FILE_CACHE_MAX_HARD_ENABLE :: DWORD(0x00000001)
  793. FILE_CACHE_MAX_HARD_DISABLE :: DWORD(0x00000002)
  794. FILE_CACHE_MIN_HARD_ENABLE :: DWORD(0x00000004)
  795. FILE_CACHE_MIN_HARD_DISABLE :: DWORD(0x00000008)
  796. @(default_calling_convention="system")
  797. foreign kernel32 {
  798. GetSystemFileCacheSize :: proc(
  799. lpMinimumFileCacheSize: PSIZE_T,
  800. lpMaximumFileCacheSize: PSIZE_T,
  801. lpFlags: PDWORD,
  802. ) -> BOOL ---
  803. SetSystemFileCacheSize :: proc(
  804. MinimumFileCacheSize: SIZE_T,
  805. MaximumFileCacheSize: SIZE_T,
  806. Flags: DWORD,
  807. ) -> BOOL ---
  808. CreateFileMappingNumaW :: proc(
  809. hFile: HANDLE,
  810. lpFileMappingAttributes: LPSECURITY_ATTRIBUTES,
  811. flProtect: DWORD,
  812. dwMaximumSizeHigh: DWORD,
  813. dwMaximumSizeLow: DWORD,
  814. lpName: LPCWSTR,
  815. nndPreferred: DWORD,
  816. ) -> HANDLE ---
  817. }
  818. WIN32_MEMORY_RANGE_ENTRY :: struct {
  819. VirtualAddress: PVOID,
  820. NumberOfBytes: SIZE_T,
  821. }
  822. PWIN32_MEMORY_RANGE_ENTRY :: ^WIN32_MEMORY_RANGE_ENTRY
  823. @(default_calling_convention="system")
  824. foreign kernel32 {
  825. PrefetchVirtualMemory :: proc(
  826. hProcess: HANDLE,
  827. NumberOfEntries: ULONG_PTR,
  828. VirtualAddresses: PWIN32_MEMORY_RANGE_ENTRY,
  829. Flags: ULONG,
  830. ) -> BOOL ---
  831. CreateFileMappingFromApp :: proc(
  832. hFile: HANDLE,
  833. SecurityAttributes: PSECURITY_ATTRIBUTES,
  834. PageProtection: ULONG,
  835. MaximumSize: ULONG64,
  836. Name: PCWSTR,
  837. ) -> HANDLE ---
  838. MapViewOfFileFromApp :: proc(
  839. hFileMappingObject: HANDLE,
  840. DesiredAccess: ULONG,
  841. FileOffset: ULONG64,
  842. NumberOfBytesToMap: SIZE_T,
  843. ) -> PVOID ---
  844. UnmapViewOfFileEx :: proc(
  845. BaseAddress: PVOID,
  846. UnmapFlags: ULONG,
  847. ) -> BOOL ---
  848. AllocateUserPhysicalPages :: proc(
  849. hProcess: HANDLE,
  850. NumberOfPages: PULONG_PTR,
  851. PageArray: PULONG_PTR,
  852. ) -> BOOL ---
  853. FreeUserPhysicalPages :: proc(
  854. hProcess: HANDLE,
  855. NumberOfPages: PULONG_PTR,
  856. PageArray: PULONG_PTR,
  857. ) -> BOOL ---
  858. MapUserPhysicalPages :: proc(
  859. VirtualAddress: PVOID,
  860. NumberOfPages: ULONG_PTR,
  861. PageArray: PULONG_PTR,
  862. ) -> BOOL ---
  863. AllocateUserPhysicalPagesNuma :: proc(
  864. hProcess: HANDLE,
  865. NumberOfPages: PULONG_PTR,
  866. PageArray: PULONG_PTR,
  867. nndPreferred: DWORD,
  868. ) -> BOOL ---
  869. VirtualAllocExNuma :: proc(
  870. hProcess: HANDLE,
  871. lpAddress: LPVOID,
  872. dwSize: SIZE_T,
  873. flAllocationType: DWORD,
  874. flProtect: DWORD,
  875. nndPreferred: DWORD,
  876. ) -> LPVOID ---
  877. }
  878. MEHC_PATROL_SCRUBBER_PRESENT :: ULONG(0x1)
  879. @(default_calling_convention="system")
  880. foreign kernel32 {
  881. GetMemoryErrorHandlingCapabilities :: proc(
  882. Capabilities: PULONG,
  883. ) -> BOOL ---
  884. }
  885. @(default_calling_convention="system")
  886. foreign kernel32 {
  887. GlobalMemoryStatusEx :: proc(
  888. lpBuffer: ^MEMORYSTATUSEX,
  889. ) -> BOOL ---
  890. }
  891. PBAD_MEMORY_CALLBACK_ROUTINE :: #type proc "system" ()
  892. @(default_calling_convention="system")
  893. foreign kernel32 {
  894. RegisterBadMemoryNotification :: proc(
  895. Callback: PBAD_MEMORY_CALLBACK_ROUTINE,
  896. ) -> PVOID ---
  897. UnregisterBadMemoryNotification :: proc(
  898. RegistrationHandle: PVOID,
  899. ) -> BOOL ---
  900. }
  901. OFFER_PRIORITY :: enum c_int {
  902. VmOfferPriorityVeryLow = 1,
  903. VmOfferPriorityLow,
  904. VmOfferPriorityBelowNormal,
  905. VmOfferPriorityNormal,
  906. }
  907. VmOfferPriorityVeryLow :: OFFER_PRIORITY.VmOfferPriorityVeryLow
  908. VmOfferPriorityLow :: OFFER_PRIORITY.VmOfferPriorityLow
  909. VmOfferPriorityBelowNormal :: OFFER_PRIORITY.VmOfferPriorityBelowNormal
  910. VmOfferPriorityNormal :: OFFER_PRIORITY.VmOfferPriorityNormal
  911. @(default_calling_convention="system")
  912. foreign kernel32 {
  913. OfferVirtualMemory :: proc(
  914. VirtualAddress: PVOID,
  915. Size: SIZE_T,
  916. Priority: OFFER_PRIORITY,
  917. ) -> DWORD ---
  918. ReclaimVirtualMemory :: proc(
  919. VirtualAddress: PVOID,
  920. Size: SIZE_T,
  921. ) -> DWORD ---
  922. DiscardVirtualMemory :: proc(
  923. VirtualAddress: PVOID,
  924. Size: SIZE_T,
  925. ) -> DWORD ---
  926. VirtualAllocFromApp :: proc(
  927. BaseAddress: PVOID,
  928. Size: SIZE_T,
  929. AllocationType: ULONG,
  930. Protection: ULONG,
  931. ) -> PVOID ---
  932. VirtualProtectFromApp :: proc(
  933. Address: PVOID,
  934. Size: SIZE_T,
  935. NewProtection: ULONG,
  936. OldProtection: PULONG,
  937. ) -> BOOL ---
  938. OpenFileMappingFromApp :: proc(
  939. DesiredAccess: ULONG,
  940. InheritHandle: BOOL,
  941. Name: PCWSTR,
  942. ) -> HANDLE ---
  943. }
  944. WIN32_MEMORY_INFORMATION_CLASS :: enum c_int {
  945. MemoryRegionInfo,
  946. }
  947. MemoryRegionInfo :: WIN32_MEMORY_INFORMATION_CLASS.MemoryRegionInfo
  948. WIN32_MEMORY_REGION_INFORMATION :: struct {
  949. AllocationBase: PVOID,
  950. AllocationProtect: ULONG,
  951. u: WIN32_MEMORY_REGION_INFORMATION_u,
  952. RegionSize: SIZE_T,
  953. CommitSize: SIZE_T,
  954. }
  955. WIN32_MEMORY_REGION_INFORMATION_u :: struct #raw_union {
  956. u: [1]u32,
  957. Flags: ULONG,
  958. s: WIN32_MEMORY_REGION_INFORMATION_u_s,
  959. }
  960. WIN32_MEMORY_REGION_INFORMATION_u_s :: struct {
  961. Bitfield: ULONG,
  962. }
  963. WIN32_MEMORY_REGION_INFORMATION_u_s_Bitfield :: distinct ULONG
  964. /*bit_field #align(align_of(ULONG)) {
  965. Private : 1-0,
  966. MappedDataFile : 2-1,
  967. MappedImage : 3-2,
  968. MappedPageFile : 4-3,
  969. MappedPhysical : 5-4,
  970. DirectMapped : 6-5,
  971. Reserved : 32-6,
  972. }*/
  973. @(default_calling_convention="system")
  974. foreign one_core {
  975. QueryVirtualMemoryInformation :: proc(
  976. Process: HANDLE,
  977. VirtualAddress: PVOID,
  978. MemoryInformationClass: WIN32_MEMORY_INFORMATION_CLASS,
  979. MemoryInformation: PVOID,
  980. MemoryInformationSize: SIZE_T,
  981. ReturnSize: PSIZE_T,
  982. ) -> BOOL ---
  983. MapViewOfFileNuma2 :: proc(
  984. FileMappingHandle: HANDLE,
  985. ProcessHandle: HANDLE,
  986. Offset: ULONG64,
  987. BaseAddress: PVOID,
  988. ViewSize: SIZE_T,
  989. AllocationType: ULONG,
  990. PageProtection: ULONG,
  991. PreferredNode: ULONG,
  992. ) -> PVOID ---
  993. }
  994. NUMA_NO_PREFERRED_NODE :: 0xffffffff
  995. MapViewOfFile2 :: #force_inline proc "system" (
  996. FileMappingHandle: HANDLE,
  997. ProcessHandle: HANDLE,
  998. Offset: ULONG64,
  999. BaseAddress: PVOID,
  1000. ViewSize: SIZE_T,
  1001. AllocationType: ULONG,
  1002. PageProtection: ULONG,
  1003. ) -> PVOID {
  1004. return MapViewOfFileNuma2(
  1005. FileMappingHandle,
  1006. ProcessHandle,
  1007. Offset,
  1008. BaseAddress,
  1009. ViewSize,
  1010. AllocationType,
  1011. PageProtection,
  1012. NUMA_NO_PREFERRED_NODE,
  1013. )
  1014. }
  1015. @(default_calling_convention="system")
  1016. foreign kernel32 {
  1017. UnmapViewOfFile2 :: proc(
  1018. ProcessHandle: HANDLE,
  1019. BaseAddress: PVOID,
  1020. UnmapFlags: ULONG,
  1021. ) -> BOOL ---
  1022. }
  1023. @(default_calling_convention="system")
  1024. foreign kernel32 {
  1025. GetProductInfo :: proc(
  1026. OSMajorVersion: DWORD,
  1027. OSMinorVersion: DWORD,
  1028. SpMajorVersion: DWORD,
  1029. SpMinorVersion: DWORD,
  1030. product_type: ^Windows_Product_Type,
  1031. ) -> BOOL ---
  1032. }
  1033. HandlerRoutine :: proc "system" (dwCtrlType: DWORD) -> BOOL
  1034. PHANDLER_ROUTINE :: HandlerRoutine
  1035. // NOTE(Jeroen, 2024-06-13): As Odin now supports bit_fields, we no longer need
  1036. // a helper procedure. `init_dcb_with_config` and `get_dcb_config` have been removed.
  1037. LPFIBER_START_ROUTINE :: #type proc "system" (lpFiberParameter: LPVOID)
  1038. @(default_calling_convention = "system")
  1039. foreign kernel32 {
  1040. CreateFiber :: proc(dwStackSize: SIZE_T, lpStartAddress: LPFIBER_START_ROUTINE, lpParameter: LPVOID) -> LPVOID ---
  1041. DeleteFiber :: proc(lpFiber: LPVOID) ---
  1042. ConvertThreadToFiber :: proc(lpParameter: LPVOID) -> LPVOID ---
  1043. SwitchToFiber :: proc(lpFiber: LPVOID) ---
  1044. }
  1045. LOGICAL_PROCESSOR_RELATIONSHIP :: enum c_int {
  1046. RelationProcessorCore,
  1047. RelationNumaNode,
  1048. RelationCache,
  1049. RelationProcessorPackage,
  1050. RelationGroup,
  1051. RelationProcessorDie,
  1052. RelationNumaNodeEx,
  1053. RelationProcessorModule,
  1054. RelationAll = 0xffff,
  1055. }
  1056. PROCESSOR_CACHE_TYPE :: enum c_int {
  1057. CacheUnified,
  1058. CacheInstruction,
  1059. CacheData,
  1060. CacheTrace,
  1061. }
  1062. CACHE_DESCRIPTOR :: struct {
  1063. Level: BYTE,
  1064. Associativity: BYTE,
  1065. LineSize: WORD,
  1066. Size: DWORD,
  1067. Type: PROCESSOR_CACHE_TYPE,
  1068. }
  1069. ProcessorCore :: struct {
  1070. Flags: BYTE,
  1071. }
  1072. NumaNode :: struct {
  1073. NodeNumber: DWORD,
  1074. }
  1075. DUMMYUNIONNAME_u :: struct #raw_union {
  1076. Core: ProcessorCore,
  1077. Node: NumaNode,
  1078. Cache: CACHE_DESCRIPTOR,
  1079. Reserved: [2]ULONGLONG,
  1080. }
  1081. SYSTEM_LOGICAL_PROCESSOR_INFORMATION :: struct {
  1082. ProcessorMask: ULONG_PTR,
  1083. Relationship: LOGICAL_PROCESSOR_RELATIONSHIP,
  1084. DummyUnion: DUMMYUNIONNAME_u,
  1085. }
  1086. SYSTEM_POWER_STATUS :: struct {
  1087. ACLineStatus: AC_Line_Status,
  1088. BatteryFlag: Battery_Flags,
  1089. BatteryLifePercent: BYTE,
  1090. SystemStatusFlag: BYTE,
  1091. BatteryLifeTime: DWORD,
  1092. BatteryFullLifeTime: DWORD,
  1093. }
  1094. AC_Line_Status :: enum BYTE {
  1095. Offline = 0,
  1096. Online = 1,
  1097. Unknown = 255,
  1098. }
  1099. Battery_Flag :: enum BYTE {
  1100. High = 0,
  1101. Low = 1,
  1102. Critical = 2,
  1103. Charging = 3,
  1104. No_Battery = 7,
  1105. }
  1106. Battery_Flags :: bit_set[Battery_Flag; BYTE]
  1107. /* Global Memory Flags */
  1108. GMEM_FIXED :: 0x0000
  1109. GMEM_MOVEABLE :: 0x0002
  1110. GMEM_NOCOMPACT :: 0x0010
  1111. GMEM_NODISCARD :: 0x0020
  1112. GMEM_ZEROINIT :: 0x0040
  1113. GMEM_MODIFY :: 0x0080
  1114. GMEM_DISCARDABLE :: 0x0100
  1115. GMEM_NOT_BANKED :: 0x1000
  1116. GMEM_SHARE :: 0x2000
  1117. GMEM_DDESHARE :: 0x2000
  1118. GMEM_NOTIFY :: 0x4000
  1119. GMEM_LOWER :: GMEM_NOT_BANKED
  1120. GMEM_VALID_FLAGS :: 0x7F72
  1121. GMEM_INVALID_HANDLE :: 0x8000
  1122. GHND :: (GMEM_MOVEABLE | GMEM_ZEROINIT)
  1123. GPTR :: (GMEM_FIXED | GMEM_ZEROINIT)
  1124. LPTOP_LEVEL_EXCEPTION_FILTER :: PVECTORED_EXCEPTION_HANDLER