authorgravatar for quae@daurnimator.comdaurnimator <quae@daurnimator.com> 2019-11-14 16:34:13+11:00
committergravatar for quae@daurnimator.comdaurnimator <quae@daurnimator.com> 2019-11-15 10:31:52+11:00
log431eeb5e20d20584688235078c9f5d730e59a5b9
treedc4a8685bef3af590101ca39758d6148e4f06960
parent3b8afe31a0c4cc1f6febb5f83566a897f765c98e
signaturelock-open Commit is signed but in an unrecognized format.

std: add pieces for WSAIoctl on windows


2 files changed, 70 insertions(+), 0 deletions(-)

lib/std/os/windows.zig+29
......@@ -647,6 +647,35 @@ pub fn WSASocketW(
647647 return rc;
648648}
649649
650pub fn WSAIoctl(
651 s: ws2_32.SOCKET,
652 dwIoControlCode: DWORD,
653 inBuffer: ?[]const u8,
654 outBuffer: []u8,
655 overlapped: ?*ws2_32.WSAOVERLAPPED,
656 completionRoutine: ?*ws2_32.WSAOVERLAPPED_COMPLETION_ROUTINE,
657) !DWORD {
658 var bytes: DWORD = undefined;
659 switch (ws2_32.WSAIoctl(
660 s,
661 dwIoControlCode,
662 if (inBuffer) |i| i.ptr else null,
663 if (inBuffer) |i| @intCast(DWORD, i.len) else 0,
664 outBuffer.ptr,
665 @intCast(DWORD, outBuffer.len),
666 &bytes,
667 overlapped,
668 completionRoutine,
669 )) {
670 0 => {},
671 ws2_32.SOCKET_ERROR => switch (ws2_32.WSAGetLastError()) {
672 else => |err| return unexpectedWSAError(err),
673 },
674 else => unreachable,
675 }
676 return bytes;
677}
678
650679const GetModuleFileNameError = error{Unexpected};
651680
652681pub fn GetModuleFileNameW(hModule: ?HMODULE, buf_ptr: [*]u16, buf_len: DWORD) GetModuleFileNameError![]u16 {
lib/std/os/windows/ws2_32.zig+41
......@@ -96,6 +96,23 @@ pub const WSA_FLAG_MULTIPOINT_D_LEAF = 0x10;
9696pub const WSA_FLAG_ACCESS_SYSTEM_SECURITY = 0x40;
9797pub const WSA_FLAG_NO_HANDLE_INHERIT = 0x80;
9898
99pub const WSAEVENT = HANDLE;
100
101pub const WSAOVERLAPPED = extern struct {
102 Internal: DWORD,
103 InternalHigh: DWORD,
104 Offset: DWORD,
105 OffsetHigh: DWORD,
106 hEvent: ?WSAEVENT,
107};
108
109pub const WSAOVERLAPPED_COMPLETION_ROUTINE = extern fn (
110 dwError: DWORD,
111 cbTransferred: DWORD,
112 lpOverlapped: *WSAOVERLAPPED,
113 dwFlags: DWORD
114) void;
115
99116pub const WSA_INVALID_HANDLE = 6;
100117pub const WSA_NOT_ENOUGH_MEMORY = 8;
101118pub const WSA_INVALID_PARAMETER = 87;
......@@ -192,6 +209,19 @@ pub const WSA_QOS_ESDMODEOBJ = 11029;
192209pub const WSA_QOS_ESHAPERATEOBJ = 11030;
193210pub const WSA_QOS_RESERVED_PETYPE = 11031;
194211
212
213/// no parameters
214const IOC_VOID = 0x80000000;
215/// copy out parameters
216const IOC_OUT = 0x40000000;
217/// copy in parameters
218const IOC_IN = 0x80000000;
219
220/// The IOCTL is a generic Windows Sockets 2 IOCTL code. New IOCTL codes defined for Windows Sockets 2 will have T == 1.
221const IOC_WS2 = 0x08000000;
222
223pub const SIO_BASE_HANDLE = IOC_OUT | IOC_WS2 | 34;
224
195225pub extern "ws2_32" stdcallcc fn WSAStartup(
196226 wVersionRequired: WORD,
197227 lpWSAData: *WSADATA,
......@@ -214,3 +244,14 @@ pub extern "ws2_32" stdcallcc fn WSASocketW(
214244 g: GROUP,
215245 dwFlags: DWORD,
216246) SOCKET;
247pub extern "ws2_32" stdcallcc fn WSAIoctl(
248 s: SOCKET,
249 dwIoControlCode: DWORD,
250 lpvInBuffer: ?*const c_void,
251 cbInBuffer: DWORD,
252 lpvOutBuffer: ?LPVOID,
253 cbOutBuffer: DWORD,
254 lpcbBytesReturned: LPDWORD,
255 lpOverlapped: ?*WSAOVERLAPPED,
256 lpCompletionRoutine: ?*WSAOVERLAPPED_COMPLETION_ROUTINE,
257) c_int;