From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/kernel32/tests/file.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c index db3ffc655ce..2ae7a67735a 100644 --- a/dlls/kernel32/tests/file.c +++ b/dlls/kernel32/tests/file.c @@ -4849,6 +4849,22 @@ static void test_ReOpenFile(void) ret = DeleteFileA(filename); ok(ret, "failed to delete file, error %lu\n", GetLastError());
+ /* FILE_FLAG_BACKUP_SEMANTICS is allowed, but unlike with CreateFile(), + * it cannot be used to open a directory. */ + + ret = CreateDirectoryA(filename, NULL); + ok(ret == TRUE, "got error %lu\n", GetLastError()); + file = CreateFileA(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + ok(file != INVALID_HANDLE_VALUE, "got error %lu\n", GetLastError()); + new = pReOpenFile(file, GENERIC_READ, FILE_SHARE_READ, FILE_FLAG_BACKUP_SEMANTICS); + todo_wine ok(new == INVALID_HANDLE_VALUE, "expected failure\n"); + todo_wine ok(GetLastError() == ERROR_ACCESS_DENIED, "got error %lu\n", GetLastError()); + CloseHandle(new); + CloseHandle(file); + + ret = RemoveDirectoryA(filename); + ok(ret == TRUE, "got error %lu\n", GetLastError()); + file = CreateNamedPipeA("\\.\pipe\test_pipe", PIPE_ACCESS_DUPLEX, 0, 1, 1000, 1000, 1000, NULL); ok(file != INVALID_HANDLE_VALUE, "failed to create pipe, error %lu\n", GetLastError());
From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/kernel32/tests/file.c | 5 ++--- dlls/kernelbase/file.c | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c index 2ae7a67735a..2ab3d148b29 100644 --- a/dlls/kernel32/tests/file.c +++ b/dlls/kernel32/tests/file.c @@ -4857,9 +4857,8 @@ static void test_ReOpenFile(void) file = CreateFileA(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); ok(file != INVALID_HANDLE_VALUE, "got error %lu\n", GetLastError()); new = pReOpenFile(file, GENERIC_READ, FILE_SHARE_READ, FILE_FLAG_BACKUP_SEMANTICS); - todo_wine ok(new == INVALID_HANDLE_VALUE, "expected failure\n"); - todo_wine ok(GetLastError() == ERROR_ACCESS_DENIED, "got error %lu\n", GetLastError()); - CloseHandle(new); + ok(new == INVALID_HANDLE_VALUE, "expected failure\n"); + ok(GetLastError() == ERROR_ACCESS_DENIED, "got error %lu\n", GetLastError()); CloseHandle(file);
ret = RemoveDirectoryA(filename); diff --git a/dlls/kernelbase/file.c b/dlls/kernelbase/file.c index b637e92bbce..213cb926d7c 100644 --- a/dlls/kernelbase/file.c +++ b/dlls/kernelbase/file.c @@ -3382,7 +3382,7 @@ HANDLE WINAPI DECLSPEC_HOTPATCH ReOpenFile( HANDLE handle, DWORD access, DWORD s }
status = NtCreateFile( &file, access | SYNCHRONIZE | FILE_READ_ATTRIBUTES, &attr, &io, NULL, - 0, sharing, FILE_OPEN, get_nt_file_options( attributes ), NULL, 0 ); + 0, sharing, FILE_OPEN, FILE_NON_DIRECTORY_FILE | get_nt_file_options( attributes ), NULL, 0 ); if (!set_ntstatus( status )) return INVALID_HANDLE_VALUE; return file;
This does not fix any known application. I added it to effectively document a confusing quirk of ReOpenFile() I encountered while writing other tests.