关闭

C++调用NTAPI枚举并强制关闭指定进程

标签: winapisystemx86iohook
41262人阅读 评论(2) 收藏 举报
分类:
#include "../../RLib/RLib/native/RLib_Native.h"
#pragma comment(lib, "ntdll.lib")


Array<handle> *found_if_process_by_name(LPCWSTR name IN, LPCWSTR parent_name IN)
{
	unsigned long bytes = 0;
	ManagedMemoryBlock<char> buffer;

	// process enumeration
	while (true) {
		auto status = NtQuerySystemInformation(SystemProcessInformation,
											   buffer.ToAny<psystem_process_information>(), 
											   bytes, 
											   &bytes);
		if (!NT_SUCCESS(status)) {
			if (status == STATUS_INFO_LENGTH_MISMATCH) {
				buffer = ManagedMemoryBlock<char>(bytes * 2).SuppressFinalize();
				continue;
			}
			// failed
			return nullptr;
		}
		break;
 	}
	
	// find target process by name
	int lastBucket                    = -1;
	HANDLE processId[16]              = { NULL };
	HANDLE inheritedFromProcessId[16] = { NULL };
	auto lpProcessInfo = buffer.ToAny<system_process_information>();
	while (lpProcessInfo->NextEntryOffset != 0) {
		if (lpProcessInfo->ImageName.Buffer != NULL) {
			if (_wcsicmp(lpProcessInfo->ImageName.Buffer, name) == 0) {
				inheritedFromProcessId[++lastBucket] = lpProcessInfo->InheritedFromProcessId;
				processId[lastBucket] = lpProcessInfo->ProcessId;
			} //if
		}
		lpProcessInfo = reinterpret_cast<psystem_process_information>(reinterpret_cast<ulong>(lpProcessInfo) + lpProcessInfo->NextEntryOffset);
	}

	// find parent process by process id
	ManagedObject<Array<handle>> processIdList = new Array<handle>(16);
	if (processIdList.IsSatisfied() && lastBucket >= 0){
		lpProcessInfo = buffer.ToAny<system_process_information>();
		while (lpProcessInfo->NextEntryOffset != 0) {
			if (lpProcessInfo->ImageName.Buffer != NULL) {
				auto offsetLastBucket = lastBucket;
				while (offsetLastBucket >= 0) {
					if (lpProcessInfo->ProcessId == inheritedFromProcessId[offsetLastBucket]) {
						if (_wcsicmp(lpProcessInfo->ImageName.Buffer, parent_name) == 0) {
							processIdList->Add(processId[offsetLastBucket]);
						} //if
					} //if
					--offsetLastBucket;
				} //for
			}
			lpProcessInfo = reinterpret_cast<psystem_process_information>(reinterpret_cast<ulong>(lpProcessInfo) + lpProcessInfo->NextEntryOffset);
		}
	} //if

	// final result
	return processIdList.SuppressFinalize();
}

//-------------------------------------------------------------------------

HANDLE open_process_by_pid(HANDLE pid IN)
{
	return OpenProcess(PROCESS_TERMINATE, TRUE, reinterpret_cast<dword>(pid));
// 	HANDLE handle_opened;
// 	OBJECT_ATTRIBUTES oa = { 0 };
// 	CLIENT_ID cid        = { pid, 0 };
// 	auto status = NtOpenProcess(&handle_opened, PROCESS_TERMINATE, &oa, &cid);
// 	if (status != STATUS_SUCCESS) {
// 		Exception::SetLastError(RtlNtStatusToDosError(status));
// 		ManagedObject<exception> ex = Exception::GetLastException();
// 		return NULL;
// 	}
// 	return handle_opened;
}

//-------------------------------------------------------------------------

	// force quit msword
	ManagedObject<Array<handle>> processIdList = found_if_process_by_name(_T("WINWORD.EXE"), _T("svchost.exe"));
	if (processIdList && processIdList->Length > 0){
		foreachp(lppid, processIdList)
		{
			auto status = NtTerminateProcess(open_process_by_pid(*lppid), STATUS_ALREADY_DISCONNECTED);
			if (status != STATUS_SUCCESS){
				Exception::SetLastError(RtlNtStatusToDosError(status));
				ManagedObject<exception> ex = Exception::GetLastException();
				return NULL;
			} //if
		}
	} //if
0
0
查看评论

强制结束进程的两种实现方式

强制结束进程的两种实现方式--C#和C++实现 最近在做一个大型的项目,由于进程之间的关联出了一些问题,长话短说,就是我们不得不强制停止某些进程以保证系统正常的运行,在网上找了一下,没发现有这方面详细的介绍和写的比较全面的文章,于是按照MSDN的说明写了两种方法,希望对遇到类似问题的朋友有所帮...
  • ghevinn
  • ghevinn
  • 2012-10-16 16:25
  • 2920

NTAPI的定义

NTAPI的定义From WinNT.h #define NTAPI __stdcall
  • loongsking
  • loongsking
  • 2014-10-24 11:24
  • 1820

c/c++ 结束进程的方法

1.使用ExitProcess()结束进程      进程只是提供了一段地址空间和内核对象,其运行时通过在其地址空间内的主线程来体现的。当主线程的进入点函数返回时,进程也就随之结束。这种进程的终止方式是进程的正常退出,进程中的所有线程资源都能够得到正确的清除...
  • Iamduoluo
  • Iamduoluo
  • 2011-08-10 20:31
  • 11587

C++ 关闭其他进程

BOOL bTerminateProcess = FALSE; HWND hwndException = NULL; BOOL CALLBACK EnumWindowsProc(_In_ HWND hwnd, _In_ LPARAM lParam) { char wcText[MAX_PATH *...
  • sz76211822
  • sz76211822
  • 2016-10-26 17:36
  • 669

C++删除某个特定的进程

总结一个删除某个进程的函数,实现类似于在任务管理器中关闭某个进程的功能。   引用头文件: #include BOOL KillProcessFromName(CString strProcessName) { //创建进程快照(TH32CS_SNAPPROCESS表示...
  • shufac
  • shufac
  • 2016-06-16 16:26
  • 839

C++实现查看当前应用程序名称,并结束指定应用程序

获取当前运行应用程序步骤(当前运行应用程序,不管是什么软件,都是以窗口形式展现给我们,所以要获取应用程序信息,可以通过枚举窗口实现) 1.判断窗口是否可以看见 IsWindowVisible(hwnd); 2.获取窗口名称 GetWindowText(hwnd, str, siz...
  • qq_26790617
  • qq_26790617
  • 2016-03-25 14:01
  • 1537

C++ 枚举进程信息,并结束指定进程

1.枚举进程,获取信息 DWORD needed; HANDLE hProcess=NULL; HMODULE hModule; wchar_t path[260] = _T(""); HANDLE hToken; HANDLE  hProcessSnap = NU...
  • qq_26790617
  • qq_26790617
  • 2016-03-25 14:43
  • 934

C++进程检测,发现进程路径,关闭进程(一)

#include "stdafx.h" #include #include "stdio.h" #include #include "Psapi.h" BOOL DosPathToNtPath(LPTSTR pszDosP...
  • jisuanji_wjfioj
  • jisuanji_wjfioj
  • 2014-12-14 18:49
  • 1045

C++杀进程

源代码: #include #include #include #include #pragma comment(lib,"kernel32.lib") #pragma comment(lib,"advapi32.lib") void EnableD...
  • feier7501
  • feier7501
  • 2013-07-24 08:38
  • 5935

内核枚举进程总结

我知道的有三种方法 这里的第三种和第二种是一样的 隐藏进程也可以在这么做手脚 但需要注意多线程,在操作前,理应加锁 可以参考这篇文章 http://blog.csdn.net/zfdyq0/article/details/41813747 1.暴力枚举进程 通过PsLookupProcessB...
  • zhuhuibeishadiao
  • zhuhuibeishadiao
  • 2016-05-02 03:17
  • 1458
    联系作者
    通过QQ与我联系(全天候7*24小时基本不在线)
    最新评论
    免责声明
    如果转载的文章侵犯了您的版权,请务必告知,我将立刻删除;
    博客所有文章允许转载,原创类不要求注明出处,随意就好;
    如果是转载的文章,建议直接转载原始来源,因为原作者极可能有更新