[PATCH 2/2] kernel32: Make CopyFile(Ex)() succeed even if the source file is delete-locked.

Charles Davis cdavis5x at gmail.com
Thu Jan 17 14:28:44 CST 2013


The tests mention that this is the behavior of recent Windows versions
of NT vintage (Vista, Server 2008, 7). Additionally, software in the
wild, like the installer for Microsoft Visual Studio 2010, already
depends on this behavior.
---
 dlls/kernel32/path.c       | 3 ++-
 dlls/kernel32/tests/file.c | 4 ++--
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/dlls/kernel32/path.c b/dlls/kernel32/path.c
index 9b0e2b8..0b2fb3e 100644
--- a/dlls/kernel32/path.c
+++ b/dlls/kernel32/path.c
@@ -957,7 +957,8 @@ BOOL WINAPI CopyFileExW(LPCWSTR source, LPCWSTR dest,
 
     TRACE("%s -> %s, %x\n", debugstr_w(source), debugstr_w(dest), copyFlags);
 
-    if ((h1 = CreateFileW(source, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
+    if ((h1 = CreateFileW(source, GENERIC_READ,
+                     FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
                      NULL, OPEN_EXISTING, 0, 0)) == INVALID_HANDLE_VALUE)
     {
         WARN("Unable to open source %s\n", debugstr_w(source));
diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c
index ce25cb9..3216fa5 100644
--- a/dlls/kernel32/tests/file.c
+++ b/dlls/kernel32/tests/file.c
@@ -652,11 +652,11 @@ static void test_CopyFileA(void)
         "copying from an r+w opened and r shared file failed (ret=%d, err=%d)\n", retok, GetLastError());
     CloseHandle(hfile);
 
-    /* copying from a delete-locked source is unreliable */
+    /* copying from a delete-locked source mostly succeeds */
     hfile = CreateFileA(source, DELETE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
     ok(hfile != INVALID_HANDLE_VALUE, "failed to open source file, error %d\n", GetLastError());
     retok = CopyFileA(source, dest, FALSE);
-    ok((!retok && GetLastError() == ERROR_SHARING_VIOLATION) || broken(retok) /* 98, Vista, 2k8, 7 */,
+    ok(retok || broken(!retok && GetLastError() == ERROR_SHARING_VIOLATION) /* NT, 2000, XP */,
         "copying from a delete-locked file failed (ret=%d, err=%d)\n", retok, GetLastError());
     CloseHandle(hfile);
 
-- 
1.7.12.4




More information about the wine-patches mailing list