获取系统进程信息和进程依赖的dll信息--CreateToolhelp32Snapshot
生活随笔
收集整理的這篇文章主要介紹了
获取系统进程信息和进程依赖的dll信息--CreateToolhelp32Snapshot
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
http://www.cnblogs.com/qintangtao/archive/2013/02/26/2933734.html
CreateToolhelp32Snapshot函數(shù)通過(guò)獲取進(jìn)程信息為指定的進(jìn)程、進(jìn)程使用的堆[HEAP]、模塊[MODULE]、線程[THREAD]建立一個(gè)快照[snapshot]。 HANDLE WINAPI CreateToolhelp32Snapshot( DWORD dwFlags, //用來(lái)指定“快照”中需要返回的對(duì)象,可以是TH32CS_SNAPPROCESS等 DWORD th32ProcessID //一個(gè)進(jìn)程ID號(hào),用來(lái)指定要獲取哪一個(gè)進(jìn)程的快照,當(dāng)獲取系統(tǒng)進(jìn)程列表或獲取當(dāng)前進(jìn)程快照時(shí)可以設(shè)為0 ); 參數(shù): dwFlags [輸入]指定快照中包含的系統(tǒng)內(nèi)容,這個(gè)參數(shù)能夠使用下列數(shù)值(常量)中的一個(gè)或多個(gè)。 TH32CS_INHERIT - 聲明快照句柄是可繼承的。 TH32CS_SNAPALL - 在快照中包含系統(tǒng)中所有的進(jìn)程和線程。 TH32CS_SNAPHEAPLIST - 在快照中包含在th32ProcessID中指定的進(jìn)程的所有的堆。 TH32CS_SNAPMODULE - 在快照中包含在th32ProcessID中指定的進(jìn)程的所有的模塊。 TH32CS_SNAPPROCESS - 在快照中包含系統(tǒng)中所有的進(jìn)程。 TH32CS_SNAPTHREAD - 在快照中包含系統(tǒng)中所有的線程。 Const TH32CS_SNAPHEAPLIST = &H1 Const TH32CS_SNAPPROCESS = &H2 Const TH32CS_SNAPTHREAD = &H4 Const TH32CS_SNAPMODULE = &H8 Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD | TH32CS_SNAPMODULE) Const TH32CS_INHERIT = &H80000000 th32ProcessID [輸入]指定將要快照的進(jìn)程ID。如果該參數(shù)為0表示快照當(dāng)前進(jìn)程。該參數(shù)只有在設(shè)置了TH32CS_SNAPHEAPLIST或者TH32CS_SNAPMODULE后才有效,在其他情況下該參數(shù)被忽略,所有的進(jìn)程都會(huì)被快照。 返回值: 調(diào)用成功,返回快照的句柄,調(diào)用失敗,返回INVALID_HANDLE_VALUE 。 備注: 使用GetLastError函數(shù)查找該函數(shù)產(chǎn)生的錯(cuò)誤狀態(tài)碼。 注意,在Win NT中,要?jiǎng)h除快照,使用CloseHandle函數(shù);在Win CE中,要?jiǎng)h除快照,使用CloseToolhelp32Snapshot函數(shù)。 C++例子: #include "stdafx.h" #include <Windows.h> #include <TlHelp32.h> #include <stdio.h> #include <psapi.h> #pragma comment(lib, "psapi.lib") int _tmain(int argc, _TCHAR* argv[]) {PROCESSENTRY32 pe32;//進(jìn)程結(jié)構(gòu)pe32.dwSize = sizeof(pe32); //在使用這個(gè)結(jié)構(gòu)前,先設(shè)置它的大小//給系統(tǒng)內(nèi)所有的進(jìn)程拍個(gè)快照HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//某個(gè)進(jìn)程所有的DLL快照句柄HANDLE hModuleSnap = NULL;if(hProcessSnap == INVALID_HANDLE_VALUE){printf("CreateTollHelp32Snapshot Error!!\n");return -1;}BOOL bMore = ::Process32First(hProcessSnap, &pe32);HANDLE hProcess = 0;WCHAR procPath[_MAX_PATH]={0};MODULEENTRY32 lpme; //DLL結(jié)構(gòu)lpme.dwSize = sizeof(MODULEENTRY32);//在使用這個(gè)結(jié)構(gòu)前,先設(shè)置它的大小BOOL bRet = FALSE;//遍歷進(jìn)程快照,顯示每個(gè)進(jìn)程的信息while(bMore){//打開(kāi)一個(gè)已存在的進(jìn)程對(duì)象,并返回進(jìn)程的句柄hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe32.th32ProcessID);//得到該進(jìn)程的全路徑 GetModuleFileNameEx(hProcess,NULL,procPath, _MAX_PATH);wprintf(_T("ProcPath:%s\nProcName:%s\t\tProcID:%d\n\n"), procPath, pe32.szExeFile, pe32.th32ProcessID);//給一個(gè)已存在的進(jìn)程內(nèi)所有的DLL拍個(gè)快照hModuleSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pe32.th32ProcessID);bRet = ::Module32First(hModuleSnap, &lpme);//遍歷DLL快照,顯示該進(jìn)程所加在的DLL信息while(bRet){wprintf(_T("\t\tModual:%s\tBase:%2x\n"),lpme.szExePath, lpme.modBaseAddr);bRet = ::Module32Next(hModuleSnap, &lpme);}//關(guān)閉snapshot對(duì)象 ::CloseHandle(hModuleSnap);bMore = ::Process32Next(hProcessSnap, &pe32);}//關(guān)閉snapshot對(duì)象 ::CloseHandle(hProcessSnap);return 0; }
CreateToolhelp32Snapshot函數(shù)通過(guò)獲取進(jìn)程信息為指定的進(jìn)程、進(jìn)程使用的堆[HEAP]、模塊[MODULE]、線程[THREAD]建立一個(gè)快照[snapshot]。 HANDLE WINAPI CreateToolhelp32Snapshot( DWORD dwFlags, //用來(lái)指定“快照”中需要返回的對(duì)象,可以是TH32CS_SNAPPROCESS等 DWORD th32ProcessID //一個(gè)進(jìn)程ID號(hào),用來(lái)指定要獲取哪一個(gè)進(jìn)程的快照,當(dāng)獲取系統(tǒng)進(jìn)程列表或獲取當(dāng)前進(jìn)程快照時(shí)可以設(shè)為0 ); 參數(shù): dwFlags [輸入]指定快照中包含的系統(tǒng)內(nèi)容,這個(gè)參數(shù)能夠使用下列數(shù)值(常量)中的一個(gè)或多個(gè)。 TH32CS_INHERIT - 聲明快照句柄是可繼承的。 TH32CS_SNAPALL - 在快照中包含系統(tǒng)中所有的進(jìn)程和線程。 TH32CS_SNAPHEAPLIST - 在快照中包含在th32ProcessID中指定的進(jìn)程的所有的堆。 TH32CS_SNAPMODULE - 在快照中包含在th32ProcessID中指定的進(jìn)程的所有的模塊。 TH32CS_SNAPPROCESS - 在快照中包含系統(tǒng)中所有的進(jìn)程。 TH32CS_SNAPTHREAD - 在快照中包含系統(tǒng)中所有的線程。 Const TH32CS_SNAPHEAPLIST = &H1 Const TH32CS_SNAPPROCESS = &H2 Const TH32CS_SNAPTHREAD = &H4 Const TH32CS_SNAPMODULE = &H8 Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD | TH32CS_SNAPMODULE) Const TH32CS_INHERIT = &H80000000 th32ProcessID [輸入]指定將要快照的進(jìn)程ID。如果該參數(shù)為0表示快照當(dāng)前進(jìn)程。該參數(shù)只有在設(shè)置了TH32CS_SNAPHEAPLIST或者TH32CS_SNAPMODULE后才有效,在其他情況下該參數(shù)被忽略,所有的進(jìn)程都會(huì)被快照。 返回值: 調(diào)用成功,返回快照的句柄,調(diào)用失敗,返回INVALID_HANDLE_VALUE 。 備注: 使用GetLastError函數(shù)查找該函數(shù)產(chǎn)生的錯(cuò)誤狀態(tài)碼。 注意,在Win NT中,要?jiǎng)h除快照,使用CloseHandle函數(shù);在Win CE中,要?jiǎng)h除快照,使用CloseToolhelp32Snapshot函數(shù)。 C++例子: #include "stdafx.h" #include <Windows.h> #include <TlHelp32.h> #include <stdio.h> #include <psapi.h> #pragma comment(lib, "psapi.lib") int _tmain(int argc, _TCHAR* argv[]) {PROCESSENTRY32 pe32;//進(jìn)程結(jié)構(gòu)pe32.dwSize = sizeof(pe32); //在使用這個(gè)結(jié)構(gòu)前,先設(shè)置它的大小//給系統(tǒng)內(nèi)所有的進(jìn)程拍個(gè)快照HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//某個(gè)進(jìn)程所有的DLL快照句柄HANDLE hModuleSnap = NULL;if(hProcessSnap == INVALID_HANDLE_VALUE){printf("CreateTollHelp32Snapshot Error!!\n");return -1;}BOOL bMore = ::Process32First(hProcessSnap, &pe32);HANDLE hProcess = 0;WCHAR procPath[_MAX_PATH]={0};MODULEENTRY32 lpme; //DLL結(jié)構(gòu)lpme.dwSize = sizeof(MODULEENTRY32);//在使用這個(gè)結(jié)構(gòu)前,先設(shè)置它的大小BOOL bRet = FALSE;//遍歷進(jìn)程快照,顯示每個(gè)進(jìn)程的信息while(bMore){//打開(kāi)一個(gè)已存在的進(jìn)程對(duì)象,并返回進(jìn)程的句柄hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe32.th32ProcessID);//得到該進(jìn)程的全路徑 GetModuleFileNameEx(hProcess,NULL,procPath, _MAX_PATH);wprintf(_T("ProcPath:%s\nProcName:%s\t\tProcID:%d\n\n"), procPath, pe32.szExeFile, pe32.th32ProcessID);//給一個(gè)已存在的進(jìn)程內(nèi)所有的DLL拍個(gè)快照hModuleSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pe32.th32ProcessID);bRet = ::Module32First(hModuleSnap, &lpme);//遍歷DLL快照,顯示該進(jìn)程所加在的DLL信息while(bRet){wprintf(_T("\t\tModual:%s\tBase:%2x\n"),lpme.szExePath, lpme.modBaseAddr);bRet = ::Module32Next(hModuleSnap, &lpme);}//關(guān)閉snapshot對(duì)象 ::CloseHandle(hModuleSnap);bMore = ::Process32Next(hProcessSnap, &pe32);}//關(guān)閉snapshot對(duì)象 ::CloseHandle(hProcessSnap);return 0; }
總結(jié)
以上是生活随笔為你收集整理的获取系统进程信息和进程依赖的dll信息--CreateToolhelp32Snapshot的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 进程中dll模块的隐藏
- 下一篇: 如何判断数组是静态还是动态分配的