OpenProcess()函数

方法名称: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函数来削减进程计数器。

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


  • 14
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值