kernel32.odin 38 KB

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