Back

// PSLSoftware.cpp : Implementation of CPSLSoftware

#include "stdafx.h"
#include "PSLSoftware.h"
#include "PSLWindow.h"
#include <Tlhelp32.h>

CPSLSoftware::CPSLSoftware()
{
}

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

void CPSLSoftware::FinalRelease()
{
}

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

STDMETHODIMP CPSLSoftware::get_OS(IPSLOS ** ppValue)
{
   PSL_BEGIN

   *ppValue = m_OS;

   PSL_END
}

STDMETHODIMP CPSLSoftware::get_Drivers(IPSLDrivers ** ppValue)
{
   PSL_BEGIN

   SetException(EX_NOTIMPLEMENTED);
   //*ppValue = m_Drivers;

   PSL_END
}

STDMETHODIMP CPSLSoftware::get_Processes(IPSLProcesses ** ppValue)
{
   PSL_BEGIN

   *ppValue = m_Processes;

   PSL_END
}

STDMETHODIMP CPSLSoftware::get_Services(IPSLServices ** ppValue)
{
   PSL_BEGIN

   SetException(EX_NOTIMPLEMENTED);
   //*ppValue = m_Services;

   PSL_END
}

STDMETHODIMP CPSLSoftware::GetModuleVersion(BSTR ModulePath, IPSLModuleVersion ** ppValue)
{
   PSL_BEGIN

   *ppValue = NULL;

   CComObject<CPSLModuleVersion> * pVersion = NULL;
   if(CComObject<CPSLModuleVersion>::CreateInstance(&pVersion) == S_OK)
   {
      pVersion->AddRef();
      if(pVersion->InitExternal(_bstr_t(ModulePath)))
         *ppValue = CComPtr<IPSLModuleVersion>(pVersion);
      else
         pVersion->Release();
   }

   PSL_END
}

STDMETHODIMP CPSLSoftware::WindowFromHandle(VARIANT Handle, IPSLWindow ** ppValue)
{
   PSL_BEGIN

   *ppValue = NULL;

   bool bError = false;
   HWND hWnd = (HWND)CPSLUtilities::GetVariantBig(&Handle, &bError);
   if(bError || !::IsWindow(hWnd))
      SetException(EX_INVALIDPARAMETER);
   else
   {
      CComObject<CPSLWindow> * pWindow = NULL;
      if(CComObject<CPSLWindow>::CreateInstance(&pWindow) == S_OK)
      {
         pWindow->AddRef();
         pWindow->Initialize(hWnd);
         *ppValue = CComPtr<IPSLWindow>(pWindow);
      }
   }

   PSL_END
}

STDMETHODIMP CPSLSoftware::ProcessIDFromThreadID(long ThreadID, long * pValue)
{
   PSL_BEGIN

   *pValue = 0;
   HANDLE hSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
   if(hSnapshot != INVALID_HANDLE_VALUE)
   {
      THREADENTRY32 te;
      te.dwSize = sizeof(te);
      if(::Thread32First(hSnapshot, &te))
      {
         do
         {
            if(te.dwSize >= FIELD_OFFSET(THREADENTRY32, th32OwnerProcessID) + sizeof(te.th32OwnerProcessID) && te.th32ThreadID == ThreadID)
            {
               *pValue = te.th32OwnerProcessID;
               break;
            }
            te.dwSize = sizeof(te);
         }
         while(::Thread32Next(hSnapshot, &te));
      }
      ::CloseHandle(hSnapshot);
   }

   PSL_END
}

Top