kernel32.odin 21 KB

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