依据名称检测进程是否存在

来源:互联网 发布:单片机应用系统设计 编辑:程序博客网 时间:2024/05/16 07:29

借鉴于网上。

#include <psapi.h >
 
#pragma comment(lib,"psapi.lib")

 

DWORD   ProcessToPID(const   char   *InputProcessName);
int AddPrivilege(const char *Name);
const   char   DESTPROC[19]   =   "client.exe";
const   char   DESTPROCDebug[19]   =   "clientd.exe";

部分函数:

void CWatingDlg::OnTimer(UINT nIDEvent)
{
 static int Value = 1;
 m_Wait+= Value ;
 if (m_Wait > 3100)
 {
  //KillTimer(nIDEvent);
  Value = 0;
 }
 else
 {
  if (m_Wait%50 == 0 )
  {
   m_Pro_Waiting.GetRange(m_low,m_up);
   m_Pro_Waiting.SetRange(0, m_up*2.0);
   m_Wait *=2.0;
  }
 }
 m_Pro_Waiting.SetPos(m_Wait);
 static int nTime = 0;
 DWORD   pid = ProcessToPID(DESTPROC);  
 DWORD   pidDebug = ProcessToPID(DESTPROCDebug);
 nTime++;
 if (nTime % 10 == 0)
 {
  if (pid != 0 || pidDebug != 0)
  {
   return;
  }
  else
  {
   exit(1);
  }
 }
 if (nTime > 1200)
 {
  exit(1);
 }
}


 


DWORD   ProcessToPID(const   char   *InputProcessName)  
{  
 DWORD   aProcesses[1024],   cbNeeded,   cProcesses;  
 unsigned   int   i;  
 HANDLE   hProcess   =   NULL;  
 HMODULE   hMod   =   NULL;  
 char   szProcessName[MAX_PATH]   =   "UnknownProcess ";  

 AddPrivilege(SE_DEBUG_NAME);  

 //   计算目前有多少进程,   aProcesses[]用来存放有效的进程PIDs  
 if   (!EnumProcesses(   aProcesses,   sizeof(aProcesses),   &cbNeeded   )   )  
 {  
  return   0;  
 }  

 cProcesses   =   cbNeeded   /   sizeof(DWORD);  
 //   按有效的PID遍历所有的进程  
 for   (   i   =   0;   i   <   cProcesses;   i++   )  
 {  
  //   打开特定PID的进程  
  hProcess   =   OpenProcess(   PROCESS_QUERY_INFORMATION   |  
   PROCESS_VM_READ,  
   FALSE,   aProcesses[i]);  
  //   取得特定PID的进程名  
  if   (   hProcess   )  
  {  
   if(EnumProcessModules(   hProcess,   &hMod,   sizeof(hMod),   &cbNeeded)   )  
   {  
    GetModuleBaseName(   hProcess,   hMod,  
     szProcessName,   sizeof(szProcessName)   );  
    //将取得的进程名与输入的进程名比较,如相同则返回进程PID  
    if(!stricmp(szProcessName,   InputProcessName))  
    {  
     CloseHandle(   hProcess   );  
     return   aProcesses[i];  
    }  
   }  
  }//end   of   if   (   hProcess   )  
 }//end   of   for  
 //没有找到相应的进程名,返回0  
 CloseHandle(   hProcess   );  
 return   0;  
}

int AddPrivilege(const char *Name)
{
 HANDLE hToken;
 TOKEN_PRIVILEGES tp;
 LUID Luid;

 if (!OpenProcessToken(GetCurrentProcess(),
  TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,
  &hToken))
 {
  return 1;
 }

 if (!LookupPrivilegeValue(NULL,Name,&Luid))
 {
  return 1;
 }

 tp.PrivilegeCount = 1;
 tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
 tp.Privileges[0].Luid = Luid;

 if (!AdjustTokenPrivileges(hToken,
  0,
  &tp,
  sizeof(TOKEN_PRIVILEGES),
  NULL,
  NULL))
 {     
  return 1;
 }

 return 0;
}