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