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