kernel32.odin 38 KB

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