kernel32.odin 31 KB

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