📄 jwaimagehlp.pas
字号:
{******************************************************************************}
{ }
{ Image Help API interface Unit for Object Pascal }
{ }
{ Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft }
{ Corporation. All Rights Reserved. }
{ }
{ The original file is: imagehlp.h, released August 2001. The original Pascal }
{ code is: ImageHelp.pas, released December 2000. The initial developer of the }
{ Pascal code is Marcel van Brakel (brakelm@chello.nl). }
{ }
{ Portions created by Marcel van Brakel are Copyright (C) 1999-2001 }
{ Marcel van Brakel. All Rights Reserved. }
{ }
{ 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 or my personal homepage located at }
{ http://members.chello.nl/m.vanbrakel2 }
{ }
{ 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. }
{ }
{ Alternatively, the contents of this file may be used under the terms of the }
{ GNU Lesser General Public License (the "LGPL License"), in which case the }
{ provisions of the LGPL License are applicable instead of those above. }
{ If you wish to allow use of your version of this file only under the terms }
{ of the LGPL License and not to allow others to use your version of this file }
{ under the MPL, indicate your decision by deleting the provisions above and }
{ replace them with the notice and other provisions required by the LGPL }
{ License. If you do not delete the provisions above, a recipient may use }
{ your version of this file under either the MPL or the LGPL License. }
{ }
{ For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
{ }
{******************************************************************************}
unit JwaImageHlp;
{$WEAKPACKAGEUNIT}
{$HPPEMIT ''}
{$HPPEMIT '#include "ImageHlp.h"'}
{$HPPEMIT ''}
{$I WINDEFINES.INC}
interface
uses
Windows, JwaWinBase, JwaWinNT, JwaWinType;
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;
const
MAX_SYM_NAME = 2000;
{$EXTERNALSYM MAX_SYM_NAME}
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,
BindImportProcedure32,
BindImportProcedure64,
BindForwarder32,
BindForwarder64,
BindForwarderNOT32,
BindForwarderNOT64);
{$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;
PIMAGEHLP_STATUS_ROUTINE32 = function (Reason: IMAGEHLP_STATUS_REASON; ImageName, DllName: PSTR;
Va: ULONG; Parameter: ULONG_PTR): BOOL; stdcall;
{$EXTERNALSYM PIMAGEHLP_STATUS_ROUTINE32}
PImageHlpStatusRoutine23 = PIMAGEHLP_STATUS_ROUTINE32;
PIMAGEHLP_STATUS_ROUTINE64 = function (Reason: IMAGEHLP_STATUS_REASON; ImageName, DllName: PSTR;
Va: ULONG64; Parameter: ULONG_PTR): BOOL; stdcall;
{$EXTERNALSYM PIMAGEHLP_STATUS_ROUTINE64}
PImageHlpStatusRoutine64 = PIMAGEHLP_STATUS_ROUTINE64;
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}
BIND_REPORT_64BIT_VA = $00000010;
{$EXTERNALSYM BIND_REPORT_64BIT_VA}
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}
type
PFINDFILEINPATHCALLBACK = function (filename: PSTR; context: PVOID): BOOL; stdcall;
{$EXTERNALSYM PFINDFILEINPATHCALLBACK}
function SymFindFileInPath(hprocess: HANDLE; SearchPath, FileName: LPSTR; id: PVOID; two, three, flags: DWORD;
FoundFile: LPSTR; callback: PFINDFILEINPATHCALLBACK; context: PVOID): BOOL; stdcall;
{$EXTERNALSYM SymFindFileInPath}
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}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -