Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

418 lines
15 KiB

// Copyright (c) 2000-2001 Microsoft Corporation, All Rights Reserved
// CJobObjIOActgProps.cpp
//#define _WIN32_WINNT 0x0500
#include "precomp.h"
#include <wbemprov.h>
#include "FRQueryEx.h"
#include <vector>
#include "helpers.h"
#include "CVARIANT.h"
#include "CObjProps.h"
#include "CJobObjIOActgProps.h"
#include <crtdbg.h>
//*****************************************************************************
// BEGIN: Declaration of Win32_JobObjIOActgInfo class properties.
//*****************************************************************************
// WARNING!! MUST KEEP MEMBERS OF THE FOLLOWING ARRAY
// IN SYNCH WITH THE JOB_OBJ_PROPS ENUMERATION DECLARED
// IN CJobObjProps.h !!!
LPCWSTR g_rgJobObjIOActgPropNames[] =
{
{ L"Name" },
{ L"TotalUserTime" },
{ L"TotalKernelTime" },
{ L"ThisPeriodTotalUserTime" },
{ L"ThisPeriodTotalKernelTime" },
{ L"TotalPageFaultCount" },
{ L"TotalProcesses" },
{ L"ActiveProcesses" },
{ L"TotalTerminatedProcesses" },
{ L"ReadOperationCount" },
{ L"WriteOperationCount" },
{ L"OtherOperationCount" },
{ L"ReadTransferCount" },
{ L"WriteTransferCount" },
{ L"OtherTransferCount" },
{ L"PeakProcessMemoryUsed" },
{ L"PeakJobMemoryUsed" }
};
//*****************************************************************************
// END: Declaration of Win32_JobObjIOActgInfo class properties.
//*****************************************************************************
CJobObjIOActgProps::CJobObjIOActgProps(CHString& chstrNamespace)
: CObjProps(chstrNamespace)
{
}
CJobObjIOActgProps::CJobObjIOActgProps(
HANDLE hJob,
CHString& chstrNamespace)
: CObjProps(chstrNamespace),
m_hJob(hJob)
{
}
CJobObjIOActgProps::~CJobObjIOActgProps()
{
}
// Clients call this to establish which properties
// were requested. This function calls a base class
// helper, which calls our CheckProps function.
// The base class helper finally stores the result
// in the base class member m_dwReqProps.
HRESULT CJobObjIOActgProps::GetWhichPropsReq(
CFrameworkQuery& cfwq)
{
HRESULT hr = S_OK;
// Call base class version for help.
// Base class version will call our
// CheckProps function.
hr = CObjProps::GetWhichPropsReq(
cfwq,
CheckProps);
return hr;
}
DWORD CJobObjIOActgProps::CheckProps(
CFrameworkQuery& Query)
{
DWORD dwReqProps = PROP_NONE_REQUIRED;
// Get the requested properties for this
// specific object...
if (Query.IsPropertyRequired(g_rgJobObjIOActgPropNames[JOIOACTGPROP_ID]))
dwReqProps |= PROP_JOIOActgID;
if (Query.IsPropertyRequired(g_rgJobObjIOActgPropNames[JOIOACTGPROP_TotalUserTime]))
dwReqProps |= PROP_TotalUserTime;
if (Query.IsPropertyRequired(g_rgJobObjIOActgPropNames[JOIOACTGPROP_TotalKernelTime]))
dwReqProps |= PROP_TotalKernelTime;
if (Query.IsPropertyRequired(g_rgJobObjIOActgPropNames[JOIOACTGPROP_ThisPeriodTotalUserTime]))
dwReqProps |= PROP_ThisPeriodTotalUserTime;
if (Query.IsPropertyRequired(g_rgJobObjIOActgPropNames[JOIOACTGPROP_ThisPeriodTotalKernelTime]))
dwReqProps |= PROP_ThisPeriodTotalKernelTime;
if (Query.IsPropertyRequired(g_rgJobObjIOActgPropNames[JOIOACTGPROP_TotalPageFaultCount]))
dwReqProps |= PROP_TotalPageFaultCount;
if (Query.IsPropertyRequired(g_rgJobObjIOActgPropNames[JOIOACTGPROP_TotalProcesses]))
dwReqProps |= PROP_TotalProcesses;
if (Query.IsPropertyRequired(g_rgJobObjIOActgPropNames[JOIOACTGPROP_ActiveProcesses]))
dwReqProps |= PROP_ActiveProcesses;
if (Query.IsPropertyRequired(g_rgJobObjIOActgPropNames[JOIOACTGPROP_TotalTerminatedProcesses]))
dwReqProps |= PROP_TotalTerminatedProcesses;
if (Query.IsPropertyRequired(g_rgJobObjIOActgPropNames[JOIOACTGPROP_ReadOperationCount]))
dwReqProps |= PROP_ReadOperationCount;
if (Query.IsPropertyRequired(g_rgJobObjIOActgPropNames[JOIOACTGPROP_WriteOperationCount]))
dwReqProps |= PROP_WriteOperationCount;
if (Query.IsPropertyRequired(g_rgJobObjIOActgPropNames[JOIOACTGPROP_OtherOperationCount]))
dwReqProps |= PROP_OtherOperationCount;
if (Query.IsPropertyRequired(g_rgJobObjIOActgPropNames[JOIOACTGPROP_ReadTransferCount]))
dwReqProps |= PROP_ReadTransferCount;
if (Query.IsPropertyRequired(g_rgJobObjIOActgPropNames[JOIOACTGPROP_WriteTransferCount]))
dwReqProps |= PROP_WriteTransferCount;
if (Query.IsPropertyRequired(g_rgJobObjIOActgPropNames[JOIOACTGPROP_OtherTransferCount]))
dwReqProps |= PROP_OtherTransferCount;
if (Query.IsPropertyRequired(g_rgJobObjIOActgPropNames[JOIOACTGPROP_PeakProcessMemoryUsed]))
dwReqProps |= PROP_PeakProcessMemoryUsed;
if (Query.IsPropertyRequired(g_rgJobObjIOActgPropNames[JOIOACTGPROP_PeakJobMemoryUsed]))
dwReqProps |= PROP_PeakJobMemoryUsed;
return dwReqProps;
}
void CJobObjIOActgProps::SetHandle(
const HANDLE hJob)
{
m_hJob = hJob;
}
HANDLE& CJobObjIOActgProps::GetHandle()
{
_ASSERT(m_hJob);
return m_hJob;
}
// Sets the key properties from the ObjectPath.
HRESULT CJobObjIOActgProps::SetKeysFromPath(
const BSTR ObjectPath,
IWbemContext __RPC_FAR *pCtx)
{
HRESULT hr = WBEM_S_NO_ERROR;
// This array contains the key field names
CHStringArray rgchstrKeys;
rgchstrKeys.Add(g_rgJobObjIOActgPropNames[JOIOACTGPROP_ID]);
// This array contains the index numbers
// in m_PropMap corresponding to the keys.
short sKeyNum[1];
sKeyNum[0] = JOIOACTGPROP_ID;
hr = CObjProps::SetKeysFromPath(
ObjectPath,
pCtx,
IDS_Win32_JobObjectIOAccountingInfo,
rgchstrKeys,
sKeyNum);
return hr;
}
// Sets the key property from in supplied
// parameter.
HRESULT CJobObjIOActgProps::SetKeysDirect(
std::vector<CVARIANT>& vecvKeys)
{
HRESULT hr = WBEM_S_NO_ERROR;
if(vecvKeys.size() == 1)
{
short sKeyNum[1];
sKeyNum[0] = JOIOACTGPROP_ID;
hr = CObjProps::SetKeysDirect(
vecvKeys,
sKeyNum);
}
else
{
hr = WBEM_E_INVALID_PARAMETER;
}
return hr;
}
// Sets the non-key properties. Only those
// properties requested are set (as determined
// by base class member m_dwReqProps).
HRESULT CJobObjIOActgProps::SetNonKeyReqProps()
{
HRESULT hr = WBEM_S_NO_ERROR;
DWORD dwReqProps = GetReqProps();
_ASSERT(m_hJob);
if(!m_hJob) return WBEM_E_INVALID_PARAMETER;
// Because all the properties of this class
// come from the same underlying win32 job
// object structure, we only need to get that
// structure one time. We only need to get
// it at all if at least one non-key property
// was requested.
if(dwReqProps != PROP_NONE_REQUIRED)
{
// Get the value from the underlying JO:
JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION jobaioai;
JOBOBJECT_EXTENDED_LIMIT_INFORMATION joeli;
BOOL fQIJO = ::QueryInformationJobObject(
m_hJob,
JobObjectBasicAndIoAccountingInformation,
&jobaioai,
sizeof(JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION),
NULL);
if(fQIJO)
{
fQIJO = ::QueryInformationJobObject(
m_hJob,
JobObjectExtendedLimitInformation,
&joeli,
sizeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION),
NULL);
}
if(!fQIJO)
{
_ASSERT(0);
hr = WBEM_E_FAILED;
}
else
{
try // CVARIANT can throw
{
// Get all the requested values...
if(dwReqProps & PROP_TotalUserTime)
{
ULONGLONG llTotalUserTime = (ULONGLONG)jobaioai.BasicInfo.TotalUserTime.QuadPart;
m_PropMap.insert(SHORT2PVARIANT::value_type(
JOIOACTGPROP_TotalUserTime,
new CVARIANT(llTotalUserTime)));
}
if(dwReqProps & PROP_TotalKernelTime)
{
ULONGLONG llTotalKernelTime = (ULONGLONG)jobaioai.BasicInfo.TotalKernelTime.QuadPart;
m_PropMap.insert(SHORT2PVARIANT::value_type(
JOIOACTGPROP_TotalKernelTime,
new CVARIANT(llTotalKernelTime)));
}
if(dwReqProps & PROP_ThisPeriodTotalUserTime)
{
ULONGLONG llThisPeriodTotalUserTime = (ULONGLONG)jobaioai.BasicInfo.ThisPeriodTotalUserTime.QuadPart;
m_PropMap.insert(SHORT2PVARIANT::value_type(
JOIOACTGPROP_ThisPeriodTotalUserTime,
new CVARIANT(llThisPeriodTotalUserTime)));
}
if(dwReqProps & PROP_ThisPeriodTotalKernelTime)
{
ULONGLONG llThisPeriodTotalKernelTime = (ULONGLONG)jobaioai.BasicInfo.ThisPeriodTotalKernelTime.QuadPart;
m_PropMap.insert(SHORT2PVARIANT::value_type(
JOIOACTGPROP_ThisPeriodTotalKernelTime,
new CVARIANT(llThisPeriodTotalKernelTime)));
}
if(dwReqProps & PROP_TotalPageFaultCount)
{
DWORD dwTotalPageFaultCount = jobaioai.BasicInfo.TotalPageFaultCount;
m_PropMap.insert(SHORT2PVARIANT::value_type(
JOIOACTGPROP_TotalPageFaultCount,
new CVARIANT(dwTotalPageFaultCount)));
}
if(dwReqProps & PROP_TotalProcesses)
{
DWORD dwTotalProcesses = jobaioai.BasicInfo.TotalProcesses;
m_PropMap.insert(SHORT2PVARIANT::value_type(
JOIOACTGPROP_TotalProcesses,
new CVARIANT(dwTotalProcesses)));
}
if(dwReqProps & PROP_ActiveProcesses)
{
DWORD dwActiveProcesses = jobaioai.BasicInfo.ActiveProcesses;
m_PropMap.insert(SHORT2PVARIANT::value_type(
JOIOACTGPROP_ActiveProcesses,
new CVARIANT(dwActiveProcesses)));
}
if(dwReqProps & PROP_TotalTerminatedProcesses)
{
DWORD dwTotalTerminatedProcesses = jobaioai.BasicInfo.TotalTerminatedProcesses;
m_PropMap.insert(SHORT2PVARIANT::value_type(
JOIOACTGPROP_TotalTerminatedProcesses,
new CVARIANT(dwTotalTerminatedProcesses)));
}
if(dwReqProps & PROP_ReadOperationCount)
{
ULONGLONG ullReadOperationCount = jobaioai.IoInfo.ReadOperationCount;
m_PropMap.insert(SHORT2PVARIANT::value_type(
JOIOACTGPROP_ReadOperationCount,
new CVARIANT(ullReadOperationCount)));
}
if(dwReqProps & PROP_WriteOperationCount)
{
ULONGLONG ullWriteOperationCount = jobaioai.IoInfo.WriteOperationCount;
m_PropMap.insert(SHORT2PVARIANT::value_type(
JOIOACTGPROP_WriteOperationCount,
new CVARIANT(ullWriteOperationCount)));
}
if(dwReqProps & PROP_OtherOperationCount)
{
ULONGLONG ullOtherOperationCount = jobaioai.IoInfo.OtherOperationCount;
m_PropMap.insert(SHORT2PVARIANT::value_type(
JOIOACTGPROP_OtherOperationCount,
new CVARIANT(ullOtherOperationCount)));
}
if(dwReqProps & PROP_ReadTransferCount)
{
ULONGLONG ullReadTransferCount = jobaioai.IoInfo.ReadTransferCount;
m_PropMap.insert(SHORT2PVARIANT::value_type(
JOIOACTGPROP_ReadTransferCount,
new CVARIANT(ullReadTransferCount)));
}
if(dwReqProps & PROP_WriteTransferCount)
{
ULONGLONG ullWriteTransferCount = jobaioai.IoInfo.WriteTransferCount;
m_PropMap.insert(SHORT2PVARIANT::value_type(
JOIOACTGPROP_WriteTransferCount,
new CVARIANT(ullWriteTransferCount)));
}
if(dwReqProps & PROP_OtherTransferCount)
{
ULONGLONG ullOtherTransferCount = jobaioai.IoInfo.OtherTransferCount;
m_PropMap.insert(SHORT2PVARIANT::value_type(
JOIOACTGPROP_OtherTransferCount,
new CVARIANT(ullOtherTransferCount)));
}
if(dwReqProps & PROP_PeakProcessMemoryUsed)
{
DWORD dwPeakProcessMemoryUsed = joeli.PeakProcessMemoryUsed;
m_PropMap.insert(SHORT2PVARIANT::value_type(
JOIOACTGPROP_PeakProcessMemoryUsed,
new CVARIANT(dwPeakProcessMemoryUsed)));
}
if(dwReqProps & PROP_PeakJobMemoryUsed)
{
DWORD dwPeakJobMemoryUsed = joeli.PeakJobMemoryUsed;
m_PropMap.insert(SHORT2PVARIANT::value_type(
JOIOACTGPROP_PeakJobMemoryUsed,
new CVARIANT(dwPeakJobMemoryUsed)));
}
}
catch(CVARIANTError& cve)
{
hr = cve.GetWBEMError();
}
}
}
return hr;
}
HRESULT CJobObjIOActgProps::LoadPropertyValues(
IWbemClassObject* pIWCO)
{
HRESULT hr = WBEM_S_NO_ERROR;
if(!pIWCO) return E_POINTER;
hr = CObjProps::LoadPropertyValues(
g_rgJobObjIOActgPropNames,
pIWCO);
return hr;
}