#include "pch.h" #pragma hdrstop #include #include "ncreg.h" #include "nwlnkipx.h" #define ChLowX L'x' #define ChUpX L'X' // // Function: FIsNetwareIpxInstalled // // Purpose: Check for the existance of the IPXSPSII key in the // HKLM\SYSTEM\...\Services hive // BOOL FIsNetwareIpxInstalled( VOID) { HRESULT hr; HKEY hkey; BOOL fRet; fRet = FALSE; hr = HrRegOpenKeyEx( HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\IPXSPXII", KEY_READ, &hkey); if (S_OK == hr) { fRet = TRUE; RegCloseKey(hkey); } return fRet; } DWORD DwFromSz(PCWSTR sz, int nBase) { PCWSTR psz = sz; WCHAR *pszStop; WCHAR szBuf[12]; Assert(NULL != psz); if ((16 == nBase) && (ChLowX != sz[1]) && (ChUpX != sz[1])) { psz = szBuf; wcscpy(szBuf,L"0x"); wcsncpy(szBuf+2, sz, 8); szBuf[10]=L'\0'; } return wcstoul(psz, &pszStop, nBase); } DWORD DwFromLstPtstring(const list & lstpstr, DWORD dwDefault, int nBase) { if (lstpstr.empty()) return dwDefault; else return DwFromSz(lstpstr.front()->c_str(), nBase); } void UpdateLstPtstring(TSTRING_LIST & lstpstr, DWORD dw) { WCHAR szBuf[12]; DeleteColString(&lstpstr); // Stringize the supplied dword as a hex with no "0x" prefix wsprintfW(szBuf,L"%0.8lX",dw); // Set as first item in the list lstpstr.push_front(new tstring(szBuf)); } // Apply our special Hex Format to a DWORD. Assumes adequately sized 'sz' void HexSzFromDw(PWSTR sz, DWORD dw) { wsprintfW(sz,L"%0.8lX",dw); } HRESULT HrQueryAdapterComponentInfo(INetCfgComponent *pncc, CIpxAdapterInfo * pAI) { HRESULT hr; PWSTR pszwDesc = NULL; PWSTR pszwBindName = NULL; DWORD dwCharacteristics = 0L; Assert(NULL != pAI); Assert(NULL != pncc); // Get Description hr = pncc->GetDisplayName(&pszwDesc); if (FAILED(hr)) goto Error; if (*pszwDesc) pAI->SetAdapterDesc(pszwDesc); else pAI->SetAdapterDesc(SzLoadIds(IDS_UNKNOWN_NETWORK_CARD)); CoTaskMemFree(pszwDesc); // Get the Component's Instance Guid hr = pncc->GetInstanceGuid(pAI->PInstanceGuid()); if (S_OK != hr) goto Error; // Get the Component's Bind Name hr = pncc->GetBindName(&pszwBindName); if (S_OK != hr) goto Error; Assert(NULL != pszwBindName); Assert(0 != lstrlenW(pszwBindName)); pAI->SetBindName(pszwBindName); CoTaskMemFree(pszwBindName); // Failure is non-fatal hr = pncc->GetCharacteristics(&dwCharacteristics); if (SUCCEEDED(hr)) { pAI->SetCharacteristics(dwCharacteristics); } // Get the media type (Optional key) { DWORD dwMediaType = ETHERNET_MEDIA; INetCfgComponentBindings* pnccBindings = NULL; hr = pncc->QueryInterface(IID_INetCfgComponentBindings, reinterpret_cast(&pnccBindings)); if (SUCCEEDED(hr)) { struct { PCWSTR pszInterface; DWORD dwInterface; } InterfaceMap[] = {{L"ethernet", ETHERNET_MEDIA}, {L"tokenring", TOKEN_MEDIA}, {L"arcnet", ARCNET_MEDIA}, {L"fddi", FDDI_MEDIA}}; for (UINT nIdx=0; nIdx < celems(InterfaceMap); nIdx++) { hr = pnccBindings->SupportsBindingInterface(NCF_LOWER, InterfaceMap[nIdx].pszInterface); if (S_OK == hr) { dwMediaType = InterfaceMap[nIdx].dwInterface; break; } } ReleaseObj(pnccBindings); } pAI->SetMediaType(dwMediaType); hr = S_OK; } Error: TraceError("HrQueryAdapterComponentInfo",hr); return hr; } // Note: Can successfully return *ppncc = NULL HRESULT HrAnswerFileAdapterToPNCC(INetCfg *pnc, PCWSTR szAdapterId, INetCfgComponent** ppncc) { GUID guidAdapter; GUID guidInstance; HRESULT hr = S_FALSE; // assume we don't find it. Assert(NULL != szAdapterId); Assert(NULL != ppncc); Assert(lstrlenW(szAdapterId)); *ppncc = NULL; // Get the Instance ID for the specified adapter if (FGetInstanceGuidOfComponentInAnswerFile(szAdapterId, pnc, &guidAdapter)) { // Search for the specified adapter in the set of existing adapters CIterNetCfgComponent nccIter(pnc, &GUID_DEVCLASS_NET); INetCfgComponent* pncc; while (SUCCEEDED(hr) && (S_OK == (hr = nccIter.HrNext (&pncc)))) { hr = pncc->GetInstanceGuid(&guidInstance); if (SUCCEEDED(hr)) { if (guidInstance == guidAdapter) { // Found the adapter. Transfer ownership and get out. *ppncc = pncc; break; } } ReleaseObj(pncc); } } TraceError("HrAnswerFileAdapterToPNCC", (S_FALSE == hr) ? S_OK : hr); return hr; }