[PATCH 2/2] kernelbase: Convert DOS to NT path for FileRenameInfo in SetFileInformationByHandle.

Roman Pišl rpisl at seznam.cz
Tue Mar 23 07:56:02 CDT 2021


Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50756
Signed-off-by: Roman Pišl <rpisl at seznam.cz>
---
 dlls/kernel32/tests/file.c |  4 ----
 dlls/kernelbase/file.c     | 25 +++++++++++++++++++++++--
 2 files changed, 23 insertions(+), 6 deletions(-)

diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c
index c4c3823aa59..96ad0f42a14 100644
--- a/dlls/kernel32/tests/file.c
+++ b/dlls/kernel32/tests/file.c
@@ -5323,26 +5323,22 @@ 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 error %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());
 
     HeapFree(GetProcessHeap(), 0, fri);
     CloseHandle(file);
 
     file = CreateFileW(tempFileTo2, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
-todo_wine
     ok(file != INVALID_HANDLE_VALUE, "file not renamed, error %d\n", GetLastError());
     CloseHandle(file);
 
diff --git a/dlls/kernelbase/file.c b/dlls/kernelbase/file.c
index 23a36b0a765..d06bb26b8e5 100644
--- a/dlls/kernelbase/file.c
+++ b/dlls/kernelbase/file.c
@@ -3556,8 +3556,29 @@ 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 (!RtlDosPathNameToNtPathName_U( ((FILE_RENAME_INFORMATION *)info)->FileName, &nt_name, NULL, NULL ))
+            {
+                SetLastError( ERROR_PATH_NOT_FOUND );
+                return FALSE;
+            }
+
+            size = sizeof(*rename_info) + nt_name.Length;
+            if (!(rename_info = HeapAlloc( GetProcessHeap(), 0, size ))) return FALSE;
+
+            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;
+            RtlFreeUnicodeString( &nt_name );
+
+            status = NtSetInformationFile( file, &io, rename_info, size, FileRenameInformation );
+            HeapFree( GetProcessHeap(), 0, rename_info );
+            break;
+        }
     case FileStandardInfo:
     case FileCompressionInfo:
     case FileAttributeTagInfo:
-- 
2.20.1




More information about the wine-devel mailing list