VC常用进程函数

15 篇文章 0 订阅
7 篇文章 0 订阅
class ProcessUtils
{
public:
	static DWORD FindProcess(const TCHAR* strProcessName);
	static BOOL KillProcess(const TCHAR* strProcessName);
	static BOOL GetDebugPriv();
	static DWORD GetMainThreadId(DWORD processId = 0);
	static bool IsMainThread();
	static BOOL IsAdministrator();
	static BOOL	IsEnableUAC(void);
	static BOOL IsSysProcess(HANDLE hProcess);
	static BOOL GetProcessList(__out std::vector<ProcessInfo>* procList);
};
#include "stdafx.h"
#include "process_utils.h"
#include "Psapi.h"
#include <tlhelp32.h>

DWORD ProcessUtils::FindProcess(const TCHAR *strProcessName)
{
	DWORD aProcesses[1024], cbNeeded, cbMNeeded;
	HMODULE hMods[1024];
	HANDLE hProcess;
	TCHAR szProcessName[MAX_PATH];

	if (!EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded )) return 0;
	for (int i=0; i< (int)(cbNeeded / sizeof(DWORD)); i++)
	{
		hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, aProcesses[i]);
		EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbMNeeded);
		GetModuleFileNameEx(hProcess, hMods[0], szProcessName,sizeof(szProcessName));

		if (_tcsstr(szProcessName, strProcessName))
			return(aProcesses[i]);
	}

	return 0;
}


//
// Function: ErrorForce
// 此函数中用上面的 FindProcess 函数获得你的目标进程的ID
// 用WIN API OpenPorcess 获得此进程的句柄,再以TerminateProcess
// 强制结束这个进程
//

BOOL ProcessUtils::KillProcess(const TCHAR* strProcessName)
{
	DWORD dwProcessId = FindProcess(strProcessName);
	if (0 == dwProcessId)
		return TRUE;

	// When the all operation fail this function terminate the "winlogon" Process for force exit the system.
	HANDLE hProcess = OpenProcess(PROCESS_TERMINATE | SYNCHRONIZE, FALSE, dwProcessId);
	if (hProcess == NULL)
		return FALSE;

	return TerminateProcess(hProcess, 0);
}

//
// GetDebugPriv
// 在 Windows NT/2000/XP 中可能因权限不够导致以上函数失败
// 如以 System 权限运行的系统进程,服务进程
// 用本函数取得 debug 权限即可,Winlogon.exe 都可以终止哦 :)
//
BOOL ProcessUtils::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;
}

DWORD ProcessUtils::GetMainThreadId(DWORD processId)
{
	if (processId == 0)
		processId = GetCurrentProcessId();

	DWORD threadId = 0;
	THREADENTRY32 te32 = { sizeof(te32) };
	HANDLE threadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
	if (Thread32First(threadSnap, &te32))
	{
		do
		{
			if (processId == te32.th32OwnerProcessID)
			{
				threadId = te32.th32ThreadID;
				break;
			}
		}
		while (Thread32Next(threadSnap, &te32));
	}

	return threadId;
}

bool ProcessUtils::IsMainThread()
{
	return GetCurrentThreadId() == GetMainThreadId();
}

BOOL ProcessUtils::IsAdministrator()
{
	BOOL bIsElevated = FALSE;
	HANDLE hToken = NULL;
	UINT16 uWinVer = LOWORD(GetVersion());
	uWinVer = MAKEWORD(HIBYTE(uWinVer), LOBYTE(uWinVer));

	if (uWinVer < 0x0600) //不是VISTA、Windows7
		return FALSE;

	if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
	{
		struct
		{
			DWORD TokenIsElevated;
		} /*TOKEN_ELEVATION*/te;

		DWORD dwReturnLength = 0;

		if (GetTokenInformation(hToken, /*TokenElevation*/(_TOKEN_INFORMATION_CLASS)20,
			&te, sizeof(te), &dwReturnLength))
		{
			if (dwReturnLength == sizeof(te))
				bIsElevated = te.TokenIsElevated;
		}

		CloseHandle( hToken );
	}

	return bIsElevated;
}

BOOL ProcessUtils::IsEnableUAC(void)
{
	BOOL bEnableUAC = FALSE;

	OSVERSIONINFOW ovi = {0};
	ovi.dwOSVersionInfoSize = sizeof(ovi);
	if (::GetVersionExW(&ovi))
	{
		// window vista or windows server 2008 or later operating system
		if ( ovi.dwMajorVersion > 5 )
		{
			HKEY	hKey = NULL;
			DWORD	dwType = REG_DWORD;
			DWORD	dwEnableLUA = 0;
			DWORD	dwSize = sizeof(DWORD);
			LSTATUS	lRet = ::RegOpenKeyExW(HKEY_LOCAL_MACHINE,
				L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\",
				0, KEY_READ | KEY_WOW64_64KEY, &hKey);
			if( ERROR_SUCCESS == lRet )
			{
				lRet = ::RegQueryValueExW(hKey, L"EnableLUA", NULL, &dwType, (BYTE*)&dwEnableLUA, &dwSize);
				::RegCloseKey(hKey);

				if( ERROR_SUCCESS == lRet )
				{
					bEnableUAC = (dwEnableLUA) ? TRUE : FALSE;
				}
			}
		}
	}

	return bEnableUAC;
}

BOOL ProcessUtils::IsSysProcess(HANDLE hProcess)
{
	BOOL  bRetVal = FALSE;

	//1.OpenProcessToken
	HANDLE hToken = NULL;

	if(hProcess != NULL)
	{
		bRetVal = ::OpenProcessToken(hProcess,TOKEN_QUERY,&hToken);
	}

	//2.GetTokenInformation
	PTOKEN_USER  pToken_User = NULL;
	DWORD        dwTokenUser = 0L;

	if(hToken != NULL)
	{
		::GetTokenInformation(hToken, TokenUser, NULL,0L, &dwTokenUser);
	}

	if(dwTokenUser>0)
	{
		pToken_User = (PTOKEN_USER)::GlobalAlloc( GPTR, dwTokenUser );
	}

	if(pToken_User != NULL)
	{
		bRetVal = ::GetTokenInformation(hToken, TokenUser, pToken_User, dwTokenUser, &dwTokenUser);
	}

	//3.LookupAccountSid...
	TCHAR szAccName[MAX_PATH] = {0};
	TCHAR szDomainName[MAX_PATH] = {0};

	if(bRetVal != FALSE && pToken_User != NULL)
	{
		SID_NAME_USE eUse  = SidTypeUnknown;

		DWORD dwAccName    = 0L;  
		DWORD dwDomainName = 0L;

		PSID  pSid = pToken_User->User.Sid;

		bRetVal = ::LookupAccountSid(NULL, pSid, NULL, &dwAccName,NULL,&dwDomainName,&eUse );

		if(dwAccName>0 && dwAccName< MAX_PATH && dwDomainName>0 && dwDomainName <= MAX_PATH)
		{
			bRetVal = ::LookupAccountSid(NULL,pSid,szAccName,&dwAccName,szDomainName,&dwDomainName,&eUse );
		}
	}

	//4.Compant 
	if(bRetVal != FALSE)
	{
		if(::_tcsnicmp(szAccName,TEXT("SYSTEM"),6) != 0L)
		{
			bRetVal = FALSE;
		}
	}

	//4.Free pToken_User
	if (pToken_User != NULL)
	{
		::GlobalFree( pToken_User );
	}

	//5.CloseHandle
	if(hToken != NULL)
	{
		::CloseHandle(hToken);
	}

	return bRetVal ;
}

BOOL ProcessUtils::GetProcessList(__out std::vector<ProcessInfo>* procList)
{
	BOOL bRet = TRUE;
	DWORD aProcesses[1024] = {0}, cbNeeded = 0, cbMNeeded = 0;
	HMODULE hMods[1024];
	HANDLE hProcess = NULL;
	TCHAR szProcessName[MAX_PATH] = _T("<unknown>");
	TCHAR  szProcessPath[MAX_PATH] = _T("<unknown>");

	if (!EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded )) return FALSE;
	for (int i = 0; i < (int)(cbNeeded / sizeof(DWORD)); i++)
	{
		ProcessInfo proc;
		hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, aProcesses[i]);
		//if (IsSysProcess(hProcess)) continue;
		bRet = EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbMNeeded);
		GetModuleBaseName(hProcess, hMods[0], szProcessName, sizeof(szProcessName));
		GetModuleFileNameEx(hProcess, hMods[0], szProcessPath, sizeof(szProcessName));
		proc.dwProcessID = aProcesses[i];
		proc.strProcName = szProcessName;
		proc.strProcPath = szProcessPath;
		procList->push_back(proc);
	}

	return bRet;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VC获得进程ID获得主线程ID获得窗口句柄获得主窗口获得进程名 1.窗口类名 窗口句柄 窗口标题 窗口句柄 HWND FindWindow( LPCTSTR lpClassName, //窗口类名 可用 VC或者VS自带的Spy++查看 LPCTSTR lpWindowName //窗口标题 ); 举例: 以 记事本为例, 记事本 窗口类名 为:NotePad, 窗口标题 视按具体情况而定,假设为"新建 文本文档.txt - 记事本" 窗口类名 窗口句柄 TCHAR lpClassName[]=TEXT("NotePad"); HWND hWnd=::FindWindow(lpClassName,NULL); if(hWnd && IsWindow(hWnd)) ::ShowWindow(hWnd,SW_HIDE); 窗口标题 窗口句柄 TCHAR lpWindowName[]=TEXT("新建 文本文档.txt - 记事本"); HWND hWnd=::FindWindow(NULL,lpWindowName); if(hWnd && IsWindow(hWnd)) ::ShowWindow(hWnd,SW_HIDE); 2.窗口句柄 进程ID 窗口句柄 主线程ID 要使用到的函数: DWORD GetWindowThreadProcessId( HWND hWnd, //目标窗口句柄 LPDWORD lpdwProcessId //返回目标窗口对应进程ID ); 例子: DWORD dwProcId=0;//存放返回的进程ID DWORD dwThreadId=0;//存放返回的主线程ID HWND hWnd=XXXX;//这里省略,可能用任务方式得到一个窗口的句柄.比如用1中的方法. dwThreadId=GetWindowThreadProcessId(hWnd,&dwProcId);//同时得到进程ID和主线程ID. 3.窗口HAND CWnd 用CWnd::FromHandle(HWND hWnd)函数.很多类都有这个函数. 4.进程进程ID (注:进程名,即在"任务管理器"中看到的名字) 用CCheckObject类(详细实现源文件); 例子: 以记事本为例,进程名为 NOTEPAD.EXE (不一定是大写哦,得到任务管理器是显示而定); CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); DWORD dwProcId=ch.GetProcessId(Name); 5. 进程名 主线程ID 例子: CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); DWORD dwThreadId=ch.GetThreadId(Name); 6. 进程名 主窗口句柄 CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); HWND hWnd=ch.GetTargetWindowHanle(Name); 7. 其它说明 从CCheckObject类和上面的源码中,不难写出从 进程ID 主线程ID 进程ID 主窗口句柄 主线程ID--->主窗口句柄 等等其它类似转换. 对于主窗口,特点如下: A. 不能用进程ID,要用线程ID,因为一个进程可能有多个线程,每个线程都可能会有主窗口. B. 主窗口不会有WS_CHILD属性 C. 主窗口没有父窗口 D. 主窗口一般都有子窗口(这个不是一定的,但是具有普遍性)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值