整理Windows下用vs2010写的简单看门狗

//头文件
#include <WinSock2.h>
#include <psapi.h>
#include <string.h>
//库
#pragma comment (lib,"Advapi32.lib")
#pragma comment (lib,"Psapi.lib")


// =================================================================== 
// 函 数 名:ProcessToPID
// 功能描述:遍历进程
// 输入参数:
// 输出参数:
// 创建日期:
// 作    者:
// 附加说明:成功发现进程返回进程号,未发现则返回0
// ===================================================================
DWORD ProcessToPID()
{
	DWORD aProcesses[1024], cbNeeded, cProcesses; 
	unsigned int i; 
	HANDLE hProcess = NULL; 
	HMODULE hMod = NULL; 
	char szProcessName[MAX_PATH] = {0}; 

	//提升权限
	//AddPrivilege(SE_DEBUG_NAME); 

	// 计算目前有多少进程, aProcesses[]用来存放有效的进程PIDs 
	if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ) 
	{ 
		return 0; 
	} 


	cProcesses = cbNeeded / sizeof(DWORD); 
	// 按有效的PID遍历所有的进程 
	for ( i = 0; i < cProcesses; i++ ) 
	{ 
		// 打开特定PID的进程 
		hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, aProcesses[i]); 
		// 取得特定PID的进程名 
		if ( hProcess ) 
		{ 
			if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) ) 
			{ 
				GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName) ); 
				//将取得的进程名与输入的进程名比较,如相同则返回进程PID 
				if(!stricmp(szProcessName, "calc.exe")) 
				{ 
					CloseHandle( hProcess ); 
					printf(" find the one\n");
					return aProcesses[i]; 
				} 
			} 
		}
	}
	//没有找到相应的进程名,返回0 
	CloseHandle( hProcess ); 
	return 0; 
}


int _tmain(int argc, _TCHAR* argv[])
{
	DWORD ret = 0;
	while (1)
	{
		if ((ret=ProcessToPID()) == 0)
		{
			printf(" no \n");
			system("start calc");//system("start calc.exe") 均可
		}
		else
		{
			printf(" yes \n");
		}
		Sleep(3000);
	}
	return 0;
}

看到有的watchdog中需要提升权限,下面把提升权限函数贴出来,可以直接用

// =================================================================== 
// 函 数 名:AddPrivilege
// 功能描述:添加权限
// 输入参数:
// 输出参数:
// 创建日期:
// 作    者:
// 附加说明:
// ===================================================================
int AddPrivilege(const char *Name) 
{ 
	HANDLE hToken; 
	TOKEN_PRIVILEGES tp; 
	LUID Luid; 

	if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken)) 
	{ 
		printf("OpenProcessToken error.\n"); 
		return 1; 
	} 

	//修改进程权限
	if (!LookupPrivilegeValue(NULL,Name,&Luid)) 
	{ 
		printf("LookupPrivilegeValue error.\n"); 
		return 1; 
	} 

	tp.PrivilegeCount = 1; 
	tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
	tp.Privileges[0].Luid = Luid; 

	//通知系统修改进程权限
	if (!AdjustTokenPrivileges(hToken, 	0, 	&tp, sizeof(TOKEN_PRIVILEGES), 	NULL, NULL)) 
	{ 
		printf("AdjustTokenPrivileges error.\n"); 
		return 1; 
	} 

	return 0; 
} 

以上:1.system("start calc")  : cmd命令,start 重新打开cmd窗口,对于启动自己写的程序时需要用到,否则会在看门狗的exe中执行你自己写的程序,这里已计算器程序为例、   

 2.另外,此exe需要和你自己写的程序在同一文件夹内。

 3.附上,可以将看门狗控制台隐藏

#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )

Note:项目属性 ->常规  :MFC的使用 -> 在共享DLL中使用MFC

字符集-> 使用多字节字符集

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值