Back

// PSLProcessIO.cpp : Implementation of CPSLProcessIO

#include "stdafx.h"
#include "PSLProcessIO.h"

CPSLProcessIO::CPSLProcessIO()
{
   m_ProcessID = NULL;
   m_CurrentProcessID = ::GetCurrentProcessId();
}

HRESULT CPSLProcessIO::FinalConstruct()
{
   return S_OK;
}

void CPSLProcessIO::FinalRelease()
{
}

void CPSLProcessIO::Initialize(long ProcessID)
{
   m_ProcessID = ProcessID;
}

bool CPSLProcessIO::GetProcessIO(IO_COUNTERS * pCounters)
{
   bool bProcessOpen = false;
   HANDLE hProcess = NULL;
   if(m_ProcessID == m_CurrentProcessID)
      hProcess = ::GetCurrentProcess();
   else
   {
      hProcess = ::OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, m_ProcessID);
      if(hProcess)
         bProcessOpen = true;
      else
      {
         if(::GetLastError() == ERROR_ACCESS_DENIED)
            SetException(EX_NOACCESS);
         return false;
      }
   }

   bool bResult = false;

   ::memset(pCounters, 0, sizeof(IO_COUNTERS));
   if(::GetProcessIoCounters(hProcess, pCounters))
      bResult = true;

   if(bProcessOpen)
      ::CloseHandle(hProcess);

   return bResult;
}


////////////////////////////////////////////////////////////////////////
// Interface Implementation;
////////////////////////////////////////////////////////////////////////


STDMETHODIMP CPSLProcessIO::get_ReadOperationCount(VARIANT * pValue)
{
   PSL_BEGIN

   IO_COUNTERS ProcessIO;
   if(GetProcessIO(&ProcessIO))
      CPSLUtilities::SetVariant64Bit(pValue, ProcessIO.ReadOperationCount);
   else
      CPSLUtilities::SetVariant64Bit(pValue, 0);

   PSL_END
}

STDMETHODIMP CPSLProcessIO::get_WriteOperationCount(VARIANT * pValue)
{
   PSL_BEGIN

   IO_COUNTERS ProcessIO;
   if(GetProcessIO(&ProcessIO))
      CPSLUtilities::SetVariant64Bit(pValue, ProcessIO.WriteOperationCount);
   else
      CPSLUtilities::SetVariant64Bit(pValue, 0);

   PSL_END
}

STDMETHODIMP CPSLProcessIO::get_OtherOperationCount(VARIANT * pValue)
{
   PSL_BEGIN

   IO_COUNTERS ProcessIO;
   if(GetProcessIO(&ProcessIO))
      CPSLUtilities::SetVariant64Bit(pValue, ProcessIO.OtherOperationCount);
   else
      CPSLUtilities::SetVariant64Bit(pValue, 0);

   PSL_END
}

STDMETHODIMP CPSLProcessIO::get_ReadTransferCount(VARIANT * pValue)
{
   PSL_BEGIN

   IO_COUNTERS ProcessIO;
   if(GetProcessIO(&ProcessIO))
      CPSLUtilities::SetVariant64Bit(pValue, ProcessIO.ReadTransferCount);
   else
      CPSLUtilities::SetVariant64Bit(pValue, 0);

   PSL_END
}

STDMETHODIMP CPSLProcessIO::get_WriteTransferCount(VARIANT * pValue)
{
   PSL_BEGIN

   IO_COUNTERS ProcessIO;
   if(GetProcessIO(&ProcessIO))
      CPSLUtilities::SetVariant64Bit(pValue, ProcessIO.WriteTransferCount);
   else
      CPSLUtilities::SetVariant64Bit(pValue, 0);

   PSL_END
}

STDMETHODIMP CPSLProcessIO::get_OtherTransferCount(VARIANT * pValue)
{
   PSL_BEGIN

   IO_COUNTERS ProcessIO;
   if(GetProcessIO(&ProcessIO))
      CPSLUtilities::SetVariant64Bit(pValue, ProcessIO.OtherTransferCount);
   else
      CPSLUtilities::SetVariant64Bit(pValue, 0);

   PSL_END
}

Top