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

类别:VC语言 点击:0 评论:0 推荐:

小弟初学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 ++;

 

       }

 

}

 

本文地址:http://com.8s8s.com/it/it652.htm