diff --git a/lib/std/heap.zig b/lib/std/heap.zig index c35e6f6684..445b5da455 100644 --- a/lib/std/heap.zig +++ b/lib/std/heap.zig @@ -46,7 +46,7 @@ pub var next_mmap_addr_hint: ?[*]align(page_size_min) u8 = null; /// comptime-known minimum page size of the target. /// -/// All pointers from `mmap` or `VirtualAlloc` are aligned to at least +/// All pointers from `mmap` or `NtAllocateVirtualMemory` are aligned to at least /// `page_size_min`, but their actual alignment may be bigger. /// /// This value can be overridden via `std.options.page_size_min`. diff --git a/lib/std/os.zig b/lib/std/os.zig index 5efca5899c..110c92da2b 100644 --- a/lib/std/os.zig +++ b/lib/std/os.zig @@ -56,21 +56,6 @@ pub var argv: [][*:0]u8 = if (builtin.link_libc) undefined else switch (native_o else => undefined, }; -/// Call from Windows-specific code if you already have a WTF-16LE encoded, null terminated string. -/// Otherwise use `access`. -pub fn accessW(path: [*:0]const u16) windows.GetFileAttributesError!void { - const ret = try windows.GetFileAttributesW(path); - if (ret != windows.INVALID_FILE_ATTRIBUTES) { - return; - } - switch (windows.GetLastError()) { - .FILE_NOT_FOUND => return error.FileNotFound, - .PATH_NOT_FOUND => return error.FileNotFound, - .ACCESS_DENIED => return error.AccessDenied, - else => |err| return windows.unexpectedError(err), - } -} - pub fn isGetFdPathSupportedOnTarget(os: std.Target.Os) bool { return switch (os.tag) { .windows, diff --git a/lib/std/os/windows.zig b/lib/std/os/windows.zig index a855a58d4f..3265dc4074 100644 --- a/lib/std/os/windows.zig +++ b/lib/std/os/windows.zig @@ -306,22 +306,6 @@ pub fn CreatePipe(rd: *HANDLE, wr: *HANDLE, sattr: *const SECURITY_ATTRIBUTES) C wr.* = write; } -pub fn CreateEventEx(attributes: ?*SECURITY_ATTRIBUTES, name: []const u8, flags: DWORD, desired_access: DWORD) !HANDLE { - const nameW = try sliceToPrefixedFileW(null, name); - return CreateEventExW(attributes, nameW.span().ptr, flags, desired_access); -} - -pub fn CreateEventExW(attributes: ?*SECURITY_ATTRIBUTES, nameW: ?LPCWSTR, flags: DWORD, desired_access: DWORD) !HANDLE { - const handle = kernel32.CreateEventExW(attributes, nameW, flags, desired_access); - if (handle) |h| { - return h; - } else { - switch (GetLastError()) { - else => |err| return unexpectedError(err), - } - } -} - pub const DeviceIoControlError = error{ AccessDenied, /// The volume does not contain a recognized file system. File system @@ -598,10 +582,6 @@ pub fn CloseHandle(hObject: HANDLE) void { assert(ntdll.NtClose(hObject) == .SUCCESS); } -pub fn FindClose(hFindFile: HANDLE) void { - assert(kernel32.FindClose(hFindFile) != 0); -} - pub const ReadFileError = error{ BrokenPipe, /// The specified network name is no longer available. @@ -1515,30 +1495,6 @@ pub fn GetFileSizeEx(hFile: HANDLE) GetFileSizeError!u64 { return @as(u64, @bitCast(file_size)); } -pub const GetFileAttributesError = error{ - FileNotFound, - AccessDenied, - Unexpected, -}; - -pub fn GetFileAttributes(filename: []const u8) (GetFileAttributesError || Wtf8ToPrefixedFileWError)!DWORD { - const filename_w = try sliceToPrefixedFileW(null, filename); - return GetFileAttributesW(filename_w.span().ptr); -} - -pub fn GetFileAttributesW(lpFileName: [*:0]const u16) GetFileAttributesError!DWORD { - const rc = kernel32.GetFileAttributesW(lpFileName); - if (rc == INVALID_FILE_ATTRIBUTES) { - switch (GetLastError()) { - .FILE_NOT_FOUND => return error.FileNotFound, - .PATH_NOT_FOUND => return error.FileNotFound, - .ACCESS_DENIED => return error.AccessDenied, - else => |err| return unexpectedError(err), - } - } - return rc; -} - pub fn getpeername(s: ws2_32.SOCKET, name: *ws2_32.sockaddr, namelen: *ws2_32.socklen_t) i32 { return ws2_32.getpeername(s, name, @as(*i32, @ptrCast(namelen))); } @@ -1657,6 +1613,7 @@ pub const NtFreeVirtualMemoryError = error{ }; pub fn NtFreeVirtualMemory(hProcess: HANDLE, addr: ?*PVOID, size: *SIZE_T, free_type: ULONG) NtFreeVirtualMemoryError!void { + // TODO: If the return value is .INVALID_PAGE_PROTECTION, call RtlFlushSecureMemoryCache and try again. return switch (ntdll.NtFreeVirtualMemory(hProcess, addr, size, free_type)) { .SUCCESS => return, .ACCESS_DENIED => NtFreeVirtualMemoryError.AccessDenied, @@ -1665,20 +1622,6 @@ pub fn NtFreeVirtualMemory(hProcess: HANDLE, addr: ?*PVOID, size: *SIZE_T, free_ }; } -pub const VirtualAllocError = error{Unexpected}; - -pub fn VirtualAlloc(addr: ?LPVOID, size: usize, alloc_type: DWORD, flProtect: DWORD) VirtualAllocError!LPVOID { - return kernel32.VirtualAlloc(addr, size, alloc_type, flProtect) orelse { - switch (GetLastError()) { - else => |err| return unexpectedError(err), - } - }; -} - -pub fn VirtualFree(lpAddress: ?LPVOID, dwSize: usize, dwFreeType: DWORD) void { - assert(kernel32.VirtualFree(lpAddress, dwSize, dwFreeType) != 0); -} - pub const VirtualProtectError = error{ InvalidAddress, Unexpected, @@ -1713,19 +1656,6 @@ pub fn VirtualProtectEx(handle: HANDLE, addr: ?LPVOID, size: SIZE_T, new_prot: D } } -pub const VirtualQueryError = error{Unexpected}; - -pub fn VirtualQuery(lpAddress: ?LPVOID, lpBuffer: PMEMORY_BASIC_INFORMATION, dwLength: SIZE_T) VirtualQueryError!SIZE_T { - const rc = kernel32.VirtualQuery(lpAddress, lpBuffer, dwLength); - if (rc == 0) { - switch (GetLastError()) { - else => |err| return unexpectedError(err), - } - } - - return rc; -} - pub const SetConsoleTextAttributeError = error{Unexpected}; pub fn SetConsoleTextAttribute(hConsoleOutput: HANDLE, wAttributes: WORD) SetConsoleTextAttributeError!void { @@ -2628,16 +2558,6 @@ test ntToWin32Namespace { try std.testing.expectError(error.NameTooLong, ntToWin32Namespace(L("\\??\\C:\\test"), &too_small_buf)); } -fn getFullPathNameW(path: [*:0]const u16, out: []u16) !usize { - const result = kernel32.GetFullPathNameW(path, @as(u32, @intCast(out.len)), out.ptr, null); - if (result == 0) { - switch (GetLastError()) { - else => |err| return unexpectedError(err), - } - } - return result; -} - inline fn MAKELANGID(p: c_ushort, s: c_ushort) LANGID { return (s << 10) | p; } diff --git a/lib/std/os/windows/kernel32.zig b/lib/std/os/windows/kernel32.zig index 98d72a04e1..c32294c125 100644 --- a/lib/std/os/windows/kernel32.zig +++ b/lib/std/os/windows/kernel32.zig @@ -86,23 +86,6 @@ pub extern "kernel32" fn CreateNamedPipeW( lpSecurityAttributes: ?*const SECURITY_ATTRIBUTES, ) callconv(.winapi) HANDLE; -pub extern "kernel32" fn FindFirstFileW( - lpFileName: LPCWSTR, - lpFindFileData: *WIN32_FIND_DATAW, -) callconv(.winapi) HANDLE; - -pub extern "kernel32" fn FindClose( - hFindFile: HANDLE, -) callconv(.winapi) BOOL; - -// TODO: Wrapper around RtlGetFullPathName_UEx -pub extern "kernel32" fn GetFullPathNameW( - lpFileName: LPCWSTR, - nBufferLength: DWORD, - lpBuffer: LPWSTR, - lpFilePart: ?*?LPWSTR, -) callconv(.winapi) DWORD; - // TODO: Matches `STD_*_HANDLE` to peb().ProcessParameters.Standard* pub extern "kernel32" fn GetStdHandle( nStdHandle: DWORD, @@ -162,11 +145,6 @@ pub extern "kernel32" fn GetCurrentDirectoryW( lpBuffer: ?[*]WCHAR, ) callconv(.winapi) DWORD; -// TODO: RtlDosPathNameToNtPathNameU_WithStatus + NtQueryAttributesFile. -pub extern "kernel32" fn GetFileAttributesW( - lpFileName: LPCWSTR, -) callconv(.winapi) DWORD; - pub extern "kernel32" fn ReadFile( hFile: HANDLE, lpBuffer: LPVOID, @@ -182,14 +160,6 @@ pub extern "kernel32" fn GetSystemDirectoryW( // I/O - Kernel Objects -// TODO: Wrapper around NtCreateEvent. -pub extern "kernel32" fn CreateEventExW( - lpEventAttributes: ?*SECURITY_ATTRIBUTES, - lpName: ?LPCWSTR, - dwFlags: DWORD, - dwDesiredAccess: DWORD, -) callconv(.winapi) ?HANDLE; - // TODO: Wrapper around GetStdHandle + NtDuplicateObject. pub extern "kernel32" fn DuplicateHandle( hSourceProcessHandle: HANDLE, @@ -318,9 +288,6 @@ pub extern "kernel32" fn GetExitCodeProcess( lpExitCode: *DWORD, ) callconv(.winapi) BOOL; -// TODO: Already a wrapper for this, see `windows.GetCurrentProcess`. -pub extern "kernel32" fn GetCurrentProcess() callconv(.winapi) HANDLE; - // TODO: Wrapper around RtlSetEnvironmentVar. pub extern "kernel32" fn SetEnvironmentVariableW( lpName: LPCWSTR, @@ -465,29 +432,6 @@ pub extern "kernel32" fn HeapValidate( lpMem: ?*const anyopaque, ) callconv(.winapi) BOOL; -// TODO: Wrapper around NtAllocateVirtualMemory. -pub extern "kernel32" fn VirtualAlloc( - lpAddress: ?LPVOID, - dwSize: SIZE_T, - flAllocationType: DWORD, - flProtect: DWORD, -) callconv(.winapi) ?LPVOID; - -// TODO: Wrapper around NtFreeVirtualMemory. -// If the return value is .INVALID_PAGE_PROTECTION, calls RtlFlushSecureMemoryCache and try again. -pub extern "kernel32" fn VirtualFree( - lpAddress: ?LPVOID, - dwSize: SIZE_T, - dwFreeType: DWORD, -) callconv(.winapi) BOOL; - -// TODO: Wrapper around NtQueryVirtualMemory. -pub extern "kernel32" fn VirtualQuery( - lpAddress: ?LPVOID, - lpBuffer: PMEMORY_BASIC_INFORMATION, - dwLength: SIZE_T, -) callconv(.winapi) SIZE_T; - // TODO: Getter for peb.ProcessHeap pub extern "kernel32" fn GetProcessHeap() callconv(.winapi) ?HANDLE; diff --git a/lib/std/posix.zig b/lib/std/posix.zig index 13d16ea324..2d33eb92b8 100644 --- a/lib/std/posix.zig +++ b/lib/std/posix.zig @@ -4409,7 +4409,7 @@ pub fn mmap( /// Note that while POSIX allows unmapping a region in the middle of an existing mapping, /// Zig's munmap function does not, for two reasons: /// * It violates the Zig principle that resource deallocation must succeed. -/// * The Windows function, VirtualFree, has this restriction. +/// * The Windows function, NtFreeVirtualMemory, has this restriction. pub fn munmap(memory: []align(page_size_min) const u8) void { switch (errno(system.munmap(memory.ptr, memory.len))) { .SUCCESS => return,