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.
444 lines
19 KiB
444 lines
19 KiB
/********************************************************************
|
|
|
|
Copyright (c) 1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
PCH_BIOS.CPP
|
|
|
|
Abstract:
|
|
WBEM provider class implementation for PCH_BIOS class
|
|
|
|
Revision History:
|
|
|
|
Ghim-Sim Chua (gschua) 05/05/99
|
|
- Created
|
|
|
|
Kalyani Narlanka (kalyanin) 05/12/99
|
|
- Added Code to get all the properties of this class
|
|
|
|
Kalyani Narlanka (kalyanin) 05/18/99
|
|
|
|
|
|
********************************************************************/
|
|
|
|
#include "pchealth.h"
|
|
#include "PCH_BIOS.h"
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// tracing stuff
|
|
|
|
#ifdef THIS_FILE
|
|
#undef THIS_FILE
|
|
#endif
|
|
static char __szTraceSourceFile[] = __FILE__;
|
|
#define THIS_FILE __szTraceSourceFile
|
|
#define TRACE_ID DCID_BIOS
|
|
|
|
CPCH_BIOS MyPCH_BIOSSet (PROVIDER_NAME_PCH_BIOS, PCH_NAMESPACE) ;
|
|
|
|
// Property names
|
|
//===============
|
|
const static WCHAR* pBIOSDate = L"BIOSDate" ;
|
|
const static WCHAR* pBIOSName = L"BIOSName" ;
|
|
const static WCHAR* pBIOSVersion = L"BIOSVersion" ;
|
|
const static WCHAR* pCPU = L"CPU" ;
|
|
const static WCHAR* pINFName = L"INFName" ;
|
|
const static WCHAR* pMachineType = L"MachineType" ;
|
|
const static WCHAR* pDriver = L"Driver" ;
|
|
const static WCHAR* pDriverDate = L"DriverDate" ;
|
|
const static WCHAR* pChange = L"Change";
|
|
const static WCHAR* pTimeStamp = L"TimeStamp";
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* FUNCTION : CPCH_BIOS::EnumerateInstances
|
|
*
|
|
* DESCRIPTION : Returns the instance of this class
|
|
*
|
|
* INPUTS : A pointer to the MethodContext for communication with WinMgmt.
|
|
* A 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
|
|
*
|
|
* RETURNS : WBEM_S_NO_ERROR if successful
|
|
*
|
|
* SYSNOPSIS : There is only instance of this class at any time. This function gives this
|
|
* instance.
|
|
* If there are no instances, returns WBEM_S_NO_ERROR.
|
|
* It is not an error to have no instances.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT CPCH_BIOS::EnumerateInstances ( MethodContext* pMethodContext, long lFlags )
|
|
{
|
|
|
|
// Begin Declarations
|
|
//
|
|
|
|
TraceFunctEnter("CPCH_BIOS::EnumerateInstances");
|
|
|
|
HRESULT hRes = WBEM_S_NO_ERROR;
|
|
HRESULT hRes1;
|
|
HRESULT hRes2;
|
|
|
|
// Query String
|
|
|
|
CComBSTR bstrBIOSQuery = L"Select Name, ReleaseDate, Version FROM win32_BIOS";
|
|
CComBSTR bstrProcessorQuery = L"Select DeviceId, Name FROM win32_processor";
|
|
CComBSTR bstrComputerSystemQuery = L"Select Name, Description FROM win32_computerSystem";
|
|
CComBSTR bstrDriver;
|
|
|
|
// Registry Hive where BIOS Info is stored
|
|
LPCTSTR lpctstrSystemHive = _T("System\\CurrentControlSet\\Services\\Class\\System");
|
|
|
|
// Registry Names of interest
|
|
LPCTSTR lpctstrDriverDesc = _T("DriverDesc");
|
|
LPCTSTR lpctstrINFName = _T("INFPath");
|
|
LPCTSTR lpctstrDriverDate = _T("DriverDate");
|
|
LPCTSTR lpctstrSystem = _T("System\\");
|
|
|
|
// Property Names
|
|
LPCWSTR lpctstrReleaseDate = L"ReleaseDate";
|
|
LPCWSTR lpctstrName = L"Name";
|
|
LPCWSTR lpctstrVersion = L"Version";
|
|
LPCWSTR lpctstrDescription = L"Description";
|
|
LPCTSTR lpctstrSystemBoard = _T("System Board");
|
|
|
|
// Strings
|
|
TCHAR tchSubSystemKeyName[MAX_PATH];
|
|
TCHAR tchDriverDescValue[MAX_PATH];
|
|
TCHAR tchDriverDateValue[MAX_PATH];
|
|
TCHAR tchINFNameValue[MAX_PATH];
|
|
|
|
|
|
// Instances
|
|
CComPtr<IEnumWbemClassObject> pBIOSEnumInst;
|
|
CComPtr<IEnumWbemClassObject> pProcessorEnumInst;
|
|
CComPtr<IEnumWbemClassObject> pComputerSystemEnumInst;
|
|
|
|
// Instances
|
|
// CInstancePtr pPCHBIOSInstance;
|
|
|
|
// Objects
|
|
IWbemClassObjectPtr pBIOSObj; // BUGBUG : WMI asserts if we use CComPtr
|
|
IWbemClassObjectPtr pProcessorObj; // BUGBUG : WMI asserts if we use CComPtr
|
|
IWbemClassObjectPtr pComputerSystemObj; // BUGBUG : WMI asserts if we use CComPtr
|
|
|
|
// Variants
|
|
CComVariant varDriver;
|
|
CComVariant varDriverDate;
|
|
CComVariant varINFName;
|
|
CComVariant varSnapshot = "SnapShot";
|
|
|
|
// Unsigned Longs....
|
|
ULONG ulBIOSRetVal = 0;
|
|
ULONG ulProcessorRetVal = 0;
|
|
ULONG ulComputerSystemRetVal = 0;
|
|
|
|
LONG lRegRetVal;
|
|
|
|
// SystemTime
|
|
SYSTEMTIME stUTCTime;
|
|
|
|
// Registry Keys
|
|
HKEY hkeySystem;
|
|
HKEY hkeySubSystem;
|
|
|
|
// DWORDs
|
|
DWORD dwIndex = 0;
|
|
DWORD dwSize = MAX_PATH;
|
|
DWORD dwType;
|
|
|
|
// Boolean
|
|
BOOL fContinueEnum = FALSE;
|
|
BOOL fCommit = FALSE;
|
|
|
|
// FileTime
|
|
PFILETIME pFileTime = NULL;
|
|
|
|
// End Declarations
|
|
|
|
|
|
// Create a new instance of PCH_BIOS Class based on the passed-in MethodContext
|
|
CInstancePtr pPCHBIOSInstance(CreateNewInstance(pMethodContext), false);
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// TIME STAMP //
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Get the date and time to update the TimeStamp Field
|
|
GetSystemTime(&stUTCTime);
|
|
|
|
hRes = pPCHBIOSInstance->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 = pPCHBIOSInstance->SetVariant(pChange, varSnapshot);
|
|
if (FAILED(hRes))
|
|
{
|
|
// Could not Set the Change Property
|
|
// Continue anyway
|
|
ErrorTrace(TRACE_ID, "Set Variant on Change Field failed.");
|
|
}
|
|
|
|
// Execute the query to get Name, ReleaseDate, Version FROM Win32_BIOS
|
|
// Class.
|
|
|
|
// pBIOSEnumInst contains a pointer to the instance returned.
|
|
|
|
hRes = ExecWQLQuery(&pBIOSEnumInst, bstrBIOSQuery );
|
|
if (SUCCEEDED(hRes))
|
|
{
|
|
// Query Succeeded!
|
|
|
|
// Get the instance Object.
|
|
if((pBIOSEnumInst->Next(WBEM_INFINITE, 1, &pBIOSObj, &ulBIOSRetVal)) == WBEM_S_NO_ERROR)
|
|
{
|
|
|
|
// Get Name, Date and Version
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// BIOSDATE //
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
CopyProperty(pBIOSObj, lpctstrReleaseDate, pPCHBIOSInstance, pBIOSDate);
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// BIOSNAME //
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
hRes = CopyProperty(pBIOSObj, lpctstrName, pPCHBIOSInstance, pBIOSName);
|
|
if(SUCCEEDED(hRes))
|
|
{
|
|
fCommit = TRUE;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// BIOSVERSION //
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
CopyProperty(pBIOSObj, lpctstrVersion, pPCHBIOSInstance, pBIOSVersion);
|
|
|
|
}
|
|
|
|
}
|
|
// Done with Win32_BIOS Class
|
|
|
|
// Now query Win32_Processor Class to get "CPU" property
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// CPU //
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
hRes = ExecWQLQuery(&pProcessorEnumInst, bstrProcessorQuery);
|
|
if (SUCCEEDED(hRes))
|
|
{
|
|
// Query Succeeded!
|
|
|
|
// Get the instance Object.
|
|
if((pProcessorEnumInst->Next(WBEM_INFINITE, 1, &pProcessorObj, &ulProcessorRetVal)) == WBEM_S_NO_ERROR)
|
|
{
|
|
|
|
// Get Name
|
|
|
|
CopyProperty(pProcessorObj, lpctstrName, pPCHBIOSInstance, pCPU);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// MACHINETYPE //
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
hRes = ExecWQLQuery(&pComputerSystemEnumInst, bstrComputerSystemQuery);
|
|
if (SUCCEEDED(hRes))
|
|
{
|
|
// Query Succeeded!
|
|
|
|
// Get the instance Object.
|
|
if((pComputerSystemEnumInst->Next(WBEM_INFINITE, 1, &pComputerSystemObj, &ulComputerSystemRetVal)) == WBEM_S_NO_ERROR)
|
|
{
|
|
|
|
// Get "Description"
|
|
|
|
CopyProperty(pComputerSystemObj, lpctstrDescription, pPCHBIOSInstance, pMachineType);
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
// Get the remaining properties i.e. INFName, Driver and DriverDate from the Registry
|
|
// This is present in one of the keys under the HIVE "HKLM\System\CCS\Services\Class\System"
|
|
// Enumerate keys under this hive until the regname "DeviceDesc" equals "System Board"
|
|
|
|
// Once you hit "DeviceDesc" = "System Board" get the INFpath, Driver
|
|
// DriverDate from there.
|
|
|
|
lRegRetVal = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpctstrSystemHive, 0, KEY_READ, &hkeySystem);
|
|
if(lRegRetVal == ERROR_SUCCESS)
|
|
{
|
|
// Opened the Registry key.
|
|
// Enumerate the keys under this hive. One of the keys has
|
|
// DeviceDesc = "system Board".
|
|
|
|
lRegRetVal = RegEnumKeyEx(hkeySystem, dwIndex, tchSubSystemKeyName, &dwSize, NULL, NULL, NULL, pFileTime);
|
|
if(lRegRetVal == ERROR_SUCCESS)
|
|
{
|
|
fContinueEnum = TRUE;
|
|
}
|
|
while(fContinueEnum)
|
|
{
|
|
|
|
// Open the SubKey.
|
|
lRegRetVal = RegOpenKeyEx(hkeySystem, tchSubSystemKeyName, 0, KEY_READ, &hkeySubSystem);
|
|
if(lRegRetVal == ERROR_SUCCESS)
|
|
{
|
|
// Opened the SubKey
|
|
// Query for , regname "DriverDesc "
|
|
dwSize = MAX_PATH;
|
|
lRegRetVal = RegQueryValueEx(hkeySubSystem, lpctstrDriverDesc , NULL, &dwType, (LPBYTE)tchDriverDescValue, &dwSize);
|
|
if(lRegRetVal == ERROR_SUCCESS)
|
|
{
|
|
// Compare if the value is equal to "System Board"
|
|
if(_tcsicmp(tchDriverDescValue, lpctstrSystemBoard) == 0)
|
|
{
|
|
// The following statements could
|
|
try
|
|
{
|
|
// Found the Right DriverDesc
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// DRIVER //
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Driver = system+lptstrSubSystemKeyName
|
|
bstrDriver = lpctstrSystem;
|
|
bstrDriver.Append(tchSubSystemKeyName);
|
|
varDriver = bstrDriver.Copy();
|
|
hRes2 = pPCHBIOSInstance->SetVariant(pDriver, varDriver);
|
|
if(FAILED(hRes2))
|
|
{
|
|
// Could not Set the DRIVER Property
|
|
// Continue anyway
|
|
ErrorTrace(TRACE_ID, "Set variant on Driver Failed.");
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// DRIVERDATE //
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Query for DriverDate
|
|
dwSize = MAX_PATH;
|
|
lRegRetVal = RegQueryValueEx(hkeySubSystem, lpctstrDriverDate, NULL, &dwType, (LPBYTE)tchDriverDescValue, &dwSize);
|
|
if(lRegRetVal == ERROR_SUCCESS)
|
|
{
|
|
// Set the DriverDate
|
|
varDriverDate = tchDriverDescValue;
|
|
hRes2 = pPCHBIOSInstance->SetVariant(pDriverDate, varDriverDate);
|
|
if(FAILED(hRes2))
|
|
{
|
|
// Could not Set the DRIVERDATE Property
|
|
// Continue anyway
|
|
ErrorTrace(TRACE_ID, "Set variant on DriverDate Failed.");
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// INFNAME //
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Query for INFName
|
|
dwSize = MAX_PATH;
|
|
lRegRetVal = RegQueryValueEx(hkeySubSystem, lpctstrINFName, NULL, &dwType, (LPBYTE)tchINFNameValue, &dwSize);
|
|
if(lRegRetVal == ERROR_SUCCESS)
|
|
{
|
|
// Set the INFName
|
|
varINFName = tchINFNameValue;
|
|
hRes2 = pPCHBIOSInstance->SetVariant(pINFName, varINFName);
|
|
if(FAILED(hRes2))
|
|
{
|
|
// Could not Set the INFNAME Property
|
|
// Continue anyway
|
|
ErrorTrace(TRACE_ID, "Set variant on INFNAME Property Failed.");
|
|
}
|
|
|
|
}
|
|
|
|
// Need not enumerate the rest of the keys
|
|
fContinueEnum = FALSE;
|
|
}
|
|
catch(...)
|
|
{
|
|
lRegRetVal = RegCloseKey(hkeySubSystem);
|
|
lRegRetVal = RegCloseKey(hkeySystem);
|
|
throw;
|
|
}
|
|
|
|
} // end of strcmp
|
|
|
|
} // end of Succeeded hRes2
|
|
// Close the Opened Regkey
|
|
lRegRetVal = RegCloseKey(hkeySubSystem);
|
|
if(lRegRetVal != ERROR_SUCCESS)
|
|
{
|
|
// Could not close the reg Key
|
|
ErrorTrace(TRACE_ID, "RegClose Sub Key Failed.");
|
|
}
|
|
|
|
}
|
|
// Check to see if further enumeration is required.
|
|
// continue to enumerate.
|
|
if(fContinueEnum)
|
|
{
|
|
dwSize = MAX_PATH;
|
|
dwIndex++;
|
|
lRegRetVal = RegEnumKeyEx(hkeySystem, dwIndex, tchSubSystemKeyName, &dwSize, NULL, NULL, NULL, pFileTime);
|
|
if(lRegRetVal != ERROR_SUCCESS)
|
|
{
|
|
fContinueEnum = FALSE;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
} // end of while
|
|
lRegRetVal = RegCloseKey(hkeySystem);
|
|
if(lRegRetVal != ERROR_SUCCESS)
|
|
{
|
|
// Could not close the reg Key
|
|
ErrorTrace(TRACE_ID, "RegClose Key Failed.");
|
|
}
|
|
}
|
|
|
|
// Got all the properties for PCH_BIOS Class
|
|
|
|
if(fCommit)
|
|
{
|
|
hRes = pPCHBIOSInstance->Commit();
|
|
if(FAILED(hRes))
|
|
{
|
|
// Could not Commit the instance
|
|
ErrorTrace(TRACE_ID, "Commit on PCHBiosInstance Failed");
|
|
}
|
|
}
|
|
|
|
TraceFunctLeave();
|
|
return hRes ;
|
|
|
|
}
|