Index: copy.c =================================================================== --- dll/win32/kernel32/client/file/copy.c (revision 69896) +++ dll/win32/kernel32/client/file/copy.c (working copy) @@ -210,6 +210,8 @@ BOOL RC = FALSE; BOOL KeepDestOnError = FALSE; DWORD SystemError; + UNICODE_STRING NewFileName; + OBJECT_ATTRIBUTES ObjectAttributes; FileHandleSource = CreateFileW(lpExistingFileName, GENERIC_READ, @@ -241,16 +243,33 @@ TRACE("Status 0x%08x obtaining FileBasicInformation for source\n", errCode); BaseSetLastNTError(errCode); } + else if (!RtlDosPathNameToNtPathName_U(lpNewFileName, + &NewFileName, + NULL, + NULL)) + { + SetLastError(ERROR_FILE_NOT_FOUND); + } else { - FileHandleDest = CreateFileW(lpNewFileName, - GENERIC_WRITE, - FILE_SHARE_WRITE, - NULL, - dwCopyFlags ? CREATE_NEW : CREATE_ALWAYS, - FileBasic.FileAttributes, - NULL); - if (INVALID_HANDLE_VALUE != FileHandleDest) + InitializeObjectAttributes(&ObjectAttributes, + &NewFileName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + errCode = NtCreateFile(&FileHandleDest, + SYNCHRONIZE | GENERIC_WRITE, + &ObjectAttributes, + &IoStatusBlock, + &FileStandard.AllocationSize, + FileBasic.FileAttributes, + FILE_SHARE_WRITE, + dwCopyFlags ? FILE_CREATE : FILE_SUPERSEDE, + FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT, + NULL, + 0); + RtlFreeHeap(RtlGetProcessHeap(), 0, NewFileName.Buffer); + if (NT_SUCCESS(errCode)) { errCode = CopyLoop(FileHandleSource, FileHandleDest,