获取进程信息的两种方式

第一种(CreateToolhelp32Snapshot):
#include "StdAfx.h"   
#include "windows.h"   
#include "tlhelp32.h"   
#include "stdio.h"   
int GetProcInfo()
{   
PROCESSENTRY32 pe32;   
pe32.dwSize = sizeof(pe32);   
  
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);   
if (hProcessSnap == INVALID_HANDLE_VALUE)   
{   return -1;   }   
//遍历进程快照,轮流显示每个进程的信息   
BOOL bMore = ::Process32First(hProcessSnap,&pe32);   
while (bMore)   
{   printf("进程名称:%s\n",pe32.szExeFile);   
printf("进程ID:%u\n\n",pe32.th32ProcessID);   
bMore = ::Process32Next(hProcessSnap,&pe32);   
}   
//不要忘记清除掉snapshot对象   
::CloseHandle(hProcessSnap);   
return 0;   }


第二种(EnumProcesses):
#include <windows.h>
#include <stdio.h>
#include "psapi.h"

#pragma comment(lib, "psapi.lib")


void PrintMemoryInfo( DWORD processID );

void GetInfo( )
{
 DWORD aProcesses[1024], cbNeeded, cProcesses;
 unsigned int i;

 if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
  return;

 // Calculate how many process identifiers were returned
 cProcesses = cbNeeded / sizeof(DWORD);

 for ( i = 0; i < cProcesses; i++ )
  PrintMemoryInfo( aProcesses[i] );
}

 

void PrintMemoryInfo( DWORD processID )
{
 HANDLE hProcess;
 PROCESS_MEMORY_COUNTERS pmc;

 // Print the process identifier.
 printf( "\nProcess ID: %u\n", processID );

 // Print information about the memory usage of the process.
 hProcess = OpenProcess(  PROCESS_QUERY_INFORMATION |
  PROCESS_VM_READ,
  FALSE, processID );
 if (NULL == hProcess)
  return;

 if ( GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)) )
 {
  printf( "\tPageFaultCount: %d\n", pmc.PageFaultCount );
  printf( "\tPageFaultCount: 0x%08X\n", pmc.PageFaultCount );
  printf( "\tPeakWorkingSetSize: 0x%08X\n",
   pmc.PeakWorkingSetSize );
  printf( "\tWorkingSetSize: 0x%08X\n", pmc.WorkingSetSize );
  printf( "\tQuotaPeakPagedPoolUsage: 0x%08X\n",
   pmc.QuotaPeakPagedPoolUsage );
  printf( "\tQuotaPagedPoolUsage: 0x%08X\n",
   pmc.QuotaPagedPoolUsage );
  printf( "\tQuotaPeakNonPagedPoolUsage: 0x%08X\n",
   pmc.QuotaPeakNonPagedPoolUsage );
  printf( "\tQuotaNonPagedPoolUsage: 0x%08X\n",
   pmc.QuotaNonPagedPoolUsage );
  printf( "\tPagefileUsage: 0x%08X\n", pmc.PagefileUsage );
  printf( "\tPeakPagefileUsage: 0x%08X\n",
   pmc.PeakPagefileUsage );
 }

 CloseHandle( hProcess );
}

 

命令行信息:

 void Get()

TCHAR szPath[512];  

HANDLE hProcess;  

 if(argc != 2)  return 1;  

  hProcess = OpenProcess(PROCESS_VM_READ, FALSE, _tcstoul(argv[1], NULL, 10));  

  if(hProcess)  

  {  

  if(GetProcessCommandLine(hProcess, szPath, sizeof(szPath)))  

   {  

  printf("%s\n", szPath);  

 }  

CloseHandle(hProcess);  

 }  

 

BOOL GetProcessCommandLine(HANDLE hProcess, LPTSTR pszCmdLine, DWORD cchCmdLine)  

{  

 BOOL            bRet;  

DWORD           dwPos;  

   LPBYTE          lpAddr;  

 DWORD           dwRetLen;  

 bRet = FALSE;  

  dwPos = 0;  

    lpAddr = (LPBYTE)GetCommandLine;  

 

//Win7:  

  if(lpAddr[dwPos] == 0xeb && lpAddr[dwPos + 1] == 0x05)  

  {     

   dwPos += 2;  

dwPos += 5;  

//Win8:  

     if(lpAddr[dwPos] == 0xff && lpAddr[dwPos + 1] == 0x25)  

       {  

        dwPos += 2;  

         lpAddr = *(LPBYTE*)(lpAddr + dwPos);  

   dwPos = 0;  

          lpAddr = *(LPBYTE*)lpAddr;  

//WinXp:  

        if(lpAddr[dwPos] == 0xa1)  

       {      

  dwPos += 1;  

    lpAddr = *(LPBYTE*)(lpAddr + dwPos);  

             bRet = ReadProcessMemory(hProcess,  

                lpAddr,  

                    &lpAddr,  

                    sizeof(LPBYTE),  

                    &dwRetLen);  

                if(bRet)  

                {  

                   bRet = ReadProcessMemory(hProcess,  

                        lpAddr,  

                        pszCmdLine,  

                        cchCmdLine,  

                        &dwRetLen);  

                }  

            }  

        }  

        else  

        {             

            goto WinXp;  

        }  

    }  

    else  

    {  

        goto Win8;  

    }  

  

    return bRet;  

}  

 

相关代码:

http://download.csdn.net/download/flyingleo1981/4543420

http://download.csdn.net/detail/howean/3341483

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux系统中,可以通过进程ID获取进程名。Linux系统中的每个进程都有一个唯一的进程ID(PID),可以使用这个PID来获取进程名。 方法一:通过/proc文件系统获取进程名 在Linux系统的/proc目录下,有一个以进程ID命名的文件夹,进入该文件夹后,可以读取该文件夹下的status文件,其中包含了很多与进程相关的信息,包括进程名。可以使用cat命令或者读取文件的方式获取进程名,例如: ```shell cat /proc/PID/status | grep Name ``` 其中,PID是进程的实际进程ID,Name是进程名。 方法二:使用ps命令获取进程名 可以使用ps命令来获取进程的一些信息,其中包括进程名。可以使用以下命令来获取指定进程ID对应的进程名: ```shell ps -p PID -o comm= ``` 其中,PID是进程的实际进程ID,comm表示进程名。 在使用以上方法获取进程名时,需要注意以下几点: 1. 只有在当前用户有足够权限的情况下,才能够获取其他用户创建的进程进程名。 2. 这些方法都是通过读取系统文件或者执行系统命令来获取进程名的,因此可能会对系统性能产生一定的影响,尤其是对于大量进程的系统。 3. 在获取进程名之前,需要确保该进程仍然存在,否则无法获取进程名。 综上所述,可以通过上述两种方法来获取Linux系统中任意进程进程名,从而实现根据进程ID获取进程名的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值