C++:imagehlp庫

imagehlp庫

  • 1. 簡介
  • 2. 主要函數與用途
    • 2.1PE 文件解析相關
    • 2.2 符號處理相關
    • 2.3 崩潰轉儲相關
    • 2.4 版本資源相關
  • 3. 使用示例
    • 3.1 解析內存地址對應的函數名和行號
    • 3.2 創建目錄
      • 使用示例

1. 簡介

imagehlp 是 Windows 系統提供的一個圖像處理與調試輔助 API 庫(Image Helper Library),主要用于處理可執行文件(如 .exe.dll)、符號文件(.pdb)以及系統調試相關的任務。它提供了一系列函數,幫助開發者分析二進制文件結構、讀取調試信息、處理崩潰轉儲(Crash Dump)等。
imagehlp 庫的功能集中在以下幾個方面:

  1. 可執行文件解析:讀取 PE(Portable Executable)文件格式的信息(如導出表、導入表、節表等)。
  2. 符號文件處理:加載和查詢 .pdb(Program Database)符號文件,獲取函數名、變量名、行號等調試信息。
  3. 崩潰轉儲處理:生成和分析崩潰轉儲文件(.dmp),用于事后調試程序崩潰原因。
  4. 版本資源操作:讀取可執行文件中的版本信息(如文件版本、公司名稱等)。
  5. 內存映射文件處理:輔助映射和分析內存中的二進制鏡像。

2. 主要函數與用途

2.1PE 文件解析相關

函數功能描述
MapAndLoad將可執行文件映射到內存并加載其信息
ImageLoad加載指定的可執行文件,返回其鏡像信息
ImageUnload卸載通過 ImageLoad 加載的鏡像
ImageNtHeader獲取 PE 文件的 NT 頭信息(包含文件格式、入口點等)
ImageDirectoryEntryToData獲取 PE 文件中指定目錄項的數據(如導出表、導入表)
EnumPageFiles枚舉系統中的分頁文件信息

2.2 符號處理相關

函數功能描述
SymInitialize初始化符號處理引擎
SymCleanup清理符號處理引擎資源
SymLoadModuleEx加載模塊并關聯其符號文件(.pdb
SymUnloadModule64卸載已加載的模塊符號
SymFromAddr根據內存地址獲取對應的符號信息(如函數名)
SymGetLineFromAddr64根據內存地址獲取對應的源代碼文件名和行號
SymSetOptions設置符號處理選項(如是否加載未修飾的函數名)

2.3 崩潰轉儲相關

函數功能描述
MiniDumpWriteDump生成程序的小型轉儲文件(.dmp),包含崩潰時的內存狀態
MiniDumpReadDumpStream從轉儲文件中讀取指定的數據流

2.4 版本資源相關

函數功能描述
GetFileVersionInfoSize獲取文件版本信息的大小
GetFileVersionInfo讀取文件的版本信息
VerQueryValue從版本信息中查詢特定字段(如文件版本號、產品名稱)

3. 使用示例

3.1 解析內存地址對應的函數名和行號

#include <windows.h>
#include <imagehlp.h>
#include <iostream>
#pragma comment(lib, "imagehlp.lib")  // 鏈接 imagehlp 庫void PrintSymbolInfo(DWORD64 address) {// 初始化符號引擎if (!SymInitialize(GetCurrentProcess(), NULL, TRUE)) {std::cerr << "SymInitialize 失敗,錯誤碼: " << GetLastError() << std::endl;return;}// 設置符號選項(加載所有符號)SymSetOptions(SYMOPT_UNDNAME | SYMOPT_DEFERRED_LOADS);// 加載當前模塊的符號DWORD64 moduleBase = SymLoadModuleEx(GetCurrentProcess(), NULL, NULL, NULL, 0, 0, NULL, 0);if (moduleBase == 0) {std::cerr << "SymLoadModuleEx 失敗,錯誤碼: " << GetLastError() << std::endl;SymCleanup(GetCurrentProcess());return;}// 查詢地址對應的符號SYMBOL_INFO* symbol = (SYMBOL_INFO*)LocalAlloc(LPTR, sizeof(SYMBOL_INFO) + 256);symbol->SizeOfStruct = sizeof(SYMBOL_INFO);symbol->MaxNameLen = 255;if (SymFromAddr(GetCurrentProcess(), address, NULL, symbol)) {std::cout << "地址 0x" << std::hex << address << " 對應的符號: " << symbol->Name << std::endl;// 查詢行號信息IMAGEHLP_LINE64 lineInfo = {0};lineInfo.SizeOfStruct = sizeof(IMAGEHLP_LINE64);DWORD displacement = 0;if (SymGetLineFromAddr64(GetCurrentProcess(), address, &displacement, &lineInfo)) {std::cout << "文件: " << lineInfo.FileName << ", 行號: " << std::dec << lineInfo.LineNumber << std::endl;} else {std::cerr << "獲取行號失敗,錯誤碼: " << GetLastError() << std::endl;}} else {std::cerr << "SymFromAddr 失敗,錯誤碼: " << GetLastError() << std::endl;}// 清理資源LocalFree(symbol);SymUnloadModule64(GetCurrentProcess(), moduleBase);SymCleanup(GetCurrentProcess());
}// 測試函數:用于獲取其地址并解析
void TestFunction() {std::cout << "測試函數被調用" << std::endl;
}int main() {// 獲取 TestFunction 的地址并解析符號PrintSymbolInfo((DWORD64)TestFunction);return 0;
}

3.2 創建目錄

MakeSureDirectoryPathExists 是 Windows 系統 imagehlp 庫中的一個函數,用于遞歸確保目錄路徑中的所有文件夾都存在。如果路徑中的某些文件夾不存在,該函數會自動創建它們(包括中間目錄),類似于 Linux 中的 mkdir -p 命令。

BOOL MakeSureDirectoryPathExists(LPCSTR lpPathName  // 要檢查或創建的目錄路徑
);
  • 參數lpPathName 為以 null 結尾的字符串,指定要處理的目錄路徑(支持相對路徑和絕對路徑)。
  • 返回值:如果函數成功(路徑已存在或所有目錄創建成功),返回 TRUE;否則返回 FALSE(可通過 GetLastError() 獲取具體錯誤)。
  • 功能說明
    該函數會遞歸檢查路徑中的每個目錄層級:
    • 若所有目錄都已存在,直接返回成功。
    • 若某個或多個目錄不存在,自動創建缺失的目錄(包括中間層級)。
    • 路徑可以包含文件名(函數會忽略文件名部分,只處理目錄),例如傳入 C:\logs\app\debug.log 時,會確保 C:\logs\app\ 目錄存在。

使用示例

#include <windows.h>
#include <imagehlp.h>
#include <iostream>
#pragma comment(lib, "imagehlp.lib")  // 鏈接 imagehlp 庫int main() {// 示例路徑:假設中間目錄 "logs" 和 "2024" 可能不存在const char* dirPath = "C:\\data\\logs\\2024\\April\\";// 確保目錄路徑存在BOOL result = MakeSureDirectoryPathExists(dirPath);if (result) {std::cout << "目錄路徑已確保存在: " << dirPath << std::endl;} else {DWORD error = GetLastError();std::cerr << "創建目錄失敗,錯誤碼: " << error << std::endl;}return 0;
}
  • C:\data\ 已存在,但 logs\2024\April\ 不存在,函數會自動創建這三個層級的目錄。
  • 若路徑中包含文件名(如 C:\data\file.txt),函數會處理 C:\data\ 目錄,忽略 file.txt
  1. 路徑格式

    • 支持反斜杠 \ 或正斜杠 / 作為路徑分隔符(如 C:/data/logs/ 也是合法的)。
    • 路徑末尾可以帶或不帶分隔符(如 C:\dataC:\data\ 效果相同)。
  2. 權限問題

    • 函數需要有足夠的權限在目標位置創建目錄,否則會失敗(例如在 C:\ 根目錄創建目錄可能需要管理員權限)。
    • 失敗時可通過 GetLastError() 查看具體原因(如 ERROR_ACCESS_DENIED 表示權限不足)。
  3. 兼容性

    • 屬于 Windows 特有函數,依賴 imagehlp.dll,不支持 Linux/macOS 系統。
    • 在現代 Windows 系統(如 Windows 10/11)中仍可正常使用,但建議在新代碼中考慮跨平臺方案(如 C++17 的 std::filesystem)。
  4. std::filesystem 的對比

    • C++17 引入的 std::filesystem::create_directories 功能類似,且是跨平臺的,推薦優先使用:
      #include <filesystem>
      namespace fs = std::filesystem;// 跨平臺創建目錄(包括中間目錄)
      fs::create_directories("C:/data/logs/2024/");
      
  • 適用場景
    在寫入日志文件、保存用戶數據前,確保目標目錄存在(避免因目錄不存在導致文件操作失敗)。
    批量處理文件時,預先創建復雜的目錄結構(如按日期分層的日志目錄 logs/2024/05/)。

MakeSureDirectoryPathExists 是 Windows 下快速創建多級目錄的實用函數,適合在僅需支持 Windows 平臺的項目中使用。對于跨平臺需求,建議使用 C++17 的 std::filesystem::create_directories,其功能一致且兼容性更好。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/97961.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/97961.shtml
英文地址,請注明出處:http://en.pswp.cn/web/97961.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何在Anaconda中配置你的CUDA Pytorch cuNN環境(2025最新教程)

目錄 一、簡介 二、下載CUDA 三、下載Pytorch-GPU版本 四、下載CUDNN 五、總結 六、測試代碼 一、簡介 啥是Anaconda?啥是CUDA?啥是CUDNN&#xff1f;它們和Pytorch、GPU之間有啥關系? 怎么通俗解釋它們三者的用途和關系&#xff1f; 1.GPU(圖形處理單元&#xff09…

算法面試(1)-----目標檢測和圖像分類、語義分割的區別

操作系統&#xff1a;ubuntu22.04 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 目標檢測&#xff08;Object Detection&#xff09;、圖像分類&#xff08;Image Classification&#xff09;、語義分割&#xff08;Semantic Segmentation&#xff09; 是計算機視…

電腦散熱風扇有噪音怎么解決

一、初步檢查與清理斷電并拆機關閉電腦并拔掉電源&#xff0c;打開機箱側板&#xff08;筆記本需先拆除后蓋螺絲&#xff09;。操作前建議佩戴防靜電手環&#xff0c;避免靜電損壞硬件。清理風扇及散熱片灰塵使用壓縮空氣罐從風扇進風口吹走灰塵&#xff0c;或用軟毛刷輕輕刷去…

SeaweedFS深度解析(九):k8s環境使用helm部署Seaweedfs集群

上一篇&#xff1a;《SeaweedFS深度解析&#xff08;八&#xff09;&#xff1a;k8s環境使用Operator部署Seaweedfs集群》 鏈接: link #作者&#xff1a;閆乾苓 文章目錄k8s環境使用helm部署Seaweedfs集群準備鏡像seaweed-master-localpv-storageclass.yamlseaweed-volume-lo…

MATLAB繪制一個新穎的混沌圖像(新四翼混沌系統)

新四翼混沌系統:dx/dt a(y - x) yz dy/dt cx - y - xz dz/dt -bz xyMATLAB代碼:function plot_novel_chaotic_system() % 參數設置 a 10; b 8/3; c 28;% 初始條件 x0 [1, 1, 1];% 時間范圍 tspan [0 100];% 求解微分方程 [t, x] ode45((t, x) chaotic_system(t, x, …

金融數據---獲取股票日線數據

獲取股票日線的數據方式有很多&#xff0c;包括東方財富&#xff0c;同花順&#xff0c;tushare&#xff0c;這里我們就利用東方財富的數據&#xff0c;是免費的開源獲取&#xff0c;第一步先安裝akshare&#xff0c;pip安裝就可以py -m pip install akshareAkshare 股票數據獲…

Mac 真正多顯示器支持:TESmart USB-C KVM(搭載 DisplayLink 技術)如何實現

多顯示器已經不再是奢侈品&#xff0c;而是專業人士提升生產力的必需工具。無論是創意設計師、股票交易員還是軟件開發人員&#xff0c;多屏幕都能讓工作流程更高效、更有條理。 然而&#xff0c;Mac 用戶長期以來面臨一個主要障礙&#xff1a;macOS 原生不支持多流傳輸&#x…

【實時Linux實戰系列】靜態鏈接與libc選擇:musl vs glibc的時延權衡

背景與重要性 在實時系統開發中&#xff0c;選擇合適的C標準庫&#xff08;libc&#xff09;和鏈接方式對系統的啟動時間、線程性能和內存分配效率有著顯著影響。glibc和musl是兩種流行的C標準庫實現&#xff0c;它們在設計目標和性能表現上存在差異。通過對比這兩種libc在啟動…

Altium Designer(AD24)的三種文件組織形式,工程文件,自由文件與存盤文件

??《專欄目錄》 目錄 1,概述 2,工程文件 3,自由文件 4,存盤文件 5,文件轉換 5.1,工程文件于自由文件互轉換 5.2,工程文件于存盤文件互轉換 6,注意事項 1,概述 本文介紹Altium Designer 24軟件(后文簡稱AD24或軟件)的三種文件組織形式,工程文件,自由文件和存盤文…

Python+Selenium實現自動化測試

&#x1f345; 點擊文末小卡片 &#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快安裝selenium打開命令控制符輸入&#xff1a;pip install -U selenium火狐瀏覽器安裝firebug&#xff1a;www.firebug.com&#xff0c;調試所有網站語言&#xff0…

2024年CSP-X初賽真題及答案解析(6-10)

2024年CSP-X初賽真題及答案解析(6-10) 字符串abcabcabc有多少不同的非空子串?( )。 A. 24 B. 36 C. 45 D. 46 答案:A 解析: 長度 1: 3 個(a, b, c) 長度 2: 3 個(ab, bc, ca) 長度 3: 3 個(abc, bca, cab) 長度 4: 3 個(abca, bcab, cabc) 長度 5: 3 個(a…

緩存與數據庫一致性的4大坑及終極解決方案

緩存雪崩、擊穿、穿透全中招&#xff1f;別讓緩存與數據庫的“愛恨情仇”毀了你的系統&#xff01; 你有沒有經歷過這樣的深夜告警&#xff1a;Redis 響應延遲飆升&#xff0c;數據庫 CPU 直沖 100%&#xff0c;接口大面積超時&#xff1f;一查日志&#xff0c;發現大量請求繞過…

基于 Python charm 庫實現的一些 Pairing 密碼學算法

基于 Python charm 庫實現了一些 Pairing 密碼學算法&#xff0c;放在了 https://github.com/BatchClayderman/Cryptography-Schemes 里面。 在正確部署了 Python charm 庫后&#xff0c;所有的 Python 腳本都是獨立的&#xff0c;即該存儲庫中不存在一個腳本調用另一個腳本的…

用戶體驗五大要點:從問題到解決方案的完整指南

在互聯網產品設計和運營的過程中&#xff0c;用戶體驗&#xff08;User Experience&#xff0c;簡稱 UX&#xff09; 已經成為決定產品成敗的關鍵因素。一個功能再強大的產品&#xff0c;如果用戶用得不舒服、不信任&#xff0c;甚至覺得沒有價值&#xff0c;最終都會被拋棄。那…

MySQL 外鍵約束:表與表之間的 “契約”,數據一致性的守護者

MySQL 外鍵約束&#xff1a;表與表之間的 “契約”&#xff0c;數據一致性的守護者 在 MySQL 數據庫設計中&#xff0c;外鍵約束&#xff08;FOREIGN KEY&#xff09;是維護表之間關聯關系的核心工具。它就像表與表之間的一份 “契約”&#xff0c;確保從表&#xff08;如訂單…

《投資-54》元宇宙

元宇宙&#xff08;Metaverse&#xff09;是一個近年來備受關注的概念&#xff0c;它描繪了一個虛擬與現實交融、由多個互連的3D虛擬世界組成的沉浸式數字環境。用戶可以通過虛擬現實&#xff08;VR&#xff09;、增強現實&#xff08;AR&#xff09;、互聯網和其他技術&#x…

【數據結構】Java集合框架:List與ArrayList

文章目錄一、認識List接口1.1 List的定義與繼承關系1.2 Collection接口的核心方法1.3 List接口的獨特方法二、線性表與順序表基礎2.1 線性表2.2 順序表自定義順序表&#xff08;MyArrayList&#xff09;實現1. 前期準備&#xff1a;自定義異常類2. MyArrayList核心結構3. 工具方…

K8S里的“豌豆莢”:Pod

1. 為什么要有podPod 這個詞原意是“豌豆莢”&#xff0c;后來又延伸出“艙室”“太空艙”等含義&#xff0c;你可以看一下這張圖片&#xff0c;形 象地來說 Pod 就是包含了很多組件、成員的一種結構。之前的容器技術讓進程在一個“沙盒”環境里運行&#xff0c;具有良好的隔離…

vue3 基本教程-運行一個最小demo

Vue 3 基本教程 - 運行一個最小 Demo 1. 創建項目 使用 Vue 官方腳手架工具創建一個新項目&#xff1a; # 安裝 Vue CLI (如果尚未安裝) npm install -g vue/cli# 創建一個新項目 vue create vue3-demo# 選擇 Vue 3 預設 # 使用方向鍵選擇 "Default (Vue 3)" 然后按 …

大數據新視界 -- Hive 集群搭建與配置的最佳實踐(2 - 16 - 13)

??????親愛的朋友們,熱烈歡迎你們來到 青云交的博客!能與你們在此邂逅,我滿心歡喜,深感無比榮幸。在這個瞬息萬變的時代,我們每個人都在苦苦追尋一處能讓心靈安然棲息的港灣。而 我的博客,正是這樣一個溫暖美好的所在。在這里,你們不僅能夠收獲既富有趣味又極為實…