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

140 lines
3.7 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997.
//
// File: I S D N H O O K . C P P
//
// Contents: Hook for the ISDN wizard, from the netdi.cpp class installer
//
// Notes:
//
// Author: jeffspr 14 Jun 1997
//
//----------------------------------------------------------------------------
#include "pch.h"
#pragma hdrstop
#include "isdncfg.h"
#include "isdnwiz.h"
#include "ncmisc.h"
#include "ncreg.h"
#include "ncstring.h"
//---[ Constants ]------------------------------------------------------------
extern const WCHAR c_szRegKeyInterfacesFromInstance[];
extern const WCHAR c_szRegValueLowerRange[];
//+--------------------------------------------------------------------------
//
// Function: FAdapterIsIsdn
//
// Purpose: Checks information under the adapters driver's key to
// determine if the adapter is ISDN
//
// Arguments:
// hkeyDriver [in] The driver key for the adapter
//
// Returns: BOOL. TRUE if the adapter is ISDN, FALSE otherwise
//
// Author: billbe 09 Sep 1997
//
// Notes:
//
BOOL
FAdapterIsIsdn(HKEY hkeyDriver)
{
Assert(hkeyDriver);
const WCHAR c_szIsdn[] = L"isdn";
HKEY hkey;
BOOL fIsIsdn = FALSE;
// Open the Interfaces key under the driver key
HRESULT hr = HrRegOpenKeyEx(hkeyDriver,
c_szRegKeyInterfacesFromInstance, KEY_READ, &hkey);
if (SUCCEEDED(hr))
{
PWSTR szRange;
// Get the lower range of interfaces
hr = HrRegQuerySzWithAlloc(hkey, c_szRegValueLowerRange, &szRange);
if (SUCCEEDED(hr))
{
// Look for ISDN in the lower range
fIsIsdn = FFindStringInCommaSeparatedList(c_szIsdn, szRange,
NC_IGNORE, NULL);
MemFree(szRange);
}
RegCloseKey(hkey);
}
return fIsIsdn;
}
//+---------------------------------------------------------------------------
//
// Function: HrAddIsdnWizardPagesIfAppropriate
//
// Purpose: Adds the ISDN wizard pages to the hardware wizard if the
// bindings dictate such. We look to see if they have a lower
// binding of "isdn", and if so, then add the pages.
//
// Arguments:
// hdi [in] See Device Installer Api for more info
// pdeid [in]
//
// Returns: S_OK if successful or valid Win32 error
//
// Author: jeffspr 17 Jun 1997
//
// Notes:
//
HRESULT HrAddIsdnWizardPagesIfAppropriate(HDEVINFO hdi,
PSP_DEVINFO_DATA pdeid)
{
Assert(IsValidHandle(hdi));
Assert(pdeid);
// Open the adapter's driver key
//
HKEY hkeyInstance = NULL;
HRESULT hr = HrSetupDiOpenDevRegKey(hdi, pdeid, DICS_FLAG_GLOBAL, 0,
DIREG_DRV, KEY_READ, &hkeyInstance);
// Don't do anything if its not an ISDN adapter.
if (SUCCEEDED(hr) && FShowIsdnPages(hkeyInstance))
{
// Read the ISDN registry structure into the config info
//
PISDN_CONFIG_INFO pisdnci;
hr = HrReadIsdnPropertiesInfo(hkeyInstance, hdi, pdeid, &pisdnci);
if (SUCCEEDED(hr))
{
Assert(pisdnci);
if (pisdnci->dwCurSwitchType == ISDN_SWITCH_NONE)
{
// Add the wizard pages to the device's class install params.
//
hr = HrAddIsdnWizardPagesToDevice(hdi, pdeid, pisdnci);
}
else
{
TraceTag(ttidISDNCfg, "Not adding wizard pages because we "
"found a previous switch type for this device.");
}
}
}
RegSafeCloseKey(hkeyInstance);
TraceError("HrAddIsdnWizardPagesIfAppropriate", hr);
return hr;
}