遍历进程名的几种方法

方法一:使用EnumProcessModule


 1
 2/*
 3 *    ShowProcessPath 2.0
 4 *    版权所有 (C) 2005 赵春生
 5 *    2005.09.02
 6 *    http://timw.yeah.net
 7 *    http://timw.126.com
 8 *    本程序适用于:WinNT
 9 *    代码在Win2000P+SP4 + VC6+SP6测试通过
10*/

11
12#include <stdio.h>
13#include <windows.h>
14#include "PSAPI.H"
15#pragma comment( lib, "PSAPI.LIB" )
16
17//自定义函数:赋予指定特权。这里用来提升程序权限。
18BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName);
19
20int main(void)
21{
22    
23    DWORD processid[1024],needed,processcount,i;
24    HANDLE hProcess;
25    HMODULE hModule;
26    char path[MAX_PATH] = "",temp[256];
27    
28    HANDLE hToken;
29    
30    printf("ShowProcessPath 2.0 with [Process Status API]/n/n");
31    
32    if ( OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken) )
33    {
34        if (EnablePrivilege(hToken,SE_DEBUG_NAME))
35        {
36            
37            EnumProcesses(processid, sizeof(processid), &needed);
38            processcount=needed/sizeof(DWORD);
39            
40            for (i=0;i<processcount;i++)
41            {
42                hProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,false,processid[i]);
43                if (hProcess)
44                {
45                    EnumProcessModules(hProcess, &hModule, sizeof(hModule), &needed);
46                    GetModuleFileNameEx(hProcess, hModule, path, sizeof(path));
47                    GetShortPathName(path,path,256);
48                    itoa(processid[i],temp,10);
49                    printf("%s --- %s/n",path,temp);
50                }

51                else
52                    printf("Failed!!!/n");
53            }

54        }

55    }

56    
57    CloseHandle(hProcess);
58    CloseHandle(hModule);
59    
60    itoa(processcount,temp,10);
61    printf("/nProcess Count:%s/n/n",temp);
62    
63    return 0;
64}

65
66//
67
68BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName)
69{
70    
71    TOKEN_PRIVILEGES tkp;
72    
73    LookupPrivilegeValue( NULL,szPrivName,&tkp.Privileges[0].Luid );//修改进程权限
74    tkp.PrivilegeCount=1;
75    tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
76    AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限
77    
78    return( (GetLastError()==ERROR_SUCCESS) );
79    
80}

81
82//
83
84




方案二:区分操作系统


  1////
  2// EnumWin32Proc.c
  3// 编译方法:
  4// 1、运行 C:/Program Files/Microsoft Visual Studio/VC98/Bin/VCVARS32.BAT.
  5// 2、运行 bldexe.bat.
  6//
  7////
  8#include <windows.h>
  9#include <stdio.h>
 10#include <tlhelp32.h>
 11#include <vdmdbg.h>
 12
 13typedef BOOL (CALLBACK *PROCENUMPROC)(DWORD, WORD, LPSTR, LPARAM);
 14
 15typedef struct {
 16    DWORD dwPID;
 17    PROCENUMPROC lpProc;
 18    DWORD lParam;
 19    BOOL bEnd;
 20}
 EnumInfoStruct;
 21
 22BOOL WINAPI EnumProcs(PROCENUMPROC lpProc, LPARAM lParam);
 23
 24BOOL WINAPI Enum16(DWORD dwThreadId, WORD hMod16, WORD hTask16,
 25                   PSZ pszModName, PSZ pszFileName, LPARAM lpUserDefined);
 26
 27//
 28// The EnumProcs function takes a pointer to a callback function
 29// that will be called once per process with the process filename
 30// and process ID.
 31//
 32// lpProc -- Address of callback routine.
 33//
 34// lParam -- A user-defined LPARAM value to be passed to
 35// the callback routine.
 36//
 37// Callback function definition:
 38// BOOL CALLBACK Proc(DWORD dw, WORD w, LPCSTR lpstr, LPARAM lParam);
 39//
 40BOOL WINAPI EnumProcs(PROCENUMPROC lpProc, LPARAM lParam) {
 41    
 42    OSVERSIONINFO osver;
 43    HINSTANCE hInstLib = NULL;
 44    HINSTANCE hInstLib2 = NULL;
 45    HANDLE hSnapShot = NULL;
 46    LPDWORD lpdwPIDs = NULL;
 47    PROCESSENTRY32 procentry;
 48    BOOL bFlag;
 49    DWORD dwSize;
 50    DWORD dwSize2;
 51    DWORD dwIndex;
 52    HMODULE hMod;
 53    HANDLE hProcess;
 54    char szFileName[MAX_PATH];
 55    EnumInfoStruct sInfo;
 56    
 57    // ToolHelp Function Pointers.
 58    HANDLE (WINAPI *lpfCreateToolhelp32Snapshot)(DWORD, DWORD);
 59    BOOL (WINAPI *lpfProcess32First)(HANDLE, LPPROCESSENTRY32);
 60    BOOL (WINAPI *lpfProcess32Next)(HANDLE, LPPROCESSENTRY32);
 61    
 62    // PSAPI Function Pointers.
 63    BOOL (WINAPI *lpfEnumProcesses)(DWORD *, DWORD, DWORD *);
 64    BOOL (WINAPI *lpfEnumProcessModules)(HANDLE, HMODULE *, DWORD,
 65        LPDWORD);
 66    DWORD (WINAPI *lpfGetModuleBaseName)(HANDLE, HMODULE, LPTSTR, DWORD);
 67    
 68    // VDMDBG Function Pointers.
 69    INT (WINAPI *lpfVDMEnumTaskWOWEx)(DWORD, TASKENUMPROCEX, LPARAM);
 70    
 71    // Retrieve the OS version
 72    osver.dwOSVersionInfoSize = sizeof(osver);
 73    if (!GetVersionEx(&osver))
 74        return FALSE;
 75    
 76    // If Windows NT 4.0
 77    if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT
 78        && osver.dwMajorVersion == 4{
 79        
 80        __try {
 81            
 82            // Get the procedure addresses explicitly. We do
 83            // this so we don't have to worry about modules
 84            // failing to load under OSes other than Windows NT 4.0
 85            // because references to PSAPI.DLL can't be resolved.
 86            hInstLib = LoadLibraryA("PSAPI.DLL");
 87            if (hInstLib == NULL)
 88                __leave;
 89            
 90            hInstLib2 = LoadLibraryA("VDMDBG.DLL");
 91            if (hInstLib2 == NULL)
 92                __leave;
 93            
 94            // Get procedure addresses.
 95            lpfEnumProcesses = (BOOL (WINAPI *)(DWORD *, DWORD, DWORD*))
 96                GetProcAddress(hInstLib, "EnumProcesses");
 97            
 98            lpfEnumProcessModules = (BOOL (WINAPI *)(HANDLE, HMODULE *,
 99                DWORD, LPDWORD)) GetProcAddress(hInstLib,
100                "EnumProcessModules");
101            
102            lpfGetModuleBaseName = (DWORD (WINAPI *)(HANDLE, HMODULE,
103                LPTSTR, DWORD)) GetProcAddress(hInstLib,
104                "GetModuleBaseNameA");
105            
106            lpfVDMEnumTaskWOWEx = (INT (WINAPI *)(DWORD, TASKENUMPROCEX,
107                LPARAM)) GetProcAddress(hInstLib2, "VDMEnumTaskWOWEx");
108            
109            if (lpfEnumProcesses == NULL
110                || lpfEnumProcessModules == NULL
111                || lpfGetModuleBaseName == NULL
112                || lpfVDMEnumTaskWOWEx == NULL)
113                __leave;
114            
115            //
116            // Call the PSAPI function EnumProcesses to get all of the
117            // ProcID's currently in the system.
118            //
119            // NOTE: In the documentation, the third parameter of
120            // EnumProcesses is named cbNeeded, which implies that you
121            // can call the function once to find out how much space to
122            // allocate for a buffer and again to fill the buffer.
123            // This is not the case. The cbNeeded parameter returns
124            // the number of PIDs returned, so if your buffer size is
125            // zero cbNeeded returns zero.
126            //
127            // NOTE: The "HeapAlloc" loop here ensures that we
128            // actually allocate a buffer large enough for all the
129            // PIDs in the system.
130            //
131            dwSize2 = 256 * sizeof(DWORD);
132            do {
133                
134                if (lpdwPIDs) {
135                    HeapFree(GetProcessHeap(), 0, lpdwPIDs);
136                    dwSize2 *= 2;
137                }

138                
139                lpdwPIDs = (LPDWORD) HeapAlloc(GetProcessHeap(), 0,
140                    dwSize2);
141                if (lpdwPIDs == NULL)
142                    __leave;
143                
144                if (!lpfEnumProcesses(lpdwPIDs, dwSize2, &dwSize))
145                    __leave;
146                
147            }
 while (dwSize == dwSize2);
148            
149            // How many ProcID's did we get?
150            dwSize /= sizeof(DWORD);
151            
152            // Loop through each ProcID.
153            for (dwIndex = 0; dwIndex < dwSize; dwIndex++{
154                
155                szFileName[0= 0;
156                
157                // Open the process (if we can security does not
158                // permit every process in the system to be opened).
159                hProcess = OpenProcess(
160                    PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
161                    FALSE, lpdwPIDs[dwIndex]);
162                if (hProcess != NULL) {
163                    
164                    // Here we call EnumProcessModules to get only the
165                    // first module in the process. This will be the
166                    // EXE module for which we will retrieve the name.
167                    if (lpfEnumProcessModules(hProcess, &hMod,
168                        sizeof(hMod), &dwSize2)) {
169                        
170                        // Get the module name
171                        if (!lpfGetModuleBaseName(hProcess, hMod,
172                            szFileName, sizeof(szFileName)))
173                            szFileName[0= 0;
174                    }

175                    CloseHandle(hProcess);
176                }

177                // Regardless of OpenProcess success or failure, we
178                // still call the enum func with the ProcID.
179                if (!lpProc(lpdwPIDs[dwIndex], 0, szFileName, lParam))
180                    break;
181                
182                // Did we just bump into an NTVDM?
183                if (_stricmp(szFileName, "NTVDM.EXE"== 0{
184                    
185                    // Fill in some info for the 16-bit enum proc.
186                    sInfo.dwPID = lpdwPIDs[dwIndex];
187                    sInfo.lpProc = lpProc;
188                    sInfo.lParam = (DWORD) lParam;
189                    sInfo.bEnd = FALSE;
190                    
191                    // Enum the 16-bit stuff.
192                    lpfVDMEnumTaskWOWEx(lpdwPIDs[dwIndex],
193                        (TASKENUMPROCEX) Enum16, (LPARAM) &sInfo);
194                    
195                    // Did our main enum func say quit?
196                    if (sInfo.bEnd)
197                        break;
198                }

199            }

200            
201}
 __finally {
202    
203    if (hInstLib)
204        FreeLibrary(hInstLib);
205    
206    if (hInstLib2)
207        FreeLibrary(hInstLib2);
208    
209    if (lpdwPIDs)
210        HeapFree(GetProcessHeap(), 0, lpdwPIDs);
211}

212
213// If any OS other than Windows NT 4.0.
214}
 else if (osver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS
215           || (osver.dwPlatformId == VER_PLATFORM_WIN32_NT
216           && osver.dwMajorVersion > 4)) {
217    
218    __try {
219        
220        hInstLib = LoadLibraryA("Kernel32.DLL");
221        if (hInstLib == NULL)
222            __leave;
223        
224        // If NT-based OS, load VDMDBG.DLL.
225        if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT) {
226            hInstLib2 = LoadLibraryA("VDMDBG.DLL");
227            if (hInstLib2 == NULL)
228                __leave;
229        }

230        
231        // Get procedure addresses. We are linking to
232        // these functions explicitly, because a module using
233        // this code would fail to load under Windows NT,
234        // which does not have the Toolhelp32
235        // functions in KERNEL32.DLL.
236        lpfCreateToolhelp32Snapshot =
237            (HANDLE (WINAPI *)(DWORD,DWORD))
238            GetProcAddress(hInstLib, "CreateToolhelp32Snapshot");
239        
240        lpfProcess32First =
241            (BOOL (WINAPI *)(HANDLE,LPPROCESSENTRY32))
242            GetProcAddress(hInstLib, "Process32First");
243        
244        lpfProcess32Next =
245            (BOOL (WINAPI *)(HANDLE,LPPROCESSENTRY32))
246            GetProcAddress(hInstLib, "Process32Next");
247        
248        if (lpfProcess32Next == NULL
249            || lpfProcess32First == NULL
250            || lpfCreateToolhelp32Snapshot == NULL)
251            __leave;
252        
253        if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT) {
254            lpfVDMEnumTaskWOWEx = (INT (WINAPI *)(DWORD, TASKENUMPROCEX,
255                LPARAM)) GetProcAddress(hInstLib2, "VDMEnumTaskWOWEx");
256            if (lpfVDMEnumTaskWOWEx == NULL)
257                __leave;
258        }

259        
260        // Get a handle to a Toolhelp snapshot of all processes.
261        hSnapShot = lpfCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
262        if (hSnapShot == INVALID_HANDLE_VALUE) {
263            FreeLibrary(hInstLib);
264            return FALSE;
265        }

266        
267        // Get the first process' information.
268        procentry.dwSize = sizeof(PROCESSENTRY32);
269        bFlag = lpfProcess32First(hSnapShot, &procentry);
270        
271        // While there are processes, keep looping.
272        while (bFlag) {
273            
274            // Call the enum func with the filename and ProcID.
275            if (lpProc(procentry.th32ProcessID, 0,
276                procentry.szExeFile, lParam)) {
277                
278                // Did we just bump into an NTVDM?
279                if (_stricmp(procentry.szExeFile, "NTVDM.EXE"== 0{
280                    
281                    // Fill in some info for the 16-bit enum proc.
282                    sInfo.dwPID = procentry.th32ProcessID;
283                    sInfo.lpProc = lpProc;
284                    sInfo.lParam = (DWORD) lParam;
285                    sInfo.bEnd = FALSE;
286                    
287                    // Enum the 16-bit stuff.
288                    lpfVDMEnumTaskWOWEx(procentry.th32ProcessID,
289                        (TASKENUMPROCEX) Enum16, (LPARAM) &sInfo);
290                    
291                    // Did our main enum func say quit?
292                    if (sInfo.bEnd)
293                        break;
294                }

295                
296                procentry.dwSize = sizeof(PROCESSENTRY32);
297                bFlag = lpfProcess32Next(hSnapShot, &procentry);
298                
299            }
 else
300                bFlag = FALSE;
301        }

302        
303    }
 __finally {
304        
305        if (hInstLib)
306            FreeLibrary(hInstLib);
307        
308        if (hInstLib2)
309            FreeLibrary(hInstLib2);
310    }

311    
312}
 else
313return FALSE;
314
315// Free the library.
316FreeLibrary(hInstLib);
317
318return TRUE;
319}

320
321
322BOOL WINAPI Enum16(DWORD dwThreadId, WORD hMod16, WORD hTask16,
323                   PSZ pszModName, PSZ pszFileName, LPARAM lpUserDefined) {
324    
325    BOOL bRet;
326    
327    EnumInfoStruct *psInfo = (EnumInfoStruct *)lpUserDefined;
328    
329    bRet = psInfo->lpProc(psInfo->dwPID, hTask16, pszFileName,
330        psInfo->lParam);
331    
332    if (!bRet)
333        psInfo->bEnd = TRUE;
334    
335    return !bRet;
336}

337
338
339BOOL CALLBACK MyProcessEnumerator(DWORD dwPID, WORD wTask,
340                                  LPCSTR szProcess, LPARAM lParam) {
341    
342    if (wTask == 0)
343        printf("%5u %s/n", dwPID, szProcess);
344    else
345        printf(" %5u %s/n", wTask, szProcess);
346    
347    return TRUE;
348}

349
350
351void main() {
352    EnumProcs((PROCENUMPROC) MyProcessEnumerator, 0);
353}



源码三


 1nt ProcessList()
 2{
 3       PROCESSENTRY32 pe32;
 4       pe32.dwSize=sizeof(pe32);
 5       int count=0;
 6 
 7       HANDLE hProcessSnap=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
 8 
 9       if(hProcessSnap==INVALID_HANDLE_VALUE)
10       {
11              printf("CreateToolhelp32Snapshot调用失败!");
12              return -1;
13       }

14 
15       BOOL bMore=::Process32First(hProcessSnap,&pe32);
16      
17       printf("%20s/t%10s/n","进程名","PID");
18       printf("====================================/n");
19       while(bMore)
20       {
21              count++;
22              printf("%20s/t%10d/n",pe32.szExeFile,pe32.th32ProcessID);
23              bMore=::Process32Next(hProcessSnap,&pe32);
24       }

25 
26       ::CloseHandle(hProcessSnap);
27 
28       printf("====================================/n");
29       printf("/n当前系统进程数为:%d/n",count);
30 
31       return 0;
32}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值