Kill指定进程

5 篇文章 0 订阅
 

// GetDebugPriv
// 在 Windows NT/2000/XP 中可能因权限不够导致以上函数失败
// 如以 System 权限运行的系统进程,服务进程等
// 用本函数取得 debug 权限即可,Winlogon.exe 都可以终止哦
//
BOOL GetDebugPriv()
{
 HANDLE hToken;
 LUID sedebugnameValue;
 TOKEN_PRIVILEGES tkp;
 if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
 {
  return FALSE;
 }
 if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue))
 {
  CloseHandle(hToken);
  return FALSE;
 }
 tkp.PrivilegeCount = 1;
 tkp.Privileges[0].Luid = sedebugnameValue;
 tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
 if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof tkp, NULL, NULL))
 {
  CloseHandle(hToken);
  return FALSE;
 }
 return TRUE;
}

void KillProcess(LPCTSTR strname)
{
 GetDebugPriv();

 HANDLE handle; // 定义CreateToolhelp32Snapshot系统快照句柄
 HANDLE handle1; // 定义要结束进程句柄

 handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); // 获得系统快照句柄
 if (handle) {
  PROCESSENTRY32 *info; // 定义PROCESSENTRY32结构字指
  info = new PROCESSENTRY32; // new一个
  info->dwSize = sizeof(PROCESSENTRY32); // PROCESSENTRY32 结构的 dwSize 成员设置成 sizeof(PROCESSENTRY32)

  // 调用一次 Process32First 函数,从快照中获取进程列表
  if (Process32First(handle, info)) { // win7下碰到过失败的情况
    // 重复调用 Process32Next,直到函数返回 FALSE 为止
    while(Process32Next(handle, info) != FALSE)
    {
     // strcmp字符串比较函数同要结束相同
     if(strcmp(strname, info->szExeFile) == 0)
     {
      //PROCESS_TERMINATE表示为结束操作打开,FALSE=可继承,info->th32ProcessID=进程ID 
      handle1 = OpenProcess(PROCESS_TERMINATE, FALSE, info->th32ProcessID);
      if (handle1) {
       TerminateProcess(handle1, 0); // 结束进程
       CloseHandle(handle1);
      }
     }
   }
  }

  delete info;
  info = NULL;
  CloseHandle(handle);
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值