kernel32.odin 32 KB

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