OpenProcess()函数
来源:互联网 发布:js判断数字是否为整数 编辑:程序博客网 时间:2024/05/16 14:39
方法名称: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
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
如成功,返回值为指定进程的句柄。
如失败,返回值为NULL,可调用GetLastError()获得错误代码。
通过一个进程关闭另外一个进程的时候,一般的做法就是枚举系统打开的所用进程的标识符(PID),使用OpenProcess函数获得进程的句柄,该函数可以通过第一个参数来设置句柄的新的访问权限(不清楚句柄是不是和原来的一模一样?有待证明和学习),比如如果打开的句柄不具备终止句柄的权限,直线终止进程操作会失败,返回的错误代码为5(意思为拒绝访问)。通过获得的句柄就可以获得进程名字(通过GetModuleBaseName函数),通过比对进程名字就可以获得我们指定要关闭的进程。注:要使用closeHandle函数来削减进程计数器。
#include <windows.h>#include <Psapi.h>#include <iostream>#include <tchar.h>using std::cout;using std::endl;HANDLE hDesProcess = NULL;//根据进程的名字(image name)来查找该进程是否是打开的bool FindProcess( LPCTSTR lpszProcessName ){DWORD dwProcessIdentify[MAX_PATH] = { 0 };DWORD dwTrueBytes = 0;HANDLE hProcess = NULL;if ( !EnumProcesses( dwProcessIdentify, MAX_PATH*sizeof(DWORD), &dwTrueBytes )){cout << "enum process fail " << endl;return false;}int nProcessNum = dwTrueBytes/sizeof(DWORD);HMODULE hModuleInProcess[MAX_PATH] = { 0 };DWORD dwModuleBytes = 0;TCHAR moduleBaseName[MAX_PATH] = { 0 };for ( int nIndex = 0; nIndex < nProcessNum; ++nIndex ){hProcess = OpenProcess( PROCESS_ALL_ACCESS, false, dwProcessIdentify[nIndex] );// if ( hProcess == NULL )// {// continue;// }// memset( hModuleInProcess, 0, MAX_PATH*sizeof(HMODULE));// dwModuleBytes = 0;// if ( !EnumProcessModules( hProcess, hModuleInProcess, MAX_PATH*sizeof(HMODULE),&dwModuleBytes ))// {// cout << "Enum modules in process failed " << endl;// DWORD dwErrorCode = GetLastError();// //return false;// continue;// }//int nModulesNumInProcess = dwModuleBytes/sizeof(DWORD);memset( moduleBaseName, 0, MAX_PATH*sizeof(TCHAR));//for ( int nModuleIndex = 0; nModuleIndex < nModulesNumInProcess; ++nModuleIndex ){GetModuleBaseName( hProcess, NULL,moduleBaseName,MAX_PATH );if ( !_tcscmp( moduleBaseName, lpszProcessName)){cout << "查找的进程存在" << endl;hDesProcess = hProcess;return true;}}}return false;}const LPCTSTR lpszProcessName = _T("DriveTheLife.exe");int main(){if ( !FindProcess( lpszProcessName )){cout << "进程不存在" << endl;return EXIT_FAILURE;}//终止目标进程UINT unExitCode = 0;if ( hDesProcess != NULL ){BOOL bRet = TerminateProcess( hDesProcess, unExitCode );if ( !bRet ){DWORD dwErrorCode = GetLastError();cout << "进程终止失败" << endl;}}DWORD dw = WaitForSingleObject( hDesProcess, INFINITE );switch ( dw ){case WAIT_OBJECT_0:cout << 1 << endl;break;case WAIT_FAILED:{DWORD dw1 = GetLastError();cout << 2 << endl;}break ;default:cout << 3 << endl;}return EXIT_SUCCESS;}
在使用此函数时会发现不能成功获得有些系统进程的句柄,原因是没有权限。解决办法是在调用此函数前让我们的进程提升权限。
提升权限的函数(当然不会是所以地方都起作用,视情况而定)
bool AdjustProcessTokenPrivilege(){LUID luidTmp;HANDLE hToken;TOKEN_PRIVILEGES tkp;if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken)){OutputDebugString("AdjustProcessTokenPrivilege OpenProcessToken Failed ! \n");cout<<"AdjustProcessTokenPrivilege OpenProcessToken Failed !"<<endl;}if(!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luidTmp)){OutputDebugString("AdjustProcessTokenPrivilege LookupPrivilegeValue Failed !");cout<<"AdjustProcessTokenPrivilege LookupPrivilegeValue Failed !"<<endl;CloseHandle(hToken);return FALSE;}tkp.PrivilegeCount = 1;tkp.Privileges[0].Luid = luidTmp;tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;if(!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL)){OutputDebugString("AdjustProcessTokenPrivilege AdjustTokenPrivileges Failed ! \n");cout<<"AdjustProcessTokenPrivilege AdjustTokenPrivileges Failed !"<<endl;CloseHandle(hToken);return FALSE;}CloseHandle(hToken);return true;}
1 0
- OpenProcess函数
- OpenProcess函数
- OpenProcess()函数
- OpenProcess()函数
- OpenProcess函数
- OpenProcess函数
- openprocess
- OpenProcess
- OpenProcess
- OpenProcess
- OpenProcess
- OpenProcess
- API函数之五 OpenProcess Function
- 函数说明(OpenProcess ) 08.11.2
- 进程保护原理Hook函数Openprocess
- Windows API一日一练(89)OpenProcess函数
- Windows API一日一练(89)OpenProcess函数
- Windows API一日一练(89)OpenProcess函数
- github 快速入门教程
- 文件上载时报错 org.apache.hadoop.security.AccessControlException:Permission denied
- Note of big data dummies:Looking at Real-Time and Non-Real-Time Requirements
- POJ3114——Countries in War
- 生命的真谛?
- OpenProcess()函数
- 二分图的最大匹配 (匈牙利算法)
- 2014.10.6
- UVA - 10499 The Land of Justice
- 黑马程序员——Java基础——IO流笔记(FileInputStream和FileOutputStream使用示例)
- 我读经典(8):以独特的视角来看软件工程--读《构建之法:现代软件工程》有感
- poj3067(树状数组求逆序数)
- 【c++】内存偏移、成员函数和成员变量、static成员函数、变量
- linux脚本编程---ubuntu-12.04-server-amd64如何配置图形界面