ProcessInfo 代码

 

#include "stdafx.h"
#include "ProcessInfo.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

//
//TODO: 如果此 DLL 相对于 MFC DLL 是动态链接的,
//  则从此 DLL 导出的任何调入
//  MFC 的函数必须将 AFX_MANAGE_STATE 宏添加到
//  该函数的最前面。
//
//  例如:
//
//  extern "C" BOOL PASCAL EXPORT ExportedFunction()
//  {
//   AFX_MANAGE_STATE(AfxGetStaticModuleState());
//   // 此处为普通函数体
//  }
//
//  此宏先于任何 MFC 调用
//  出现在每个函数中十分重要。这意味着
//  它必须作为函数中的第一个语句
//  出现,甚至先于所有对象变量声明,
//  这是因为它们的构造函数可能生成 MFC
//  DLL 调用。
//
//  有关其他详细信息,
//  请参阅 MFC 技术说明 33 和 58。
//


// CProcessInfoApp

BEGIN_MESSAGE_MAP(CProcessInfoApp, CWinApp)
END_MESSAGE_MAP()


typedef struct _ProcessInfo
{
 char szProcessMapName[256];    //进程映像名称
 unsigned long uProcessID;     //进程ID
 char szProcessName[256];    
 unsigned long uPriority;
 char szEPROCESS[256];    //modify
 char szState[256];
 unsigned long uMemUse;
 unsigned long uMemMax;
 struct _ProcessInfo * lpNext;
}ProcessInfo,*LPProcessInfo;  

LPProcessInfo lpHead = NULL ;

// CProcessInfoApp 构造

CProcessInfoApp::CProcessInfoApp()
{
 // TODO: 在此处添加构造代码,
 // 将所有重要的初始化放置在 InitInstance 中
}

CProcessInfoApp::~CProcessInfoApp()

 LPProcessInfo lpTmp = lpHead  ;

 while( lpHead != NULL )
 {
  lpTmp = lpHead;
  lpHead = lpHead->lpNext ;

  delete lpTmp;
  
 }

 lpHead = NULL;

}


// 唯一的一个 CProcessInfoApp 对象

CProcessInfoApp theApp;


// CProcessInfoApp 初始化

BOOL CProcessInfoApp::InitInstance()
{
 CWinApp::InitInstance();

 return TRUE;
}

 


CString VariantToCString(VARIANT var)
{
 CString strValue;
 _variant_t var_t;
 _bstr_t bst_t;
 time_t cur_time;
 CTime time_value;
 COleCurrency var_currency;
 switch(var.vt)
 {
 case VT_EMPTY:
  strValue=_T("");
  break;
 case VT_UI1:
  strValue.Format("%d",var.bVal);
  break;
 case VT_I2:
  strValue.Format("%d",var.iVal);
  break;
 case VT_I4:
  strValue.Format("%d",var.lVal);
  break;
 case VT_R4:
  strValue.Format("%f",var.fltVal);
  break;
 case VT_R8:
  strValue.Format("%f",var.dblVal);
  break;
 case VT_CY:
  var_currency=var;
  strValue=var_currency.Format(0);
  break;
 case VT_BSTR:
  var_t=var;
  bst_t=var_t;
  strValue.Format ("%s",(const char*)bst_t);
  break;
 case VT_NULL:
  strValue=_T("");
  break;
 case VT_DATE:
  cur_time = (long)var.date;
  time_value=cur_time;
  strValue=time_value.Format("%A,%B%d,%Y");
  break;
 case VT_BOOL:
  strValue.Format("%d",var.boolVal );
  break;
 default:
  strValue=_T("");
  break;
 }
 return strValue;
}

typedef DWORD ( *PFUN)(ULONG PID);///function the poinyert


extern "C" _declspec(dllexport) LPProcessInfo GetCurrentProcessesInfo()
{

 HMODULE hMod = ::LoadLibrary("EPROCESS.dll");

 PFUN GetEprocessFromPid = NULL;

 if( hMod )
 {
  GetEprocessFromPid = (PFUN)GetProcAddress(hMod, "GetEprocessFromPid");
 }

 HRESULT hres;

 hres =  CoInitializeEx(0, COINIT_MULTITHREADED);

 hres =  CoInitializeSecurity(
  NULL,
  -1,                          // COM authentication
  NULL,                        // Authentication services
  NULL,                        // Reserved
  RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication
  RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation 
  NULL,                        // Authentication info
  EOAC_NONE,                   // Additional capabilities
  NULL                         // Reserved
  );

 IWbemLocator *pLoc = NULL;

 hres = CoCreateInstance(
  CLSID_WbemLocator,            
  0,
  CLSCTX_INPROC_SERVER,
  IID_IWbemLocator, (LPVOID *) &pLoc);

 IWbemServices *pSvc = NULL;

 hres = pLoc->ConnectServer(
  _bstr_t(L"ROOT//CIMV2"),  // Namespace
  NULL,          // Userid
  NULL,           // PW
  NULL,           // Locale
  0,              // flags
  NULL,           // Authority
  NULL,           // Context
  &pSvc
  );


 hres = CoSetProxyBlanket(
  pSvc,                        // Indicates the proxy to set
  RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx
  RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
  NULL,                        // Server principal name
  RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx
  RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
  NULL,                        // client identity
  EOAC_NONE                    // proxy capabilities
  );

 IEnumWbemClassObject *pEnumClassObject = NULL;
 _bstr_t wsWQL=L"WQL", wsQuery=_bstr_t(L"Select * from ")+_bstr_t(L"Win32_Process");

 IWbemClassObject *pclsObj; 

 if(pSvc->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
 {

  ULONG uReturn = 0;

  while (pEnumClassObject)
  {
   HRESULT hr = pEnumClassObject->Next(WBEM_INFINITE, 1,
    &pclsObj, &uReturn);

   if(0 == uReturn)
   {
    break;
   }

   LPProcessInfo lpInfo = new ProcessInfo;

   memset( lpInfo , 0 , sizeof(ProcessInfo) );

   VARIANT vtProp;
   //VariantInit(&vtProp);
   CString str;

   hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
   if( SUCCEEDED(hr) )
   {
    str = VariantToCString(vtProp);
    strcpy( lpInfo->szProcessMapName , str );

    VariantClear(&vtProp);
   }

   hr = pclsObj->Get(L"ProcessId", 0, &vtProp, 0, 0);
   if( SUCCEEDED(hr) )
   {
    str = VariantToCString(vtProp);
    lpInfo->uProcessID = atoi(str) ;

    VariantClear(&vtProp);
   }

   hr = pclsObj->Get(L"ExecutablePath", 0, &vtProp, 0, 0);
   if( SUCCEEDED(hr) )
   {
    str = VariantToCString(vtProp);
    /*strcpy( lpInfo->szProcessName , str );*/

    VariantClear(&vtProp);


    /*************************/
    str.Replace("//", "");
    strcpy( lpInfo->szProcessName , str );
   }
   /*****************************/

   hr = pclsObj->Get(L"Priority", 0, &vtProp, 0, 0);
   if( SUCCEEDED(hr) )
   {
    str = VariantToCString(vtProp);
    lpInfo->uPriority = atoi(str);

    VariantClear(&vtProp);
   }

   //   hr = pclsObj->Get(L"Priority", 0, &vtProp, 0, 0);
   //   str = VariantToCString(vtProp);

   DWORD addr = 0;


   HANDLE hProcess = OpenProcess( PROCESS_TERMINATE,FALSE,lpInfo->uProcessID );

 

   if( GetEprocessFromPid )
   {
    addr = GetEprocessFromPid(lpInfo->uProcessID);
   }

   CloseHandle(hProcess);

   sprintf(lpInfo->szEPROCESS, "0x%x", addr);
   //unsigned long lEProcess = 0;   
   //sprintf( lpInfo->szEPROCESS , "0x%x" , lEProcess );

   hr = pclsObj->Get(L"Status", 0, &vtProp, 0, 0);
   if( SUCCEEDED(hr) )
   {
    str = VariantToCString(vtProp);
    strcpy( lpInfo->szState , str ); 

    VariantClear(&vtProp);
   }

   hr = pclsObj->Get(L"VirtualSize", 0, &vtProp, 0, 0);
   if( SUCCEEDED(hr) )
   {
    str = VariantToCString(vtProp);
    lpInfo->uMemUse = atoi( str );
    //   lpInfo->uMemUse = lpInfo->uMemUse/1024 ;

    VariantClear(&vtProp);
   }

   hr = pclsObj->Get(L"PeakVirtualSize", 0, &vtProp, 0, 0);
   if( SUCCEEDED(hr) )
   {
    str = VariantToCString(vtProp);
    lpInfo->uMemMax = atoi( str );
    //   lpInfo->uMemMax = lpInfo->uMemMax/1024;

    VariantClear(&vtProp);
   }
   //eprocess
   if( lpHead != NULL )
   {
    lpInfo->lpNext = lpHead->lpNext;
    lpHead->lpNext = lpInfo;
   }
   else
   {
    lpHead = lpInfo;
   }

   //VariantClear(&vtProp);

   if( pclsObj != NULL )
   {
    pclsObj->Release();

    pclsObj = NULL;
   }
  }

  if( pEnumClassObject != NULL )
  {
   pEnumClassObject->Release();

   pEnumClassObject = NULL;
  }
 }

 pSvc->Release();
 pLoc->Release();
 CoUninitialize();

 if( hMod )
 {
  FreeLibrary(hMod);
 }
 return lpHead;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值