小弟初学SDK时间不长,写了个小东西.... 大家凑活看,写得不好,不要骂.....
这个对目前运行的进程进行记录,并能对任意的进程进行操作
首先,先枚举出所有的进程,然后对所有的进程进行记录,用ShowProcess函数
ShowProcess对所有的进程进行操作,将每个进程的信息分别存入ProcessAttribute结构体
至于存入结构体需要哪些信息,我来说明一下
1, 每个运行的进程都有1个ID, 要对某一个进程操作是需要这个ID的,而且这个ID是动
态随机分配的,当关闭了1个进程后,这个进程所占的地址被释放,并且ID号也将会被释放,被释放的ID号可能会被下一个开启的进程所使用。
2, 进程的名称。正如在上面提到的,进程的ID有时间性会随着进程的消亡而失去原来
唯一性,所以用ID号来确定进程是不可以的,而又要体现出进程名同ID号的唯一性这就需要创建一个结构体,而这个结构体里面要记录某个进程的名称还有ID,让名称同ID绑定在一起,这就可以针对某一个进程进行操作了。
3, 由于我们的进程一般是一般用户级,无法对一些系统进程进行操作,所以就要提升进程的特权,每个进程都有一个令牌,用于确定自己的级别,我们只要提高这个级别就可以了,提高后就可以对系统进程也进行操作。
在本程序中我关掉了1个系统进程,这样windows就无法正常的使用,只能重起…..
对于随机启动这里不加以讨论….我把那段代码删掉了,有兴趣的朋友可以自己写出来
现在附上代码
#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 ++;
}
}