Leaked source code of windows server 2003
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

//+-------------------------------------------------------------------------
//
// 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);
}
}