方法名称:OpenProcess
位置:Kernel32.dll
OpenProcess 函数用来打开一个已存在的进程对象,并返回进程的句柄。
1.函数原型
HANDLE OpenProcess(
DWORD dwDesiredAccess, 
BOOL bInheritHandle, 
DWORD dwProcessId
);
2.参数
a.dwDesiredAccess:想拥有的该进程访问权限
PROCESS_ALL_ACCESS  //所有能获得的权限
PROCESS_CREATE_PROCESS  //需要创建一个进程
PROCESS_CREATE_THREAD   //需要创建一个线程
PROCESS_DUP_HANDLE      //重复使用DuplicateHandle句柄
PROCESS_QUERY_INFORMATION   //获得进程信息的权限,如它的退出代码、优先级
PROCESS_QUERY_LIMITED_INFORMATION  /*获得某些信息的权限,如果获得了PROCESS_QUERY_INFORMATION,也拥有PROCESS_QUERY_LIMITED_INFORMATION权限*/
PROCESS_SET_INFORMATION    //设置某些信息的权限,如进程优先级
PROCESS_SET_QUOTA          //设置内存限制的权限,使用SetProcessWorkingSetSize
PROCESS_SUSPEND_RESUME     //暂停或恢复进程的权限
PROCESS_TERMINATE          //终止一个进程的权限,使用TerminateProcess
PROCESS_VM_OPERATION       //操作进程内存空间的权限(可用VirtualProtectEx和WriteProcessMemory) 
PROCESS_VM_READ            //读取进程内存空间的权限,可使用ReadProcessMemory
PROCESS_VM_WRITE           //读取进程内存空间的权限,可使用WriteProcessMemory
SYNCHRONIZE                //等待进程终止
b.bInheritHandle:表示所得到的进程句柄是否可以被继承
c.dwProcessId:被打开进程的PID

3.返回类型

如成功,返回值为指定进程的句柄。
如失败,返回值为NULL,可调用GetLastError()获得错误代码。

通过一个进程关闭另外一个进程的时候,一般的做法就是枚举系统打开的所用进程的标识符(PID),使用OpenProcess函数获得进程的句柄,该函数可以通过第一个参数来设置句柄的新的访问权限(不清楚句柄是不是和原来的一模一样?有待证明和学习),比如如果打开的句柄不具备终止句柄的权限,直线终止进程操作会失败,返回的错误代码为5(意思为拒绝访问)。通过获得的句柄就可以获得进程名字(通过GetModuleBaseName函数),通过比对进程名字就可以获得我们指定要关闭的进程。注:要使用closeHandle函数来削减进程计数器。

[cpp] view plaincopy
  1. #include <windows.h>
  2. #include <Psapi.h>
  3. #include <iostream>
  4. #include <tchar.h>
  5. using std::cout;
  6. using std::endl;
  7. HANDLE hDesProcess = NULL;
  8. //根据进程的名字(image name)来查找该进程是否是打开的
  9. bool FindProcess( LPCTSTR lpszProcessName )
  10. {
  11. DWORD dwProcessIdentify[MAX_PATH] = { 0 };
  12. DWORD dwTrueBytes = 0;
  13. HANDLE hProcess = NULL;
  14. if ( !EnumProcesses( dwProcessIdentify, MAX_PATH*sizeof(DWORD), &dwTrueBytes ))
  15. {
  16. cout << "enum process fail " << endl;
  17. return false;
  18. }
  19. int nProcessNum = dwTrueBytes/sizeof(DWORD);
  20. HMODULE hModuleInProcess[MAX_PATH] = { 0 };
  21. DWORD dwModuleBytes = 0;
  22. TCHAR moduleBaseName[MAX_PATH] = { 0 };
  23. for ( int nIndex = 0; nIndex < nProcessNum; ++nIndex )
  24. {
  25. hProcess = OpenProcess(  PROCESS_ALL_ACCESS, false, dwProcessIdentify[nIndex] );
  26. //      if ( hProcess == NULL )
  27. //      {
  28. //          continue;
  29. //      }
  30. //      memset( hModuleInProcess, 0, MAX_PATH*sizeof(HMODULE));
  31. //      dwModuleBytes = 0;
  32. //      if ( !EnumProcessModules( hProcess, hModuleInProcess, MAX_PATH*sizeof(HMODULE),&dwModuleBytes ))
  33. //      {
  34. //          cout << "Enum modules in process failed " << endl;
  35. //          DWORD dwErrorCode = GetLastError();
  36. //          //return false;
  37. //          continue;
  38. //      }
  39. //int nModulesNumInProcess = dwModuleBytes/sizeof(DWORD);
  40. memset( moduleBaseName, 0, MAX_PATH*sizeof(TCHAR));
  41. //for ( int nModuleIndex = 0; nModuleIndex < nModulesNumInProcess; ++nModuleIndex )
  42. {
  43. GetModuleBaseName( hProcess, NULL,moduleBaseName,MAX_PATH );
  44. if ( !_tcscmp( moduleBaseName, lpszProcessName))
  45. {
  46. cout << "查找的进程存在" << endl;
  47. hDesProcess = hProcess;
  48. return true;
  49. }
  50. }
  51. }
  52. return false;
  53. }
  54. const LPCTSTR lpszProcessName = _T("DriveTheLife.exe");
  55. int main()
  56. {
  57. if ( !FindProcess( lpszProcessName ))
  58. {
  59. cout << "进程不存在" << endl;
  60. return EXIT_FAILURE;
  61. }
  62. //终止目标进程
  63. UINT unExitCode = 0;
  64. if ( hDesProcess != NULL )
  65. {
  66. BOOL bRet = TerminateProcess( hDesProcess, unExitCode );
  67. if ( !bRet )
  68. {
  69. DWORD dwErrorCode = GetLastError();
  70. cout << "进程终止失败" << endl;
  71. }
  72. }
  73. DWORD dw = WaitForSingleObject( hDesProcess, INFINITE );
  74. switch ( dw )
  75. {
  76. case WAIT_OBJECT_0:
  77. cout << 1 << endl;
  78. break;
  79. case WAIT_FAILED:
  80. {
  81. DWORD dw1 = GetLastError();
  82. cout << 2 << endl;
  83. }
  84. break  ;
  85. default:
  86. cout << 3 << endl;
  87. }
  88. return EXIT_SUCCESS;
  89. }

在使用此函数时会发现不能成功获得有些系统进程的句柄,原因是没有权限。解决办法是在调用此函数前让我们的进程提升权限。

提升权限的函数(当然不会是所以地方都起作用,视情况而定)

[cpp] view plaincopy
  1. bool AdjustProcessTokenPrivilege()
  2. {
  3. LUID luidTmp;
  4. HANDLE hToken;
  5. TOKEN_PRIVILEGES tkp;
  6. if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken))
  7. {
  8. OutputDebugString("AdjustProcessTokenPrivilege OpenProcessToken Failed ! \n");
  9. cout<<"AdjustProcessTokenPrivilege OpenProcessToken Failed !"<<endl;
  10. }
  11. if(!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luidTmp))
  12. {
  13. OutputDebugString("AdjustProcessTokenPrivilege LookupPrivilegeValue Failed !");
  14. cout<<"AdjustProcessTokenPrivilege LookupPrivilegeValue Failed !"<<endl;
  15. CloseHandle(hToken);
  16. return FALSE;
  17. }
  18. tkp.PrivilegeCount = 1;
  19. tkp.Privileges[0].Luid = luidTmp;
  20. tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  21. if(!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL))
  22. {
  23. OutputDebugString("AdjustProcessTokenPrivilege AdjustTokenPrivileges Failed ! \n");
  24. cout<<"AdjustProcessTokenPrivilege AdjustTokenPrivileges Failed !"<<endl;
  25. CloseHandle(hToken);
  26. return FALSE;
  27. }
  28. CloseHandle(hToken);
  29. return true;
  30. }

OpenProcess()函数相关推荐

  1. VC API常用函数简单例子大全(1-89)

    第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄 函数的定义:HWND WINAPI FindWindow(LPCSTR lpClassName ,LPCST ...

  2. Windows.h 常用API函数【转】

    转自:https://blog.csdn.net/farmwang/article/details/50603608 http://www.vbgood.com/api.html http://hi. ...

  3. CreateProcess函数详解(转)

    1.函数说明: WIN32API函数CreateProcess用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件. 2.函数原型: BOOL CreateProcess (     LP ...

  4. windows常用 API函数

    系统API查询 http://www.vbgood.com/api.html http://hi.baidu.com/3582077/item/9cc3483b581f53c5392ffae3 第一个 ...

  5. windows.h系统函数

    // Windows系统函数.cpp: 定义控制台应用程序的入口点. //#include "stdafx.h" #include <windows.h> #inclu ...

  6. 通过CreateToolhelp32Snapshot函数获得系统中当前运行的进程信息2

    这是昨天程序的改进版,调用了OpenProcess函数,并输出了函数执行情况,程序代码如下: Code #include <windows.h> #include <tlhelp32 ...

  7. VC API常用函数简单例子大全

    VC API常用函数简单例子大全 http://hi.baidu.com/tag/vc%20api%E5%87%BD%E6%95%B0/feeds 系统API查询 http://www.vbgood. ...

  8. VC API 常用函数简单例子大全

    第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄 函数的定义:HWND WINAPI FindWindow(LPCSTR lpClassName ,LPCST ...

  9. FindWindow ,GetWindowThreadProcessId , OpenProcess 和ReadProcessMemory

    文章目录 FindWindow 函数功能: 函数声明: 第一个参数 第二个参数 返回值 注意: GetWindowThreadProcessId 函数功能 函数声明 第一个参数: 第二个参数: 返回值 ...

  10. WinAPI-函数OpenProcess/ReadProcessMemory/WriteProcessMemory

    OpenProcess函数声明如下,失败则返回NULL(0,也就是false) #include <Windows.h> HANDLE OpenProcess ( DWORD desire ...

最新文章

  1. Can't toast on a thread that has not called Looper.prepare()
  2. SVG配电站接线系统绘制
  3. 【自然框架】稳定版beta1——源码下载,Demo说明
  4. mysql5.7rpm安装 force_mysql5.7.27离线安装(基于centos7 ,通过rpm安装)
  5. 分享超全的 Linux 渗透测试命令速查表
  6. java程序中可以有几个构造方法_java中多个构造方法可以相互引用么?
  7. iphone屏幕上的圆圈怎么设置_iphone亮度条不变屏幕变暗怎么回事【解决方法】
  8. 微信小程序开发系列六:微信框架API的调用
  9. 继续分享 5 个实用的 vs 调试技巧
  10. Spring boot:注解@SpringBootApplication
  11. 浅谈语音识别技术的发展趋势与应用前景 - 全文
  12. Android4.2之Camera系统HAL调用流程
  13. Electron 设置透明窗口transparent 属性win7无效详解
  14. 北斗卫星导航系统介绍
  15. Scipy安装遇到的问题
  16. Boxy SVG for Mac(矢量图编辑器)
  17. 麒麟子出了一款免费3D角色虚拟摇杆控制器!这也太好用了
  18. Ps素描效果引用说明
  19. 小插曲--树莓派屏幕分辨率调整
  20. linux oracle 常用操作

热门文章

  1. 科密指纹考勤机软件配置
  2. 通用即插即用监视器驱动下载_请你给广色域显示器装下驱动好么? 尤其是k7b小金刚以及nano ips面板显示器的用户...
  3. 一、Django初级
  4. EOS开发DApp 创建EOS钱包和账号
  5. CUDA C 编程/Nsight可视化
  6. ITIL4 服务管理的四个维度
  7. css实现LED液晶数码字体
  8. MacOS Monterey 12.6(21G115) OC 0.8.4 / Cl 5149 / PE 三分区原版黑苹果镜像
  9. 2020年ACM算法竞赛夏季短学期 任务安排
  10. rpcbind 服务启动失败