首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Windows 程式設計:遍歷程式載入的 DLL(C++)

     編輯:關於C++

流程

  1. 建立程式快照(TH32CS_SNAPPROCESS),比對程式名稱取得 PID。
  2. 以 PID 建立模組快照(TH32CS_SNAPMODULE)。
  3. 遍歷 MODULEENTRY32 列印 DLL 名稱與路徑。

程式碼

/* main.cpp
 * Created on: 2014.06.08
 * Author: Spike
 */
#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <windows.h>
#include <TlHelp32.h>
using namespace std;

bool traverseProcesses(map<string, int>& nameID) {
    PROCESSENTRY32 pe32; pe32.dwSize = sizeof(pe32);
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnap == INVALID_HANDLE_VALUE) return false;
    BOOL bRet = Process32First(hSnap, &pe32);
    while (bRet) {
        nameID.insert({pe32.szExeFile, pe32.th32ProcessID});
        bRet = Process32Next(hSnap, &pe32);
    }
    CloseHandle(hSnap);
    return true;
}

bool traverseModules(const string& procName) {
    map<string, int> nameID;
    if (!traverseProcesses(nameID)) return false;
    auto it = nameID.find(procName);
    if (it == nameID.end()) return false;

    MODULEENTRY32 me32; me32.dwSize = sizeof(me32);
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, it->second);
    if (hSnap == INVALID_HANDLE_VALUE) return false;
    BOOL bRet = Module32First(hSnap, &me32);
    while (bRet) {
        cout << me32.szModule << " : " << me32.szExePath << endl;
        bRet = Module32Next(hSnap, &me32);
    }
    CloseHandle(hSnap);
    return true;
}

int main() {
    traverseModules("Image.exe");
    return 0;
}

輸出範例

Image.exe : D:\Test\Image.exe
ntdll.dll : C:\Windows\System32\ntdll.dll
kernel32.dll : C:\Windows\System32\kernel32.dll
...
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved