217 lines
5.4 KiB
C++
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;
|
||
|
}
|
||
|
|