authorgravatar for quae@daurnimator.comdaurnimator <quae@daurnimator.com> 2019-11-13 18:22:33+11:00
committergravatar for quae@daurnimator.comdaurnimator <quae@daurnimator.com> 2019-11-14 17:09:21+11:00
logd9d3268cc1fe6b581ccb44606346cb6847d557a5
tree62beebf3c91dfc9f65c71c4651e881ff1d932893
parentf4c6cc3270db8f3557b3e7191eccc02098b4b2da
signaturelock-open Commit is signed but in an unrecognized format.

std: add DeviceIoControl and GetOverlappedResult for windows


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
9797 }
9898}
9999
100pub 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
125pub 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
100136pub const SetHandleInformationError = error{Unexpected};
101137
102138pub 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
4545
4646pub extern "kernel32" stdcallcc fn CreateThread(lpThreadAttributes: ?LPSECURITY_ATTRIBUTES, dwStackSize: SIZE_T, lpStartAddress: LPTHREAD_START_ROUTINE, lpParameter: ?LPVOID, dwCreationFlags: DWORD, lpThreadId: ?LPDWORD) ?HANDLE;
4747
48pub 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
4859pub extern "kernel32" stdcallcc fn DeleteFileW(lpFileName: [*]const u16) BOOL;
4960
5061pub extern "kernel32" stdcallcc fn DuplicateHandle(hSourceProcessHandle: HANDLE, hSourceHandle: HANDLE, hTargetProcessHandle: HANDLE, lpTargetHandle: *HANDLE, dwDesiredAccess: DWORD, bInheritHandle: BOOL, dwOptions: DWORD) BOOL;