/*++

Copyright (c) 1998-1999 Microsoft Corporation
All rights reserved.

Module Name:

    dbgimage.hxx

Abstract:

    Debug imagehlp header file.

Author:

    Steve Kiraly (SteveKi)  17-May-1998

Revision History:

--*/
#ifndef _DBGIMAGE_HXX_
#define _DBGIMAGE_HXX_

DEBUG_NS_BEGIN

class TDebugImagehlp {

public:

    enum EDecoration
    {
        kDecorateName,
        kUnDecorateName,
    };

    TDebugImagehlp::
    TDebugImagehlp(
        VOID
        );

    TDebugImagehlp::
    ~TDebugImagehlp(
        VOID
        );

    BOOL
    TDebugImagehlp::
    bValid(
        VOID
        );

    BOOL
    TDebugImagehlp::
    bCaptureBacktrace(
        IN      UINT    cFramesToSkipped,
        IN      ULONG   uMaxBacktraceDepth,
            OUT VOID    **apvBacktrace,
            OUT ULONG   *pulHash
        );

    BOOL
    TDebugImagehlp::
    ResolveAddressToSymbol(
        IN PVOID        pvAddress,
        IN LPTSTR       pszName,
        IN UINT         cchNameLength,
        IN EDecoration  eDecorateType
        );

    BOOL
    TDebugImagehlp::
    GetSymbolPath(
        IN TDebugString &strSymbolPath
        ) const;

    BOOL
    TDebugImagehlp::
    SetSymbolPath(
        IN LPCTSTR pszSymbolPath
        );

private:

    enum Constants
    {
        kMaxSymbolNameLength = 512,
    };

    typedef
    BOOL
    (WINAPI *pfSymGetModuleInfo)(
        IN  HANDLE                          hProcess,
        IN  DWORD_PTR                       dwAddr,
        OUT PIMAGEHLP_MODULE                ModuleInfo
        );

    typedef
    LPVOID
    (WINAPI *pfSymFunctionTableAccess)(
        IN  HANDLE                          hProcess,
        IN  DWORD_PTR                       AddrBase
        );

    typedef
    DWORD_PTR
    (WINAPI *pfSymGetModuleBase)(
        IN  HANDLE                          hProcess,
        IN  DWORD_PTR                       dwAddr
        );

    typedef
    BOOL
    (WINAPI *pfStackWalk)(
        IN DWORD                             MachineType,
        IN HANDLE                            hProcess,
        IN HANDLE                            hThread,
        IN LPSTACKFRAME                      StackFrame,
        IN LPVOID                            ContextRecord,
        IN PREAD_PROCESS_MEMORY_ROUTINE      ReadMemoryRoutine,
        IN PFUNCTION_TABLE_ACCESS_ROUTINE    FunctionTableAccessRoutine,
        IN PGET_MODULE_BASE_ROUTINE          GetModuleBaseRoutine,
        IN PTRANSLATE_ADDRESS_ROUTINE        TranslateAddress
        );

    typedef
    BOOL
    (WINAPI *pfSymInitialize)(
        IN HANDLE                           hProcess,
        IN LPSTR                            UserSearchPath,
        IN BOOL                             fInvadeProcess
        );

    typedef
    DWORD
    (WINAPI *pfSymSetOptions)(
        IN DWORD                            SymOptions
        );

    typedef
    BOOL
    (WINAPI *pfSymGetSymFromAddr)(
        IN  HANDLE                          hProcess,
        IN  DWORD_PTR                       dwAddr,
        OUT PDWORD                          pdwDisplacement,
        OUT PIMAGEHLP_SYMBOL                Symbol
        );

    typedef
    BOOL
    (WINAPI *pfSymUnDName)(
        IN  PIMAGEHLP_SYMBOL                sym,
        OUT LPSTR                           UnDecName,
        IN  DWORD                           UnDecNameLength
        );

    typedef
    BOOL
    (WINAPI *pfSymGetSearchPath)(
        IN  HANDLE                          hProcess,
        OUT PSTR                            SearchPath,
        IN  DWORD                           SearchPathLength
        );

    typedef
    BOOL
    (WINAPI *pfSymSetSearchPath)(
        IN HANDLE                           hProcess,
        IN PSTR                             SearchPath
        );

    //
    // Copying and assignment are not defined.
    //
    TDebugImagehlp::
    TDebugImagehlp(
        const TDebugImagehlp &rhs
        );

    const TDebugImagehlp &
    TDebugImagehlp::
    operator=(
        const TDebugImagehlp &rhs
        );

    pfSymGetModuleInfo          _pfSymGetModuleInfo;
    pfSymFunctionTableAccess    _pfSymFunctionTableAccess;
    pfSymGetModuleBase          _pfSymGetModuleBase;
    pfStackWalk                 _pfStackWalk;
    pfSymInitialize             _pfSymInitialize;
    pfSymSetOptions             _pfSymSetOptions;
    pfSymGetSymFromAddr         _pfSymGetSymFromAddr;
    pfSymUnDName                _pfSymUnDName;
    pfSymGetSearchPath          _pfSymGetSearchPath;
    pfSymSetSearchPath          _pfSymSetSearchPath;

    TDebugLibrary               _ImageHlp;
    BOOL                        _bValid;
    LPTSTR                      _pszSymbolFormatSpecifier;

};

DEBUG_NS_END

#endif