[PATCH v2 2/2] kernelbase: Convert DOS to NT path for FileRenameInfo in SetFileInformationByHandle.
Roman Pišl
rpisl at seznam.cz
Tue Mar 23 09:16:40 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 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..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