获取系统的进程信息

 

 

 要想获取系统的进程信息,有个很好的方法,就是用ToolHelp,其提供的接口可以方便的满足你的要求,如下:

 

       #include <tlhelp32.h>   //首先导入头文件

 

       HANDLE m_hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
       PROCESSENTRY32 pe = { sizeof(pe) };
       BOOL fOk = Process32First(m_hSnapshot, &pe);//找第一个
       while(fOk)
       {

 

           //pe就是我们获取的进程结构体

            ....................................

            //dosomething

             ....................

           fOk = Process32Next(m_hSnapshot, &pe);//还有吗?
        }

 

    其中结构体PROCESSENTRY32定义如下:

      typedef struct tagPROCESSENTRY32
{
    DWORD   dwSize;
    DWORD   cntUsage;
    DWORD   th32ProcessID;          // this process
    ULONG_PTR th32DefaultHeapID;
    DWORD   th32ModuleID;           // associated exe
    DWORD   cntThreads;               //线程数量
    DWORD   th32ParentProcessID;    // this process's parent process
    LONG    pcPriClassBase;         // Base priority of process's threads
    DWORD   dwFlags;
    CHAR    szExeFile[MAX_PATH];    // Path
} PROCESSENTRY32;

 

方法二

         我们可以看到上面的方法简单,但是获取的进程信息也相对简单,下面有个方法可以获取相对详细进程信息。

         在Windows自带的ntdll.dll中有个接口NtQuerySystemInformation可以用来查询系统信息的,接口定义如下:

          DWORD (__stdcall *NtQuerySystemInformation )(ULONG,PVOID,ULONG,ULONG);

 

         其实系统里面的每个进程都分配一个内存快,调用上述的接口我们就可以去查询系统指定内存块的信息了,而进程与进程之间有一个偏移量,所有我们只要知道了前一个进程的信息和其偏移量,就可以得到下个进程的地址了。

       

         》首先定义接口NtQuerySystemInformation

                 DWORD (__stdcall *NtQuerySystemInformation )(ULONG,PVOID,ULONG,ULONG);

         》然后访问DLL接口

                if (!NtQuerySystemInformation)
                      NtQuerySystemInformation=(DWORD (__stdcall*)(ULONG,PVOID,ULONG,ULONG))
                                   GetProcAddress(GetModuleHandle("ntdll.dll"),"NtQuerySystemInformation");

 

        》枚举进程

              PBYTE pbyInfo = NULL;//进程地址
              PPROCESSINFO pProcessInfo;//进程结构
              DWORD dwSize = 0x4000;//进程最小探索块
                   WCHAR *pname;
               BOOL bRet = FALSE;

                  pbyInfo=(PBYTE) malloc(dwSize);//分配内存
                   if (pbyInfo)
                      {

                             //先找到第一个进程的地址
                            while(1)
                                   {
                                         memset(pbyInfo,0,dwSize);//初始化

                                                   //查询系统信息成功
                                             if(NtQuerySystemInformation(5,pbyInfo,dwSize,0)!=STATUS_INFO_LENGTH_MISMATCH )
                                                          break;
                                                   dwSize += 0x1000;//没成功,加大范围,继续探索
                                                   pbyInfo=(PBYTE) realloc(pbyInfo,dwSize);//重新探索
                                      }
                                pProcessInfo = ( PPROCESSINFO ) pbyInfo;//得到第一个进程的地址了

 

                                 //枚举所有的进程

                                 while(1)

                                 {

 

                                       //do something

                                        

                                       if ( pProcessInfo->dwRelativeOffset == 0 )//如果偏移量为0,没有进程了
                                                     break;
                                        //获取下一个进程地址
                                       pProcessInfo=(PPROCESSINFO)((PBYTE)pProcessInfo+pProcessInfo->dwRelativeOffset);

                                  }

                 

              进程结构体定义如下:

 

              typedef struct
{
   DWORD dwRelativeOffset;   //相对偏移量
   DWORD dwThreadCount;      //线程数目
   DWORD dwUnknown1[6];
   FILETIME pfCreateTime;
   DWORD dwUnknown2[5];
   WCHAR* pszProcessName;    //不带路径的名称
   DWORD dwBasePriority;     //优先级
   DWORD dwProcessID;        //进程ID
   DWORD dwParentProcessID;  //父进程ID
   DWORD dwHandleCount;      //句柄数目
   DWORD dwUnknown3;
   DWORD dwUnknown4;
   DWORD dwVirtualBytesPeak;
   DWORD dwTotalVirtualBytes;
   DWORD dwPageFaults;
   DWORD dwWorkingSetPeak;  
   DWORD dwTotalWorkingSet;       //占用物理内存大小 
   DWORD dwPeakPagedPoolUsagePages;
   DWORD dwTotalPagedPoolUsagePages;
   DWORD dwPeakNonPagedPoolUsagePages;
   DWORD dwTotalNonPagedPoolUsagePages;
   DWORD dwPageFileBytesPeak;
   DWORD dwPrivateBytes;
   DWORD dwPageFileBytes;
   DWORD dwUnknown7[4];
   THREADINFO ti[0];
} _PROCESSINFO, *PPROCESSINFO;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值