kernel32.odin 42 KB

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