| author | |
| committer | |
| log | d9d3268cc1fe6b581ccb44606346cb6847d557a5 |
| tree | 62beebf3c91dfc9f65c71c4651e881ff1d932893 |
| parent | f4c6cc3270db8f3557b3e7191eccc02098b4b2da |
| signature |
2 files changed, 47 insertions(+), 0 deletions(-)
lib/std/os/windows.zig+36| ... | @@ -97,6 +97,42 @@ pub fn CreatePipe(rd: *HANDLE, wr: *HANDLE, sattr: *const SECURITY_ATTRIBUTES) C | ... | @@ -97,6 +97,42 @@ pub fn CreatePipe(rd: *HANDLE, wr: *HANDLE, sattr: *const SECURITY_ATTRIBUTES) C |
| 97 | } | 97 | } |
| 98 | } | 98 | } |
| 99 | 99 | ||
| 100 | pub fn DeviceIoControl( | ||
| 101 | h: HANDLE, | ||
| 102 | ioControlCode: DWORD, | ||
| 103 | in: ?[]const u8, | ||
| 104 | out: ?[]u8, | ||
| 105 | overlapped: ?*OVERLAPPED, | ||
| 106 | ) !DWORD { | ||
| 107 | var bytes: DWORD = undefined; | ||
| 108 | if (kernel32.DeviceIoControl( | ||
| 109 | h, | ||
| 110 | ioControlCode, | ||
| 111 | if (in) |i| i.ptr else null, | ||
| 112 | if (in) |i| @intCast(u32, i.len) else 0, | ||
| 113 | if (out) |o| o.ptr else null, | ||
| 114 | if (out) |o| @intCast(u32, o.len) else 0, | ||
| 115 | &bytes, | ||
| 116 | overlapped, | ||
| 117 | ) == 0) { | ||
| 118 | switch (kernel32.GetLastError()) { | ||
| 119 | else => |err| return unexpectedError(err), | ||
| 120 | } | ||
| 121 | } | ||
| 122 | return bytes; | ||
| 123 | } | ||
| 124 | |||
| 125 | pub fn GetOverlappedResult(h: HANDLE, overlapped: *OVERLAPPED, wait: bool) !DWORD { | ||
| 126 | var bytes: DWORD = undefined; | ||
| 127 | if (kernel32.GetOverlappedResult(h, overlapped, &bytes, wait) == 0) { | ||
| 128 | switch (kernel32.GetLastError()) { | ||
| 129 | ERROR_IO_INCOMPLETE => if (!wait) return error.WouldBlock else unreachable, | ||
| 130 | else => |err| return unexpectedError(err), | ||
| 131 | } | ||
| 132 | } | ||
| 133 | return bytes; | ||
| 134 | } | ||
| 135 | |||
| 100 | pub const SetHandleInformationError = error{Unexpected}; | 136 | pub const SetHandleInformationError = error{Unexpected}; |
| 101 | 137 | ||
| 102 | pub fn SetHandleInformation(h: HANDLE, mask: DWORD, flags: DWORD) SetHandleInformationError!void { | 138 | pub fn SetHandleInformation(h: HANDLE, mask: DWORD, flags: DWORD) SetHandleInformationError!void { |
lib/std/os/windows/kernel32.zig+11| ... | @@ -45,6 +45,17 @@ pub extern "kernel32" stdcallcc fn CreateIoCompletionPort(FileHandle: HANDLE, Ex | ... | @@ -45,6 +45,17 @@ pub extern "kernel32" stdcallcc fn CreateIoCompletionPort(FileHandle: HANDLE, Ex |
| 45 | 45 | ||
| 46 | pub extern "kernel32" stdcallcc fn CreateThread(lpThreadAttributes: ?LPSECURITY_ATTRIBUTES, dwStackSize: SIZE_T, lpStartAddress: LPTHREAD_START_ROUTINE, lpParameter: ?LPVOID, dwCreationFlags: DWORD, lpThreadId: ?LPDWORD) ?HANDLE; | 46 | pub extern "kernel32" stdcallcc fn CreateThread(lpThreadAttributes: ?LPSECURITY_ATTRIBUTES, dwStackSize: SIZE_T, lpStartAddress: LPTHREAD_START_ROUTINE, lpParameter: ?LPVOID, dwCreationFlags: DWORD, lpThreadId: ?LPDWORD) ?HANDLE; |
| 47 | 47 | ||
| 48 | pub extern "kernel32" stdcallcc fn DeviceIoControl( | ||
| 49 | h: HANDLE, | ||
| 50 | dwIoControlCode: DWORD, | ||
| 51 | lpInBuffer: ?*const c_void, | ||
| 52 | nInBufferSize: DWORD, | ||
| 53 | lpOutBuffer: ?LPVOID, | ||
| 54 | nOutBufferSize: DWORD, | ||
| 55 | lpBytesReturned: LPDWORD, | ||
| 56 | lpOverlapped: ?*OVERLAPPED, | ||
| 57 | ) BOOL; | ||
| 58 | |||
| 48 | pub extern "kernel32" stdcallcc fn DeleteFileW(lpFileName: [*]const u16) BOOL; | 59 | pub extern "kernel32" stdcallcc fn DeleteFileW(lpFileName: [*]const u16) BOOL; |
| 49 | 60 | ||
| 50 | pub extern "kernel32" stdcallcc fn DuplicateHandle(hSourceProcessHandle: HANDLE, hSourceHandle: HANDLE, hTargetProcessHandle: HANDLE, lpTargetHandle: *HANDLE, dwDesiredAccess: DWORD, bInheritHandle: BOOL, dwOptions: DWORD) BOOL; | 61 | pub extern "kernel32" stdcallcc fn DuplicateHandle(hSourceProcessHandle: HANDLE, hSourceHandle: HANDLE, hTargetProcessHandle: HANDLE, lpTargetHandle: *HANDLE, dwDesiredAccess: DWORD, bInheritHandle: BOOL, dwOptions: DWORD) BOOL; |