获取系统进程信息和进程依赖的dll信息--CreateToolhelp32Snapshot
生活随笔
收集整理的這篇文章主要介紹了
获取系统进程信息和进程依赖的dll信息--CreateToolhelp32Snapshot
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://www.cnblogs.com/qintangtao/archive/2013/02/26/2933734.html
CreateToolhelp32Snapshot函數通過獲取進程信息為指定的進程、進程使用的堆[HEAP]、模塊[MODULE]、線程[THREAD]建立一個快照[snapshot]。 HANDLE WINAPI CreateToolhelp32Snapshot( DWORD dwFlags, //用來指定“快照”中需要返回的對象,可以是TH32CS_SNAPPROCESS等 DWORD th32ProcessID //一個進程ID號,用來指定要獲取哪一個進程的快照,當獲取系統進程列表或獲取當前進程快照時可以設為0 ); 參數: dwFlags [輸入]指定快照中包含的系統內容,這個參數能夠使用下列數值(常量)中的一個或多個。 TH32CS_INHERIT - 聲明快照句柄是可繼承的。 TH32CS_SNAPALL - 在快照中包含系統中所有的進程和線程。 TH32CS_SNAPHEAPLIST - 在快照中包含在th32ProcessID中指定的進程的所有的堆。 TH32CS_SNAPMODULE - 在快照中包含在th32ProcessID中指定的進程的所有的模塊。 TH32CS_SNAPPROCESS - 在快照中包含系統中所有的進程。 TH32CS_SNAPTHREAD - 在快照中包含系統中所有的線程。 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 [輸入]指定將要快照的進程ID。如果該參數為0表示快照當前進程。該參數只有在設置了TH32CS_SNAPHEAPLIST或者TH32CS_SNAPMODULE后才有效,在其他情況下該參數被忽略,所有的進程都會被快照。 返回值: 調用成功,返回快照的句柄,調用失敗,返回INVALID_HANDLE_VALUE 。 備注: 使用GetLastError函數查找該函數產生的錯誤狀態碼。 注意,在Win NT中,要刪除快照,使用CloseHandle函數;在Win CE中,要刪除快照,使用CloseToolhelp32Snapshot函數。 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;//進程結構pe32.dwSize = sizeof(pe32); //在使用這個結構前,先設置它的大小//給系統內所有的進程拍個快照HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//某個進程所有的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結構lpme.dwSize = sizeof(MODULEENTRY32);//在使用這個結構前,先設置它的大小BOOL bRet = FALSE;//遍歷進程快照,顯示每個進程的信息while(bMore){//打開一個已存在的進程對象,并返回進程的句柄hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe32.th32ProcessID);//得到該進程的全路徑 GetModuleFileNameEx(hProcess,NULL,procPath, _MAX_PATH);wprintf(_T("ProcPath:%s\nProcName:%s\t\tProcID:%d\n\n"), procPath, pe32.szExeFile, pe32.th32ProcessID);//給一個已存在的進程內所有的DLL拍個快照hModuleSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pe32.th32ProcessID);bRet = ::Module32First(hModuleSnap, &lpme);//遍歷DLL快照,顯示該進程所加在的DLL信息while(bRet){wprintf(_T("\t\tModual:%s\tBase:%2x\n"),lpme.szExePath, lpme.modBaseAddr);bRet = ::Module32Next(hModuleSnap, &lpme);}//關閉snapshot對象 ::CloseHandle(hModuleSnap);bMore = ::Process32Next(hProcessSnap, &pe32);}//關閉snapshot對象 ::CloseHandle(hProcessSnap);return 0; }
CreateToolhelp32Snapshot函數通過獲取進程信息為指定的進程、進程使用的堆[HEAP]、模塊[MODULE]、線程[THREAD]建立一個快照[snapshot]。 HANDLE WINAPI CreateToolhelp32Snapshot( DWORD dwFlags, //用來指定“快照”中需要返回的對象,可以是TH32CS_SNAPPROCESS等 DWORD th32ProcessID //一個進程ID號,用來指定要獲取哪一個進程的快照,當獲取系統進程列表或獲取當前進程快照時可以設為0 ); 參數: dwFlags [輸入]指定快照中包含的系統內容,這個參數能夠使用下列數值(常量)中的一個或多個。 TH32CS_INHERIT - 聲明快照句柄是可繼承的。 TH32CS_SNAPALL - 在快照中包含系統中所有的進程和線程。 TH32CS_SNAPHEAPLIST - 在快照中包含在th32ProcessID中指定的進程的所有的堆。 TH32CS_SNAPMODULE - 在快照中包含在th32ProcessID中指定的進程的所有的模塊。 TH32CS_SNAPPROCESS - 在快照中包含系統中所有的進程。 TH32CS_SNAPTHREAD - 在快照中包含系統中所有的線程。 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 [輸入]指定將要快照的進程ID。如果該參數為0表示快照當前進程。該參數只有在設置了TH32CS_SNAPHEAPLIST或者TH32CS_SNAPMODULE后才有效,在其他情況下該參數被忽略,所有的進程都會被快照。 返回值: 調用成功,返回快照的句柄,調用失敗,返回INVALID_HANDLE_VALUE 。 備注: 使用GetLastError函數查找該函數產生的錯誤狀態碼。 注意,在Win NT中,要刪除快照,使用CloseHandle函數;在Win CE中,要刪除快照,使用CloseToolhelp32Snapshot函數。 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;//進程結構pe32.dwSize = sizeof(pe32); //在使用這個結構前,先設置它的大小//給系統內所有的進程拍個快照HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//某個進程所有的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結構lpme.dwSize = sizeof(MODULEENTRY32);//在使用這個結構前,先設置它的大小BOOL bRet = FALSE;//遍歷進程快照,顯示每個進程的信息while(bMore){//打開一個已存在的進程對象,并返回進程的句柄hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe32.th32ProcessID);//得到該進程的全路徑 GetModuleFileNameEx(hProcess,NULL,procPath, _MAX_PATH);wprintf(_T("ProcPath:%s\nProcName:%s\t\tProcID:%d\n\n"), procPath, pe32.szExeFile, pe32.th32ProcessID);//給一個已存在的進程內所有的DLL拍個快照hModuleSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pe32.th32ProcessID);bRet = ::Module32First(hModuleSnap, &lpme);//遍歷DLL快照,顯示該進程所加在的DLL信息while(bRet){wprintf(_T("\t\tModual:%s\tBase:%2x\n"),lpme.szExePath, lpme.modBaseAddr);bRet = ::Module32Next(hModuleSnap, &lpme);}//關閉snapshot對象 ::CloseHandle(hModuleSnap);bMore = ::Process32Next(hProcessSnap, &pe32);}//關閉snapshot對象 ::CloseHandle(hProcessSnap);return 0; }
總結
以上是生活随笔為你收集整理的获取系统进程信息和进程依赖的dll信息--CreateToolhelp32Snapshot的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 进程中dll模块的隐藏
- 下一篇: 异常和异常处理(windows平台)