kernel32.odin 39 KB

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