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/win…
==============================================================================
--- 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/win…
==============================================================================
--- 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/win…
==============================================================================
--- 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/win…
==============================================================================
--- 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/win…
==============================================================================
--- 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/win…
==============================================================================
--- 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/win…
==============================================================================
--- 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/win…
==============================================================================
--- 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/win…
==============================================================================
--- 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/win…
==============================================================================
--- 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/win…
==============================================================================
--- 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/win…
==============================================================================
--- 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/win…
==============================================================================
--- 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/win…
==============================================================================
--- 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);