编程语言

img sungun

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

发表于2004/9/26 18:19:00  525人阅读

  • 小弟初学SDK时间不长,写了个小东西.... 大家凑活看,写得不好,不要骂.....

     这个对目前运行的进程进行记录,并能对任意的进程进行操作

    首先,先枚举出所有的进程,然后对所有的进程进行记录,用ShowProcess函数

     

    ShowProcess对所有的进程进行操作,将每个进程的信息分别存入ProcessAttribute结构体

     

    至于存入结构体需要哪些信息,我来说明一下

     

    1,  每个运行的进程都有1ID, 要对某一个进程操作是需要这个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;    // 声明结构体(详见msdnProcess32First函数)

     

             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 ++;

     

           }

     

    }

     

     

阅读全文
0 0

相关文章推荐

img
取 消
img