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.
374 lines
14 KiB
374 lines
14 KiB
//++
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1987 - 1999
|
|
//
|
|
// Module Name:
|
|
//
|
|
// bindings.c
|
|
//
|
|
// Abstract:
|
|
//
|
|
// Queries into network drivers
|
|
//
|
|
// Author:
|
|
//
|
|
// Anilth - 4-20-1998
|
|
//
|
|
// Environment:
|
|
//
|
|
// User mode only.
|
|
// Contains NT-specific code.
|
|
//
|
|
// Revision History:
|
|
//
|
|
//--
|
|
#include "precomp.h"
|
|
|
|
#undef IsEqualGUID
|
|
#include "bindings.h"
|
|
|
|
|
|
HRESULT
|
|
BindingsTest(NETDIAG_PARAMS* pParams, NETDIAG_RESULT* pResults)
|
|
//++
|
|
// Description:
|
|
// This Test uses the INetCfg COM interface to get the bingings.
|
|
// COM Interface is accessed using C, not C++.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Author:
|
|
// Rajkumar .P ( 07/17/98 )
|
|
//
|
|
//--
|
|
{
|
|
INetCfg* pINetCfg = NULL;
|
|
INetCfgClass *pINetCfgClass = NULL;
|
|
IEnumNetCfgComponent *pIEnumNetCfgComponent = NULL;
|
|
INetCfgComponent *pINetCfgComponent = NULL;
|
|
INetCfgComponentBindings *pINetCfgComponentBindings = NULL;
|
|
IEnumNetCfgBindingPath *pEnumNetCfgBindingPath = NULL;
|
|
INetCfgBindingPath *pINetCfgBindingPath = NULL;
|
|
IEnumNetCfgBindingInterface *pIEnumNetCfgBindingInterface = NULL;
|
|
INetCfgBindingInterface *pINetBindingInterface = NULL;
|
|
INetCfgComponent *pUpperComponent = NULL;
|
|
INetCfgComponent *pLowerComponent = NULL;
|
|
INetCfgComponent *pOwner = NULL;
|
|
|
|
|
|
HRESULT hr;
|
|
wchar_t *pszwDisplayName;
|
|
wchar_t *pszwBindName;
|
|
wchar_t *pszwDescription;
|
|
wchar_t *pszwInterfaceName;
|
|
wchar_t *pszwUpperComponent;
|
|
wchar_t *pszwLowerComponent;
|
|
wchar_t *pszwOwner;
|
|
|
|
TCHAR szBuffer[512];
|
|
|
|
DWORD dwPathId;
|
|
int i;
|
|
|
|
PrintStatusMessage( pParams, 4, IDS_BINDINGS_STATUS_MSG );
|
|
|
|
InitializeListHead( &pResults->Bindings.lmsgOutput );
|
|
|
|
// Only do this test if in really verbose mode
|
|
if (!pParams->fReallyVerbose)
|
|
return S_OK;
|
|
|
|
// Initialize the COM library
|
|
CoInitialize(NULL);
|
|
|
|
hr = CoCreateInstance(&CLSID_NetCfg,
|
|
NULL,
|
|
CLSCTX_INPROC_SERVER,
|
|
&IID_INetCfg,
|
|
(void**)&pINetCfg) ;
|
|
|
|
|
|
if(FAILED(hr))
|
|
{
|
|
DebugMessage("CreateInstance for IID_INetCfg failed\n");
|
|
goto end_BindingsTest;
|
|
}
|
|
|
|
hr = pINetCfg->lpVtbl->Initialize(pINetCfg, NULL);
|
|
|
|
if(FAILED(hr))
|
|
{
|
|
DebugMessage("pINetCfg->Initialize failed.\n");
|
|
goto end_BindingsTest;
|
|
}
|
|
|
|
|
|
|
|
for ( i = 0; i < MAX_CLASS_GUID ; i++ )
|
|
{
|
|
|
|
hr = pINetCfg->lpVtbl->QueryNetCfgClass(pINetCfg,
|
|
c_pNetClassGuid[i].pGuid,
|
|
&IID_INetCfgClass, // This arg is undocumented
|
|
&pINetCfgClass
|
|
);
|
|
|
|
if(FAILED(hr))
|
|
{
|
|
DebugMessage("QueryNetCfgClass failed\n");
|
|
goto end_BindingsTest;
|
|
}
|
|
|
|
hr = pINetCfgClass->lpVtbl->EnumComponents(pINetCfgClass,
|
|
&pIEnumNetCfgComponent);
|
|
|
|
pINetCfgClass->lpVtbl->Release(pINetCfgClass);
|
|
pINetCfgClass = NULL;
|
|
|
|
if(FAILED(hr))
|
|
{
|
|
DebugMessage("EnumComponents failed\n");
|
|
goto end_BindingsTest;
|
|
}
|
|
|
|
// pIEnumNetCfgComponent is a standard COM enumerator
|
|
|
|
while (S_OK == pIEnumNetCfgComponent->lpVtbl->Next(pIEnumNetCfgComponent,1,&pINetCfgComponent,NULL))
|
|
{
|
|
HRESULT hrTmp;
|
|
|
|
hrTmp = pINetCfgComponent->lpVtbl->GetDisplayName(pINetCfgComponent,
|
|
(LPWSTR *)&pszwDisplayName
|
|
);
|
|
|
|
|
|
if (hrTmp == S_OK)
|
|
{
|
|
WideCharToMultiByte(CP_ACP, 0, pszwDisplayName, -1, szBuffer, sizeof(szBuffer), NULL, NULL);
|
|
//IDS_BINDINGS_14801 "Component Name : %s\n"
|
|
AddMessageToList(&pResults->Bindings.lmsgOutput, Nd_ReallyVerbose, IDS_BINDINGS_14801, szBuffer);
|
|
CoTaskMemFree(pszwDisplayName);
|
|
}
|
|
|
|
hrTmp = pINetCfgComponent->lpVtbl->GetBindName(pINetCfgComponent,
|
|
(LPWSTR *)&pszwBindName);
|
|
|
|
if ( SUCCEEDED(hrTmp) )
|
|
{
|
|
WideCharToMultiByte(CP_ACP, 0, pszwBindName, -1, szBuffer, sizeof(szBuffer), NULL, NULL);
|
|
//IDS_BINDINGS_14802 "Bind Name: %s\n"
|
|
AddMessageToList(&pResults->Bindings.lmsgOutput, Nd_ReallyVerbose, IDS_BINDINGS_14802, szBuffer);
|
|
//$REVIEW nsun: maybe we should use SysFreeString to free the buffer
|
|
CoTaskMemFree(pszwBindName);
|
|
}
|
|
|
|
//
|
|
// This function though found in doc , is not yet available
|
|
//
|
|
|
|
/*
|
|
hrTmp = pINetCfgComponent->lpVtbl->GetDescriptionText(pINetCfgComponent,
|
|
(LPWSTR *)&pszwDescription);
|
|
|
|
if (hrTmp == S_OK) {
|
|
WideCharToMultiByte(CP_ACP, 0, pszwBindName, -1, szBuffer, sizeof(szBuffer), NULL, NULL);
|
|
//IDS_BINDINGS_14804 "Description: %s\n"
|
|
wsPrintMessage(&pResults->Bindings.lmsgOutput, IDS_BINDINGS_14804,pszwDescription);
|
|
CoTaskMemFree(pszwDescription);
|
|
}
|
|
*/
|
|
|
|
AddMessageToListSz(&pResults->Bindings.lmsgOutput, Nd_ReallyVerbose, _T(" Binding Paths:\n"));
|
|
hrTmp = pINetCfgComponent->lpVtbl->QueryInterface(pINetCfgComponent,
|
|
&IID_INetCfgComponentBindings,
|
|
&pINetCfgComponentBindings);
|
|
|
|
pINetCfgComponent->lpVtbl->Release(pINetCfgComponent);
|
|
pINetCfgComponent = NULL;
|
|
|
|
if (FAILED(hrTmp))
|
|
continue;
|
|
|
|
hrTmp = pINetCfgComponentBindings->lpVtbl->EnumBindingPaths(pINetCfgComponentBindings,EBP_BELOW,&pEnumNetCfgBindingPath);
|
|
|
|
pINetCfgComponentBindings->lpVtbl->Release(pINetCfgComponentBindings);
|
|
pINetCfgComponentBindings = NULL;
|
|
|
|
if (FAILED(hrTmp))
|
|
continue;
|
|
|
|
while ( S_OK == pEnumNetCfgBindingPath->lpVtbl->Next(pEnumNetCfgBindingPath, 1,&pINetCfgBindingPath,NULL))
|
|
{
|
|
//
|
|
// Got some problems using these two calls - need to take this up with sumitc
|
|
//
|
|
|
|
hrTmp = pINetCfgBindingPath->lpVtbl->GetOwner(pINetCfgBindingPath,
|
|
&pOwner);
|
|
|
|
if ( SUCCEEDED(hrTmp) )
|
|
{
|
|
hrTmp = pOwner->lpVtbl->GetDisplayName(pOwner,
|
|
&pszwOwner);
|
|
|
|
if (hrTmp == S_OK) {
|
|
WideCharToMultiByte(CP_ACP, 0, pszwOwner, -1, szBuffer, sizeof(szBuffer), NULL, NULL);
|
|
//IDS_BINDINGS_14805 "Owner of the binding path : %s\n"
|
|
AddMessageToList(&pResults->Bindings.lmsgOutput, Nd_ReallyVerbose, IDS_BINDINGS_14805, szBuffer);
|
|
CoTaskMemFree(pszwOwner);
|
|
}
|
|
}
|
|
|
|
pOwner->lpVtbl->Release(pOwner);
|
|
pOwner = NULL;
|
|
|
|
hrTmp = pINetCfgBindingPath->lpVtbl->IsEnabled(pINetCfgBindingPath);
|
|
|
|
if (hrTmp == S_OK)
|
|
//IDS_BINDINGS_14806 "Binding Enabled: Yes\n"
|
|
AddMessageToListId(&pResults->Bindings.lmsgOutput, Nd_ReallyVerbose, IDS_BINDINGS_14806);
|
|
else
|
|
if (hrTmp == S_FALSE)
|
|
//IDS_BINDINGS_14807 "Binding Enabled: No\n"
|
|
AddMessageToListId(&pResults->Bindings.lmsgOutput, Nd_ReallyVerbose, IDS_BINDINGS_14807);
|
|
else
|
|
if (hrTmp == NETCFG_E_NOT_INITIALIZED)
|
|
//IDS_BINDINGS_14808 "Binding Enabled: Binding has not yet been intialized\n"
|
|
AddMessageToListId(&pResults->Bindings.lmsgOutput, Nd_ReallyVerbose, IDS_BINDINGS_14808);
|
|
|
|
AddMessageToListSz(&pResults->Bindings.lmsgOutput, Nd_ReallyVerbose, _T(" Interfaces of the binding path: \n"));
|
|
hrTmp = pINetCfgBindingPath->lpVtbl->EnumBindingInterfaces(
|
|
pINetCfgBindingPath,
|
|
&pIEnumNetCfgBindingInterface);
|
|
|
|
pINetCfgBindingPath->lpVtbl->Release(pINetCfgBindingPath);
|
|
pINetCfgBindingPath = NULL;
|
|
|
|
if( FAILED(hrTmp) )
|
|
{
|
|
DebugMessage("EnumBindingInterfaces failed\n" );
|
|
continue;
|
|
}
|
|
|
|
while ( S_OK == pIEnumNetCfgBindingInterface->lpVtbl->Next(pIEnumNetCfgBindingInterface,1,&pINetBindingInterface,NULL))
|
|
{
|
|
|
|
hrTmp = pINetBindingInterface->lpVtbl->GetName(pINetBindingInterface,
|
|
&pszwInterfaceName);
|
|
|
|
if (hrTmp == S_OK)
|
|
{
|
|
WideCharToMultiByte(CP_ACP, 0, pszwInterfaceName, -1, szBuffer, sizeof(szBuffer), NULL, NULL);
|
|
//IDS_BINDINGS_14810 "Interface Name: %s\n"
|
|
AddMessageToList(&pResults->Bindings.lmsgOutput, Nd_ReallyVerbose, IDS_BINDINGS_14810, szBuffer);
|
|
CoTaskMemFree(pszwInterfaceName);
|
|
}
|
|
|
|
hrTmp = pINetBindingInterface->lpVtbl->GetUpperComponent(
|
|
pINetBindingInterface,
|
|
&pUpperComponent);
|
|
|
|
if (hrTmp == S_OK)
|
|
{
|
|
pszwUpperComponent = NULL;
|
|
|
|
hrTmp = pUpperComponent->lpVtbl->GetDisplayName(
|
|
pUpperComponent,
|
|
&pszwUpperComponent);
|
|
|
|
pUpperComponent->lpVtbl->Release(pUpperComponent);
|
|
pUpperComponent = NULL;
|
|
|
|
if (hrTmp == S_OK)
|
|
{
|
|
assert(pszwUpperComponent);
|
|
WideCharToMultiByte(CP_ACP, 0, pszwUpperComponent, -1, szBuffer, sizeof(szBuffer), NULL, NULL);
|
|
//IDS_BINDINGS_14811 "Upper Component: %s\n"
|
|
AddMessageToList(&pResults->Bindings.lmsgOutput, Nd_ReallyVerbose, IDS_BINDINGS_14811, szBuffer);
|
|
CoTaskMemFree(pszwUpperComponent);
|
|
}
|
|
|
|
}
|
|
|
|
hrTmp = pINetBindingInterface->lpVtbl->GetLowerComponent(
|
|
pINetBindingInterface,
|
|
&pLowerComponent);
|
|
|
|
pINetBindingInterface->lpVtbl->Release(pINetBindingInterface);
|
|
pINetBindingInterface = NULL;
|
|
|
|
if (hrTmp == S_OK )
|
|
{
|
|
pszwLowerComponent = NULL;
|
|
hrTmp = pLowerComponent->lpVtbl->GetDisplayName(
|
|
pLowerComponent,
|
|
&pszwLowerComponent);
|
|
|
|
pLowerComponent->lpVtbl->Release(pLowerComponent);
|
|
pLowerComponent = NULL;
|
|
|
|
if (hrTmp == S_OK )
|
|
{
|
|
assert(pszwLowerComponent);
|
|
WideCharToMultiByte(CP_ACP, 0, pszwLowerComponent, -1, szBuffer, sizeof(szBuffer), NULL, NULL);
|
|
//IDS_BINDINGS_14812 "Lower Component: %s\n"
|
|
AddMessageToList(&pResults->Bindings.lmsgOutput, Nd_ReallyVerbose, IDS_BINDINGS_14812, szBuffer);
|
|
CoTaskMemFree(pszwLowerComponent);
|
|
}
|
|
}
|
|
}
|
|
|
|
pIEnumNetCfgBindingInterface->lpVtbl->Release(pIEnumNetCfgBindingInterface);
|
|
pIEnumNetCfgBindingInterface = NULL;
|
|
|
|
AddMessageToList(&pResults->Bindings.lmsgOutput, Nd_ReallyVerbose, IDS_GLOBAL_EmptyLine);
|
|
}
|
|
|
|
AddMessageToList(&pResults->Bindings.lmsgOutput, Nd_ReallyVerbose, IDS_GLOBAL_EmptyLine);
|
|
pEnumNetCfgBindingPath->lpVtbl->Release(pEnumNetCfgBindingPath);
|
|
pEnumNetCfgBindingPath = NULL;
|
|
}
|
|
pIEnumNetCfgComponent->lpVtbl->Release(pIEnumNetCfgComponent);
|
|
pIEnumNetCfgComponent = NULL;
|
|
}
|
|
pINetCfg->lpVtbl->Uninitialize(pINetCfg);
|
|
pINetCfg->lpVtbl->Release(pINetCfg);
|
|
|
|
|
|
end_BindingsTest:
|
|
|
|
// Unitialize COM Library
|
|
CoUninitialize();
|
|
pResults->Bindings.hrTestResult = hr;
|
|
return hr;
|
|
}
|
|
|
|
|
|
void BindingsGlobalPrint(NETDIAG_PARAMS *pParams, NETDIAG_RESULT *pResults)
|
|
{
|
|
if (pParams->fVerbose || !FHrOK(pResults->Bindings.hrTestResult))
|
|
{
|
|
PrintNewLine(pParams, 2);
|
|
PrintTestTitleResult(pParams,
|
|
IDS_BINDINGS_LONG,
|
|
IDS_BINDINGS_SHORT,
|
|
TRUE,
|
|
pResults->Bindings.hrTestResult,
|
|
0);
|
|
}
|
|
|
|
PrintMessageList(pParams, &pResults->Bindings.lmsgOutput);
|
|
}
|
|
|
|
|
|
void BindingsPerInterfacePrint(NETDIAG_PARAMS *pParams, NETDIAG_RESULT *pResults, INTERFACE_RESULT *pInterfaceResults)
|
|
{
|
|
//no pre interface print
|
|
}
|
|
|
|
void BindingsCleanup(IN NETDIAG_PARAMS *pParams,
|
|
IN OUT NETDIAG_RESULT *pResults)
|
|
{
|
|
MessageListCleanUp(&pResults->Bindings.lmsgOutput);
|
|
}
|