kernel32.odin 23 KB

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