Roman Pišl : kernelbase: Convert DOS to NT path for FileRenameInfo in SetFileInformationByHandle.
Alexandre Julliard
julliard at winehq.org
Tue Mar 23 16:54:32 CDT 2021
Module: wine
Branch: master
Commit: 33c6a6cb285800cac60ceab5868122fa8d9cda92
URL: https://source.winehq.org/git/wine.git/?a=commit;h=33c6a6cb285800cac60ceab5868122fa8d9cda92
Author: Roman Pišl <rpisl at seznam.cz>
Date: Tue Mar 23 15:16:40 2021 +0100
kernelbase: Convert DOS to NT path for FileRenameInfo in SetFileInformationByHandle.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50756
Signed-off-by: Roman Pišl <rpisl at seznam.cz>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/kernel32/tests/file.c | 4 ----
dlls/kernelbase/file.c | 23 +++++++++++++++++++++--
2 files changed, 21 insertions(+), 6 deletions(-)
diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c
index f2254d4e988..5deed96abf3 100644
--- a/dlls/kernel32/tests/file.c
+++ b/dlls/kernel32/tests/file.c
@@ -5322,24 +5322,20 @@ static void test_SetFileRenameInfo(void)
fri->FileNameLength = wcslen(tempFileTo1) * sizeof(WCHAR);
memcpy(fri->FileName, tempFileTo1, fri->FileNameLength + sizeof(WCHAR));
ret = pSetFileInformationByHandle(file, FileRenameInfo, fri, size);
-todo_wine
ok(!ret && GetLastError() == ERROR_ALREADY_EXISTS, "FileRenameInfo unexpected result %d\n", GetLastError());
fri->ReplaceIfExists = TRUE;
ret = pSetFileInformationByHandle(file, FileRenameInfo, fri, size);
-todo_wine
ok(ret, "FileRenameInfo failed, error %d\n", GetLastError());
fri->ReplaceIfExists = FALSE;
fri->FileNameLength = wcslen(tempFileTo2) * sizeof(WCHAR);
memcpy(fri->FileName, tempFileTo2, fri->FileNameLength + sizeof(WCHAR));
ret = pSetFileInformationByHandle(file, FileRenameInfo, fri, size);
-todo_wine
ok(ret, "FileRenameInfo failed, error %d\n", GetLastError());
CloseHandle(file);
file = CreateFileW(tempFileTo2, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
-todo_wine
ok(file != INVALID_HANDLE_VALUE, "file not renamed, error %d\n", GetLastError());
fri->FileNameLength = wcslen(tempFileTo1) * sizeof(WCHAR);
diff --git a/dlls/kernelbase/file.c b/dlls/kernelbase/file.c
index 23a36b0a765..e0a75c2ad08 100644
--- a/dlls/kernelbase/file.c
+++ b/dlls/kernelbase/file.c
@@ -3556,8 +3556,27 @@ BOOL WINAPI DECLSPEC_HOTPATCH SetFileInformationByHandle( HANDLE file, FILE_INFO
status = NtSetInformationFile( file, &io, info, size, FileIoPriorityHintInformation );
break;
case FileRenameInfo:
- status = NtSetInformationFile( file, &io, info, size, FileRenameInformation );
- break;
+ {
+ FILE_RENAME_INFORMATION *rename_info;
+ UNICODE_STRING nt_name;
+ ULONG size;
+
+ if ((status = RtlDosPathNameToNtPathName_U_WithStatus( ((FILE_RENAME_INFORMATION *)info)->FileName,
+ &nt_name, NULL, NULL )))
+ break;
+
+ size = sizeof(*rename_info) + nt_name.Length;
+ if ((rename_info = HeapAlloc( GetProcessHeap(), 0, size )))
+ {
+ memcpy( rename_info, info, sizeof(*rename_info) );
+ memcpy( rename_info->FileName, nt_name.Buffer, nt_name.Length + sizeof(WCHAR) );
+ rename_info->FileNameLength = nt_name.Length;
+ status = NtSetInformationFile( file, &io, rename_info, size, FileRenameInformation );
+ HeapFree( GetProcessHeap(), 0, rename_info );
+ }
+ RtlFreeUnicodeString( &nt_name );
+ break;
+ }
case FileStandardInfo:
case FileCompressionInfo:
case FileAttributeTagInfo:
More information about the wine-cvs
mailing list