// ---------------------------------------------------------------------- // // Microsoft Windows NT // Copyright (C) Microsoft Corporation, 1997. // // File: I N F M A P . C P P // // Contents: Functions that work on netmap.inf file. // // Notes: // // Author: kumarp 22-December-97 // // ---------------------------------------------------------------------- #include "pch.h" #pragma hdrstop #include "infmap.h" #include "kkcwinf.h" #include "kkutils.h" #include "ncreg.h" #include "ncsetup.h" #include "netupgrd.h" #include "nustrs.h" #include "nuutils.h" #include "oemupg.h" extern const WCHAR c_szNetUpgradeDll[]; // ----------------------------------------------------------------- // Structure of netmap.inf file // // We use netmap.inf file to map pre-NT5 InfID of a netcard to its // NT5 InfID (PnPID). // // This file has a number of top-level sections. // Each top-level section holds entries for mapping netcards of a particular // bus type. the format of each line is // // = // OR // =, // // the former is a 1-1 mapping while the latter offers a way to map a single // preNT5 InfID to multiple InfIDs // // Mapping method 0 // ---------------- // This method is used when a single pre-NT5 InfID represents more than one // net card which means that a single pre-NT5 InfID is mapped onto many // NT5 PnPIDs. The only way to differentiate between the different types of // net cards is to inspect a single value under the parameters key. // // In this mapping method, two keys are required to be specified for // each net card. // - ValueName: this specifies the value to be inspected under the Parameters key // - ValueType: this specifies the type of ValueName // // there can be any number of additional keys in this section. // each such line is of the form // = // // we first find out the value of ValueName // then we enumerate each key in this section to see if the value matches the // value of any of the keys. // if we find a match, then the name of the found key represents // // e.g. // 5 flavors of the ELNK3MCA card are represented by the same InfID in NT4 // the only way to distinguish between them is to inspect the McaPosId value // for this card we have the mapping section defined as follows: // // [McaAdapters] // ELNK3MCA = 0,ELNK3MCA ; 0 --> mapping method 0 // ... other mca card entries ... // // [ELNK3MCA] // ValueName= McaPosId // ValueType= 4 ; REG_DWORD // mca_627c = 0x0000627c ; if value of McaPosId is 0x627c then PnPID == mca_627c // mca_627d = 0x0000627d // mca_61db = 0x000061db // mca_62f6 = 0x000062f6 // mca_62f7 = 0x000062f7 // // Note: a special keyword "ValueNotPresent" can be used to make a mapping // for the case when a value is not present. // List of sections that can appear in the netmap.inf // const WCHAR c_szIsaAdapters[] = L"IsaAdapters"; const WCHAR c_szEisaAdapters[] = L"EisaAdapters"; const WCHAR c_szPciAdapters[] = L"PciAdapters"; const WCHAR c_szMcaAdapters[] = L"McaAdapters"; const WCHAR c_szPcmciaAdapters[] = L"PcmciaAdapters"; const WCHAR c_szOemNetAdapters[] = L"OemNetAdapters"; const WCHAR c_szAsyncAdapters[] = L"AsyncAdapters"; const WCHAR c_szOemAsyncAdapters[] = L"OemAsyncAdapters"; static PCWSTR g_aszInfMapNetCardSections[] = { c_szIsaAdapters, c_szEisaAdapters, c_szPciAdapters, c_szMcaAdapters, c_szPcmciaAdapters, c_szOemNetAdapters, c_szAsyncAdapters, c_szOemAsyncAdapters }; const BYTE g_cNumNetCardSections = celems(g_aszInfMapNetCardSections); const WCHAR c_szNetProtocols[] = L"NetProtocols"; const WCHAR c_szOemNetProtocols[] = L"OemNetProtocols"; const WCHAR c_szNetServices[] = L"NetServices"; const WCHAR c_szOemNetServices[] = L"OemNetServices"; const WCHAR c_szNetClients[] = L"NetClients"; const WCHAR c_szOemNetClients[] = L"OemNetClients"; const WCHAR c_szOemUpgradeSupport[] = L"OemUpgradeSupport"; // value in netmap.inf indicating the absence of a value in the registry // const WCHAR c_szValueNotPresent[] = L"ValueNotPresent"; // ---------------------------------------------------------------------- // prototypes // HRESULT HrMapPreNT5InfIdToNT5InfIdInSection(IN HINF hinf, IN HKEY hkeyAdapterParams, IN PCWSTR pszSectionName, IN PCWSTR pszPreNT5InfId, OUT tstring* pstrNT5InfId, OUT BOOL* pfOemComponent); HRESULT HrMapPreNT5InfIdToNT5InfIdUsingMethod0(IN HKEY hkeyAdapterParams, IN HINF hInf, IN PCWSTR pszAdapterSection, OUT tstring* pstrNT5InfId); HRESULT HrSetupFindKeyWithStringValue(IN HINF hInf, IN PCWSTR pszSection, IN PCWSTR pszValue, OUT tstring* pstrKey); // ---------------------------------------------------------------------- #pragma BEGIN_CONST_SECTION const WCHAR c_szNetMapInf[] = L"netmap.inf"; const WCHAR c_szKeyValueName[] = L"ValueName"; const WCHAR c_szKeyValueType[] = L"ValueType"; const WCHAR c_szInfId_MS_ATMUNI[] = L"MS_ATMUNI"; const WCHAR c_szInfId_MS_ATMARPS[] = L"MS_ATMARPS"; #pragma END_CONST_SECTION //+--------------------------------------------------------------------------- // // Function: HrMapPreNT5NetCardInfIdInInf // // Purpose: Maps using hinf, pre-NT5 InfID of a net card to its NT5 equivalent // // Arguments: // hinf [in] handle of netmap.inf file // hkeyAdapterParams [in] handle to Parameters key under the netcard driver key // pszPreNT5InfId [in] pre-NT5 InfID // pstrNT5InfId [out] NT5 InfID // pstrAdapterType [out] section in which the map was found // pfOemComponent [out] set to TRUE if it is an OEM card // // Returns: S_OK if found, S_FALSE if not, // otherwise HRESULT_FROM_WIN32 error code. // // Author: kumarp 24-July-97 // // Notes: // HRESULT HrMapPreNT5NetCardInfIdInInf(IN HINF hinf, IN HKEY hkeyAdapterParams, IN PCWSTR pszPreNT5InfId, OUT tstring* pstrNT5InfId, OUT tstring* pstrAdapterType, OUT BOOL* pfOemComponent) { DefineFunctionName("HrMapPreNT5InfIdToNT5InfId"); Assert(hinf); Assert(hkeyAdapterParams); AssertValidReadPtr(pszPreNT5InfId); AssertValidWritePtr(pstrNT5InfId); AssertValidWritePtr(pfOemComponent); HRESULT hr=S_FALSE; PCWSTR pszSectionName; for (int iSection=0; iSection < g_cNumNetCardSections; iSection++) { pszSectionName = g_aszInfMapNetCardSections[iSection]; hr = HrMapPreNT5InfIdToNT5InfIdInSection(hinf, hkeyAdapterParams, pszSectionName, pszPreNT5InfId, pstrNT5InfId, pfOemComponent); if (hr == S_OK) { if (pstrAdapterType) { *pstrAdapterType = pszSectionName; } if (!lstrcmpiW(pszSectionName, c_szOemNetAdapters) || !lstrcmpiW(pszSectionName, c_szAsyncAdapters) || !lstrcmpiW(pszSectionName, c_szOemAsyncAdapters)) { *pfOemComponent = TRUE; } else { *pfOemComponent = FALSE; } break; } } TraceErrorOptional(__FUNCNAME__, hr, (hr == S_FALSE)); return hr; } //+--------------------------------------------------------------------------- // // Function: HrMapPreNT5NetCardInfIdToNT5InfId // // Purpose: Maps pre-NT5 InfID of a net card to its NT5 equivalent // // Arguments: // hkeyAdapterParams [in] handle to Parameters key under the netcard driver key // pszPreNT5InfId [in] pre-NT5 InfID // pstrNT5InfId [out] NT5 InfID // pstrAdapterType [out] section in which the map was found // pfOemComponent [out] set to TRUE if it is an OEM card // ppnmi [out] CNetMapInfo object representing the map found // // Returns: S_OK if found, S_FALSE if not, // otherwise HRESULT_FROM_WIN32 error code. // // Author: kumarp 24-July-97 // // Notes: // HRESULT HrMapPreNT5NetCardInfIdToNT5InfId(IN HKEY hkeyAdapterParams, IN PCWSTR pszPreNT5InfId, OUT tstring* pstrNT5InfId, OUT tstring* pstrAdapterType, OUT BOOL* pfOemComponent, OUT CNetMapInfo** ppnmi) { DefineFunctionName("HrMapPreNT5NetCardInfIdToNT5InfId"); Assert(hkeyAdapterParams); AssertValidReadPtr(pszPreNT5InfId); AssertValidWritePtr(pstrNT5InfId); AssertValidWritePtr(pstrAdapterType); AssertValidWritePtr(pfOemComponent); AssertValidReadPtr(g_pnmaNetMap); HRESULT hr=E_FAIL; TraceTag(ttidNetUpgrade, "finding mapping for %S...", pszPreNT5InfId); if (g_pnmaNetMap) { CNetMapInfo* pnmi; size_t cNumNetMapEntries = g_pnmaNetMap->size(); for (size_t i = 0; i < cNumNetMapEntries; i++) { pnmi = (CNetMapInfo*) (*g_pnmaNetMap)[i]; hr = HrMapPreNT5NetCardInfIdInInf(pnmi->m_hinfNetMap, hkeyAdapterParams, pszPreNT5InfId, pstrNT5InfId, pstrAdapterType, pfOemComponent); if (S_OK == hr) { if (ppnmi) { *ppnmi = pnmi; } TraceTag(ttidNetUpgrade, "%s: %S --> %S (type: %S)", __FUNCNAME__, pszPreNT5InfId, pstrNT5InfId->c_str(), pstrAdapterType->c_str()); break; } } } TraceErrorOptional(__FUNCNAME__, hr, (hr == S_FALSE)); return hr; } //+--------------------------------------------------------------------------- // // Function: HrMapPreNT5InfIdToNT5InfIdInSection // // Purpose: Searches in szSectionName section to // map pre-NT5 InfID of a net card to its NT5 equivalent // // Arguments: // hinf [in] handle of netmap.inf file // hkeyAdapterParams [in] handle to Parameters key under the netcard driver key // pszSectionName [in] name of section to search // pszPreNT5InfId [in] pre-NT5 InfID // pstrNT5InfId [out] NT5 InfID // pfOemComponent [out] set to TRUE if it is an OEM card // // Returns: S_OK if found, S_FALSE if not, // otherwise HRESULT_FROM_WIN32 error code. // // Author: kumarp 24-July-97 // // Notes: // HRESULT HrMapPreNT5InfIdToNT5InfIdInSection(IN HINF hinf, IN HKEY hkeyAdapterParams, IN PCWSTR pszSectionName, IN PCWSTR pszPreNT5InfId, OUT tstring* pstrNT5InfId, OUT BOOL* pfOemComponent) { DefineFunctionName("HrMapPreNT5InfIdToNT5InfIdInSection"); Assert(hinf); AssertValidReadPtr(pszSectionName); AssertValidReadPtr(pszPreNT5InfId); AssertValidWritePtr(pstrNT5InfId); HRESULT hr=S_FALSE; INFCONTEXT ic; hr = HrSetupFindFirstLine(hinf, pszSectionName, pszPreNT5InfId, &ic); if (SUCCEEDED(hr)) { DWORD dwMappingMethod=-1; // key found, get value // we do not use the common function HrSetupGetIntField because it causes // tons of TraceError messages for 1-1 mapping where the first value // is not an integer if (::SetupGetIntField(&ic, 1, (int*) &dwMappingMethod)) { // value begins with a number --> this is a special case mapping // if (dwMappingMethod == 0) { // use mapping method 0 Assert(hkeyAdapterParams); tstring strAdapterSection; hr = HrSetupGetStringField(ic, 2, &strAdapterSection); if (S_OK == hr) { hr = HrMapPreNT5InfIdToNT5InfIdUsingMethod0(hkeyAdapterParams, hinf, strAdapterSection.c_str(), pstrNT5InfId); } } else { // currently we support only mapping-method 0 // hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA); } } else { // the first field was not an integer which means // this is a straight forward (1 to 1) mapping // hr = HrSetupGetStringField(ic, 1, pstrNT5InfId); } } if (HRESULT_FROM_SETUPAPI(ERROR_LINE_NOT_FOUND) == hr) { hr = S_FALSE; } TraceErrorOptional(__FUNCNAME__, hr, (hr == S_FALSE)); return hr; } //+--------------------------------------------------------------------------- // // Function: HrMapPreNT5InfIdToNT5InfIdUsingMethod0 // // Purpose: map pre-NT5 InfID of a net card to its NT5 equivalent // using mapping method 0 // // Arguments: // hkeyAdapterParams [in] handle to Parameters key under the netcard driver key // hInf [in] handle of netmap.inf // pszSectionName [in] name of section to search // pstrNT5InfId [out] NT5 InfID // // Returns: S_OK if found, S_FALSE if not, otherwise HRESULT_FROM_WIN32 error code. // // Author: kumarp 24-July-97 // // Notes: // // Mapping method 0 // ---------------- // This method is used when a single pre-NT5 InfID represents more than one // net card which means that a single pre-NT5 InfID is mapped onto many // NT5 PnPIDs. The only way to differentiate between the different types of // net cards is to inspect a single value under the parameters key. // // In this mapping method, two keys are required to be specified for // each net card. // - ValueName: this specifies the value to be inspected under the Parameters key // - ValueType: this specifies the type of ValueName // // there can be any number of additional keys in this section. // each such line is of the form // = // // we first find out the value of ValueName // then we enumerate each key in this section to see if the value matches the // value of any of the keys. // if we find a match, then the name of the found key represents // // e.g. // 5 flavors of the ELNK3MCA card are represented by the same InfID in NT4 // the only way to distinguish between them is to inspect the McaPosId value // for this card we have the mapping section defined as follows: // // [McaAdapters] // ELNK3MCA = 0,ELNK3MCA ; 0 --> mapping method 0 // ... other mca card entries ... // // [ELNK3MCA] // ValueName= McaPosId // ValueType= 4 ; REG_DWORD // mca_627c = 0x0000627c ; if value of McaPosId is 0x627c then PnPID == mca_627c // mca_627d = 0x0000627d // mca_61db = 0x000061db // mca_62f6 = 0x000062f6 // mca_62f7 = 0x000062f7 // // Note: a special keyword "ValueNotPresent" can be used to make a mapping // for the case when a value is not present. // HRESULT HrMapPreNT5InfIdToNT5InfIdUsingMethod0(IN HKEY hkeyAdapterParams, IN HINF hInf, IN PCWSTR pszAdapterSection, OUT tstring* pstrNT5InfId) { DefineFunctionName("HrMapPreNT5InfIdToNT5InfIdUsingMethod0"); Assert(hkeyAdapterParams); Assert(hInf); AssertValidReadPtr(pszAdapterSection); AssertValidWritePtr(pstrNT5InfId); HRESULT hr=S_FALSE; INFCONTEXT ic; tstring strValueName; // get ValueName hr = HrSetupGetFirstString(hInf, pszAdapterSection, c_szKeyValueName, &strValueName); if (SUCCEEDED(hr)) { DWORD dwRegValue=0; DWORD dwInfValue=0; DWORD dwValueType; tstring strRegValue; tstring strInfValue; tstring strValue; // get ValueType hr = HrSetupGetFirstDword(hInf, pszAdapterSection, c_szKeyValueType, &dwValueType); if (SUCCEEDED(hr)) { switch (dwValueType) { case REG_DWORD: // find the value in under adapter driver parameters key // hr = HrRegQueryDword(hkeyAdapterParams, strValueName.c_str(), &dwRegValue); if (SUCCEEDED(hr)) { // goto the ValueType line hr = HrSetupFindFirstLine(hInf, pszAdapterSection, c_szKeyValueType, &ic); if (S_OK == hr) { // move the context from the ValueType line to // the next line, where values begin hr = HrSetupFindNextLine(ic, &ic); } while (S_OK == hr) { // now enumerate over all keys in this section and // try to locate the key with dwRegValue in the infmap hr = HrSetupGetIntField(ic, 1, (int*) &dwInfValue); if ((S_OK == hr) && (dwRegValue == dwInfValue)) { // value matches, now find the key name hr = HrSetupGetStringField(ic, 0, pstrNT5InfId); if (S_OK == hr) { // the key name (NT5 infid) // is returned in pstrNT5InfId break; } } hr = HrSetupFindNextLine(ic, &ic); } } else if (HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hr) { hr = HrSetupFindKeyWithStringValue(hInf, pszAdapterSection, c_szValueNotPresent, pstrNT5InfId); } break; case REG_SZ: // find the value in under adapter driver parameters key // hr = HrRegQueryString(hkeyAdapterParams, strValueName.c_str(), &strRegValue); if (SUCCEEDED(hr)) { // goto the ValueType line hr = HrSetupFindFirstLine(hInf, pszAdapterSection, c_szKeyValueType, &ic); if (S_OK == hr) { // move the context from the ValueType line to // the next line, where values begin hr = HrSetupFindNextLine(ic, &ic); } while (S_OK == hr) { // now enumerate over all keys in this section and // try to locate the key with dwRegValue in the infmap hr = HrSetupGetStringField(ic, 1, &strInfValue); if ((S_OK == hr) && !lstrcmpiW(strRegValue.c_str(), strInfValue.c_str())) { // value matches, now find the key name hr = HrSetupGetStringField(ic, 0, pstrNT5InfId); if (S_OK == hr) { // the key name (NT5 infid) // is returned in pstrNT5InfId break; } } hr = HrSetupFindNextLine(ic, &ic); } } else if (HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hr) { hr = HrSetupFindKeyWithStringValue(hInf, pszAdapterSection, c_szValueNotPresent, pstrNT5InfId); } break; default: hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA); // currently we support only REG_DWORD and REG_SZ type values TraceTag(ttidError, "%s: ValueType %d is not supported", __FUNCNAME__, dwValueType); break; } } } TraceError(__FUNCNAME__, hr); return hr; } // ---------------------------------------------------------------------- // // Function: HrMapPreNT5NetComponentInfIDUsingInfHelper // // Purpose: // // Arguments: // hinf [in] handle of netmap.inf file // pszOldInfID [in] pre NT5 InfID // pszMSSection [in] section having MS components // pszOemSection [in] section having OEM components // pstrNT5InfId [out] mapped NT5 InfID // pfOemComponent [out] set to TRUE for OEM component // // Returns: S_OK on success, // S_FALSE if a mapping is not found // otherwise an error code // // Author: kumarp 17-December-97 // // Notes: // HRESULT HrMapPreNT5NetComponentInfIDUsingInfHelper(IN HINF hinf, IN PCWSTR pszOldInfID, IN PCWSTR pszMSSection, IN PCWSTR pszOemSection, OUT tstring* pstrNT5InfId, OUT BOOL* pfOemComponent) { DefineFunctionName("HrMapPreNT5NetComponentInfIDUsingInfHelper"); Assert(hinf); AssertValidReadPtr(pszOldInfID); AssertValidReadPtr(pszMSSection); AssertValidReadPtr(pszOemSection); AssertValidWritePtr(pstrNT5InfId); AssertValidWritePtr(pfOemComponent); HRESULT hr=S_FALSE; INFCONTEXT ic; hr = HrSetupFindFirstLine(hinf, pszMSSection, pszOldInfID, &ic); if (S_OK == hr) { *pfOemComponent = FALSE; } else { hr = HrSetupFindFirstLine(hinf, pszOemSection, pszOldInfID, &ic); if (S_OK == hr) { *pfOemComponent = TRUE; } } if (S_OK == hr) { hr = HrSetupGetStringField(ic, 1, pstrNT5InfId); if (S_OK == hr) { if (*pfOemComponent) { tstring strOemDll; tstring strOemInf; HRESULT hrT; hrT = HrGetOemUpgradeInfoInInf(hinf, pstrNT5InfId->c_str(), &strOemDll, &strOemInf); if ((S_OK == hrT) && !lstrcmpiW(strOemDll.c_str(), c_szNotSupported)) { TraceTag(ttidNetUpgrade, "%s: %S --> %S",__FUNCNAME__, pszOldInfID, c_szNotSupported); hr = S_FALSE; } } } } else if (HRESULT_FROM_SETUPAPI(ERROR_LINE_NOT_FOUND) == hr) { hr = S_FALSE; } TraceErrorOptional(__FUNCNAME__, hr, (hr == S_FALSE)); return hr; } // ---------------------------------------------------------------------- // // Function: HrMapPreNT5NetComponentInfIDInInf // // Purpose: Search the specified netmap.inf file for mapping // the specified pre-NT5 InfID of a s/w component to its NT5 value // // Arguments: // hinf [in] handle of netmap.inf file // pszOldInfID [in] pre-NT5 InfID // pstrNT5InfId [out] mapped ID // pfOemComponent [out] set to TRUE for OEM component // // Returns: S_OK on success, // S_FALSE if a mapping is not found // otherwise an error code // // Author: kumarp 17-December-97 // // Notes: // HRESULT HrMapPreNT5NetComponentInfIDInInf(IN HINF hinf, IN PCWSTR pszOldInfID, OUT tstring* pstrNT5InfId, OUT ENetComponentType* pnct, OUT BOOL* pfOemComponent) { DefineFunctionName("HrMapPreNT5NetComponentInfIDUsingInf"); Assert(hinf); AssertValidReadPtr(pszOldInfID); AssertValidWritePtr(pstrNT5InfId); AssertValidWritePtr(pfOemComponent); HRESULT hr=S_FALSE; ENetComponentType nct = NCT_Unknown; hr = HrMapPreNT5NetComponentInfIDUsingInfHelper(hinf, pszOldInfID, c_szNetProtocols, c_szOemNetProtocols, pstrNT5InfId, pfOemComponent); if (S_OK == hr) { nct = NCT_Protocol; } else { hr = HrMapPreNT5NetComponentInfIDUsingInfHelper(hinf, pszOldInfID, c_szNetServices, c_szOemNetServices, pstrNT5InfId, pfOemComponent); if (S_OK == hr) { nct = NCT_Service; } else { hr = HrMapPreNT5NetComponentInfIDUsingInfHelper(hinf, pszOldInfID, c_szNetClients, c_szOemNetClients, pstrNT5InfId, pfOemComponent); if (S_OK == hr) { nct = NCT_Client; } } } if ((S_OK == hr) && pnct) { *pnct = nct; } TraceErrorOptional(__FUNCNAME__, hr, (hr == S_FALSE)); return hr; } // ---------------------------------------------------------------------- // // Function: HrMapPreNT5NetComponentInfIDToNT5InfID // // Purpose: maps pre-NT5 InfID of a service or protocol to its NT5 equivalent // // Arguments: // pszPreNT5InfId [in] pre-NT5 InfID // pstrNT5InfId [out] mapped ID // pfOemComponent [out] set to TRUE for OEM component // pdwNetMapIndex [out] the index in netmap array for which map was found // // Returns: S_OK on success, // S_FALSE if a mapping is not found // otherwise an error code // // Author: kumarp 17-December-97 // // Notes: // HRESULT HrMapPreNT5NetComponentInfIDToNT5InfID(IN PCWSTR pszPreNT5InfId, OUT tstring* pstrNT5InfId, OUT BOOL* pfOemComponent, OUT ENetComponentType* pnct, OUT CNetMapInfo** ppnmi) { DefineFunctionName("HrMapPreNT5NetComponentInfIDToNT5InfID"); AssertValidReadPtr(pszPreNT5InfId); AssertValidWritePtr(pstrNT5InfId); AssertValidReadPtr(g_pnmaNetMap); HRESULT hr=E_FAIL; TraceTag(ttidNetUpgrade, "finding mapping for %S...", pszPreNT5InfId); if (g_pnmaNetMap) { CNetMapInfo* pnmi; size_t cNumNetMapEntries = g_pnmaNetMap->size(); for (size_t i = 0; i < cNumNetMapEntries; i++) { pnmi = (CNetMapInfo*) (*g_pnmaNetMap)[i]; hr = HrMapPreNT5NetComponentInfIDInInf(pnmi->m_hinfNetMap, pszPreNT5InfId, pstrNT5InfId, pnct, pfOemComponent); if (SUCCEEDED(hr)) { if (ppnmi) { *ppnmi = pnmi; } if (S_OK == hr) { TraceTag(ttidNetUpgrade, "%s: %S --> %S", __FUNCNAME__, pszPreNT5InfId, pstrNT5InfId->c_str()); break; } } } } TraceErrorOptional(__FUNCNAME__, hr, (hr == S_FALSE)); return hr; } // ---------------------------------------------------------------------- // // Function: HrGetSoftwareProductKey // // Purpose: Get handle to registry key for a software product of a provider // // Arguments: // pszProvider [in] name of provider // pszProduct [in] name of product // phkey [out] pointer to handle of regkey // // Returns: S_OK on success, otherwise an error code // // Author: kumarp 17-December-97 // // Notes: // HRESULT HrGetSoftwareProductKey(IN PCWSTR pszProvider, IN PCWSTR pszProduct, OUT HKEY* phkey) { DefineFunctionName("HrGetSoftwareProductKey"); AssertValidReadPtr(pszProvider); AssertValidReadPtr(pszProduct); AssertValidWritePtr(phkey); HRESULT hr=S_OK; tstring strProduct; strProduct = c_szRegKeySoftware; AppendToPath(&strProduct, pszProvider); AppendToPath(&strProduct, pszProduct); AppendToPath(&strProduct, c_szRegKeyCurrentVersion); hr = HrRegOpenKeyEx(HKEY_LOCAL_MACHINE, strProduct.c_str(), KEY_READ, phkey); TraceErrorOptional(__FUNCNAME__, hr, (hr == S_FALSE)); return hr; } // ---------------------------------------------------------------------- // // Function: HrMapPreNT5NetComponentServiceNameToNT5InfId // // Purpose: Map pre-NT5 InfID of a service to its NT5 value // // Arguments: // pszServiceName [in] name of service // pstrNT5InfId [out] mapped ID // // Returns: S_OK on success, // S_FALSE if a mapping is not found // otherwise an error code // // Author: kumarp 17-December-97 // // Notes: // HRESULT HrMapPreNT5NetComponentServiceNameToNT5InfId(IN PCWSTR pszServiceName, OUT tstring* pstrNT5InfId) { DefineFunctionName("HrMapPreNT5NetComponentServiceNameToNT5InfId"); AssertValidReadPtr(pszServiceName); AssertValidWritePtr(pstrNT5InfId); tstring strPreNT5InfId; HKEY hkey; HRESULT hr=S_OK; hr = HrGetSoftwareProductKey(c_szRegKeyMicrosoft, pszServiceName, &hkey); if (S_OK == hr) { hr = HrGetPreNT5InfIdAndDesc(hkey, &strPreNT5InfId, NULL, NULL); if (S_OK == hr) { BOOL fIsOemComponent; hr = HrMapPreNT5NetComponentInfIDToNT5InfID(strPreNT5InfId.c_str(), pstrNT5InfId, &fIsOemComponent, NULL, NULL); #ifdef ENABLETRACE if (FAILED(hr)) { TraceTag(ttidNetUpgrade, "%s: could not map %S to NT5 InfID", __FUNCNAME__, pszServiceName); } #endif } RegCloseKey(hkey); } TraceErrorOptional(__FUNCNAME__, hr, (hr == S_FALSE)); return hr; } // ---------------------------------------------------------------------- // // Function: HrGetOemUpgradeInfoInInf // // Purpose: Find out which OEM DLL to load for a component // // Arguments: // hinf [in] handle of netmap.inf file // pszNT5InfId [in] NT5 InfID of a component // pstrUpgradeDllName [out] name of the upgrade DLL found // pstrInf [out] INF file for this component // // Returns: S_OK on success, otherwise an error code // // Author: kumarp 17-December-97 // // Notes: // HRESULT HrGetOemUpgradeInfoInInf(IN HINF hinf, IN PCWSTR pszNT5InfId, OUT tstring* pstrUpgradeDllName, OUT tstring* pstrInf) { DefineFunctionName("HrGetOemUpgradeInfoInInf"); Assert(hinf); AssertValidReadPtr(pszNT5InfId); AssertValidWritePtr(pstrUpgradeDllName); AssertValidWritePtr(pstrInf); HRESULT hr=S_FALSE; INFCONTEXT ic; pstrUpgradeDllName->erase(); pstrInf->erase(); // each line in this section is of the format // =[,] hr = HrSetupFindFirstLine(hinf, c_szOemUpgradeSupport, pszNT5InfId, &ic); if (S_OK == hr) { hr = HrSetupGetStringField(ic, 1, pstrUpgradeDllName); if (S_OK == hr) { // the value OemInfFile is optional, so we dont // complain if we cannot find it. if (HRESULT_FROM_SETUPAPI(ERROR_INVALID_PARAMETER) == HrSetupGetStringField(ic, 2, pstrInf)) { TraceTag(ttidNetUpgrade, "%s: OemInf is not specified for %S", __FUNCNAME__, pszNT5InfId); } } } TraceTag(ttidNetUpgrade, "%s: OemDll: %S, OemInf: %S", __FUNCNAME__, pstrUpgradeDllName->c_str(), pstrInf->c_str()); TraceErrorOptional(__FUNCNAME__, hr, (hr == S_FALSE)); return hr; } // ---------------------------------------------------------------------- // // Function: HrGetOemUpgradeDllInfo // // Purpose: Find out which OEM DLL to load for a component // // Arguments: // pszNT5InfId [in] InfID of OEM component // pstrUpgradeDllName [out] name of OEM DLL found // // Returns: S_OK on success, otherwise an error code // // Author: kumarp 17-December-97 // // Notes: // HRESULT HrGetOemUpgradeInfo(IN PCWSTR pszNT5InfId, OUT tstring* pstrUpgradeDllName, OUT tstring* pstrInf) { DefineFunctionName("HrGetOemUpgradeInfo"); AssertValidReadPtr(pszNT5InfId); AssertValidWritePtr(pstrUpgradeDllName); Assert(g_pnmaNetMap); HRESULT hr=E_FAIL; TraceTag(ttidNetUpgrade, "finding upgrade dll info for %S...", pszNT5InfId); if (g_pnmaNetMap) { CNetMapInfo* pnmi; size_t cNumNetMapEntries = g_pnmaNetMap->size(); for (size_t i = 0; i < cNumNetMapEntries; i++) { pnmi = (CNetMapInfo*) (*g_pnmaNetMap)[i]; hr = HrGetOemUpgradeInfoInInf(pnmi->m_hinfNetMap, pszNT5InfId, pstrUpgradeDllName, pstrInf); if (S_OK == hr) { TraceTag(ttidNetUpgrade, "%s: %S --> Dll: %S, Inf: %S", __FUNCNAME__, pszNT5InfId, pstrUpgradeDllName->c_str(), pstrInf->c_str()); break; } } } TraceErrorOptional(__FUNCNAME__, hr, (hr == S_FALSE)); return hr; } // ---------------------------------------------------------------------- // // Function: HrSetupFindKeyWithStringValue // // Purpose: Find the key in a section that has the specified value // // Arguments: // hInf [in] handle of netmap.inf file // szSection [in] name of section // szValue [in] value to find // pstrKey [out] name of the key found // // Returns: S_OK on success, otherwise an error code // // Author: kumarp 17-December-97 // // Notes: // HRESULT HrSetupFindKeyWithStringValue(IN HINF hInf, IN PCWSTR szSection, IN PCWSTR szValue, OUT tstring* pstrKey) { DefineFunctionName("HrSetupFindKeyWithStringValue"); HRESULT hr=S_OK; INFCONTEXT ic; tstring strValue; hr = HrSetupFindFirstLine(hInf, szSection, NULL, &ic); while (S_OK == hr) { // now enumerate over all keys in this section and // try to locate the key with value szValue hr = HrSetupGetStringField(ic, 1, &strValue); if ((S_OK == hr) && !lstrcmpiW(strValue.c_str(), szValue)) { // value matches, now find the key name hr = HrSetupGetStringField(ic, 0, pstrKey); break; } hr = HrSetupFindNextLine(ic, &ic); } if (HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS) == hr) { hr = S_FALSE; } TraceError(__FUNCNAME__, hr); return hr; }