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
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 ;
|
|
}
|