/****************************************************************************** * * (C) COPYRIGHT MICROSOFT CORP., 2000 * * TITLE: Portsel.cpp * * VERSION: 1.0 * * AUTHOR: KeisukeT * * DATE: 27 Mar, 2000 * * DESCRIPTION: * port selection page of WIA class installer. * * 1. Create CDevice object of selected device. * 2. Process INF of selected device thru CDevice. * 3. Get all Port's CreatFile name and Friendly name, store locally. * 4. Handle Port selection UI and set CreateFile name thru CDevice. * 5. Delele CDevice object if user re-select another device. * *******************************************************************************/ // // Precompiled header // #include "precomp.h" #pragma hdrstop // // Include // #include "portsel.h" #include #include // // Extern // extern HINSTANCE g_hDllInstance; // // Function // CPortSelectPage::CPortSelectPage(PINSTALLER_CONTEXT pInstallerContext) : CInstallWizardPage(pInstallerContext, IDD_DYNAWIZ_SELECT_NEXTPAGE) { // // Set link to previous/next page. This page should show up. // m_uPreviousPage = IDD_DYNAWIZ_SELECTDEV_PAGE; m_uNextPage = NameTheDevice; // // Initialize member. // m_hDevInfo = pInstallerContext->hDevInfo; m_pspDevInfoData = &(pInstallerContext->spDevInfoData); m_pInstallerContext = pInstallerContext; m_bPortEnumerated = FALSE; m_dwNumberOfPort = 0; m_dwCapabilities = 0; m_csConnection = BOTH; } CPortSelectPage::~CPortSelectPage() { } // CPortSelectPage::CPortSelectPage(PINSTALLER_CONTEXT pInstallerContext) BOOL CPortSelectPage::OnCommand( WORD wItem, WORD wNotifyCode, HWND hwndItem ) { LRESULT lResult; BOOL bRet; DebugTrace(TRACE_PROC_ENTER,(("CPortSelectPage::OnCommand: Enter... \r\n"))); // // Initialize local. // bRet = FALSE; lResult = 0; // // Dispatch message. // switch (wNotifyCode) { case LBN_SELCHANGE: { int ItemData = (int) SendMessage(hwndItem, LB_GETCURSEL, 0, 0); // // Check the existance of CDevice. // if(NULL == m_pCDevice){ DebugTrace(TRACE_ERROR,(("CPortSelectPage::OnCommand: CDevice doesn't exist yet.\r\n"))); bRet = TRUE; goto OnCommand_return; } if (ItemData >= 0) { LONG lPortIndex; lPortIndex = (LONG)SendMessage(hwndItem, LB_GETITEMDATA, ItemData, 0); if(ID_AUTO == lPortIndex){ // // This is "AUTO" port. // m_pCDevice->SetPort(AUTO); DebugTrace(TRACE_STATUS,(("CPortSelectPage::OnCommand: Setting portname to %ws.\r\n"), AUTO)); } else if (lPortIndex >= 0 ) { // // Set port name. // m_pCDevice->SetPort(m_csaPortName[lPortIndex]); DebugTrace(TRACE_STATUS,(("CPortSelectPage::OnCommand: Setting portname to %ws.\r\n"), m_csaPortName[lPortIndex])); } else { // if (lPortIndex >= 0 ) // // Shouldn't come here, id < -1. Use AUTO. // DebugTrace(TRACE_ERROR,(("CPortSelectPage::OnCommand: Got improper id(0x%x). Use AUTO.\r\n"), lPortIndex)); m_pCDevice->SetPort(AUTO); } // if (lPortIndex >= 0 ) bRet = TRUE; goto OnCommand_return; } // if (ItemData >= 0) } // case LBN_SELCHANGE: } // switch (wNotifyCode) OnCommand_return: DebugTrace(TRACE_PROC_LEAVE,(("CPortSelectPage::OnCommand: Leaving... Ret=0x%x.\r\n"), bRet)); return bRet; } BOOL CPortSelectPage::OnNotify( LPNMHDR lpnmh ) { DWORD Idx; DWORD dwPortSelectMode; BOOL bRet; DebugTrace(TRACE_PROC_ENTER,(("CPortSelectPage::OnNotify: Enter... \r\n"))); // // Initialize locals. // Idx = 0; dwPortSelectMode = 0; bRet = FALSE; if (lpnmh->code == PSN_SETACTIVE) { DebugTrace(TRACE_STATUS,(("CPortSelectPage::OnNotify: PSN_SETACTIVE.\r\n"))); // // Create CDevice object. // if(!CreateCDeviceObject()){ DebugTrace(TRACE_ERROR,(("CPortSelectPage::OnNotify: ERROR!! Unable to create CDeviceobject.\r\n"))); bRet = FALSE; goto OnNotify_return; } // // See if need to show port selection page. // dwPortSelectMode = m_pCDevice->GetPortSelectMode(); switch(dwPortSelectMode){ case PORTSELMODE_NORMAL: { // // Set proper message. // if(!SetDialogText(PortSelectMessage0)){ DebugTrace(TRACE_ERROR,(("CPortSelectPage::OnNotify: ERROR!! Unable to set dialog text.\r\n"))); } // if(!SetDialogText(PortSelectMessage0) // // Make all cotrol visible. // if(!ShowControl(TRUE)){ DebugTrace(TRACE_ERROR,(("CPortSelectPage::OnNotify: ERROR!! Port listbox can't be visible.\r\n"))); } // ShowControl(TRUE) // // Enumerate all Ports. // if(!EnumPort()){ DebugTrace(TRACE_ERROR,(("CPortSelectPage::OnNotify: ERROR!! Unable to enumerate ports.\r\n"))); bRet = FALSE; goto OnNotify_return; } // // Update port list. // UpdatePortList(); // // Focus the first item. // SendDlgItemMessage(m_hwnd, LocalPortList, LB_SETCURSEL, 0, 0); // // Store the current selection. // Idx = (DWORD)SendDlgItemMessage(m_hwnd, LocalPortList, LB_GETITEMDATA, 0, 0); if(ID_AUTO == Idx){ m_pCDevice->SetPort(AUTO); } else { m_pCDevice->SetPort(m_csaPortName[Idx]); } // // Let the default handler do its job. // bRet = FALSE; goto OnNotify_return; } // case PORTSELMODE_NORMAL: case PORTSELMODE_SKIP: { // // "PortSelect = no" specified. Set port to "AUTO" and skip to the next page. // m_pCDevice->SetPort(AUTO); SetWindowLongPtr(m_hwnd, DWLP_MSGRESULT, m_uNextPage); bRet = TRUE; goto OnNotify_return; } // case PORTSELMODE_SKIP: case PORTSELMODE_MESSAGE1:{ // // Set proper message. // if(!SetDialogText(PortSelectMessage1)){ DebugTrace(TRACE_ERROR,(("CPortSelectPage::OnNotify: ERROR!! Unable to set dialog text.\r\n"))); } // if(!SetDialogText(PortSelectMessage0) // // Make all cotrol invisible. // if(!ShowControl(FALSE)){ DebugTrace(TRACE_ERROR,(("CPortSelectPage::OnNotify: ERROR!! Port listbox can't be invisible.\r\n"))); } // if(!ShowControl(FALSE)) // // Set port name. // m_pCDevice->SetPort(AUTO); bRet = FALSE; goto OnNotify_return; } // case PORTSELMODE_MESSAGE1: default: DebugTrace(TRACE_ERROR,(("CPortSelectPage::OnNotify: ERROR!! undefined PortSelect mode(0x%x).\r\n"), dwPortSelectMode)); bRet = FALSE; goto OnNotify_return; } // switch(m_pCDevice->GetPortSelectMode()) } // if (lpnmh->code == PSN_SETACTIVE) if (lpnmh->code == PSN_KILLACTIVE){ if(!m_bNextButtonPushed){ // // It's getting back to DeviceSelection page. Delete craeted CDevice object. // delete m_pCDevice; m_pCDevice = NULL; m_pInstallerContext->pDevice = NULL; } // if(!m_bNextButtonPushed) } // if (lpnmh->code == PSN_KILLACTIVE) OnNotify_return: DebugTrace(TRACE_PROC_LEAVE,(("CPortSelectPage::OnNotify: Leaving... Ret=0x%x.\r\n"), bRet)); return bRet; } VOID CPortSelectPage::UpdatePortList( VOID ) { DWORD Idx; DebugTrace(TRACE_PROC_ENTER,(("CPortSelectPage::UpdatePortList: Enter... \r\n"))); // // Initialize local. // Idx = 0; // // Reset port list. // SendDlgItemMessage(m_hwnd, LocalPortList, LB_RESETCONTENT, 0, 0); // // Add "AUTO" port if capable. // if(m_dwCapabilities & STI_GENCAP_AUTO_PORTSELECT){ TCHAR szTemp[MAX_DESCRIPTION]; // // Load localized "Automatic Port Select" from resource. // LoadString(g_hDllInstance, AutoPortSelect, (TCHAR *)szTemp, sizeof(szTemp) / sizeof(TCHAR)); // // Add to the list with special index number. (ID_AUTO = -1) // AddItemToPortList(szTemp, ID_AUTO); } // if(dwCapabilities & STI_GENCAP_AUTO_PORTSELECT) // // Add all port FriendlyName to the list. // for(Idx = 0; Idx < m_dwNumberOfPort; Idx++){ AddItemToPortList(m_csaPortFriendlyName[Idx], Idx); } DebugTrace(TRACE_PROC_LEAVE,(("CPortSelectPage::UpdatePortList: Leaving... Ret=VOID.\r\n"))); } // CPortSelectPage::UpdatePortList() VOID CPortSelectPage::AddItemToPortList( LPTSTR szPortFriendlyName, DWORD Idx ) { LRESULT lResult; DebugTrace(TRACE_PROC_ENTER,(("CPortSelectPage::AddItemToPortList: Enter... \r\n"))); // // Initialize local. // lResult = LB_ERR; // // See if we can add this item to list. It depends on its ConnectionType. // if(_tcsstr((const TCHAR *)szPortFriendlyName, TEXT("COM"))) { // // This is Communications Port. // if(_tcsicmp(m_csConnection, PARALLEL)){ lResult = SendDlgItemMessage(m_hwnd, LocalPortList, LB_ADDSTRING, 0, (LPARAM)szPortFriendlyName); } else { lResult = LB_ERR; } } else if(_tcsstr((const TCHAR *)szPortFriendlyName, TEXT("LPT"))){ // // This is Printer Port. // if(_tcsicmp(m_csConnection, SERIAL)){ lResult = SendDlgItemMessage(m_hwnd, LocalPortList, LB_ADDSTRING, 0, (LPARAM)szPortFriendlyName); } else { lResult = LB_ERR; } } else { // // This is Unknown port. Add to the list anyway. // lResult = SendDlgItemMessage(m_hwnd, LocalPortList, LB_ADDSTRING, 0, (LPARAM)szPortFriendlyName); } // // If it has proper capability, add the item to the list. // if (lResult != LB_ERR) { SendDlgItemMessage(m_hwnd, LocalPortList, LB_SETITEMDATA, lResult, (LPARAM)Idx); } // if (lResult != LB_ERR) DebugTrace(TRACE_PROC_LEAVE,(("CPortSelectPage::AddItemToPortList: Leaving... Ret=VOID.\r\n"))); } // CPortSelectPage::AddItemToPortList() BOOL CPortSelectPage::EnumPort( VOID ) { BOOL bRet; GUID Guid; DWORD dwRequired; HDEVINFO hPortDevInfo; DWORD Idx; TCHAR szPortName[MAX_DESCRIPTION]; TCHAR szPortFriendlyName[MAX_DESCRIPTION]; DebugTrace(TRACE_PROC_ENTER,(("CPortSelectPage::EnumPort: Enter... \r\n"))); // // Initialize local. // bRet = FALSE; dwRequired = 0; Idx = 0; hPortDevInfo = NULL; memset(szPortName, 0, sizeof(szPortName)); memset(szPortFriendlyName, 0, sizeof(szPortFriendlyName)); // // If it's already enumerated, just return success. // if(m_bPortEnumerated){ bRet = TRUE; goto EnumPort_return; } // // Initialize Port CreateFile/Friendly Name string array. // m_dwNumberOfPort = 0; m_csaPortName.Cleanup(); m_csaPortFriendlyName.Cleanup(); // // Get GUID of port device. // if(!SetupDiClassGuidsFromName (PORTS, &Guid, sizeof(GUID), &dwRequired)){ DebugTrace(TRACE_ERROR,(("CPortSelectPage::EnumPort: ERROR!! SetupDiClassGuidsFromName Failed. Err=0x%lX\r\n"), GetLastError())); bRet = FALSE; goto EnumPort_return; } // // Get device info set of port devices. // hPortDevInfo = SetupDiGetClassDevs (&Guid, NULL, NULL, DIGCF_PRESENT | DIGCF_PROFILE); if (hPortDevInfo == INVALID_HANDLE_VALUE) { DebugTrace(TRACE_ERROR,(("CPortSelectPage::EnumPort: ERROR!! SetupDiGetClassDevs Failed. Err=0x%lX\r\n"), GetLastError())); bRet = FALSE; goto EnumPort_return; } // // Process all of device element listed in device info set. // for(Idx = 0; GetPortNamesFromIndex(hPortDevInfo, Idx, szPortName, szPortFriendlyName); Idx++){ // // Add valid Port CreateFile/Friendly Name to array. // if( (0 == lstrlen(szPortName)) || (0 == lstrlen(szPortFriendlyName)) ) { DebugTrace(TRACE_ERROR,(("CPortSelectPage::EnumPort: ERROR!! Invalid Port/Friendly Name.\r\n"))); szPortName[0] = TEXT('\0'); szPortFriendlyName[0] = TEXT('\0'); continue; } DebugTrace(TRACE_STATUS,(("CPortSelectPage::EnumPort: Found Port %d: %ws(%ws).\r\n"), Idx, szPortName, szPortFriendlyName)); m_dwNumberOfPort++; m_csaPortName.Add(szPortName); m_csaPortFriendlyName.Add(szPortFriendlyName); szPortName[0] = TEXT('\0'); szPortFriendlyName[0] = TEXT('\0'); } // for(Idx = 0; GetPortNamesFromIndex(hPortDevInfo, Idx, szPortName, szPortFriendlyName); Idx++) // // Operation succeeded. // bRet = TRUE; m_bPortEnumerated = TRUE; EnumPort_return: // // Cleanup // if(IS_VALID_HANDLE(hPortDevInfo)){ SetupDiDestroyDeviceInfoList(hPortDevInfo); hPortDevInfo = INVALID_HANDLE_VALUE; } DebugTrace(TRACE_PROC_LEAVE,(("CPortSelectPage::EnumPort: Leaving... Ret=0x%x.\r\n"), bRet)); return bRet; } // CPortSelectPage::EnumPort() BOOL CPortSelectPage::CreateCDeviceObject( VOID ) { BOOL bRet; DebugTrace(TRACE_PROC_ENTER,(("CPortSelectPage::CreateCDeviceObject: Enter... \r\n"))); // // Initialize local. // bRet = FALSE; // // If CDevice already exists, see if we can reuse it. // if(NULL != m_pCDevice){ SP_DEVINFO_DATA spDevInfoData; memset(&spDevInfoData, 0, sizeof(SP_DEVINFO_DATA)); spDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA); if(!SetupDiGetSelectedDevice(m_hDevInfo, &spDevInfoData)){ DebugTrace(TRACE_ERROR,(("CPortSelectPage::CreateCDeviceObject: ERROR!! Can't get selected device element. Err=0x%x\n"), GetLastError())); bRet = FALSE; goto CreateCDeviceObject_return; } if(!(m_pCDevice->IsSameDevice(m_hDevInfo, &spDevInfoData))){ // // User changed selected device. Delete the object. // delete m_pCDevice; m_pCDevice = NULL; m_pInstallerContext->pDevice = NULL; m_csConnection = BOTH; m_dwCapabilities = NULL; } // if(!(m_pCDevice->IsSameDevice(m_hDevInfo, &spDevInfoData))) } // if(NULL != m_pCDevice) // // Create CDevice object here if it doesn't exist. // if(NULL == m_pCDevice){ // // Get selected device. // memset(m_pspDevInfoData, 0, sizeof(SP_DEVINFO_DATA)); m_pspDevInfoData->cbSize = sizeof(SP_DEVINFO_DATA); if(!SetupDiGetSelectedDevice(m_hDevInfo, m_pspDevInfoData)){ DebugTrace(TRACE_ERROR,(("CPortSelectPage::CreateCDeviceObject: ERROR!! Can't get selected device element. Err=0x%x\n"), GetLastError())); bRet = FALSE; goto CreateCDeviceObject_return; } // // Create CDevice object for installing device. // m_pCDevice = new CDevice(m_hDevInfo, m_pspDevInfoData, FALSE); if(NULL == m_pCDevice){ DebugTrace(TRACE_ERROR,(("CPortSelectPage::CreateCDeviceObject: ERROR!! Can't create CDevice object.\r\n"))); bRet = FALSE; goto CreateCDeviceObject_return; } // if(NULL == m_pCDevice) // // Name default unique name. // if(!m_pCDevice->NameDefaultUniqueName()){ DebugTrace(TRACE_ERROR,(("CPortSelectPage::CreateCDeviceObject: ERROR!! Unable to get default name.\r\n"))); } // // Pre-process INF. // if(!m_pCDevice->PreprocessInf()){ DebugTrace(TRACE_ERROR,(("CPortSelectPage::CreateCDeviceObject: ERROR!! Unable to process INF.\r\n"))); } // // Save created CDevice object into installer context. // m_pInstallerContext->pDevice = (PVOID)m_pCDevice; // // Get ConnectionType/Capabilities. // m_dwCapabilities = m_pCDevice->GetCapabilities(); m_csConnection = m_pCDevice->GetConnection(); if(m_csConnection.IsEmpty()){ m_csConnection = BOTH; } // if(m_csConnection.IsEmpty()) } // if(NULL == m_pCDevice) // // Operation succeeded. // bRet = TRUE; CreateCDeviceObject_return: DebugTrace(TRACE_PROC_LEAVE,(("CPortSelectPage::CreateCDeviceObject: Leaving... Ret=0x%x.\r\n"), bRet)); return bRet; } // CPortSelectPage::CreateCDeviceObject() BOOL CPortSelectPage::SetDialogText( UINT uiMessageId ) { BOOL bRet; TCHAR szStringBuffer[MAX_STRING_LENGTH]; HWND hwndMessage; // // Initialize local. // bRet = FALSE; hwndMessage = (HWND)NULL; memset(szStringBuffer, 0, sizeof(szStringBuffer)); // // Load message string. // if(0 == LoadString(g_hDllInstance, uiMessageId, szStringBuffer, sizeof(szStringBuffer)/sizeof(TCHAR))) { // // Unable to load specified string. // bRet = FALSE; goto SetDialogText_return; } // if(0 == LoadString() // // Get window handle the control // hwndMessage = GetDlgItem(m_hwnd, IDC_PORTSEL_MESSAGE); // // Set loaded string to the dialog. // SetWindowText(hwndMessage, (LPCTSTR)szStringBuffer); bRet = TRUE; SetDialogText_return: return bRet; } // CPortSelectPage::SetDialogText() BOOL CPortSelectPage::ShowControl( BOOL bShow ) { BOOL bRet; HWND hwndString; HWND hwndListBox; int nCmdShow; // // Initialize local. // bRet = FALSE; hwndString = (HWND)NULL; hwndListBox = (HWND)NULL; if(bShow){ nCmdShow = SW_SHOW; } else { nCmdShow = SW_HIDE; } // // Get window handle the control // hwndString = GetDlgItem(m_hwnd, IDC_PORTSEL_AVAILABLEPORTS); hwndListBox = GetDlgItem(m_hwnd, LocalPortList); // // Make them in/visible. // if(NULL != hwndString){ ShowWindow(hwndString, nCmdShow); } // if(NULL != hwndString) if(NULL != hwndListBox){ ShowWindow(hwndListBox, nCmdShow); } // if(NULL != hwndListBox) bRet = TRUE; // ShowControl_return: return bRet; } // CPortSelectPage::ShowControl() BOOL GetDevinfoFromPortName( LPTSTR szPortName, HDEVINFO *phDevInfo, PSP_DEVINFO_DATA pspDevInfoData ) { BOOL bRet; BOOL bFound; HDEVINFO hPortDevInfo; SP_DEVINFO_DATA spDevInfoData; GUID Guid; DWORD dwRequired; DWORD Idx; TCHAR szTempPortName[MAX_DESCRIPTION]; TCHAR szPortFriendlyName[MAX_DESCRIPTION]; DebugTrace(TRACE_PROC_ENTER,(("GetDevinfoFromPortName: Enter... \r\n"))); // // Initialize local. // bRet = FALSE; bFound = FALSE; hPortDevInfo = INVALID_HANDLE_VALUE; dwRequired = 0; memset(&spDevInfoData, 0, sizeof(spDevInfoData)); memset(szTempPortName, 0, sizeof(szTempPortName)); memset(szPortFriendlyName, 0, sizeof(szPortFriendlyName)); // // Get GUID of port device. // if(!SetupDiClassGuidsFromName (PORTS, &Guid, sizeof(GUID), &dwRequired)){ DebugTrace(TRACE_ERROR,(("GetDevinfoFromPortName: ERROR!! SetupDiClassGuidsFromName Failed. Err=0x%lX\r\n"), GetLastError())); goto GetDevinfoFromPortName_return; } // // Get device info set of port devices. // hPortDevInfo = SetupDiGetClassDevs (&Guid, NULL, NULL, DIGCF_PRESENT | DIGCF_PROFILE); if (hPortDevInfo == INVALID_HANDLE_VALUE) { DebugTrace(TRACE_ERROR,(("GetDevinfoFromPortName: ERROR!! SetupDiGetClassDevs Failed. Err=0x%lX\r\n"), GetLastError())); goto GetDevinfoFromPortName_return; } // // If portname is AUTO, use the first port no matter what it is. // if(0 == _tcsicmp(szPortName, AUTO)){ DebugTrace(TRACE_STATUS,(("GetDevinfoFromPortName: Portname is AUTO. The first port found will be returned,\r\n"))); Idx = 0; bFound = TRUE; goto GetDevinfoFromPortName_return; } // if(0 == _tcsicmp(szPortName, AUTO)) // // Enum all ports and find specified port. // for(Idx = 0; GetPortNamesFromIndex(hPortDevInfo, Idx, szTempPortName, szPortFriendlyName); Idx++){ // // Find specified portname.. // if( (0 == lstrlen(szTempPortName)) || (0 == lstrlen(szPortFriendlyName)) ) { DebugTrace(TRACE_ERROR,(("GetDevinfoFromPortName: ERROR!! Invalid Port/Friendly Name.\r\n"))); szTempPortName[0] = TEXT('\0'); szPortFriendlyName[0] = TEXT('\0'); continue; } DebugTrace(TRACE_STATUS,(("GetDevinfoFromPortName: Found Port %d: %ws(%ws). Comparing w/ %ws\r\n"), Idx, szTempPortName, szPortFriendlyName, szPortName)); if(0 == _tcsicmp(szPortName, szTempPortName)){ // // Specified portname found. // bFound = TRUE; break; } szTempPortName[0] = TEXT('\0'); szPortFriendlyName[0] = TEXT('\0'); } // for(Idx = 0; GetPortNamesFromIndex(hPortDevInfo, Idx, szPortName, szPortFriendlyName); Idx++) GetDevinfoFromPortName_return: if(FALSE == bFound){ if(INVALID_HANDLE_VALUE != hPortDevInfo){ SetupDiDestroyDeviceInfoList(hPortDevInfo); } *phDevInfo = NULL; } else { *phDevInfo = hPortDevInfo; pspDevInfoData->cbSize = sizeof (SP_DEVINFO_DATA); if(!SetupDiEnumDeviceInfo(hPortDevInfo, Idx, pspDevInfoData)){ DebugTrace(TRACE_ERROR,(("GetDevinfoFromPortName: Unable to get specified devnode. Err=0x%x\n"), GetLastError())); } //if(!SetupDiEnumDeviceInfo(hDevInfo, Idx, pspDevInfoData)) } // if(FALSE == bFound) bRet = bFound; DebugTrace(TRACE_PROC_LEAVE,(("GetDevinfoFromPortName: Leaving... Ret=0x%x.\r\n"), bRet)); return bRet; } // GetDevinfoFromPortName() BOOL GetPortNamesFromIndex( HDEVINFO hPortDevInfo, DWORD dwPortIndex, LPTSTR szPortName, LPTSTR szPortFriendlyName ) { HKEY hkPort; SP_DEVINFO_DATA spDevInfoData; DWORD dwSize; BOOL bRet; DebugTrace(TRACE_PROC_ENTER,(("GetPortNamesFromIndex: Enter... \r\n"))); // // Initialize local. // hkPort = NULL; dwSize = 0; bRet = TRUE; memset(&spDevInfoData, 0, sizeof(spDevInfoData)); // // Get specified device info data. // spDevInfoData.cbSize = sizeof (SP_DEVINFO_DATA); if (!SetupDiEnumDeviceInfo (hPortDevInfo, dwPortIndex, &spDevInfoData)) { DWORD dwError; dwError = GetLastError(); if(ERROR_NO_MORE_ITEMS == dwError){ DebugTrace(TRACE_STATUS,(("GetPortNamesFromIndex: Hits end of enumeration. Index=0x%x.\r\n"), dwPortIndex)); } else { DebugTrace(TRACE_ERROR,(("GetPortNamesFromIndex: ERROR!! SetupDiEnumDeviceInfo() failed. Err=0x%x\n"), dwError)); } bRet = FALSE; goto GetPortNamesFromIndex_return; } // // Open port device registry. // hkPort = SetupDiOpenDevRegKey (hPortDevInfo, &spDevInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ); if (hkPort == INVALID_HANDLE_VALUE) { DebugTrace(TRACE_ERROR,(("GetPortNamesFromIndex: SetupDiOpenDevRegKey() failed.Err=0x%x\n"), GetLastError())); goto GetPortNamesFromIndex_return; } // // Get portname from device key. // if(!GetStringFromRegistry(hkPort, PORTNAME, szPortName)){ DebugTrace(TRACE_ERROR,(("GetPortNamesFromIndex: Can't get portname from registry.\r\n"))); goto GetPortNamesFromIndex_return; } // // Get port FriendlyName from registry. // if (!SetupDiGetDeviceRegistryProperty (hPortDevInfo, &spDevInfoData, SPDRP_FRIENDLYNAME, NULL, (LPBYTE)szPortFriendlyName, MAX_DESCRIPTION, NULL) ) { DebugTrace(TRACE_ERROR,(("GetPortNamesFromIndex: SetupDiGetDeviceRegistryProperty() failed. Err=0x%x\n"), GetLastError())); goto GetPortNamesFromIndex_return; } // if (SetupDiGetDeviceRegistryProperty()) // // Operation succeeded. // bRet = TRUE; GetPortNamesFromIndex_return: // // Clean up. // if(NULL != hkPort){ RegCloseKey(hkPort); } DebugTrace(TRACE_PROC_LEAVE,(("GetPortNamesFromIndex: Leaving... Ret=0x%x.\r\n"), bRet)); return bRet; } // CPortSelectPage::GetPortNamesFromIndex()