|  | /* | 
|  | * Advpack install functions | 
|  | * | 
|  | * Copyright 2006 James Hawkins | 
|  | * | 
|  | * This library is free software; you can redistribute it and/or | 
|  | * modify it under the terms of the GNU Lesser General Public | 
|  | * License as published by the Free Software Foundation; either | 
|  | * version 2.1 of the License, or (at your option) any later version. | 
|  | * | 
|  | * This library is distributed in the hope that it will be useful, | 
|  | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|  | * Lesser General Public License for more details. | 
|  | * | 
|  | * You should have received a copy of the GNU Lesser General Public | 
|  | * License along with this library; if not, write to the Free Software | 
|  | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | 
|  | */ | 
|  |  | 
|  | #include <stdarg.h> | 
|  | #include <stdlib.h> | 
|  |  | 
|  | #include "windef.h" | 
|  | #include "winbase.h" | 
|  | #include "winuser.h" | 
|  | #include "winreg.h" | 
|  | #include "winver.h" | 
|  | #include "setupapi.h" | 
|  | #include "advpub.h" | 
|  | #include "wine/debug.h" | 
|  |  | 
|  | WINE_DEFAULT_DEBUG_CHANNEL(advpack); | 
|  |  | 
|  | /* this structure very closely resembles parameters of RunSetupCommand() */ | 
|  | typedef struct | 
|  | { | 
|  | HWND hwnd; | 
|  | LPCSTR title; | 
|  | LPCSTR inf_name; | 
|  | LPCSTR dir; | 
|  | LPCSTR section_name; | 
|  | } SETUPCOMMAND_PARAMS; | 
|  |  | 
|  | /*********************************************************************** | 
|  | *      DoInfInstall  (ADVPACK.@) | 
|  | * | 
|  | * Install an INF section. | 
|  | * | 
|  | * PARAMS | 
|  | *  setup [I] Structure containing install information. | 
|  | * | 
|  | * RETURNS | 
|  | *   S_OK                                Everything OK | 
|  | *   HRESULT_FROM_WIN32(GetLastError())  Some other error | 
|  | */ | 
|  | HRESULT WINAPI DoInfInstall(const SETUPCOMMAND_PARAMS *setup) | 
|  | { | 
|  | BOOL ret; | 
|  | HINF hinf; | 
|  | void *callback_context; | 
|  |  | 
|  | TRACE("%p %s %s %s %s\n", setup->hwnd, debugstr_a(setup->title), | 
|  | debugstr_a(setup->inf_name), debugstr_a(setup->dir), | 
|  | debugstr_a(setup->section_name)); | 
|  |  | 
|  | hinf = SetupOpenInfFileA(setup->inf_name, NULL, INF_STYLE_WIN4, NULL); | 
|  | if (hinf == INVALID_HANDLE_VALUE) return HRESULT_FROM_WIN32(GetLastError()); | 
|  |  | 
|  | callback_context = SetupInitDefaultQueueCallback(setup->hwnd); | 
|  |  | 
|  | ret = SetupInstallFromInfSectionA(NULL, hinf, setup->section_name, SPINST_ALL, | 
|  | NULL, NULL, 0, SetupDefaultQueueCallbackA, | 
|  | callback_context, NULL, NULL); | 
|  | SetupTermDefaultQueueCallback(callback_context); | 
|  | SetupCloseInfFile(hinf); | 
|  |  | 
|  | return ret ? S_OK : HRESULT_FROM_WIN32(GetLastError()); | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | *             ExecuteCab    (ADVPACK.@) | 
|  | * | 
|  | * Installs the INF file extracted from a specified cabinet file. | 
|  | * | 
|  | * PARAMS | 
|  | *   hwnd      [I] Handle to the window used for the display. | 
|  | *   pCab      [I] Information about the cabinet file. | 
|  | *   pReserved [I] Reserved.  Must be NULL. | 
|  | * | 
|  | * RETURNS | 
|  | *   Success: S_OK. | 
|  | *   Failure: E_FAIL. | 
|  | * | 
|  | * BUGS | 
|  | *   Unimplemented | 
|  | */ | 
|  | HRESULT WINAPI ExecuteCab( HWND hwnd, PCABINFO pCab, LPVOID pReserved ) | 
|  | { | 
|  | FIXME("(%p %p %p): stub\n", hwnd, pCab, pReserved); | 
|  | return E_FAIL; | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | *      LaunchINFSection  (ADVPACK.@) | 
|  | * | 
|  | * Installs an INF section without 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,flags. | 
|  | *   show    [I] Reboot behaviour: | 
|  | *              'A' reboot always | 
|  | *              'I' default, reboot if needed | 
|  | *              'N' no reboot | 
|  | * | 
|  | * RETURNS | 
|  | *  Success: S_OK. | 
|  | *  Failure: S_FALSE | 
|  | * | 
|  | * BUGS | 
|  | *  Unimplemented. | 
|  | */ | 
|  | INT WINAPI LaunchINFSection( HWND hWnd, HINSTANCE hInst, LPSTR cmdline, INT show ) | 
|  | { | 
|  | FIXME("(%p %p %s %d): stub\n", hWnd, hInst, debugstr_a(cmdline), show ); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | *      LaunchINFSectionEx  (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. | 
|  | *   show    [I] Reboot behaviour: | 
|  | *              'A' reboot always | 
|  | *              'I' default, reboot if needed | 
|  | *              'N' no reboot | 
|  | * | 
|  | * RETURNS | 
|  | *  Success: S_OK. | 
|  | *  Failure: E_FAIL. | 
|  | * | 
|  | * BUGS | 
|  | *  Unimplemented. | 
|  | */ | 
|  | HRESULT WINAPI LaunchINFSectionEx( HWND hWnd, HINSTANCE hInst, LPSTR cmdline, INT show ) | 
|  | { | 
|  | FIXME("(%p %p %s %d): stub\n", hWnd, hInst, debugstr_a(cmdline), show ); | 
|  | return E_FAIL; | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | *      RunSetupCommand  (ADVPACK.@) | 
|  | * | 
|  | * Executes an install section in an INF file or a program. | 
|  | * | 
|  | * PARAMS | 
|  | *   hWnd          [I] Handle to parent window, NULL for quiet mode | 
|  | *   szCmdName     [I] Inf or EXE filename to execute | 
|  | *   szInfSection  [I] Inf section to install, NULL for DefaultInstall | 
|  | *   szDir         [I] Path to extracted files | 
|  | *   szTitle       [I] Title of all dialogs | 
|  | *   phEXE         [O] Handle of EXE to wait for | 
|  | *   dwFlags       [I] Flags; see include/advpub.h | 
|  | *   pvReserved    [I] Reserved | 
|  | * | 
|  | * RETURNS | 
|  | *   S_OK                                 Everything OK | 
|  | *   S_ASYNCHRONOUS                       OK, required to wait on phEXE | 
|  | *   ERROR_SUCCESS_REBOOT_REQUIRED        Reboot required | 
|  | *   E_INVALIDARG                         Invalid argument given | 
|  | *   HRESULT_FROM_WIN32(ERROR_OLD_WIN_VERSION) | 
|  | *                                        Not supported on this Windows version | 
|  | *   E_UNEXPECTED                         Unexpected error | 
|  | *   HRESULT_FROM_WIN32(GetLastError())   Some other error | 
|  | * | 
|  | * BUGS | 
|  | *   Unimplemented | 
|  | */ | 
|  | HRESULT WINAPI RunSetupCommand( HWND hWnd, LPCSTR szCmdName, | 
|  | LPCSTR szInfSection, LPCSTR szDir, | 
|  | LPCSTR lpszTitle, HANDLE *phEXE, | 
|  | DWORD dwFlags, LPVOID pvReserved ) | 
|  | { | 
|  | FIXME("(%p, %s, %s, %s, %s, %p, 0x%08lx, %p): stub\n", | 
|  | hWnd, debugstr_a(szCmdName), debugstr_a(szInfSection), | 
|  | debugstr_a(szDir), debugstr_a(lpszTitle), | 
|  | phEXE, dwFlags, pvReserved); | 
|  | return E_UNEXPECTED; | 
|  | } |