home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1997 May / Pcwk0597.iso / borland / cb / setup / cbuilder / data.z / IMAGEHLP.H < prev    next >
C/C++ Source or Header  |  1997-02-28  |  24KB  |  937 lines

  1. /*++ BUILD Version: 0001     Increment this if a change has global effects
  2.  
  3. Copyright (c) 1993-1996  Microsoft Corporation
  4.  
  5. Module Name:
  6.  
  7.     imagehlp.h
  8.  
  9. Abstract:
  10.  
  11.     This module defines the prptotypes and constants required for the image
  12.     help routines.
  13.  
  14. Revision History:
  15.  
  16. --*/
  17.  
  18. #ifndef _IMAGEHLP_
  19. #define _IMAGEHLP_
  20. #pragma option -b
  21.  
  22. #ifdef __cplusplus
  23. extern "C" {
  24. #endif
  25.  
  26. #ifdef __BORLANDC__
  27. #pragma option -b.
  28.   #include <pshpack8.h>
  29. #pragma option -b
  30. #endif
  31.  
  32. //
  33. // Define checksum return codes.
  34. //
  35.  
  36. #define CHECKSUM_SUCCESS            0
  37. #define CHECKSUM_OPEN_FAILURE       1
  38. #define CHECKSUM_MAP_FAILURE        2
  39. #define CHECKSUM_MAPVIEW_FAILURE    3
  40. #define CHECKSUM_UNICODE_FAILURE    4
  41.  
  42. // Define Splitsym flags.
  43.  
  44. #define SPLITSYM_REMOVE_PRIVATE     0x00000001      // Remove CV types/symbols and Fixup debug
  45.                                                     //  Used for creating .dbg files that ship
  46.                                                     //  as part of the product.
  47.  
  48. #define SPLITSYM_EXTRACT_ALL        0x00000002      // Extract all debug info from image.
  49.                                                     //  Normally, FPO is left in the image
  50.                                                     //  to allow stack traces through the code.
  51.                                                     //  Using this switch is similar to linking
  52.                                                     //  with -debug:none except the .dbg file
  53.                                                     //  exists...
  54.  
  55. #ifdef _IMAGEHLP_SOURCE_
  56. #define IMAGEAPI __stdcall
  57. #else
  58. #define IMAGEAPI DECLSPEC_IMPORT __stdcall
  59. #endif
  60.  
  61. //
  62. // Define checksum function prototypes.
  63. //
  64.  
  65. PIMAGE_NT_HEADERS
  66. IMAGEAPI
  67. CheckSumMappedFile (
  68.     LPVOID BaseAddress,
  69.     DWORD FileLength,
  70.     LPDWORD HeaderSum,
  71.     LPDWORD CheckSum
  72.     );
  73.  
  74. DWORD
  75. IMAGEAPI
  76. MapFileAndCheckSumA (
  77.     LPSTR Filename,
  78.     LPDWORD HeaderSum,
  79.     LPDWORD CheckSum
  80.     );
  81.  
  82. DWORD
  83. IMAGEAPI
  84. MapFileAndCheckSumW (
  85.     PWSTR Filename,
  86.     LPDWORD HeaderSum,
  87.     LPDWORD CheckSum
  88.     );
  89.  
  90. #ifdef UNICODE
  91. #define MapFileAndCheckSum  MapFileAndCheckSumW
  92. #else
  93. #define MapFileAndCheckSum  MapFileAndCheckSumA
  94. #endif // !UNICODE
  95.  
  96.  
  97. BOOL
  98. IMAGEAPI
  99. TouchFileTimes (
  100.     HANDLE FileHandle,
  101.     LPSYSTEMTIME lpSystemTime
  102.     );
  103.  
  104. BOOL
  105. IMAGEAPI
  106. SplitSymbols (
  107.     LPSTR ImageName,
  108.     LPSTR SymbolsPath,
  109.     LPSTR SymbolFilePath,
  110.     DWORD Flags                 // Combination of flags above
  111.     );
  112.  
  113. HANDLE
  114. IMAGEAPI
  115. FindDebugInfoFile (
  116.     LPSTR FileName,
  117.     LPSTR SymbolPath,
  118.     LPSTR DebugFilePath
  119.     );
  120.  
  121. HANDLE
  122. IMAGEAPI
  123. FindExecutableImage(
  124.     LPSTR FileName,
  125.     LPSTR SymbolPath,
  126.     LPSTR ImageFilePath
  127.     );
  128.  
  129. BOOL
  130. IMAGEAPI
  131. UpdateDebugInfoFile(
  132.     LPSTR ImageFileName,
  133.     LPSTR SymbolPath,
  134.     LPSTR DebugFilePath,
  135.     PIMAGE_NT_HEADERS NtHeaders
  136.     );
  137.  
  138. BOOL
  139. IMAGEAPI
  140. UpdateDebugInfoFileEx(
  141.     LPSTR ImageFileName,
  142.     LPSTR SymbolPath,
  143.     LPSTR DebugFilePath,
  144.     PIMAGE_NT_HEADERS NtHeaders,
  145.     DWORD OldChecksum
  146.     );
  147.  
  148. BOOL
  149. IMAGEAPI
  150. BindImage(
  151.     IN LPSTR ImageName,
  152.     IN LPSTR DllPath,
  153.     IN LPSTR SymbolPath
  154.     );
  155.  
  156. typedef enum _IMAGEHLP_STATUS_REASON {
  157.     BindOutOfMemory,
  158.     BindRvaToVaFailed,
  159.     BindNoRoomInImage,
  160.     BindImportModuleFailed,
  161.     BindImportProcedureFailed,
  162.     BindImportModule,
  163.     BindImportProcedure,
  164.     BindForwarder,
  165.     BindForwarderNOT,
  166.     BindImageModified,
  167.     BindExpandFileHeaders,
  168.     BindImageComplete,
  169.     BindMismatchedSymbols,
  170.     BindSymbolsNotUpdated
  171. } IMAGEHLP_STATUS_REASON;
  172.  
  173. typedef
  174. BOOL
  175. (__stdcall *PIMAGEHLP_STATUS_ROUTINE)(
  176.     IMAGEHLP_STATUS_REASON Reason,
  177.     LPSTR ImageName,
  178.     LPSTR DllName,
  179.     ULONG Va,
  180.     ULONG Parameter
  181.     );
  182.  
  183.  
  184. BOOL
  185. IMAGEAPI
  186. BindImageEx(
  187.     IN DWORD Flags,
  188.     IN LPSTR ImageName,
  189.     IN LPSTR DllPath,
  190.     IN LPSTR SymbolPath,
  191.     IN PIMAGEHLP_STATUS_ROUTINE StatusRoutine
  192.     );
  193.  
  194. #define BIND_NO_BOUND_IMPORTS 0x00000001
  195. #define BIND_NO_UPDATE        0x00000002
  196. #define BIND_ALL_IMAGES       0x00000004
  197.  
  198. BOOL
  199. IMAGEAPI
  200. ReBaseImage(
  201.     IN     LPSTR CurrentImageName,
  202.     IN     LPSTR SymbolPath,
  203.     IN     BOOL  fReBase,          // TRUE if actually rebasing, false if only summing
  204.     IN     BOOL  fRebaseSysfileOk, // TRUE is system images s/b rebased
  205.     IN     BOOL  fGoingDown,       // TRUE if the image s/b rebased below the given base
  206.     IN     ULONG CheckImageSize,   // Max size allowed  (0 if don't care)
  207.     OUT    ULONG *OldImageSize,    // Returned from the header
  208.     OUT    ULONG *OldImageBase,    // Returned from the header
  209.     OUT    ULONG *NewImageSize,    // Image size rounded to next separation boundary
  210.     IN OUT ULONG *NewImageBase,    // (in) Desired new address.
  211.                                    // (out) Next address (actual if going down)
  212.     IN     ULONG TimeStamp         // new timestamp for image, if non-zero
  213.     );
  214.  
  215. #define IMAGE_SEPARATION (64*1024)
  216.  
  217.  
  218. typedef struct _LOADED_IMAGE {
  219.     LPSTR                 ModuleName;
  220.     HANDLE                hFile;
  221.     PUCHAR                MappedAddress;
  222.     PIMAGE_NT_HEADERS     FileHeader;
  223.     PIMAGE_SECTION_HEADER LastRvaSection;
  224.     ULONG                 NumberOfSections;
  225.     PIMAGE_SECTION_HEADER Sections;
  226.     ULONG                 Characteristics;
  227.     BOOLEAN               fSystemImage;
  228.     BOOLEAN               fDOSImage;
  229.     LIST_ENTRY            Links;
  230.     ULONG                 SizeOfImage;
  231. } LOADED_IMAGE, *PLOADED_IMAGE;
  232.  
  233.  
  234. PLOADED_IMAGE
  235. IMAGEAPI
  236. ImageLoad(
  237.     LPSTR DllName,
  238.     LPSTR DllPath
  239.     );
  240.  
  241. BOOL
  242. IMAGEAPI
  243. ImageUnload(
  244.     PLOADED_IMAGE LoadedImage
  245.     );
  246.  
  247. PIMAGE_NT_HEADERS
  248. IMAGEAPI
  249. ImageNtHeader (
  250.     IN PVOID Base
  251.     );
  252.  
  253. PVOID
  254. IMAGEAPI
  255. ImageDirectoryEntryToData (
  256.     IN PVOID Base,
  257.     IN BOOLEAN MappedAsImage,
  258.     IN USHORT DirectoryEntry,
  259.     OUT PULONG Size
  260.     );
  261.  
  262. PIMAGE_SECTION_HEADER
  263. IMAGEAPI
  264. ImageRvaToSection(
  265.     IN PIMAGE_NT_HEADERS NtHeaders,
  266.     IN PVOID Base,
  267.     IN ULONG Rva
  268.     );
  269.  
  270. PVOID
  271. IMAGEAPI
  272. ImageRvaToVa(
  273.     IN PIMAGE_NT_HEADERS NtHeaders,
  274.     IN PVOID Base,
  275.     IN ULONG Rva,
  276.     IN OUT PIMAGE_SECTION_HEADER *LastRvaSection
  277.     );
  278.  
  279. BOOL
  280. IMAGEAPI
  281. MapAndLoad(
  282.     LPSTR ImageName,
  283.     LPSTR DllPath,
  284.     PLOADED_IMAGE LoadedImage,
  285.     BOOL DotDll,
  286.     BOOL ReadOnly
  287.     );
  288.  
  289. BOOL
  290. IMAGEAPI
  291. GetImageConfigInformation(
  292.     PLOADED_IMAGE LoadedImage,
  293.     PIMAGE_LOAD_CONFIG_DIRECTORY ImageConfigInformation
  294.     );
  295.  
  296. DWORD
  297. IMAGEAPI
  298. GetImageUnusedHeaderBytes(
  299.     PLOADED_IMAGE LoadedImage,
  300.     LPDWORD SizeUnusedHeaderBytes
  301.     );
  302.  
  303. BOOL
  304. IMAGEAPI
  305. SetImageConfigInformation(
  306.     PLOADED_IMAGE LoadedImage,
  307.     PIMAGE_LOAD_CONFIG_DIRECTORY ImageConfigInformation
  308.     );
  309.  
  310. BOOL
  311. IMAGEAPI
  312. UnMapAndLoad(
  313.    PLOADED_IMAGE LoadedImage
  314.    );
  315.  
  316. typedef struct _IMAGE_DEBUG_INFORMATION {
  317.     LIST_ENTRY List;
  318.     DWORD Size;
  319.     PVOID MappedBase;
  320.     USHORT Machine;
  321.     USHORT Characteristics;
  322.     DWORD CheckSum;
  323.     DWORD ImageBase;
  324.     DWORD SizeOfImage;
  325.  
  326.     DWORD NumberOfSections;
  327.     PIMAGE_SECTION_HEADER Sections;
  328.  
  329.     DWORD ExportedNamesSize;
  330.     LPSTR ExportedNames;
  331.  
  332.     DWORD NumberOfFunctionTableEntries;
  333.     PIMAGE_FUNCTION_ENTRY FunctionTableEntries;
  334.     DWORD LowestFunctionStartingAddress;
  335.     DWORD HighestFunctionEndingAddress;
  336.  
  337.     DWORD NumberOfFpoTableEntries;
  338.     PFPO_DATA FpoTableEntries;
  339.  
  340.     DWORD SizeOfCoffSymbols;
  341.     PIMAGE_COFF_SYMBOLS_HEADER CoffSymbols;
  342.  
  343.     DWORD SizeOfCodeViewSymbols;
  344.     PVOID CodeViewSymbols;
  345.  
  346.     LPSTR ImageFilePath;
  347.     LPSTR ImageFileName;
  348.     LPSTR DebugFilePath;
  349.  
  350.     DWORD TimeDateStamp;
  351.  
  352.     BOOL  RomImage;
  353.     PIMAGE_DEBUG_DIRECTORY DebugDirectory;
  354.     DWORD NumberOfDebugDirectories;
  355.  
  356.     DWORD Reserved[ 3 ];
  357.  
  358. } IMAGE_DEBUG_INFORMATION, *PIMAGE_DEBUG_INFORMATION;
  359.  
  360.  
  361. PIMAGE_DEBUG_INFORMATION
  362. IMAGEAPI
  363. MapDebugInformation (
  364.     HANDLE FileHandle,
  365.     LPSTR FileName,
  366.     LPSTR SymbolPath,
  367.     DWORD ImageBase
  368.     );
  369.  
  370. BOOL
  371. IMAGEAPI
  372. UnmapDebugInformation(
  373.     PIMAGE_DEBUG_INFORMATION DebugInfo
  374.     );
  375.  
  376. HANDLE
  377. IMAGEAPI
  378. FindExecutableImage(
  379.     LPSTR FileName,
  380.     LPSTR SymbolPath,
  381.     LPSTR ImageFilePath
  382.     );
  383.  
  384. BOOL
  385. IMAGEAPI
  386. SearchTreeForFile(
  387.     LPSTR RootPath,
  388.     LPSTR InputPathName,
  389.     LPSTR OutputPathBuffer
  390.     );
  391.  
  392. BOOL
  393. IMAGEAPI
  394. MakeSureDirectoryPathExists(
  395.     LPCSTR DirPath
  396.     );
  397.  
  398. //
  399. // UnDecorateSymbolName Flags
  400. //
  401.  
  402. #define UNDNAME_COMPLETE                 (0x0000)  // Enable full undecoration
  403. #define UNDNAME_NO_LEADING_UNDERSCORES   (0x0001)  // Remove leading underscores from MS extended keywords
  404. #define UNDNAME_NO_MS_KEYWORDS           (0x0002)  // Disable expansion of MS extended keywords
  405. #define UNDNAME_NO_FUNCTION_RETURNS      (0x0004)  // Disable expansion of return type for primary declaration
  406. #define UNDNAME_NO_ALLOCATION_MODEL      (0x0008)  // Disable expansion of the declaration model
  407. #define UNDNAME_NO_ALLOCATION_LANGUAGE   (0x0010)  // Disable expansion of the declaration language specifier
  408. #define UNDNAME_NO_MS_THISTYPE           (0x0020)  // NYI Disable expansion of MS keywords on the 'this' type for primary declaration
  409. #define UNDNAME_NO_CV_THISTYPE           (0x0040)  // NYI Disable expansion of CV modifiers on the 'this' type for primary declaration
  410. #define UNDNAME_NO_THISTYPE              (0x0060)  // Disable all modifiers on the 'this' type
  411. #define UNDNAME_NO_ACCESS_SPECIFIERS     (0x0080)  // Disable expansion of access specifiers for members
  412. #define UNDNAME_NO_THROW_SIGNATURES      (0x0100)  // Disable expansion of 'throw-signatures' for functions and pointers to functions
  413. #define UNDNAME_NO_MEMBER_TYPE           (0x0200)  // Disable expansion of 'static' or 'virtual'ness of members
  414. #define UNDNAME_NO_RETURN_UDT_MODEL      (0x0400)  // Disable expansion of MS model for UDT returns
  415. #define UNDNAME_32_BIT_DECODE            (0x0800)  // Undecorate 32-bit decorated names
  416. #define UNDNAME_NAME_ONLY                (0x1000)  // Crack only the name for primary declaration;
  417.                                                                                                    //  return just [scope::]name.  Does expand template params
  418. #define UNDNAME_NO_ARGUMENTS             (0x2000)  // Don't undecorate arguments to function
  419. #define UNDNAME_NO_SPECIAL_SYMS          (0x4000)  // Don't undecorate special names (v-table, vcall, vector xxx, metatype, etc)
  420.  
  421. DWORD
  422. IMAGEAPI
  423. WINAPI
  424. UnDecorateSymbolName(
  425.     LPCSTR   DecoratedName,         // Name to undecorate
  426.     LPSTR    UnDecoratedName,       // If NULL, it will be allocated
  427.     DWORD    UndecoratedLength,     // The maximym length
  428.     DWORD    Flags                  // See above.
  429.     );
  430.  
  431. //
  432. // StackWalking API
  433. //
  434.  
  435. typedef enum {
  436.     AddrMode1616,
  437.     AddrMode1632,
  438.     AddrModeReal,
  439.     AddrModeFlat
  440. } ADDRESS_MODE;
  441.  
  442. typedef struct _tagADDRESS {
  443.     DWORD         Offset;
  444.     WORD          Segment;
  445.     ADDRESS_MODE  Mode;
  446. } ADDRESS, *LPADDRESS;
  447.  
  448.  
  449. //
  450. // This structure is included in the STACKFRAME structure,
  451. // and is used to trace through usermode callbacks in a thread's
  452. // kernel stack.  The values must be copied by the kernel debugger
  453. // from the DBGKD_GET_VERSION and WAIT_STATE_CHANGE packets.
  454. //
  455. typedef struct _KDHELP {
  456.  
  457.     //
  458.     // address of kernel thread object, as provided in the
  459.     // WAIT_STATE_CHANGE packet.
  460.     //
  461.     DWORD   Thread;
  462.  
  463.     //
  464.     // offset in thread object to pointer to the current callback frame
  465.     // in kernel stack.
  466.     //
  467.     DWORD   ThCallbackStack;
  468.  
  469.     //
  470.     // offsets to values in frame:
  471.     //
  472.     // address of next callback frame
  473.     DWORD   NextCallback;
  474.  
  475.     // address of saved frame pointer (if applicable)
  476.     DWORD   FramePointer;
  477.  
  478.     //
  479.     // Address of the kernel function that calls out to user mode
  480.     //
  481.     DWORD   KiCallUserMode;
  482.  
  483.     //
  484.     // Address of the user mode dispatcher function
  485.     //
  486.     DWORD   KeUserCallbackDispatcher;
  487.  
  488. } KDHELP, *PKDHELP;
  489.  
  490.  
  491. typedef struct _tagSTACKFRAME {
  492.     ADDRESS     AddrPC;               // program counter
  493.     ADDRESS     AddrReturn;           // return address
  494.     ADDRESS     AddrFrame;            // frame pointer
  495.     ADDRESS     AddrStack;            // stack pointer
  496.     LPVOID      FuncTableEntry;       // pointer to pdata/fpo or NULL
  497.     DWORD       Params[4];            // possible arguments to the function
  498.     BOOL        Far;                  // WOW far call
  499.     BOOL        Virtual;              // is this a virtual frame?
  500.     DWORD       Reserved[3];          // used internally by StackWalk api
  501.     KDHELP      KdHelp;
  502. } STACKFRAME, *LPSTACKFRAME;
  503.  
  504. typedef
  505. BOOL
  506. (__stdcall *PREAD_PROCESS_MEMORY_ROUTINE)(
  507.     HANDLE  hProcess,
  508.     LPCVOID lpBaseAddress,
  509.     LPVOID  lpBuffer,
  510.     DWORD   nSize,
  511.     LPDWORD lpNumberOfBytesRead
  512.     );
  513.  
  514. typedef
  515. LPVOID
  516. (__stdcall *PFUNCTION_TABLE_ACCESS_ROUTINE)(
  517.     HANDLE  hProcess,
  518.     DWORD   AddrBase
  519.     );
  520.  
  521. typedef
  522. DWORD
  523. (__stdcall *PGET_MODULE_BASE_ROUTINE)(
  524.     HANDLE  hProcess,
  525.     DWORD   ReturnAddress
  526.     );
  527.  
  528.  
  529. typedef
  530. DWORD
  531. (__stdcall *PTRANSLATE_ADDRESS_ROUTINE)(
  532.     HANDLE    hProcess,
  533.     HANDLE    hThread,
  534.     LPADDRESS lpaddr
  535.     );
  536.  
  537. BOOL
  538. IMAGEAPI
  539. StackWalk(
  540.     DWORD                             MachineType,
  541.     HANDLE                            hProcess,
  542.     HANDLE                            hThread,
  543.     LPSTACKFRAME                      StackFrame,
  544.     LPVOID                            ContextRecord,
  545.     PREAD_PROCESS_MEMORY_ROUTINE      ReadMemoryRoutine,
  546.     PFUNCTION_TABLE_ACCESS_ROUTINE    FunctionTableAccessRoutine,
  547.     PGET_MODULE_BASE_ROUTINE          GetModuleBaseRoutine,
  548.     PTRANSLATE_ADDRESS_ROUTINE        TranslateAddress
  549.     );
  550.  
  551. #define API_VERSION_NUMBER 5
  552.  
  553. typedef struct API_VERSION {
  554.     USHORT  MajorVersion;
  555.     USHORT  MinorVersion;
  556.     USHORT  Revision;
  557.     USHORT  Reserved;
  558. } API_VERSION, *LPAPI_VERSION;
  559.  
  560. LPAPI_VERSION
  561. IMAGEAPI
  562. ImagehlpApiVersion(
  563.     VOID
  564.     );
  565.  
  566. LPAPI_VERSION
  567. IMAGEAPI
  568. ImagehlpApiVersionEx(
  569.     LPAPI_VERSION AppVersion
  570.     );
  571.  
  572. DWORD
  573. IMAGEAPI
  574. GetTimestampForLoadedLibrary(
  575.     HMODULE Module
  576.     );
  577.  
  578. BOOL
  579. IMAGEAPI
  580. RemovePrivateCvSymbolic(
  581.     PCHAR   DebugData,
  582.     PCHAR * NewDebugData,
  583.     ULONG * NewDebugSize
  584.     );
  585.  
  586. VOID
  587. IMAGEAPI
  588. RemoveRelocations(
  589.     PCHAR ImageName
  590.     );
  591.  
  592. //
  593. // typedefs for function pointers
  594. //
  595. typedef BOOL
  596. (CALLBACK *PSYM_ENUMMODULES_CALLBACK)(
  597.     LPSTR ModuleName,
  598.     ULONG BaseOfDll,
  599.     PVOID UserContext
  600.     );
  601.  
  602. typedef BOOL
  603. (CALLBACK *PSYM_ENUMSYMBOLS_CALLBACK)(
  604.     LPSTR SymbolName,
  605.     ULONG SymbolAddress,
  606.     ULONG SymbolSize,
  607.     PVOID UserContext
  608.     );
  609.  
  610. typedef BOOL
  611. (CALLBACK *PENUMLOADED_MODULES_CALLBACK)(
  612.     LPSTR ModuleName,
  613.     ULONG ModuleBase,
  614.     ULONG ModuleSize,
  615.     PVOID UserContext
  616.     );
  617.  
  618. typedef BOOL
  619. (CALLBACK *PSYMBOL_REGISTERED_CALLBACK)(
  620.     HANDLE  hProcess,
  621.     ULONG   ActionCode,
  622.     PVOID   CallbackData,
  623.     PVOID   UserContext
  624.     );
  625.  
  626. //
  627. // symbol flags
  628. //
  629. #define SYMF_OMAP_GENERATED   0x00000001
  630. #define SYMF_OMAP_MODIFIED    0x00000002
  631.  
  632. //
  633. // symbol type enumeration
  634. //
  635. typedef enum {
  636.     SymNone,
  637.     SymCoff,
  638.     SymCv,
  639.     SymPdb,
  640.     SymExport,
  641.     SymDeferred,
  642.     SymSym                  // .sym file
  643. } SYM_TYPE;
  644.  
  645. //
  646. // symbol data structure
  647. //
  648. typedef struct _IMAGEHLP_SYMBOL {
  649.     DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_SYMBOL)
  650.     DWORD                       Address;                // virtual address including dll base address
  651.     DWORD                       Size;                   // estimated size of symbol, can be zero
  652.     DWORD                       Flags;                  // info about the symbols, see the SYMF defines
  653.     DWORD                       MaxNameLength;          // maximum size of symbol name in 'Name'
  654.     CHAR                        Name[1];                // symbol name (null terminated string)
  655. } IMAGEHLP_SYMBOL, *PIMAGEHLP_SYMBOL;
  656.  
  657. //
  658. // module data structure
  659. //
  660. typedef struct _IMAGEHLP_MODULE {
  661.     DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_MODULE)
  662.     DWORD                       BaseOfImage;            // base load address of module
  663.     DWORD                       ImageSize;              // virtual size of the loaded module
  664.     DWORD                       TimeDateStamp;          // date/time stamp from pe header
  665.     DWORD                       CheckSum;               // checksum from the pe header
  666.     DWORD                       NumSyms;                // number of symbols in the symbol table
  667.     SYM_TYPE                    SymType;                // type of symbols loaded
  668.     CHAR                        ModuleName[32];         // module name
  669.     CHAR                        ImageName[256];         // image name
  670.     CHAR                        LoadedImageName[256];   // symbol file name
  671. } IMAGEHLP_MODULE, *PIMAGEHLP_MODULE;
  672.  
  673. //
  674. // data structures used for registered symbol callbacks
  675. //
  676.  
  677. #define CBA_DEFERRED_SYMBOL_LOAD_START          0x00000001
  678. #define CBA_DEFERRED_SYMBOL_LOAD_COMPLETE       0x00000002
  679. #define CBA_DEFERRED_SYMBOL_LOAD_FAILURE        0x00000003
  680. #define CBA_SYMBOLS_UNLOADED                    0x00000004
  681. #define CBA_DUPLICATE_SYMBOL                    0x00000005
  682.  
  683. typedef struct _IMAGEHLP_DEFERRED_SYMBOL_LOAD {
  684.     DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_DEFERRED_SYMBOL_LOAD)
  685.     DWORD                       BaseOfImage;            // base load address of module
  686.     DWORD                       CheckSum;               // checksum from the pe header
  687.     DWORD                       TimeDateStamp;          // date/time stamp from pe header
  688.     CHAR                        FileName[MAX_PATH];     // symbols file or image name
  689. } IMAGEHLP_DEFERRED_SYMBOL_LOAD, *PIMAGEHLP_DEFERRED_SYMBOL_LOAD;
  690.  
  691. typedef struct _IMAGEHLP_DUPLICATE_SYMBOL {
  692.     DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_DUPLICATE_SYMBOL)
  693.     DWORD                       NumberOfDups;           // number of duplicates in the Symbol array
  694.     PIMAGEHLP_SYMBOL            Symbol;                 // array of duplicate symbols
  695.     ULONG                       SelectedSymbol;         // symbol selected (-1 to start)
  696. } IMAGEHLP_DUPLICATE_SYMBOL, *PIMAGEHLP_DUPLICATE_SYMBOL;
  697.  
  698.  
  699. //
  700. // options that are set/returned by SymSetOptions() & SymGetOptions()
  701. // these are used as a mask
  702. //
  703. #define SYMOPT_CASE_INSENSITIVE  0x00000001
  704. #define SYMOPT_UNDNAME           0x00000002
  705. #define SYMOPT_DEFERRED_LOADS    0x00000004
  706. #define SYMOPT_NO_CPP            0x00000008
  707.  
  708.  
  709. DWORD
  710. IMAGEAPI
  711. SymSetOptions(
  712.     IN DWORD   SymOptions
  713.     );
  714.  
  715. DWORD
  716. IMAGEAPI
  717. SymGetOptions(
  718.     VOID
  719.     );
  720.  
  721. BOOL
  722. IMAGEAPI
  723. SymCleanup(
  724.     IN HANDLE hProcess
  725.     );
  726.  
  727. BOOL
  728. IMAGEAPI
  729. SymEnumerateModules(
  730.     IN HANDLE                       hProcess,
  731.     IN PSYM_ENUMMODULES_CALLBACK    EnumModulesCallback,
  732.     IN PVOID                        UserContext
  733.     );
  734.  
  735. BOOL
  736. IMAGEAPI
  737. SymEnumerateSymbols(
  738.     IN HANDLE                       hProcess,
  739.     IN DWORD                        BaseOfDll,
  740.     IN PSYM_ENUMSYMBOLS_CALLBACK    EnumSymbolsCallback,
  741.     IN PVOID                        UserContext
  742.     );
  743.  
  744. BOOL
  745. IMAGEAPI
  746. EnumerateLoadedModules(
  747.     IN HANDLE                           hProcess,
  748.     IN PENUMLOADED_MODULES_CALLBACK     EnumLoadedModulesCallback,
  749.     IN PVOID                            UserContext
  750.     );
  751.  
  752. LPVOID
  753. IMAGEAPI
  754. SymFunctionTableAccess(
  755.     HANDLE  hProcess,
  756.     DWORD   AddrBase
  757.     );
  758.  
  759. BOOL
  760. IMAGEAPI
  761. SymGetModuleInfo(
  762.     IN  HANDLE              hProcess,
  763.     IN  DWORD               dwAddr,
  764.     OUT PIMAGEHLP_MODULE    ModuleInfo
  765.     );
  766.  
  767. DWORD
  768. IMAGEAPI
  769. SymGetModuleBase(
  770.     IN  HANDLE              hProcess,
  771.     IN  DWORD               dwAddr
  772.     );
  773.  
  774. BOOL
  775. IMAGEAPI
  776. SymGetSymFromAddr(
  777.     IN  HANDLE              hProcess,
  778.     IN  DWORD               dwAddr,
  779.     OUT PDWORD              pdwDisplacement,
  780.     OUT PIMAGEHLP_SYMBOL    Symbol
  781.     );
  782.  
  783. BOOL
  784. IMAGEAPI
  785. SymGetSymFromName(
  786.     IN  HANDLE              hProcess,
  787.     IN  LPSTR               Name,
  788.     OUT PIMAGEHLP_SYMBOL    Symbol
  789.     );
  790.  
  791. BOOL
  792. IMAGEAPI
  793. SymGetSymNext(
  794.     IN     HANDLE              hProcess,
  795.     IN OUT PIMAGEHLP_SYMBOL    Symbol
  796.     );
  797.  
  798. BOOL
  799. IMAGEAPI
  800. SymGetSymPrev(
  801.     IN     HANDLE              hProcess,
  802.     IN OUT PIMAGEHLP_SYMBOL    Symbol
  803.     );
  804.  
  805. BOOL
  806. IMAGEAPI
  807. SymInitialize(
  808.     IN HANDLE   hProcess,
  809.     IN LPSTR    UserSearchPath,
  810.     IN BOOL     fInvadeProcess
  811.     );
  812.  
  813. BOOL
  814. IMAGEAPI
  815. SymGetSearchPath(
  816.     IN  HANDLE          hProcess,
  817.     OUT LPSTR           SearchPath,
  818.     IN  DWORD           SearchPathLength
  819.     );
  820.  
  821. BOOL
  822. IMAGEAPI
  823. SymSetSearchPath(
  824.     IN HANDLE           hProcess,
  825.     IN LPSTR            SearchPath
  826.     );
  827.  
  828. BOOL
  829. IMAGEAPI
  830. SymLoadModule(
  831.     IN  HANDLE          hProcess,
  832.     IN  HANDLE          hFile,
  833.     IN  PSTR            ImageName,
  834.     IN  PSTR            ModuleName,
  835.     IN  DWORD           BaseOfDll,
  836.     IN  DWORD           SizeOfDll
  837.     );
  838.  
  839. BOOL
  840. IMAGEAPI
  841. SymUnloadModule(
  842.     IN  HANDLE          hProcess,
  843.     IN  DWORD           BaseOfDll
  844.     );
  845.  
  846. BOOL
  847. IMAGEAPI
  848. SymUnDName(
  849.     IN  PIMAGEHLP_SYMBOL sym,               // Symbol to undecorate
  850.     OUT LPSTR            UnDecName,         // Buffer to store undecorated name in
  851.     IN  DWORD            UnDecNameLength    // Size of the buffer
  852.     );
  853.  
  854. BOOL
  855. IMAGEAPI
  856. SymRegisterCallback(
  857.     IN HANDLE                       hProcess,
  858.     IN PSYMBOL_REGISTERED_CALLBACK  CallbackFunction,
  859.     IN PVOID                        UserContext
  860.     );
  861.  
  862. // Image Integrity API's
  863.  
  864. #define CERT_PE_IMAGE_DIGEST_DEBUG_INFO         0x01
  865. #define CERT_PE_IMAGE_DIGEST_RESOURCES          0x02
  866. #define CERT_PE_IMAGE_DIGEST_ALL_IMPORT_INFO    0x04
  867.  
  868. #define CERT_SECTION_TYPE_ANY                   0xFF      // Any Certificate type
  869.  
  870. typedef PVOID DIGEST_HANDLE;
  871.  
  872. typedef BOOL (WINAPI *DIGEST_FUNCTION) (DIGEST_HANDLE refdata, PBYTE pData, DWORD dwLength);
  873.  
  874. BOOL
  875. IMAGEAPI
  876. ImageGetDigestStream(
  877.     IN      HANDLE  FileHandle,
  878.     IN      DWORD   DigestLevel,
  879.     IN      DIGEST_FUNCTION DigestFunction,
  880.     IN      DIGEST_HANDLE   DigestHandle
  881.     );
  882.  
  883. BOOL
  884. IMAGEAPI
  885. ImageAddCertificate(
  886.     IN      HANDLE  FileHandle,
  887.     IN      LPWIN_CERTIFICATE   Certificate,
  888.     OUT     PDWORD  Index
  889.     );
  890.  
  891. BOOL
  892. IMAGEAPI
  893. ImageRemoveCertificate(
  894.     IN      HANDLE   FileHandle,
  895.     IN      DWORD    Index
  896.     );
  897.  
  898. BOOL
  899. IMAGEAPI
  900. ImageEnumerateCertificates(
  901.     IN      HANDLE  FileHandle,
  902.     IN      WORD    TypeFilter,
  903.     OUT     PDWORD  CertificateCount,
  904.     IN OUT  PDWORD  Indices OPTIONAL,
  905.     IN OUT  DWORD   IndexCount  OPTIONAL
  906.     );
  907.  
  908. BOOL
  909. IMAGEAPI
  910. ImageGetCertificateData(
  911.     IN      HANDLE  FileHandle,
  912.     IN      DWORD   CertificateIndex,
  913.     OUT     LPWIN_CERTIFICATE Certificate,
  914.     IN OUT  PDWORD  RequiredLength
  915.     );
  916.  
  917. BOOL
  918. IMAGEAPI
  919. ImageGetCertificateHeader(
  920.     IN      HANDLE  FileHandle,
  921.     IN      DWORD   CertificateIndex,
  922.     IN OUT  LPWIN_CERTIFICATE Certificateheader
  923.     );
  924.  
  925. #ifdef __BORLANDC__
  926. #pragma option -b.
  927.   #include <poppack.h>
  928. #pragma option -b
  929. #endif
  930.  
  931. #ifdef __cplusplus
  932. }
  933. #endif
  934.  
  935. #pragma option -b.
  936. #endif  // _IMAGEHLP_
  937.