Source code of Windows XP (NT5)
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

//++
//
// 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);
}