Commit b05a5a3e52

daurnimator <quae@daurnimator.com>
2019-11-19 06:38:23
std: add CreateEvent for windows
1 parent 78c0d33
Changed files (3)
lib/std/os/windows/bits.zig
@@ -489,6 +489,13 @@ pub const FILE_ATTRIBUTE_SYSTEM = 0x4;
 pub const FILE_ATTRIBUTE_TEMPORARY = 0x100;
 pub const FILE_ATTRIBUTE_VIRTUAL = 0x10000;
 
+// flags for CreateEvent
+pub const CREATE_EVENT_INITIAL_SET = 0x00000002;
+pub const CREATE_EVENT_MANUAL_RESET = 0x00000001;
+
+pub const EVENT_ALL_ACCESS = 0x1F0003;
+pub const EVENT_MODIFY_STATE = 0x0002;
+
 pub const PROCESS_INFORMATION = extern struct {
     hProcess: HANDLE,
     hThread: HANDLE,
lib/std/os/windows/kernel32.zig
@@ -9,6 +9,13 @@ pub extern "kernel32" stdcallcc fn CloseHandle(hObject: HANDLE) BOOL;
 
 pub extern "kernel32" stdcallcc fn CreateDirectoryW(lpPathName: [*]const u16, lpSecurityAttributes: ?*SECURITY_ATTRIBUTES) BOOL;
 
+pub extern "kernel32" stdcallcc fn CreateEventExW(
+    lpEventAttributes: ?*SECURITY_ATTRIBUTES,
+    lpName: [*:0]const u16,
+    dwFlags: DWORD,
+    dwDesiredAccess: DWORD,
+) ?HANDLE;
+
 pub extern "kernel32" stdcallcc fn CreateFileW(
     lpFileName: [*]const u16, // TODO null terminated pointer type
     dwDesiredAccess: DWORD,
lib/std/os/windows.zig
@@ -97,6 +97,22 @@ pub fn CreatePipe(rd: *HANDLE, wr: *HANDLE, sattr: *const SECURITY_ATTRIBUTES) C
     }
 }
 
+pub fn CreateEventEx(attributes: ?*SECURITY_ATTRIBUTES, name: []const u8, flags: DWORD, desired_access: DWORD) !HANDLE {
+    const nameW = try sliceToPrefixedFileW(name);
+    return CreateEventExW(attributes, &nameW, flags, desired_access);
+}
+
+pub fn CreateEventExW(attributes: ?*SECURITY_ATTRIBUTES, nameW: [*:0]const u16, flags: DWORD, desired_access: DWORD) !HANDLE {
+    const handle = kernel32.CreateEventExW(attributes, nameW, flags, desired_access);
+    if (handle) |h| {
+        return h;
+    } else {
+        switch (kernel32.GetLastError()) {
+            else => |err| return unexpectedError(err),
+        }
+    }
+}
+
 pub fn DeviceIoControl(
     h: HANDLE,
     ioControlCode: DWORD,