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