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