kernel32.odin 30 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001
  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. InitializeSRWLock :: proc(SRWLock: ^SRWLOCK) ---
  300. AcquireSRWLockExclusive :: proc(SRWLock: ^SRWLOCK) ---
  301. TryAcquireSRWLockExclusive :: proc(SRWLock: ^SRWLOCK) -> BOOLEAN ---
  302. ReleaseSRWLockExclusive :: proc(SRWLock: ^SRWLOCK) ---
  303. AcquireSRWLockShared :: proc(SRWLock: ^SRWLOCK) ---
  304. TryAcquireSRWLockShared :: proc(SRWLock: ^SRWLOCK) -> BOOLEAN ---
  305. ReleaseSRWLockShared :: proc(SRWLock: ^SRWLOCK) ---
  306. InitializeConditionVariable :: proc(ConditionVariable: ^CONDITION_VARIABLE) ---
  307. WakeConditionVariable :: proc(ConditionVariable: ^CONDITION_VARIABLE) ---
  308. WakeAllConditionVariable :: proc(ConditionVariable: ^CONDITION_VARIABLE) ---
  309. SleepConditionVariableCS :: proc(ConditionVariable: ^CONDITION_VARIABLE, CriticalSection: ^CRITICAL_SECTION, dwMilliseconds: DWORD) -> BOOL ---
  310. SleepConditionVariableSRW :: proc(ConditionVariable: ^CONDITION_VARIABLE, SRWLock: ^SRWLOCK, dwMilliseconds: DWORD, Flags: LONG) -> BOOL ---
  311. GetFileType :: proc(file_handle: HANDLE) -> DWORD ---
  312. SetFilePointer :: proc(file_handle: HANDLE, distance_to_move: LONG, distance_to_move_high: ^LONG, move_method: DWORD) -> DWORD ---
  313. GetFileSizeEx :: proc(file_handle: HANDLE, file_size: ^LARGE_INTEGER) -> BOOL ---
  314. GetFileAttributesW :: proc(lpFileName: LPCWSTR) -> DWORD ---
  315. GetFileAttributesExW :: proc(lpFileName: LPCWSTR, fInfoLevelId: GET_FILEEX_INFO_LEVELS, lpFileInformation: LPVOID) -> BOOL ---
  316. GetSystemInfo :: proc(system_info: ^SYSTEM_INFO) ---
  317. GetVersionExW :: proc(osvi: ^OSVERSIONINFOEXW) ---
  318. LoadLibraryW :: proc(c_str: LPCWSTR) -> HMODULE ---
  319. FreeLibrary :: proc(h: HMODULE) -> BOOL ---
  320. GetProcAddress :: proc(h: HMODULE, c_str: LPCSTR) -> rawptr ---
  321. GetFullPathNameW :: proc(filename: LPCWSTR, buffer_length: DWORD, buffer: LPCWSTR, file_part: ^LPCWSTR) -> DWORD ---
  322. GetLongPathNameW :: proc(short, long: LPCWSTR, len: DWORD) -> DWORD ---
  323. GetShortPathNameW :: proc(long, short: LPCWSTR, len: DWORD) -> DWORD ---
  324. GetFinalPathNameByHandleW :: proc(hFile: HANDLE, lpszFilePath: LPCWSTR, cchFilePath: DWORD, dwFlags: DWORD) -> DWORD ---
  325. SetEndOfFile :: proc(hFile: HANDLE) -> BOOL ---
  326. CreatePipe :: proc(hReadPipe, hWritePipe: ^HANDLE, lpPipeAttributes: LPSECURITY_ATTRIBUTES, nSize: DWORD) -> BOOL ---
  327. ConnectNamedPipe :: proc(hNamedPipe: HANDLE, lpOverlapped: LPOVERLAPPED,) -> BOOL ---
  328. DisconnectNamedPipe :: proc(hNamedPipe: HANDLE,) -> BOOL ---
  329. WaitNamedPipeW :: proc(lpNamedPipeName: LPCWSTR, nTimeOut: DWORD,) -> BOOL ---
  330. SetConsoleCtrlHandler :: proc(HandlerRoutine: PHANDLER_ROUTINE, Add: BOOL) -> BOOL ---
  331. GenerateConsoleCtrlEvent :: proc(dwCtrlEvent: DWORD, dwProcessGroupId: DWORD) -> BOOL ---
  332. FreeConsole :: proc() -> BOOL ---
  333. GetConsoleWindow :: proc() -> HWND ---
  334. GetDiskFreeSpaceExW :: proc(
  335. lpDirectoryName: LPCWSTR,
  336. lpFreeBytesAvailableToCaller: PULARGE_INTEGER,
  337. lpTotalNumberOfBytes: PULARGE_INTEGER,
  338. lpTotalNumberOfFreeBytes: PULARGE_INTEGER,
  339. ) -> BOOL ---
  340. }
  341. SECTION_QUERY :: DWORD(0x0001)
  342. SECTION_MAP_WRITE :: DWORD(0x0002)
  343. SECTION_MAP_READ :: DWORD(0x0004)
  344. SECTION_MAP_EXECUTE :: DWORD(0x0008)
  345. SECTION_EXTEND_SIZE :: DWORD(0x0010)
  346. SECTION_ALL_ACCESS :: STANDARD_RIGHTS_REQUIRED | SECTION_QUERY | SECTION_MAP_WRITE | SECTION_MAP_READ | SECTION_MAP_EXECUTE | SECTION_EXTEND_SIZE
  347. SECTION_MAP_EXECUTE_EXPLICIT :: DWORD(0x0020)
  348. FILE_MAP_WRITE :: SECTION_MAP_WRITE
  349. FILE_MAP_READ :: SECTION_MAP_READ
  350. FILE_MAP_ALL_ACCESS :: SECTION_ALL_ACCESS
  351. FILE_MAP_EXECUTE :: SECTION_MAP_EXECUTE_EXPLICIT
  352. FILE_MAP_COPY :: DWORD(0x00000001)
  353. FILE_MAP_RESERVE :: DWORD(0x80000000)
  354. FILE_MAP_TARGETS_INVALID :: DWORD(0x40000000)
  355. FILE_MAP_LARGE_PAGES :: DWORD(0x20000000)
  356. PAGE_NOACCESS :: 0x01
  357. PAGE_READONLY :: 0x02
  358. PAGE_READWRITE :: 0x04
  359. PAGE_WRITECOPY :: 0x08
  360. PAGE_EXECUTE :: 0x10
  361. PAGE_EXECUTE_READ :: 0x20
  362. PAGE_EXECUTE_READWRITE :: 0x40
  363. PAGE_EXECUTE_WRITECOPY :: 0x80
  364. PAGE_GUARD :: 0x100
  365. PAGE_NOCACHE :: 0x200
  366. PAGE_WRITECOMBINE :: 0x400
  367. MEMORY_BASIC_INFORMATION :: struct {
  368. BaseAddress: PVOID,
  369. AllocationBase: PVOID,
  370. AllocationProtect: DWORD,
  371. PartitionId: WORD,
  372. RegionSize: SIZE_T,
  373. State: DWORD,
  374. Protect: DWORD,
  375. Type: DWORD,
  376. }
  377. PMEMORY_BASIC_INFORMATION :: ^MEMORY_BASIC_INFORMATION
  378. LPMEMORY_BASIC_INFORMATION :: ^MEMORY_BASIC_INFORMATION
  379. MEM_COMMIT :: 0x1000
  380. MEM_RESERVE :: 0x2000
  381. MEM_DECOMMIT :: 0x4000
  382. MEM_RELEASE :: 0x8000
  383. MEM_FREE :: 0x10000
  384. MEM_PRIVATE :: 0x20000
  385. MEM_MAPPED :: 0x40000
  386. MEM_RESET :: 0x80000
  387. MEM_TOP_DOWN :: 0x100000
  388. MEM_LARGE_PAGES :: 0x20000000
  389. MEM_4MB_PAGES :: 0x80000000
  390. @(default_calling_convention="stdcall")
  391. foreign kernel32 {
  392. VirtualAlloc :: proc(
  393. lpAddress: LPVOID,
  394. dwSize: SIZE_T,
  395. flAllocationType: DWORD,
  396. flProtect: DWORD,
  397. ) -> LPVOID ---
  398. VirtualProtect :: proc(
  399. lpAddress: LPVOID,
  400. dwSize: SIZE_T,
  401. flNewProtect: DWORD,
  402. lpflOldProtect: PDWORD,
  403. ) -> BOOL ---
  404. VirtualFree :: proc(
  405. lpAddress: LPVOID,
  406. dwSize: SIZE_T,
  407. dwFreeType: DWORD,
  408. ) -> BOOL ---
  409. VirtualQuery :: proc(
  410. lpAddress: LPCVOID,
  411. lpBuffer: PMEMORY_BASIC_INFORMATION,
  412. dwLength: SIZE_T,
  413. ) -> SIZE_T ---
  414. VirtualAllocEx :: proc(
  415. hProcess: HANDLE,
  416. lpAddress: LPVOID,
  417. dwSize: SIZE_T,
  418. flAllocationType: DWORD,
  419. flProtect: DWORD,
  420. ) -> LPVOID ---
  421. VirtualFreeEx :: proc(
  422. hProcess: HANDLE,
  423. lpAddress: LPVOID,
  424. dwSize: SIZE_T,
  425. dwFreeType: DWORD,
  426. ) -> BOOL ---
  427. VirtualProtectEx :: proc(
  428. hProcess: HANDLE,
  429. lpAddress: LPVOID,
  430. dwSize: SIZE_T,
  431. flNewProtect: DWORD,
  432. lpflOldProtect: PDWORD,
  433. ) -> BOOL ---
  434. VirtualQueryEx :: proc(
  435. hProcess: HANDLE,
  436. lpAddress: LPCVOID,
  437. lpBuffer: PMEMORY_BASIC_INFORMATION,
  438. dwLength: SIZE_T,
  439. ) -> SIZE_T ---
  440. ReadProcessMemory :: proc(
  441. hProcess: HANDLE,
  442. lpBaseAddress: LPCVOID,
  443. lpBuffer: LPVOID,
  444. nSize: SIZE_T,
  445. lpNumberOfBytesRead: ^SIZE_T,
  446. ) -> BOOL ---
  447. WriteProcessMemory :: proc(
  448. hProcess: HANDLE,
  449. lpBaseAddress: LPVOID,
  450. lpBuffer: LPCVOID,
  451. nSize: SIZE_T,
  452. lpNumberOfBytesWritten: ^SIZE_T,
  453. ) -> BOOL ---
  454. CreateFileMappingW :: proc(
  455. hFile: HANDLE,
  456. lpFileMappingAttributes: LPSECURITY_ATTRIBUTES,
  457. flProtect: DWORD,
  458. dwMaximumSizeHigh: DWORD,
  459. dwMaximumSizeLow: DWORD,
  460. lpName: LPCWSTR,
  461. ) -> HANDLE ---
  462. OpenFileMappingW :: proc(
  463. dwDesiredAccess: DWORD,
  464. bInheritHandle: BOOL,
  465. lpName: LPCWSTR,
  466. ) -> HANDLE ---
  467. MapViewOfFile :: proc(
  468. hFileMappingObject: HANDLE,
  469. dwDesiredAccess: DWORD,
  470. dwFileOffsetHigh: DWORD,
  471. dwFileOffsetLow: DWORD,
  472. dwNumberOfBytesToMap: SIZE_T,
  473. ) -> LPVOID ---
  474. MapViewOfFileEx :: proc(
  475. hFileMappingObject: HANDLE,
  476. dwDesiredAccess: DWORD,
  477. dwFileOffsetHigh: DWORD,
  478. dwFileOffsetLow: DWORD,
  479. dwNumberOfBytesToMap: SIZE_T,
  480. lpBaseAddress: LPVOID,
  481. ) -> LPVOID ---
  482. FlushViewOfFile :: proc(
  483. lpBaseAddress: LPCVOID,
  484. dwNumberOfBytesToFlush: SIZE_T,
  485. ) -> BOOL ---
  486. UnmapViewOfFile :: proc(
  487. lpBaseAddress: LPCVOID,
  488. ) -> BOOL ---
  489. GetLargePageMinimum :: proc() -> SIZE_T ---
  490. GetProcessWorkingSetSizeEx :: proc(
  491. hProcess: HANDLE,
  492. lpMinimumWorkingSetSize: PSIZE_T,
  493. lpMaximumWorkingSetSize: PSIZE_T,
  494. Flags: PDWORD,
  495. ) -> BOOL ---
  496. SetProcessWorkingSetSizeEx :: proc(
  497. hProcess: HANDLE,
  498. dwMinimumWorkingSetSize: SIZE_T,
  499. dwMaximumWorkingSetSize: SIZE_T,
  500. Flags: DWORD,
  501. ) -> BOOL ---
  502. VirtualLock :: proc(
  503. lpAddress: LPVOID,
  504. dwSize: SIZE_T,
  505. ) -> BOOL ---
  506. VirtualUnlock :: proc(
  507. lpAddress: LPVOID,
  508. dwSize: SIZE_T,
  509. ) -> BOOL ---
  510. GetWriteWatch :: proc(
  511. dwFlags: DWORD,
  512. lpBaseAddress: PVOID,
  513. dwRegionSize: SIZE_T,
  514. lpAddresses: ^PVOID,
  515. lpdwCount: ^ULONG_PTR,
  516. lpdwGranularity: LPDWORD,
  517. ) -> UINT ---
  518. ResetWriteWatch :: proc(
  519. lpBaseAddress: LPVOID,
  520. dwRegionSize: SIZE_T,
  521. ) -> UINT ---
  522. }
  523. MEMORY_RESOURCE_NOTIFICATION_TYPE :: enum c_int {
  524. LowMemoryResourceNotification,
  525. HighMemoryResourceNotification,
  526. }
  527. LowMemoryResourceNotification :: MEMORY_RESOURCE_NOTIFICATION_TYPE.LowMemoryResourceNotification
  528. HighMemoryResourceNotification :: MEMORY_RESOURCE_NOTIFICATION_TYPE.HighMemoryResourceNotification
  529. @(default_calling_convention="stdcall")
  530. foreign kernel32 {
  531. CreateMemoryResourceNotification :: proc(
  532. NotificationType: MEMORY_RESOURCE_NOTIFICATION_TYPE,
  533. ) -> HANDLE ---
  534. QueryMemoryResourceNotification :: proc(
  535. ResourceNotificationHandle: HANDLE,
  536. ResourceState: PBOOL,
  537. ) -> BOOL ---
  538. }
  539. FILE_CACHE_MAX_HARD_ENABLE :: DWORD(0x00000001)
  540. FILE_CACHE_MAX_HARD_DISABLE :: DWORD(0x00000002)
  541. FILE_CACHE_MIN_HARD_ENABLE :: DWORD(0x00000004)
  542. FILE_CACHE_MIN_HARD_DISABLE :: DWORD(0x00000008)
  543. @(default_calling_convention="stdcall")
  544. foreign kernel32 {
  545. GetSystemFileCacheSize :: proc(
  546. lpMinimumFileCacheSize: PSIZE_T,
  547. lpMaximumFileCacheSize: PSIZE_T,
  548. lpFlags: PDWORD,
  549. ) -> BOOL ---
  550. SetSystemFileCacheSize :: proc(
  551. MinimumFileCacheSize: SIZE_T,
  552. MaximumFileCacheSize: SIZE_T,
  553. Flags: DWORD,
  554. ) -> BOOL ---
  555. CreateFileMappingNumaW :: proc(
  556. hFile: HANDLE,
  557. lpFileMappingAttributes: LPSECURITY_ATTRIBUTES,
  558. flProtect: DWORD,
  559. dwMaximumSizeHigh: DWORD,
  560. dwMaximumSizeLow: DWORD,
  561. lpName: LPCWSTR,
  562. nndPreferred: DWORD,
  563. ) -> HANDLE ---
  564. }
  565. WIN32_MEMORY_RANGE_ENTRY :: struct {
  566. VirtualAddress: PVOID,
  567. NumberOfBytes: SIZE_T,
  568. }
  569. PWIN32_MEMORY_RANGE_ENTRY :: ^WIN32_MEMORY_RANGE_ENTRY
  570. @(default_calling_convention="stdcall")
  571. foreign kernel32 {
  572. PrefetchVirtualMemory :: proc(
  573. hProcess: HANDLE,
  574. NumberOfEntries: ULONG_PTR,
  575. VirtualAddresses: PWIN32_MEMORY_RANGE_ENTRY,
  576. Flags: ULONG,
  577. ) -> BOOL ---
  578. CreateFileMappingFromApp :: proc(
  579. hFile: HANDLE,
  580. SecurityAttributes: PSECURITY_ATTRIBUTES,
  581. PageProtection: ULONG,
  582. MaximumSize: ULONG64,
  583. Name: PCWSTR,
  584. ) -> HANDLE ---
  585. MapViewOfFileFromApp :: proc(
  586. hFileMappingObject: HANDLE,
  587. DesiredAccess: ULONG,
  588. FileOffset: ULONG64,
  589. NumberOfBytesToMap: SIZE_T,
  590. ) -> PVOID ---
  591. UnmapViewOfFileEx :: proc(
  592. BaseAddress: PVOID,
  593. UnmapFlags: ULONG,
  594. ) -> BOOL ---
  595. AllocateUserPhysicalPages :: proc(
  596. hProcess: HANDLE,
  597. NumberOfPages: PULONG_PTR,
  598. PageArray: PULONG_PTR,
  599. ) -> BOOL ---
  600. FreeUserPhysicalPages :: proc(
  601. hProcess: HANDLE,
  602. NumberOfPages: PULONG_PTR,
  603. PageArray: PULONG_PTR,
  604. ) -> BOOL ---
  605. MapUserPhysicalPages :: proc(
  606. VirtualAddress: PVOID,
  607. NumberOfPages: ULONG_PTR,
  608. PageArray: PULONG_PTR,
  609. ) -> BOOL ---
  610. AllocateUserPhysicalPagesNuma :: proc(
  611. hProcess: HANDLE,
  612. NumberOfPages: PULONG_PTR,
  613. PageArray: PULONG_PTR,
  614. nndPreferred: DWORD,
  615. ) -> BOOL ---
  616. VirtualAllocExNuma :: proc(
  617. hProcess: HANDLE,
  618. lpAddress: LPVOID,
  619. dwSize: SIZE_T,
  620. flAllocationType: DWORD,
  621. flProtect: DWORD,
  622. nndPreferred: DWORD,
  623. ) -> LPVOID ---
  624. }
  625. MEHC_PATROL_SCRUBBER_PRESENT :: ULONG(0x1)
  626. @(default_calling_convention="stdcall")
  627. foreign kernel32 {
  628. GetMemoryErrorHandlingCapabilities :: proc(
  629. Capabilities: PULONG,
  630. ) -> BOOL ---
  631. }
  632. @(default_calling_convention="stdcall")
  633. foreign kernel32 {
  634. GlobalMemoryStatusEx :: proc(
  635. lpBuffer: ^MEMORYSTATUSEX,
  636. ) -> BOOL ---
  637. }
  638. PBAD_MEMORY_CALLBACK_ROUTINE :: #type proc "stdcall" ()
  639. @(default_calling_convention="stdcall")
  640. foreign kernel32 {
  641. RegisterBadMemoryNotification :: proc(
  642. Callback: PBAD_MEMORY_CALLBACK_ROUTINE,
  643. ) -> PVOID ---
  644. UnregisterBadMemoryNotification :: proc(
  645. RegistrationHandle: PVOID,
  646. ) -> BOOL ---
  647. }
  648. OFFER_PRIORITY :: enum c_int {
  649. VmOfferPriorityVeryLow = 1,
  650. VmOfferPriorityLow,
  651. VmOfferPriorityBelowNormal,
  652. VmOfferPriorityNormal,
  653. }
  654. VmOfferPriorityVeryLow :: OFFER_PRIORITY.VmOfferPriorityVeryLow
  655. VmOfferPriorityLow :: OFFER_PRIORITY.VmOfferPriorityLow
  656. VmOfferPriorityBelowNormal :: OFFER_PRIORITY.VmOfferPriorityBelowNormal
  657. VmOfferPriorityNormal :: OFFER_PRIORITY.VmOfferPriorityNormal
  658. @(default_calling_convention="stdcall")
  659. foreign kernel32 {
  660. OfferVirtualMemory :: proc(
  661. VirtualAddress: PVOID,
  662. Size: SIZE_T,
  663. Priority: OFFER_PRIORITY,
  664. ) -> DWORD ---
  665. ReclaimVirtualMemory :: proc(
  666. VirtualAddress: PVOID,
  667. Size: SIZE_T,
  668. ) -> DWORD ---
  669. DiscardVirtualMemory :: proc(
  670. VirtualAddress: PVOID,
  671. Size: SIZE_T,
  672. ) -> DWORD ---
  673. VirtualAllocFromApp :: proc(
  674. BaseAddress: PVOID,
  675. Size: SIZE_T,
  676. AllocationType: ULONG,
  677. Protection: ULONG,
  678. ) -> PVOID ---
  679. VirtualProtectFromApp :: proc(
  680. Address: PVOID,
  681. Size: SIZE_T,
  682. NewProtection: ULONG,
  683. OldProtection: PULONG,
  684. ) -> BOOL ---
  685. OpenFileMappingFromApp :: proc(
  686. DesiredAccess: ULONG,
  687. InheritHandle: BOOL,
  688. Name: PCWSTR,
  689. ) -> HANDLE ---
  690. }
  691. WIN32_MEMORY_INFORMATION_CLASS :: enum c_int {
  692. MemoryRegionInfo,
  693. }
  694. MemoryRegionInfo :: WIN32_MEMORY_INFORMATION_CLASS.MemoryRegionInfo
  695. WIN32_MEMORY_REGION_INFORMATION :: struct {
  696. AllocationBase: PVOID,
  697. AllocationProtect: ULONG,
  698. u: WIN32_MEMORY_REGION_INFORMATION_u,
  699. RegionSize: SIZE_T,
  700. CommitSize: SIZE_T,
  701. }
  702. WIN32_MEMORY_REGION_INFORMATION_u :: struct #raw_union {
  703. u: [1]u32,
  704. Flags: ULONG,
  705. s: WIN32_MEMORY_REGION_INFORMATION_u_s,
  706. }
  707. WIN32_MEMORY_REGION_INFORMATION_u_s :: struct {
  708. Bitfield: ULONG,
  709. }
  710. WIN32_MEMORY_REGION_INFORMATION_u_s_Bitfield :: distinct ULONG
  711. /*bit_field #align align_of(ULONG) {
  712. Private : 1-0,
  713. MappedDataFile : 2-1,
  714. MappedImage : 3-2,
  715. MappedPageFile : 4-3,
  716. MappedPhysical : 5-4,
  717. DirectMapped : 6-5,
  718. Reserved : 32-6,
  719. }*/
  720. @(default_calling_convention="stdcall")
  721. foreign kernel32 {
  722. QueryVirtualMemoryInformation :: proc(
  723. Process: HANDLE,
  724. VirtualAddress: PVOID,
  725. MemoryInformationClass: WIN32_MEMORY_INFORMATION_CLASS,
  726. MemoryInformation: PVOID,
  727. MemoryInformationSize: SIZE_T,
  728. ReturnSize: PSIZE_T,
  729. ) -> BOOL ---
  730. MapViewOfFileNuma2 :: proc(
  731. FileMappingHandle: HANDLE,
  732. ProcessHandle: HANDLE,
  733. Offset: ULONG64,
  734. BaseAddress: PVOID,
  735. ViewSize: SIZE_T,
  736. AllocationType: ULONG,
  737. PageProtection: ULONG,
  738. PreferredNode: ULONG,
  739. ) -> PVOID ---
  740. }
  741. NUMA_NO_PREFERRED_NODE :: 0xffffffff
  742. MapViewOfFile2 :: #force_inline proc "stdcall" (
  743. FileMappingHandle: HANDLE,
  744. ProcessHandle: HANDLE,
  745. Offset: ULONG64,
  746. BaseAddress: PVOID,
  747. ViewSize: SIZE_T,
  748. AllocationType: ULONG,
  749. PageProtection: ULONG,
  750. ) -> PVOID {
  751. return MapViewOfFileNuma2(
  752. FileMappingHandle,
  753. ProcessHandle,
  754. Offset,
  755. BaseAddress,
  756. ViewSize,
  757. AllocationType,
  758. PageProtection,
  759. NUMA_NO_PREFERRED_NODE,
  760. )
  761. }
  762. @(default_calling_convention="stdcall")
  763. foreign kernel32 {
  764. UnmapViewOfFile2 :: proc(
  765. ProcessHandle: HANDLE,
  766. BaseAddress: PVOID,
  767. UnmapFlags: ULONG,
  768. ) -> BOOL ---
  769. }
  770. @(default_calling_convention="stdcall")
  771. foreign kernel32 {
  772. GetProductInfo :: proc(
  773. OSMajorVersion: DWORD,
  774. OSMinorVersion: DWORD,
  775. SpMajorVersion: DWORD,
  776. SpMinorVersion: DWORD,
  777. product_type: ^Windows_Product_Type,
  778. ) -> BOOL ---
  779. }
  780. HandlerRoutine :: proc "stdcall" (dwCtrlType: DWORD) -> BOOL
  781. PHANDLER_ROUTINE :: HandlerRoutine
  782. DCB_Config :: struct {
  783. fParity: bool,
  784. fOutxCtsFlow: bool,
  785. fOutxDsrFlow: bool,
  786. fDtrControl: DTR_Control,
  787. fDsrSensitivity: bool,
  788. fTXContinueOnXoff: bool,
  789. fOutX: bool,
  790. fInX: bool,
  791. fErrorChar: bool,
  792. fNull: bool,
  793. fRtsControl: RTS_Control,
  794. fAbortOnError: bool,
  795. BaudRate: DWORD,
  796. ByteSize: BYTE,
  797. Parity: Parity,
  798. StopBits: Stop_Bits,
  799. XonChar: byte,
  800. XoffChar: byte,
  801. ErrorChar: byte,
  802. EvtChar: byte,
  803. }
  804. DTR_Control :: enum byte {
  805. Disable = 0,
  806. Enable = 1,
  807. Handshake = 2,
  808. }
  809. RTS_Control :: enum byte {
  810. Disable = 0,
  811. Enable = 1,
  812. Handshake = 2,
  813. Toggle = 3,
  814. }
  815. Parity :: enum byte {
  816. None = 0,
  817. Odd = 1,
  818. Even = 2,
  819. Mark = 3,
  820. Space = 4,
  821. }
  822. Stop_Bits :: enum byte {
  823. One = 0,
  824. One_And_A_Half = 1,
  825. Two = 2,
  826. }
  827. // A helper procedure to set the values of a DCB structure.
  828. init_dcb_with_config :: proc "contextless" (dcb: ^DCB, config: DCB_Config) {
  829. out: u32
  830. // NOTE(tetra, 2022-09-21): On both Clang 14 on Windows, and MSVC, the bits in the bitfield
  831. // appear to be defined from LSB to MSB order.
  832. // i.e: `fBinary` (the first bitfield in the C source) is the LSB in the `settings` u32.
  833. out |= u32(1) << 0 // fBinary must always be true on Windows.
  834. out |= u32(config.fParity) << 1
  835. out |= u32(config.fOutxCtsFlow) << 2
  836. out |= u32(config.fOutxDsrFlow) << 3
  837. out |= u32(config.fDtrControl) << 4
  838. out |= u32(config.fDsrSensitivity) << 6
  839. out |= u32(config.fTXContinueOnXoff) << 7
  840. out |= u32(config.fOutX) << 8
  841. out |= u32(config.fInX) << 9
  842. out |= u32(config.fErrorChar) << 10
  843. out |= u32(config.fNull) << 11
  844. out |= u32(config.fRtsControl) << 12
  845. out |= u32(config.fAbortOnError) << 14
  846. dcb.settings = out
  847. dcb.BaudRate = config.BaudRate
  848. dcb.ByteSize = config.ByteSize
  849. dcb.Parity = config.Parity
  850. dcb.StopBits = config.StopBits
  851. dcb.XonChar = config.XonChar
  852. dcb.XoffChar = config.XoffChar
  853. dcb.ErrorChar = config.ErrorChar
  854. dcb.EvtChar = config.EvtChar
  855. dcb.DCBlength = size_of(DCB)
  856. }
  857. get_dcb_config :: proc "contextless" (dcb: DCB) -> (config: DCB_Config) {
  858. config.fParity = bool((dcb.settings >> 1) & 0x01)
  859. config.fOutxCtsFlow = bool((dcb.settings >> 2) & 0x01)
  860. config.fOutxDsrFlow = bool((dcb.settings >> 3) & 0x01)
  861. config.fDtrControl = DTR_Control((dcb.settings >> 4) & 0x02)
  862. config.fDsrSensitivity = bool((dcb.settings >> 6) & 0x01)
  863. config.fTXContinueOnXoff = bool((dcb.settings >> 7) & 0x01)
  864. config.fOutX = bool((dcb.settings >> 8) & 0x01)
  865. config.fInX = bool((dcb.settings >> 9) & 0x01)
  866. config.fErrorChar = bool((dcb.settings >> 10) & 0x01)
  867. config.fNull = bool((dcb.settings >> 11) & 0x01)
  868. config.fRtsControl = RTS_Control((dcb.settings >> 12) & 0x02)
  869. config.fAbortOnError = bool((dcb.settings >> 14) & 0x01)
  870. config.BaudRate = dcb.BaudRate
  871. config.ByteSize = dcb.ByteSize
  872. config.Parity = dcb.Parity
  873. config.StopBits = dcb.StopBits
  874. config.XonChar = dcb.XonChar
  875. config.XoffChar = dcb.XoffChar
  876. config.ErrorChar = dcb.ErrorChar
  877. config.EvtChar = dcb.EvtChar
  878. return
  879. }
  880. // NOTE(tetra): See get_dcb_config() and init_dcb_with_config() for help with initializing this.
  881. DCB :: struct {
  882. DCBlength: DWORD, // NOTE(tetra): Must be set to size_of(DCB).
  883. BaudRate: DWORD,
  884. settings: u32, // NOTE(tetra): These are bitfields in the C struct.
  885. wReserved: WORD,
  886. XOnLim: WORD,
  887. XOffLim: WORD,
  888. ByteSize: BYTE,
  889. Parity: Parity,
  890. StopBits: Stop_Bits,
  891. XonChar: byte,
  892. XoffChar: byte,
  893. ErrorChar: byte,
  894. EofChar: byte,
  895. EvtChar: byte,
  896. wReserved1: WORD,
  897. }
  898. @(default_calling_convention="stdcall")
  899. foreign kernel32 {
  900. GetCommState :: proc(handle: HANDLE, dcb: ^DCB) -> BOOL ---
  901. SetCommState :: proc(handle: HANDLE, dcb: ^DCB) -> BOOL ---
  902. }
  903. LPFIBER_START_ROUTINE :: #type proc "stdcall" (lpFiberParameter: LPVOID)
  904. @(default_calling_convention = "stdcall")
  905. foreign kernel32 {
  906. CreateFiber :: proc(dwStackSize: SIZE_T, lpStartAddress: LPFIBER_START_ROUTINE, lpParameter: LPVOID) -> LPVOID ---
  907. DeleteFiber :: proc(lpFiber: LPVOID) ---
  908. ConvertThreadToFiber :: proc(lpParameter: LPVOID) -> LPVOID ---
  909. SwitchToFiber :: proc(lpFiber: LPVOID) ---
  910. }