//头文件
#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
字符集-> 使用多字节字符集