📄 imagehlp.pas
字号:
{******************************************************************}
{ }
{ Borland Delphi Runtime Library }
{ Image Help interface unit }
{ }
{ Portions created by Microsoft are }
{ Copyright (C) 1995-1999 Microsoft Corporation. }
{ All Rights Reserved. }
{ }
{ The original file is: imagehlp.h, released June 2000. }
{ The original Pascal code is: ImageHlp.pas, released Dec 2000 }
{ The initial developer of the Pascal code is Marcel van Brakel }
{ (brakelm@bart.nl). }
{ }
{ Portions created by Marcel van Brakel are }
{ Copyright (C) 1999 Marcel van Brakel. }
{ }
{ Obtained through: }
{ Joint Endeavour of Delphi Innovators (Project JEDI) }
{ }
{ You may retrieve the latest version of this file at the Project }
{ JEDI home page, located at http://delphi-jedi.org }
{ }
{ The contents of this file are used with permission, subject to }
{ the Mozilla Public License Version 1.1 (the "License"); you may }
{ not use this file except in compliance with the License. You may }
{ obtain a copy of the License at }
{ http://www.mozilla.org/MPL/MPL-1.1.html }
{ }
{ Software distributed under the License is distributed on an }
{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or }
{ implied. See the License for the specific language governing }
{ rights and limitations under the License. }
{ }
{******************************************************************}
unit ImageHlp;
{$WEAKPACKAGEUNIT}
{$HPPEMIT ''}
{$HPPEMIT '#include "ImageHlp.h"'}
{$HPPEMIT ''}
{$I WINDEFINES.INC}
interface
uses
Windows, WinBase, WinNT, WinType;
const
IMAGE_SEPARATION = (64*1024);
{$EXTERNALSYM IMAGE_SEPARATION}
type
PLOADED_IMAGE = ^LOADED_IMAGE;
{$EXTERNALSYM PLOADED_IMAGE}
_LOADED_IMAGE = record
ModuleName: PSTR;
hFile: HANDLE;
MappedAddress: PUCHAR;
FileHeader: PIMAGE_NT_HEADERS32;
LastRvaSection: PIMAGE_SECTION_HEADER;
NumberOfSections: ULONG;
Sections: PIMAGE_SECTION_HEADER;
Characteristics: ULONG;
fSystemImage: ByteBool;
fDOSImage: ByteBool;
Links: LIST_ENTRY;
SizeOfImage: ULONG;
end;
{$EXTERNALSYM _LOADED_IMAGE}
LOADED_IMAGE = _LOADED_IMAGE;
{$EXTERNALSYM LOADED_IMAGE}
TLoadedImage = LOADED_IMAGE;
PLoadedImage = PLOADED_IMAGE;
function BindImage(ImageName, DllPath, SymbolPath: PSTR): BOOL; stdcall;
{$EXTERNALSYM BindImage}
type
_IMAGEHLP_STATUS_REASON = (
BindOutOfMemory,
BindRvaToVaFailed,
BindNoRoomInImage,
BindImportModuleFailed,
BindImportProcedureFailed,
BindImportModule,
BindImportProcedure,
BindForwarder,
BindForwarderNOT,
BindImageModified,
BindExpandFileHeaders,
BindImageComplete,
BindMismatchedSymbols,
BindSymbolsNotUpdated);
{$EXTERNALSYM _IMAGEHLP_STATUS_REASON}
IMAGEHLP_STATUS_REASON = _IMAGEHLP_STATUS_REASON;
{$EXTERNALSYM IMAGEHLP_STATUS_REASON}
TImageHlpStatusReason = IMAGEHLP_STATUS_REASON;
PIMAGEHLP_STATUS_ROUTINE = function (Reason: IMAGEHLP_STATUS_REASON;
ImageName, DllName: PSTR; Va, Parameter: ULONG_PTR): BOOL; stdcall;
{$EXTERNALSYM PIMAGEHLP_STATUS_ROUTINE}
PImageHlpStatusRoutine = PIMAGEHLP_STATUS_ROUTINE;
function BindImageEx(Flags: DWORD; ImageName, DllPath, SymbolPath: PSTR;
StatusRoutine: PIMAGEHLP_STATUS_ROUTINE): BOOL; stdcall;
{$EXTERNALSYM BindImageEx}
const
BIND_NO_BOUND_IMPORTS = $00000001;
{$EXTERNALSYM BIND_NO_BOUND_IMPORTS}
BIND_NO_UPDATE = $00000002;
{$EXTERNALSYM BIND_NO_UPDATE}
BIND_ALL_IMAGES = $00000004;
{$EXTERNALSYM BIND_ALL_IMAGES}
BIND_CACHE_IMPORT_DLLS = $00000008; // Cache dll's across calls to BindImageEx (same as NT 3.1->NT 4.0)
{$EXTERNALSYM BIND_CACHE_IMPORT_DLLS}
function ReBaseImage(CurrentImageName: PSTR; SymbolPath: PSTR; fReBase: BOOL;
fRebaseSysfileOk: BOOL; fGoingDown: BOOL; CheckImageSize: ULONG;
var OldImageSize: ULONG; var OldImageBase: ULONG_PTR; var NewImageSize: ULONG;
var NewImageBase: ULONG_PTR; TimeStamp: ULONG): BOOL; stdcall;
{$EXTERNALSYM ReBaseImage}
function ReBaseImage64(CurrentImageName: PSTR; SymbolPath: PSTR; fReBase: BOOL;
fRebaseSysfileOk: BOOL; fGoingDown: BOOL; CheckImageSize: ULONG;
var OldImageSize: ULONG; var OldImageBase: ULONG64; var NewImageSize: ULONG;
var NewImageBase: ULONG64; TimeStamp: ULONG): BOOL; stdcall;
{$EXTERNALSYM ReBaseImage64}
//
// Define checksum return codes.
//
const
CHECKSUM_SUCCESS = 0;
{$EXTERNALSYM CHECKSUM_SUCCESS}
CHECKSUM_OPEN_FAILURE = 1;
{$EXTERNALSYM CHECKSUM_OPEN_FAILURE}
CHECKSUM_MAP_FAILURE = 2;
{$EXTERNALSYM CHECKSUM_MAP_FAILURE}
CHECKSUM_MAPVIEW_FAILURE = 3;
{$EXTERNALSYM CHECKSUM_MAPVIEW_FAILURE}
CHECKSUM_UNICODE_FAILURE = 4;
{$EXTERNALSYM CHECKSUM_UNICODE_FAILURE}
// Define Splitsym flags.
SPLITSYM_REMOVE_PRIVATE = $00000001; // Remove CV types/symbols and Fixup debug
{$EXTERNALSYM SPLITSYM_REMOVE_PRIVATE}
// Used for creating .dbg files that ship
// as part of the product.
SPLITSYM_EXTRACT_ALL = $00000002; // Extract all debug info from image.
{$EXTERNALSYM SPLITSYM_EXTRACT_ALL}
// Normally, FPO is left in the image
// to allow stack traces through the code.
// Using this switch is similar to linking
// with -debug:none except the .dbg file
// exists...
SPLITSYM_SYMBOLPATH_IS_SRC = $00000004; // The SymbolFilePath contains an alternate
{$EXTERNALSYM SPLITSYM_SYMBOLPATH_IS_SRC}
// path to locate the pdb.
//
// Define checksum function prototypes.
//
function CheckSumMappedFile(BaseAddress: PVOID; FileLength: DWORD;
var HeaderSum, CheckSum: DWORD): PIMAGE_NT_HEADERS; stdcall;
{$EXTERNALSYM CheckSumMappedFile}
function MapFileAndCheckSumA(Filename: PSTR; var HeaderSum, CheckSum: DWORD): DWORD; stdcall;
{$EXTERNALSYM MapFileAndCheckSumA}
function MapFileAndCheckSumW(Filename: PWSTR; var HeaderSum, CheckSum: DWORD): DWORD; stdcall;
{$EXTERNALSYM MapFileAndCheckSumW}
{$IFDEF UNICODE}
function MapFileAndCheckSum(Filename: PWSTR; var HeaderSum, CheckSum: DWORD): DWORD; stdcall;
{$EXTERNALSYM MapFileAndCheckSum}
{$ELSE}
function MapFileAndCheckSum(Filename: PSTR; var HeaderSum, CheckSum: DWORD): DWORD; stdcall;
{$EXTERNALSYM MapFileAndCheckSum}
{$ENDIF}
function GetImageConfigInformation(const LoadedImage: LOADED_IMAGE;
var ImageConfigInformation: IMAGE_LOAD_CONFIG_DIRECTORY): BOOL; stdcall;
{$EXTERNALSYM GetImageConfigInformation}
function GetImageUnusedHeaderBytes(const LoadedImage: LOADED_IMAGE;
var SizeUnusedHeaderBytes: DWORD): DWORD; stdcall;
{$EXTERNALSYM GetImageUnusedHeaderBytes}
function SetImageConfigInformation(const LoadedImage: LOADED_IMAGE;
const ImageConfigInformation: IMAGE_LOAD_CONFIG_DIRECTORY): BOOL; stdcall;
{$EXTERNALSYM SetImageConfigInformation}
// Image Integrity API's
const
CERT_PE_IMAGE_DIGEST_DEBUG_INFO = $01;
{$EXTERNALSYM CERT_PE_IMAGE_DIGEST_DEBUG_INFO}
CERT_PE_IMAGE_DIGEST_RESOURCES = $02;
{$EXTERNALSYM CERT_PE_IMAGE_DIGEST_RESOURCES}
CERT_PE_IMAGE_DIGEST_ALL_IMPORT_INFO = $04;
{$EXTERNALSYM CERT_PE_IMAGE_DIGEST_ALL_IMPORT_INFO}
CERT_PE_IMAGE_DIGEST_NON_PE_INFO = $08; // include data outside the PE image
{$EXTERNALSYM CERT_PE_IMAGE_DIGEST_NON_PE_INFO}
CERT_SECTION_TYPE_ANY = $FF; // Any Certificate type
{$EXTERNALSYM CERT_SECTION_TYPE_ANY}
type
DIGEST_HANDLE = PVOID;
{$EXTERNALSYM DIGEST_HANDLE}
TDigestHandle = DIGEST_HANDLE;
DIGEST_FUNCTION = function (refdata: DIGEST_HANDLE; pData: PBYTE; dwLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM DIGEST_FUNCTION}
TDigestFunction = DIGEST_FUNCTION;
function ImageGetDigestStream(FileHandle: HANDLE; DigestLevel: DWORD;
DigestFunction: DIGEST_FUNCTION; DigestHandle: DIGEST_HANDLE): BOOL; stdcall;
{$EXTERNALSYM ImageGetDigestStream}
function ImageAddCertificate(FileHandle: HANDLE; Certificate: PWinCertificate;
var Index: DWORD): BOOL; stdcall;
{$EXTERNALSYM ImageAddCertificate}
function ImageRemoveCertificate(FileHandle: HANDLE; Index: DWORD): BOOL; stdcall;
{$EXTERNALSYM ImageRemoveCertificate}
function ImageEnumerateCertificates(FileHandle: HANDLE; TypeFilter: WORD;
var CertificateCount: DWORD; Indices: PDWORD; IndexCount: DWORD): BOOL; stdcall;
{$EXTERNALSYM ImageEnumerateCertificates}
function ImageGetCertificateData(FileHandle: HANDLE; CertificateIndex: DWORD;
Certificate: PWinCertificate; var RequiredLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM ImageGetCertificateData}
function ImageGetCertificateHeader(FileHandle: HANDLE; CertificateIndex: DWORD;
Certificateheader: PWinCertificate): BOOL; stdcall;
{$EXTERNALSYM ImageGetCertificateHeader}
function ImageLoad(DllName: PSTR; DllPath: PSTR): PLOADED_IMAGE; stdcall;
{$EXTERNALSYM ImageLoad}
function ImageUnload(const LoadedImage: LOADED_IMAGE): BOOL; stdcall;
{$EXTERNALSYM ImageUnload}
function MapAndLoad(ImageName, DllPath: PSTR; var LoadedImage: LOADED_IMAGE;
DotDll: BOOL; ReadOnly: BOOL): BOOL; stdcall;
{$EXTERNALSYM MapAndLoad}
function UnMapAndLoad(const LoadedImage: LOADED_IMAGE): BOOL; stdcall;
{$EXTERNALSYM UnMapAndLoad}
function TouchFileTimes(FileHandle: HANDLE; pSystemTime: PSYSTEMTIME): BOOL; stdcall;
{$EXTERNALSYM TouchFileTimes}
function SplitSymbols(ImageName, SymbolsPath, SymbolFilePath: PSTR; Flags: DWORD): BOOL; stdcall;
{$EXTERNALSYM SplitSymbols}
function UpdateDebugInfoFile(ImageFileName, SymbolPath, DebugFilePath: PSTR;
const NtHeaders: IMAGE_NT_HEADERS32): BOOL; stdcall;
{$EXTERNALSYM UpdateDebugInfoFile}
function UpdateDebugInfoFileEx(ImageFileName, SymbolPath, DebugFilePath: PSTR;
const NtHeaders: IMAGE_NT_HEADERS32; OldChecksum: DWORD): BOOL; stdcall;
{$EXTERNALSYM UpdateDebugInfoFileEx}
function FindDebugInfoFile(FileName, SymbolPath, DebugFilePath: PSTR): HANDLE; stdcall;
{$EXTERNALSYM FindDebugInfoFile}
type
PFIND_DEBUG_FILE_CALLBACK = function (FileHandle: HANDLE; FileName: PSTR;
CallerData: PVOID): BOOL; stdcall;
{$EXTERNALSYM PFIND_DEBUG_FILE_CALLBACK}
PFindDebugFileCallback = PFIND_DEBUG_FILE_CALLBACK;
function FindDebugInfoFileEx(FileName, SymbolPath, DebugFilePath: PSTR;
Callback: PFIND_DEBUG_FILE_CALLBACK; CallerData: PVOID): HANDLE; stdcall;
{$EXTERNALSYM FindDebugInfoFileEx}
function FindFileInSearchPath(hprocess: HANDLE; SearchPath, FileName: LPSTR;
one, two, three: DWORD; FilePath: LPSTR): BOOL; stdcall;
{$EXTERNALSYM FindFileInSearchPath}
function FindExecutableImage(FileName, SymbolPath, ImageFilePath: PSTR): HANDLE; stdcall;
{$EXTERNALSYM FindExecutableImage}
type
PFIND_EXE_FILE_CALLBACK = function (FileHandle: HANDLE; FileName: PSTR;
CallerData: PVOID): BOOL; stdcall;
{$EXTERNALSYM PFIND_EXE_FILE_CALLBACK}
PFindExeFileCallback = PFIND_EXE_FILE_CALLBACK;
function FindExecutableImageEx(FileName, SymbolPath, ImageFilePath: PSTR;
Callback: PFIND_EXE_FILE_CALLBACK; CallerData: PVOID): HANDLE; stdcall;
{$EXTERNALSYM FindExecutableImageEx}
function ImageNtHeader(Base: PVOID): PIMAGE_NT_HEADERS; stdcall;
{$EXTERNALSYM ImageNtHeader}
function ImageDirectoryEntryToDataEx(Base: PVOID; MappedAsImage: ByteBool;
DirectoryEntry: USHORT; var Size: ULONG; var FoundHeader: PIMAGE_SECTION_HEADER): PVOID; stdcall;
{$EXTERNALSYM ImageDirectoryEntryToDataEx}
function ImageDirectoryEntryToData(Base: PVOID; MappedAsImage: ByteBool;
DirectoryEntry: USHORT; var Size: ULONG): PVOID; stdcall;
{$EXTERNALSYM ImageDirectoryEntryToData}
function ImageRvaToSection(NtHeaders: PIMAGE_NT_HEADERS; Base: PVOID; Rva: ULONG): PIMAGE_SECTION_HEADER; stdcall;
{$EXTERNALSYM ImageRvaToSection}
function ImageRvaToVa(NtHeaders: PIMAGE_NT_HEADERS; Base: PVOID; Rva: ULONG;
var LastRvaSection: PIMAGE_SECTION_HEADER): PVOID; stdcall;
{$EXTERNALSYM ImageRvaToVa}
// Symbol server export
//typedef BOOL (*PSYMBOLSERVERPROC)(LPCSTR, LPCSTR, DWORD, DWORD, DWORD, LPSTR);
//typedef BOOL (*PSYMBOLSERVEROPENPROC)(VOID);
//typedef BOOL (*PSYMBOLSERVERCLOSEPROC)(VOID);
// This api won't be ported to Win64 - Fix your code.
type
PIMAGE_DEBUG_INFORMATION = ^IMAGE_DEBUG_INFORMATION;
{$EXTERNALSYM PIMAGE_DEBUG_INFORMATION}
_IMAGE_DEBUG_INFORMATION = record
List: LIST_ENTRY;
ReservedSize: DWORD;
ReservedMappedBase: PVOID;
ReservedMachine: USHORT;
ReservedCharacteristics: USHORT;
ReservedCheckSum: DWORD;
ImageBase: DWORD;
SizeOfImage: DWORD;
ReservedNumberOfSections: DWORD;
ReservedSections: PIMAGE_SECTION_HEADER;
ReservedExportedNamesSize: DWORD;
ReservedExportedNames: PSTR;
ReservedNumberOfFunctionTableEntries: DWORD;
ReservedFunctionTableEntries: PIMAGE_FUNCTION_ENTRY;
ReservedLowestFunctionStartingAddress: DWORD;
ReservedHighestFunctionEndingAddress: DWORD;
ReservedNumberOfFpoTableEntries: DWORD;
ReservedFpoTableEntries: PFPO_DATA;
SizeOfCoffSymbols: DWORD;
CoffSymbols: PIMAGE_COFF_SYMBOLS_HEADER;
ReservedSizeOfCodeViewSymbols: DWORD;
ReservedCodeViewSymbols: PVOID;
ImageFilePath: PSTR;
ImageFileName: PSTR;
ReservedDebugFilePath: PSTR;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -