Module: wine Branch: refs/heads/master Commit: 698ee36c852ba6922f78a8d6a499e4dbe0faaa48 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=698ee36c852ba6922f78a8d6...
Author: James Hawkins truiken@gmail.com Date: Tue Apr 11 00:18:49 2006 -0500
advpack: Perform a setupapi-level install of the INF file in RunSetupCommand.
---
dlls/advpack/install.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 files changed, 38 insertions(+), 1 deletions(-)
diff --git a/dlls/advpack/install.c b/dlls/advpack/install.c index 1cc7d32..1378e9e 100644 --- a/dlls/advpack/install.c +++ b/dlls/advpack/install.c @@ -74,6 +74,40 @@ static BOOL is_full_path(LPWSTR path) return FALSE; }
+/* performs a setupapi-level install of the INF file */ +static HRESULT spapi_install(HINF hinf, LPCWSTR install_sec, LPCWSTR source_path) +{ + BOOL ret; + HRESULT res; + PVOID context; + + context = SetupInitDefaultQueueCallbackEx(NULL, INVALID_HANDLE_VALUE, 0, 0, NULL); + if (!context) + return ADV_HRESULT(GetLastError()); + + ret = SetupInstallFromInfSectionW(NULL, hinf, install_sec, SPINST_FILES, + NULL, source_path, SP_COPY_NEWER, + NULL, context, NULL, NULL); + if (!ret) + { + res = ADV_HRESULT(GetLastError()); + SetupTermDefaultQueueCallback(context); + + return res; + } + + SetupTermDefaultQueueCallback(context); + + ret = SetupInstallFromInfSectionW(NULL, hinf, install_sec, + SPINST_INIFILES | SPINST_REGISTRY, + HKEY_LOCAL_MACHINE, NULL, 0, + NULL, NULL, NULL, NULL); + if (!ret) + return ADV_HRESULT(GetLastError()); + + return S_OK; +} + /* this structure very closely resembles parameters of RunSetupCommand() */ typedef struct { @@ -438,6 +472,7 @@ HRESULT WINAPI RunSetupCommandW(HWND hWn DWORD dwFlags, LPVOID pvReserved) { HINF hinf; + HRESULT hr;
TRACE("(%p, %s, %s, %s, %s, %p, %ld, %p)\n", hWnd, debugstr_w(szCmdName), debugstr_w(szInfSection), @@ -457,6 +492,8 @@ HRESULT WINAPI RunSetupCommandW(HWND hWn if (hinf == INVALID_HANDLE_VALUE) return ADV_HRESULT(GetLastError());
+ hr = spapi_install(hinf, szInfSection, szDir); + SetupCloseInfFile(hinf); - return E_UNEXPECTED; + return hr; }