// m1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include"stdio.h"
#include <windows.h>
#include <tlhelp32.h>
void shutdown()
{
// 以下为提权函数,使其用关机权限,
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
{
printf("OpenProcessToken调用失败");
}
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,false,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);
//下面为关机函数
if(!ExitWindowsEx(EWX_SHUTDOWN ,0))
{
printf("关机失败");
}
}
int main(int argc, char* argv[])
{
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SN
APPROCESS, 0);
if(hProcessSnap == INVALID_HANDLE_VALUE)
{
printf(" CreateToolhelp32Snapshot调用失败!");
return -1;
}
BOOL bMore = ::Process32First(hProcessSnap, &pe32);
while(bMore)
{
printf(" 进程名称:%s \n", pe32.szExeFile);
if(stricmp("
QQ.exe",pe32.szExeFile)==0)
{
printf("QQ 运行中,准备关机");
shutdown();
break;
}
if(stricmp("Thunder.exe",pe32.szExeFile)==0)
{
printf("Thunder 运行中,准备关机");
shutdown();
break;
}
bMore = ::Process32Next(hProcessSnap, &pe32);
}
::CloseHandle(hProcessSnap);
printf("QQ 不在运行");
return 0;
}
PROCESSENTRY32(来自百度百科)用来存放快照进程信息的一个结构体。(存放进程信息和调用成员输出进程信息)用来 Process32First指向第一个进程信息,并将进程信息抽取到PROCESSENTRY32中。用Process32Next指向下一条进程信息。
1.
DWORD exitCode;
char fileName[]="chrome.exe";
DWORD handleId=FindProcess(fileName);
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,handleId);
GetExitCodeProcess(hProcess,&exitCode);
::TerminateProcess(hProcess,exitCode);
printf("Failed: GetLastError returned %u\n", exitCode);
2.
TerminateProcess 函数终止指定进程及其所有
线程。
3.
GetExitCodeProcess 获取一个已中断进程的退出代码
4.
OpenProcess 函数用来打开一个已存在的进程对象,并返回进程的句柄。
5.
FindProcess获取进程id