小弟初学SDK写了个小玩意,请大家指点啦
用CheckProcess函数来选择想结束的进程名
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
//==========================================================
// 结构体名 : ProcessAttribute
// 功能 : 里面保存了单个进程的相关属性
//==========================================================
struct ProcessAttribute
{
DWORD ID; // 进程的ID
char ExeFile[100]; // 进程的名称
int total; // 判断进程是否存在 1 为存在其余的值为不存在
};
//================================================================
// 函数名:ShowProcess
// 功能 : 将系统内运行的进程写入文件,并且将进程相关信息储存起来
// 参数 : pAttribute 数据类型 : ProcessAttribute型指针
// 功能 : 接收ProcessAttribute结构体得地址
// 返回值 : 调用成功后返回1,失败后返回0;
//================================================================
int ShowProcess ( ProcessAttribute *pAttribute)
{
HANDLE Snapshot; // 声明1个句柄变量,接收CreateToolhelp32Snapshot函数的返回值
tagPROCESSENTRY32 process; // 声明结构体(详见msdn的Process32First函数)
char *ProcessInformation,*ptotal;
FILE *fp; // 建立文件指针
int total = 0, n=0 ;
ProcessAttribute *top;
top = pAttribute;
fp = fopen ("prcoessinformation.txt","w+"); // 建立或打开1个名为 prcoessinformation 的文件
process.dwSize = sizeof( tagPROCESSENTRY32 );
Snapshot = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS,0); //接收句柄值
if( Process32First (Snapshot,&process) == true ) //对于异常发生的处理
{
while( Process32Next ( Snapshot, &process ) )
{
ProcessInformation = ptotal = process.szExeFile; // 将prcoessinformation 指向process.szExeFile 字符串
while ( *ptotal != '\0' )
{
top->ExeFile[n] = *ptotal ; // 将进程名的字符数组的首地址传给top结构体里得ExeFile
total ++ ;
ptotal ++ ;
n ++;
}
top->ExeFile[n] = '\0';
n = 0;
top->ID = process.th32ProcessID; // 将和上一个进程名唯一的ID存入top结构体里的th32ProcessID
top->total = 1; // 判断进程是否存在
fwrite ( ProcessInformation, sizeof(char), total, fp );
total = 0 ;
top ++;
}
CloseHandle (Snapshot); //关闭句柄
fclose (fp); //关闭文件
return 1;
}
else
return 0;
}
//====================================================================
// 函数名 : CheckProcess
// 功能 : 判断现在运行的进程是否为非法进程表提供的非法进程
// 参数 : ProcessAttribute 数据结构 : pAttribute结构体指针
// 功能 : 传入一个pAttribute结构体指针,只能传入1个进程属性,然后按位
// 传入
// 返回参数 : id 或 0,1
// 说明 : 0为没有搜索到非法进程,id为搜索到非法进程的ID号
// 1为没有找到非法进程表文件
//====================================================================
DWORD CheckProcess ( ProcessAttribute *pAttribute )
{
FILE *fp;
DWORD id;
char Data[100]={"svchost.exe"}, *pData, *init;
int ntop = 0, m = 0;
ProcessAttribute *top;
pData = init = Data;
top = pAttribute;
if ( strcmp ( pData, top->ExeFile ) == 0)
{
id = top->ID;
return id;
}
return 0;
}
//=============================================================
// 函数名: CloseProcess
// 功能 : 关闭选定的进程
// 参数: processID 数据类型:DWORD
// 功能 : 选定要关闭进程的进程ID
//=============================================================
void CloseProcess (DWORD processID)
{
HANDLE hprocess; //进程的句柄
hprocess = OpenProcess(PROCESS_TERMINATE,true,processID); //得到该进程的句柄
TerminateProcess (hprocess,0);
CloseHandle (hprocess); // 关闭句柄
}
//===============================================================
// 函数名 :EnablePrivilege
// 功能 : 提升权限
//===============================================================
BOOL EnablePrivilege ()
{
HANDLE hToken;
LUID DebugValue;
TOKEN_PRIVILEGES tkp;
if ( !OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken) )
return FALSE;
if ( !LookupPrivilegeValue((TCHAR *) NULL, SE_DEBUG_NAME, &DebugValue) )
return FALSE;
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = DebugValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges( hToken,
FALSE,
&tkp,
sizeof(TOKEN_PRIVILEGES),
(PTOKEN_PRIVILEGES)NULL,
(PDWORD)NULL
);
if( GetLastError() == ERROR_SUCCESS ) {
CloseHandle(hToken);
return TRUE;
}
else {
CloseHandle(hToken);
return FALSE;
}
}
void main()
{
ProcessAttribute aProcess[100], *paProcess;
paProcess = aProcess;
DWORD id, ID;
ShowProcess ( paProcess );
EnablePrivilege ();
while ( paProcess->total ==1 )
{
id = CheckProcess ( paProcess );
if ( id != 0 )
CloseProcess (id);
paProcess ++;
}
}