/*++ Copyright (c) 1998-1999 Microsoft Corporation Module Name: ocpage.cpp Abstract: This file implements the display page setup. Environment: WIN32 User Mode --*/ #include "precomp.h" #pragma hdrstop #include #include // // Defines // #define DEFAULT_XRESOLUTION 640 #define DEFAULT_YRESOLUTION 480 #define DEFAULT_BPP 15 #define DEFAULT_VREFRESH 60 #define MIN_XRESOLUTION 800 #define MIN_YRESOLUTION 600 // // Global Data // BOOL g_IsSetupInitComponentInitialized = FALSE; SETUP_INIT_COMPONENT g_SetupInitComponent; // // Function prototypes // DWORD HandleOcInitComponent( PSETUP_INIT_COMPONENT SetupInitComponent ); DWORD HandleOcCompleteInstallation( VOID ); BOOL MigrateUnattendedSettings( HDEVINFO hDevInfo ); VOID MigrateRegistrySettings( HDEVINFO hDevInfo ); VOID MigrateRegistrySettingsBasedOnBusLocation( HDEVINFO hDevInfo, HKEY hPhysicalDeviceKey, DWORD LogicalDevicesCount, DWORD BusNumber, DWORD Address ); VOID MigrateRegistrySettingsLegacy( HDEVINFO hDevInfo, HKEY hPhysicalDeviceKey ); VOID MigrateRegistrySettingsHelper( HDEVINFO hDevInfo, PSP_DEVINFO_DATA pDevInfoData, HKEY hPhysicalDeviceKey, DWORD LogicalDevicesCount ); VOID MigrateDeviceKeySettings( HDEVINFO hDevInfo, PSP_DEVINFO_DATA pDevInfoData, HKEY hLogicalDeviceKey, DWORD Index ); // // Implementation // extern "C" { DWORD DisplayOcSetupProc( IN LPCVOID ComponentId, IN LPCVOID SubcomponentId, IN UINT Function, IN UINT_PTR Param1, IN OUT PVOID Param2 ) { switch (Function) { case OC_PREINITIALIZE: return OCFLAG_UNICODE; case OC_INIT_COMPONENT: return HandleOcInitComponent((PSETUP_INIT_COMPONENT)Param2); case OC_QUERY_STATE: return SubcompOn; // we are always installed case OC_COMPLETE_INSTALLATION: return HandleOcCompleteInstallation(); default: break; } return ERROR_SUCCESS; } } // extern "C" DWORD HandleOcInitComponent( PSETUP_INIT_COMPONENT SetupInitComponent ) { DWORD retValue = ERROR_SUCCESS; if (OCMANAGER_VERSION <= SetupInitComponent->OCManagerVersion) { SetupInitComponent->ComponentVersion = OCMANAGER_VERSION; g_IsSetupInitComponentInitialized = TRUE; CopyMemory( &g_SetupInitComponent, (LPVOID)SetupInitComponent, sizeof(SETUP_INIT_COMPONENT)); } else { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_100); retValue = ERROR_CALL_NOT_IMPLEMENTED; } return retValue; } DWORD HandleOcCompleteInstallation( VOID ) { BOOL bUnattended = FALSE; HDEVINFO hDevInfo = INVALID_HANDLE_VALUE; HKEY hKey; DeskOpenLog(); hDevInfo = SetupDiGetClassDevs((LPGUID)&GUID_DEVCLASS_DISPLAY, NULL, NULL, DIGCF_PRESENT); if (hDevInfo == INVALID_HANDLE_VALUE) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_101); goto Cleanup; } if ((g_SetupInitComponent.SetupData.OperationFlags & SETUPOP_BATCH) != 0) { // // Unattended settings // bUnattended = MigrateUnattendedSettings(hDevInfo); } if ((!bUnattended) && ((g_SetupInitComponent.SetupData.OperationFlags & SETUPOP_NTUPGRADE) != 0)) { // // Registry settings // MigrateRegistrySettings(hDevInfo); } Cleanup: RegDeleteKey(HKEY_LOCAL_MACHINE, SZ_DETECT_DISPLAY); RegDeleteKey(HKEY_LOCAL_MACHINE, SZ_NEW_DISPLAY); if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, SZ_UPDATE_SETTINGS_PATH, 0, KEY_WRITE, &hKey) == ERROR_SUCCESS) { SHDeleteKey(hKey, SZ_UPDATE_SETTINGS_KEY); RegCloseKey(hKey); } else { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_102); } if (hDevInfo != INVALID_HANDLE_VALUE) { SetupDiDestroyDeviceInfoList(hDevInfo); } DeskCloseLog(); return ERROR_SUCCESS; } BOOL MigrateUnattendedSettings( HDEVINFO hDevInfo ) { INFCONTEXT context; HINF hInf; TCHAR szName[128]; DWORD value; DWORD cFields = 0; DWORD BitsPerPel = 0, XResolution = 0, YResolution = 0, VRefresh = 0; DWORD UsePreferredMode = 0; DWORD AttachedToDesktop = 0; SP_DEVINFO_DATA DevInfoData; SP_DEVICE_INTERFACE_DATA InterfaceData; HKEY hInterfaceKey = (HKEY)INVALID_HANDLE_VALUE; HKEY hInterfaceLogicalDeviceKey = (HKEY)INVALID_HANDLE_VALUE; DWORD DevInfoIndex = 0; // // Get the handle to the answer file // hInf = g_SetupInitComponent.HelperRoutines.GetInfHandle( INFINDEX_UNATTENDED, g_SetupInitComponent.HelperRoutines.OcManagerContext); if ((hInf == NULL) || (hInf == (HINF)INVALID_HANDLE_VALUE)) { return FALSE; } // // Read the settings from the answer file // if (SetupFindFirstLine(hInf, TEXT("Display"), NULL, &context)) { do { if (SetupGetStringField(&context, 0, szName, ARRAYSIZE(szName), &value)) { if (lstrcmpi(szName, TEXT("BitsPerPel")) == 0) { if (SetupGetIntField(&context, 1, (PINT)&value)) { ++cFields; BitsPerPel = value; } else { SetupGetStringField(&context, 1, szName, ARRAYSIZE(szName), &value); DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_096, szName); } } else if (lstrcmpi(szName, TEXT("Xresolution")) == 0) { if (SetupGetIntField(&context, 1, (PINT)&value)) { ++cFields; XResolution = value; } else { SetupGetStringField(&context, 1, szName, ARRAYSIZE(szName), &value); DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_060); } } else if (lstrcmpi(szName, TEXT("YResolution")) == 0) { if (SetupGetIntField(&context, 1, (PINT) &value)) { ++cFields; YResolution = value; } else { SetupGetStringField(&context, 1, szName, ARRAYSIZE(szName), &value); DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_062, szName); } } else if (lstrcmpi( szName, TEXT("VRefresh")) == 0) { if (SetupGetIntField(&context, 1, (PINT) &value)) { ++cFields; VRefresh = value; } else { SetupGetStringField(&context, 1, szName, ARRAYSIZE(szName), &value); DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_064, szName); } } else { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_065, szName); } } } while (SetupFindNextLine(&context, &context)); } if (cFields == 0) { // // The answer file doesn't contain any display settings // goto Fallout; } // // "Normalize" the display settings // AttachedToDesktop = 1; if (BitsPerPel == 0) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_069, DEFAULT_BPP); BitsPerPel = DEFAULT_BPP; } if ((XResolution == 0) || (YResolution == 0)) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_067, DEFAULT_XRESOLUTION, DEFAULT_YRESOLUTION); XResolution = DEFAULT_XRESOLUTION; YResolution = DEFAULT_YRESOLUTION; } if (VRefresh == 0) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_068, DEFAULT_VREFRESH); VRefresh = DEFAULT_VREFRESH; } // // Apply the display settings to all video cards // DevInfoIndex = 0; DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA); while (SetupDiEnumDeviceInfo(hDevInfo, DevInfoIndex, &DevInfoData)) { InterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); if (!SetupDiCreateDeviceInterface(hDevInfo, &DevInfoData, &GUID_DISPLAY_ADAPTER_INTERFACE, NULL, 0, &InterfaceData)) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_103); goto NextDevice; } hInterfaceKey = SetupDiCreateDeviceInterfaceRegKey(hDevInfo, &InterfaceData, 0, KEY_SET_VALUE, NULL, NULL); if (hInterfaceKey == INVALID_HANDLE_VALUE) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_104); goto NextDevice; } if (RegCreateKeyEx(hInterfaceKey, TEXT("0"), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hInterfaceLogicalDeviceKey, NULL) != ERROR_SUCCESS) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_105, 0); hInterfaceLogicalDeviceKey = (HKEY)INVALID_HANDLE_VALUE; goto NextDevice; } // // Do not use the preferred mode for unattended installs // UsePreferredMode = 0; RegSetValueEx(hInterfaceLogicalDeviceKey, SZ_VU_PREFERRED_MODE, 0, REG_DWORD, (PBYTE)&UsePreferredMode, sizeof(UsePreferredMode)); // // AttachedToDesktop // RegSetValueEx(hInterfaceLogicalDeviceKey, SZ_VU_ATTACHED_TO_DESKTOP, 0, REG_DWORD, (PBYTE)&AttachedToDesktop, sizeof(AttachedToDesktop)); // // BitsPerPel // if (RegSetValueEx(hInterfaceLogicalDeviceKey, SZ_VU_BITS_PER_PEL, 0, REG_DWORD, (PBYTE)&BitsPerPel, sizeof(BitsPerPel)) == ERROR_SUCCESS) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_106, BitsPerPel); } // // XResolution // if (RegSetValueEx(hInterfaceLogicalDeviceKey, SZ_VU_X_RESOLUTION, 0, REG_DWORD, (PBYTE)&XResolution, sizeof(XResolution)) == ERROR_SUCCESS) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_107, XResolution); } // // dwYResolution // if (RegSetValueEx(hInterfaceLogicalDeviceKey, SZ_VU_Y_RESOLUTION, 0, REG_DWORD, (PBYTE)&YResolution, sizeof(YResolution)) == ERROR_SUCCESS) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_108, YResolution); } // // dwVRefresh // if (RegSetValueEx(hInterfaceLogicalDeviceKey, SZ_VU_VREFRESH, 0, REG_DWORD, (PBYTE)&VRefresh, sizeof(VRefresh)) == ERROR_SUCCESS) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_109, VRefresh); } NextDevice: if (hInterfaceLogicalDeviceKey != INVALID_HANDLE_VALUE) { RegCloseKey(hInterfaceLogicalDeviceKey); hInterfaceLogicalDeviceKey = (HKEY)INVALID_HANDLE_VALUE; } if (hInterfaceKey != INVALID_HANDLE_VALUE) { RegCloseKey(hInterfaceKey); hInterfaceKey = (HKEY)INVALID_HANDLE_VALUE; } DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA); ++DevInfoIndex; } Fallout: return (cFields != 0); } VOID MigrateRegistrySettings( HDEVINFO hDevInfo ) { HKEY hKey = 0, hPhysicalDeviceKey = 0; DWORD PhysicalDevicesCount = 0, LogicalDevicesCount = 0; DWORD cb = 0, PhysicalDevice = 0, Failed = 0; TCHAR Buffer[20]; BOOL IsLegacy; DWORD BusNumber = 0, Address = 0; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, SZ_UPDATE_SETTINGS, 0, KEY_READ, &hKey) != ERROR_SUCCESS) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_075); hKey = 0; goto Cleanup; } cb = sizeof(DWORD); if ((RegQueryValueEx(hKey, SZ_UPGRADE_FAILED_ALLOW_INSTALL, NULL, NULL, (LPBYTE)&Failed, &cb) == ERROR_SUCCESS) && (Failed != 0)) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_076); goto Cleanup; } cb = sizeof(PhysicalDevicesCount); if (RegQueryValueEx(hKey, SZ_VU_COUNT, 0, NULL, (PBYTE)&PhysicalDevicesCount, &cb) != ERROR_SUCCESS) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_110); goto Cleanup; } for(PhysicalDevice = 0; PhysicalDevice < PhysicalDevicesCount; PhysicalDevice++) { StringCchCopy(Buffer, ARRAYSIZE(Buffer), SZ_VU_PHYSICAL); size_t cchBuf = lstrlen(Buffer); StringCchPrintf(Buffer + cchBuf, ARRAYSIZE(Buffer) - cchBuf, TEXT("%d"), PhysicalDevice); if (RegOpenKeyEx(hKey, Buffer, 0, KEY_READ, &hPhysicalDeviceKey) != ERROR_SUCCESS) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_111); hPhysicalDeviceKey = 0; goto NextPhysicalDevice; } // // Get the count of logical devices // cb = sizeof(LogicalDevicesCount); if (RegQueryValueEx(hPhysicalDeviceKey, SZ_VU_COUNT, 0, NULL, (PBYTE)&LogicalDevicesCount, &cb) != ERROR_SUCCESS) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_112); goto NextPhysicalDevice; } // // Get the bus number and address // IsLegacy = TRUE; cb = sizeof(BusNumber); if (RegQueryValueEx(hPhysicalDeviceKey, SZ_VU_BUS_NUMBER, 0, NULL, (PBYTE)&BusNumber, &cb) == ERROR_SUCCESS) { cb = sizeof(Address); if (RegQueryValueEx(hPhysicalDeviceKey, SZ_VU_ADDRESS, 0, NULL, (PBYTE)&Address, &cb) == ERROR_SUCCESS) { IsLegacy = FALSE; } } if (!IsLegacy) { MigrateRegistrySettingsBasedOnBusLocation(hDevInfo, hPhysicalDeviceKey, LogicalDevicesCount, BusNumber, Address); } else if ((PhysicalDevicesCount == 1) && (LogicalDevicesCount == 1)) { // // If legacy, we support migration of a single device. // MigrateRegistrySettingsLegacy(hDevInfo, hPhysicalDeviceKey); } NextPhysicalDevice: if (hPhysicalDeviceKey != 0) { RegCloseKey(hPhysicalDeviceKey); hPhysicalDeviceKey = 0; } } Cleanup: if (hKey != 0) { RegCloseKey(hKey); } return; } VOID MigrateRegistrySettingsBasedOnBusLocation( HDEVINFO hDevInfo, HKEY hPhysicalDeviceKey, DWORD LogicalDevicesCount, DWORD BusNumber, DWORD Address ) { SP_DEVINFO_DATA DevInfoData; DWORD CurrentBusNumber = 0, CurrentAddress = 0; DWORD DevInfoIndex = 0; BOOL bFound = FALSE; // // Let's find the device with the same bus number and address // DevInfoIndex = 0; DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA); while (SetupDiEnumDeviceInfo(hDevInfo, DevInfoIndex, &DevInfoData)) { if (SetupDiGetDeviceRegistryProperty(hDevInfo, &DevInfoData, SPDRP_BUSNUMBER, NULL, (PBYTE)&CurrentBusNumber, sizeof(CurrentBusNumber), NULL) && (CurrentBusNumber == BusNumber) && SetupDiGetDeviceRegistryProperty(hDevInfo, &DevInfoData, SPDRP_ADDRESS, NULL, (PBYTE)&CurrentAddress, sizeof(CurrentAddress), NULL) && (CurrentAddress == Address)) { // // We found the device with the same bus number and address // So ... migrate the settings // MigrateRegistrySettingsHelper(hDevInfo, &DevInfoData, hPhysicalDeviceKey, LogicalDevicesCount); // // We are done // bFound = TRUE; break; } // // Next device // DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA); ++DevInfoIndex; } if (!bFound) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_113); } return; } VOID MigrateRegistrySettingsLegacy( HDEVINFO hDevInfo, HKEY hPhysicalDeviceKey ) { SP_DEVINFO_DATA DevInfoData0, DevInfoData1; DevInfoData0.cbSize = sizeof(SP_DEVINFO_DATA); if (!SetupDiEnumDeviceInfo(hDevInfo, 0, &DevInfoData0)) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_115); return; } DevInfoData1.cbSize = sizeof(SP_DEVINFO_DATA); if (SetupDiEnumDeviceInfo(hDevInfo, 1, &DevInfoData1)) { // // There are at least 2 video devices in the system // We don't know which device to apply the settings to. // So, just ignore this case // DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_114); return; } MigrateRegistrySettingsHelper(hDevInfo, &DevInfoData0, hPhysicalDeviceKey, 1); // there is only one logical device } VOID MigrateRegistrySettingsHelper( HDEVINFO hDevInfo, PSP_DEVINFO_DATA pDevInfoData, HKEY hPhysicalDeviceKey, DWORD LogicalDevicesCount ) { SP_DEVICE_INTERFACE_DATA InterfaceData; HKEY hInterfaceKey = 0; HKEY hInterfaceLogicalDeviceKey = 0; HKEY hLogicalDeviceKey = 0; TCHAR Buffer[20]; DWORD cb = 0, LogicalDevice = 0; DWORD UsePreferredMode = 0; DWORD AttachedToDesktop = 0; DWORD RelativeX = 0; DWORD RelativeY = 0; DWORD BitsPerPel = 0; DWORD XResolution = 0; DWORD YResolution = 0; DWORD VRefresh = 0; DWORD Flags = 0; InterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); if (!SetupDiCreateDeviceInterface(hDevInfo, pDevInfoData, &GUID_DISPLAY_ADAPTER_INTERFACE, NULL, 0, &InterfaceData)) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_103); return; } hInterfaceKey = SetupDiCreateDeviceInterfaceRegKey(hDevInfo, &InterfaceData, 0, KEY_SET_VALUE, NULL, NULL); if (hInterfaceKey == INVALID_HANDLE_VALUE) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_104); return; } for (LogicalDevice = 0; LogicalDevice < LogicalDevicesCount; ++LogicalDevice) { StringCchCopy(Buffer, ARRAYSIZE(Buffer), SZ_VU_LOGICAL); size_t cchBuf = lstrlen(Buffer); StringCchPrintf(Buffer + cchBuf, ARRAYSIZE(Buffer) - cchBuf, TEXT("%d"), LogicalDevice); if (RegOpenKeyEx(hPhysicalDeviceKey, Buffer, 0, KEY_READ, &hLogicalDeviceKey) != ERROR_SUCCESS) { // // We can not go on with this physical device // The LogicalDevices order is important for DualView // DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_116); break; } StringCchPrintf(Buffer, ARRAYSIZE(Buffer), TEXT("%d"), LogicalDevice); if (RegCreateKeyEx(hInterfaceKey, Buffer, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hInterfaceLogicalDeviceKey, NULL) != ERROR_SUCCESS) { // // We can not go on with this physical device // The LogicalDevices order is important for DualView // DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_105, LogicalDevice); RegCloseKey(hLogicalDeviceKey); break; } // // Use preferred mode? // cb = sizeof(XResolution); if (RegQueryValueEx(hLogicalDeviceKey, SZ_VU_X_RESOLUTION, 0, NULL, (PBYTE)&XResolution, &cb) != ERROR_SUCCESS) { XResolution = DEFAULT_XRESOLUTION; } cb = sizeof(YResolution); if (RegQueryValueEx(hLogicalDeviceKey, SZ_VU_Y_RESOLUTION, 0, NULL, (PBYTE)&YResolution, &cb) != ERROR_SUCCESS) { YResolution = DEFAULT_YRESOLUTION; } UsePreferredMode = ((XResolution < MIN_XRESOLUTION) || (YResolution < MIN_YRESOLUTION)); RegSetValueEx(hInterfaceLogicalDeviceKey, SZ_VU_PREFERRED_MODE, 0, REG_DWORD, (PBYTE)&UsePreferredMode, sizeof(UsePreferredMode)); if (UsePreferredMode) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_130); } else { // // AttachedToDesktop // cb = sizeof(AttachedToDesktop); if (RegQueryValueEx(hLogicalDeviceKey, SZ_VU_ATTACHED_TO_DESKTOP, 0, NULL, (PBYTE)&AttachedToDesktop, &cb) == ERROR_SUCCESS) { if (RegSetValueEx(hInterfaceLogicalDeviceKey, SZ_VU_ATTACHED_TO_DESKTOP, 0, REG_DWORD, (PBYTE)&AttachedToDesktop, sizeof(AttachedToDesktop)) == ERROR_SUCCESS) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_117, AttachedToDesktop); } } // // RelativeX // cb = sizeof(RelativeX); if (RegQueryValueEx(hLogicalDeviceKey, SZ_VU_RELATIVE_X, 0, NULL, (PBYTE)&RelativeX, &cb) == ERROR_SUCCESS) { if (RegSetValueEx(hInterfaceLogicalDeviceKey, SZ_VU_RELATIVE_X, 0, REG_DWORD, (PBYTE)&RelativeX, sizeof(RelativeX)) == ERROR_SUCCESS) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_118, RelativeX); } } // // RelativeY // cb = sizeof(RelativeY); if (RegQueryValueEx(hLogicalDeviceKey, SZ_VU_RELATIVE_Y, 0, NULL, (PBYTE)&RelativeY, &cb) == ERROR_SUCCESS) { if (RegSetValueEx(hInterfaceLogicalDeviceKey, SZ_VU_RELATIVE_Y, 0, REG_DWORD, (PBYTE)&RelativeY, sizeof(RelativeY)) == ERROR_SUCCESS) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_119, RelativeY); } } // // BitsPerPel // cb = sizeof(BitsPerPel); if (RegQueryValueEx(hLogicalDeviceKey, SZ_VU_BITS_PER_PEL, 0, NULL, (PBYTE)&BitsPerPel, &cb) == ERROR_SUCCESS) { if (RegSetValueEx(hInterfaceLogicalDeviceKey, SZ_VU_BITS_PER_PEL, 0, REG_DWORD, (PBYTE)&BitsPerPel, sizeof(BitsPerPel)) == ERROR_SUCCESS) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_120, BitsPerPel); } } // // XResolution // if (RegSetValueEx(hInterfaceLogicalDeviceKey, SZ_VU_X_RESOLUTION, 0, REG_DWORD, (PBYTE)&XResolution, sizeof(XResolution)) == ERROR_SUCCESS) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_121, XResolution); } // // dwYResolution // if (RegSetValueEx(hInterfaceLogicalDeviceKey, SZ_VU_Y_RESOLUTION, 0, REG_DWORD, (PBYTE)&YResolution, sizeof(YResolution)) == ERROR_SUCCESS) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_122, YResolution); } // // dwVRefresh // cb = sizeof(VRefresh); if (RegQueryValueEx(hLogicalDeviceKey, SZ_VU_VREFRESH, 0, NULL, (PBYTE)&VRefresh, &cb) == ERROR_SUCCESS) { if (RegSetValueEx(hInterfaceLogicalDeviceKey, SZ_VU_VREFRESH, 0, REG_DWORD, (PBYTE)&VRefresh, sizeof(VRefresh)) == ERROR_SUCCESS) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_123, VRefresh); } } // // Flags // cb = sizeof(Flags); if (RegQueryValueEx(hLogicalDeviceKey, SZ_VU_FLAGS, 0, NULL, (PBYTE)&Flags, &cb) == ERROR_SUCCESS) { if (RegSetValueEx(hInterfaceLogicalDeviceKey, SZ_VU_FLAGS, 0, REG_DWORD, (PBYTE)&Flags, sizeof(Flags)) == ERROR_SUCCESS) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_124, Flags); } } } // // Migrate the hardware acceleration and the pruning mode // MigrateDeviceKeySettings(hDevInfo, pDevInfoData, hLogicalDeviceKey, LogicalDevice); RegCloseKey(hLogicalDeviceKey); RegCloseKey(hInterfaceLogicalDeviceKey); } RegCloseKey(hInterfaceKey); } VOID MigrateDeviceKeySettings( HDEVINFO hDevInfo, PSP_DEVINFO_DATA pDevInfoData, HKEY hLogicalDeviceKey, DWORD Index ) { HKEY hkPnP = (HKEY)INVALID_HANDLE_VALUE; HKEY hkDevice = (HKEY)INVALID_HANDLE_VALUE; LPTSTR pBuffer = NULL; DWORD dwSize, len, cb; DWORD HwAcceleration, PruningMode; // // Open the PnP key // hkPnP = SetupDiOpenDevRegKey(hDevInfo, pDevInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ); if (hkPnP == INVALID_HANDLE_VALUE) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_127, TEXT("SetupDiOpenDevRegKey")); goto Fallout; } // // Try to get the GUID from the PnP key // dwSize = 0; if (RegQueryValueEx(hkPnP, SZ_GUID, 0, NULL, NULL, &dwSize) != ERROR_SUCCESS) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_127, TEXT("RegQueryValueEx")); goto Fallout; } len = lstrlen(SZ_VIDEO_DEVICES); DWORD cbBuf = dwSize + (len + 6) * sizeof(TCHAR); pBuffer = (LPTSTR)LocalAlloc(LPTR, cbBuf); if (pBuffer == NULL) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_127, TEXT("LocalAlloc")); goto Fallout; } StringCbCopy(pBuffer, cbBuf, SZ_VIDEO_DEVICES); if (RegQueryValueEx(hkPnP, SZ_GUID, 0, NULL, (PBYTE)(pBuffer + len), &dwSize) != ERROR_SUCCESS) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_127, TEXT("RegQueryValueEx")); goto Fallout; } DWORD cchGUID = lstrlen(pBuffer); StringCbPrintf(pBuffer + cchGUID, cbBuf - (cchGUID * sizeof(TCHAR)), L"\\%04d", Index); if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, pBuffer, 0, KEY_WRITE, &hkDevice) != ERROR_SUCCESS) { DeskLogError(LogSevInformation, IDS_SETUPLOG_MSG_127, TEXT("RegOpenKeyEx")); hkDevice = (HKEY)INVALID_HANDLE_VALUE; goto Fallout; } // // Hardware acceleration // cb = sizeof(HwAcceleration); if (RegQueryValueEx(hLogicalDeviceKey, SZ_HW_ACCELERATION, 0, NULL, (PBYTE)&HwAcceleration, &cb) == ERROR_SUCCESS) { RegSetValueEx(hkDevice, SZ_HW_ACCELERATION, 0, REG_DWORD, (PBYTE)&HwAcceleration, sizeof(HwAcceleration)); } // // Pruning mode // cb = sizeof(PruningMode); if (RegQueryValueEx(hLogicalDeviceKey, SZ_PRUNNING_MODE, 0, NULL, (PBYTE)&PruningMode, &cb) == ERROR_SUCCESS) { RegSetValueEx(hkDevice, SZ_PRUNNING_MODE, 0, REG_DWORD, (PBYTE)&PruningMode, sizeof(PruningMode)); } Fallout: if (hkPnP != INVALID_HANDLE_VALUE) { RegCloseKey(hkPnP); } if (pBuffer != NULL) { LocalFree(pBuffer); } if (hkDevice != INVALID_HANDLE_VALUE) { RegCloseKey(hkDevice); } }