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.
317 lines
11 KiB
317 lines
11 KiB
//=============================================================================
|
|
// 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;
|
|
}
|