You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
5.7 KiB
185 lines
5.7 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
//
|
|
// Copyright (C) Microsoft Corporation
|
|
//
|
|
// File: install.c
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#include "hdwwiz.h"
|
|
|
|
|
|
typedef
|
|
UINT
|
|
(*PINSTALLDEVINST)(
|
|
HWND hwndParent,
|
|
LPCWSTR DeviceInstanceId,
|
|
BOOL UpdateDriver,
|
|
PDWORD pReboot
|
|
);
|
|
|
|
HMODULE hNewDev = NULL;
|
|
PINSTALLDEVINST pInstallDevInst = NULL;
|
|
|
|
|
|
|
|
void
|
|
InstallSilentChilds(
|
|
HWND hwdnParent,
|
|
PHARDWAREWIZ HardwareWiz
|
|
);
|
|
|
|
void
|
|
InstallSilentChildSiblings(
|
|
HWND hwndParent,
|
|
PHARDWAREWIZ HardwareWiz,
|
|
DEVINST DeviceInstance,
|
|
BOOL ReinstallAll
|
|
)
|
|
{
|
|
CONFIGRET ConfigRet;
|
|
DEVINST ChildDeviceInstance;
|
|
ULONG Ulong, ulValue;
|
|
BOOL NeedsInstall, IsSilent;
|
|
|
|
do {
|
|
//
|
|
// If this device instance needs installing and is silent then install it,
|
|
// and its children.
|
|
//
|
|
IsSilent = FALSE;
|
|
if (!ReinstallAll) {
|
|
|
|
Ulong = sizeof(ulValue);
|
|
ConfigRet = CM_Get_DevNode_Registry_Property_Ex(DeviceInstance,
|
|
CM_DRP_CAPABILITIES,
|
|
NULL,
|
|
(PVOID)&ulValue,
|
|
&Ulong,
|
|
0,
|
|
NULL
|
|
);
|
|
|
|
if (ConfigRet == CR_SUCCESS && (ulValue & CM_DEVCAP_SILENTINSTALL)) {
|
|
|
|
IsSilent = TRUE;
|
|
}
|
|
}
|
|
|
|
if (IsSilent || ReinstallAll) {
|
|
|
|
Ulong = sizeof(ulValue);
|
|
ConfigRet = CM_Get_DevNode_Registry_Property_Ex(DeviceInstance,
|
|
CM_DRP_CONFIGFLAGS,
|
|
NULL,
|
|
(PVOID)&ulValue,
|
|
&Ulong,
|
|
0,
|
|
NULL
|
|
);
|
|
|
|
if (ConfigRet == CR_SUCCESS && (ulValue & CONFIGFLAG_FINISH_INSTALL)) {
|
|
|
|
NeedsInstall = TRUE;
|
|
|
|
} else {
|
|
|
|
ConfigRet = CM_Get_DevNode_Status(&Ulong,
|
|
&ulValue,
|
|
DeviceInstance,
|
|
0
|
|
);
|
|
|
|
NeedsInstall = ConfigRet == CR_SUCCESS &&
|
|
(ulValue == CM_PROB_REINSTALL ||
|
|
ulValue == CM_PROB_NOT_CONFIGURED
|
|
);
|
|
}
|
|
|
|
|
|
if (NeedsInstall) {
|
|
|
|
TCHAR DeviceInstanceId[MAX_DEVICE_ID_LEN];
|
|
|
|
ConfigRet = CM_Get_Device_ID(DeviceInstance,
|
|
DeviceInstanceId,
|
|
SIZECHARS(DeviceInstanceId),
|
|
0
|
|
);
|
|
|
|
if (ConfigRet == CR_SUCCESS) {
|
|
|
|
if (hNewDev) {
|
|
|
|
if (!pInstallDevInst) {
|
|
|
|
pInstallDevInst = (PINSTALLDEVINST)GetProcAddress(hNewDev, "InstallDevInst");
|
|
}
|
|
}
|
|
|
|
if (pInstallDevInst) {
|
|
|
|
if (pInstallDevInst(hwndParent,
|
|
DeviceInstanceId,
|
|
FALSE, // only for found new.
|
|
&Ulong
|
|
)) {
|
|
|
|
HardwareWiz->Reboot |= Ulong;
|
|
}
|
|
}
|
|
|
|
|
|
//
|
|
// If this devinst has children, then recurse to install them as well.
|
|
//
|
|
ConfigRet = CM_Get_Child_Ex(&ChildDeviceInstance,
|
|
DeviceInstance,
|
|
0,
|
|
NULL
|
|
);
|
|
|
|
if (ConfigRet == CR_SUCCESS) {
|
|
|
|
InstallSilentChildSiblings(hwndParent, HardwareWiz, ChildDeviceInstance, ReinstallAll);
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//
|
|
// Next sibling ...
|
|
//
|
|
ConfigRet = CM_Get_Sibling_Ex(&DeviceInstance,
|
|
DeviceInstance,
|
|
0,
|
|
NULL
|
|
);
|
|
|
|
} while (ConfigRet == CR_SUCCESS);
|
|
}
|
|
|
|
void
|
|
InstallSilentChilds(
|
|
HWND hwndParent,
|
|
PHARDWAREWIZ HardwareWiz
|
|
)
|
|
{
|
|
CONFIGRET ConfigRet;
|
|
DEVINST ChildDeviceInstance;
|
|
|
|
ConfigRet = CM_Get_Child_Ex(&ChildDeviceInstance,
|
|
HardwareWiz->DeviceInfoData.DevInst,
|
|
0,
|
|
NULL
|
|
);
|
|
|
|
if (ConfigRet == CR_SUCCESS) {
|
|
|
|
InstallSilentChildSiblings(hwndParent, HardwareWiz, ChildDeviceInstance, FALSE);
|
|
}
|
|
}
|