[PATCH][WIP][CONFTEST] kernel32/tests: Add extra ReplaceFileW tests

John Thomson git at johnthomson.fastmail.com.au
Wed Apr 8 06:59:31 CDT 2020


Troubleshooting ReplaceFileW failing with
ERROR_UNABLE_TO_REMOVE_REPLACED for inplace, without backup move
STATUS_CANNOT_DELETE from create_file

MoveFileExW
MoveFileWithProgressW
ReplaceFileW
GetTempPathW
MoveFileWithProgressW replace tempfile
DeleteFileW tempfile

dlls/ntdll/file.c
status = NtCreateFile(...
FILE_OPEN,  //disposition
FILE_DELETE_ON_CLOSE | FILE_NON_DIRECTORY_FILE, //options)

server/file.c
create_file
case FILE_OPEN:         flags = 0; break;

server/fd.c
check_sharing
open_fd
if ((options & FILE_DELETE_ON_CLOSE) && !(flags & O_CREAT) &&
            !(st.st_mode & (S_IWUSR | S_IWGRP | S_IWOTH)))

Signed-off-by: John Thomson <git at johnthomson.fastmail.com.au>
---
 dlls/kernel32/tests/file.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c
index 29620654bd..2ddabed8a4 100644
--- a/dlls/kernel32/tests/file.c
+++ b/dlls/kernel32/tests/file.c
@@ -3880,8 +3880,11 @@ static void test_ReplaceFileW(void)
     ret = GetTempFileNameW(temp_path, prefix, 0, replacement);
     ok(ret != 0, "GetTempFileNameW error (replacement) %d\n", GetLastError());
     ret = pReplaceFileW(replaced, replacement, NULL, 0, 0, 0);
-    ok(ret || GetLastError() == ERROR_ACCESS_DENIED,
-       "ReplaceFileW: error %d\n", GetLastError());
+    ok(ret || GetLastError() == ERROR_ACCESS_DENIED ||
+              GetLastError() == ERROR_UNABLE_TO_REMOVE_REPLACED ||
+              GetLastError() == ERROR_UNABLE_TO_MOVE_REPLACEMENT ||
+              GetLastError() == ERROR_UNABLE_TO_MOVE_REPLACEMENT_2,
+       "ReplaceFileW: ret %d error %d\n", ret, GetLastError());
 
     ret = GetTempFileNameW(temp_path, prefix, 0, replacement);
     ok(ret != 0, "GetTempFileNameW error (replacement) %d\n", GetLastError());
-- 
2.26.0




More information about the wine-devel mailing list