Leaked source code of windows server 2003
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.
 
 
 
 
 
 

618 lines
31 KiB

/*****************************************************************************
Copyright (c) 1999 Microsoft Corporation
Module Name:
.PCH_NetworkAdapter.CPP
Abstract:
WBEM provider class implementation for PCH_NetworkAdapter class.
1. This class gets the foll. properties from Win32_NetworkAdapter Class:
AdapterType, DeviceID, ProductName
2. Gets the foll. properties from Win32_NetworkAdapterConfiguration Class:
ServiceName,IPAddress,IPSubnet,DefaultIPGateway,DHCPEnabled,MACAddress
3. Gets the foll. properties from Win32_IRQResource Class:
IRQ Number
4. Gets the foll. properties from Win32_PortResource Class:
StartingAddress, EndingAddress
5. Sets the "Change" property to "Snapshot" always
Revision History:
Ghim Sim Chua (gschua) 04/27/99
- Created
Kalyani Narlanka kalyanin
- Added ServiceName, IPAddress, IPSubnet, DefaultIPGateway, DHCPEnabled,
MACAddress 05/03/99
- Added IRQNumber and PORT Resource 07/08 /99
*******************************************************************************/
#include "pchealth.h"
#include "PCH_NetworkAdapter.h"
///////////////////////////////////////////////////////////////////////////////
// Begin Tracing stuff
//
#ifdef THIS_FILE
#undef THIS_FILE
#endif
static char __szTraceSourceFile[] = __FILE__;
#define THIS_FILE __szTraceSourceFile
#define TRACE_ID DCID_NETWORKADAPTER
//
// End Tracing stuff
///////////////////////////////////////////////////////////////////////////////
//
CPCH_NetworkAdapter MyPCH_NetworkAdapterSet (PROVIDER_NAME_PCH_NETWORKADAPTER, PCH_NAMESPACE) ;
///////////////////////////////////////////////////////////////////////////////
//....Properties of PCHNetworkAdapter Class
//
const static WCHAR* pAdapterType = L"AdapterType" ;
const static WCHAR* pTimeStamp = L"TimeStamp" ;
const static WCHAR* pChange = L"Change" ;
// const static WCHAR* pDefaultIPGateway = L"DefaultIPGateway" ;
const static WCHAR* pDeviceID = L"DeviceID" ;
const static WCHAR* pDHCPEnabled = L"DHCPEnabled" ;
const static WCHAR* pIOPort = L"IOPort" ;
// const static WCHAR* pIPAddress = L"IPAddress" ;
// const static WCHAR* pIPSubnet = L"IPSubnet" ;
const static WCHAR* pIRQNumber = L"IRQNumber" ;
// const static WCHAR* pMACAddress = L"MACAddress" ;
const static WCHAR* pProductName = L"ProductName" ;
// const static WCHAR* pServiceName = L"ServiceName" ;
//
///////////////////////////////////////////////////////////////////////////////
//*****************************************************************************
//
// Function Name : CPCH_NetworkAdapter::EnumerateInstances
//
// Input Parameters : pMethodContext : Pointer to the MethodContext for
// communication with WinMgmt.
//
// lFlags : Long that contains the flags described
// in IWbemServices::CreateInstanceEnumAsync
// Note that the following flags are handled
// by (and filtered out by) WinMgmt:
// WBEM_FLAG_DEEP
// WBEM_FLAG_SHALLOW
// WBEM_FLAG_RETURN_IMMEDIATELY
// WBEM_FLAG_FORWARD_ONLY
// WBEM_FLAG_BIDIRECTIONAL
// Output Parameters : None
//
// Returns : WBEM_S_NO_ERROR
//
//
// Synopsis : All instances of this class on the machine are returned.
// If there are no instances returns WBEM_S_NO_ERROR.
// It is not an error to have no instances.
//
//
//*****************************************************************************
HRESULT CPCH_NetworkAdapter::EnumerateInstances(MethodContext* pMethodContext,
long lFlags)
{
TraceFunctEnter("CPCH_NetworkAdapter::EnumerateInstances");
// Begin Declarations...................................................
HRESULT hRes = WBEM_S_NO_ERROR;
REFPTRCOLLECTION_POSITION posList;
// Instances
CComPtr<IEnumWbemClassObject> pNetworkAdapterEnumInst;
CComPtr<IEnumWbemClassObject> pNetworkAdapterConfigurationEnumInst;
CComPtr<IEnumWbemClassObject> pAllocatedResourceEnumInst;
CComPtr<IEnumWbemClassObject> pPortResourceEnumInst;
// PCH_NetworkAdapter Class instance
CInstancePtr pPCHNetworkAdapterInstance;
// Objects
IWbemClassObjectPtr pNetworkAdapterObj;
IWbemClassObjectPtr pNetworkAdapterConfigurationObj;
IWbemClassObjectPtr pAllocatedResourceObj;
IWbemClassObjectPtr pPortResourceObj;
// Variants
CComVariant varIndex;
CComVariant varDeviceID;
CComVariant varAntecedent;
CComVariant varPortResource;
CComVariant varName;
CComVariant varIRQNumber;
// Return Values;
ULONG ulNetworkAdapterRetVal = 0;
ULONG ulNetworkAdapterConfigurationRetVal = 0;
ULONG ulAllocatedResourceRetVal = 0;
ULONG ulPortResourceRetVal = 0;
// Query Strings
CComBSTR bstrNetworkAdapterQuery = L"Select AdapterType, DeviceID, ProductName, Index FROM win32_NetworkAdapter";
CComBSTR bstrNetworkAdapterConfigurationQuery = L"Select ServiceName, IPAddress, IPSubnet, DefaultIPGateway, DHCPEnabled, MACAddress, Index FROM Win32_NetworkAdapterConfiguration WHERE Index=";
CComBSTR bstrAllocatedResourceQuery = L"SELECT Antecedent, Dependent FROM Win32_AllocatedResource WHERE Dependent=\"Win32_NetworkAdapter.DeviceID=\\\"";
CComBSTR bstrPortResourceQuery = L"Select StartingAddress, Name FROM Win32_PortResource WHERE ";
// Other Query Strings
CComBSTR bstrNetworkAdapterConfigurationQueryString;
CComBSTR bstrAllocatedResourceQueryString;
CComBSTR bstrPortResourceQueryString;
// Other Strings
CComBSTR bstrPropertyAntecedent = L"antecedent";
CComBSTR bstrPropertyName = L"Name";
CComBSTR bstrIndex = L"Index";
CComBSTR bstrDeviceID = L"DeviceID";
CComBSTR bstrResult;
// SystemTime
SYSTEMTIME stUTCTime;
// Integers
int i;
int nIRQLen;
int nIter;
// Pattern Strings
LPCSTR strIRQPattern = "Win32_IRQResource.IRQNumber=";
LPCSTR strPortPattern = "Win32_PortResource.StartingAddress=";
LPCSTR strPortPattern2 = "Win32_PortResource.";
// Chars
LPSTR strSource;
LPSTR pDest;
BOOL fValidInt;
// End Declarations...................................................
// Should take care of memory allocation failure for CComBSTRs
// Get the date and time to update the TimeStamp Field
GetSystemTime(&stUTCTime);
//
// Execute the query to get "AdapterType", "DeviceID", "Name" and "Index"
// from Win32_NetworkAdapter Class.
// "Index" is required as it is the common property between
// Win32_NetworkAdapter and Win32_NetworkAdapterConfiguration
// pNetworkAdapterEnumInst contains a pointer to the list of instances returned.
//
hRes = ExecWQLQuery(&pNetworkAdapterEnumInst, bstrNetworkAdapterQuery);
if (FAILED(hRes))
{
// Cannot get any properties.
goto END;
}
// Query Succeeded!
// Enumerate the instances from pNetworkAdapterEnumInst.
// Get the next instance into pNetworkAdapterObj object.
while(WBEM_S_NO_ERROR == pNetworkAdapterEnumInst->Next(WBEM_INFINITE, 1, &pNetworkAdapterObj, &ulNetworkAdapterRetVal))
{
// Create a new instance of PCH_NetworkAdapter Class based on the passed-in MethodContext
CInstancePtr pPCHNetworkAdapterInstance(CreateNewInstance(pMethodContext), false);
// Created a New Instance of PCH_NetworkAdapter Successfully.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// TIME STAMP //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
hRes = pPCHNetworkAdapterInstance->SetDateTime(pTimeStamp, WBEMTime(stUTCTime));
if (FAILED(hRes))
{
// Could not Set the Time Stamp
// Continue anyway
ErrorTrace(TRACE_ID, "SetDateTime on Timestamp Field failed.");
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CHANGE //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
hRes = pPCHNetworkAdapterInstance->SetCHString(pChange, L"Snapshot");
if (FAILED(hRes))
{
// Could not Set the Change Property
// Continue anyway
ErrorTrace(TRACE_ID, "SetCHString on Change Field failed.");
}
// Copy the following properties from win32_NetworkAdapter class Instance
// TO PCH_NetworkAdapter class Instance.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ADAPTERTYPE //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
CopyProperty(pNetworkAdapterObj, L"AdapterType", pPCHNetworkAdapterInstance, pAdapterType);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// DEVICEID //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
CopyProperty(pNetworkAdapterObj, L"DeviceID", pPCHNetworkAdapterInstance, pDeviceID);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// PRODUCTNAME //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
CopyProperty(pNetworkAdapterObj, L"ProductName", pPCHNetworkAdapterInstance, pProductName);
/*
Because of Bug : 100158 , regarding dropping all the privacy related properties,
the foll. properties need to be dropped :
ServiceName, IPAddress, IPSubnet, DefaultIPGateway, MACAddress
*/
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// INDEX //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Get the "Index" property from the current instance Object
// Index is the common property between NetworkAdapter and NetworkAdapterConfiguration.
hRes = pNetworkAdapterObj->Get(bstrIndex, 0, &varIndex, NULL, NULL);
if (FAILED(hRes))
{
// Cannot get index.
// Without Index Cannot get any properties from Win32_NetworkAdapterConfiguration Class
ErrorTrace(TRACE_ID, "GetVariant on Index Field failed.");
}
else
{
// Got the index. Now we are ready to get the properties from Win32_NetworkAdapterConfiguration Class
// With "index" as the key get the corresponding NetworkAdapterConfiguration instance
// Make Sure Index is of Type VT_I4 i.e. long
// Convert the Index to type VT_I4
hRes = varIndex.ChangeType(VT_I4, NULL);
if FAILED(hRes)
{
// Not of type VT_I4 So there is no way to get the Corresponding
// NetworkAdapter Configuration instance
}
else
{
// index of expected Type. Get the corr. NetworkAdapterConfiguration instance
// Append the "index" to the Query String
bstrNetworkAdapterConfigurationQueryString = bstrNetworkAdapterConfigurationQuery;
// Change varIndex to BSTR type so that it can be appended
varIndex.ChangeType(VT_BSTR, NULL);
bstrNetworkAdapterConfigurationQueryString.Append(V_BSTR(&varIndex));
// Execute the query to get "ServiceName", "IPAddress", "IPSubnet",
// "DefaultIPGateway", "DHCPEnabled", "MACAddress", "Index"
// from Win32_NetworkAdapter Configuration Class.
// pNetworkAdapterConfigurationEnumInst contains a pointer to the instance returned.
hRes = ExecWQLQuery(&pNetworkAdapterConfigurationEnumInst,bstrNetworkAdapterConfigurationQueryString);
if (FAILED(hRes))
{
// Query failed!! Cannot Copy Values.
}
else
{
// Query Succeeded. Get the Instance Object
if (WBEM_S_NO_ERROR == pNetworkAdapterConfigurationEnumInst->Next(WBEM_INFINITE, 1, &pNetworkAdapterConfigurationObj, &ulNetworkAdapterConfigurationRetVal))
{
// Copy the following properties from win32_NetworkAdapterConfiguration
// class Instance TO PCH_NetworkAdapter class Instance.
/*
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SERVICENAME //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
CopyProperty(pNetworkAdapterConfigurationObj, L"ServiceName", pPCHNetworkAdapterInstance, pServiceName);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// IPADDRESS //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
CopyProperty(pNetworkAdapterConfigurationObj, L"IPAddress", pPCHNetworkAdapterInstance, pIPAddress);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// IPSUBNET //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
CopyProperty(pNetworkAdapterConfigurationObj, L"IPSubnet", pPCHNetworkAdapterInstance, pIPSubnet);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// DEFAULTIPGATEWAY //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
CopyProperty(pNetworkAdapterConfigurationObj, L"DefaultIPGateway", pPCHNetworkAdapterInstance, pDefaultIPGateway);
*/
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// DHCPENABLED //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
CopyProperty(pNetworkAdapterConfigurationObj, L"DHCPEnabled", pPCHNetworkAdapterInstance, pDHCPEnabled);
/*
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// MACADDRESS //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
CopyProperty(pNetworkAdapterConfigurationObj, L"MACAddress", pPCHNetworkAdapterInstance, pMACAddress);
*/
} //end of if pNetworkAdapterConfigurationEnumInst....
} // end of else query succeeded
} // end of else got the index
} // end of else got the index
// Get the resources from Win32_AllocatedResource
// Update the Query String with the Device ID Property.
bstrAllocatedResourceQueryString = bstrAllocatedResourceQuery;
hRes = pNetworkAdapterObj->Get(bstrDeviceID, 0, &varDeviceID, NULL, NULL);
if (FAILED(hRes))
{
// Current Instance object no longer required.
// hRes = pNetworkAdapterObj->Release();
if (FAILED(hRes))
{
// Unable to realease the Object
ErrorTrace(TRACE_ID, "GetVariant on DeviceID Field while calculating IRQ and PORT Resource failed!");
}
// Cannot get DeviceID
ErrorTrace(TRACE_ID, "GetVariant on DeviceID Field while calculating IRQ and PORT Resource failed!");
} // end of cannot get the DeviceId
else
{
// Current Instance object no longer required.
// hRes = pNetworkAdapterObj->Release();
if (FAILED(hRes))
{
// Unable to realease the Object
ErrorTrace(TRACE_ID, "GetVariant on DeviceID Field while calculating IRQ and PORT Resource failed!");
}
// Got the DeviceID
// Convert the DeviceID to type VT_BSTR
hRes = varDeviceID.ChangeType(VT_BSTR, NULL);
if FAILED(hRes)
{
// Cannot get the DeviceID value. So there is no way to get the Corresponding
// IRQ and PORT Resources.
} // end of FAILED hRes , Cannot get the DeviceID Value
else
{
// Got the DeviceID value. Update the Query string with this value.
_ASSERT(varDeviceID.vt == VT_BSTR);
bstrAllocatedResourceQueryString.Append(V_BSTR(&varDeviceID));
// Append "///" to the QueryString.
bstrAllocatedResourceQueryString.Append("\\\"\"");
// The Query string is formed, get the antecedent instances
// Added the following line because you need to clear the CComPtr before you query the second time.
pAllocatedResourceEnumInst = NULL;
hRes = ExecWQLQuery(&pAllocatedResourceEnumInst, bstrAllocatedResourceQueryString);
if (FAILED(hRes))
{
// Query failed!! Cannot get the Resources.
// Continue anyway
}
else
{
// Get the "antecedent" value.
// Query Succeeded. Get the Instance Object
// Get all the instances of Win32_AllocatedResource applicable
while(WBEM_S_NO_ERROR == pAllocatedResourceEnumInst->Next(WBEM_INFINITE, 1, &pAllocatedResourceObj, &ulAllocatedResourceRetVal))
{
hRes = pAllocatedResourceObj->Get(bstrPropertyAntecedent, 0, &varAntecedent, NULL, NULL);
if (FAILED(hRes))
{
// Could not get the antecedent
ErrorTrace(TRACE_ID, "GetVariant on Win32_AllocatedResource:Antecedent Field failed.");
} //end of if FAILED(pAllocatedResourceObj->Get..antecedent
else
{
// Got the antecedent
// varAntecedent set to antecedent. Copy this to bstrResult
varAntecedent.ChangeType(VT_BSTR, NULL);
{
USES_CONVERSION;
strSource = OLE2A(varAntecedent.bstrVal);
}
// Check if it is IRQ Resource by comparing with the known pattern of IRQ Resource
pDest = strstr(strSource,strIRQPattern);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// IRQ Number //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(pDest != NULL)
{
// This is IRQ Resource instance
// Can get the IRQ Number
// Advance the pointer to the end of the pattern so the pointer is
// positioned at IRQ Number
pDest += lstrlen(strIRQPattern);
// First verify that the given string is a valid integer.
nIRQLen = lstrlen(pDest);
fValidInt = TRUE;
for(nIter = 0; nIter <nIRQLen; nIter++)
{
if (_istdigit(pDest[nIter]) == 0)
{
fValidInt = FALSE;
break;
}
}
if(fValidInt)
{
// Convert the IRQ Number that you get as string to a long
varIRQNumber = atol(pDest);
// Set the IRQ Number as a variant
hRes = pPCHNetworkAdapterInstance->SetVariant(pIRQNumber, varIRQNumber);
if (!hRes)
{
ErrorTrace(TRACE_ID, "SetVariant on win32_AllocatedResource.IRQ Number Failed!");
// Proceed Anyway
}
}
} // end of if pDest != NULL
else
{
// This is not IRQ Resource
} // end of else pDest != NULL
// Check if it is PORT Resource
pDest = strstr(strSource,strPortPattern);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// PORTRESOURCE //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(pDest != NULL)
{
// This is PORT Resource instance
// Can get the PORT Resource Starting Address
// Advance the pointer to the end of the pattern so the pointer is
// positioned at "Win32_PortResource...." Portion
pDest += lstrlen(strPortPattern2);
// Formulate the Query String
bstrPortResourceQueryString = bstrPortResourceQuery;
bstrPortResourceQueryString.Append(pDest);
// At this point the WQL Query can be used to get the win32_portResource Instance.
hRes = ExecWQLQuery(&pPortResourceEnumInst, bstrPortResourceQueryString);
if (FAILED(hRes))
{
// Query failed!! Cannot get the PORT Resources.
// Continue anyway!
}
else
{
// Query Succeeded. Get the Instance Object
if(WBEM_S_NO_ERROR == pPortResourceEnumInst->Next(WBEM_INFINITE, 1, &pPortResourceObj, &ulPortResourceRetVal))
{
// Get the Name
hRes = pPortResourceObj->Get(bstrPropertyName, 0, &varName, NULL, NULL);
if (FAILED(hRes))
{
// Could not get the Name
ErrorTrace(TRACE_ID, "GetVariant on Win32_PortResource: Field failed.");
} //end of if FAILED(pPortResourceObj->Get..Name
else
{
// Got the Name
// This is the PORT Address. Set the Value
if (!pPCHNetworkAdapterInstance->SetVariant(pIOPort, varName))
{
ErrorTrace(TRACE_ID, "SetVariant on win32_AllocatedResource.PortAddress Failed!");
}
else
{
// Port Address is set.
}
} // end of else FAILED(pPortResourceObj->Get..Name
// Got the Name. Nothing more to do.
} //end of if WBEM_S_NO_ERROR
else
{
// Cannot get the Instance Object
// Cannot get the PORT Adresses.
} //end of else WBEM_S_NO_ERROR
} //end of else FAILED(hRes)
} //end of if pDest!= NULL
else
{
// Not a PORT Resource Instance
} //end of else pDest!= NULL
} ////end of else FAILED(pAllocatedResourceObj->Get..antecedent
}// end of while pAllocatedResourceEnumInst....
} // end of else FAILED(hRes) got the Antecedent Value
} // end of else FAILED(hRes) , got the DeviceID Value
} // end of else got the DeviceID
// Get the resources from Win32_AllocatedResource END
// All the properties in pPCHNetworkAdapterInstance are set
hRes = pPCHNetworkAdapterInstance->Commit();
if (FAILED(hRes))
{
// Cannot commit the Instance
ErrorTrace(TRACE_ID, "Commit on Instance failed.");
} // end of if FAILED(hRes)
} //end of while pEnumInst....
END :
TraceFunctLeave();
return hRes ;
}