authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-12-09 15:03:17-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-12-09 15:03:17-07:00
log6e636064e6d993ebb0eb6ef386f5f19cb8727fe3
tree7ed7dafe4b2755cc43f18a6669d42bfded1c6c38
parentae3fd86dcc6f39601aa26ce1a6dc51a0db5cbf30

MoveFileEx can return ACCESS_DENIED

I observed this on Windows 10, trying to use MoveFileEx with MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH to overwrite a running executable.

1 files changed, 2 insertions(+), 1 deletions(-)

lib/std/os/windows.zig+2-1
......@@ -865,7 +865,7 @@ pub fn DeleteFile(sub_path_w: []const u16, options: DeleteFileOptions) DeleteFil
865865 }
866866}
867867
868pub const MoveFileError = error{ FileNotFound, Unexpected };
868pub const MoveFileError = error{ FileNotFound, AccessDenied, Unexpected };
869869
870870pub fn MoveFileEx(old_path: []const u8, new_path: []const u8, flags: DWORD) MoveFileError!void {
871871 const old_path_w = try sliceToPrefixedFileW(old_path);
......@@ -877,6 +877,7 @@ pub fn MoveFileExW(old_path: [*:0]const u16, new_path: [*:0]const u16, flags: DW
877877 if (kernel32.MoveFileExW(old_path, new_path, flags) == 0) {
878878 switch (kernel32.GetLastError()) {
879879 .FILE_NOT_FOUND => return error.FileNotFound,
880 .ACCESS_DENIED => return error.AccessDenied,
880881 else => |err| return unexpectedError(err),
881882 }
882883 }