diff --git a/dll/win32/setupapi/queue.c b/dll/win32/setupapi/queue.c index f33fbb8f6fe..c262f07b95d 100644 --- a/dll/win32/setupapi/queue.c +++ b/dll/win32/setupapi/queue.c @@ -1210,16 +1210,34 @@ static BOOL do_file_copyW( LPCWSTR source, LPCWSTR target, DWORD style, } } if (style & (SP_COPY_NODECOMP | SP_COPY_LANGUAGEAWARE | SP_COPY_FORCE_IN_USE | - SP_COPY_IN_USE_NEEDS_REBOOT | SP_COPY_NOSKIP | SP_COPY_WARNIFSKIP)) + SP_COPY_NOSKIP | SP_COPY_WARNIFSKIP)) { ERR("Unsupported style(s) 0x%x\n",style); } if (docopy) { - rc = MoveFileExW(TempFile,target,MOVEFILE_REPLACE_EXISTING); - TRACE("Did copy... rc was %i\n",rc); + rc = CopyFileW(source,target,FALSE); + if (!rc && GetLastError() == ERROR_SHARING_VIOLATION && + (style & SP_COPY_IN_USE_NEEDS_REBOOT)) + { + WCHAR temp_file[MAX_PATH]; + WCHAR temp[MAX_PATH]; + + if (GetTempPathW(MAX_PATH, temp) && + GetTempFileNameW(temp, L"SET", 0, temp_file)) + { + rc = CopyFileW(source, temp_file, FALSE); + if (rc) + rc = MoveFileExW(temp_file, target, MOVEFILE_DELAY_UNTIL_REBOOT); + else + DeleteFileW(temp_file); + } + } + if (!rc) WARN( "failed to copy, err %u\n", GetLastError() ); } + else + SetLastError(ERROR_SUCCESS); /* after copy processing */ if (style & SP_COPY_DELETESOURCE)