/*********************************************************************** * LaunchINFSectionExW (ADVPACK.@) * * Installs an INF section with BACKUP/ROLLBACK capabilities. * * PARAMS * hWnd [I] Handle to parent window, NULL for desktop. * hInst [I] Instance of the process. * cmdline [I] Contains parameters in the order INF,section,CAB,flags,reboot. * show [I] How the window should be shown. * * RETURNS * Success: ADV_SUCCESS. * Failure: ADV_FAILURE. * * NOTES * INF - Filename of the INF to launch. * section - INF section to install. * flags - see advpub.h. * reboot - smart reboot behavior * 'A' Always reboot. * 'I' Reboot if needed (default). * 'N' No reboot. * * BUGS * Doesn't handle the reboot flag. */ HRESULT WINAPI LaunchINFSectionExW(HWND hWnd, HINSTANCE hInst, LPWSTR cmdline, INT show) { LPWSTR cmdline_copy, cmdline_ptr; LPWSTR flags, ptr; CABINFOW cabinfo; HRESULT hr; TRACE("(%p, %p, %s, %d)\n", hWnd, hInst, debugstr_w(cmdline), show); if (!cmdline) return ADV_FAILURE; cmdline_copy = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(cmdline) + 1) * sizeof(WCHAR)); cmdline_ptr = cmdline_copy; lstrcpyW(cmdline_copy, cmdline); cabinfo.pszInf = get_parameter(&cmdline_ptr, ',', TRUE); cabinfo.pszSection = get_parameter(&cmdline_ptr, ',', TRUE); cabinfo.pszCab = get_parameter(&cmdline_ptr, ',', TRUE); *cabinfo.szSrcPath = '\0'; flags = get_parameter(&cmdline_ptr, ',', TRUE); if (flags) cabinfo.dwFlags = atolW(flags); if (!is_full_path(cabinfo.pszCab) && !is_full_path(cabinfo.pszInf)) { HeapFree(GetProcessHeap(), 0, cmdline_copy); return E_INVALIDARG; } /* get the source path from the cab filename */ if (cabinfo.pszCab && *cabinfo.pszCab) { if (!is_full_path(cabinfo.pszCab)) lstrcpyW(cabinfo.szSrcPath, cabinfo.pszInf); else lstrcpyW(cabinfo.szSrcPath, cabinfo.pszCab); ptr = strrchrW(cabinfo.szSrcPath, '\\'); *(++ptr) = '\0'; } hr = ExecuteCabW(hWnd, &cabinfo, NULL); HeapFree(GetProcessHeap(), 0, cmdline_copy); return SUCCEEDED(hr) ? ADV_SUCCESS : ADV_FAILURE; }
/*********************************************************************** * RegInstallW (advpack.@) * * Loads an INF from a string resource, adds entries to the string * substitution table, and executes the INF. * * PARAMS * hm [I] Module that contains the REGINST resource. * pszSection [I] The INF section to execute. * pstTable [I] Table of string substitutions. * * RETURNS * Success: S_OK. * Failure: E_FAIL. */ HRESULT WINAPI RegInstallW(HMODULE hm, LPCWSTR pszSection, const STRTABLEW* pstTable) { unsigned int i; CABINFOW cabinfo; WCHAR tmp_ini_path[MAX_PATH]; HRESULT hr = E_FAIL; TRACE("(%p, %s, %p)\n", hm, debugstr_w(pszSection), pstTable); if(!create_tmp_ini_file(hm, tmp_ini_path)) return E_FAIL; if (write_predefined_strings(hm, tmp_ini_path) != S_OK) goto done; /* Write the additional string table */ if (pstTable) { for(i = 0; i < pstTable->cEntries; i++) { WCHAR tmp_value[MAX_PATH + 2]; tmp_value[0] = '\"'; lstrcpyW(tmp_value + 1, pstTable->pse[i].pszValue); lstrcatW(tmp_value, quote); WritePrivateProfileStringW(Strings, pstTable->pse[i].pszName, tmp_value, tmp_ini_path); } } /* flush cache */ WritePrivateProfileStringW(NULL, NULL, NULL, tmp_ini_path); /* FIXME: read AdvOptions val for dwFlags */ ZeroMemory(&cabinfo, sizeof(CABINFOW)); cabinfo.pszInf = tmp_ini_path; cabinfo.pszSection = (LPWSTR)pszSection; cabinfo.dwFlags = 0; hr = ExecuteCabW(NULL, &cabinfo, NULL); done: DeleteFileW(tmp_ini_path); return hr; }
/*********************************************************************** * ExecuteCabA (ADVPACK.@) * * See ExecuteCabW. */ HRESULT WINAPI ExecuteCabA(HWND hwnd, CABINFOA* pCab, LPVOID pReserved) { UNICODE_STRING cab, inf, section; CABINFOW cabinfo; HRESULT hr; TRACE("(%p, %p, %p)\n", hwnd, pCab, pReserved); if (!pCab) return E_INVALIDARG; if (pCab->pszCab) { RtlCreateUnicodeStringFromAsciiz(&cab, pCab->pszCab); cabinfo.pszCab = cab.Buffer; } else cabinfo.pszCab = NULL; RtlCreateUnicodeStringFromAsciiz(&inf, pCab->pszInf); RtlCreateUnicodeStringFromAsciiz(§ion, pCab->pszSection); MultiByteToWideChar(CP_ACP, 0, pCab->szSrcPath, -1, cabinfo.szSrcPath, sizeof(cabinfo.szSrcPath) / sizeof(WCHAR)); cabinfo.pszInf = inf.Buffer; cabinfo.pszSection = section.Buffer; cabinfo.dwFlags = pCab->dwFlags; hr = ExecuteCabW(hwnd, &cabinfo, pReserved); if (pCab->pszCab) RtlFreeUnicodeString(&cab); RtlFreeUnicodeString(&inf); RtlFreeUnicodeString(§ion); return hr; }