/* performs a setupapi-level install of the INF file */ static HRESULT spapi_install(const ADVInfo *info) { BOOL ret; HRESULT res; PVOID context; context = SetupInitDefaultQueueCallbackEx(NULL, INVALID_HANDLE_VALUE, 0, 0, NULL); if (!context) return ADV_HRESULT(GetLastError()); ret = SetupInstallFromInfSectionW(NULL, info->hinf, info->install_sec, SPINST_FILES, NULL, info->working_dir, SP_COPY_NEWER, SetupDefaultQueueCallbackW, context, NULL, NULL); if (!ret) { res = ADV_HRESULT(GetLastError()); SetupTermDefaultQueueCallback(context); return res; } SetupTermDefaultQueueCallback(context); ret = SetupInstallFromInfSectionW(NULL, info->hinf, info->install_sec, SPINST_INIFILES | SPINST_REGISTRY | SPINST_REGSVR, HKEY_LOCAL_MACHINE, NULL, 0, NULL, NULL, NULL, NULL); if (!ret) return ADV_HRESULT(GetLastError()); return S_OK; }
static void test_defaultcallback(void) { struct default_callback_context *ctxt; static const DWORD magic = 0x43515053; /* "SPQC" */ HWND owner, progress; owner = (HWND)0x123; progress = (HWND)0x456; ctxt = SetupInitDefaultQueueCallbackEx(owner, progress, WM_USER, 0, NULL); ok(ctxt != NULL, "got %p\n", ctxt); ok(ctxt->magic == magic || broken(ctxt->magic != magic) /* win2000 */, "got magic 0x%08x\n", ctxt->magic); if (ctxt->magic == magic) { ok(ctxt->owner == owner, "got %p, expected %p\n", ctxt->owner, owner); ok(ctxt->progress == progress, "got %p, expected %p\n", ctxt->progress, progress); ok(ctxt->message == WM_USER, "got %d, expected %d\n", ctxt->message, WM_USER); SetupTermDefaultQueueCallback(ctxt); } else { win_skip("Skipping tests on old systems.\n"); SetupTermDefaultQueueCallback(ctxt); return; } ctxt = SetupInitDefaultQueueCallback(owner); ok(ctxt->magic == magic, "got magic 0x%08x\n", ctxt->magic); ok(ctxt->owner == owner, "got %p, expected %p\n", ctxt->owner, owner); ok(ctxt->progress == NULL, "got %p, expected %p\n", ctxt->progress, progress); ok(ctxt->message == 0, "got %d\n", ctxt->message); SetupTermDefaultQueueCallback(ctxt); }
/*********************************************************************** * AdvInstallFileW (ADVPACK.@) * * Copies a file from the source to a destination. * * PARAMS * hwnd [I] Handle to the window used for messages. * lpszSourceDir [I] Source directory. * lpszSourceFile [I] Source filename. * lpszDestDir [I] Destination directory. * lpszDestFile [I] Optional destination filename. * dwFlags [I] See advpub.h. * dwReserved [I] Reserved. Must be 0. * * RETURNS * Success: S_OK. * Failure: E_FAIL. * * NOTES * If lpszDestFile is NULL, the destination filename is the same as * lpszSourceFIle. */ HRESULT WINAPI AdvInstallFileW(HWND hwnd, LPCWSTR lpszSourceDir, LPCWSTR lpszSourceFile, LPCWSTR lpszDestDir, LPCWSTR lpszDestFile, DWORD dwFlags, DWORD dwReserved) { PSP_FILE_CALLBACK_W pFileCallback; LPWSTR szDestFilename; LPCWSTR szPath; WCHAR szRootPath[ROOT_LENGTH]; DWORD dwLen, dwLastError; HSPFILEQ fileQueue; PVOID pContext; TRACE("(%p, %s, %s, %s, %s, %d, %d)\n", hwnd, debugstr_w(lpszSourceDir), debugstr_w(lpszSourceFile), debugstr_w(lpszDestDir), debugstr_w(lpszDestFile), dwFlags, dwReserved); if (!lpszSourceDir || !lpszSourceFile || !lpszDestDir) return E_INVALIDARG; fileQueue = SetupOpenFileQueue(); if (fileQueue == INVALID_HANDLE_VALUE) return HRESULT_FROM_WIN32(GetLastError()); pContext = NULL; dwLastError = ERROR_SUCCESS; lstrcpynW(szRootPath, lpszSourceDir, ROOT_LENGTH); szPath = lpszSourceDir + ROOT_LENGTH; /* use lpszSourceFile as destination filename if lpszDestFile is NULL */ if (lpszDestFile) { dwLen = lstrlenW(lpszDestFile); szDestFilename = HeapAlloc(GetProcessHeap(), 0, (dwLen+1) * sizeof(WCHAR)); lstrcpyW(szDestFilename, lpszDestFile); } else { dwLen = lstrlenW(lpszSourceFile); szDestFilename = HeapAlloc(GetProcessHeap(), 0, (dwLen+1) * sizeof(WCHAR)); lstrcpyW(szDestFilename, lpszSourceFile); } /* add the file copy operation to the setup queue */ if (!SetupQueueCopyW(fileQueue, szRootPath, szPath, lpszSourceFile, NULL, NULL, lpszDestDir, szDestFilename, dwFlags)) { dwLastError = GetLastError(); goto done; } pContext = SetupInitDefaultQueueCallbackEx(hwnd, INVALID_HANDLE_VALUE, 0, 0, NULL); if (!pContext) { dwLastError = GetLastError(); goto done; } /* don't output anything for AIF_QUIET */ if (dwFlags & AIF_QUIET) pFileCallback = pQuietQueueCallback; else pFileCallback = pQueueCallback; /* perform the file copy */ if (!SetupCommitFileQueueW(hwnd, fileQueue, pFileCallback, pContext)) { dwLastError = GetLastError(); goto done; } done: SetupTermDefaultQueueCallback(pContext); SetupCloseFileQueue(fileQueue); HeapFree(GetProcessHeap(), 0, szDestFilename); return HRESULT_FROM_WIN32(dwLastError); }