aboutsummaryrefslogtreecommitdiff
path: root/std/os/windows.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2019-05-26 13:37:34 -0400
committerAndrew Kelley <andrew@ziglang.org>2019-05-26 18:32:45 -0400
commit44a049e01eef654fee82a1ee4e1aaf37447319ce (patch)
tree55fe1e7ae6920f19439d4f7d3424152a133203fb /std/os/windows.zig
parent2f040a23c8b968db56ab4c4725d6651f5ea3418e (diff)
downloadzig-44a049e01eef654fee82a1ee4e1aaf37447319ce.tar.gz
zig-44a049e01eef654fee82a1ee4e1aaf37447319ce.zip
more cleanup. down to just the `@hasDecl` builtin
Diffstat (limited to 'std/os/windows.zig')
-rw-r--r--std/os/windows.zig40
1 files changed, 40 insertions, 0 deletions
diff --git a/std/os/windows.zig b/std/os/windows.zig
index fbb8ff42c5..9bfeee9fe1 100644
--- a/std/os/windows.zig
+++ b/std/os/windows.zig
@@ -1140,6 +1140,46 @@ pub fn GetEnvironmentVariableW(lpName: LPWSTR, lpBuffer: LPWSTR, nSize: DWORD) G
return rc;
}
+pub const CreateProcessError = error{
+ FileNotFound,
+ InvalidName,
+ Unexpected,
+};
+
+pub fn CreateProcessW(
+ lpApplicationName: ?LPWSTR,
+ lpCommandLine: LPWSTR,
+ lpProcessAttributes: ?*SECURITY_ATTRIBUTES,
+ lpThreadAttributes: ?*SECURITY_ATTRIBUTES,
+ bInheritHandles: BOOL,
+ dwCreationFlags: DWORD,
+ lpEnvironment: ?*c_void,
+ lpCurrentDirectory: ?LPWSTR,
+ lpStartupInfo: *STARTUPINFOW,
+ lpProcessInformation: *PROCESS_INFORMATION,
+) CreateProcessError!void {
+ if (kernel32.CreateProcessW(
+ lpApplicationName,
+ lpCommandLine,
+ lpProcessAttributes,
+ lpThreadAttributes,
+ bInheritHandle,
+ dwCreationFlags,
+ lpEnvironment,
+ lpCurrentDirectory,
+ lpStartupInfo,
+ lpProcessInformation,
+ ) == 0) {
+ switch (kernel32.GetLastError()) {
+ ERROR.FILE_NOT_FOUND => return error.FileNotFound,
+ ERROR.PATH_NOT_FOUND => return error.FileNotFound,
+ ERROR.INVALID_PARAMETER => unreachable,
+ ERROR.INVALID_NAME => return error.InvalidName,
+ else => |err| return unexpectedError(err),
+ }
+ }
+}
+
pub fn cStrToPrefixedFileW(s: [*]const u8) ![PATH_MAX_WIDE + 1]u16 {
return sliceToPrefixedFileW(mem.toSliceConst(u8, s));
}