Skip to content

Windows: extend some type conversion definitions #4766

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 16, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 19 additions & 24 deletions Sources/Foundation/FileManager+Win32.swift
Original file line number Diff line number Diff line change
Expand Up @@ -404,9 +404,9 @@ extension FileManager {

let handle: HANDLE = try FileManager.default._fileSystemRepresentation(withPath: path) {
CreateFileW($0, GENERIC_READ,
DWORD(FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE),
nil, DWORD(OPEN_EXISTING),
DWORD(FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS),
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
nil, OPEN_EXISTING,
FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS,
nil)
}
if handle == INVALID_HANDLE_VALUE {
Expand Down Expand Up @@ -518,10 +518,9 @@ extension FileManager {
let hFile: HANDLE = try FileManager.default._fileSystemRepresentation(withPath: path) {
// BACKUP_SEMANTICS are (confusingly) required in order to receive a
// handle to a directory
CreateFileW($0, /*dwDesiredAccess=*/DWORD(0),
DWORD(FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE),
/*lpSecurityAttributes=*/nil, DWORD(OPEN_EXISTING),
DWORD(FILE_FLAG_BACKUP_SEMANTICS), /*hTemplateFile=*/nil)
CreateFileW($0, 0,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, nil)
}
if hFile == INVALID_HANDLE_VALUE {
return try FileManager.default._fileSystemRepresentation(withPath: path) {
Expand Down Expand Up @@ -744,10 +743,8 @@ extension FileManager {
do { faAttributes = try windowsFileAttributes(atPath: path) } catch { return false }
if faAttributes.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT == FILE_ATTRIBUTE_REPARSE_POINT {
let handle: HANDLE = (try? FileManager.default._fileSystemRepresentation(withPath: path) {
CreateFileW($0, /* dwDesiredAccess= */ DWORD(0),
DWORD(FILE_SHARE_READ), /* lpSecurityAttributes= */ nil,
DWORD(OPEN_EXISTING),
DWORD(FILE_FLAG_BACKUP_SEMANTICS), /* hTemplateFile= */ nil)
CreateFileW($0, 0, FILE_SHARE_READ, nil, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS, nil)
}) ?? INVALID_HANDLE_VALUE
if handle == INVALID_HANDLE_VALUE { return false }
defer { CloseHandle(handle) }
Expand Down Expand Up @@ -822,11 +819,9 @@ extension FileManager {

var statInfo = stat()
let handle =
CreateFileW(_fsRep, /*dwDesiredAccess=*/DWORD(0),
DWORD(FILE_SHARE_READ), /*lpSecurityAttributes=*/nil,
DWORD(OPEN_EXISTING),
DWORD(FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS),
/*hTemplateFile=*/nil)
CreateFileW(_fsRep, 0, FILE_SHARE_READ, nil, OPEN_EXISTING,
FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS,
nil)
if handle == INVALID_HANDLE_VALUE {
throw _NSErrorWithWindowsError(GetLastError(), reading: false, paths: [path])
}
Expand Down Expand Up @@ -872,19 +867,19 @@ extension FileManager {
internal func _contentsEqual(atPath path1: String, andPath path2: String) -> Bool {
let path1Handle: HANDLE = (try? FileManager.default._fileSystemRepresentation(withPath: path1) {
CreateFileW($0, GENERIC_READ,
DWORD(FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE),
nil, DWORD(OPEN_EXISTING),
DWORD(FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS),
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
nil, OPEN_EXISTING,
FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS,
nil)
}) ?? INVALID_HANDLE_VALUE
if path1Handle == INVALID_HANDLE_VALUE { return false }
defer { CloseHandle(path1Handle) }

let path2Handle: HANDLE = (try? FileManager.default._fileSystemRepresentation(withPath: path2) {
CreateFileW($0, GENERIC_READ,
DWORD(FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE),
nil, DWORD(OPEN_EXISTING),
DWORD(FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS),
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
nil, OPEN_EXISTING,
FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS,
nil)
}) ?? INVALID_HANDLE_VALUE
if path2Handle == INVALID_HANDLE_VALUE { return false }
Expand Down Expand Up @@ -972,8 +967,8 @@ extension FileManager {
FILETIME(from: time_t((modificationTime ?? stat.lastModificationDate).timeIntervalSince1970))

let hFile: HANDLE =
CreateFileW(fsr, DWORD(GENERIC_WRITE), DWORD(FILE_SHARE_WRITE),
nil, DWORD(OPEN_EXISTING), 0, nil)
CreateFileW(fsr, GENERIC_WRITE, FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0,
nil)
if hFile == INVALID_HANDLE_VALUE {
throw _NSErrorWithWindowsError(GetLastError(), reading: true, paths: [path])
}
Expand Down
9 changes: 4 additions & 5 deletions Sources/Foundation/FileManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1300,11 +1300,10 @@ public struct FileAttributeType : RawRepresentable, Equatable, Hashable {
} else if attributes.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT == FILE_ATTRIBUTE_REPARSE_POINT {
// A reparse point may or may not actually be a symbolic link, we need to read the reparse tag
let handle: HANDLE = (try? FileManager.default._fileSystemRepresentation(withPath: path) {
CreateFileW($0, /*dwDesiredAccess=*/DWORD(0),
DWORD(FILE_SHARE_READ | FILE_SHARE_WRITE),
/*lpSecurityAttributes=*/nil, DWORD(OPEN_EXISTING),
DWORD(FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS),
/*hTemplateFile=*/nil)
CreateFileW($0, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, nil,
OPEN_EXISTING,
FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS,
nil)
}) ?? INVALID_HANDLE_VALUE
if handle == INVALID_HANDLE_VALUE {
self = .typeUnknown
Expand Down
10 changes: 3 additions & 7 deletions Sources/Foundation/NSPathUtilities.swift
Original file line number Diff line number Diff line change
Expand Up @@ -762,13 +762,9 @@ internal func _NSCreateTemporaryFile(_ filePath: String) throws -> (Int32, Strin
throw _NSErrorWithWindowsError(GetLastError(), reading: false)
}
let pathResult = FileManager.default.string(withFileSystemRepresentation: String(decoding: buf, as: UTF16.self), length: wcslen(buf))
guard let h = CreateFileW(buf,
GENERIC_READ | DWORD(GENERIC_WRITE),
DWORD(FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE),
nil,
DWORD(OPEN_EXISTING),
FILE_ATTRIBUTE_NORMAL,
nil),
guard let h = CreateFileW(buf, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nil),
h != INVALID_HANDLE_VALUE else {
throw _NSErrorWithWindowsError(GetLastError(), reading: false)
}
Expand Down
5 changes: 2 additions & 3 deletions Sources/Foundation/NSURL.swift
Original file line number Diff line number Diff line change
Expand Up @@ -927,9 +927,8 @@ extension NSURL {
#if os(Windows)
let hFile: HANDLE = absolutePath.withCString(encodedAs: UTF16.self) {
CreateFileW($0, GENERIC_READ,
DWORD(FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE),
nil, DWORD(OPEN_EXISTING),
DWORD(FILE_FLAG_BACKUP_SEMANTICS), nil)
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, nil)
}
guard hFile == INVALID_HANDLE_VALUE else {
defer { CloseHandle(hFile) }
Expand Down
28 changes: 28 additions & 0 deletions Sources/Foundation/WinSDK+Extensions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,32 @@ internal var FILE_ATTRIBUTE_READONLY: DWORD {
internal var FILE_ATTRIBUTE_REPARSE_POINT: DWORD {
DWORD(WinSDK.FILE_ATTRIBUTE_REPARSE_POINT)
}

internal var FILE_FLAG_BACKUP_SEMANTICS: DWORD {
DWORD(WinSDK.FILE_FLAG_BACKUP_SEMANTICS)
}

internal var FILE_FLAG_OPEN_REPARSE_POINT: DWORD {
DWORD(WinSDK.FILE_FLAG_OPEN_REPARSE_POINT)
}

internal var FILE_SHARE_DELETE: DWORD {
DWORD(WinSDK.FILE_SHARE_DELETE)
}

internal var FILE_SHARE_READ: DWORD {
DWORD(WinSDK.FILE_SHARE_READ)
}

internal var FILE_SHARE_WRITE: DWORD {
DWORD(WinSDK.FILE_SHARE_WRITE)
}

internal var GENERIC_WRITE: DWORD {
DWORD(WinSDK.GENERIC_WRITE)
}

internal var OPEN_EXISTING: DWORD {
DWORD(WinSDK.OPEN_EXISTING)
}
#endif
6 changes: 3 additions & 3 deletions Tests/Foundation/Tests/TestFileHandle.swift
Original file line number Diff line number Diff line change
Expand Up @@ -133,9 +133,9 @@ class TestFileHandle : XCTestCase {
// NOTE(compnerd) we need the FILE_FLAG_BACKUP_SEMANTICS so that we
// can create the handle to the directory.
CreateFileW($0, GENERIC_READ,
DWORD(FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE),
nil, DWORD(OPEN_EXISTING),
DWORD(FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS), nil)
FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE,
nil, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS, nil)
}
if hDirectory == INVALID_HANDLE_VALUE {
fatalError("unable to create handle to current directory")
Expand Down