windows-nt/Source/XPSP1/NT/net/config/netcfg/nwlnkcfg/nwlnkutl.cpp
2020-09-26 16:20:57 +08:00

217 lines
5.4 KiB
C++

#include "pch.h"
#pragma hdrstop
#include <ncxbase.h>
#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<tstring *> & 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<void**>(&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;
}