kernel32.odin 38 KB

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