您的位置:首页 > 移动开发 > 微信开发

关于进程的小程序(发错地了,重发....)

2004-09-26 18:19 330 查看
小弟初学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
= *ptotal ; // 将进程名的字符数组的首地址传给top结构体里得ExeFile
total ++ ;
ptotal ++ ;
n ++;
}

top->ExeFile
= '/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 ++;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐