kernel32.odin 42 KB

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