1,结束进程需要提升权限,下面是一个结束指定ID进程的程序片段,希望对你又帮助。
这个是完整的代码,pslist函数列出所有进程,killps杀掉指定ID的进程。
#include <windows.h>
#include <stdio.h>
#include <Tlhelp32.h>
void pslist(void);
BOOL killps(DWORD id);
BOOL SetPrivilege(HANDLE hToken,LPCTSTR lpszPrivilege,BOOL bEnablePrivilege);
void pslist(void)
{
HANDLE hProcessSnap = NULL;
PROCESSENTRY32 pe32= {0};
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //创建一个进程快照
if (hProcessSnap == (HANDLE)-1)
{
printf("\nCreateToolhelp32Snapshot() failed:%d",GetLastError());
return ;
}
pe32.dwSize = sizeof(PROCESSENTRY32); //初始化PROCESSENTRY32结构体
printf("\nProcessName ProcessID");
if (Process32First(hProcessSnap, &pe32)) //第一个进程
{
char a[5];
do //开始枚举进程
{
itoa(pe32.th32ProcessID,a,10); //转换进程ID号
printf("\n%-20s%d",pe32.szExeFile,pe32.th32ProcessID); //输出进程名字和ID
}
while (Process32Next(hProcessSnap, &pe32));
}
else
{
printf("\nProcess32Firstt() failed:%d",GetLastError());
}
CloseHandle (hProcessSnap);
return;
}
BOOL killps(DWORD id)
{
HANDLE hProcess=NULL,hProcessToken=NULL;
BOOL IsKilled=FALSE,bRet=FALSE;
// try
{
//获得进程访问令牌的句柄
if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hProcessToken))
{
printf("\nOpen Current Process Token failed:%d",GetLastError());
// __leave;
}
//printf("\nOpen Current Process Token ok!");
if(!SetPrivilege(hProcessToken,SE_DEBUG_NAME,TRUE)) //提升权限
{
// __leave;
}
printf("\nSetPrivilege ok!");
if((hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,id))==NULL) //打开进程
{
printf("\nOpen Process %d failed:%d",id,GetLastError());
// __leave;
}
//printf("\nOpen Process %d ok!",id);
if(!TerminateProcess(hProcess,1)) //关闭进程
{
printf("\nTerminateProcess failed:%d",GetLastError());
// __leave;
}
IsKilled=TRUE;
}
//__finally
{
if(hProcessToken!=NULL) CloseHandle(hProcessToken);
if(hProcess!=NULL) CloseHandle(hProcess);
}
return(IsKilled);
}
BOOL SetPrivilege(HANDLE hToken,LPCTSTR lpszPrivilege,BOOL bEnablePrivilege) //提升权限
{
TOKEN_PRIVILEGES tp;
LUID luid;
if(!LookupPrivilegeValue(NULL,lpszPrivilege,&luid)) //查询权限GUID
{
printf("\nLookupPrivilegeValue error:%d", GetLastError() );
return FALSE;
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if (bEnablePrivilege)
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
tp.Privileges[0].Attributes = 0;
AdjustTokenPrivileges( //修改访问令牌
hToken,
FALSE,
&tp,
sizeof(TOKEN_PRIVILEGES),
(PTOKEN_PRIVILEGES) NULL,
(PDWORD) NULL);
if (GetLastError() != ERROR_SUCCESS)
{
printf("AdjustTokenPrivileges failed: %u\n", GetLastError() );
return FALSE;
}
return TRUE;
}
void main()
{
pslist();
// killps(2544);
}
2,
首先根据进程名找到该进程的ID,如已知某进程的进程名为Application.exe,可以用列举进程的办法找的该进程的ID(前提是系统中有且只有一个这样的进程):
HANDLE hProcessSnap;
TCHAR ProcessName[]="Application.exe";
DWORD ProcessID=0x00;
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hProcessSnap==INVALID_HANDLE_VALUE)
{
printf("列举进程失败\n");
return ;
}
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);
BOOL bProcess = Process32First(hProcessSnap, &pe32);
TCHAR buff[1024];
while(bProcess)
{
if(strcmp(ProcessName,pe32.szExeFile)==0)
{
ProcessID= pe32.th32ProcessID;
break;
}
memset(buff, 0x00, 1024);
bProcess=Process32Next(hProcessSnap, &pe32);
}
if(ProcessID==0)
{
printf("没有找到进程%s", ProcessName);
return;
}
然后把ProcessID作为参数,按照下面这篇文章所说的方法得到该进程的主窗口句柄:http://www.vckbase.com/document/viewdoc/?id=404
假设得到的句柄为pWnd,然后直接向该窗口发送关闭消息即可:
pWnd->PostMessage(WM_CLOSE); //这种方法是让目标进程自己退出,所以属于安全退出
一般程序会默认处理WM_CLOSE消息,所以当向一个进程的主窗口窗口发送WM_CLOSE消息时就可以关闭该进程,不信你可以试试用下面的代码向任务管理器发送WM_CLOSE消息:
HWND hwnd = ::FindWindow("#32770","Windows 任务管理器");
if(hwnd)
{
::PostMessage(hwnd , WM_CLOSE, 0, 0);
}
要想让被关闭程序在退出之前完成当前任务,则只有在被关闭程序中添加WM_CLOSE的消息函数OnClose(),在里面作出规定:只有在完成任务后才能退出