//--------------------------------------------------------------------------- // // Copyright (c) Microsoft Corporation 1993-1994 // // File: util.c // // This files contains all common utility routines // // History: // 12-23-93 ScottH Created // 09-22-95 ScottH Ported to NT // //--------------------------------------------------------------------------- #include "proj.h" // common headers //----------------------------------------------------------------------------------- // //----------------------------------------------------------------------------------- /*---------------------------------------------------------- Purpose: Enumerates the HKEY_LOCAL_MACHINE branch and finds the device matching the given class and value. If there are duplicate devices that match both criteria, only the first device is returned. Returns TRUE if the device was found. Returns: see above Cond: -- */ BOOL PRIVATE FindDev_Find( IN LPFINDDEV pfinddev, IN LPGUID pguidClass, IN LPCTSTR pszValueName, IN LPCTSTR pszValue) { BOOL bRet = FALSE; TCHAR szKey[MAX_BUF]; TCHAR szName[MAX_BUF]; HDEVINFO hdi; DWORD dwRW = KEY_READ; ASSERT(pfinddev); ASSERT(pguidClass); ASSERT(pszValueName); ASSERT(pszValue); if (USER_IS_ADMIN()) dwRW |= KEY_WRITE; hdi = CplDiGetClassDevs(pguidClass, NULL, NULL, 0); if (INVALID_HANDLE_VALUE != hdi) { SP_DEVINFO_DATA devData; DWORD iIndex = 0; HKEY hkey; // Look for the modem that has the matching value devData.cbSize = sizeof(devData); while (CplDiEnumDeviceInfo(hdi, iIndex, &devData)) { hkey = CplDiOpenDevRegKey(hdi, &devData, DICS_FLAG_GLOBAL, 0, DIREG_DRV, dwRW); if (INVALID_HANDLE_VALUE != hkey) { // Does the value match? DWORD cbData = sizeof(szName); if (NO_ERROR == RegQueryValueEx(hkey, pszValueName, NULL, NULL, (LPBYTE)szName, &cbData) && IsSzEqual(pszValue, szName)) { // Yes pfinddev->hkeyDrv = hkey; pfinddev->hdi = hdi; BltByte(&pfinddev->devData, &devData, sizeof(devData)); // Don't close the driver key or free the DeviceInfoSet, // but exit bRet = TRUE; break; } RegCloseKey(hkey); } iIndex++; } // Free the DeviceInfoSet if nothing was found. Otherwise, we will // retain these handles so the caller can make use of this. if ( !bRet ) { CplDiDestroyDeviceInfoList(hdi); } } return bRet; } /*---------------------------------------------------------- Purpose: Creates a FINDDEV structure given the device class, and a valuename and its value. Returns: TRUE if the device is found in the system Cond: -- */ BOOL PUBLIC FindDev_Create( OUT LPFINDDEV FAR * ppfinddev, IN LPGUID pguidClass, IN LPCTSTR pszValueName, IN LPCTSTR pszValue) { BOOL bRet; LPFINDDEV pfinddev; DEBUG_CODE( TRACE_MSG(TF_FUNC, " > FindDev_Create(....%s, %s, ...)", Dbg_SafeStr(pszValueName), Dbg_SafeStr(pszValue)); ) ASSERT(ppfinddev); ASSERT(pguidClass); ASSERT(pszValueName); ASSERT(pszValue); pfinddev = (LPFINDDEV)LocalAlloc(LPTR, sizeof(*pfinddev)); if (NULL == pfinddev) { bRet = FALSE; } else { bRet = FindDev_Find(pfinddev, pguidClass, pszValueName, pszValue); if (FALSE == bRet) { // Didn't find anything FindDev_Destroy(pfinddev); pfinddev = NULL; } } *ppfinddev = pfinddev; DBG_EXIT_BOOL(FindDev_Create, bRet); return bRet; } /*---------------------------------------------------------- Purpose: Destroys a FINDDEV structure Returns: TRUE on success Cond: -- */ BOOL PUBLIC FindDev_Destroy( IN LPFINDDEV this) { BOOL bRet; if (NULL == this) { bRet = FALSE; } else { if (this->hkeyDrv) RegCloseKey(this->hkeyDrv); if (this->hdi && INVALID_HANDLE_VALUE != this->hdi) CplDiDestroyDeviceInfoList(this->hdi); LocalFreePtr(this); bRet = TRUE; } return bRet; } /*---------------------------------------------------------- Purpose: Return the appropriate text and background COLORREFs given the DRAWITEMSTRUCT. Returns: -- Cond: -- */ void PUBLIC TextAndBkCr( const DRAWITEMSTRUCT FAR * lpcdis, COLORREF FAR * pcrText, COLORREF FAR * pcrBk) { #define CR_DARK_GRAY RGB(128, 128, 128) UINT nState; ASSERT(lpcdis); ASSERT(pcrText); ASSERT(pcrBk); nState = lpcdis->itemState; switch (lpcdis->CtlType) { case ODT_STATIC: if (IsFlagSet(nState, ODS_DISABLED)) { *pcrText = GetSysColor(COLOR_GRAYTEXT); *pcrBk = GetSysColor(COLOR_3DFACE); } else { *pcrText = GetSysColor(COLOR_WINDOWTEXT); *pcrBk = GetSysColor(COLOR_3DFACE); } break; case ODT_LISTBOX: case ODT_COMBOBOX: if (IsFlagSet(nState, ODS_SELECTED)) { *pcrText = GetSysColor(COLOR_HIGHLIGHTTEXT); *pcrBk = GetSysColor(COLOR_HIGHLIGHT); } else if (IsFlagSet(nState, ODS_DISABLED)) { *pcrText = GetSysColor(COLOR_GRAYTEXT); *pcrBk = GetSysColor(COLOR_3DFACE); } else { *pcrText = GetSysColor(COLOR_WINDOWTEXT); *pcrBk = GetSysColor(COLOR_WINDOW); } break; case ODT_MENU: if (IsFlagSet(nState, ODS_SELECTED)) { *pcrText = GetSysColor(COLOR_HIGHLIGHTTEXT); *pcrBk = GetSysColor(COLOR_HIGHLIGHT); } else { *pcrText = GetSysColor(COLOR_MENUTEXT); *pcrBk = GetSysColor(COLOR_MENU); } break; default: ASSERT(0); break; } } //----------------------------------------------------------------------------------- // Debug functions //----------------------------------------------------------------------------------- #ifdef DEBUG #pragma data_seg(DATASEG_READONLY) #ifdef WIN95 struct _RETERRMAP { RETERR ret; LPCTSTR psz; } const c_rgreterrmap[] = { { NO_ERROR, "NO_ERROR" }, { DI_ERROR, "DI_ERROR" }, { ERR_DI_INVALID_DEVICE_ID, "ERR_DI_INVALID_DEVICE_ID" }, { ERR_DI_INVALID_COMPATIBLE_DEVICE_LIST, "ERR_DI_INVALID_COMPATIBLE_DEVICE_LIST" }, { ERR_DI_REG_API, "ERR_DI_REG_API" }, { ERR_DI_LOW_MEM, "ERR_DI_LOW_MEM" }, { ERR_DI_BAD_DEV_INFO, "ERR_DI_BAD_DEV_INFO" }, { ERR_DI_INVALID_CLASS_INSTALLER, "ERR_DI_INVALID_CLASS_INSTALLER" }, { ERR_DI_DO_DEFAULT, "ERR_DI_DO_DEFAULT" }, { ERR_DI_USER_CANCEL, "ERR_DI_USER_CANCEL" }, { ERR_DI_NOFILECOPY, "ERR_DI_NOFILECOPY" }, { ERR_DI_BAD_CLASS_INFO, "ERR_DI_BAD_CLASS_INFO" }, }; #endif #pragma data_seg() #ifdef WIN95 /*---------------------------------------------------------- Purpose: Returns the string form of a RETERR. Returns: String ptr Cond: -- */ LPCTSTR PUBLIC Dbg_GetReterr( RETERR ret) { int i; for (i = 0; i < ARRAY_ELEMENTS(c_rgreterrmap); i++) { if (ret == c_rgreterrmap[i].ret) return c_rgreterrmap[i].psz; } return "Unknown RETERR"; } #endif // WIN95 #endif // DEBUG