Author: amunger Date: Thu Jun 1 06:57:47 2006 New Revision: 22140
URL: http://svn.reactos.ru/svn/reactos?rev=22140&view=rev Log: Sync newdev to trunk. Revisions: 22049-22051, 22074, 22076, 22092-22094, 22102, 22116-22117, 22125, 22127-22128
Added: branches/ros-branch-0_3_0/reactos/dll/win32/newdev/Fr.rc - copied, changed from r22127, trunk/reactos/dll/win32/newdev/Fr.rc branches/ros-branch-0_3_0/reactos/dll/win32/newdev/newdev_private.h - copied, changed from r22094, trunk/reactos/dll/win32/newdev/newdev_private.h branches/ros-branch-0_3_0/reactos/dll/win32/newdev/wizard.c - copied, changed from r22051, trunk/reactos/dll/win32/newdev/wizard.c branches/ros-branch-0_3_0/reactos/include/newdev.h - copied unchanged from r22094, trunk/reactos/include/newdev.h Removed: branches/ros-branch-0_3_0/reactos/dll/win32/newdev/newdev.h Modified: branches/ros-branch-0_3_0/reactos/dll/win32/newdev/De.rc branches/ros-branch-0_3_0/reactos/dll/win32/newdev/En.rc branches/ros-branch-0_3_0/reactos/dll/win32/newdev/Es.rc branches/ros-branch-0_3_0/reactos/dll/win32/newdev/Hu.rc branches/ros-branch-0_3_0/reactos/dll/win32/newdev/Ru.rc branches/ros-branch-0_3_0/reactos/dll/win32/newdev/newdev.c branches/ros-branch-0_3_0/reactos/dll/win32/newdev/newdev.rbuild branches/ros-branch-0_3_0/reactos/dll/win32/newdev/newdev.rc branches/ros-branch-0_3_0/reactos/dll/win32/newdev/resource.h branches/ros-branch-0_3_0/reactos/dll/win32/newdev/stubs.c
Modified: branches/ros-branch-0_3_0/reactos/dll/win32/newdev/De.rc URL: http://svn.reactos.ru/svn/reactos/branches/ros-branch-0_3_0/reactos/dll/win3... ============================================================================== --- branches/ros-branch-0_3_0/reactos/dll/win32/newdev/De.rc (original) +++ branches/ros-branch-0_3_0/reactos/dll/win32/newdev/De.rc Thu Jun 1 06:57:47 2006 @@ -32,6 +32,18 @@ BS_AUTOCHECKBOX | WS_TABSTOP,120,170,180,11 END
+IDD_INSTALLFAILED DIALOG DISCARDABLE 0, 0, 317, 193 +STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU +CAPTION "Device installation" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Installation failed",IDC_FINISHTITLE,120,8,195,24 + LTEXT "The device could not be installed because an unexpected error happened.", + IDC_STATIC,120,40,195,19 + LTEXT "UNKNOWN DEVICE",IDC_DEVICE,134,55,164,11 +END + IDD_CHSOURCE DIALOG DISCARDABLE 0, 0, 317, 143 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Hardwareinstallation" @@ -58,6 +70,14 @@ LTEXT "UNKNOWN DEVICE",IDC_DEVICE,51,20,169,16 END
+IDD_INSTALLDRV DIALOG DISCARDABLE 0, 0, 317, 143 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Hardwareinstallation" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "UNKNOWN DEVICE",IDC_DEVICE,51,20,169,16 +END + IDD_FINISHPAGE DIALOG DISCARDABLE 0, 0, 317, 193 STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
Modified: branches/ros-branch-0_3_0/reactos/dll/win32/newdev/En.rc URL: http://svn.reactos.ru/svn/reactos/branches/ros-branch-0_3_0/reactos/dll/win3... ============================================================================== --- branches/ros-branch-0_3_0/reactos/dll/win32/newdev/En.rc (original) +++ branches/ros-branch-0_3_0/reactos/dll/win32/newdev/En.rc Thu Jun 1 06:57:47 2006 @@ -32,6 +32,18 @@ BS_AUTOCHECKBOX | WS_TABSTOP,120,170,180,11 END
+IDD_INSTALLFAILED DIALOG DISCARDABLE 0, 0, 317, 193 +STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU +CAPTION "Device installation" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Installation failed",IDC_FINISHTITLE,120,8,195,24 + LTEXT "The device could not be installed because an unexpected error happened.", + IDC_STATIC,120,40,195,19 + LTEXT "UNKNOWN DEVICE",IDC_DEVICE,134,55,164,11 +END + IDD_CHSOURCE DIALOG DISCARDABLE 0, 0, 317, 143 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Device installation" @@ -58,6 +70,14 @@ LTEXT "UNKNOWN DEVICE",IDC_DEVICE,51,20,169,16 END
+IDD_INSTALLDRV DIALOG DISCARDABLE 0, 0, 317, 143 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Device installation" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "UNKNOWN DEVICE",IDC_DEVICE,51,20,169,16 +END + IDD_FINISHPAGE DIALOG DISCARDABLE 0, 0, 317, 193 STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
Modified: branches/ros-branch-0_3_0/reactos/dll/win32/newdev/Es.rc URL: http://svn.reactos.ru/svn/reactos/branches/ros-branch-0_3_0/reactos/dll/win3... ============================================================================== --- branches/ros-branch-0_3_0/reactos/dll/win32/newdev/Es.rc (original) +++ branches/ros-branch-0_3_0/reactos/dll/win32/newdev/Es.rc Thu Jun 1 06:57:47 2006 @@ -32,6 +32,18 @@ BS_AUTOCHECKBOX | WS_TABSTOP,120,170,180,11 END
+IDD_INSTALLFAILED DIALOG DISCARDABLE 0, 0, 317, 193 +STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU +CAPTION "Device installation" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Installation failed",IDC_FINISHTITLE,120,8,195,24 + LTEXT "The device could not be installed because an unexpected error happened.", + IDC_STATIC,120,40,195,19 + LTEXT "UNKNOWN DEVICE",IDC_DEVICE,134,55,164,11 +END + IDD_CHSOURCE DIALOG DISCARDABLE 0, 0, 317, 143 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Instalación de Dispositivos" @@ -58,6 +70,14 @@ LTEXT "DISPOSITIVO DESCONOCIDO",IDC_DEVICE,51,20,169,16 END
+IDD_INSTALLDRV DIALOG DISCARDABLE 0, 0, 317, 143 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Device installation" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "DISPOSITIVO DESCONOCIDO",IDC_DEVICE,51,20,169,16 +END + IDD_FINISHPAGE DIALOG DISCARDABLE 0, 0, 317, 193 STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
Copied: branches/ros-branch-0_3_0/reactos/dll/win32/newdev/Fr.rc (from r22127, trunk/reactos/dll/win32/newdev/Fr.rc) URL: http://svn.reactos.ru/svn/reactos/branches/ros-branch-0_3_0/reactos/dll/win3... ============================================================================== --- trunk/reactos/dll/win32/newdev/Fr.rc (original) +++ branches/ros-branch-0_3_0/reactos/dll/win32/newdev/Fr.rc Thu Jun 1 06:57:47 2006 @@ -1,4 +1,4 @@ -LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL +LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
IDD_WELCOMEPAGE DIALOG DISCARDABLE 0, 0, 317, 193 STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION |
Modified: branches/ros-branch-0_3_0/reactos/dll/win32/newdev/Hu.rc URL: http://svn.reactos.ru/svn/reactos/branches/ros-branch-0_3_0/reactos/dll/win3... ============================================================================== --- branches/ros-branch-0_3_0/reactos/dll/win32/newdev/Hu.rc (original) +++ branches/ros-branch-0_3_0/reactos/dll/win32/newdev/Hu.rc Thu Jun 1 06:57:47 2006 @@ -8,11 +8,14 @@ FONT 8, "MS Shell Dlg" BEGIN LTEXT "welcome??",IDC_WELCOMETITLE,115,8,195,24 - LTEXT "A telepítõ a következõ hardverhez telepít fel eszközmeghatjtót:",IDC_STATIC,115,40,195,16 + LTEXT "A telepítõ a következõ hardverhez telepít fel eszközmeghatjtót:", + IDC_STATIC,120,40,195,16 LTEXT "Kattints a Tovább gombra a folytatáshoz.",IDC_STATIC,115,169,195,17 LTEXT "Ismeretlen eszköz!",IDC_DEVICE,129,55,164,11 - CONTROL "Automatikus telepítés",IDC_RADIO_AUTO,"Button",BS_AUTORADIOBUTTON,115,112,178,13 - CONTROL "Eszközmeghajtó kiválasztása",IDC_RADIO_MANUAL,"Button",BS_AUTORADIOBUTTON,115,133,164,14 + CONTROL "Automatikus telepítés",IDC_RADIO_AUTO,"Button", + BS_AUTORADIOBUTTON,120,112,178,13 + CONTROL "Eszközmeghajtó kiválasztása",IDC_RADIO_MANUAL, + "Button",BS_AUTORADIOBUTTON,120,133,164,14 END
IDD_NODRIVER DIALOG DISCARDABLE 0, 0, 317, 193 @@ -22,9 +25,24 @@ FONT 8, "MS Shell Dlg" BEGIN LTEXT "A telepítés sikertelen.",IDC_FINISHTITLE,115,8,195,24 - LTEXT "Az eszközmeghajtó nem található.",IDC_STATIC,115,40,195,19 - LTEXT "Kattints a Vissza gombra, és az Eszközmeghajtó kiválasztása gombra, ha tudod, hol van az eszközmeghajtó.",IDC_STATIC,113,98,181,24 - CONTROL "Ne mutasd ezt többször",IDC_DONOTSHOWDLG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,114,170,180,11 + LTEXT "Az eszközmeghajtó nem található.", + IDC_STATIC,120,40,195,19 + LTEXT "Kattints a Vissza gombra, és az Eszközmeghajtó kiválasztása gombra, ha tudod, hol van az eszközmeghajtó.", + IDC_STATIC,120,98,181,24 + CONTROL "Ne mutasd ezt többször",IDC_DONOTSHOWDLG,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,120,170,180,11 +END + +IDD_INSTALLFAILED DIALOG DISCARDABLE 0, 0, 317, 193 +STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU +CAPTION "Device installation" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Installation failed",IDC_FINISHTITLE,120,8,195,24 + LTEXT "The device could not be installed because an unexpected error happened.", + IDC_STATIC,120,40,195,19 + LTEXT "UNKNOWN DEVICE",IDC_DEVICE,134,55,164,11 END
IDD_CHSOURCE DIALOG DISCARDABLE 0, 0, 317, 143 @@ -32,15 +50,28 @@ CAPTION "Hardver telepítõ" FONT 8, "MS Shell Dlg" BEGIN - CONTROL "Keresés ezeken a helyeken",IDC_RADIO_SEARCHHERE,"Button",BS_AUTORADIOBUTTON,27,11,239,13 - CONTROL "Eszközmeghajtó kiválasztása",IDC_RADIO_CHOOSE,"Button",BS_AUTORADIOBUTTON,27,98,171,12 - CONTROL "Keresés cserélhetõ lemezeken",IDC_CHECK_MEDIA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,47,33,163,9 - CONTROL "A következõ útvonalon keressen",IDC_CHECK_PATH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,47,54,162,10 + CONTROL "Keresés ezeken a helyeken",IDC_RADIO_SEARCHHERE,"Button", + BS_AUTORADIOBUTTON,27,11,239,13 + CONTROL "Eszközmeghajtó kiválasztása",IDC_RADIO_CHOOSE,"Button", + BS_AUTORADIOBUTTON,27,98,171,12 + CONTROL "Keresés cserélhetõ lemezeken",IDC_CHECK_MEDIA,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,47,33,163,9 + CONTROL "A következõ útvonalon keressen",IDC_CHECK_PATH,"Button", + WS_TABSTOP,47,54,162,10 PUSHBUTTON "Böngészés",IDC_BROWSE,248,69,45,14 - COMBOBOX IDC_COMBO_PATH,61,71,176,12,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP | CBS_AUTOHSCROLL + COMBOBOX IDC_COMBO_PATH,61,71,176,12,CBS_DROPDOWN | CBS_SORT | + WS_VSCROLL | WS_TABSTOP | CBS_AUTOHSCROLL END
IDD_SEARCHDRV DIALOG DISCARDABLE 0, 0, 317, 143 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Hardver telepítõ" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Ismeretlen eszköz!",IDC_DEVICE,51,20,169,16 +END + +IDD_INSTALLDRV DIALOG DISCARDABLE 0, 0, 317, 143 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Hardver telepítõ" FONT 8, "MS Shell Dlg" @@ -54,9 +85,11 @@ CAPTION "Hardver telepítõ" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "A telepítés sikeresen befejezõdött",IDC_FINISHTITLE,115,8,195,11 - LTEXT "A telepítõ feltelepítette az eszközmeghajtókat a következõ eszközhöz:",IDC_STATIC,115,32,195,19 - LTEXT "A kilépéshez kattints a Befejezés gombra.",IDC_STATIC,115,174,179,11 + LTEXT "A telepítés sikeresen befejezõdött",IDC_FINISHTITLE,120,8,195,11 + LTEXT "A telepítõ feltelepítette az eszközmeghajtókat a következõ eszközhöz:", + IDC_STATIC,120,32,195,19 + LTEXT "A kilépéshez kattints a Befejezés gombra.",IDC_STATIC,120,174, + 179,11 LTEXT "Ismeretlen eszköz!",IDC_DEVICE,148,53,147,12 END
Modified: branches/ros-branch-0_3_0/reactos/dll/win32/newdev/Ru.rc URL: http://svn.reactos.ru/svn/reactos/branches/ros-branch-0_3_0/reactos/dll/win3... ============================================================================== --- branches/ros-branch-0_3_0/reactos/dll/win32/newdev/Ru.rc (original) +++ branches/ros-branch-0_3_0/reactos/dll/win32/newdev/Ru.rc Thu Jun 1 06:57:47 2006 @@ -32,6 +32,18 @@ BS_AUTOCHECKBOX | WS_TABSTOP,120,170,180,11 END
+IDD_INSTALLFAILED DIALOG DISCARDABLE 0, 0, 317, 193 +STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU +CAPTION "Device installation" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Installation failed",IDC_FINISHTITLE,120,8,195,24 + LTEXT "The device could not be installed because an unexpected error happened.", + IDC_STATIC,120,40,195,19 + LTEXT "UNKNOWN DEVICE",IDC_DEVICE,134,55,164,11 +END + IDD_CHSOURCE DIALOG DISCARDABLE 0, 0, 317, 143 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Óñòàíîâêà îáîðóäîâàíèÿ" @@ -58,6 +70,14 @@ LTEXT "Íåèçâåñòíîå óñòðîéñòâî",IDC_DEVICE,51,20,169,16 END
+IDD_INSTALLDRV DIALOG DISCARDABLE 0, 0, 317, 143 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Óñòàíîâêà îáîðóäîâàíèÿ" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Íåèçâåñòíîå óñòðîéñòâî",IDC_DEVICE,51,20,169,16 +END + IDD_FINISHPAGE DIALOG DISCARDABLE 0, 0, 317, 193 STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
Modified: branches/ros-branch-0_3_0/reactos/dll/win32/newdev/newdev.c URL: http://svn.reactos.ru/svn/reactos/branches/ros-branch-0_3_0/reactos/dll/win3... ============================================================================== --- branches/ros-branch-0_3_0/reactos/dll/win32/newdev/newdev.c (original) +++ branches/ros-branch-0_3_0/reactos/dll/win32/newdev/newdev.c Thu Jun 1 06:57:47 2006 @@ -20,147 +20,12 @@ */
#define YDEBUG -#include "newdev.h" +#include "newdev_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(newdev);
-static BOOL SearchDriver ( PDEVINSTDATA DevInstData, LPCTSTR Path ); -static BOOL InstallDriver ( PDEVINSTDATA DevInstData ); -static DWORD WINAPI FindDriverProc( LPVOID lpParam ); -static BOOL FindDriver ( PDEVINSTDATA DevInstData, LPCWSTR InfFile ); - -static DEVINSTDATA DevInstData; +/* Global variables */ HINSTANCE hDllInstance; -HANDLE hThread; - -static BOOL -CanDisableDevice( - IN DEVINST DevInst, - IN HMACHINE hMachine, - OUT BOOL *CanDisable) -{ -#if 0 - /* hpoussin, Dec 2005. I've disabled this code because - * ntoskrnl never sets the DN_DISABLEABLE flag. - */ - CONFIGRET cr; - ULONG Status, ProblemNumber; - BOOL Ret = FALSE; - - cr = CM_Get_DevNode_Status_Ex( - &Status, - &ProblemNumber, - DevInst, - 0, - hMachine); - if (cr == CR_SUCCESS) - { - *CanDisable = ((Status & DN_DISABLEABLE) != 0); - Ret = TRUE; - } - - return Ret; -#else - *CanDisable = TRUE; - return TRUE; -#endif -} - - -static BOOL -IsDeviceStarted( - IN DEVINST DevInst, - IN HMACHINE hMachine, - OUT BOOL *IsEnabled) -{ - CONFIGRET cr; - ULONG Status, ProblemNumber; - BOOL Ret = FALSE; - - cr = CM_Get_DevNode_Status_Ex( - &Status, - &ProblemNumber, - DevInst, - 0, - hMachine); - if (cr == CR_SUCCESS) - { - *IsEnabled = ((Status & DN_STARTED) != 0); - Ret = TRUE; - } - - return Ret; -} - - -static BOOL -StartDevice( - IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DevInfoData OPTIONAL, - IN BOOL bEnable, - IN DWORD HardwareProfile OPTIONAL, - OUT BOOL *bNeedReboot OPTIONAL) -{ - SP_PROPCHANGE_PARAMS pcp; - SP_DEVINSTALL_PARAMS dp; - DWORD LastErr; - BOOL Ret = FALSE; - - pcp.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER); - pcp.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE; - pcp.HwProfile = HardwareProfile; - - if (bEnable) - { - /* try to enable the device on the global profile */ - pcp.StateChange = DICS_ENABLE; - pcp.Scope = DICS_FLAG_GLOBAL; - - /* ignore errors */ - LastErr = GetLastError(); - if (SetupDiSetClassInstallParams( - DeviceInfoSet, - DevInfoData, - &pcp.ClassInstallHeader, - sizeof(SP_PROPCHANGE_PARAMS))) - { - SetupDiCallClassInstaller( - DIF_PROPERTYCHANGE, - DeviceInfoSet, - DevInfoData); - } - SetLastError(LastErr); - } - - /* try config-specific */ - pcp.StateChange = (bEnable ? DICS_ENABLE : DICS_DISABLE); - pcp.Scope = DICS_FLAG_CONFIGSPECIFIC; - - if (SetupDiSetClassInstallParams( - DeviceInfoSet, - DevInfoData, - &pcp.ClassInstallHeader, - sizeof(SP_PROPCHANGE_PARAMS)) && - SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, - DeviceInfoSet, - DevInfoData)) - { - dp.cbSize = sizeof(SP_DEVINSTALL_PARAMS); - if (SetupDiGetDeviceInstallParams( - DeviceInfoSet, - DevInfoData, - &dp)) - { - if (bNeedReboot != NULL) - { - *bNeedReboot = ((dp.Flags & (DI_NEEDRESTART | DI_NEEDREBOOT)) != 0); - } - - Ret = TRUE; - } - } - return Ret; -}
/* * @implemented @@ -189,12 +54,12 @@ /* FIXME: InstallFlags bRebootRequired ignored! */
/* Check flags */ - /* FIXME: if (InstallFlags & ~(INSTALLFLAG_FORCE | INSTALLFLAG_READONLY | INSTALLFLAG_NONINTERACTIVE)) + if (InstallFlags & ~(INSTALLFLAG_FORCE | INSTALLFLAG_READONLY | INSTALLFLAG_NONINTERACTIVE)) { DPRINT("Unknown flags: 0x%08lx\n", InstallFlags & ~(INSTALLFLAG_FORCE | INSTALLFLAG_READONLY | INSTALLFLAG_NONINTERACTIVE)); SetLastError(ERROR_INVALID_FLAGS); goto cleanup; - }*/ + }
/* Enumerate all devices of the system */ DevInstData.hDevInfo = SetupDiGetClassDevsW(NULL, NULL, hwndParent, DIGCF_ALLCLASSES | DIGCF_PRESENT); @@ -293,17 +158,17 @@ TRACE("Trying to update the driver of %S\n", Buffer);
/* Search driver in the specified .inf file */ - if (!FindDriver(&DevInstData, FullInfPath)) - { - TRACE("FindDriver() failed with error 0x%lx\n", GetLastError()); + if (!SearchDriver(&DevInstData, NULL, FullInfPath)) + { + TRACE("SearchDriver() failed with error 0x%lx\n", GetLastError()); continue; }
/* FIXME: HACK! We shouldn't check of ERROR_PRIVILEGE_NOT_HELD */ - //if (!InstallDriver(&DevInstData)) - if (!InstallDriver(&DevInstData) && GetLastError() != ERROR_PRIVILEGE_NOT_HELD) - { - TRACE("InstallDriver() failed with error 0x%lx\n", GetLastError()); + //if (!InstallCurrentDriver(&DevInstData)) + if (!InstallCurrentDriver(&DevInstData) && GetLastError() != ERROR_PRIVILEGE_NOT_HELD) + { + TRACE("InstallCurrentDriver() failed with error 0x%lx\n", GetLastError()); continue; }
@@ -375,552 +240,12 @@ return Result; }
- -static HFONT -CreateTitleFont(VOID) -{ - NONCLIENTMETRICS ncm; - LOGFONT LogFont; - HDC hdc; - INT FontSize; - HFONT hFont; - - ncm.cbSize = sizeof(NONCLIENTMETRICS); - SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0); - - LogFont = ncm.lfMessageFont; - LogFont.lfWeight = FW_BOLD; - _tcscpy(LogFont.lfFaceName, _T("MS Shell Dlg")); - - hdc = GetDC(NULL); - FontSize = 12; - LogFont.lfHeight = 0 - GetDeviceCaps (hdc, LOGPIXELSY) * FontSize / 72; - hFont = CreateFontIndirect(&LogFont); - ReleaseDC(NULL, hdc); - - return hFont; -} - -static VOID -CenterWindow( - IN HWND hWnd) -{ - HWND hWndParent; - RECT rcParent; - RECT rcWindow; - - hWndParent = GetParent(hWnd); - if (hWndParent == NULL) - hWndParent = GetDesktopWindow(); - - GetWindowRect(hWndParent, &rcParent); - GetWindowRect(hWnd, &rcWindow); - - SetWindowPos( - hWnd, - HWND_TOP, - ((rcParent.right - rcParent.left) - (rcWindow.right - rcWindow.left)) / 2, - ((rcParent.bottom - rcParent.top) - (rcWindow.bottom - rcWindow.top)) / 2, - 0, - 0, - SWP_NOSIZE); -} - -static INT_PTR CALLBACK -WelcomeDlgProc( - IN HWND hwndDlg, - IN UINT uMsg, - IN WPARAM wParam, - IN LPARAM lParam) -{ - - PDEVINSTDATA DevInstData; - - /* Retrieve pointer to the global setup data */ - DevInstData = (PDEVINSTDATA)GetWindowLongPtr (hwndDlg, GWL_USERDATA); - - switch (uMsg) - { - case WM_INITDIALOG: - { - HWND hwndControl; - DWORD dwStyle; - - /* Get pointer to the global setup data */ - DevInstData = (PDEVINSTDATA)((LPPROPSHEETPAGE)lParam)->lParam; - SetWindowLongPtr(hwndDlg, GWL_USERDATA, (DWORD_PTR)DevInstData); - - hwndControl = GetParent(hwndDlg); - - /* Center the wizard window */ - CenterWindow (hwndControl); - - /* Hide the system menu */ - dwStyle = GetWindowLong(hwndControl, GWL_STYLE); - SetWindowLong(hwndControl, GWL_STYLE, dwStyle & ~WS_SYSMENU); - - /* Set title font */ - SendDlgItemMessage( - hwndDlg, - IDC_WELCOMETITLE, - WM_SETFONT, - (WPARAM)DevInstData->hTitleFont, - (LPARAM)TRUE); - - SendDlgItemMessage( - hwndDlg, - IDC_DEVICE, - WM_SETTEXT, - 0, - (LPARAM) DevInstData->buffer); - - SendDlgItemMessage( - hwndDlg, - IDC_RADIO_AUTO, - BM_SETCHECK, - (WPARAM) TRUE, - (LPARAM) 0); - break; - } - - case WM_NOTIFY: - { - LPNMHDR lpnm = (LPNMHDR)lParam; - - switch (lpnm->code) - { - case PSN_SETACTIVE: - /* Enable the Next button */ - PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_NEXT); - break; - - case PSN_WIZNEXT: - /* Handle a Next button click, if necessary */ - if (SendDlgItemMessage(hwndDlg, IDC_RADIO_AUTO, BM_GETCHECK, (WPARAM) 0, (LPARAM) 0) == BST_CHECKED) - PropSheet_SetCurSel(GetParent(hwndDlg), 0, IDD_SEARCHDRV); - break; - - default: - break; - } - break; - } - - default: - break; - } - - return FALSE; -} - -static INT_PTR CALLBACK -CHSourceDlgProc( - IN HWND hwndDlg, - IN UINT uMsg, - IN WPARAM wParam, - IN LPARAM lParam) -{ - PDEVINSTDATA DevInstData; - - /* Retrieve pointer to the global setup data */ - DevInstData = (PDEVINSTDATA)GetWindowLongPtr (hwndDlg, GWL_USERDATA); - - switch (uMsg) - { - case WM_INITDIALOG: - { - HWND hwndControl; - DWORD dwStyle; - - /* Get pointer to the global setup data */ - DevInstData = (PDEVINSTDATA)((LPPROPSHEETPAGE)lParam)->lParam; - SetWindowLongPtr(hwndDlg, GWL_USERDATA, (DWORD_PTR)DevInstData); - - hwndControl = GetParent(hwndDlg); - - /* Center the wizard window */ - CenterWindow (hwndControl); - - /* Hide the system menu */ - dwStyle = GetWindowLong(hwndControl, GWL_STYLE); - SetWindowLong(hwndControl, GWL_STYLE, dwStyle & ~WS_SYSMENU); - - SendDlgItemMessage( - hwndDlg, - IDC_RADIO_SEARCHHERE, - BM_SETCHECK, - (WPARAM) TRUE, - (LPARAM) 0); - - break; - } - - case WM_NOTIFY: - { - LPNMHDR lpnm = (LPNMHDR)lParam; - - switch (lpnm->code) - { - case PSN_SETACTIVE: - /* Enable the Next and Back buttons */ - PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_NEXT | PSWIZB_BACK); - break; - - case PSN_WIZNEXT: - /* Handle a Next button click, if necessary */ - PropSheet_SetCurSel(GetParent(hwndDlg), 0, 4); - break; - - default: - break; - } - break; - } - - default: - break; - } - - return FALSE; -} - -static INT_PTR CALLBACK -SearchDrvDlgProc( - IN HWND hwndDlg, - IN UINT uMsg, - IN WPARAM wParam, - IN LPARAM lParam) -{ - PDEVINSTDATA DevInstData; - DWORD dwThreadId; - - /* Retrieve pointer to the global setup data */ - DevInstData = (PDEVINSTDATA)GetWindowLongPtr (hwndDlg, GWL_USERDATA); - - switch (uMsg) - { - case WM_INITDIALOG: - { - HWND hwndControl; - DWORD dwStyle; - - /* Get pointer to the global setup data */ - DevInstData = (PDEVINSTDATA)((LPPROPSHEETPAGE)lParam)->lParam; - SetWindowLongPtr(hwndDlg, GWL_USERDATA, (DWORD_PTR)DevInstData); - - DevInstData->hDialog = hwndDlg; - hwndControl = GetParent(hwndDlg); - - /* Center the wizard window */ - CenterWindow (hwndControl); - - SendDlgItemMessage( - hwndDlg, - IDC_DEVICE, - WM_SETTEXT, - 0, - (LPARAM) DevInstData->buffer); - - /* Hide the system menu */ - dwStyle = GetWindowLong(hwndControl, GWL_STYLE); - SetWindowLong(hwndControl, GWL_STYLE, dwStyle & ~WS_SYSMENU); - break; - } - - case WM_SEARCH_FINISHED: - { - CloseHandle(hThread); - hThread = 0; - if (wParam == 0) - PropSheet_SetCurSel(GetParent(hwndDlg), 0, IDD_NODRIVER); - else - PropSheet_SetCurSel(GetParent(hwndDlg), 0, IDD_FINISHPAGE); - break; - } - - case WM_NOTIFY: - { - LPNMHDR lpnm = (LPNMHDR)lParam; - - switch (lpnm->code) - { - case PSN_SETACTIVE: - PropSheet_SetWizButtons(GetParent(hwndDlg), !PSWIZB_NEXT | !PSWIZB_BACK); - hThread = CreateThread( NULL, 0, FindDriverProc, DevInstData, 0, &dwThreadId); - break; - - case PSN_KILLACTIVE: - if (hThread != 0) - { - SetWindowLong ( hwndDlg, DWL_MSGRESULT, TRUE); - return TRUE; - } - break; - - case PSN_WIZNEXT: - /* Handle a Next button click, if necessary */ - break; - - default: - break; - } - break; - } - - default: - break; - } - - return FALSE; -} - -static DWORD WINAPI -FindDriverProc( - IN LPVOID lpParam) -{ - TCHAR drive[] = {'?',':',0}; - size_t nType; - DWORD dwDrives; - PDEVINSTDATA DevInstData; - DWORD config_flags; - UINT i = 1; - - DevInstData = (PDEVINSTDATA)lpParam; - - dwDrives = GetLogicalDrives(); - for (drive[0] = 'A'; drive[0] <= 'Z'; drive[0]++) - { - if (dwDrives & i) - { - nType = GetDriveType( drive ); - if (nType == DRIVE_CDROM) - { - /* search for inf file */ - if (SearchDriver ( DevInstData, drive )) - { - /* if we found a valid driver inf... */ - if (FindDriver ( DevInstData, NULL )) - { - InstallDriver ( DevInstData ); - PostMessage(DevInstData->hDialog, WM_SEARCH_FINISHED, 1, 0); - return 0; - } - } - } - } - i <<= 1; - } - - /* update device configuration */ - if (SetupDiGetDeviceRegistryProperty( - DevInstData->hDevInfo, - &DevInstData->devInfoData, - SPDRP_CONFIGFLAGS, - NULL, - (BYTE *)&config_flags, - sizeof(config_flags), - NULL)) - { - config_flags |= CONFIGFLAG_FAILEDINSTALL; - SetupDiSetDeviceRegistryProperty( - DevInstData->hDevInfo, - &DevInstData->devInfoData, - SPDRP_CONFIGFLAGS, - (BYTE *)&config_flags, sizeof(config_flags) ); - } - - PostMessage(DevInstData->hDialog, WM_SEARCH_FINISHED, 0, 0); - return 0; -} - -static INT_PTR CALLBACK -FinishDlgProc( - IN HWND hwndDlg, - IN UINT uMsg, - IN WPARAM wParam, - IN LPARAM lParam) -{ - - PDEVINSTDATA DevInstData; - - /* Retrieve pointer to the global setup data */ - DevInstData = (PDEVINSTDATA)GetWindowLongPtr (hwndDlg, GWL_USERDATA); - - switch (uMsg) - { - case WM_INITDIALOG: - { - HWND hwndControl; - - /* Get pointer to the global setup data */ - DevInstData = (PDEVINSTDATA)((LPPROPSHEETPAGE)lParam)->lParam; - SetWindowLongPtr(hwndDlg, GWL_USERDATA, (DWORD_PTR)DevInstData); - - hwndControl = GetDlgItem(GetParent(hwndDlg), IDCANCEL); - ShowWindow (hwndControl, SW_HIDE); - EnableWindow (hwndControl, FALSE); - - SendDlgItemMessage( - hwndDlg, - IDC_DEVICE, - WM_SETTEXT, - 0, - (LPARAM) DevInstData->drvInfoData.Description); - - /* Set title font */ - SendDlgItemMessage( - hwndDlg, - IDC_FINISHTITLE, - WM_SETFONT, - (WPARAM)DevInstData->hTitleFont, - (LPARAM)TRUE); - break; - } - - case WM_NOTIFY: - { - LPNMHDR lpnm = (LPNMHDR)lParam; - - switch (lpnm->code) - { - case PSN_SETACTIVE: - /* Enable the correct buttons on for the active page */ - PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_FINISH); - break; - - case PSN_WIZBACK: - /* Handle a Back button click, if necessary */ - break; - - case PSN_WIZFINISH: - /* Handle a Finish button click, if necessary */ - break; - - default: - break; - } - break; - } - - default: - break; - } - - return FALSE; -} - -static INT_PTR CALLBACK -InstFailDlgProc( - IN HWND hwndDlg, - IN UINT uMsg, - IN WPARAM wParam, - IN LPARAM lParam) -{ - - PDEVINSTDATA DevInstData; - - /* Get pointer to the global setup data */ - DevInstData = (PDEVINSTDATA)GetWindowLongPtr (hwndDlg, GWL_USERDATA); - - switch (uMsg) - { - case WM_INITDIALOG: - { - HWND hwndControl; - BOOL DisableableDevice = FALSE; - - DevInstData = (PDEVINSTDATA)((LPPROPSHEETPAGE)lParam)->lParam; - SetWindowLongPtr(hwndDlg, GWL_USERDATA, (DWORD_PTR)DevInstData); - - hwndControl = GetDlgItem(GetParent(hwndDlg), IDCANCEL); - ShowWindow (hwndControl, SW_HIDE); - EnableWindow (hwndControl, FALSE); - - /* Set title font */ - SendDlgItemMessage( - hwndDlg, - IDC_FINISHTITLE, - WM_SETFONT, - (WPARAM)DevInstData->hTitleFont, - (LPARAM)TRUE); - - /* disable the "do not show this dialog anymore" checkbox - if the device cannot be disabled */ - CanDisableDevice( - DevInstData->devInfoData.DevInst, - NULL, - &DisableableDevice); - EnableWindow( - GetDlgItem(hwndDlg, IDC_DONOTSHOWDLG), - DisableableDevice); - break; - } - - case WM_NOTIFY: - { - LPNMHDR lpnm = (LPNMHDR)lParam; - - switch (lpnm->code) - { - case PSN_SETACTIVE: - /* Enable the correct buttons on for the active page */ - PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_FINISH); - break; - - case PSN_WIZBACK: - PropSheet_SetCurSel(GetParent(hwndDlg), 0, IDD_WELCOMEPAGE); - /* Handle a Back button click, if necessary */ - break; - - case PSN_WIZFINISH: - { - BOOL DisableableDevice = FALSE; - BOOL IsStarted = FALSE; - - if (CanDisableDevice(DevInstData->devInfoData.DevInst, - NULL, - &DisableableDevice) && - DisableableDevice && - IsDeviceStarted( - DevInstData->devInfoData.DevInst, - NULL, - &IsStarted) && - !IsStarted && - SendDlgItemMessage( - hwndDlg, - IDC_DONOTSHOWDLG, - BM_GETCHECK, - (WPARAM) 0, (LPARAM) 0) == BST_CHECKED) - { - /* disable the device */ - StartDevice( - DevInstData->hDevInfo, - &DevInstData->devInfoData, - FALSE, - 0, - NULL); - } - break; - } - - default: - break; - } - break; - } - - default: - break; - } - - return FALSE; -} - - -static BOOL -FindDriver( +/* Directory and InfFile MUST NOT be specified simultaneously */ +BOOL +SearchDriver( IN PDEVINSTDATA DevInstData, - IN LPCWSTR InfFile OPTIONAL) + IN LPCTSTR Directory OPTIONAL, + IN LPCTSTR InfFile OPTIONAL) { SP_DEVINSTALL_PARAMS DevInstallParams = {0,}; BOOL ret; @@ -936,16 +261,30 @@ if (InfFile) { DevInstallParams.Flags |= DI_ENUMSINGLEINF; - wcscpy(DevInstallParams.DriverPath, InfFile); - } - - if (!SetupDiSetDeviceInstallParams(DevInstData->hDevInfo, &DevInstData->devInfoData, &DevInstallParams)) + _tcsncpy(DevInstallParams.DriverPath, InfFile, MAX_PATH); + } + else if (Directory) + { + DevInstallParams.Flags &= ~DI_ENUMSINGLEINF; + _tcsncpy(DevInstallParams.DriverPath, Directory, MAX_PATH); + } + else + *DevInstallParams.DriverPath = _T('\0'); + + ret = SetupDiSetDeviceInstallParams( + DevInstData->hDevInfo, + &DevInstData->devInfoData, + &DevInstallParams); + if (!ret) { TRACE("SetupDiSetDeviceInstallParams() failed with error 0x%lx\n", GetLastError()); return FALSE; }
- ret = SetupDiBuildDriverInfoList(DevInstData->hDevInfo, &DevInstData->devInfoData, SPDIT_COMPATDRIVER); + ret = SetupDiBuildDriverInfoList( + DevInstData->hDevInfo, + &DevInstData->devInfoData, + SPDIT_COMPATDRIVER); if (!ret) { TRACE("SetupDiBuildDriverInfoList() failed with error 0x%lx\n", GetLastError()); @@ -966,11 +305,9 @@ TRACE("SetupDiEnumDriverInfo() failed with error 0x%lx\n", GetLastError()); return FALSE; } - TRACE("Installing driver %S: %S\n", DevInstData->drvInfoData.MfgName, DevInstData->drvInfoData.Description);
return TRUE; } -
static BOOL IsDots(IN LPCTSTR str) @@ -997,21 +334,20 @@ return _T(""); }
-static BOOL -SearchDriver( +BOOL +SearchDriverRecursive( IN PDEVINSTDATA DevInstData, IN LPCTSTR Path) { WIN32_FIND_DATA wfd; - SP_DEVINSTALL_PARAMS DevInstallParams; TCHAR DirPath[MAX_PATH]; TCHAR FileName[MAX_PATH]; TCHAR FullPath[MAX_PATH]; TCHAR LastDirPath[MAX_PATH] = _T(""); TCHAR PathWithPattern[MAX_PATH]; BOOL ok = TRUE; - BOOL ret; - HANDLE hFindFile; + BOOL retval = FALSE; + HANDLE hFindFile = INVALID_HANDLE_VALUE;
_tcscpy(DirPath, Path);
@@ -1021,19 +357,25 @@ _tcscpy(PathWithPattern, DirPath); _tcscat(PathWithPattern, _T("\*"));
- for (hFindFile = FindFirstFile(PathWithPattern, &wfd); ((hFindFile != INVALID_HANDLE_VALUE) && ok); ok = FindNextFile(hFindFile, &wfd)) + for (hFindFile = FindFirstFile(PathWithPattern, &wfd); + ok && hFindFile != INVALID_HANDLE_VALUE; + ok = FindNextFile(hFindFile, &wfd)) {
_tcscpy(FileName, wfd.cFileName); if (IsDots(FileName)) continue;
- if((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) - { + if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + /* Recursive search */ _tcscpy(FullPath, DirPath); _tcscat(FullPath, FileName); - if(SearchDriver(DevInstData, FullPath)) - break; + if (SearchDriverRecursive(DevInstData, FullPath)) + { + retval = TRUE; + /* We continue the search for a better driver */ + } } else { @@ -1042,29 +384,15 @@ if ((_tcscmp(pszExtension, _T(".inf")) == 0) && (_tcscmp(LastDirPath, DirPath) != 0)) { _tcscpy(LastDirPath, DirPath); - ZeroMemory (&DevInstallParams, sizeof(SP_DEVINSTALL_PARAMS)); - DevInstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS); - - ret = SetupDiGetDeviceInstallParams( - DevInstData->hDevInfo, - &DevInstData->devInfoData, - &DevInstallParams); - - if (_tcsclen(DirPath) <= MAX_PATH) + + if (_tcsclen(DirPath) > MAX_PATH) + /* Path is too long to be searched */ + continue; + + if (SearchDriver(DevInstData, DirPath, NULL)) { - memcpy(DevInstallParams.DriverPath, DirPath, (_tcsclen(DirPath) + 1) * sizeof(TCHAR)); - } - - ret = SetupDiSetDeviceInstallParams( - DevInstData->hDevInfo, - &DevInstData->devInfoData, - &DevInstallParams); - - if ( FindDriver ( DevInstData, NULL ) ) - { - if (hFindFile != INVALID_HANDLE_VALUE) - FindClose(hFindFile); - return TRUE; + retval = TRUE; + /* We continue the search for a better driver */ }
} @@ -1073,17 +401,17 @@
if (hFindFile != INVALID_HANDLE_VALUE) FindClose(hFindFile); - - return FALSE; -} - -static BOOL -InstallDriver( + return retval; +} + +BOOL +InstallCurrentDriver( IN PDEVINSTDATA DevInstData) { - BOOL ret;
+ TRACE("Installing driver %S: %S\n", DevInstData->drvInfoData.MfgName, DevInstData->drvInfoData.Description); + ret = SetupDiCallClassInstaller( DIF_SELECTBESTCOMPATDRV, DevInstData->hDevInfo, @@ -1185,27 +513,6 @@ }
return TRUE; -} - -static VOID -CleanUp(VOID) -{ - - if (DevInstData.devInfoData.cbSize != 0) - { - if (!SetupDiDestroyDriverInfoList(DevInstData.hDevInfo, &DevInstData.devInfoData, SPDIT_COMPATDRIVER)) - TRACE("SetupDiDestroyDriverInfoList() failed with error 0x%lx\n", GetLastError()); - } - - if (DevInstData.hDevInfo != INVALID_HANDLE_VALUE) - { - if (!SetupDiDestroyDeviceInfoList(DevInstData.hDevInfo)) - TRACE("SetupDiDestroyDeviceInfoList() failed with error 0x%lx\n", GetLastError()); - } - - if (DevInstData.buffer) - HeapFree(GetProcessHeap(), 0, DevInstData.buffer); - }
/* @@ -1218,12 +525,10 @@ IN LPCWSTR InstanceId, IN INT Show) { - - PROPSHEETHEADER psh; - HPROPSHEETPAGE ahpsp[5]; - PROPSHEETPAGE psp; + PDEVINSTDATA DevInstData = NULL; BOOL ret; DWORD config_flags; + BOOL retval = FALSE;
if (!IsUserAdmin()) { @@ -1231,46 +536,53 @@ ExitProcess(ERROR_ACCESS_DENIED); }
+ DevInstData = HeapAlloc(GetProcessHeap(), 0, sizeof(DEVINSTDATA)); + if (!DevInstData) + { + TRACE("HeapAlloc() failed\n"); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + goto cleanup; + } + /* Clear devinst data */ - ZeroMemory(&DevInstData, sizeof(DEVINSTDATA)); - DevInstData.devInfoData.cbSize = 0; /* Tell if the devInfoData is valid */ - - DevInstData.hDevInfo = SetupDiCreateDeviceInfoListExW(NULL, NULL, NULL, NULL); - if (DevInstData.hDevInfo == INVALID_HANDLE_VALUE) + ZeroMemory(DevInstData, sizeof(DEVINSTDATA)); + DevInstData->devInfoData.cbSize = 0; /* Tell if the devInfoData is valid */ + + /* Fill devinst data */ + DevInstData->hDevInfo = SetupDiCreateDeviceInfoListExW(NULL, NULL, NULL, NULL); + if (DevInstData->hDevInfo == INVALID_HANDLE_VALUE) { TRACE("SetupDiCreateDeviceInfoListExW() failed with error 0x%lx\n", GetLastError()); - CleanUp(); - return FALSE; - } - - DevInstData.devInfoData.cbSize = sizeof(SP_DEVINFO_DATA); + goto cleanup; + } + + DevInstData->devInfoData.cbSize = sizeof(SP_DEVINFO_DATA); ret = SetupDiOpenDeviceInfoW( - DevInstData.hDevInfo, + DevInstData->hDevInfo, InstanceId, NULL, 0, /* Open flags */ - &DevInstData.devInfoData); + &DevInstData->devInfoData); if (!ret) { TRACE("SetupDiOpenDeviceInfoW() failed with error 0x%lx (InstanceId %S)\n", GetLastError(), InstanceId); - DevInstData.devInfoData.cbSize = 0; - CleanUp(); - return FALSE; + DevInstData->devInfoData.cbSize = 0; + goto cleanup; }
SetLastError(ERROR_GEN_FAILURE); ret = SetupDiGetDeviceRegistryProperty( - DevInstData.hDevInfo, - &DevInstData.devInfoData, + DevInstData->hDevInfo, + &DevInstData->devInfoData, SPDRP_DEVICEDESC, - &DevInstData.regDataType, + &DevInstData->regDataType, NULL, 0, - &DevInstData.requiredSize); - - if (!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER && DevInstData.regDataType == REG_SZ) - { - DevInstData.buffer = HeapAlloc(GetProcessHeap(), 0, DevInstData.requiredSize); - if (!DevInstData.buffer) + &DevInstData->requiredSize); + + if (!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER && DevInstData->regDataType == REG_SZ) + { + DevInstData->buffer = HeapAlloc(GetProcessHeap(), 0, DevInstData->requiredSize); + if (!DevInstData->buffer) { TRACE("HeapAlloc() failed\n"); SetLastError(ERROR_NOT_ENOUGH_MEMORY); @@ -1278,24 +590,23 @@ else { ret = SetupDiGetDeviceRegistryProperty( - DevInstData.hDevInfo, - &DevInstData.devInfoData, + DevInstData->hDevInfo, + &DevInstData->devInfoData, SPDRP_DEVICEDESC, - &DevInstData.regDataType, - DevInstData.buffer, DevInstData.requiredSize, - &DevInstData.requiredSize); + &DevInstData->regDataType, + DevInstData->buffer, DevInstData->requiredSize, + &DevInstData->requiredSize); } } if (!ret) { TRACE("SetupDiGetDeviceRegistryProperty() failed with error 0x%lx (InstanceId %S)\n", GetLastError(), InstanceId); - CleanUp(); - return FALSE; + goto cleanup; }
if (SetupDiGetDeviceRegistryProperty( - DevInstData.hDevInfo, - &DevInstData.devInfoData, + DevInstData->hDevInfo, + &DevInstData->devInfoData, SPDRP_CONFIGFLAGS, NULL, (BYTE *)&config_flags, @@ -1304,77 +615,48 @@ { if (config_flags & CONFIGFLAG_FAILEDINSTALL) { - CleanUp(); - return TRUE; - } - } - - TRACE("Installing %S (%S)\n", DevInstData.buffer, InstanceId); - - if ((!FindDriver(&DevInstData, NULL)) && (Show != SW_HIDE)) - { - - /* Create the Welcome page */ - ZeroMemory (&psp, sizeof(PROPSHEETPAGE)); - psp.dwSize = sizeof(PROPSHEETPAGE); - psp.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER; - psp.hInstance = hDllInstance; - psp.lParam = (LPARAM)&DevInstData; - psp.pfnDlgProc = WelcomeDlgProc; - psp.pszTemplate = MAKEINTRESOURCE(IDD_WELCOMEPAGE); - ahpsp[IDD_WELCOMEPAGE] = CreatePropertySheetPage(&psp); - - /* Create the Select Source page */ - psp.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE; - psp.pfnDlgProc = CHSourceDlgProc; - psp.pszTemplate = MAKEINTRESOURCE(IDD_CHSOURCE); - ahpsp[IDD_CHSOURCE] = CreatePropertySheetPage(&psp); - - /* Create the Search driver page */ - psp.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE; - psp.pfnDlgProc = SearchDrvDlgProc; - psp.pszTemplate = MAKEINTRESOURCE(IDD_SEARCHDRV); - ahpsp[IDD_SEARCHDRV] = CreatePropertySheetPage(&psp); - - /* Create the Finish page */ - psp.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER; - psp.pfnDlgProc = FinishDlgProc; - psp.pszTemplate = MAKEINTRESOURCE(IDD_FINISHPAGE); - ahpsp[IDD_FINISHPAGE] = CreatePropertySheetPage(&psp); - - /* Create the Install failed page */ - psp.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER; - psp.pfnDlgProc = InstFailDlgProc; - psp.pszTemplate = MAKEINTRESOURCE(IDD_NODRIVER); - ahpsp[IDD_NODRIVER] = CreatePropertySheetPage(&psp); - - /* Create the property sheet */ - psh.dwSize = sizeof(PROPSHEETHEADER); - psh.dwFlags = PSH_WIZARD97 | PSH_WATERMARK | PSH_HEADER; - psh.hInstance = hDllInstance; - psh.hwndParent = NULL; - psh.nPages = 5; - psh.nStartPage = 0; - psh.phpage = ahpsp; - psh.pszbmWatermark = MAKEINTRESOURCE(IDB_WATERMARK); - psh.pszbmHeader = MAKEINTRESOURCE(IDB_HEADER); - - /* Create title font */ - DevInstData.hTitleFont = CreateTitleFont(); - - /* Display the wizard */ - PropertySheet(&psh); - - DeleteObject(DevInstData.hTitleFont); - - } - else - { - InstallDriver ( &DevInstData ); - } - - CleanUp(); - return TRUE; + /* The device is disabled */ + retval = TRUE; + goto cleanup; + } + } + + TRACE("Installing %S (%S)\n", DevInstData->buffer, InstanceId); + + /* Search driver in default location */ + if (SearchDriver(DevInstData, NULL, NULL)) + { + /* Driver found ; install it */ + retval = InstallCurrentDriver(DevInstData); + goto cleanup; + } + else if (Show == SW_HIDE) + { + /* We can't show the wizard. Fail the install */ + goto cleanup; + } + + /* Prepare the wizard, and display it */ + retval = DisplayWizard(DevInstData, hWndParent, IDD_WELCOMEPAGE); + +cleanup: + if (DevInstData) + { + if (DevInstData->devInfoData.cbSize != 0) + { + if (!SetupDiDestroyDriverInfoList(DevInstData->hDevInfo, &DevInstData->devInfoData, SPDIT_COMPATDRIVER)) + TRACE("SetupDiDestroyDriverInfoList() failed with error 0x%lx\n", GetLastError()); + } + if (DevInstData->hDevInfo != INVALID_HANDLE_VALUE) + { + if (!SetupDiDestroyDeviceInfoList(DevInstData->hDevInfo)) + TRACE("SetupDiDestroyDeviceInfoList() failed with error 0x%lx\n", GetLastError()); + } + HeapFree(GetProcessHeap(), 0, DevInstData->buffer); + HeapFree(GetProcessHeap(), 0, DevInstData); + } + + return retval; }
/*
Removed: branches/ros-branch-0_3_0/reactos/dll/win32/newdev/newdev.h URL: http://svn.reactos.ru/svn/reactos/branches/ros-branch-0_3_0/reactos/dll/win3... ============================================================================== --- branches/ros-branch-0_3_0/reactos/dll/win32/newdev/newdev.h (original) +++ branches/ros-branch-0_3_0/reactos/dll/win32/newdev/newdev.h (removed) @@ -1,25 +1,0 @@ -#include <windows.h> -#include <commctrl.h> -#include <regstr.h> -#include <setupapi.h> -#include <cfgmgr32.h> -#include <tchar.h> -#include <wine/debug.h> - -#include <stdio.h> - -#include "resource.h" - -typedef struct _DEVINSTDATA -{ - HFONT hTitleFont; - PBYTE buffer; - DWORD requiredSize; - DWORD regDataType; - HWND hDialog; - HDEVINFO hDevInfo; - SP_DEVINFO_DATA devInfoData; - SP_DRVINFO_DATA drvInfoData; -} DEVINSTDATA, *PDEVINSTDATA; - -#define WM_SEARCH_FINISHED (WM_USER + 10)
Modified: branches/ros-branch-0_3_0/reactos/dll/win32/newdev/newdev.rbuild URL: http://svn.reactos.ru/svn/reactos/branches/ros-branch-0_3_0/reactos/dll/win3... ============================================================================== --- branches/ros-branch-0_3_0/reactos/dll/win32/newdev/newdev.rbuild (original) +++ branches/ros-branch-0_3_0/reactos/dll/win32/newdev/newdev.rbuild Thu Jun 1 06:57:47 2006 @@ -7,6 +7,7 @@ <define name="_WIN32_WINNT">0x0501</define> <file>newdev.c</file> <file>stubs.c</file> + <file>wizard.c</file> <file>newdev.rc</file> <file>newdev.spec</file> <library>wine</library>
Modified: branches/ros-branch-0_3_0/reactos/dll/win32/newdev/newdev.rc URL: http://svn.reactos.ru/svn/reactos/branches/ros-branch-0_3_0/reactos/dll/win3... ============================================================================== --- branches/ros-branch-0_3_0/reactos/dll/win32/newdev/newdev.rc (original) +++ branches/ros-branch-0_3_0/reactos/dll/win32/newdev/newdev.rc Thu Jun 1 06:57:47 2006 @@ -11,3 +11,4 @@ #include "De.rc" #include "Hu.rc" #include "Ru.rc" +#include "Fr.rc"
Copied: branches/ros-branch-0_3_0/reactos/dll/win32/newdev/newdev_private.h (from r22094, trunk/reactos/dll/win32/newdev/newdev_private.h) URL: http://svn.reactos.ru/svn/reactos/branches/ros-branch-0_3_0/reactos/dll/win3... ============================================================================== --- trunk/reactos/dll/win32/newdev/newdev_private.h (original) +++ branches/ros-branch-0_3_0/reactos/dll/win32/newdev/newdev_private.h Thu Jun 1 06:57:47 2006 @@ -8,6 +8,7 @@ #include <regstr.h> #include <setupapi.h> #include <cfgmgr32.h> +#include <shlobj.h> #include <tchar.h> #include <wine/debug.h>
Modified: branches/ros-branch-0_3_0/reactos/dll/win32/newdev/resource.h URL: http://svn.reactos.ru/svn/reactos/branches/ros-branch-0_3_0/reactos/dll/win3... ============================================================================== --- branches/ros-branch-0_3_0/reactos/dll/win32/newdev/resource.h (original) +++ branches/ros-branch-0_3_0/reactos/dll/win32/newdev/resource.h Thu Jun 1 06:57:47 2006 @@ -1,10 +1,10 @@ #ifndef RESOURCE_H #define RESOURCE_H
-#define IDB_WATERMARK 100 -#define IDB_HEADER 101 +#define IDB_WATERMARK 100 +#define IDB_HEADER 101
-#define IDC_STATIC -1 +#define IDC_STATIC -1
#define IDC_DEVICE 2000 #define IDC_RADIO_AUTO 2001 @@ -14,15 +14,17 @@ #define IDC_RADIO_CHOOSE 2005 #define IDC_CHECK_MEDIA 2006 #define IDC_CHECK_PATH 2007 -#define IDC_WELCOMETITLE 2008 +#define IDC_WELCOMETITLE 2008 #define IDC_BROWSE 2009 #define IDC_COMBO_PATH 2010 #define IDC_FINISHTITLE 2011
-#define IDD_WELCOMEPAGE 0 +#define IDD_WELCOMEPAGE 0 #define IDD_CHSOURCE 1 #define IDD_SEARCHDRV 2 -#define IDD_FINISHPAGE 3 +#define IDD_INSTALLDRV 3 #define IDD_NODRIVER 4 +#define IDD_INSTALLFAILED 5 +#define IDD_FINISHPAGE 6
#endif /* RESOURCE_H */
Modified: branches/ros-branch-0_3_0/reactos/dll/win32/newdev/stubs.c URL: http://svn.reactos.ru/svn/reactos/branches/ros-branch-0_3_0/reactos/dll/win3... ============================================================================== --- branches/ros-branch-0_3_0/reactos/dll/win32/newdev/stubs.c (original) +++ branches/ros-branch-0_3_0/reactos/dll/win32/newdev/stubs.c Thu Jun 1 06:57:47 2006 @@ -18,7 +18,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
-#include "newdev.h" +#include "newdev_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(newdev);
Copied: branches/ros-branch-0_3_0/reactos/dll/win32/newdev/wizard.c (from r22051, trunk/reactos/dll/win32/newdev/wizard.c) URL: http://svn.reactos.ru/svn/reactos/branches/ros-branch-0_3_0/reactos/dll/win3... ============================================================================== --- trunk/reactos/dll/win32/newdev/wizard.c (original) +++ branches/ros-branch-0_3_0/reactos/dll/win32/newdev/wizard.c Thu Jun 1 06:57:47 2006 @@ -18,8 +18,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
-#define YDEBUG -#include "newdev.h" +#include "newdev_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(newdev);
@@ -335,6 +334,19 @@ return 0; }
+static DWORD WINAPI +InstallDriverProc( + IN LPVOID lpParam) +{ + PDEVINSTDATA DevInstData; + BOOL res; + + DevInstData = (PDEVINSTDATA)lpParam; + res = InstallCurrentDriver(DevInstData); + PostMessage(DevInstData->hDialog, WM_INSTALL_FINISHED, res ? 0 : 1, 0); + return 0; +} + static VOID PopulateCustomPathCombo( IN HWND hwndCombo) @@ -346,7 +358,7 @@ LPCTSTR Path; LONG rc;
- ComboBox_ResetContent(hwndCombo); + (void)ComboBox_ResetContent(hwndCombo);
/* RegGetValue would have been better... */ rc = RegOpenKeyEx( @@ -372,6 +384,7 @@ TRACE("RegQueryValueEx() failed with error 0x%lx\n", rc); goto cleanup; } + /* Allocate enough space to add 2 NULL chars at the end of the string */ Buffer = HeapAlloc(GetProcessHeap(), 0, dwPathLength + 2 * sizeof(TCHAR)); if (!Buffer) @@ -394,9 +407,12 @@ Buffer[dwPathLength] = Buffer[dwPathLength + 1] = '\0';
/* Populate combo box */ - for (Path = Buffer; *Path; Path += _tcslen(Path)) - ComboBox_AddString(hwndCombo, Path); - ComboBox_SetCurSel(hwndCombo, 0); + for (Path = Buffer; *Path; Path += _tcslen(Path) + 1) + { + (void)ComboBox_AddString(hwndCombo, Path); + if (Path == Buffer) + (void)ComboBox_SetCurSel(hwndCombo, 0); + }
cleanup: if (hKey != NULL) @@ -408,7 +424,110 @@ SaveCustomPath( IN HWND hwndCombo) { - FIXME("Stub."); + LPTSTR CustomPath = NULL; + DWORD CustomPathLength; + LPTSTR Buffer = NULL; + LPTSTR pBuffer; /* Pointer into Buffer */ + int ItemsCount, Length; + DWORD i; + DWORD TotalLength = 0; + BOOL UseCustomPath = TRUE; + HKEY hKey = NULL; + LONG rc; + + /* Get custom path */ + Length = ComboBox_GetTextLength(hwndCombo) + 1; + CustomPath = HeapAlloc(GetProcessHeap(), 0, Length * sizeof(TCHAR)); + if (!CustomPath) + { + TRACE("HeapAlloc() failed\n"); + goto cleanup; + } + CustomPathLength = ComboBox_GetText(hwndCombo, CustomPath, Length) + 1; + + /* Calculate length of the buffer */ + ItemsCount = ComboBox_GetCount(hwndCombo); + if (ItemsCount == CB_ERR) + { + TRACE("ComboBox_GetCount() failed\n"); + goto cleanup; + } + for (i = 0; i < ItemsCount; i++) + { + Length = ComboBox_GetLBTextLen(hwndCombo, i); + if (Length == CB_ERR) + { + TRACE("ComboBox_GetLBTextLen() failed\n"); + goto cleanup; + } + TotalLength += Length + 1; + } + TotalLength++; /* Final NULL char */ + + /* Allocate buffer */ + Buffer = HeapAlloc(GetProcessHeap(), 0, (CustomPathLength + TotalLength + 1) * sizeof(TCHAR)); + if (!Buffer) + { + TRACE("HeapAlloc() failed\n"); + goto cleanup; + } + + /* Fill the buffer */ + pBuffer = &Buffer[CustomPathLength]; + for (i = 0; i < ItemsCount; i++) + { + Length = ComboBox_GetLBText(hwndCombo, i, pBuffer); + if (Length == CB_ERR) + { + TRACE("ComboBox_GetLBText() failed\n"); + goto cleanup; + } + else if (UseCustomPath && _tcsicmp(CustomPath, pBuffer) == 0) + UseCustomPath = FALSE; + pBuffer += 1 + Length; + } + *pBuffer = '\0'; /* Add final NULL char */ + + if (!UseCustomPath) + { + /* Nothing to save to registry */ + goto cleanup; + } + + TotalLength += CustomPathLength; + _tcscpy(Buffer, CustomPath); + + /* Save the buffer */ + /* RegSetKeyValue would have been better... */ + rc = RegOpenKeyEx( + HKEY_LOCAL_MACHINE, + REGSTR_PATH_SETUP REGSTR_KEY_SETUP, + 0, + KEY_SET_VALUE, + &hKey); + if (rc != ERROR_SUCCESS) + { + TRACE("RegOpenKeyEx() failed with error 0x%lx\n", rc); + goto cleanup; + } + rc = RegSetValueEx( + hKey, + _T("Installation Sources"), + 0, + REG_MULTI_SZ, + (const BYTE*)Buffer, + TotalLength * sizeof(TCHAR)); + if (rc != ERROR_SUCCESS) + { + TRACE("RegSetValueEx() failed with error 0x%lx\n", rc); + goto cleanup; + } + +cleanup: + if (hKey != NULL) + RegCloseKey(hKey); + HeapFree(GetProcessHeap(), 0, CustomPath); + HeapFree(GetProcessHeap(), 0, Buffer); }
static INT_PTR CALLBACK @@ -501,7 +620,7 @@ IncludePath(HWND Dlg, BOOL Enabled) { EnableWindow(GetDlgItem(Dlg, IDC_COMBO_PATH), Enabled); - EnableWindow(GetDlgItem(Dlg, IDC_BROWSE), /*FIXME: Enabled*/ FALSE); + EnableWindow(GetDlgItem(Dlg, IDC_BROWSE), Enabled); }
static void @@ -578,9 +697,35 @@ return TRUE;
case IDC_BROWSE: - /* FIXME: set the IDC_COMBO_PATH text */ - FIXME("Should display browse folder dialog\n"); - return FALSE; + { + BROWSEINFO bi = { 0, }; + LPITEMIDLIST pidl; + + bi.hwndOwner = hwndDlg; + bi.ulFlags = BIF_RETURNONLYFSDIRS; + pidl = SHBrowseForFolder(&bi); + if (pidl) + { + TCHAR Directory[MAX_PATH]; + IMalloc* malloc; + + if (SHGetPathFromIDList(pidl, Directory)) + { + /* Set the IDC_COMBO_PATH text */ + ComboBox_SetText(GetDlgItem(hwndDlg, IDC_COMBO_PATH), Directory); + } + + /* Free memory, if possible */ + if (SUCCEEDED(SHGetMalloc(&malloc))) + { + FIXME("Memory leak!\n"); + //malloc->Free(pidl); + //malloc->Release(); + } + return TRUE; + } + break; + } } break; } @@ -606,7 +751,7 @@ if (PrepareFoldersToScan(DevInstData, hwndDlg)) PropSheet_SetCurSelByID(GetParent(hwndDlg), IDD_SEARCHDRV); else - /* FIXME: unknown error */; + PropSheet_SetCurSelByID(GetParent(hwndDlg), IDD_INSTALLFAILED); } else /* FIXME */; @@ -675,11 +820,7 @@ if (wParam == 0) PropSheet_SetCurSelByID(GetParent(hwndDlg), IDD_NODRIVER); else - { - /* FIXME: Shouldn't belong here... */ - InstallCurrentDriver(DevInstData); - PropSheet_SetCurSelByID(GetParent(hwndDlg), IDD_FINISHPAGE); - } + PropSheet_SetCurSelByID(GetParent(hwndDlg), IDD_INSTALLDRV); break; }
@@ -726,6 +867,86 @@ IN WPARAM wParam, IN LPARAM lParam) { + PDEVINSTDATA DevInstData; + DWORD dwThreadId; + + /* Retrieve pointer to the global setup data */ + DevInstData = (PDEVINSTDATA)GetWindowLongPtr(hwndDlg, GWL_USERDATA); + + switch (uMsg) + { + case WM_INITDIALOG: + { + HWND hwndControl; + DWORD dwStyle; + + /* Get pointer to the global setup data */ + DevInstData = (PDEVINSTDATA)((LPPROPSHEETPAGE)lParam)->lParam; + SetWindowLongPtr(hwndDlg, GWL_USERDATA, (DWORD_PTR)DevInstData); + + DevInstData->hDialog = hwndDlg; + hwndControl = GetParent(hwndDlg); + + /* Center the wizard window */ + CenterWindow(hwndControl); + + SendDlgItemMessage( + hwndDlg, + IDC_DEVICE, + WM_SETTEXT, + 0, + (LPARAM)DevInstData->drvInfoData.Description); + + /* Hide the system menu */ + dwStyle = GetWindowLong(hwndControl, GWL_STYLE); + SetWindowLong(hwndControl, GWL_STYLE, dwStyle & ~WS_SYSMENU); + break; + } + + case WM_INSTALL_FINISHED: + { + CloseHandle(hThread); + hThread = 0; + if (wParam == 0) + PropSheet_SetCurSelByID(GetParent(hwndDlg), IDD_FINISHPAGE); + else + PropSheet_SetCurSelByID(GetParent(hwndDlg), IDD_INSTALLFAILED); + break; + } + + case WM_NOTIFY: + { + LPNMHDR lpnm = (LPNMHDR)lParam; + + switch (lpnm->code) + { + case PSN_SETACTIVE: + PropSheet_SetWizButtons(GetParent(hwndDlg), !PSWIZB_NEXT | !PSWIZB_BACK); + hThread = CreateThread(NULL, 0, InstallDriverProc, DevInstData, 0, &dwThreadId); + break; + + case PSN_KILLACTIVE: + if (hThread != 0) + { + SetWindowLong(hwndDlg, DWL_MSGRESULT, TRUE); + return TRUE; + } + break; + + case PSN_WIZNEXT: + /* Handle a Next button click, if necessary */ + break; + + default: + break; + } + break; + } + + default: + break; + } + return FALSE; }
@@ -737,23 +958,23 @@ IN LPARAM lParam) { PDEVINSTDATA DevInstData; + HWND hwndControl;
/* Get pointer to the global setup data */ - DevInstData = (PDEVINSTDATA)GetWindowLongPtr (hwndDlg, GWL_USERDATA); + DevInstData = (PDEVINSTDATA)GetWindowLongPtr(hwndDlg, GWL_USERDATA);
switch (uMsg) { case WM_INITDIALOG: { - HWND hwndControl; BOOL DisableableDevice = FALSE;
DevInstData = (PDEVINSTDATA)((LPPROPSHEETPAGE)lParam)->lParam; SetWindowLongPtr(hwndDlg, GWL_USERDATA, (DWORD_PTR)DevInstData);
hwndControl = GetDlgItem(GetParent(hwndDlg), IDCANCEL); - ShowWindow (hwndControl, SW_HIDE); - EnableWindow (hwndControl, FALSE); + ShowWindow(hwndControl, SW_HIDE); + EnableWindow(hwndControl, FALSE);
/* Set title font */ SendDlgItemMessage( @@ -788,7 +1009,10 @@
case PSN_WIZBACK: /* Handle a Back button click, if necessary */ - PropSheet_SetCurSelByID(GetParent(hwndDlg), IDD_WELCOMEPAGE); + hwndControl = GetDlgItem(GetParent(hwndDlg), IDCANCEL); + ShowWindow(hwndControl, SW_SHOW); + EnableWindow(hwndControl, TRUE); + PropSheet_SetCurSelByID(GetParent(hwndDlg), IDD_CHSOURCE); return TRUE;
case PSN_WIZFINISH: @@ -836,6 +1060,81 @@ }
static INT_PTR CALLBACK +InstallFailedDlgProc( + IN HWND hwndDlg, + IN UINT uMsg, + IN WPARAM wParam, + IN LPARAM lParam) +{ + PDEVINSTDATA DevInstData; + + /* Retrieve pointer to the global setup data */ + DevInstData = (PDEVINSTDATA)GetWindowLongPtr(hwndDlg, GWL_USERDATA); + + switch (uMsg) + { + case WM_INITDIALOG: + { + HWND hwndControl; + + /* Get pointer to the global setup data */ + DevInstData = (PDEVINSTDATA)((LPPROPSHEETPAGE)lParam)->lParam; + SetWindowLongPtr(hwndDlg, GWL_USERDATA, (DWORD_PTR)DevInstData); + + hwndControl = GetDlgItem(GetParent(hwndDlg), IDCANCEL); + ShowWindow(hwndControl, SW_HIDE); + EnableWindow(hwndControl, FALSE); + + SendDlgItemMessage( + hwndDlg, + IDC_DEVICE, + WM_SETTEXT, + 0, + (LPARAM)DevInstData->drvInfoData.Description); + + /* Set title font */ + SendDlgItemMessage( + hwndDlg, + IDC_FINISHTITLE, + WM_SETFONT, + (WPARAM)DevInstData->hTitleFont, + (LPARAM)TRUE); + break; + } + + case WM_NOTIFY: + { + LPNMHDR lpnm = (LPNMHDR)lParam; + + switch (lpnm->code) + { + case PSN_SETACTIVE: + /* Enable the correct buttons on for the active page */ + PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_FINISH); + break; + + case PSN_WIZBACK: + /* Handle a Back button click, if necessary */ + break; + + case PSN_WIZFINISH: + /* Handle a Finish button click, if necessary */ + break; + + default: + break; + } + break; + } + + default: + break; + } + + return FALSE; +} + +static INT_PTR CALLBACK FinishDlgProc( IN HWND hwndDlg, IN UINT uMsg, @@ -845,7 +1144,7 @@ PDEVINSTDATA DevInstData;
/* Retrieve pointer to the global setup data */ - DevInstData = (PDEVINSTDATA)GetWindowLongPtr (hwndDlg, GWL_USERDATA); + DevInstData = (PDEVINSTDATA)GetWindowLongPtr(hwndDlg, GWL_USERDATA);
switch (uMsg) { @@ -858,8 +1157,8 @@ SetWindowLongPtr(hwndDlg, GWL_USERDATA, (DWORD_PTR)DevInstData);
hwndControl = GetDlgItem(GetParent(hwndDlg), IDCANCEL); - ShowWindow (hwndControl, SW_HIDE); - EnableWindow (hwndControl, FALSE); + ShowWindow(hwndControl, SW_HIDE); + EnableWindow(hwndControl, FALSE);
SendDlgItemMessage( hwndDlg, @@ -973,11 +1272,17 @@ psp.pszTemplate = MAKEINTRESOURCE(IDD_INSTALLDRV); ahpsp[IDD_INSTALLDRV] = CreatePropertySheetPage(&psp);
- /* Create the Install failed page */ + /* Create the No driver page */ psp.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER; psp.pfnDlgProc = NoDriverDlgProc; psp.pszTemplate = MAKEINTRESOURCE(IDD_NODRIVER); ahpsp[IDD_NODRIVER] = CreatePropertySheetPage(&psp); + + /* Create the Install failed page */ + psp.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER; + psp.pfnDlgProc = InstallFailedDlgProc; + psp.pszTemplate = MAKEINTRESOURCE(IDD_INSTALLFAILED); + ahpsp[IDD_INSTALLFAILED] = CreatePropertySheetPage(&psp);
/* Create the Finish page */ psp.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER; @@ -990,7 +1295,7 @@ psh.dwFlags = PSH_WIZARD97 | PSH_WATERMARK | PSH_HEADER; psh.hInstance = hDllInstance; psh.hwndParent = hwndParent; - psh.nPages = 7; + psh.nPages = IDD_FINISHPAGE + 1; psh.nStartPage = startPage; psh.phpage = ahpsp; psh.pszbmWatermark = MAKEINTRESOURCE(IDB_WATERMARK);