kernel32.odin 22 KB

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