mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
255 lines
6.8 KiB
255 lines
6.8 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1997.
|
|
//
|
|
// File: C O M P I D . C P P
|
|
//
|
|
// Contents: Functions dealing with compatible ids
|
|
//
|
|
// Notes:
|
|
//
|
|
// Author: kumarp 04-September-98
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "pch.h"
|
|
#pragma hdrstop
|
|
#include "kkutils.h"
|
|
#include "ncsetup.h"
|
|
#include "ncnetcfg.h"
|
|
|
|
// ----------------------------------------------------------------------
|
|
//
|
|
// Function: HrGetCompatibleIds
|
|
//
|
|
// Purpose: Get a list of PnpIds compatible to the given net device
|
|
//
|
|
// Arguments:
|
|
// hdi [in] handle of device info
|
|
// pdeid [in] pointer to device info data
|
|
// ppmszCompatibleIds [out] pointer to multisz to receive the list
|
|
//
|
|
// Returns: S_OK on success, otherwise an error code
|
|
//
|
|
// Author: kumarp 17-March-98
|
|
//
|
|
// Notes:
|
|
//
|
|
HRESULT HrGetCompatibleIds(
|
|
IN HDEVINFO hdi,
|
|
IN PSP_DEVINFO_DATA pdeid,
|
|
OUT PWSTR* ppmszCompatibleIds)
|
|
{
|
|
Assert(IsValidHandle(hdi));
|
|
AssertValidReadPtr(pdeid);
|
|
AssertValidWritePtr(ppmszCompatibleIds);
|
|
|
|
// Now we need to build a list of all the possible ids this
|
|
// device could have so that netsetup can find the correct match.
|
|
//
|
|
|
|
HRESULT hr;
|
|
|
|
// First we get the multi sz of hardware ids
|
|
//
|
|
PWSTR pszHwIds = NULL;
|
|
PWSTR pszCompatIds = NULL;
|
|
PWSTR pszIdList = NULL;
|
|
|
|
*ppmszCompatibleIds = NULL;
|
|
|
|
hr = HrSetupDiGetDeviceRegistryPropertyWithAlloc (hdi, pdeid,
|
|
SPDRP_HARDWAREID, NULL, (BYTE**)&pszHwIds);
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
// Now we get the multi sz of compatible ids
|
|
// Note: we can still attempt to get parameters with
|
|
// the hardware ids so if the next call fails, we will
|
|
// continue
|
|
(void) HrSetupDiGetDeviceRegistryPropertyWithAlloc (hdi, pdeid,
|
|
SPDRP_COMPATIBLEIDS, NULL, (BYTE**)&pszCompatIds);
|
|
|
|
// Get the lengths of the ids
|
|
//
|
|
|
|
// Get the length of the hardware ids without the extra null
|
|
Assert (CchOfMultiSzAndTermSafe (pszHwIds) > 0);
|
|
ULONG cbHwIds = CchOfMultiSzSafe (pszHwIds) * sizeof (WCHAR);
|
|
|
|
ULONG cbCompatIds = CchOfMultiSzAndTermSafe (pszCompatIds) *
|
|
sizeof (WCHAR);
|
|
|
|
|
|
// If there was a compatible id list we need to make one concatenated list
|
|
//
|
|
if (cbCompatIds)
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
|
|
// allocate the buffer
|
|
pszIdList = (PWSTR)MemAlloc (cbHwIds + cbCompatIds);
|
|
|
|
if (pszIdList)
|
|
{
|
|
// copy the two lists
|
|
// The hwids length does not contain the extra null, but
|
|
// the compat id list does, so it works out when
|
|
// concatenating
|
|
//
|
|
hr = S_OK;
|
|
CopyMemory (pszIdList, pszHwIds, cbHwIds);
|
|
|
|
Assert (0 == (cbHwIds % sizeof(WCHAR)));
|
|
CopyMemory ((BYTE*)pszIdList + cbHwIds, pszCompatIds,
|
|
cbCompatIds);
|
|
|
|
*ppmszCompatibleIds = pszIdList;
|
|
}
|
|
|
|
MemFree (pszCompatIds);
|
|
MemFree (pszHwIds);
|
|
}
|
|
else
|
|
{
|
|
// only the main (Hardware Ids) list is available so
|
|
// just assign to the list variable
|
|
*ppmszCompatibleIds = pszHwIds;
|
|
}
|
|
}
|
|
|
|
TraceHr (ttidNetSetup, FAL, hr, FALSE, "HrGetCompatibleIds");
|
|
|
|
return hr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: HrIsAdapterInstalled
|
|
//
|
|
// Purpose: Find out if the specified adapter is installed
|
|
//
|
|
// Arguments:
|
|
// szAdapterId [in] PnP Id
|
|
//
|
|
// Returns: S_OK on success, otherwise an error code
|
|
//
|
|
// Author: kumarp 17-September-98
|
|
//
|
|
// Notes:
|
|
//
|
|
HRESULT HrIsAdapterInstalled(IN PCWSTR szAdapterId)
|
|
{
|
|
DefineFunctionName("HrIsAdapterInstalled2");
|
|
|
|
AssertValidReadPtr(szAdapterId);
|
|
|
|
HRESULT hr=S_OK;
|
|
HDEVINFO hdi;
|
|
DWORD dwIndex=0;
|
|
SP_DEVINFO_DATA deid;
|
|
WCHAR szInstance[MAX_DEVICE_ID_LEN];
|
|
BOOL fFound = FALSE;
|
|
|
|
hr = HrSetupDiGetClassDevs(&GUID_DEVCLASS_NET, NULL, NULL,
|
|
DIGCF_PRESENT, &hdi);
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
while (!fFound &&
|
|
SUCCEEDED(hr = HrSetupDiEnumDeviceInfo(hdi, dwIndex, &deid)))
|
|
{
|
|
dwIndex++;
|
|
|
|
hr = HrSetupDiGetDeviceInstanceId(hdi, &deid, szInstance,
|
|
MAX_DEVICE_ID_LEN, NULL);
|
|
if (S_OK == hr)
|
|
{
|
|
PWSTR pmszCompatibleIds;
|
|
|
|
hr = HrGetCompatibleIds(hdi, &deid, &pmszCompatibleIds);
|
|
if (S_OK == hr)
|
|
{
|
|
if (FIsSzInMultiSzSafe(szAdapterId, pmszCompatibleIds))
|
|
{
|
|
fFound = TRUE;
|
|
hr = S_OK;
|
|
}
|
|
|
|
MemFree(pmszCompatibleIds);
|
|
}
|
|
}
|
|
|
|
}
|
|
SetupDiDestroyDeviceInfoList(hdi);
|
|
}
|
|
|
|
if (HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS) == hr)
|
|
{
|
|
hr = S_FALSE;
|
|
}
|
|
|
|
TraceErrorSkip1(__FUNCNAME__, hr, S_FALSE);
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: HrGetCompatibleIdsOfNetComponent
|
|
//
|
|
// Purpose: Find compatible PnP IDs of the adapter
|
|
// specified by the given INetCfgComponent
|
|
//
|
|
// Arguments:
|
|
// pncc [in] pointer to INetCfgComponent object
|
|
// ppmszCompatibleIds [out] pointer to compatible IDs multisz
|
|
//
|
|
// Returns: S_OK on success, otherwise an error code
|
|
//
|
|
// Author: kumarp 28-September-98
|
|
//
|
|
// Notes:
|
|
//
|
|
HRESULT HrGetCompatibleIdsOfNetComponent(IN INetCfgComponent* pncc,
|
|
OUT PWSTR* ppmszCompatibleIds)
|
|
{
|
|
DefineFunctionName("HrIsAdapterInstalled2");
|
|
|
|
HRESULT hr=S_OK;
|
|
HDEVINFO hdi;
|
|
SP_DEVINFO_DATA deid;
|
|
tstring strInstance;
|
|
PWSTR pszPnpDevNodeId=NULL;
|
|
|
|
hr = pncc->GetPnpDevNodeId(&pszPnpDevNodeId);
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
// Use the instanceID to get the key to the parameters
|
|
// using Device Installer APIs (PNP)
|
|
//
|
|
hr = HrSetupDiCreateDeviceInfoList(&GUID_DEVCLASS_NET, NULL, &hdi);
|
|
if (S_OK == hr)
|
|
{
|
|
// Open the devnode.
|
|
//
|
|
SP_DEVINFO_DATA deid;
|
|
hr = HrSetupDiOpenDeviceInfo(hdi, pszPnpDevNodeId, NULL,
|
|
0, &deid);
|
|
if (S_OK == hr)
|
|
{
|
|
hr = HrGetCompatibleIds(hdi, &deid, ppmszCompatibleIds);
|
|
}
|
|
|
|
SetupDiDestroyDeviceInfoList(hdi);
|
|
}
|
|
CoTaskMemFree(pszPnpDevNodeId);
|
|
}
|
|
|
|
TraceErrorSkip1(__FUNCNAME__, hr, S_FALSE);
|
|
|
|
return hr;
|
|
}
|