void PromptReboot() { Trace("\nReboot required.\n"); if (!silent) SetupPromptReboot(NULL, NULL, FALSE); }
int DoInstallNewDevice() { HMODULE hNewDev = NULL; PINSTALL_NEW_DEVICE InstallNewDevice; DWORD Reboot; BOOL ret; LONG rc; HWND hwnd = NULL; hNewDev = LoadLibrary(_T("newdev.dll")); if (!hNewDev) { rc = 1; goto cleanup; } InstallNewDevice = (PINSTALL_NEW_DEVICE)GetProcAddress(hNewDev, (LPCSTR)"InstallNewDevice"); if (!InstallNewDevice) { rc = 2; goto cleanup; } ret = InstallNewDevice(hwnd, &DisplayGuid, &Reboot); if (!ret) { rc = 3; goto cleanup; } if (Reboot != DI_NEEDRESTART && Reboot != DI_NEEDREBOOT) { /* We're done with installation */ rc = 0; goto cleanup; } /* We need to reboot */ if (SetupPromptReboot(NULL, hwnd, FALSE) == -1) { /* User doesn't want to reboot, or an error occurred */ rc = 5; goto cleanup; } rc = 0; cleanup: if (hNewDev != NULL) FreeLibrary(hNewDev); return rc; }
int InstallInf(_TCHAR *inf) { GUID ClassGUID; TCHAR ClassName[256]; HDEVINFO DeviceInfoSet = 0; SP_DEVINFO_DATA DeviceInfoData; TCHAR FullFilePath[1024]; PUpdateDriverForPlugAndPlayDevices pfnUpdateDriverForPlugAndPlayDevices; HMODULE hNewDev = NULL; DWORD Reboot; HWND hwnd = NULL; int ret = -1; if (!GetFullPathName(inf, sizeof(FullFilePath), FullFilePath, NULL)) { logError("GetFullPathName: %x\n", GetLastError()); return ret; } logInfo("Inf file: %s\n", FullFilePath); hNewDev = LoadLibrary(_T("newdev.dll")); if (!hNewDev) { logError("newdev.dll: %x\n", GetLastError()); return ret; } pfnUpdateDriverForPlugAndPlayDevices = (PUpdateDriverForPlugAndPlayDevices) GetProcAddress(hNewDev, (LPCSTR)"UpdateDriverForPlugAndPlayDevicesA"); if (!pfnUpdateDriverForPlugAndPlayDevices) { logError("UpdateDriverForPlugAndPlayDevices: %x\n", GetLastError()); goto FreeLib; } if (!SetupDiGetINFClass(FullFilePath, &ClassGUID, ClassName, sizeof(ClassName), 0)) { logError("SetupDiGetINFClass: %x\n", GetLastError()); goto FreeLib; } #if 0 logPrint("{%08lX-%04hX-%04hX-%02hhX%02hhX-%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX}\n", ClassGUID.Data1, ClassGUID.Data2, ClassGUID.Data3, ClassGUID.Data4[0], ClassGUID.Data4[1], ClassGUID.Data4[2], ClassGUID.Data4[3], ClassGUID.Data4[4], ClassGUID.Data4[5], ClassGUID.Data4[6], ClassGUID.Data4[7]); #endif if ((DeviceInfoSet = SetupDiCreateDeviceInfoList(&ClassGUID,0)) == INVALID_HANDLE_VALUE) { logError("SetupDiCreateDeviceInfoList: %x\n", GetLastError()); goto FreeLib; } DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); if (!SetupDiCreateDeviceInfo(DeviceInfoSet, ClassName, &ClassGUID, NULL, 0, DICD_GENERATE_ID, &DeviceInfoData)) { logError("SetupDiCreateDeviceInfo: %x\n", GetLastError()); goto SetupDiCreateDeviceInfoListError; } if(!SetupDiSetDeviceRegistryProperty(DeviceInfoSet, &DeviceInfoData, SPDRP_HARDWAREID, (LPBYTE)DRIVER_NAME, (lstrlen(DRIVER_NAME)+2))) { logError("SetupDiSetDeviceRegistryProperty: %x\n", GetLastError()); goto SetupDiCreateDeviceInfoListError; } if (!SetupDiCallClassInstaller(DIF_REGISTERDEVICE, DeviceInfoSet, &DeviceInfoData)) { logError("SetupDiCallClassInstaller: %x\n", GetLastError()); goto SetupDiCreateDeviceInfoListError; } ret = pfnUpdateDriverForPlugAndPlayDevices(NULL, DRIVER_NAME, FullFilePath, 0, &Reboot); if (Reboot == DI_NEEDRESTART || Reboot == DI_NEEDREBOOT) { if (SetupPromptReboot(NULL, hwnd, FALSE) == -1) { ; // ToDo ?? } } ret = 0; SetupDiCreateDeviceInfoListError: SetupDiDestroyDeviceInfoList(DeviceInfoSet); FreeLib: FreeLibrary(hNewDev); return ret; }
VOID DoValueAddWizard( _In_ LPCWSTR MediaRootDirectory ) /*++ Routine Description: This routine displays a wizard that steps the user through the following actions: (a) Performs a "driver update" for any currently-present toasters (b) Installs the INF and CAT in case no toasters presently exist (c) Optionally, installs value-add software selected by the user (this wizard page is retrieved from the toaster co-installer, and is the same page the user gets if they do a "hardware-first" installation using our driver). Arguments: MediaRootDirectory - Supplies the fully-qualified path to the root directory where the installation media is located. Return Value: none --*/ { PROPSHEETPAGE psp = {0}; //defines the property sheet pages HPROPSHEETPAGE ahpsp[4] = {0}; //an array to hold the page's HPROPSHEETPAGE handles PROPSHEETHEADER psh = {0}; //defines the property sheet SHAREDWIZDATA wizdata = {0}; //the shared data structure NONCLIENTMETRICS ncm = {0}; LOGFONT TitleLogFont; HDC hdc; INT FontSize; INT index = 0; HRESULT hr; // //Create the Wizard pages // // Intro page... // psp.dwSize = sizeof(psp); psp.dwFlags = PSP_DEFAULT|PSP_HIDEHEADER; psp.hInstance = g_hInstance; psp.lParam = (LPARAM) &wizdata; //The shared data structure psp.pfnDlgProc = IntroDlgProc; psp.pszTemplate = MAKEINTRESOURCE(IDD_INTRO); ahpsp[index++] = CreatePropertySheetPage(&psp); // // Updating drivers page... // psp.dwFlags = PSP_DEFAULT|PSP_USEHEADERTITLE|PSP_USEHEADERSUBTITLE|PSP_USETITLE; psp.pszHeaderTitle = MAKEINTRESOURCE(IDS_TITLE1); psp.pszHeaderSubTitle = MAKEINTRESOURCE(IDS_SUBTITLE1); psp.pszTemplate = MAKEINTRESOURCE(IDD_INTERIOR1); psp.pfnDlgProc = IntPage1DlgProc; ahpsp[index++] = CreatePropertySheetPage(&psp); // // Retrieve the value-add software chooser page from the toaster // co-installer (toastco.dll). // ahpsp[index] = GetValueAddSoftwareWizPage(MediaRootDirectory, NULL, NULL); if(ahpsp[index]) { index++; } // // Finish page... // psp.dwFlags = PSP_DEFAULT|PSP_HIDEHEADER; psp.pszTemplate = MAKEINTRESOURCE(IDD_END); psp.pfnDlgProc = EndDlgProc; ahpsp[index] = CreatePropertySheetPage(&psp); // // Create the property sheet... // psh.dwSize = sizeof(psh); psh.hInstance = g_hInstance; psh.hwndParent = NULL; psh.phpage = ahpsp; psh.dwFlags = PSH_WIZARD97|PSH_WATERMARK|PSH_HEADER|PSH_STRETCHWATERMARK|PSH_WIZARD|PSH_USECALLBACK; psh.pszbmWatermark = MAKEINTRESOURCE(IDB_WATERMARK); psh.pszbmHeader = MAKEINTRESOURCE(IDB_BANNER); psh.nStartPage = 0; psh.nPages = 4; psh.pfnCallback = WizardCallback; // // Set up the font for the titles on the intro and ending pages // ncm.cbSize = sizeof(ncm); SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0); // // Create the intro/end title font // TitleLogFont = ncm.lfMessageFont; TitleLogFont.lfWeight = FW_BOLD; hr = StringCchCopy(TitleLogFont.lfFaceName, LF_FACESIZE, L"Verdana Bold"); if(SUCCEEDED(hr) == FALSE) { return; // assert } hdc = GetDC(NULL); //gets the screen DC FontSize = 12; TitleLogFont.lfHeight = 0 - GetDeviceCaps(hdc, LOGPIXELSY) * FontSize / 72; wizdata.hTitleFont = CreateFontIndirect(&TitleLogFont); ReleaseDC(NULL, hdc); wizdata.MediaRootDirectory = MediaRootDirectory; // // Display the wizard // PropertySheet(&psh); // // Destroy the fonts // DeleteObject(wizdata.hTitleFont); // // If we did anything that requires a reboot, prompt the user // now. Note that we need to do this regardle // if(wizdata.RebootRequired) { SetupPromptReboot(NULL, NULL, FALSE); } }