├── .gitignore ├── LICENSE ├── README.md ├── build.zig └── src ├── main.zig └── win32 ├── c.zig ├── lean_and_mean.zig └── psapi.zig /.gitignore: -------------------------------------------------------------------------------- 1 | zig-cache 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Rickard Andersson 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # zig-win32 2 | 3 | ## Archived 4 | 5 | I would suggest using [this library](https://github.com/marlersoft/zigwin32) instead. 6 | If there is some reason you cannot, feel free to reach out and I'll unarchive this so 7 | people can continue to work on it if they want. 8 | 9 | ## Linking 10 | 11 | You will need to add something like the following to your `build.zig` depending 12 | on what you end up using: 13 | 14 | If you're using the `win32.c` module, most functions are annotated with their 15 | library information, so you don't need to link anything, but at the time of 16 | writing the `lean_and_mean` module is not annotated. With that in mind, you may 17 | have to add build instructions like the following, depending on which functions 18 | you use: 19 | 20 | ```zig 21 | const exe = b.addExecutable("executable-name", "src/main.zig"); 22 | exe.addPackagePath("win32", "./dependencies/zig-win32/src/main.zig"); 23 | exe.linkSystemLibrary("c"); 24 | exe.linkSystemLibrary("gdi32"); 25 | exe.linkSystemLibrary("user32"); 26 | exe.linkSystemLibrary("kernel32"); 27 | ``` 28 | 29 | ## Usage in files 30 | 31 | A simple import will do it, access the sub-namespaces with `c` and 32 | `lean_and_mean`: 33 | 34 | ```zig 35 | const win32 = @import("win32"); 36 | _ = win32.c.MessageBoxA(...); 37 | ``` 38 | 39 | Or import one of the sub-namespaces directly: 40 | 41 | ```zig 42 | const win32 = @import("win32").lean_and_mean; 43 | _ = win32.MessageBoxA(...); 44 | ``` 45 | 46 | ## Macros not available in the FFI files 47 | 48 | `MAKEINTRESOURCE{A,W}` is not available in the generated files, but is available 49 | in the top namespace: 50 | 51 | ```zig 52 | const win32 = @import("win32"); 53 | const resource: windows.LPSTR = win32.MAKEINTRESOURCEA(32512); 54 | ``` 55 | -------------------------------------------------------------------------------- /build.zig: -------------------------------------------------------------------------------- 1 | const Builder = @import("std").build.Builder; 2 | 3 | pub fn build(b: *Builder) void { 4 | const mode = b.standardReleaseOptions(); 5 | const lib = b.addStaticLibrary("win32", "src/main.zig"); 6 | lib.setBuildMode(mode); 7 | lib.install(); 8 | 9 | var tests = b.addTest("src/main.zig"); 10 | tests.setBuildMode(mode); 11 | 12 | const test_step = b.step("test", "Run tests"); 13 | test_step.dependOn(&tests.step); 14 | } 15 | -------------------------------------------------------------------------------- /src/main.zig: -------------------------------------------------------------------------------- 1 | const std = @import("std"); 2 | const windows = std.os.windows; 3 | const testing = std.testing; 4 | 5 | pub const c = @import("./win32/c.zig"); 6 | pub const lean_and_mean = @import("./win32/lean_and_mean.zig"); 7 | pub const psapi = @import("./win32/psapi.zig"); 8 | 9 | pub fn makeIntResourceA(value: windows.INT) windows.LPSTR { 10 | return @ptrCast(windows.LPSTR, @intToPtr(*windows.ULONG_PTR, @intCast(windows.WORD, value))); 11 | } 12 | 13 | pub fn makeIntResourceW(value: windows.INT) windows.LPSTR { 14 | return @ptrCast(windows.LPWSTR, @intToPtr(*windows.ULONG_PTR, @intCast(windows.WORD, value))); 15 | } 16 | 17 | /// Takes the lower 32 bits of a value `x: T`. Really only meant to be used with `DWORD`-like 18 | /// things in the Win32 API. 19 | pub fn lowWord(comptime T: type, x: T) T { 20 | return x & 0xffff; 21 | } 22 | 23 | /// Extracts the upper 32 bits of a value `x: T`. Really only meant to be used with `DWORD`-like 24 | /// things in the Win32 API. 25 | pub fn highWord(comptime T: type, x: T) T { 26 | return (x & 0xffff0000) >> 16; 27 | } 28 | 29 | test "high & low word" { 30 | const x = 0xaaaaff0f00f0; 31 | const high = highWord(u64, x); 32 | const low = lowWord(u64, x); 33 | 34 | testing.expectEqual(high, 0xff0f); 35 | testing.expectEqual(low, 0x00f0); 36 | } 37 | -------------------------------------------------------------------------------- /src/win32/psapi.zig: -------------------------------------------------------------------------------- 1 | const std = @import("std"); 2 | const win32 = @import("./c.zig"); 3 | 4 | pub const EmptyWorkingSet = K32EmptyWorkingSet; 5 | pub extern "kernel32" fn K32EmptyWorkingSet(hProcess: win32.HANDLE) win32.BOOL; 6 | 7 | pub const EnumDeviceDrivers = K32EnumDeviceDrivers; 8 | pub extern "kernel32" fn K32EnumDeviceDrivers( 9 | lpImageBase: [*c]win32.LPVOID, 10 | cb: win32.DWORD, 11 | lpcbNeeded: win32.LPDWORD, 12 | ) win32.BOOL; 13 | 14 | pub const EnumPageFiles = EnumPageFilesA; 15 | pub const EnumPageFilesA = K32EnumPageFilesA; 16 | pub const EnumPageFilesW = K32EnumPageFilesW; 17 | pub extern "kernel32" fn K32EnumPageFilesW( 18 | pCallBackRoutine: PENUM_PAGE_FILE_CALLBACKW, 19 | pContext: win32.LPVOID, 20 | ) win32.BOOL; 21 | pub extern "kernel32" fn K32EnumPageFilesA( 22 | pCallBackRoutine: PENUM_PAGE_FILE_CALLBACKA, 23 | pContext: win32.LPVOID, 24 | ) win32.BOOL; 25 | 26 | pub const PENUM_PAGE_FILE_CALLBACKW = ?fn ( 27 | win32.LPVOID, 28 | PENUM_PAGE_FILE_INFORMATION, 29 | win32.LPCWSTR, 30 | ) callconv(std.os.windows.WINAPI) win32.BOOL; 31 | pub const PENUM_PAGE_FILE_CALLBACKA = ?fn ( 32 | win32.LPVOID, 33 | PENUM_PAGE_FILE_INFORMATION, 34 | win32.LPCSTR, 35 | ) callconv(std.os.windows.WINAPI) win32.BOOL; 36 | 37 | pub const struct__ENUM_PAGE_FILE_INFORMATION = extern struct { 38 | cb: win32.DWORD, 39 | Reserved: win32.DWORD, 40 | TotalSize: win32.SIZE_T, 41 | TotalInUse: win32.SIZE_T, 42 | PeakUsage: win32.SIZE_T, 43 | }; 44 | pub const ENUM_PAGE_FILE_INFORMATION = struct__ENUM_PAGE_FILE_INFORMATION; 45 | pub const PENUM_PAGE_FILE_INFORMATION = [*c]struct__ENUM_PAGE_FILE_INFORMATION; 46 | 47 | pub extern "kernel32" fn K32EnumProcesses( 48 | lpidProcess: [*c]win32.DWORD, 49 | cb: win32.DWORD, 50 | lpcbNeeded: win32.LPDWORD, 51 | ) win32.BOOL; 52 | pub const EnumProcesses = K32EnumProcesses; 53 | 54 | pub const EnumProcessModulesEx = K32EnumProcessModulesEx; 55 | pub const EnumProcessModules = K32EnumProcessModules; 56 | 57 | pub extern "kernel32" fn K32EnumProcessModules( 58 | hProcess: win32.HANDLE, 59 | lphModule: [*c]win32.HMODULE, 60 | cb: win32.DWORD, 61 | lpcbNeeded: win32.LPDWORD, 62 | ) win32.BOOL; 63 | pub extern "kernel32" fn K32EnumProcessModulesEx( 64 | hProcess: win32.HANDLE, 65 | lphModule: [*c]win32.HMODULE, 66 | cb: win32.DWORD, 67 | lpcbNeeded: win32.LPDWORD, 68 | dwFilterFlag: win32.DWORD, 69 | ) win32.BOOL; 70 | 71 | pub extern "kernel32" fn K32GetDeviceDriverBaseNameA( 72 | ImageBase: win32.LPVOID, 73 | lpFilename: win32.LPSTR, 74 | nSize: win32.DWORD, 75 | ) win32.DWORD; 76 | pub extern "kernel32" fn K32GetDeviceDriverBaseNameW( 77 | ImageBase: win32.LPVOID, 78 | lpBaseName: win32.LPWSTR, 79 | nSize: win32.DWORD, 80 | ) win32.DWORD; 81 | pub const GetDeviceDriverBaseName = GetDeviceDriverBaseNameA; 82 | pub const GetDeviceDriverBaseNameA = K32GetDeviceDriverBaseNameA; 83 | pub const GetDeviceDriverBaseNameW = K32GetDeviceDriverBaseNameW; 84 | 85 | pub extern "kernel32" fn K32GetDeviceDriverFileNameA( 86 | ImageBase: win32.LPVOID, 87 | lpFilename: win32.LPSTR, 88 | nSize: win32.DWORD, 89 | ) win32.DWORD; 90 | pub extern "kernel32" fn K32GetDeviceDriverFileNameW( 91 | ImageBase: win32.LPVOID, 92 | lpFilename: win32.LPWSTR, 93 | nSize: win32.DWORD, 94 | ) win32.DWORD; 95 | pub const GetDeviceDriverFileNameA = K32GetDeviceDriverFileNameA; 96 | pub const GetDeviceDriverFileName = GetDeviceDriverFileNameA; 97 | pub const GetDeviceDriverFileNameW = K32GetDeviceDriverFileNameW; 98 | 99 | pub extern "kernel32" fn K32GetMappedFileNameW( 100 | hProcess: win32.HANDLE, 101 | lpv: win32.LPVOID, 102 | lpFilename: win32.LPWSTR, 103 | nSize: win32.DWORD, 104 | ) win32.DWORD; 105 | pub extern "kernel32" fn K32GetMappedFileNameA( 106 | hProcess: win32.HANDLE, 107 | lpv: win32.LPVOID, 108 | lpFilename: win32.LPSTR, 109 | nSize: win32.DWORD, 110 | ) win32.DWORD; 111 | pub const GetMappedFileNameW = K32GetMappedFileNameW; 112 | pub const GetMappedFileNameA = K32GetMappedFileNameA; 113 | pub const GetMappedFileName = GetMappedFileNameA; 114 | 115 | pub extern "kernel32" fn K32GetModuleBaseNameA( 116 | hProcess: win32.HANDLE, 117 | hModule: win32.HMODULE, 118 | lpBaseName: win32.LPSTR, 119 | nSize: win32.DWORD, 120 | ) win32.DWORD; 121 | pub extern "kernel32" fn K32GetModuleBaseNameW( 122 | hProcess: win32.HANDLE, 123 | hModule: win32.HMODULE, 124 | lpBaseName: win32.LPWSTR, 125 | nSize: win32.DWORD, 126 | ) win32.DWORD; 127 | pub extern "kernel32" fn K32GetModuleFileNameExA( 128 | hProcess: win32.HANDLE, 129 | hModule: win32.HMODULE, 130 | lpFilename: win32.LPSTR, 131 | nSize: win32.DWORD, 132 | ) win32.DWORD; 133 | pub extern "kernel32" fn K32GetModuleFileNameExW( 134 | hProcess: win32.HANDLE, 135 | hModule: win32.HMODULE, 136 | lpFilename: win32.LPWSTR, 137 | nSize: win32.DWORD, 138 | ) win32.DWORD; 139 | pub extern "kernel32" fn GetModuleFileNameA( 140 | hModule: win32.HMODULE, 141 | lpFilename: win32.LPSTR, 142 | nSize: win32.DWORD, 143 | ) win32.DWORD; 144 | pub extern "kernel32" fn GetModuleFileNameW( 145 | hModule: win32.HMODULE, 146 | lpFilename: win32.LPWSTR, 147 | nSize: win32.DWORD, 148 | ) win32.DWORD; 149 | pub const GetModuleBaseNameW = K32GetModuleBaseNameW; 150 | pub const GetModuleBaseName = GetModuleBaseNameA; 151 | pub const GetModuleBaseNameA = K32GetModuleBaseNameA; 152 | pub const GetModuleFileName = GetModuleFileNameA; 153 | pub const GetModuleFileNameEx = GetModuleFileNameExA; 154 | pub const GetModuleFileNameExA = K32GetModuleFileNameExA; 155 | pub const GetModuleFileNameExW = K32GetModuleFileNameExW; 156 | 157 | pub extern "kernel32" fn K32GetModuleInformation( 158 | hProcess: win32.HANDLE, 159 | hModule: win32.HMODULE, 160 | lpmodinfo: LPMODULEINFO, 161 | cb: win32.DWORD, 162 | ) BOOL; 163 | pub const GetModuleInformation = K32GetModuleInformation; 164 | 165 | pub const struct__MODULEINFO = extern struct { 166 | lpBaseOfDll: win32.LPVOID, 167 | SizeOfImage: win32.DWORD, 168 | EntryPoint: win32.LPVOID, 169 | }; 170 | pub const MODULEINFO = struct__MODULEINFO; 171 | pub const LPMODULEINFO = [*c]struct__MODULEINFO; 172 | 173 | pub extern "kernel32" fn K32GetPerformanceInfo( 174 | pPerformanceInformation: PPERFORMANCE_INFORMATION, 175 | cb: win32.DWORD, 176 | ) win32.BOOL; 177 | pub const GetPerformanceInfo = K32GetPerformanceInfo; 178 | 179 | pub const struct__PERFORMANCE_INFORMATION = extern struct { 180 | cb: win32.DWORD, 181 | CommitTotal: win32.SIZE_T, 182 | CommitLimit: win32.SIZE_T, 183 | CommitPeak: win32.SIZE_T, 184 | PhysicalTotal: win32.SIZE_T, 185 | PhysicalAvailable: win32.SIZE_T, 186 | SystemCache: win32.SIZE_T, 187 | KernelTotal: win32.SIZE_T, 188 | KernelPaged: win32.SIZE_T, 189 | KernelNonpaged: win32.SIZE_T, 190 | PageSize: win32.SIZE_T, 191 | HandleCount: win32.DWORD, 192 | ProcessCount: win32.DWORD, 193 | ThreadCount: win32.DWORD, 194 | }; 195 | pub const PERFORMANCE_INFORMATION = struct__PERFORMANCE_INFORMATION; 196 | pub const PPERFORMANCE_INFORMATION = [*c]struct__PERFORMANCE_INFORMATION; 197 | pub const PERFORMACE_INFORMATION = struct__PERFORMANCE_INFORMATION; 198 | pub const PPERFORMACE_INFORMATION = [*c]struct__PERFORMANCE_INFORMATION; 199 | 200 | pub extern "kernel32" fn K32GetProcessImageFileNameA( 201 | hProcess: win32.HANDLE, 202 | lpImageFileName: win32.LPSTR, 203 | nSize: win32.DWORD, 204 | ) win32.DWORD; 205 | pub extern "kernel32" fn K32GetProcessImageFileNameW( 206 | hProcess: win32.HANDLE, 207 | lpImageFileName: win32.LPWSTR, 208 | nSize: win32.DWORD, 209 | ) win32.DWORD; 210 | pub const GetProcessImageFileNameA = K32GetProcessImageFileNameA; 211 | pub const GetProcessImageFileNameW = K32GetProcessImageFileNameW; 212 | pub const GetProcessImageFileName = GetProcessImageFileNameA; 213 | 214 | pub extern "kernel32" fn K32GetProcessMemoryInfo( 215 | Process: win32.HANDLE, 216 | ppsmemCounters: PPROCESS_MEMORY_COUNTERS, 217 | cb: win32.DWORD, 218 | ) win32.BOOL; 219 | pub const GetProcessMemoryInfo = K32GetProcessMemoryInfo; 220 | 221 | pub const struct__PROCESS_MEMORY_COUNTERS = extern struct { 222 | cb: win32.DWORD, 223 | PageFaultCount: win32.DWORD, 224 | PeakWorkingSetSize: win32.SIZE_T, 225 | WorkingSetSize: win32.SIZE_T, 226 | QuotaPeakPagedPoolUsage: win32.SIZE_T, 227 | QuotaPagedPoolUsage: win32.SIZE_T, 228 | QuotaPeakNonPagedPoolUsage: win32.SIZE_T, 229 | QuotaNonPagedPoolUsage: win32.SIZE_T, 230 | PagefileUsage: win32.SIZE_T, 231 | PeakPagefileUsage: win32.SIZE_T, 232 | }; 233 | pub const PROCESS_MEMORY_COUNTERS = struct__PROCESS_MEMORY_COUNTERS; 234 | pub const PPROCESS_MEMORY_COUNTERS = [*c]PROCESS_MEMORY_COUNTERS; 235 | pub const struct__PROCESS_MEMORY_COUNTERS_EX = extern struct { 236 | cb: win32.DWORD, 237 | PageFaultCount: win32.DWORD, 238 | PeakWorkingSetSize: win32.SIZE_T, 239 | WorkingSetSize: win32.SIZE_T, 240 | QuotaPeakPagedPoolUsage: win32.SIZE_T, 241 | QuotaPagedPoolUsage: win32.SIZE_T, 242 | QuotaPeakNonPagedPoolUsage: win32.SIZE_T, 243 | QuotaNonPagedPoolUsage: win32.SIZE_T, 244 | PagefileUsage: win32.SIZE_T, 245 | PeakPagefileUsage: win32.SIZE_T, 246 | PrivateUsage: win32.SIZE_T, 247 | }; 248 | pub const PROCESS_MEMORY_COUNTERS_EX = struct__PROCESS_MEMORY_COUNTERS_EX; 249 | pub const PPROCESS_MEMORY_COUNTERS_EX = [*c]PROCESS_MEMORY_COUNTERS_EX; 250 | 251 | pub extern "kernel32" fn K32QueryWorkingSet( 252 | hProcess: win32.HANDLE, 253 | pv: win32.PVOID, 254 | cb: win32.DWORD, 255 | ) win32.BOOL; 256 | pub extern "kernel32" fn K32QueryWorkingSetEx( 257 | hProcess: win32.HANDLE, 258 | pv: win32.PVOID, 259 | cb: win32.DWORD, 260 | ) win32.BOOL; 261 | pub const QueryWorkingSetEx = K32QueryWorkingSetEx; 262 | pub const QueryWorkingSet = K32QueryWorkingSet; 263 | 264 | pub extern "kernel32" fn K32InitializeProcessForWsWatch(hProcess: win32.HANDLE) win32.BOOL; 265 | pub const InitializeProcessForWsWatch = K32InitializeProcessForWsWatch; 266 | 267 | pub extern "kernel32" fn K32GetWsChanges( 268 | hProcess: win32.HANDLE, 269 | lpWatchInfo: PPSAPI_WS_WATCH_INFORMATION, 270 | cb: win32.DWORD, 271 | ) win32.BOOL; 272 | pub extern "kernel32" fn K32GetWsChangesEx( 273 | hProcess: win32.HANDLE, 274 | lpWatchInfoEx: PPSAPI_WS_WATCH_INFORMATION_EX, 275 | cb: win32.PDWORD, 276 | ) win32.BOOL; 277 | 278 | pub const struct__PSAPI_WS_WATCH_INFORMATION = extern struct { 279 | FaultingPc: win32.LPVOID, 280 | FaultingVa: win32.LPVOID, 281 | }; 282 | pub const PSAPI_WS_WATCH_INFORMATION = struct__PSAPI_WS_WATCH_INFORMATION; 283 | pub const PPSAPI_WS_WATCH_INFORMATION = [*c]struct__PSAPI_WS_WATCH_INFORMATION; 284 | pub const struct__PSAPI_WS_WATCH_INFORMATION_EX = extern struct { 285 | BasicInfo: PSAPI_WS_WATCH_INFORMATION, 286 | FaultingThreadId: win32.ULONG_PTR, 287 | Flags: win32.ULONG_PTR, 288 | }; 289 | pub const PSAPI_WS_WATCH_INFORMATION_EX = struct__PSAPI_WS_WATCH_INFORMATION_EX; 290 | pub const PPSAPI_WS_WATCH_INFORMATION_EX = [*c]struct__PSAPI_WS_WATCH_INFORMATION_EX; 291 | 292 | const struct_unnamed_258 = opaque {}; // C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um\psapi.h:277:19: warning: struct demoted to opaque type - has bitfield 293 | pub const union__PSAPI_WORKING_SET_BLOCK = extern union { 294 | Flags: win32.ULONG_PTR, 295 | unnamed_0: struct_unnamed_258, 296 | }; 297 | pub const PSAPI_WORKING_SET_BLOCK = union__PSAPI_WORKING_SET_BLOCK; 298 | pub const PPSAPI_WORKING_SET_BLOCK = [*c]union__PSAPI_WORKING_SET_BLOCK; 299 | pub const struct__PSAPI_WORKING_SET_INFORMATION = extern struct { 300 | NumberOfEntries: win32.ULONG_PTR, 301 | WorkingSetInfo: [1]PSAPI_WORKING_SET_BLOCK, 302 | }; 303 | pub const PSAPI_WORKING_SET_INFORMATION = struct__PSAPI_WORKING_SET_INFORMATION; 304 | pub const PPSAPI_WORKING_SET_INFORMATION = [*c]struct__PSAPI_WORKING_SET_INFORMATION; 305 | const struct_unnamed_260 = opaque {}; // C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um\psapi.h:298:23: warning: struct demoted to opaque type - has bitfield 306 | const struct_unnamed_261 = opaque {}; // C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um\psapi.h:313:23: warning: struct demoted to opaque type - has bitfield 307 | const union_unnamed_259 = extern union { 308 | unnamed_0: struct_unnamed_260, 309 | Invalid: struct_unnamed_261, 310 | }; 311 | pub const union__PSAPI_WORKING_SET_EX_BLOCK = extern union { 312 | Flags: win32.ULONG_PTR, 313 | unnamed_0: union_unnamed_259, 314 | }; 315 | pub const PSAPI_WORKING_SET_EX_BLOCK = union__PSAPI_WORKING_SET_EX_BLOCK; 316 | pub const PPSAPI_WORKING_SET_EX_BLOCK = [*c]union__PSAPI_WORKING_SET_EX_BLOCK; 317 | pub const struct__PSAPI_WORKING_SET_EX_INFORMATION = extern struct { 318 | VirtualAddress: win32.PVOID, 319 | VirtualAttributes: PSAPI_WORKING_SET_EX_BLOCK, 320 | }; 321 | pub const PSAPI_WORKING_SET_EX_INFORMATION = struct__PSAPI_WORKING_SET_EX_INFORMATION; 322 | pub const PPSAPI_WORKING_SET_EX_INFORMATION = [*c]struct__PSAPI_WORKING_SET_EX_INFORMATION; 323 | 324 | pub const LIST_MODULES_64BIT = 0x02; 325 | pub const LIST_MODULES_DEFAULT = 0x0; 326 | pub const LIST_MODULES_ALL = LIST_MODULES_32BIT | LIST_MODULES_64BIT; 327 | pub const LIST_MODULES_32BIT = 0x01; 328 | --------------------------------------------------------------------------------