|
|
//=============================================================================
// Contains the refresh functions for the resource categories.
//=============================================================================
#include "stdafx.h"
#include "category.h"
#include "dataset.h"
#include "wmiabstraction.h"
//-----------------------------------------------------------------------------
// This function gathers CODEC (audio and video) information.
//-----------------------------------------------------------------------------
HRESULT CODECs(CWMIHelper * pWMI, DWORD dwIndex, volatile BOOL * pfCancel, CPtrList * aColValues, int iColCount, void ** ppCache) { ASSERT(pWMI == NULL || aColValues); if (pWMI == NULL) return S_OK;
HRESULT hr = S_OK;
CWMIObjectCollection * pCollection = NULL; CString strGroup = (dwIndex == CODEC_AUDIO) ? _T("Audio") : _T("Video"); LPCTSTR szProperties = _T("EightDotThreeFileName, Manufacturer, Description, Status, Name, Version, FileSize, CreationDate, Group");
hr = pWMI->Enumerate(_T("Win32_CODECFile"), &pCollection, szProperties); if (SUCCEEDED(hr)) { CWMIObject * pObject = NULL; while (S_OK == pCollection->GetNext(&pObject)) if (strGroup.CompareNoCase(pObject->GetString(_T("Group"))) == 0) pWMI->AddObjectToOutput(aColValues, iColCount, pObject, szProperties, IDS_CODEC1);
delete pObject; delete pCollection; }
return hr; }
//-----------------------------------------------------------------------------
// This function gathers Drive information.
//-----------------------------------------------------------------------------
HRESULT ComponentDrives(CWMIHelper * pWMI, DWORD dwIndex, volatile BOOL * pfCancel, CPtrList * aColValues, int iColCount, void ** ppCache) { ASSERT(pWMI == NULL || aColValues); if (pWMI == NULL) return S_OK;
HRESULT hr = S_OK;
// Get all of the logical drives. There should be at most 26 of them, since they're limited
// by drive letter assignments.
CWMIObject * apDriveObjects[26]; ::ZeroMemory(apDriveObjects, sizeof(CWMIObject *) * 26); CWMIObjectCollection * pCollection = NULL; hr = pWMI->Enumerate(_T("Win32_LogicalDisk"), &pCollection, _T("DriveType, DeviceID, Description, Compressed, FileSystem, Size, FreeSpace, VolumeName, VolumeSerialNumber, PNPDeviceID, ProviderName")); if (SUCCEEDED(hr)) { CWMIObject * pObject = NULL; while (S_OK == pCollection->GetNext(&pObject)) { CString strDeviceID = pObject->GetString(_T("DeviceID")); if (!strDeviceID.IsEmpty()) { strDeviceID.MakeUpper(); TCHAR chDriveLetter = strDeviceID[0]; if (chDriveLetter >= _T('A') && chDriveLetter <= _T('Z')) apDriveObjects[chDriveLetter - _T('A')] = pObject; else delete pObject; } else delete pObject; pObject = NULL; } delete pCollection; }
for (int index = 0; index < 26; index++) if (apDriveObjects[index]) { DWORD dwType; if (SUCCEEDED(apDriveObjects[index]->GetValueDWORD(_T("DriveType"), &dwType))) { // Depending on the type of the drive, display different information.
switch (dwType) { case 2: pWMI->AppendBlankLine(aColValues, iColCount); pWMI->AddObjectToOutput(aColValues, iColCount, apDriveObjects[index], _T("DeviceID, Description"), IDS_DRIVESTYPE2); break;
case 3: pWMI->AppendBlankLine(aColValues, iColCount); pWMI->AddObjectToOutput(aColValues, iColCount, apDriveObjects[index], _T("DeviceID, Description, Compressed, MSIAdvancedFileSystem, Size, FreeSpace, MSIAdvancedVolumeName, MSIAdvancedVolumeSerialNumber, MSIAdvancedPNPDeviceID"), IDS_DRIVESTYPE3); break;
case 4: pWMI->AppendBlankLine(aColValues, iColCount); pWMI->AddObjectToOutput(aColValues, iColCount, apDriveObjects[index], _T("DeviceID, Description, ProviderName"), IDS_DRIVESTYPE4); break;
case 5: pWMI->AppendBlankLine(aColValues, iColCount); pWMI->AddObjectToOutput(aColValues, iColCount, apDriveObjects[index], _T("DeviceID, Description"), IDS_DRIVESTYPE2); break; } }
delete apDriveObjects[index]; }
return hr; }
//-----------------------------------------------------------------------------
// This function gathers WinSock information.
//-----------------------------------------------------------------------------
HRESULT Winsock(CWMIHelper * pWMI, DWORD dwIndex, volatile BOOL * pfCancel, CPtrList * aColValues, int iColCount, void ** ppCache) { ASSERT(pWMI == NULL || aColValues); if (pWMI == NULL) return S_OK;
// Get the system directory.
CWMIObjectCollection * pCollection = NULL; CWMIObject * pOSObject = NULL;
HRESULT hr = pWMI->Enumerate(_T("Win32_OperatingSystem"), &pCollection); if (SUCCEEDED(hr)) { hr = pCollection->GetNext(&pOSObject); if (FAILED(hr)) pOSObject = NULL; delete pCollection; } if (pOSObject == NULL) return hr;
CString strSystemDirectory = pOSObject->GetString(_T("SystemDirectory")); delete pOSObject; if (strSystemDirectory.IsEmpty()) return S_OK;
// This is the set of WINSOCK files we'll be looking at.
CString astrFiles[] = { _T("winsock.dll"), _T("wsock32.dll"), _T("wsock32n.dll"), _T("") };
for (int index = 0; !astrFiles[index].IsEmpty(); index++) { // Get the object for the CIM_DataFile for this specific file.
CString strPath; strPath.Format(_T("CIM_DataFile.Name='%s\\%s'"), strSystemDirectory, astrFiles[index]);
CWMIObject * pObject; if (SUCCEEDED(pWMI->GetObject(strPath, &pObject))) { pWMI->AppendBlankLine(aColValues, iColCount); pWMI->AddObjectToOutput(aColValues, iColCount, pObject, _T("Name, FileSize, Version"), IDS_WINSOCK1); delete pObject; } }
return S_OK; }
//-----------------------------------------------------------------------------
// This function gathers Disk information.
//
// TBD - might be nice to get the partition drive letter from
// Win32_LogicalDiskToPartition.
//-----------------------------------------------------------------------------
HRESULT Disks(CWMIHelper * pWMI, DWORD dwIndex, volatile BOOL * pfCancel, CPtrList * aColValues, int iColCount, void ** ppCache) { ASSERT(pWMI == NULL || aColValues); if (pWMI == NULL) return S_OK;
LPCTSTR szDiskProperties = _T("Description, Manufacturer, Model, MSIAdvancedBytesPerSector, MediaLoaded, MediaType, Partitions, MSIAdvancedSCSIBus, MSIAdvancedSCSILogicalUnit, MSIAdvancedSCSIPort, MSIAdvancedSCSITargetId, MSIAdvancedSectorsPerTrack, Size, MSIAdvancedTotalCylinders, MSIAdvancedTotalSectors, MSIAdvancedTotalTracks, MSIAdvancedTracksPerCylinder, MSIAdvancedPNPDeviceID, MSIAdvancedIndex"); LPCTSTR szPartitionProperties = _T("Caption, Size, MSIAdvancedStartingOffset, MSIAdvancedDiskIndex");
CWMIObjectCollection * pDiskCollection = NULL; HRESULT hr = pWMI->Enumerate(_T("Win32_DiskDrive"), &pDiskCollection, szDiskProperties); if (SUCCEEDED(hr)) { CWMIObject * pDiskObject = NULL; while (S_OK == pDiskCollection->GetNext(&pDiskObject)) { pWMI->AppendBlankLine(aColValues, iColCount); pWMI->AddObjectToOutput(aColValues, iColCount, pDiskObject, szDiskProperties, IDS_DISKS1);
DWORD dwIndex; if (FAILED(pDiskObject->GetValueDWORD(_T("Index"), &dwIndex))) continue;
CWMIObjectCollection * pPartitionCollection = NULL; if (SUCCEEDED(pWMI->Enumerate(_T("Win32_DiskPartition"), &pPartitionCollection, szPartitionProperties))) { CWMIObject * pPartitionObject = NULL; while (S_OK == pPartitionCollection->GetNext(&pPartitionObject)) { DWORD dwDiskIndex; if (FAILED(pPartitionObject->GetValueDWORD(_T("DiskIndex"), &dwDiskIndex)) || dwIndex != dwDiskIndex) continue;
pWMI->AddObjectToOutput(aColValues, iColCount, pPartitionObject, szPartitionProperties, IDS_DISKS2); } delete pPartitionObject; delete pPartitionCollection; } } delete pDiskObject; delete pDiskCollection; }
return hr; }
//-----------------------------------------------------------------------------
// This function gathers Problem Device information.
//-----------------------------------------------------------------------------
HRESULT ProblemDevices(CWMIHelper * pWMI, DWORD dwIndex, volatile BOOL * pfCancel, CPtrList * aColValues, int iColCount, void ** ppCache) { ASSERT(pWMI == NULL || aColValues); if (pWMI == NULL) return S_OK;
CWMIObjectCollection * pCollection = NULL; HRESULT hr = pWMI->Enumerate(_T("Win32_PnPEntity"), &pCollection, _T("Caption, PNPDeviceID, ConfigManagerErrorCode")); if (SUCCEEDED(hr)) { CWMIObject * pObject = NULL; while (S_OK == pCollection->GetNext(&pObject)) { DWORD dwError; if (SUCCEEDED(pObject->GetValueDWORD(_T("ConfigManagerErrorCode"), &dwError))) if (dwError) pWMI->AddObjectToOutput(aColValues, iColCount, pObject, _T("Caption, PNPDeviceID, ConfigManagerErrorCode"), IDS_PROBLEMDEVICE1); } delete pObject; delete pCollection; }
return hr; }
//-----------------------------------------------------------------------------
// This function gathers USB information.
//-----------------------------------------------------------------------------
HRESULT ComponentsUSB(CWMIHelper * pWMI, DWORD dwIndex, volatile BOOL * pfCancel, CPtrList * aColValues, int iColCount, void ** ppCache) { ASSERT(pWMI == NULL || aColValues); if (pWMI == NULL) return S_OK;
CWMIObjectCollection * pUSBControllerCollection = NULL; HRESULT hr = pWMI->Enumerate(_T("Win32_USBController"), &pUSBControllerCollection, _T("Caption, PNPDeviceID, __PATH")); if (SUCCEEDED(hr)) { CWMIObject * pUSBControllerObject = NULL; while (S_OK == pUSBControllerCollection->GetNext(&pUSBControllerObject)) { pWMI->AddObjectToOutput(aColValues, iColCount, pUSBControllerObject, _T("Caption, PNPDeviceID"), IDS_USB1);
// For each USB controller, look for devices connected to it (through
// the Win32_USBControllerDevice class).
CString strUSBControllerPath = pUSBControllerObject->GetString(_T("__PATH")); if (!strUSBControllerPath.IsEmpty()) { CWMIObjectCollection * pAssocCollection = NULL; if (SUCCEEDED(pWMI->Enumerate(_T("Win32_USBControllerDevice"), &pAssocCollection))) { CWMIObject * pAssocObject = NULL; while (S_OK == pAssocCollection->GetNext(&pAssocObject)) { CString strAntecedent, strDependent; if (SUCCEEDED(pAssocObject->GetValueString(_T("Antecedent"), &strAntecedent))) { if (strAntecedent.CompareNoCase(strUSBControllerPath) == 0) { if (SUCCEEDED(pAssocObject->GetValueString(_T("Dependent"), &strDependent))) { CWMIObject * pDeviceObject; if (SUCCEEDED(pWMI->GetObject(strDependent, &pDeviceObject))) { pWMI->AddObjectToOutput(aColValues, iColCount, pDeviceObject, _T("Caption, PNPDeviceID"), IDS_USB1); delete pDeviceObject; } } } } } delete pAssocObject; delete pAssocCollection; } } } delete pUSBControllerObject; delete pUSBControllerCollection; }
return hr; }
|