[ros-diffs] [amunger] 22140: Sync newdev to trunk. Revisions: 22049-22051, 22074, 22076, 22092-22094, 22102, 22116-22117, 22125, 22127-22128

amunger at svn.reactos.org amunger at svn.reactos.org
Thu Jun 1 04:57:49 CEST 2006


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/win32/newdev/De.rc?rev=22140&r1=22139&r2=22140&view=diff
==============================================================================
--- 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/win32/newdev/En.rc?rev=22140&r1=22139&r2=22140&view=diff
==============================================================================
--- 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/win32/newdev/Es.rc?rev=22140&r1=22139&r2=22140&view=diff
==============================================================================
--- 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/win32/newdev/Fr.rc?p2=branches/ros-branch-0_3_0/reactos/dll/win32/newdev/Fr.rc&p1=trunk/reactos/dll/win32/newdev/Fr.rc&r1=22127&r2=22140&rev=22140&view=diff
==============================================================================
--- 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/win32/newdev/Hu.rc?rev=22140&r1=22139&r2=22140&view=diff
==============================================================================
--- 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/win32/newdev/Ru.rc?rev=22140&r1=22139&r2=22140&view=diff
==============================================================================
--- 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/win32/newdev/newdev.c?rev=22140&r1=22139&r2=22140&view=diff
==============================================================================
--- 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/win32/newdev/newdev.h?rev=22139&view=auto
==============================================================================
--- 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/win32/newdev/newdev.rbuild?rev=22140&r1=22139&r2=22140&view=diff
==============================================================================
--- 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/win32/newdev/newdev.rc?rev=22140&r1=22139&r2=22140&view=diff
==============================================================================
--- 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/win32/newdev/newdev_private.h?p2=branches/ros-branch-0_3_0/reactos/dll/win32/newdev/newdev_private.h&p1=trunk/reactos/dll/win32/newdev/newdev_private.h&r1=22094&r2=22140&rev=22140&view=diff
==============================================================================
--- 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/win32/newdev/resource.h?rev=22140&r1=22139&r2=22140&view=diff
==============================================================================
--- 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/win32/newdev/stubs.c?rev=22140&r1=22139&r2=22140&view=diff
==============================================================================
--- 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/win32/newdev/wizard.c?p2=branches/ros-branch-0_3_0/reactos/dll/win32/newdev/wizard.c&p1=trunk/reactos/dll/win32/newdev/wizard.c&r1=22051&r2=22140&rev=22140&view=diff
==============================================================================
--- 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);




More information about the Ros-diffs mailing list