kernel32.odin 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797
  1. // +build windows
  2. package sys_windows
  3. foreign import kernel32 "system:Kernel32.lib"
  4. @(default_calling_convention="stdcall")
  5. foreign kernel32 {
  6. OutputDebugStringA :: proc(lpOutputString: LPCSTR) --- // The only A thing that is allowed
  7. OutputDebugStringW :: proc(lpOutputString: LPCSTR) ---
  8. ReadConsoleW :: proc(hConsoleInput: HANDLE,
  9. lpBuffer: LPVOID,
  10. nNumberOfCharsToRead: DWORD,
  11. lpNumberOfCharsRead: LPDWORD,
  12. pInputControl: PCONSOLE_READCONSOLE_CONTROL) -> BOOL ---
  13. WriteConsoleW :: proc(hConsoleOutput: HANDLE,
  14. lpBuffer: LPCVOID,
  15. nNumberOfCharsToWrite: DWORD,
  16. lpNumberOfCharsWritten: LPDWORD,
  17. lpReserved: LPVOID) -> BOOL ---
  18. GetConsoleMode :: proc(hConsoleHandle: HANDLE,
  19. lpMode: LPDWORD) -> BOOL ---
  20. SetConsoleMode :: proc(hConsoleHandle: HANDLE,
  21. dwMode: DWORD) -> BOOL ---
  22. GetFileInformationByHandle :: proc(hFile: HANDLE, lpFileInformation: LPBY_HANDLE_FILE_INFORMATION) -> BOOL ---
  23. SetHandleInformation :: proc(hObject: HANDLE,
  24. dwMask: DWORD,
  25. dwFlags: DWORD) -> BOOL ---
  26. SetFileInformationByHandle :: proc(hFile: HANDLE,
  27. FileInformationClass: FILE_INFO_BY_HANDLE_CLASS,
  28. lpFileInformation: LPVOID,
  29. dwBufferSize: DWORD) -> BOOL ---
  30. AddVectoredExceptionHandler :: proc(FirstHandler: ULONG, VectoredHandler: PVECTORED_EXCEPTION_HANDLER) -> LPVOID ---
  31. AddVectoredContinueHandler :: proc(FirstHandler: ULONG, VectoredHandler: PVECTORED_EXCEPTION_HANDLER) -> LPVOID ---
  32. RemoveVectoredExceptionHandler :: proc(Handle: LPVOID) -> DWORD ---
  33. RemoveVectoredContinueHandler :: proc(Handle: LPVOID) -> DWORD ---
  34. RaiseException :: proc(dwExceptionCode, dwExceptionFlags, nNumberOfArguments: DWORD, lpArguments: ^ULONG_PTR) -> ! ---
  35. CreateHardLinkW :: proc(lpSymlinkFileName: LPCWSTR,
  36. lpTargetFileName: LPCWSTR,
  37. lpSecurityAttributes: LPSECURITY_ATTRIBUTES) -> BOOL ---
  38. GetFileInformationByHandleEx :: proc(hFile: HANDLE,
  39. fileInfoClass: FILE_INFO_BY_HANDLE_CLASS,
  40. lpFileInformation: LPVOID,
  41. dwBufferSize: DWORD) -> BOOL ---
  42. InitializeCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) ---
  43. InitializeCriticalSectionAndSpinCount :: proc(CriticalSection: ^CRITICAL_SECTION, dwSpinCount: DWORD) -> BOOL ---
  44. EnterCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) ---
  45. TryEnterCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) -> BOOLEAN ---
  46. LeaveCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) ---
  47. DeleteCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) ---
  48. RemoveDirectoryW :: proc(lpPathName: LPCWSTR) -> BOOL ---
  49. SetFileAttributesW :: proc(lpFileName: LPCWSTR, dwFileAttributes: DWORD) -> BOOL ---
  50. SetLastError :: proc(dwErrCode: DWORD) ---
  51. GetCommandLineW :: proc() -> LPCWSTR ---
  52. GetTempPathW :: proc(nBufferLength: DWORD, lpBuffer: LPCWSTR) -> DWORD ---
  53. GetCurrentProcess :: proc() -> HANDLE ---
  54. GetCurrentProcessId :: proc() -> DWORD ---
  55. GetCurrentThread :: proc() -> HANDLE ---
  56. GetCurrentThreadId :: proc() -> DWORD ---
  57. GetProcessTimes :: proc(
  58. hProcess: HANDLE,
  59. lpCreationTime: LPFILETIME,
  60. lpExitTime: LPFILETIME,
  61. lpKernelTime: LPFILETIME,
  62. lpUserTime: LPFILETIME,
  63. ) -> BOOL ---
  64. GetStdHandle :: proc(which: DWORD) -> HANDLE ---
  65. ExitProcess :: proc(uExitCode: c_uint) -> ! ---
  66. DeviceIoControl :: proc(
  67. hDevice: HANDLE,
  68. dwIoControlCode: DWORD,
  69. lpInBuffer: LPVOID,
  70. nInBufferSize: DWORD,
  71. lpOutBuffer: LPVOID,
  72. nOutBufferSize: DWORD,
  73. lpBytesReturned: LPDWORD,
  74. lpOverlapped: LPOVERLAPPED,
  75. ) -> BOOL ---
  76. CreateThread :: proc(
  77. lpThreadAttributes: LPSECURITY_ATTRIBUTES,
  78. dwStackSize: SIZE_T,
  79. lpStartAddress: proc "stdcall" (rawptr) -> DWORD,
  80. lpParameter: LPVOID,
  81. dwCreationFlags: DWORD,
  82. lpThreadId: LPDWORD,
  83. ) -> HANDLE ---
  84. SwitchToThread :: proc() -> BOOL ---
  85. ResumeThread :: proc(thread: HANDLE) -> DWORD ---
  86. GetThreadPriority :: proc(thread: HANDLE) -> c_int ---
  87. SetThreadPriority :: proc(thread: HANDLE, priority: c_int) -> BOOL ---
  88. GetExitCodeThread :: proc(thread: HANDLE, exit_code: ^DWORD) -> BOOL ---
  89. TerminateThread :: proc(thread: HANDLE, exit_code: DWORD) -> BOOL ---
  90. CreateSemaphoreW :: proc(attributes: LPSECURITY_ATTRIBUTES, initial_count, maximum_count: LONG, name: LPCSTR) -> HANDLE ---
  91. ReleaseSemaphore :: proc(semaphore: HANDLE, release_count: LONG, previous_count: ^LONG) -> BOOL ---
  92. CreateWaitableTimerW :: proc(
  93. lpTimerAttributes: LPSECURITY_ATTRIBUTES,
  94. bManualReset: BOOL,
  95. lpTimerName: LPCWSTR,
  96. ) -> HANDLE ---
  97. SetWaitableTimerEx :: proc(
  98. hTimer: HANDLE,
  99. lpDueTime: ^LARGE_INTEGER,
  100. lPeriod: LONG,
  101. pfnCompletionRoutine: PTIMERAPCROUTINE,
  102. lpArgToCompletionRoutine: LPVOID,
  103. WakeContext: PREASON_CONTEXT,
  104. TolerableDelay: ULONG,
  105. ) -> BOOL ---
  106. WaitForSingleObject :: proc(hHandle: HANDLE, dwMilliseconds: DWORD) -> DWORD ---
  107. Sleep :: proc(dwMilliseconds: DWORD) ---
  108. GetProcessId :: proc(handle: HANDLE) -> DWORD ---
  109. CopyFileExW :: proc(
  110. lpExistingFileName: LPCWSTR,
  111. lpNewFileName: LPCWSTR,
  112. lpProgressRoutine: LPPROGRESS_ROUTINE,
  113. lpData: LPVOID,
  114. pbCancel: LPBOOL,
  115. dwCopyFlags: DWORD,
  116. ) -> BOOL ---
  117. FormatMessageW :: proc(
  118. flags: DWORD,
  119. lpSrc: LPVOID,
  120. msgId: DWORD,
  121. langId: DWORD,
  122. buf: LPWSTR,
  123. nsize: DWORD,
  124. args: rawptr,
  125. ) -> DWORD ---
  126. TlsAlloc :: proc() -> DWORD ---
  127. TlsFree :: proc(dwTlsIndex: DWORD) -> BOOL ---
  128. TlsGetValue :: proc(dwTlsIndex: DWORD) -> LPVOID ---
  129. TlsSetValue :: proc(dwTlsIndex: DWORD, lpTlsvalue: LPVOID) -> BOOL ---
  130. GetLastError :: proc() -> DWORD ---
  131. QueryPerformanceFrequency :: proc(lpFrequency: ^LARGE_INTEGER) -> BOOL ---
  132. QueryPerformanceCounter :: proc(lpPerformanceCount: ^LARGE_INTEGER) -> BOOL ---
  133. GetExitCodeProcess :: proc(hProcess: HANDLE, lpExitCode: LPDWORD) -> BOOL ---
  134. TerminateProcess :: proc(hProcess: HANDLE, uExitCode: UINT) -> BOOL ---
  135. CreateProcessW :: proc(
  136. lpApplicationName: LPCWSTR,
  137. lpCommandLine: LPWSTR,
  138. lpProcessAttributes: LPSECURITY_ATTRIBUTES,
  139. lpThreadAttributes: LPSECURITY_ATTRIBUTES,
  140. bInheritHandles: BOOL,
  141. dwCreationFlags: DWORD,
  142. lpEnvironment: LPVOID,
  143. lpCurrentDirectory: LPCWSTR,
  144. lpStartupInfo: LPSTARTUPINFO,
  145. lpProcessInformation: LPPROCESS_INFORMATION,
  146. ) -> BOOL ---
  147. GetEnvironmentVariableW :: proc(n: LPCWSTR, v: LPWSTR, nsize: DWORD) -> DWORD ---
  148. SetEnvironmentVariableW :: proc(n: LPCWSTR, v: LPCWSTR) -> BOOL ---
  149. GetEnvironmentStringsW :: proc() -> LPWCH ---
  150. FreeEnvironmentStringsW :: proc(env_ptr: LPWCH) -> BOOL ---
  151. GetModuleFileNameW :: proc(hModule: HMODULE, lpFilename: LPWSTR, nSize: DWORD) -> DWORD ---
  152. CreateDirectoryW :: proc(
  153. lpPathName: LPCWSTR,
  154. lpSecurityAttributes: LPSECURITY_ATTRIBUTES,
  155. ) -> BOOL ---
  156. DeleteFileW :: proc(lpPathName: LPCWSTR) -> BOOL ---
  157. GetCurrentDirectoryW :: proc(nBufferLength: DWORD, lpBuffer: LPWSTR) -> DWORD ---
  158. SetCurrentDirectoryW :: proc(lpPathName: LPCWSTR) -> BOOL ---
  159. WideCharToMultiByte :: proc(
  160. CodePage: UINT,
  161. dwFlags: DWORD,
  162. lpWideCharStr: LPCWSTR,
  163. cchWideChar: c_int,
  164. lpMultiByteStr: LPSTR,
  165. cbMultiByte: c_int,
  166. lpDefaultChar: LPCSTR,
  167. lpUsedDefaultChar: LPBOOL,
  168. ) -> c_int ---
  169. MultiByteToWideChar :: proc(
  170. CodePage: UINT,
  171. dwFlags: DWORD,
  172. lpMultiByteStr: LPSTR,
  173. cbMultiByte: c_int,
  174. lpWideCharStr: LPWSTR,
  175. cchWideChar: c_int,
  176. ) -> c_int ---
  177. DuplicateHandle :: proc(
  178. hSourceProcessHandle: HANDLE,
  179. hSourceHandle: HANDLE,
  180. hTargetProcessHandle: HANDLE,
  181. lpTargetHandle: LPHANDLE,
  182. dwDesiredAccess: DWORD,
  183. bInheritHandle: BOOL,
  184. dwOptions: DWORD,
  185. ) -> BOOL ---
  186. ReadFile :: proc(
  187. hFile: HANDLE,
  188. lpBuffer: LPVOID,
  189. nNumberOfBytesToRead: DWORD,
  190. lpNumberOfBytesRead: LPDWORD,
  191. lpOverlapped: LPOVERLAPPED,
  192. ) -> BOOL ---
  193. WriteFile :: proc(
  194. hFile: HANDLE,
  195. lpBuffer: LPVOID,
  196. nNumberOfBytesToWrite: DWORD,
  197. lpNumberOfBytesWritten: LPDWORD,
  198. lpOverlapped: LPOVERLAPPED,
  199. ) -> BOOL ---
  200. CloseHandle :: proc(hObject: HANDLE) -> BOOL ---
  201. MoveFileExW :: proc(lpExistingFileName: LPCWSTR, lpNewFileName: LPCWSTR, dwFlags: DWORD) -> BOOL ---
  202. SetFilePointerEx :: proc(
  203. hFile: HANDLE,
  204. liDistanceToMove: LARGE_INTEGER,
  205. lpNewFilePointer: PLARGE_INTEGER,
  206. dwMoveMethod: DWORD,
  207. ) -> BOOL ---
  208. FlushFileBuffers :: proc(hFile: HANDLE) -> BOOL ---
  209. CreateFileW :: proc(
  210. lpFileName: LPCWSTR,
  211. dwDesiredAccess: DWORD,
  212. dwShareMode: DWORD,
  213. lpSecurityAttributes: LPSECURITY_ATTRIBUTES,
  214. dwCreationDisposition: DWORD,
  215. dwFlagsAndAttributes: DWORD,
  216. hTemplateFile: HANDLE,
  217. ) -> HANDLE ---
  218. FindFirstFileW :: proc(fileName: LPCWSTR, findFileData: LPWIN32_FIND_DATAW) -> HANDLE ---
  219. FindNextFileW :: proc(findFile: HANDLE, findFileData: LPWIN32_FIND_DATAW) -> BOOL ---
  220. FindClose :: proc(findFile: HANDLE) -> BOOL ---
  221. GetModuleHandleW :: proc(lpModuleName: LPCWSTR) -> HMODULE ---
  222. GetModuleHandleA :: proc(lpModuleName: LPCSTR) -> HMODULE ---
  223. GetSystemTimeAsFileTime :: proc(lpSystemTimeAsFileTime: LPFILETIME) ---
  224. CreateEventW :: proc(
  225. lpEventAttributes: LPSECURITY_ATTRIBUTES,
  226. bManualReset: BOOL,
  227. bInitialState: BOOL,
  228. lpName: LPCWSTR,
  229. ) -> HANDLE ---
  230. ResetEvent :: proc(hEvent: HANDLE) -> BOOL ---
  231. WaitForMultipleObjects :: proc(
  232. nCount: DWORD,
  233. lpHandles: ^HANDLE,
  234. bWaitAll: BOOL,
  235. dwMilliseconds: DWORD,
  236. ) -> DWORD ---
  237. CreateNamedPipeW :: proc(
  238. lpName: LPCWSTR,
  239. dwOpenMode: DWORD,
  240. dwPipeMode: DWORD,
  241. nMaxInstances: DWORD,
  242. nOutBufferSize: DWORD,
  243. nInBufferSize: DWORD,
  244. nDefaultTimeOut: DWORD,
  245. lpSecurityAttributes: LPSECURITY_ATTRIBUTES,
  246. ) -> HANDLE ---
  247. CancelIo :: proc(handle: HANDLE) -> BOOL ---
  248. GetOverlappedResult :: proc(
  249. hFile: HANDLE,
  250. lpOverlapped: LPOVERLAPPED,
  251. lpNumberOfBytesTransferred: LPDWORD,
  252. bWait: BOOL,
  253. ) -> BOOL ---
  254. GetProcessHeap :: proc() -> HANDLE ---
  255. HeapAlloc :: proc(hHeap: HANDLE, dwFlags: DWORD, dwBytes: SIZE_T) -> LPVOID ---
  256. HeapReAlloc :: proc(hHeap: HANDLE, dwFlags: DWORD, lpMem: LPVOID, dwBytes: SIZE_T) -> LPVOID ---
  257. HeapFree :: proc(hHeap: HANDLE, dwFlags: DWORD, lpMem: LPVOID) -> BOOL ---
  258. LocalAlloc :: proc(flags: UINT, bytes: SIZE_T) -> LPVOID ---
  259. LocalReAlloc :: proc(mem: LPVOID, bytes: SIZE_T, flags: UINT) -> LPVOID ---
  260. LocalFree :: proc(mem: LPVOID) -> LPVOID ---
  261. ReadDirectoryChangesW :: proc(
  262. hDirectory: HANDLE,
  263. lpBuffer: LPVOID,
  264. nBufferLength: DWORD,
  265. bWatchSubtree: BOOL,
  266. dwNotifyFilter: DWORD,
  267. lpBytesReturned: LPDWORD,
  268. lpOverlapped: LPOVERLAPPED,
  269. lpCompletionRoutine: LPOVERLAPPED_COMPLETION_ROUTINE,
  270. ) -> BOOL ---
  271. InitializeSRWLock :: proc(SRWLock: ^SRWLOCK) ---
  272. AcquireSRWLockExclusive :: proc(SRWLock: ^SRWLOCK) ---
  273. TryAcquireSRWLockExclusive :: proc(SRWLock: ^SRWLOCK) -> BOOL ---
  274. ReleaseSRWLockExclusive :: proc(SRWLock: ^SRWLOCK) ---
  275. AcquireSRWLockShared :: proc(SRWLock: ^SRWLOCK) ---
  276. TryAcquireSRWLockShared :: proc(SRWLock: ^SRWLOCK) -> BOOL ---
  277. ReleaseSRWLockShared :: proc(SRWLock: ^SRWLOCK) ---
  278. InitializeConditionVariable :: proc(ConditionVariable: ^CONDITION_VARIABLE) ---
  279. WakeConditionVariable :: proc(ConditionVariable: ^CONDITION_VARIABLE) ---
  280. WakeAllConditionVariable :: proc(ConditionVariable: ^CONDITION_VARIABLE) ---
  281. SleepConditionVariableCS :: proc(ConditionVariable: ^CONDITION_VARIABLE, CriticalSection: ^CRITICAL_SECTION, dwMilliseconds: DWORD) -> BOOL ---
  282. SleepConditionVariableSRW :: proc(ConditionVariable: ^CONDITION_VARIABLE, SRWLock: ^SRWLOCK, dwMilliseconds: DWORD, Flags: LONG) -> BOOL ---
  283. GetFileType :: proc(file_handle: HANDLE) -> DWORD ---
  284. SetFilePointer :: proc(file_handle: HANDLE, distance_to_move: LONG, distance_to_move_high: ^LONG, move_method: DWORD) -> DWORD ---
  285. GetFileSizeEx :: proc(file_handle: HANDLE, file_size: ^LARGE_INTEGER) -> BOOL ---
  286. GetFileAttributesW :: proc(lpFileName: LPCWSTR) -> DWORD ---
  287. GetFileAttributesExW :: proc(lpFileName: LPCWSTR, fInfoLevelId: GET_FILEEX_INFO_LEVELS, lpFileInformation: LPVOID) -> BOOL ---
  288. GetSystemInfo :: proc(system_info: ^SYSTEM_INFO) ---
  289. GetVersionExW :: proc(osvi: ^OSVERSIONINFOEXW) ---
  290. LoadLibraryW :: proc(c_str: LPCWSTR) -> HMODULE ---
  291. FreeLibrary :: proc(h: HMODULE) -> BOOL ---
  292. GetProcAddress :: proc(h: HMODULE, c_str: LPCSTR) -> rawptr ---
  293. GetFullPathNameW :: proc(filename: LPCWSTR, buffer_length: DWORD, buffer: LPCWSTR, file_part: ^LPCWSTR) -> DWORD ---
  294. GetLongPathNameW :: proc(short, long: LPCWSTR, len: DWORD) -> DWORD ---
  295. GetShortPathNameW :: proc(long, short: LPCWSTR, len: DWORD) -> DWORD ---
  296. GetFinalPathNameByHandleW :: proc(hFile: HANDLE, lpszFilePath: LPCWSTR, cchFilePath: DWORD, dwFlags: DWORD) -> DWORD ---
  297. SetEndOfFile :: proc(hFile: HANDLE) -> BOOL ---
  298. CreatePipe :: proc(hReadPipe, hWritePipe: ^HANDLE, lpPipeAttributes: LPSECURITY_ATTRIBUTES, nSize: DWORD) -> BOOL ---
  299. }
  300. STANDARD_RIGHTS_REQUIRED :: DWORD(0x000F0000)
  301. SECTION_QUERY :: DWORD(0x0001)
  302. SECTION_MAP_WRITE :: DWORD(0x0002)
  303. SECTION_MAP_READ :: DWORD(0x0004)
  304. SECTION_MAP_EXECUTE :: DWORD(0x0008)
  305. SECTION_EXTEND_SIZE :: DWORD(0x0010)
  306. SECTION_ALL_ACCESS :: STANDARD_RIGHTS_REQUIRED | SECTION_QUERY | SECTION_MAP_WRITE | SECTION_MAP_READ | SECTION_MAP_EXECUTE | SECTION_EXTEND_SIZE
  307. SECTION_MAP_EXECUTE_EXPLICIT :: DWORD(0x0020)
  308. FILE_MAP_WRITE :: SECTION_MAP_WRITE
  309. FILE_MAP_READ :: SECTION_MAP_READ
  310. FILE_MAP_ALL_ACCESS :: SECTION_ALL_ACCESS
  311. FILE_MAP_EXECUTE :: SECTION_MAP_EXECUTE_EXPLICIT
  312. FILE_MAP_COPY :: DWORD(0x00000001)
  313. FILE_MAP_RESERVE :: DWORD(0x80000000)
  314. FILE_MAP_TARGETS_INVALID :: DWORD(0x40000000)
  315. FILE_MAP_LARGE_PAGES :: DWORD(0x20000000)
  316. PAGE_NOACCESS :: 0x01
  317. PAGE_READONLY :: 0x02
  318. PAGE_READWRITE :: 0x04
  319. PAGE_WRITECOPY :: 0x08
  320. PAGE_EXECUTE :: 0x10
  321. PAGE_EXECUTE_READ :: 0x20
  322. PAGE_EXECUTE_READWRITE :: 0x40
  323. PAGE_EXECUTE_WRITECOPY :: 0x80
  324. PAGE_GUARD :: 0x100
  325. PAGE_NOCACHE :: 0x200
  326. PAGE_WRITECOMBINE :: 0x400
  327. MEMORY_BASIC_INFORMATION :: struct {
  328. BaseAddress: PVOID,
  329. AllocationBase: PVOID,
  330. AllocationProtect: DWORD,
  331. PartitionId: WORD,
  332. RegionSize: SIZE_T,
  333. State: DWORD,
  334. Protect: DWORD,
  335. Type: DWORD,
  336. }
  337. PMEMORY_BASIC_INFORMATION :: ^MEMORY_BASIC_INFORMATION
  338. LPMEMORY_BASIC_INFORMATION :: ^MEMORY_BASIC_INFORMATION
  339. MEM_COMMIT :: 0x1000
  340. MEM_RESERVE :: 0x2000
  341. MEM_DECOMMIT :: 0x4000
  342. MEM_RELEASE :: 0x8000
  343. MEM_FREE :: 0x10000
  344. MEM_PRIVATE :: 0x20000
  345. MEM_MAPPED :: 0x40000
  346. MEM_RESET :: 0x80000
  347. MEM_TOP_DOWN :: 0x100000
  348. MEM_LARGE_PAGES :: 0x20000000
  349. MEM_4MB_PAGES :: 0x80000000
  350. @(default_calling_convention="stdcall")
  351. foreign kernel32 {
  352. VirtualAlloc :: proc(
  353. lpAddress: LPVOID,
  354. dwSize: SIZE_T,
  355. flAllocationType: DWORD,
  356. flProtect: DWORD,
  357. ) -> LPVOID ---
  358. VirtualProtect :: proc(
  359. lpAddress: LPVOID,
  360. dwSize: SIZE_T,
  361. flNewProtect: DWORD,
  362. lpflOldProtect: PDWORD,
  363. ) -> BOOL ---
  364. VirtualFree :: proc(
  365. lpAddress: LPVOID,
  366. dwSize: SIZE_T,
  367. dwFreeType: DWORD,
  368. ) -> BOOL ---
  369. VirtualQuery :: proc(
  370. lpAddress: LPCVOID,
  371. lpBuffer: PMEMORY_BASIC_INFORMATION,
  372. dwLength: SIZE_T,
  373. ) -> SIZE_T ---
  374. VirtualAllocEx :: proc(
  375. hProcess: HANDLE,
  376. lpAddress: LPVOID,
  377. dwSize: SIZE_T,
  378. flAllocationType: DWORD,
  379. flProtect: DWORD,
  380. ) -> LPVOID ---
  381. VirtualFreeEx :: proc(
  382. hProcess: HANDLE,
  383. lpAddress: LPVOID,
  384. dwSize: SIZE_T,
  385. dwFreeType: DWORD,
  386. ) -> BOOL ---
  387. VirtualProtectEx :: proc(
  388. hProcess: HANDLE,
  389. lpAddress: LPVOID,
  390. dwSize: SIZE_T,
  391. flNewProtect: DWORD,
  392. lpflOldProtect: PDWORD,
  393. ) -> BOOL ---
  394. VirtualQueryEx :: proc(
  395. hProcess: HANDLE,
  396. lpAddress: LPCVOID,
  397. lpBuffer: PMEMORY_BASIC_INFORMATION,
  398. dwLength: SIZE_T,
  399. ) -> SIZE_T ---
  400. ReadProcessMemory :: proc(
  401. hProcess: HANDLE,
  402. lpBaseAddress: LPCVOID,
  403. lpBuffer: LPVOID,
  404. nSize: SIZE_T,
  405. lpNumberOfBytesRead: ^SIZE_T,
  406. ) -> BOOL ---
  407. WriteProcessMemory :: proc(
  408. hProcess: HANDLE,
  409. lpBaseAddress: LPVOID,
  410. lpBuffer: LPCVOID,
  411. nSize: SIZE_T,
  412. lpNumberOfBytesWritten: ^SIZE_T,
  413. ) -> BOOL ---
  414. CreateFileMappingW :: proc(
  415. hFile: HANDLE,
  416. lpFileMappingAttributes: LPSECURITY_ATTRIBUTES,
  417. flProtect: DWORD,
  418. dwMaximumSizeHigh: DWORD,
  419. dwMaximumSizeLow: DWORD,
  420. lpName: LPCWSTR,
  421. ) -> HANDLE ---
  422. OpenFileMappingW :: proc(
  423. dwDesiredAccess: DWORD,
  424. bInheritHandle: BOOL,
  425. lpName: LPCWSTR,
  426. ) -> HANDLE ---
  427. MapViewOfFile :: proc(
  428. hFileMappingObject: HANDLE,
  429. dwDesiredAccess: DWORD,
  430. dwFileOffsetHigh: DWORD,
  431. dwFileOffsetLow: DWORD,
  432. dwNumberOfBytesToMap: SIZE_T,
  433. ) -> LPVOID ---
  434. MapViewOfFileEx :: proc(
  435. hFileMappingObject: HANDLE,
  436. dwDesiredAccess: DWORD,
  437. dwFileOffsetHigh: DWORD,
  438. dwFileOffsetLow: DWORD,
  439. dwNumberOfBytesToMap: SIZE_T,
  440. lpBaseAddress: LPVOID,
  441. ) -> LPVOID ---
  442. FlushViewOfFile :: proc(
  443. lpBaseAddress: LPCVOID,
  444. dwNumberOfBytesToFlush: SIZE_T,
  445. ) -> BOOL ---
  446. UnmapViewOfFile :: proc(
  447. lpBaseAddress: LPCVOID,
  448. ) -> BOOL ---
  449. GetLargePageMinimum :: proc() -> SIZE_T ---
  450. GetProcessWorkingSetSizeEx :: proc(
  451. hProcess: HANDLE,
  452. lpMinimumWorkingSetSize: PSIZE_T,
  453. lpMaximumWorkingSetSize: PSIZE_T,
  454. Flags: PDWORD,
  455. ) -> BOOL ---
  456. SetProcessWorkingSetSizeEx :: proc(
  457. hProcess: HANDLE,
  458. dwMinimumWorkingSetSize: SIZE_T,
  459. dwMaximumWorkingSetSize: SIZE_T,
  460. Flags: DWORD,
  461. ) -> BOOL ---
  462. VirtualLock :: proc(
  463. lpAddress: LPVOID,
  464. dwSize: SIZE_T,
  465. ) -> BOOL ---
  466. VirtualUnlock :: proc(
  467. lpAddress: LPVOID,
  468. dwSize: SIZE_T,
  469. ) -> BOOL ---
  470. GetWriteWatch :: proc(
  471. dwFlags: DWORD,
  472. lpBaseAddress: PVOID,
  473. dwRegionSize: SIZE_T,
  474. lpAddresses: ^PVOID,
  475. lpdwCount: ^ULONG_PTR,
  476. lpdwGranularity: LPDWORD,
  477. ) -> UINT ---
  478. ResetWriteWatch :: proc(
  479. lpBaseAddress: LPVOID,
  480. dwRegionSize: SIZE_T,
  481. ) -> UINT ---
  482. }
  483. MEMORY_RESOURCE_NOTIFICATION_TYPE :: enum c_int {
  484. LowMemoryResourceNotification,
  485. HighMemoryResourceNotification,
  486. }
  487. LowMemoryResourceNotification :: MEMORY_RESOURCE_NOTIFICATION_TYPE.LowMemoryResourceNotification
  488. HighMemoryResourceNotification :: MEMORY_RESOURCE_NOTIFICATION_TYPE.HighMemoryResourceNotification
  489. @(default_calling_convention="stdcall")
  490. foreign kernel32 {
  491. CreateMemoryResourceNotification :: proc(
  492. NotificationType: MEMORY_RESOURCE_NOTIFICATION_TYPE,
  493. ) -> HANDLE ---
  494. QueryMemoryResourceNotification :: proc(
  495. ResourceNotificationHandle: HANDLE,
  496. ResourceState: PBOOL,
  497. ) -> BOOL ---
  498. }
  499. FILE_CACHE_MAX_HARD_ENABLE :: DWORD(0x00000001)
  500. FILE_CACHE_MAX_HARD_DISABLE :: DWORD(0x00000002)
  501. FILE_CACHE_MIN_HARD_ENABLE :: DWORD(0x00000004)
  502. FILE_CACHE_MIN_HARD_DISABLE :: DWORD(0x00000008)
  503. @(default_calling_convention="stdcall")
  504. foreign kernel32 {
  505. GetSystemFileCacheSize :: proc(
  506. lpMinimumFileCacheSize: PSIZE_T,
  507. lpMaximumFileCacheSize: PSIZE_T,
  508. lpFlags: PDWORD,
  509. ) -> BOOL ---
  510. SetSystemFileCacheSize :: proc(
  511. MinimumFileCacheSize: SIZE_T,
  512. MaximumFileCacheSize: SIZE_T,
  513. Flags: DWORD,
  514. ) -> BOOL ---
  515. CreateFileMappingNumaW :: proc(
  516. hFile: HANDLE,
  517. lpFileMappingAttributes: LPSECURITY_ATTRIBUTES,
  518. flProtect: DWORD,
  519. dwMaximumSizeHigh: DWORD,
  520. dwMaximumSizeLow: DWORD,
  521. lpName: LPCWSTR,
  522. nndPreferred: DWORD,
  523. ) -> HANDLE ---
  524. }
  525. WIN32_MEMORY_RANGE_ENTRY :: struct {
  526. VirtualAddress: PVOID,
  527. NumberOfBytes: SIZE_T,
  528. }
  529. PWIN32_MEMORY_RANGE_ENTRY :: ^WIN32_MEMORY_RANGE_ENTRY
  530. @(default_calling_convention="stdcall")
  531. foreign kernel32 {
  532. PrefetchVirtualMemory :: proc(
  533. hProcess: HANDLE,
  534. NumberOfEntries: ULONG_PTR,
  535. VirtualAddresses: PWIN32_MEMORY_RANGE_ENTRY,
  536. Flags: ULONG,
  537. ) -> BOOL ---
  538. CreateFileMappingFromApp :: proc(
  539. hFile: HANDLE,
  540. SecurityAttributes: PSECURITY_ATTRIBUTES,
  541. PageProtection: ULONG,
  542. MaximumSize: ULONG64,
  543. Name: PCWSTR,
  544. ) -> HANDLE ---
  545. MapViewOfFileFromApp :: proc(
  546. hFileMappingObject: HANDLE,
  547. DesiredAccess: ULONG,
  548. FileOffset: ULONG64,
  549. NumberOfBytesToMap: SIZE_T,
  550. ) -> PVOID ---
  551. UnmapViewOfFileEx :: proc(
  552. BaseAddress: PVOID,
  553. UnmapFlags: ULONG,
  554. ) -> BOOL ---
  555. AllocateUserPhysicalPages :: proc(
  556. hProcess: HANDLE,
  557. NumberOfPages: PULONG_PTR,
  558. PageArray: PULONG_PTR,
  559. ) -> BOOL ---
  560. FreeUserPhysicalPages :: proc(
  561. hProcess: HANDLE,
  562. NumberOfPages: PULONG_PTR,
  563. PageArray: PULONG_PTR,
  564. ) -> BOOL ---
  565. MapUserPhysicalPages :: proc(
  566. VirtualAddress: PVOID,
  567. NumberOfPages: ULONG_PTR,
  568. PageArray: PULONG_PTR,
  569. ) -> BOOL ---
  570. AllocateUserPhysicalPagesNuma :: proc(
  571. hProcess: HANDLE,
  572. NumberOfPages: PULONG_PTR,
  573. PageArray: PULONG_PTR,
  574. nndPreferred: DWORD,
  575. ) -> BOOL ---
  576. VirtualAllocExNuma :: proc(
  577. hProcess: HANDLE,
  578. lpAddress: LPVOID,
  579. dwSize: SIZE_T,
  580. flAllocationType: DWORD,
  581. flProtect: DWORD,
  582. nndPreferred: DWORD,
  583. ) -> LPVOID ---
  584. }
  585. MEHC_PATROL_SCRUBBER_PRESENT :: ULONG(0x1)
  586. @(default_calling_convention="stdcall")
  587. foreign kernel32 {
  588. GetMemoryErrorHandlingCapabilities :: proc(
  589. Capabilities: PULONG,
  590. ) -> BOOL ---
  591. }
  592. PBAD_MEMORY_CALLBACK_ROUTINE :: #type proc "stdcall" ()
  593. @(default_calling_convention="stdcall")
  594. foreign kernel32 {
  595. RegisterBadMemoryNotification :: proc(
  596. Callback: PBAD_MEMORY_CALLBACK_ROUTINE,
  597. ) -> PVOID ---
  598. UnregisterBadMemoryNotification :: proc(
  599. RegistrationHandle: PVOID,
  600. ) -> BOOL ---
  601. }
  602. OFFER_PRIORITY :: enum c_int {
  603. VmOfferPriorityVeryLow = 1,
  604. VmOfferPriorityLow,
  605. VmOfferPriorityBelowNormal,
  606. VmOfferPriorityNormal,
  607. }
  608. VmOfferPriorityVeryLow :: OFFER_PRIORITY.VmOfferPriorityVeryLow
  609. VmOfferPriorityLow :: OFFER_PRIORITY.VmOfferPriorityLow
  610. VmOfferPriorityBelowNormal :: OFFER_PRIORITY.VmOfferPriorityBelowNormal
  611. VmOfferPriorityNormal :: OFFER_PRIORITY.VmOfferPriorityNormal
  612. @(default_calling_convention="stdcall")
  613. foreign kernel32 {
  614. OfferVirtualMemory :: proc(
  615. VirtualAddress: PVOID,
  616. Size: SIZE_T,
  617. Priority: OFFER_PRIORITY,
  618. ) -> DWORD ---
  619. ReclaimVirtualMemory :: proc(
  620. VirtualAddress: PVOID,
  621. Size: SIZE_T,
  622. ) -> DWORD ---
  623. DiscardVirtualMemory :: proc(
  624. VirtualAddress: PVOID,
  625. Size: SIZE_T,
  626. ) -> DWORD ---
  627. VirtualAllocFromApp :: proc(
  628. BaseAddress: PVOID,
  629. Size: SIZE_T,
  630. AllocationType: ULONG,
  631. Protection: ULONG,
  632. ) -> PVOID ---
  633. VirtualProtectFromApp :: proc(
  634. Address: PVOID,
  635. Size: SIZE_T,
  636. NewProtection: ULONG,
  637. OldProtection: PULONG,
  638. ) -> BOOL ---
  639. OpenFileMappingFromApp :: proc(
  640. DesiredAccess: ULONG,
  641. InheritHandle: BOOL,
  642. Name: PCWSTR,
  643. ) -> HANDLE ---
  644. }
  645. WIN32_MEMORY_INFORMATION_CLASS :: enum c_int {
  646. MemoryRegionInfo,
  647. }
  648. MemoryRegionInfo :: WIN32_MEMORY_INFORMATION_CLASS.MemoryRegionInfo
  649. WIN32_MEMORY_REGION_INFORMATION :: struct {
  650. AllocationBase: PVOID,
  651. AllocationProtect: ULONG,
  652. u: WIN32_MEMORY_REGION_INFORMATION_u,
  653. RegionSize: SIZE_T,
  654. CommitSize: SIZE_T,
  655. }
  656. WIN32_MEMORY_REGION_INFORMATION_u :: struct #raw_union {
  657. u: [1]u32,
  658. Flags: ULONG,
  659. s: WIN32_MEMORY_REGION_INFORMATION_u_s,
  660. }
  661. WIN32_MEMORY_REGION_INFORMATION_u_s :: struct {
  662. Bitfield: ULONG,
  663. }
  664. WIN32_MEMORY_REGION_INFORMATION_u_s_Bitfield :: distinct ULONG
  665. /*bit_field #align align_of(ULONG) {
  666. Private : 1-0,
  667. MappedDataFile : 2-1,
  668. MappedImage : 3-2,
  669. MappedPageFile : 4-3,
  670. MappedPhysical : 5-4,
  671. DirectMapped : 6-5,
  672. Reserved : 32-6,
  673. }*/
  674. @(default_calling_convention="stdcall")
  675. foreign kernel32 {
  676. QueryVirtualMemoryInformation :: proc(
  677. Process: HANDLE,
  678. VirtualAddress: PVOID,
  679. MemoryInformationClass: WIN32_MEMORY_INFORMATION_CLASS,
  680. MemoryInformation: PVOID,
  681. MemoryInformationSize: SIZE_T,
  682. ReturnSize: PSIZE_T,
  683. ) -> BOOL ---
  684. MapViewOfFileNuma2 :: proc(
  685. FileMappingHandle: HANDLE,
  686. ProcessHandle: HANDLE,
  687. Offset: ULONG64,
  688. BaseAddress: PVOID,
  689. ViewSize: SIZE_T,
  690. AllocationType: ULONG,
  691. PageProtection: ULONG,
  692. PreferredNode: ULONG,
  693. ) -> PVOID ---
  694. }
  695. NUMA_NO_PREFERRED_NODE :: 0xffffffff
  696. MapViewOfFile2 :: #force_inline proc "stdcall" (
  697. FileMappingHandle: HANDLE,
  698. ProcessHandle: HANDLE,
  699. Offset: ULONG64,
  700. BaseAddress: PVOID,
  701. ViewSize: SIZE_T,
  702. AllocationType: ULONG,
  703. PageProtection: ULONG,
  704. ) -> PVOID {
  705. return MapViewOfFileNuma2(
  706. FileMappingHandle,
  707. ProcessHandle,
  708. Offset,
  709. BaseAddress,
  710. ViewSize,
  711. AllocationType,
  712. PageProtection,
  713. NUMA_NO_PREFERRED_NODE,
  714. )
  715. }
  716. @(default_calling_convention="stdcall")
  717. foreign kernel32 {
  718. UnmapViewOfFile2 :: proc(
  719. ProcessHandle: HANDLE,
  720. BaseAddress: PVOID,
  721. UnmapFlags: ULONG,
  722. ) -> BOOL ---
  723. }
  724. @(default_calling_convention="stdcall")
  725. foreign kernel32 {
  726. @(link_name="SetConsoleCtrlHandler") set_console_ctrl_handler :: proc(handler: Handler_Routine, add: BOOL) -> BOOL ---
  727. }
  728. Handler_Routine :: proc(dwCtrlType: Control_Event) -> BOOL
  729. Control_Event :: enum DWORD {
  730. control_c = 0,
  731. _break = 1,
  732. close = 2,
  733. logoff = 5,
  734. shutdown = 6,
  735. }