kernel32.odin 30 KB

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