| ... | ... | @@ -5,90 +5,59 @@ const BOOL = windows.BOOL; |
| 5 | 5 | const BOOLEAN = windows.BOOLEAN; |
| 6 | 6 | const CONDITION_VARIABLE = windows.CONDITION_VARIABLE; |
| 7 | 7 | const CONSOLE_SCREEN_BUFFER_INFO = windows.CONSOLE_SCREEN_BUFFER_INFO; |
| 8 | | const CONTEXT = windows.CONTEXT; |
| 9 | 8 | const COORD = windows.COORD; |
| 9 | const CRITICAL_SECTION = windows.CRITICAL_SECTION; |
| 10 | 10 | const DWORD = windows.DWORD; |
| 11 | | const DWORD64 = windows.DWORD64; |
| 12 | | const FILE_INFO_BY_HANDLE_CLASS = windows.FILE_INFO_BY_HANDLE_CLASS; |
| 11 | const FARPROC = windows.FARPROC; |
| 12 | const FILETIME = windows.FILETIME; |
| 13 | 13 | const HANDLE = windows.HANDLE; |
| 14 | const HANDLER_ROUTINE = windows.HANDLER_ROUTINE; |
| 15 | const HLOCAL = windows.HLOCAL; |
| 14 | 16 | const HMODULE = windows.HMODULE; |
| 15 | | const HKEY = windows.HKEY; |
| 16 | | const HRESULT = windows.HRESULT; |
| 17 | const INIT_ONCE = windows.INIT_ONCE; |
| 18 | const INIT_ONCE_FN = windows.INIT_ONCE_FN; |
| 17 | 19 | const LARGE_INTEGER = windows.LARGE_INTEGER; |
| 20 | const LPCSTR = windows.LPCSTR; |
| 21 | const LPCVOID = windows.LPCVOID; |
| 18 | 22 | const LPCWSTR = windows.LPCWSTR; |
| 19 | 23 | const LPTHREAD_START_ROUTINE = windows.LPTHREAD_START_ROUTINE; |
| 20 | 24 | const LPVOID = windows.LPVOID; |
| 21 | 25 | const LPWSTR = windows.LPWSTR; |
| 22 | | const MODULEINFO = windows.MODULEINFO; |
| 26 | const MODULEENTRY32 = windows.MODULEENTRY32; |
| 23 | 27 | const OVERLAPPED = windows.OVERLAPPED; |
| 24 | | const PERFORMANCE_INFORMATION = windows.PERFORMANCE_INFORMATION; |
| 25 | | const PROCESS_MEMORY_COUNTERS = windows.PROCESS_MEMORY_COUNTERS; |
| 26 | | const PSAPI_WS_WATCH_INFORMATION = windows.PSAPI_WS_WATCH_INFORMATION; |
| 27 | | const PSAPI_WS_WATCH_INFORMATION_EX = windows.PSAPI_WS_WATCH_INFORMATION_EX; |
| 28 | const OVERLAPPED_ENTRY = windows.OVERLAPPED_ENTRY; |
| 29 | const PMEMORY_BASIC_INFORMATION = windows.PMEMORY_BASIC_INFORMATION; |
| 30 | const PROCESS_INFORMATION = windows.PROCESS_INFORMATION; |
| 28 | 31 | const SECURITY_ATTRIBUTES = windows.SECURITY_ATTRIBUTES; |
| 29 | 32 | const SIZE_T = windows.SIZE_T; |
| 30 | 33 | const SRWLOCK = windows.SRWLOCK; |
| 34 | const STARTUPINFOW = windows.STARTUPINFOW; |
| 35 | const UCHAR = windows.UCHAR; |
| 31 | 36 | const UINT = windows.UINT; |
| 37 | const ULONG = windows.ULONG; |
| 38 | const ULONG_PTR = windows.ULONG_PTR; |
| 39 | const va_list = windows.va_list; |
| 32 | 40 | const VECTORED_EXCEPTION_HANDLER = windows.VECTORED_EXCEPTION_HANDLER; |
| 33 | 41 | const WCHAR = windows.WCHAR; |
| 42 | const WIN32_FIND_DATAW = windows.WIN32_FIND_DATAW; |
| 43 | const Win32Error = windows.Win32Error; |
| 34 | 44 | const WINAPI = windows.WINAPI; |
| 35 | 45 | const WORD = windows.WORD; |
| 36 | | const Win32Error = windows.Win32Error; |
| 37 | | const va_list = windows.va_list; |
| 38 | | const HLOCAL = windows.HLOCAL; |
| 39 | | const FILETIME = windows.FILETIME; |
| 40 | | const STARTUPINFOW = windows.STARTUPINFOW; |
| 41 | | const PROCESS_INFORMATION = windows.PROCESS_INFORMATION; |
| 42 | | const OVERLAPPED_ENTRY = windows.OVERLAPPED_ENTRY; |
| 43 | | const LPHEAP_SUMMARY = windows.LPHEAP_SUMMARY; |
| 44 | | const ULONG_PTR = windows.ULONG_PTR; |
| 45 | | const FILE_NOTIFY_INFORMATION = windows.FILE_NOTIFY_INFORMATION; |
| 46 | | const HANDLER_ROUTINE = windows.HANDLER_ROUTINE; |
| 47 | | const ULONG = windows.ULONG; |
| 48 | | const PVOID = windows.PVOID; |
| 49 | | const LPSTR = windows.LPSTR; |
| 50 | | const PENUM_PAGE_FILE_CALLBACKA = windows.PENUM_PAGE_FILE_CALLBACKA; |
| 51 | | const PENUM_PAGE_FILE_CALLBACKW = windows.PENUM_PAGE_FILE_CALLBACKW; |
| 52 | | const INIT_ONCE = windows.INIT_ONCE; |
| 53 | | const CRITICAL_SECTION = windows.CRITICAL_SECTION; |
| 54 | | const WIN32_FIND_DATAW = windows.WIN32_FIND_DATAW; |
| 55 | | const CHAR = windows.CHAR; |
| 56 | | const BY_HANDLE_FILE_INFORMATION = windows.BY_HANDLE_FILE_INFORMATION; |
| 57 | | const SYSTEM_INFO = windows.SYSTEM_INFO; |
| 58 | | const LPOVERLAPPED_COMPLETION_ROUTINE = windows.LPOVERLAPPED_COMPLETION_ROUTINE; |
| 59 | | const UCHAR = windows.UCHAR; |
| 60 | | const FARPROC = windows.FARPROC; |
| 61 | | const INIT_ONCE_FN = windows.INIT_ONCE_FN; |
| 62 | | const PMEMORY_BASIC_INFORMATION = windows.PMEMORY_BASIC_INFORMATION; |
| 63 | | const REGSAM = windows.REGSAM; |
| 64 | | const LSTATUS = windows.LSTATUS; |
| 65 | | const UNWIND_HISTORY_TABLE = windows.UNWIND_HISTORY_TABLE; |
| 66 | | const RUNTIME_FUNCTION = windows.RUNTIME_FUNCTION; |
| 67 | | const KNONVOLATILE_CONTEXT_POINTERS = windows.KNONVOLATILE_CONTEXT_POINTERS; |
| 68 | | const EXCEPTION_ROUTINE = windows.EXCEPTION_ROUTINE; |
| 69 | | const MODULEENTRY32 = windows.MODULEENTRY32; |
| 70 | | const ULONGLONG = windows.ULONGLONG; |
| 71 | | |
| 72 | | pub extern "kernel32" fn AddVectoredExceptionHandler(First: c_ulong, Handler: ?VECTORED_EXCEPTION_HANDLER) callconv(WINAPI) ?*anyopaque; |
| 73 | | pub extern "kernel32" fn RemoveVectoredExceptionHandler(Handle: HANDLE) callconv(WINAPI) c_ulong; |
| 74 | | |
| 75 | | pub extern "kernel32" fn CancelIo(hFile: HANDLE) callconv(WINAPI) BOOL; |
| 76 | | pub extern "kernel32" fn CancelIoEx(hFile: HANDLE, lpOverlapped: ?*OVERLAPPED) callconv(WINAPI) BOOL; |
| 77 | 46 | |
| 78 | | pub extern "kernel32" fn CloseHandle(hObject: HANDLE) callconv(WINAPI) BOOL; |
| 79 | | |
| 80 | | pub extern "kernel32" fn CreateDirectoryW(lpPathName: [*:0]const u16, lpSecurityAttributes: ?*SECURITY_ATTRIBUTES) callconv(WINAPI) BOOL; |
| 81 | | pub extern "kernel32" fn SetEndOfFile(hFile: HANDLE) callconv(WINAPI) BOOL; |
| 47 | // I/O - Filesystem |
| 48 | // TODO: Wrapper around NtCancelIoFile. |
| 49 | pub extern "kernel32" fn CancelIo( |
| 50 | hFile: HANDLE, |
| 51 | ) callconv(WINAPI) BOOL; |
| 82 | 52 | |
| 83 | | pub extern "kernel32" fn CreateEventExW( |
| 84 | | lpEventAttributes: ?*SECURITY_ATTRIBUTES, |
| 85 | | lpName: ?LPCWSTR, |
| 86 | | dwFlags: DWORD, |
| 87 | | dwDesiredAccess: DWORD, |
| 88 | | ) callconv(WINAPI) ?HANDLE; |
| 53 | // TODO: Wrapper around NtCancelIoFileEx. |
| 54 | pub extern "kernel32" fn CancelIoEx( |
| 55 | hFile: HANDLE, |
| 56 | lpOverlapped: ?*OVERLAPPED, |
| 57 | ) callconv(WINAPI) BOOL; |
| 89 | 58 | |
| 90 | 59 | pub extern "kernel32" fn CreateFileW( |
| 91 | | lpFileName: [*:0]const u16, |
| 60 | lpFileName: LPCWSTR, |
| 92 | 61 | dwDesiredAccess: DWORD, |
| 93 | 62 | dwShareMode: DWORD, |
| 94 | 63 | lpSecurityAttributes: ?*SECURITY_ATTRIBUTES, |
| ... | ... | @@ -97,13 +66,7 @@ pub extern "kernel32" fn CreateFileW( |
| 97 | 66 | hTemplateFile: ?HANDLE, |
| 98 | 67 | ) callconv(WINAPI) HANDLE; |
| 99 | 68 | |
| 100 | | pub extern "kernel32" fn CreatePipe( |
| 101 | | hReadPipe: *HANDLE, |
| 102 | | hWritePipe: *HANDLE, |
| 103 | | lpPipeAttributes: *const SECURITY_ATTRIBUTES, |
| 104 | | nSize: DWORD, |
| 105 | | ) callconv(WINAPI) BOOL; |
| 106 | | |
| 69 | // TODO A bunch of logic around NtCreateNamedPipe |
| 107 | 70 | pub extern "kernel32" fn CreateNamedPipeW( |
| 108 | 71 | lpName: LPCWSTR, |
| 109 | 72 | dwOpenMode: DWORD, |
| ... | ... | @@ -115,349 +78,584 @@ pub extern "kernel32" fn CreateNamedPipeW( |
| 115 | 78 | lpSecurityAttributes: ?*const SECURITY_ATTRIBUTES, |
| 116 | 79 | ) callconv(WINAPI) HANDLE; |
| 117 | 80 | |
| 118 | | pub extern "kernel32" fn CreateProcessW( |
| 119 | | lpApplicationName: ?LPCWSTR, |
| 120 | | lpCommandLine: ?LPWSTR, |
| 121 | | lpProcessAttributes: ?*SECURITY_ATTRIBUTES, |
| 122 | | lpThreadAttributes: ?*SECURITY_ATTRIBUTES, |
| 123 | | bInheritHandles: BOOL, |
| 124 | | dwCreationFlags: DWORD, |
| 125 | | lpEnvironment: ?*anyopaque, |
| 126 | | lpCurrentDirectory: ?LPCWSTR, |
| 127 | | lpStartupInfo: *STARTUPINFOW, |
| 128 | | lpProcessInformation: *PROCESS_INFORMATION, |
| 81 | pub extern "kernel32" fn FindFirstFileW( |
| 82 | lpFileName: LPCWSTR, |
| 83 | lpFindFileData: *WIN32_FIND_DATAW, |
| 84 | ) callconv(WINAPI) HANDLE; |
| 85 | |
| 86 | pub extern "kernel32" fn FindClose( |
| 87 | hFindFile: HANDLE, |
| 129 | 88 | ) callconv(WINAPI) BOOL; |
| 130 | 89 | |
| 131 | | pub extern "kernel32" fn CreateSymbolicLinkW(lpSymlinkFileName: [*:0]const u16, lpTargetFileName: [*:0]const u16, dwFlags: DWORD) callconv(WINAPI) BOOLEAN; |
| 90 | // TODO: Wrapper around RtlGetFullPathName_UEx |
| 91 | pub extern "kernel32" fn GetFullPathNameW( |
| 92 | lpFileName: LPCWSTR, |
| 93 | nBufferLength: DWORD, |
| 94 | lpBuffer: LPWSTR, |
| 95 | lpFilePart: ?*?LPWSTR, |
| 96 | ) callconv(WINAPI) DWORD; |
| 132 | 97 | |
| 133 | | pub extern "kernel32" fn CreateIoCompletionPort(FileHandle: HANDLE, ExistingCompletionPort: ?HANDLE, CompletionKey: ULONG_PTR, NumberOfConcurrentThreads: DWORD) callconv(WINAPI) ?HANDLE; |
| 98 | // TODO: Matches `STD_*_HANDLE` to peb().ProcessParameters.Standard* |
| 99 | pub extern "kernel32" fn GetStdHandle( |
| 100 | nStdHandle: DWORD, |
| 101 | ) callconv(WINAPI) ?HANDLE; |
| 134 | 102 | |
| 135 | | pub extern "kernel32" fn CreateThread(lpThreadAttributes: ?*SECURITY_ATTRIBUTES, dwStackSize: SIZE_T, lpStartAddress: LPTHREAD_START_ROUTINE, lpParameter: ?LPVOID, dwCreationFlags: DWORD, lpThreadId: ?*DWORD) callconv(WINAPI) ?HANDLE; |
| 103 | pub extern "kernel32" fn MoveFileExW( |
| 104 | lpExistingFileName: LPCWSTR, |
| 105 | lpNewFileName: LPCWSTR, |
| 106 | dwFlags: DWORD, |
| 107 | ) callconv(WINAPI) BOOL; |
| 136 | 108 | |
| 137 | | pub extern "kernel32" fn CreateToolhelp32Snapshot(dwFlags: DWORD, th32ProcessID: DWORD) callconv(WINAPI) HANDLE; |
| 109 | // TODO: Wrapper around NtSetInformationFile + `FILE_POSITION_INFORMATION`. |
| 110 | // `FILE_STANDARD_INFORMATION` is also used if dwMoveMethod is `FILE_END` |
| 111 | pub extern "kernel32" fn SetFilePointerEx( |
| 112 | hFile: HANDLE, |
| 113 | liDistanceToMove: LARGE_INTEGER, |
| 114 | lpNewFilePointer: ?*LARGE_INTEGER, |
| 115 | dwMoveMethod: DWORD, |
| 116 | ) callconv(WINAPI) BOOL; |
| 138 | 117 | |
| 139 | | pub extern "kernel32" fn DeviceIoControl( |
| 140 | | h: HANDLE, |
| 141 | | dwIoControlCode: DWORD, |
| 142 | | lpInBuffer: ?*const anyopaque, |
| 143 | | nInBufferSize: DWORD, |
| 144 | | lpOutBuffer: ?LPVOID, |
| 145 | | nOutBufferSize: DWORD, |
| 146 | | lpBytesReturned: ?*DWORD, |
| 147 | | lpOverlapped: ?*OVERLAPPED, |
| 118 | // TODO: Wrapper around NtSetInformationFile + `FILE_BASIC_INFORMATION` |
| 119 | pub extern "kernel32" fn SetFileTime( |
| 120 | hFile: HANDLE, |
| 121 | lpCreationTime: ?*const FILETIME, |
| 122 | lpLastAccessTime: ?*const FILETIME, |
| 123 | lpLastWriteTime: ?*const FILETIME, |
| 148 | 124 | ) callconv(WINAPI) BOOL; |
| 149 | 125 | |
| 150 | | pub extern "kernel32" fn DeleteFileW(lpFileName: [*:0]const u16) callconv(WINAPI) BOOL; |
| 126 | pub extern "kernel32" fn WriteFile( |
| 127 | in_hFile: HANDLE, |
| 128 | in_lpBuffer: [*]const u8, |
| 129 | in_nNumberOfBytesToWrite: DWORD, |
| 130 | out_lpNumberOfBytesWritten: ?*DWORD, |
| 131 | in_out_lpOverlapped: ?*OVERLAPPED, |
| 132 | ) callconv(WINAPI) BOOL; |
| 151 | 133 | |
| 152 | | pub extern "kernel32" fn DuplicateHandle(hSourceProcessHandle: HANDLE, hSourceHandle: HANDLE, hTargetProcessHandle: HANDLE, lpTargetHandle: *HANDLE, dwDesiredAccess: DWORD, bInheritHandle: BOOL, dwOptions: DWORD) callconv(WINAPI) BOOL; |
| 134 | // TODO: wrapper for NtQueryInformationFile + `FILE_STANDARD_INFORMATION` |
| 135 | pub extern "kernel32" fn GetFileSizeEx( |
| 136 | hFile: HANDLE, |
| 137 | lpFileSize: *LARGE_INTEGER, |
| 138 | ) callconv(WINAPI) BOOL; |
| 153 | 139 | |
| 154 | | pub extern "kernel32" fn ExitProcess(exit_code: UINT) callconv(WINAPI) noreturn; |
| 140 | // TODO: Wrapper around GetStdHandle + NtFlushBuffersFile. |
| 141 | pub extern "kernel32" fn FlushFileBuffers( |
| 142 | hFile: HANDLE, |
| 143 | ) callconv(WINAPI) BOOL; |
| 155 | 144 | |
| 156 | | pub extern "kernel32" fn FindFirstFileW(lpFileName: [*:0]const u16, lpFindFileData: *WIN32_FIND_DATAW) callconv(WINAPI) HANDLE; |
| 157 | | pub extern "kernel32" fn FindClose(hFindFile: HANDLE) callconv(WINAPI) BOOL; |
| 158 | | pub extern "kernel32" fn FindNextFileW(hFindFile: HANDLE, lpFindFileData: *WIN32_FIND_DATAW) callconv(WINAPI) BOOL; |
| 145 | // TODO: Wrapper around NtSetInformationFile + `FILE_IO_COMPLETION_NOTIFICATION_INFORMATION`. |
| 146 | pub extern "kernel32" fn SetFileCompletionNotificationModes( |
| 147 | FileHandle: HANDLE, |
| 148 | Flags: UCHAR, |
| 149 | ) callconv(WINAPI) BOOL; |
| 159 | 150 | |
| 160 | | pub extern "kernel32" fn FormatMessageW(dwFlags: DWORD, lpSource: ?LPVOID, dwMessageId: Win32Error, dwLanguageId: DWORD, lpBuffer: [*]u16, nSize: DWORD, Arguments: ?*va_list) callconv(WINAPI) DWORD; |
| 151 | // TODO: `RtlGetCurrentDirectory_U(nBufferLength * 2, lpBuffer)` |
| 152 | pub extern "kernel32" fn GetCurrentDirectoryW( |
| 153 | nBufferLength: DWORD, |
| 154 | lpBuffer: ?[*]WCHAR, |
| 155 | ) callconv(WINAPI) DWORD; |
| 161 | 156 | |
| 162 | | pub extern "kernel32" fn FreeEnvironmentStringsW(penv: [*:0]u16) callconv(WINAPI) BOOL; |
| 157 | // TODO: RtlDosPathNameToNtPathNameU_WithStatus + NtQueryAttributesFile. |
| 158 | pub extern "kernel32" fn GetFileAttributesW( |
| 159 | lpFileName: LPCWSTR, |
| 160 | ) callconv(WINAPI) DWORD; |
| 163 | 161 | |
| 164 | | pub extern "kernel32" fn GetConsoleMode(in_hConsoleHandle: HANDLE, out_lpMode: *DWORD) callconv(WINAPI) BOOL; |
| 165 | | pub extern "kernel32" fn SetConsoleMode(in_hConsoleHandle: HANDLE, in_dwMode: DWORD) callconv(WINAPI) BOOL; |
| 162 | pub extern "kernel32" fn ReadFile( |
| 163 | hFile: HANDLE, |
| 164 | lpBuffer: LPVOID, |
| 165 | nNumberOfBytesToRead: DWORD, |
| 166 | lpNumberOfBytesRead: ?*DWORD, |
| 167 | lpOverlapped: ?*OVERLAPPED, |
| 168 | ) callconv(WINAPI) BOOL; |
| 166 | 169 | |
| 167 | | pub extern "kernel32" fn GetConsoleOutputCP() callconv(WINAPI) UINT; |
| 170 | pub extern "kernel32" fn GetSystemDirectoryW( |
| 171 | lpBuffer: LPWSTR, |
| 172 | uSize: UINT, |
| 173 | ) callconv(WINAPI) UINT; |
| 168 | 174 | |
| 169 | | pub extern "kernel32" fn GetConsoleScreenBufferInfo(hConsoleOutput: HANDLE, lpConsoleScreenBufferInfo: *CONSOLE_SCREEN_BUFFER_INFO) callconv(WINAPI) BOOL; |
| 170 | | pub extern "kernel32" fn FillConsoleOutputCharacterA(hConsoleOutput: HANDLE, cCharacter: CHAR, nLength: DWORD, dwWriteCoord: COORD, lpNumberOfCharsWritten: *DWORD) callconv(WINAPI) BOOL; |
| 171 | | pub extern "kernel32" fn FillConsoleOutputCharacterW(hConsoleOutput: HANDLE, cCharacter: WCHAR, nLength: DWORD, dwWriteCoord: COORD, lpNumberOfCharsWritten: *DWORD) callconv(WINAPI) BOOL; |
| 172 | | pub extern "kernel32" fn FillConsoleOutputAttribute(hConsoleOutput: HANDLE, wAttribute: WORD, nLength: DWORD, dwWriteCoord: COORD, lpNumberOfAttrsWritten: *DWORD) callconv(WINAPI) BOOL; |
| 173 | | pub extern "kernel32" fn SetConsoleCursorPosition(hConsoleOutput: HANDLE, dwCursorPosition: COORD) callconv(WINAPI) BOOL; |
| 175 | // I/O - Kernel Objects |
| 174 | 176 | |
| 175 | | pub extern "kernel32" fn WriteConsoleW(hConsoleOutput: HANDLE, lpBuffer: [*]const u16, nNumberOfCharsToWrite: DWORD, lpNumberOfCharsWritten: ?*DWORD, lpReserved: ?LPVOID) callconv(WINAPI) BOOL; |
| 176 | | pub extern "kernel32" fn ReadConsoleOutputCharacterW( |
| 177 | | hConsoleOutput: windows.HANDLE, |
| 178 | | lpCharacter: [*]u16, |
| 179 | | nLength: windows.DWORD, |
| 180 | | dwReadCoord: windows.COORD, |
| 181 | | lpNumberOfCharsRead: *windows.DWORD, |
| 182 | | ) callconv(windows.WINAPI) windows.BOOL; |
| 177 | // TODO: Wrapper around NtCreateEvent. |
| 178 | pub extern "kernel32" fn CreateEventExW( |
| 179 | lpEventAttributes: ?*SECURITY_ATTRIBUTES, |
| 180 | lpName: ?LPCWSTR, |
| 181 | dwFlags: DWORD, |
| 182 | dwDesiredAccess: DWORD, |
| 183 | ) callconv(WINAPI) ?HANDLE; |
| 183 | 184 | |
| 184 | | pub extern "kernel32" fn GetCurrentDirectoryW(nBufferLength: DWORD, lpBuffer: ?[*]WCHAR) callconv(WINAPI) DWORD; |
| 185 | // TODO: Wrapper around GetStdHandle + NtDuplicateObject. |
| 186 | pub extern "kernel32" fn DuplicateHandle( |
| 187 | hSourceProcessHandle: HANDLE, |
| 188 | hSourceHandle: HANDLE, |
| 189 | hTargetProcessHandle: HANDLE, |
| 190 | lpTargetHandle: *HANDLE, |
| 191 | dwDesiredAccess: DWORD, |
| 192 | bInheritHandle: BOOL, |
| 193 | dwOptions: DWORD, |
| 194 | ) callconv(WINAPI) BOOL; |
| 185 | 195 | |
| 186 | | pub extern "kernel32" fn GetCurrentThread() callconv(WINAPI) HANDLE; |
| 187 | | pub extern "kernel32" fn GetCurrentThreadId() callconv(WINAPI) DWORD; |
| 196 | // TODO: Wrapper around GetStdHandle + NtQueryObject + NtSetInformationObject with .ObjectHandleFlagInformation. |
| 197 | pub extern "kernel32" fn SetHandleInformation( |
| 198 | hObject: HANDLE, |
| 199 | dwMask: DWORD, |
| 200 | dwFlags: DWORD, |
| 201 | ) callconv(WINAPI) BOOL; |
| 188 | 202 | |
| 189 | | pub extern "kernel32" fn GetCurrentProcessId() callconv(WINAPI) DWORD; |
| 203 | // TODO: Wrapper around NtRemoveIoCompletion. |
| 204 | pub extern "kernel32" fn GetQueuedCompletionStatus( |
| 205 | CompletionPort: HANDLE, |
| 206 | lpNumberOfBytesTransferred: *DWORD, |
| 207 | lpCompletionKey: *ULONG_PTR, |
| 208 | lpOverlapped: *?*OVERLAPPED, |
| 209 | dwMilliseconds: DWORD, |
| 210 | ) callconv(WINAPI) BOOL; |
| 190 | 211 | |
| 191 | | pub extern "kernel32" fn GetCurrentProcess() callconv(WINAPI) HANDLE; |
| 212 | // TODO: Wrapper around NtRemoveIoCompletionEx. |
| 213 | pub extern "kernel32" fn GetQueuedCompletionStatusEx( |
| 214 | CompletionPort: HANDLE, |
| 215 | lpCompletionPortEntries: [*]OVERLAPPED_ENTRY, |
| 216 | ulCount: ULONG, |
| 217 | ulNumEntriesRemoved: *ULONG, |
| 218 | dwMilliseconds: DWORD, |
| 219 | fAlertable: BOOL, |
| 220 | ) callconv(WINAPI) BOOL; |
| 192 | 221 | |
| 193 | | pub extern "kernel32" fn GetEnvironmentStringsW() callconv(WINAPI) ?[*:0]u16; |
| 222 | // TODO: Wrapper around NtSetIoCompletion with `IoStatus = .SUCCESS`. |
| 223 | pub extern "kernel32" fn PostQueuedCompletionStatus( |
| 224 | CompletionPort: HANDLE, |
| 225 | dwNumberOfBytesTransferred: DWORD, |
| 226 | dwCompletionKey: ULONG_PTR, |
| 227 | lpOverlapped: ?*OVERLAPPED, |
| 228 | ) callconv(WINAPI) BOOL; |
| 194 | 229 | |
| 195 | | pub extern "kernel32" fn GetEnvironmentVariableW(lpName: LPWSTR, lpBuffer: [*]u16, nSize: DWORD) callconv(WINAPI) DWORD; |
| 230 | // TODO: |
| 231 | // GetOverlappedResultEx with bAlertable=false, which calls: GetStdHandle + WaitForSingleObjectEx. |
| 232 | // Uses the SwitchBack system to run implementations for older programs; Do we care about this? |
| 233 | pub extern "kernel32" fn GetOverlappedResult( |
| 234 | hFile: HANDLE, |
| 235 | lpOverlapped: *OVERLAPPED, |
| 236 | lpNumberOfBytesTransferred: *DWORD, |
| 237 | bWait: BOOL, |
| 238 | ) callconv(WINAPI) BOOL; |
| 196 | 239 | |
| 197 | | pub extern "kernel32" fn SetEnvironmentVariableW(lpName: LPCWSTR, lpValue: ?LPCWSTR) callconv(WINAPI) BOOL; |
| 240 | // TODO: Wrapper around NtCreateIoCompletion + NtSetInformationFile with FILE_COMPLETION_INFORMATION. |
| 241 | // This would be better splitting into two functions. |
| 242 | pub extern "kernel32" fn CreateIoCompletionPort( |
| 243 | FileHandle: HANDLE, |
| 244 | ExistingCompletionPort: ?HANDLE, |
| 245 | CompletionKey: ULONG_PTR, |
| 246 | NumberOfConcurrentThreads: DWORD, |
| 247 | ) callconv(WINAPI) ?HANDLE; |
| 198 | 248 | |
| 199 | | pub extern "kernel32" fn GetExitCodeProcess(hProcess: HANDLE, lpExitCode: *DWORD) callconv(WINAPI) BOOL; |
| 249 | // TODO: Forwarder to NtAddVectoredExceptionHandler. |
| 250 | pub extern "kernel32" fn AddVectoredExceptionHandler( |
| 251 | First: ULONG, |
| 252 | Handler: ?VECTORED_EXCEPTION_HANDLER, |
| 253 | ) callconv(WINAPI) ?LPVOID; |
| 254 | |
| 255 | // TODO: Forwarder to NtRemoveVectoredExceptionHandler. |
| 256 | pub extern "kernel32" fn RemoveVectoredExceptionHandler( |
| 257 | Handle: HANDLE, |
| 258 | ) callconv(WINAPI) ULONG; |
| 259 | |
| 260 | // TODO: Wrapper around RtlReportSilentProcessExit + NtTerminateProcess. |
| 261 | pub extern "kernel32" fn TerminateProcess( |
| 262 | hProcess: HANDLE, |
| 263 | uExitCode: UINT, |
| 264 | ) callconv(WINAPI) BOOL; |
| 200 | 265 | |
| 201 | | pub extern "kernel32" fn GetFileSizeEx(hFile: HANDLE, lpFileSize: *LARGE_INTEGER) callconv(WINAPI) BOOL; |
| 266 | // TODO: WaitForSingleObjectEx with bAlertable=false. |
| 267 | pub extern "kernel32" fn WaitForSingleObject( |
| 268 | hHandle: HANDLE, |
| 269 | dwMilliseconds: DWORD, |
| 270 | ) callconv(WINAPI) DWORD; |
| 202 | 271 | |
| 203 | | pub extern "kernel32" fn GetFileAttributesW(lpFileName: [*:0]const WCHAR) callconv(WINAPI) DWORD; |
| 272 | // TODO: Wrapper for GetStdHandle + NtWaitForSingleObject. |
| 273 | // Sets up an activation context before calling NtWaitForSingleObject. |
| 274 | pub extern "kernel32" fn WaitForSingleObjectEx( |
| 275 | hHandle: HANDLE, |
| 276 | dwMilliseconds: DWORD, |
| 277 | bAlertable: BOOL, |
| 278 | ) callconv(WINAPI) DWORD; |
| 204 | 279 | |
| 205 | | pub extern "kernel32" fn GetModuleFileNameW(hModule: ?HMODULE, lpFilename: [*]u16, nSize: DWORD) callconv(WINAPI) DWORD; |
| 280 | // TODO: WaitForMultipleObjectsEx with alertable=false |
| 281 | pub extern "kernel32" fn WaitForMultipleObjects( |
| 282 | nCount: DWORD, |
| 283 | lpHandle: [*]const HANDLE, |
| 284 | bWaitAll: BOOL, |
| 285 | dwMilliseconds: DWORD, |
| 286 | ) callconv(WINAPI) DWORD; |
| 206 | 287 | |
| 207 | | pub extern "kernel32" fn GetModuleHandleW(lpModuleName: ?[*:0]const WCHAR) callconv(WINAPI) ?HMODULE; |
| 288 | // TODO: Wrapper around NtWaitForMultipleObjects. |
| 289 | pub extern "kernel32" fn WaitForMultipleObjectsEx( |
| 290 | nCount: DWORD, |
| 291 | lpHandle: [*]const HANDLE, |
| 292 | bWaitAll: BOOL, |
| 293 | dwMilliseconds: DWORD, |
| 294 | bAlertable: BOOL, |
| 295 | ) callconv(WINAPI) DWORD; |
| 208 | 296 | |
| 209 | | pub extern "kernel32" fn GetLastError() callconv(WINAPI) Win32Error; |
| 210 | | pub extern "kernel32" fn SetLastError(dwErrCode: Win32Error) callconv(WINAPI) void; |
| 297 | // Process Management |
| 211 | 298 | |
| 212 | | pub extern "kernel32" fn GetFileInformationByHandleEx( |
| 213 | | in_hFile: HANDLE, |
| 214 | | in_FileInformationClass: FILE_INFO_BY_HANDLE_CLASS, |
| 215 | | out_lpFileInformation: *anyopaque, |
| 216 | | in_dwBufferSize: DWORD, |
| 299 | pub extern "kernel32" fn CreateProcessW( |
| 300 | lpApplicationName: ?LPCWSTR, |
| 301 | lpCommandLine: ?LPWSTR, |
| 302 | lpProcessAttributes: ?*SECURITY_ATTRIBUTES, |
| 303 | lpThreadAttributes: ?*SECURITY_ATTRIBUTES, |
| 304 | bInheritHandles: BOOL, |
| 305 | dwCreationFlags: DWORD, |
| 306 | lpEnvironment: ?LPVOID, |
| 307 | lpCurrentDirectory: ?LPCWSTR, |
| 308 | lpStartupInfo: *STARTUPINFOW, |
| 309 | lpProcessInformation: *PROCESS_INFORMATION, |
| 217 | 310 | ) callconv(WINAPI) BOOL; |
| 218 | 311 | |
| 219 | | pub extern "kernel32" fn GetFinalPathNameByHandleW( |
| 220 | | hFile: HANDLE, |
| 221 | | lpszFilePath: [*]u16, |
| 222 | | cchFilePath: DWORD, |
| 223 | | dwFlags: DWORD, |
| 224 | | ) callconv(WINAPI) DWORD; |
| 312 | // TODO: Fowarder to RtlExitUserProcess. |
| 313 | pub extern "kernel32" fn ExitProcess( |
| 314 | exit_code: UINT, |
| 315 | ) callconv(WINAPI) noreturn; |
| 225 | 316 | |
| 226 | | pub extern "kernel32" fn GetFullPathNameW( |
| 227 | | lpFileName: [*:0]const u16, |
| 228 | | nBufferLength: u32, |
| 229 | | lpBuffer: [*]u16, |
| 230 | | lpFilePart: ?*?[*:0]u16, |
| 231 | | ) callconv(@import("std").os.windows.WINAPI) u32; |
| 317 | // TODO: SleepEx with bAlertable=false. |
| 318 | pub extern "kernel32" fn Sleep( |
| 319 | dwMilliseconds: DWORD, |
| 320 | ) callconv(WINAPI) void; |
| 232 | 321 | |
| 233 | | pub extern "kernel32" fn GetOverlappedResult(hFile: HANDLE, lpOverlapped: *OVERLAPPED, lpNumberOfBytesTransferred: *DWORD, bWait: BOOL) callconv(WINAPI) BOOL; |
| 322 | // TODO: Wrapper around NtQueryInformationProcess with `PROCESS_BASIC_INFORMATION`. |
| 323 | pub extern "kernel32" fn GetExitCodeProcess( |
| 324 | hProcess: HANDLE, |
| 325 | lpExitCode: *DWORD, |
| 326 | ) callconv(WINAPI) BOOL; |
| 234 | 327 | |
| 235 | | pub extern "kernel32" fn GetProcessHeap() callconv(WINAPI) ?HANDLE; |
| 328 | // TODO: Already a wrapper for this, see `windows.GetCurrentProcess`. |
| 329 | pub extern "kernel32" fn GetCurrentProcess() callconv(WINAPI) HANDLE; |
| 236 | 330 | |
| 237 | | pub extern "kernel32" fn GetProcessTimes(in_hProcess: HANDLE, out_lpCreationTime: *FILETIME, out_lpExitTime: *FILETIME, out_lpKernelTime: *FILETIME, out_lpUserTime: *FILETIME) callconv(WINAPI) BOOL; |
| 331 | // TODO: memcpy peb().ProcessParameters.Environment, mem.span(0). Requires locking the PEB. |
| 332 | pub extern "kernel32" fn GetEnvironmentStringsW() callconv(WINAPI) ?LPWSTR; |
| 238 | 333 | |
| 239 | | pub extern "kernel32" fn GetQueuedCompletionStatus(CompletionPort: HANDLE, lpNumberOfBytesTransferred: *DWORD, lpCompletionKey: *ULONG_PTR, lpOverlapped: *?*OVERLAPPED, dwMilliseconds: DWORD) callconv(WINAPI) BOOL; |
| 240 | | pub extern "kernel32" fn GetQueuedCompletionStatusEx( |
| 241 | | CompletionPort: HANDLE, |
| 242 | | lpCompletionPortEntries: [*]OVERLAPPED_ENTRY, |
| 243 | | ulCount: ULONG, |
| 244 | | ulNumEntriesRemoved: *ULONG, |
| 245 | | dwMilliseconds: DWORD, |
| 246 | | fAlertable: BOOL, |
| 334 | // TODO: RtlFreeHeap on the output of GetEnvironmentStringsW. |
| 335 | pub extern "kernel32" fn FreeEnvironmentStringsW( |
| 336 | penv: LPWSTR, |
| 247 | 337 | ) callconv(WINAPI) BOOL; |
| 248 | 338 | |
| 249 | | pub extern "kernel32" fn GetSystemInfo(lpSystemInfo: *SYSTEM_INFO) callconv(WINAPI) void; |
| 250 | | pub extern "kernel32" fn GetSystemTimeAsFileTime(*FILETIME) callconv(WINAPI) void; |
| 251 | | pub extern "kernel32" fn IsProcessorFeaturePresent(ProcessorFeature: DWORD) BOOL; |
| 252 | | |
| 253 | | pub extern "kernel32" fn GetSystemDirectoryW(lpBuffer: LPWSTR, uSize: UINT) callconv(WINAPI) UINT; |
| 339 | // TODO: Wrapper around RtlQueryEnvironmentVariable. |
| 340 | pub extern "kernel32" fn GetEnvironmentVariableW( |
| 341 | lpName: ?LPCWSTR, |
| 342 | lpBuffer: ?[*]WCHAR, |
| 343 | nSize: DWORD, |
| 344 | ) callconv(WINAPI) DWORD; |
| 254 | 345 | |
| 255 | | pub extern "kernel32" fn HeapCreate(flOptions: DWORD, dwInitialSize: SIZE_T, dwMaximumSize: SIZE_T) callconv(WINAPI) ?HANDLE; |
| 256 | | pub extern "kernel32" fn HeapDestroy(hHeap: HANDLE) callconv(WINAPI) BOOL; |
| 257 | | pub extern "kernel32" fn HeapReAlloc(hHeap: HANDLE, dwFlags: DWORD, lpMem: *anyopaque, dwBytes: SIZE_T) callconv(WINAPI) ?*anyopaque; |
| 258 | | pub extern "kernel32" fn HeapSize(hHeap: HANDLE, dwFlags: DWORD, lpMem: *const anyopaque) callconv(WINAPI) SIZE_T; |
| 259 | | pub extern "kernel32" fn HeapCompact(hHeap: HANDLE, dwFlags: DWORD) callconv(WINAPI) SIZE_T; |
| 260 | | pub extern "kernel32" fn HeapSummary(hHeap: HANDLE, dwFlags: DWORD, lpSummary: LPHEAP_SUMMARY) callconv(WINAPI) BOOL; |
| 346 | // TODO: Wrapper around RtlSetEnvironmentVar. |
| 347 | pub extern "kernel32" fn SetEnvironmentVariableW( |
| 348 | lpName: LPCWSTR, |
| 349 | lpValue: ?LPCWSTR, |
| 350 | ) callconv(WINAPI) BOOL; |
| 261 | 351 | |
| 262 | | pub extern "kernel32" fn GetStdHandle(in_nStdHandle: DWORD) callconv(WINAPI) ?HANDLE; |
| 352 | pub extern "kernel32" fn CreateToolhelp32Snapshot( |
| 353 | dwFlags: DWORD, |
| 354 | th32ProcessID: DWORD, |
| 355 | ) callconv(WINAPI) HANDLE; |
| 263 | 356 | |
| 264 | | pub extern "kernel32" fn HeapAlloc(hHeap: HANDLE, dwFlags: DWORD, dwBytes: SIZE_T) callconv(WINAPI) ?*anyopaque; |
| 357 | // Threading |
| 265 | 358 | |
| 266 | | pub extern "kernel32" fn HeapFree(hHeap: HANDLE, dwFlags: DWORD, lpMem: *anyopaque) callconv(WINAPI) BOOL; |
| 359 | // TODO: Already a wrapper for this, see `windows.GetCurrentThreadId`. |
| 360 | pub extern "kernel32" fn GetCurrentThreadId() callconv(WINAPI) DWORD; |
| 267 | 361 | |
| 268 | | pub extern "kernel32" fn HeapValidate(hHeap: HANDLE, dwFlags: DWORD, lpMem: ?*const anyopaque) callconv(WINAPI) BOOL; |
| 362 | // TODO: CreateRemoteThread with hProcess=NtCurrentProcess(). |
| 363 | pub extern "kernel32" fn CreateThread( |
| 364 | lpThreadAttributes: ?*SECURITY_ATTRIBUTES, |
| 365 | dwStackSize: SIZE_T, |
| 366 | lpStartAddress: LPTHREAD_START_ROUTINE, |
| 367 | lpParameter: ?LPVOID, |
| 368 | dwCreationFlags: DWORD, |
| 369 | lpThreadId: ?*DWORD, |
| 370 | ) callconv(WINAPI) ?HANDLE; |
| 269 | 371 | |
| 270 | | pub extern "kernel32" fn VirtualAlloc(lpAddress: ?LPVOID, dwSize: SIZE_T, flAllocationType: DWORD, flProtect: DWORD) callconv(WINAPI) ?LPVOID; |
| 271 | | pub extern "kernel32" fn VirtualFree(lpAddress: ?LPVOID, dwSize: SIZE_T, dwFreeType: DWORD) callconv(WINAPI) BOOL; |
| 272 | | pub extern "kernel32" fn VirtualQuery(lpAddress: ?LPVOID, lpBuffer: PMEMORY_BASIC_INFORMATION, dwLength: SIZE_T) callconv(WINAPI) SIZE_T; |
| 372 | // TODO: Wrapper around RtlDelayExecution. |
| 373 | pub extern "kernel32" fn SwitchToThread() callconv(WINAPI) BOOL; |
| 273 | 374 | |
| 274 | | pub extern "kernel32" fn LocalFree(hMem: HLOCAL) callconv(WINAPI) ?HLOCAL; |
| 375 | // Locks, critical sections, initializers |
| 376 | |
| 377 | // TODO: Forwarder to RtlInitializeCriticalSection |
| 378 | pub extern "kernel32" fn InitializeCriticalSection( |
| 379 | lpCriticalSection: *CRITICAL_SECTION, |
| 380 | ) callconv(WINAPI) void; |
| 381 | |
| 382 | // TODO: Forwarder to RtlEnterCriticalSection |
| 383 | pub extern "kernel32" fn EnterCriticalSection( |
| 384 | lpCriticalSection: *CRITICAL_SECTION, |
| 385 | ) callconv(WINAPI) void; |
| 386 | |
| 387 | // TODO: Forwarder to RtlLeaveCriticalSection |
| 388 | pub extern "kernel32" fn LeaveCriticalSection( |
| 389 | lpCriticalSection: *CRITICAL_SECTION, |
| 390 | ) callconv(WINAPI) void; |
| 391 | |
| 392 | // TODO: Forwarder to RtlDeleteCriticalSection |
| 393 | pub extern "kernel32" fn DeleteCriticalSection( |
| 394 | lpCriticalSection: *CRITICAL_SECTION, |
| 395 | ) callconv(WINAPI) void; |
| 396 | |
| 397 | // TODO: Forwarder to RtlTryAcquireSRWLockExclusive |
| 398 | pub extern "kernel32" fn TryAcquireSRWLockExclusive( |
| 399 | SRWLock: *SRWLOCK, |
| 400 | ) callconv(WINAPI) BOOLEAN; |
| 401 | |
| 402 | // TODO: Forwarder to RtlAcquireSRWLockExclusive |
| 403 | pub extern "kernel32" fn AcquireSRWLockExclusive( |
| 404 | SRWLock: *SRWLOCK, |
| 405 | ) callconv(WINAPI) void; |
| 406 | |
| 407 | // TODO: Forwarder to RtlReleaseSRWLockExclusive |
| 408 | pub extern "kernel32" fn ReleaseSRWLockExclusive( |
| 409 | SRWLock: *SRWLOCK, |
| 410 | ) callconv(WINAPI) void; |
| 411 | |
| 412 | pub extern "kernel32" fn InitOnceExecuteOnce( |
| 413 | InitOnce: *INIT_ONCE, |
| 414 | InitFn: INIT_ONCE_FN, |
| 415 | Parameter: ?*anyopaque, |
| 416 | Context: ?*anyopaque, |
| 417 | ) callconv(WINAPI) BOOL; |
| 275 | 418 | |
| 276 | | pub extern "kernel32" fn Module32First(hSnapshot: HANDLE, lpme: *MODULEENTRY32) callconv(WINAPI) BOOL; |
| 419 | // TODO: Forwarder to RtlWakeConditionVariable |
| 420 | pub extern "kernel32" fn WakeConditionVariable( |
| 421 | ConditionVariable: *CONDITION_VARIABLE, |
| 422 | ) callconv(WINAPI) void; |
| 277 | 423 | |
| 278 | | pub extern "kernel32" fn Module32Next(hSnapshot: HANDLE, lpme: *MODULEENTRY32) callconv(WINAPI) BOOL; |
| 424 | // TODO: Forwarder to RtlWakeAllConditionVariable |
| 425 | pub extern "kernel32" fn WakeAllConditionVariable( |
| 426 | ConditionVariable: *CONDITION_VARIABLE, |
| 427 | ) callconv(WINAPI) void; |
| 279 | 428 | |
| 280 | | pub extern "kernel32" fn MoveFileExW( |
| 281 | | lpExistingFileName: [*:0]const u16, |
| 282 | | lpNewFileName: [*:0]const u16, |
| 283 | | dwFlags: DWORD, |
| 429 | // TODO: |
| 430 | // - dwMilliseconds -> LARGE_INTEGER. |
| 431 | // - RtlSleepConditionVariableSRW |
| 432 | // - return rc != .TIMEOUT |
| 433 | pub extern "kernel32" fn SleepConditionVariableSRW( |
| 434 | ConditionVariable: *CONDITION_VARIABLE, |
| 435 | SRWLock: *SRWLOCK, |
| 436 | dwMilliseconds: DWORD, |
| 437 | Flags: ULONG, |
| 284 | 438 | ) callconv(WINAPI) BOOL; |
| 285 | 439 | |
| 286 | | pub extern "kernel32" fn PostQueuedCompletionStatus(CompletionPort: HANDLE, dwNumberOfBytesTransferred: DWORD, dwCompletionKey: ULONG_PTR, lpOverlapped: ?*OVERLAPPED) callconv(WINAPI) BOOL; |
| 440 | // Console management |
| 287 | 441 | |
| 288 | | pub extern "kernel32" fn ReadDirectoryChangesW( |
| 289 | | hDirectory: HANDLE, |
| 290 | | lpBuffer: [*]align(@alignOf(FILE_NOTIFY_INFORMATION)) u8, |
| 291 | | nBufferLength: DWORD, |
| 292 | | bWatchSubtree: BOOL, |
| 293 | | dwNotifyFilter: DWORD, |
| 294 | | lpBytesReturned: ?*DWORD, |
| 295 | | lpOverlapped: ?*OVERLAPPED, |
| 296 | | lpCompletionRoutine: LPOVERLAPPED_COMPLETION_ROUTINE, |
| 442 | pub extern "kernel32" fn GetConsoleMode( |
| 443 | hConsoleHandle: HANDLE, |
| 444 | lpMode: *DWORD, |
| 297 | 445 | ) callconv(WINAPI) BOOL; |
| 298 | 446 | |
| 299 | | pub extern "kernel32" fn ReadFile( |
| 300 | | in_hFile: HANDLE, |
| 301 | | out_lpBuffer: [*]u8, |
| 302 | | in_nNumberOfBytesToRead: DWORD, |
| 303 | | out_lpNumberOfBytesRead: ?*DWORD, |
| 304 | | in_out_lpOverlapped: ?*OVERLAPPED, |
| 447 | pub extern "kernel32" fn SetConsoleMode( |
| 448 | hConsoleHandle: HANDLE, |
| 449 | dwMode: DWORD, |
| 305 | 450 | ) callconv(WINAPI) BOOL; |
| 306 | 451 | |
| 307 | | pub extern "kernel32" fn RemoveDirectoryW(lpPathName: [*:0]const u16) callconv(WINAPI) BOOL; |
| 308 | | |
| 309 | | pub extern "kernel32" fn RtlCaptureContext(ContextRecord: *CONTEXT) callconv(WINAPI) void; |
| 310 | | |
| 311 | | pub extern "kernel32" fn RtlLookupFunctionEntry( |
| 312 | | ControlPc: DWORD64, |
| 313 | | ImageBase: *DWORD64, |
| 314 | | HistoryTable: *UNWIND_HISTORY_TABLE, |
| 315 | | ) callconv(WINAPI) ?*RUNTIME_FUNCTION; |
| 316 | | |
| 317 | | pub extern "kernel32" fn RtlVirtualUnwind( |
| 318 | | HandlerType: DWORD, |
| 319 | | ImageBase: DWORD64, |
| 320 | | ControlPc: DWORD64, |
| 321 | | FunctionEntry: *RUNTIME_FUNCTION, |
| 322 | | ContextRecord: *CONTEXT, |
| 323 | | HandlerData: *?PVOID, |
| 324 | | EstablisherFrame: *DWORD64, |
| 325 | | ContextPointers: ?*KNONVOLATILE_CONTEXT_POINTERS, |
| 326 | | ) callconv(WINAPI) *EXCEPTION_ROUTINE; |
| 452 | pub extern "kernel32" fn GetConsoleScreenBufferInfo( |
| 453 | hConsoleOutput: HANDLE, |
| 454 | lpConsoleScreenBufferInfo: *CONSOLE_SCREEN_BUFFER_INFO, |
| 455 | ) callconv(WINAPI) BOOL; |
| 327 | 456 | |
| 328 | | pub extern "kernel32" fn SetConsoleTextAttribute(hConsoleOutput: HANDLE, wAttributes: WORD) callconv(WINAPI) BOOL; |
| 457 | pub extern "kernel32" fn SetConsoleTextAttribute( |
| 458 | hConsoleOutput: HANDLE, |
| 459 | wAttributes: WORD, |
| 460 | ) callconv(WINAPI) BOOL; |
| 329 | 461 | |
| 330 | 462 | pub extern "kernel32" fn SetConsoleCtrlHandler( |
| 331 | 463 | HandlerRoutine: ?HANDLER_ROUTINE, |
| 332 | 464 | Add: BOOL, |
| 333 | 465 | ) callconv(WINAPI) BOOL; |
| 334 | 466 | |
| 335 | | pub extern "kernel32" fn SetConsoleOutputCP(wCodePageID: UINT) callconv(WINAPI) BOOL; |
| 467 | pub extern "kernel32" fn SetConsoleOutputCP( |
| 468 | wCodePageID: UINT, |
| 469 | ) callconv(WINAPI) BOOL; |
| 336 | 470 | |
| 337 | | pub extern "kernel32" fn SetFileCompletionNotificationModes( |
| 338 | | FileHandle: HANDLE, |
| 339 | | Flags: UCHAR, |
| 471 | pub extern "kernel32" fn GetConsoleOutputCP() callconv(WINAPI) UINT; |
| 472 | |
| 473 | pub extern "kernel32" fn FillConsoleOutputAttribute( |
| 474 | hConsoleOutput: HANDLE, |
| 475 | wAttribute: WORD, |
| 476 | nLength: DWORD, |
| 477 | dwWriteCoord: COORD, |
| 478 | lpNumberOfAttrsWritten: *DWORD, |
| 340 | 479 | ) callconv(WINAPI) BOOL; |
| 341 | 480 | |
| 342 | | pub extern "kernel32" fn SetFilePointerEx( |
| 343 | | in_fFile: HANDLE, |
| 344 | | in_liDistanceToMove: LARGE_INTEGER, |
| 345 | | out_opt_ldNewFilePointer: ?*LARGE_INTEGER, |
| 346 | | in_dwMoveMethod: DWORD, |
| 481 | pub extern "kernel32" fn FillConsoleOutputCharacterW( |
| 482 | hConsoleOutput: HANDLE, |
| 483 | cCharacter: WCHAR, |
| 484 | nLength: DWORD, |
| 485 | dwWriteCoord: COORD, |
| 486 | lpNumberOfCharsWritten: *DWORD, |
| 347 | 487 | ) callconv(WINAPI) BOOL; |
| 348 | 488 | |
| 349 | | pub extern "kernel32" fn SetFileTime( |
| 350 | | hFile: HANDLE, |
| 351 | | lpCreationTime: ?*const FILETIME, |
| 352 | | lpLastAccessTime: ?*const FILETIME, |
| 353 | | lpLastWriteTime: ?*const FILETIME, |
| 489 | pub extern "kernel32" fn SetConsoleCursorPosition( |
| 490 | hConsoleOutput: HANDLE, |
| 491 | dwCursorPosition: COORD, |
| 354 | 492 | ) callconv(WINAPI) BOOL; |
| 355 | 493 | |
| 356 | | pub extern "kernel32" fn SetHandleInformation(hObject: HANDLE, dwMask: DWORD, dwFlags: DWORD) callconv(WINAPI) BOOL; |
| 494 | pub extern "kernel32" fn WriteConsoleW( |
| 495 | hConsoleOutput: HANDLE, |
| 496 | lpBuffer: [*]const u16, |
| 497 | nNumberOfCharsToWrite: DWORD, |
| 498 | lpNumberOfCharsWritten: ?*DWORD, |
| 499 | lpReserved: ?LPVOID, |
| 500 | ) callconv(WINAPI) BOOL; |
| 357 | 501 | |
| 358 | | pub extern "kernel32" fn Sleep(dwMilliseconds: DWORD) callconv(WINAPI) void; |
| 502 | pub extern "kernel32" fn ReadConsoleOutputCharacterW( |
| 503 | hConsoleOutput: HANDLE, |
| 504 | lpCharacter: [*]u16, |
| 505 | nLength: DWORD, |
| 506 | dwReadCoord: COORD, |
| 507 | lpNumberOfCharsRead: *DWORD, |
| 508 | ) callconv(windows.WINAPI) BOOL; |
| 509 | |
| 510 | // Memory Mapping/Allocation |
| 511 | |
| 512 | // TODO: Wrapper around RtlCreateHeap. |
| 513 | pub extern "kernel32" fn HeapCreate( |
| 514 | flOptions: DWORD, |
| 515 | dwInitialSize: SIZE_T, |
| 516 | dwMaximumSize: SIZE_T, |
| 517 | ) callconv(WINAPI) ?HANDLE; |
| 359 | 518 | |
| 360 | | pub extern "kernel32" fn SwitchToThread() callconv(WINAPI) BOOL; |
| 519 | // TODO: Wrapper around RtlDestroyHeap (BOOLEAN -> BOOL). |
| 520 | pub extern "kernel32" fn HeapDestroy( |
| 521 | hHeap: HANDLE, |
| 522 | ) callconv(WINAPI) BOOL; |
| 361 | 523 | |
| 362 | | pub extern "kernel32" fn TerminateProcess(hProcess: HANDLE, uExitCode: UINT) callconv(WINAPI) BOOL; |
| 524 | // TODO: Forwarder to RtlReAllocateHeap. |
| 525 | pub extern "kernel32" fn HeapReAlloc( |
| 526 | hHeap: HANDLE, |
| 527 | dwFlags: DWORD, |
| 528 | lpMem: *anyopaque, |
| 529 | dwBytes: SIZE_T, |
| 530 | ) callconv(WINAPI) ?*anyopaque; |
| 363 | 531 | |
| 364 | | pub extern "kernel32" fn TlsAlloc() callconv(WINAPI) DWORD; |
| 532 | // TODO: Fowrarder to RtlAllocateHeap. |
| 533 | pub extern "kernel32" fn HeapAlloc( |
| 534 | hHeap: HANDLE, |
| 535 | dwFlags: DWORD, |
| 536 | dwBytes: SIZE_T, |
| 537 | ) callconv(WINAPI) ?*anyopaque; |
| 365 | 538 | |
| 366 | | pub extern "kernel32" fn TlsFree(dwTlsIndex: DWORD) callconv(WINAPI) BOOL; |
| 539 | // TODO: Fowrarder to RtlFreeHeap. |
| 540 | pub extern "kernel32" fn HeapFree( |
| 541 | hHeap: HANDLE, |
| 542 | dwFlags: DWORD, |
| 543 | lpMem: LPVOID, |
| 544 | ) callconv(WINAPI) BOOL; |
| 367 | 545 | |
| 368 | | pub extern "kernel32" fn WaitForSingleObject(hHandle: HANDLE, dwMilliseconds: DWORD) callconv(WINAPI) DWORD; |
| 546 | // TODO: Wrapper around RtlValidateHeap (BOOLEAN -> BOOL) |
| 547 | pub extern "kernel32" fn HeapValidate( |
| 548 | hHeap: HANDLE, |
| 549 | dwFlags: DWORD, |
| 550 | lpMem: ?*const anyopaque, |
| 551 | ) callconv(WINAPI) BOOL; |
| 369 | 552 | |
| 370 | | pub extern "kernel32" fn WaitForSingleObjectEx(hHandle: HANDLE, dwMilliseconds: DWORD, bAlertable: BOOL) callconv(WINAPI) DWORD; |
| 553 | // TODO: Wrapper around NtAllocateVirtualMemory. |
| 554 | pub extern "kernel32" fn VirtualAlloc( |
| 555 | lpAddress: ?LPVOID, |
| 556 | dwSize: SIZE_T, |
| 557 | flAllocationType: DWORD, |
| 558 | flProtect: DWORD, |
| 559 | ) callconv(WINAPI) ?LPVOID; |
| 560 | |
| 561 | // TODO: Wrapper around NtFreeVirtualMemory. |
| 562 | // If the return value is .INVALID_PAGE_PROTECTION, calls RtlFlushSecureMemoryCache and try again. |
| 563 | pub extern "kernel32" fn VirtualFree( |
| 564 | lpAddress: ?LPVOID, |
| 565 | dwSize: SIZE_T, |
| 566 | dwFreeType: DWORD, |
| 567 | ) callconv(WINAPI) BOOL; |
| 371 | 568 | |
| 372 | | pub extern "kernel32" fn WaitForMultipleObjects(nCount: DWORD, lpHandle: [*]const HANDLE, bWaitAll: BOOL, dwMilliseconds: DWORD) callconv(WINAPI) DWORD; |
| 569 | // TODO: Wrapper around NtQueryVirtualMemory. |
| 570 | pub extern "kernel32" fn VirtualQuery( |
| 571 | lpAddress: ?LPVOID, |
| 572 | lpBuffer: PMEMORY_BASIC_INFORMATION, |
| 573 | dwLength: SIZE_T, |
| 574 | ) callconv(WINAPI) SIZE_T; |
| 373 | 575 | |
| 374 | | pub extern "kernel32" fn WaitForMultipleObjectsEx( |
| 375 | | nCount: DWORD, |
| 376 | | lpHandle: [*]const HANDLE, |
| 377 | | bWaitAll: BOOL, |
| 378 | | dwMilliseconds: DWORD, |
| 379 | | bAlertable: BOOL, |
| 576 | pub extern "kernel32" fn LocalFree( |
| 577 | hMem: HLOCAL, |
| 578 | ) callconv(WINAPI) ?HLOCAL; |
| 579 | |
| 580 | // TODO: Getter for peb.ProcessHeap |
| 581 | pub extern "kernel32" fn GetProcessHeap() callconv(WINAPI) ?HANDLE; |
| 582 | |
| 583 | // Code Libraries/Modules |
| 584 | |
| 585 | // TODO: Wrapper around LdrGetDllFullName. |
| 586 | pub extern "kernel32" fn GetModuleFileNameW( |
| 587 | hModule: ?HMODULE, |
| 588 | lpFilename: LPWSTR, |
| 589 | nSize: DWORD, |
| 380 | 590 | ) callconv(WINAPI) DWORD; |
| 381 | 591 | |
| 382 | | pub extern "kernel32" fn WriteFile( |
| 383 | | in_hFile: HANDLE, |
| 384 | | in_lpBuffer: [*]const u8, |
| 385 | | in_nNumberOfBytesToWrite: DWORD, |
| 386 | | out_lpNumberOfBytesWritten: ?*DWORD, |
| 387 | | in_out_lpOverlapped: ?*OVERLAPPED, |
| 592 | extern "kernel32" fn K32GetModuleFileNameExW( |
| 593 | hProcess: HANDLE, |
| 594 | hModule: ?HMODULE, |
| 595 | lpFilename: LPWSTR, |
| 596 | nSize: DWORD, |
| 597 | ) callconv(WINAPI) DWORD; |
| 598 | pub const GetModuleFileNameExW = K32GetModuleFileNameExW; |
| 599 | |
| 600 | // TODO: Wrapper around ntdll.LdrGetDllHandle, which is a wrapper around LdrGetDllHandleEx |
| 601 | pub extern "kernel32" fn GetModuleHandleW( |
| 602 | lpModuleName: ?LPCWSTR, |
| 603 | ) callconv(WINAPI) ?HMODULE; |
| 604 | |
| 605 | pub extern "kernel32" fn Module32First( |
| 606 | hSnapshot: HANDLE, |
| 607 | lpme: *MODULEENTRY32, |
| 388 | 608 | ) callconv(WINAPI) BOOL; |
| 389 | 609 | |
| 390 | | pub extern "kernel32" fn WriteFileEx( |
| 391 | | hFile: HANDLE, |
| 392 | | lpBuffer: [*]const u8, |
| 393 | | nNumberOfBytesToWrite: DWORD, |
| 394 | | lpOverlapped: *OVERLAPPED, |
| 395 | | lpCompletionRoutine: LPOVERLAPPED_COMPLETION_ROUTINE, |
| 396 | | ) callconv(WINAPI) BOOL; |
| 397 | | |
| 398 | | pub extern "kernel32" fn LoadLibraryW(lpLibFileName: [*:0]const u16) callconv(WINAPI) ?HMODULE; |
| 399 | | pub extern "kernel32" fn LoadLibraryExW(lpLibFileName: [*:0]const u16, hFile: ?HANDLE, dwFlags: DWORD) callconv(WINAPI) ?HMODULE; |
| 400 | | |
| 401 | | pub extern "kernel32" fn GetProcAddress(hModule: HMODULE, lpProcName: [*:0]const u8) callconv(WINAPI) ?FARPROC; |
| 402 | | |
| 403 | | pub extern "kernel32" fn FreeLibrary(hModule: HMODULE) callconv(WINAPI) BOOL; |
| 404 | | |
| 405 | | pub extern "kernel32" fn InitializeCriticalSection(lpCriticalSection: *CRITICAL_SECTION) callconv(WINAPI) void; |
| 406 | | pub extern "kernel32" fn EnterCriticalSection(lpCriticalSection: *CRITICAL_SECTION) callconv(WINAPI) void; |
| 407 | | pub extern "kernel32" fn LeaveCriticalSection(lpCriticalSection: *CRITICAL_SECTION) callconv(WINAPI) void; |
| 408 | | pub extern "kernel32" fn DeleteCriticalSection(lpCriticalSection: *CRITICAL_SECTION) callconv(WINAPI) void; |
| 409 | | |
| 410 | | pub extern "kernel32" fn InitOnceExecuteOnce(InitOnce: *INIT_ONCE, InitFn: INIT_ONCE_FN, Parameter: ?*anyopaque, Context: ?*anyopaque) callconv(WINAPI) BOOL; |
| 411 | | |
| 412 | | pub extern "kernel32" fn K32EmptyWorkingSet(hProcess: HANDLE) callconv(WINAPI) BOOL; |
| 413 | | pub extern "kernel32" fn K32EnumDeviceDrivers(lpImageBase: [*]LPVOID, cb: DWORD, lpcbNeeded: *DWORD) callconv(WINAPI) BOOL; |
| 414 | | pub extern "kernel32" fn K32EnumPageFilesA(pCallBackRoutine: PENUM_PAGE_FILE_CALLBACKA, pContext: LPVOID) callconv(WINAPI) BOOL; |
| 415 | | pub extern "kernel32" fn K32EnumPageFilesW(pCallBackRoutine: PENUM_PAGE_FILE_CALLBACKW, pContext: LPVOID) callconv(WINAPI) BOOL; |
| 416 | | pub extern "kernel32" fn K32EnumProcessModules(hProcess: HANDLE, lphModule: [*]HMODULE, cb: DWORD, lpcbNeeded: *DWORD) callconv(WINAPI) BOOL; |
| 417 | | pub extern "kernel32" fn K32EnumProcessModulesEx(hProcess: HANDLE, lphModule: [*]HMODULE, cb: DWORD, lpcbNeeded: *DWORD, dwFilterFlag: DWORD) callconv(WINAPI) BOOL; |
| 418 | | pub extern "kernel32" fn K32EnumProcesses(lpidProcess: [*]DWORD, cb: DWORD, cbNeeded: *DWORD) callconv(WINAPI) BOOL; |
| 419 | | pub extern "kernel32" fn K32GetDeviceDriverBaseNameA(ImageBase: LPVOID, lpBaseName: LPSTR, nSize: DWORD) callconv(WINAPI) DWORD; |
| 420 | | pub extern "kernel32" fn K32GetDeviceDriverBaseNameW(ImageBase: LPVOID, lpBaseName: LPWSTR, nSize: DWORD) callconv(WINAPI) DWORD; |
| 421 | | pub extern "kernel32" fn K32GetDeviceDriverFileNameA(ImageBase: LPVOID, lpFilename: LPSTR, nSize: DWORD) callconv(WINAPI) DWORD; |
| 422 | | pub extern "kernel32" fn K32GetDeviceDriverFileNameW(ImageBase: LPVOID, lpFilename: LPWSTR, nSize: DWORD) callconv(WINAPI) DWORD; |
| 423 | | pub extern "kernel32" fn K32GetMappedFileNameA(hProcess: HANDLE, lpv: ?LPVOID, lpFilename: LPSTR, nSize: DWORD) callconv(WINAPI) DWORD; |
| 424 | | pub extern "kernel32" fn K32GetMappedFileNameW(hProcess: HANDLE, lpv: ?LPVOID, lpFilename: LPWSTR, nSize: DWORD) callconv(WINAPI) DWORD; |
| 425 | | pub extern "kernel32" fn K32GetModuleBaseNameA(hProcess: HANDLE, hModule: ?HMODULE, lpBaseName: LPSTR, nSize: DWORD) callconv(WINAPI) DWORD; |
| 426 | | pub extern "kernel32" fn K32GetModuleBaseNameW(hProcess: HANDLE, hModule: ?HMODULE, lpBaseName: LPWSTR, nSize: DWORD) callconv(WINAPI) DWORD; |
| 427 | | pub extern "kernel32" fn K32GetModuleFileNameExA(hProcess: HANDLE, hModule: ?HMODULE, lpFilename: LPSTR, nSize: DWORD) callconv(WINAPI) DWORD; |
| 428 | | pub extern "kernel32" fn K32GetModuleFileNameExW(hProcess: HANDLE, hModule: ?HMODULE, lpFilename: LPWSTR, nSize: DWORD) callconv(WINAPI) DWORD; |
| 429 | | pub extern "kernel32" fn K32GetModuleInformation(hProcess: HANDLE, hModule: HMODULE, lpmodinfo: *MODULEINFO, cb: DWORD) callconv(WINAPI) BOOL; |
| 430 | | pub extern "kernel32" fn K32GetPerformanceInfo(pPerformanceInformation: *PERFORMANCE_INFORMATION, cb: DWORD) callconv(WINAPI) BOOL; |
| 431 | | pub extern "kernel32" fn K32GetProcessImageFileNameA(hProcess: HANDLE, lpImageFileName: LPSTR, nSize: DWORD) callconv(WINAPI) DWORD; |
| 432 | | pub extern "kernel32" fn K32GetProcessImageFileNameW(hProcess: HANDLE, lpImageFileName: LPWSTR, nSize: DWORD) callconv(WINAPI) DWORD; |
| 433 | | pub extern "kernel32" fn K32GetProcessMemoryInfo(Process: HANDLE, ppsmemCounters: *PROCESS_MEMORY_COUNTERS, cb: DWORD) callconv(WINAPI) BOOL; |
| 434 | | pub extern "kernel32" fn K32GetWsChanges(hProcess: HANDLE, lpWatchInfo: *PSAPI_WS_WATCH_INFORMATION, cb: DWORD) callconv(WINAPI) BOOL; |
| 435 | | pub extern "kernel32" fn K32GetWsChangesEx(hProcess: HANDLE, lpWatchInfoEx: *PSAPI_WS_WATCH_INFORMATION_EX, cb: DWORD) callconv(WINAPI) BOOL; |
| 436 | | pub extern "kernel32" fn K32InitializeProcessForWsWatch(hProcess: HANDLE) callconv(WINAPI) BOOL; |
| 437 | | pub extern "kernel32" fn K32QueryWorkingSet(hProcess: HANDLE, pv: PVOID, cb: DWORD) callconv(WINAPI) BOOL; |
| 438 | | pub extern "kernel32" fn K32QueryWorkingSetEx(hProcess: HANDLE, pv: PVOID, cb: DWORD) callconv(WINAPI) BOOL; |
| 439 | | |
| 440 | | pub extern "kernel32" fn FlushFileBuffers(hFile: HANDLE) callconv(WINAPI) BOOL; |
| 441 | | |
| 442 | | pub extern "kernel32" fn WakeAllConditionVariable(c: *CONDITION_VARIABLE) callconv(WINAPI) void; |
| 443 | | pub extern "kernel32" fn WakeConditionVariable(c: *CONDITION_VARIABLE) callconv(WINAPI) void; |
| 444 | | pub extern "kernel32" fn SleepConditionVariableSRW( |
| 445 | | c: *CONDITION_VARIABLE, |
| 446 | | s: *SRWLOCK, |
| 447 | | t: DWORD, |
| 448 | | f: ULONG, |
| 610 | pub extern "kernel32" fn Module32Next( |
| 611 | hSnapshot: HANDLE, |
| 612 | lpme: *MODULEENTRY32, |
| 449 | 613 | ) callconv(WINAPI) BOOL; |
| 450 | 614 | |
| 451 | | pub extern "kernel32" fn TryAcquireSRWLockExclusive(s: *SRWLOCK) callconv(WINAPI) BOOLEAN; |
| 452 | | pub extern "kernel32" fn AcquireSRWLockExclusive(s: *SRWLOCK) callconv(WINAPI) void; |
| 453 | | pub extern "kernel32" fn ReleaseSRWLockExclusive(s: *SRWLOCK) callconv(WINAPI) void; |
| 615 | pub extern "kernel32" fn LoadLibraryW( |
| 616 | lpLibFileName: LPCWSTR, |
| 617 | ) callconv(WINAPI) ?HMODULE; |
| 618 | |
| 619 | pub extern "kernel32" fn LoadLibraryExW( |
| 620 | lpLibFileName: LPCWSTR, |
| 621 | hFile: ?HANDLE, |
| 622 | dwFlags: DWORD, |
| 623 | ) callconv(WINAPI) ?HMODULE; |
| 624 | |
| 625 | pub extern "kernel32" fn GetProcAddress( |
| 626 | hModule: HMODULE, |
| 627 | lpProcName: LPCSTR, |
| 628 | ) callconv(WINAPI) ?FARPROC; |
| 629 | |
| 630 | pub extern "kernel32" fn FreeLibrary( |
| 631 | hModule: HMODULE, |
| 632 | ) callconv(WINAPI) BOOL; |
| 633 | |
| 634 | // Error Management |
| 635 | |
| 636 | pub extern "kernel32" fn FormatMessageW( |
| 637 | dwFlags: DWORD, |
| 638 | lpSource: ?LPCVOID, |
| 639 | dwMessageId: Win32Error, |
| 640 | dwLanguageId: DWORD, |
| 641 | lpBuffer: LPWSTR, |
| 642 | nSize: DWORD, |
| 643 | Arguments: ?*va_list, |
| 644 | ) callconv(WINAPI) DWORD; |
| 645 | |
| 646 | // TODO: Getter for teb().LastErrorValue. |
| 647 | pub extern "kernel32" fn GetLastError() callconv(WINAPI) Win32Error; |
| 648 | |
| 649 | // TODO: Wrapper around RtlSetLastWin32Error. |
| 650 | pub extern "kernel32" fn SetLastError( |
| 651 | dwErrCode: Win32Error, |
| 652 | ) callconv(WINAPI) void; |
| 454 | 653 | |
| 455 | | pub extern "kernel32" fn RegOpenKeyExW( |
| 456 | | hkey: HKEY, |
| 457 | | lpSubKey: LPCWSTR, |
| 458 | | ulOptions: DWORD, |
| 459 | | samDesired: REGSAM, |
| 460 | | phkResult: *HKEY, |
| 461 | | ) callconv(WINAPI) LSTATUS; |
| 654 | // Everything Else |
| 462 | 655 | |
| 463 | | pub extern "kernel32" fn GetPhysicallyInstalledSystemMemory(TotalMemoryInKilobytes: *ULONGLONG) BOOL; |
| 656 | // TODO: |
| 657 | // Wrapper around KUSER_SHARED_DATA.SystemTime. |
| 658 | // Much better to use NtQuerySystemTime or NtQuerySystemTimePrecise for guaranteed 0.1ns precision. |
| 659 | pub extern "kernel32" fn GetSystemTimeAsFileTime( |
| 660 | lpSystemTimeAsFileTime: *FILETIME, |
| 661 | ) callconv(WINAPI) void; |