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.
 
 
 
 
 
 

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