3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync/* $Id$ */
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync/** @file
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * IPRT - Internal Header for RTDbgMod and the associated interpreters.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync */
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync/*
c58f1213e628a545081c70e26c6b67a841cff880vboxsync * Copyright (C) 2008-2012 Oracle Corporation
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync *
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * available from http://www.virtualbox.org. This file is free software;
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * you can redistribute it and/or modify it under the terms of the GNU
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * General Public License (GPL) as published by the Free Software
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync *
0d12c7f9423f2745f8e282523d0930f91bff03b3vboxsync * The contents of this file may alternatively be used under the terms
0d12c7f9423f2745f8e282523d0930f91bff03b3vboxsync * of the Common Development and Distribution License Version 1.0
0d12c7f9423f2745f8e282523d0930f91bff03b3vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
0d12c7f9423f2745f8e282523d0930f91bff03b3vboxsync * VirtualBox OSE distribution, in which case the provisions of the
0d12c7f9423f2745f8e282523d0930f91bff03b3vboxsync * CDDL are applicable instead of those of the GPL.
0d12c7f9423f2745f8e282523d0930f91bff03b3vboxsync *
0d12c7f9423f2745f8e282523d0930f91bff03b3vboxsync * You may elect to license modified versions of this file under the
0d12c7f9423f2745f8e282523d0930f91bff03b3vboxsync * terms and conditions of either the GPL or the CDDL or both.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync */
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync#ifndef ___internal_dbgmod_h
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync#define ___internal_dbgmod_h
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync#include <iprt/types.h>
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync#include <iprt/critsect.h>
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync#include <iprt/ldr.h> /* for PFNRTLDRENUMDBG */
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync#include "internal/magics.h"
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsyncRT_C_DECLS_BEGIN
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
88acfa6629a7976c0583c1712d2b5b22a87a5121vboxsync/** @addtogroup grp_rt_dbgmod
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * @internal
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * @{
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync */
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync/** Pointer to the internal module structure. */
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsynctypedef struct RTDBGMODINT *PRTDBGMODINT;
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync/**
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * Virtual method table for executable image interpreters.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync */
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsynctypedef struct RTDBGMODVTIMG
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync{
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync /** Magic number (RTDBGMODVTIMG_MAGIC). */
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync uint32_t u32Magic;
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync /** Reserved. */
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync uint32_t fReserved;
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync /** The name of the interpreter. */
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync const char *pszName;
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync /**
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * Try open the image.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync *
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * This combines probing and opening.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync *
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @returns IPRT status code. No informational returns defined.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync *
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * @param pMod Pointer to the module that is being opened.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync *
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * The RTDBGMOD::pszDbgFile member will point to
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * the filename of any debug info we're aware of
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * on input. Also, or alternatively, it is expected
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * that the interpreter will look for debug info in
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * the executable image file when present and that it
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * may ask the image interpreter for this when it's
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * around.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync *
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * Upon successful return the method is expected to
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync * initialize pImgOps and pvImgPriv.
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync * @param enmArch The desired architecture.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync */
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync DECLCALLBACKMEMBER(int, pfnTryOpen)(PRTDBGMODINT pMod, RTLDRARCH enmArch);
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync /**
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * Close the interpreter, freeing all associated resources.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync *
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * The caller sets the pDbgOps and pvDbgPriv RTDBGMOD members
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * to NULL upon return.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync *
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * @param pMod Pointer to the module structure.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync */
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync DECLCALLBACKMEMBER(int, pfnClose)(PRTDBGMODINT pMod);
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync /**
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync * Enumerate the debug info contained in the executable image.
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync *
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync * Identical to RTLdrEnumDbgInfo.
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync *
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync * @returns IPRT status code or whatever pfnCallback returns.
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync *
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param pMod Pointer to the module structure.
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync * @param pfnCallback The callback function. Ignore the module
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync * handle argument!
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync * @param pvUser The user argument.
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync */
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync DECLCALLBACKMEMBER(int, pfnEnumDbgInfo)(PRTDBGMODINT pMod, PFNRTLDRENUMDBG pfnCallback, void *pvUser);
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync
d3dea25ec07f6546715fe3af943ea863294b392evboxsync /**
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * Enumerate the segments in the executable image.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync *
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * Identical to RTLdrEnumSegments.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync *
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * @returns IPRT status code or whatever pfnCallback returns.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync *
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * @param pMod Pointer to the module structure.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * @param pfnCallback The callback function. Ignore the module
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * handle argument!
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * @param pvUser The user argument.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync */
d3dea25ec07f6546715fe3af943ea863294b392evboxsync DECLCALLBACKMEMBER(int, pfnEnumSegments)(PRTDBGMODINT pMod, PFNRTLDRENUMSEGS pfnCallback, void *pvUser);
d3dea25ec07f6546715fe3af943ea863294b392evboxsync
abe1b07126bb9f5644b2ad8424534c2d1e97a66cvboxsync /**
abe1b07126bb9f5644b2ad8424534c2d1e97a66cvboxsync * Enumerates the symbols exported by the module.
abe1b07126bb9f5644b2ad8424534c2d1e97a66cvboxsync *
abe1b07126bb9f5644b2ad8424534c2d1e97a66cvboxsync * @returns iprt status code, which might have been returned by pfnCallback.
abe1b07126bb9f5644b2ad8424534c2d1e97a66cvboxsync * @param pMod Pointer to the module structure.
abe1b07126bb9f5644b2ad8424534c2d1e97a66cvboxsync * @param fFlags Flags indicating what to return and such.
abe1b07126bb9f5644b2ad8424534c2d1e97a66cvboxsync * @param BaseAddress The image base addressto use when calculating the
abe1b07126bb9f5644b2ad8424534c2d1e97a66cvboxsync * symbol values.
abe1b07126bb9f5644b2ad8424534c2d1e97a66cvboxsync * @param pfnCallback The callback function which each symbol is to be fed
abe1b07126bb9f5644b2ad8424534c2d1e97a66cvboxsync * to.
abe1b07126bb9f5644b2ad8424534c2d1e97a66cvboxsync * @param pvUser User argument to pass to the enumerator.
abe1b07126bb9f5644b2ad8424534c2d1e97a66cvboxsync */
abe1b07126bb9f5644b2ad8424534c2d1e97a66cvboxsync DECLCALLBACKMEMBER(int, pfnEnumSymbols)(PRTDBGMODINT pMod, uint32_t fFlags, RTLDRADDR BaseAddress,
abe1b07126bb9f5644b2ad8424534c2d1e97a66cvboxsync PFNRTLDRENUMSYMS pfnCallback, void *pvUser);
abe1b07126bb9f5644b2ad8424534c2d1e97a66cvboxsync
d3dea25ec07f6546715fe3af943ea863294b392evboxsync /**
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * Gets the size of the loaded image.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync *
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * Identical to RTLdrSize.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync *
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * @returns The size in bytes, RTUINTPTR_MAX on failure.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync *
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * @param pMod Pointer to the module structure.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync */
d3dea25ec07f6546715fe3af943ea863294b392evboxsync DECLCALLBACKMEMBER(RTUINTPTR, pfnImageSize)(PRTDBGMODINT pMod);
d3dea25ec07f6546715fe3af943ea863294b392evboxsync
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync /**
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * Converts a link address to a segment:offset address (RVA included).
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync *
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @returns IPRT status code.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync *
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @param pMod Pointer to the module structure.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @param LinkAddress The link address to convert.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @param piSeg The segment index.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @param poffSeg Where to return the segment offset.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync */
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync DECLCALLBACKMEMBER(int, pfnLinkAddressToSegOffset)(PRTDBGMODINT pMod, RTLDRADDR LinkAddress,
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync PRTDBGSEGIDX piSeg, PRTLDRADDR poffSeg);
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync /**
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync * Converts an image relative virtual address to a segment:offset.
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync *
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync * @returns IPRT status code.
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync *
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync * @param pMod Pointer to the loader module structure.
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync * @param Rva The RVA to convert.
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync * @param piSeg The segment index.
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync * @param poffSeg Where to return the segment offset.
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync */
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync DECLCALLBACKMEMBER(int, pfnRvaToSegOffset)(PRTDBGMODINT pMod, RTLDRADDR Rva, uint32_t *piSeg, PRTLDRADDR poffSeg);
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /**
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * Creates a read-only mapping of a part of the image file.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync *
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @returns IPRT status code and *ppvMap set on success.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync *
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param pMod Pointer to the module structure.
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync * @param iDbgInfo The debug info ordinal number if the request
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync * corresponds exactly to a debug info part from
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync * pfnEnumDbgInfo. Otherwise, pass UINT32_MAX.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param off The offset into the image file.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param cb The number of bytes to map.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param ppvMap Where to return the mapping address on success.
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync *
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync * @remarks Fixups will only be applied if @a iDbgInfo is specified.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync */
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync DECLCALLBACKMEMBER(int, pfnMapPart)(PRTDBGMODINT pMod, uint32_t iDbgInfo, RTFOFF off, size_t cb, void const **ppvMap);
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /**
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * Unmaps memory previously mapped by pfnMapPart.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync *
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @returns IPRT status code, *ppvMap set to NULL on success.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync *
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param pMod Pointer to the module structure.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param cb The size of the mapping.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param ppvMap The mapping address on input, NULL on
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * successful return.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync */
5b0a093ca572a855886faa6747ad46df859dd041vboxsync DECLCALLBACKMEMBER(int, pfnUnmapPart)(PRTDBGMODINT pMod, size_t cb, void const **ppvMap);
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync /**
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync * Reads data from the image file.
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync *
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync * @returns IPRT status code, *ppvMap set to NULL on success.
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync *
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync * @param pMod Pointer to the module structure.
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync * @param iDbgInfoHint The debug info ordinal number hint, pass UINT32_MAX
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync * if not know or sure.
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync * @param off The offset into the image file.
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync * @param pvBuf The buffer to read into.
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync * @param cb The number of bytes to read.
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync */
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync DECLCALLBACKMEMBER(int, pfnReadAt)(PRTDBGMODINT pMod, uint32_t iDbgInfoHint, RTFOFF off, void *pvBuf, size_t cb);
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync /**
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync * Gets the image format.
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync *
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync * @returns Valid image format on success, RTLDRFMT_INVALID if not supported.
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync * @param pMod Pointer to the module structure.
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync */
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync DECLCALLBACKMEMBER(RTLDRFMT, pfnGetFormat)(PRTDBGMODINT pMod);
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync /**
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync * Gets the image architecture.
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync *
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync * @returns Valid image architecutre on success, RTLDRARCH_WHATEVER if not
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync * supported.
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync * @param pMod Pointer to the module structure.
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync */
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync DECLCALLBACKMEMBER(RTLDRARCH, pfnGetArch)(PRTDBGMODINT pMod);
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync /**
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync * Generic method for querying image properties.
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync *
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync * @returns IPRT status code.
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync * @param pMod Pointer to the module structure.
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync * @param enmLdrProp The property to query.
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync * @param pvBuf Pointer to the return buffer.
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync * @param cbBuf The size of the return buffer.
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync * @sa RTLdrQueryProp
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync */
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync DECLCALLBACKMEMBER(int, pfnQueryProp)(PRTDBGMODINT pMod, RTLDRPROP enmProp, void *pvBuf, size_t cbBuf);
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync /** For catching initialization errors (RTDBGMODVTIMG_MAGIC). */
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync uint32_t u32EndMagic;
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync} RTDBGMODVTIMG;
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync/** Pointer to a const RTDBGMODVTIMG. */
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsynctypedef RTDBGMODVTIMG const *PCRTDBGMODVTIMG;
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync/**
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * Virtual method table for debug info interpreters.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync */
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsynctypedef struct RTDBGMODVTDBG
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync{
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync /** Magic number (RTDBGMODVTDBG_MAGIC). */
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync uint32_t u32Magic;
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync /** Mask of supported debug info types, see grp_rt_dbg_type.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * Used to speed up the search for a suitable interpreter. */
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync uint32_t fSupports;
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync /** The name of the interpreter. */
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync const char *pszName;
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync /**
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * Try open the image.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync *
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * This combines probing and opening.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync *
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @returns IPRT status code. No informational returns defined.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync *
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * @param pMod Pointer to the module that is being opened.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync *
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * The RTDBGMOD::pszDbgFile member will point to
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * the filename of any debug info we're aware of
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * on input. Also, or alternatively, it is expected
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * that the interpreter will look for debug info in
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * the executable image file when present and that it
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * may ask the image interpreter for this when it's
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * around.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync *
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * Upon successful return the method is expected to
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * initialize pDbgOps and pvDbgPriv.
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync * @param enmArch The desired architecture.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync */
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync DECLCALLBACKMEMBER(int, pfnTryOpen)(PRTDBGMODINT pMod, RTLDRARCH enmArch);
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync /**
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * Close the interpreter, freeing all associated resources.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync *
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * The caller sets the pDbgOps and pvDbgPriv RTDBGMOD members
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * to NULL upon return.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync *
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * @param pMod Pointer to the module structure.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync */
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync DECLCALLBACKMEMBER(int, pfnClose)(PRTDBGMODINT pMod);
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync /**
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * Converts an image relative virtual address address to a segmented address.
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync *
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * @returns Segment index on success, NIL_RTDBGSEGIDX on failure.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * @param pMod Pointer to the module structure.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * @param uRva The image relative address to convert.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * @param poffSeg Where to return the segment offset. Optional.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync DECLCALLBACKMEMBER(RTDBGSEGIDX, pfnRvaToSegOff)(PRTDBGMODINT pMod, RTUINTPTR uRva, PRTUINTPTR poffSeg);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync /**
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync * Image size when mapped if segments are mapped adjacently.
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync *
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync * For ELF, PE, and Mach-O images this is (usually) a natural query, for LX and
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync * NE and such it's a bit odder and the answer may not make much sense for them.
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync *
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync * @returns Image mapped size.
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync * @param pMod Pointer to the module structure.
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync */
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync DECLCALLBACKMEMBER(RTUINTPTR, pfnImageSize)(PRTDBGMODINT pMod);
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync /**
044af0d1e6474076366759db86f101778c5f20ccvboxsync * Adds a segment to the module (optional).
044af0d1e6474076366759db86f101778c5f20ccvboxsync *
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @returns IPRT status code.
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @retval VERR_NOT_SUPPORTED if the interpreter doesn't support this feature.
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @retval VERR_DBG_SEGMENT_INDEX_CONFLICT if the segment index exists already.
044af0d1e6474076366759db86f101778c5f20ccvboxsync *
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @param pMod Pointer to the module structure.
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @param uRva The segment image relative address.
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @param cb The segment size.
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @param pszName The segment name.
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @param cchName The length of the segment name.
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @param fFlags Segment flags.
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @param piSeg The segment index or NIL_RTDBGSEGIDX on input.
044af0d1e6474076366759db86f101778c5f20ccvboxsync * The assigned segment index on successful return.
044af0d1e6474076366759db86f101778c5f20ccvboxsync * Optional.
044af0d1e6474076366759db86f101778c5f20ccvboxsync */
044af0d1e6474076366759db86f101778c5f20ccvboxsync DECLCALLBACKMEMBER(int, pfnSegmentAdd)(PRTDBGMODINT pMod, RTUINTPTR uRva, RTUINTPTR cb, const char *pszName, size_t cchName,
044af0d1e6474076366759db86f101778c5f20ccvboxsync uint32_t fFlags, PRTDBGSEGIDX piSeg);
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync /**
044af0d1e6474076366759db86f101778c5f20ccvboxsync * Gets the segment count.
044af0d1e6474076366759db86f101778c5f20ccvboxsync *
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @returns Number of segments.
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @retval NIL_RTDBGSEGIDX if unknown.
044af0d1e6474076366759db86f101778c5f20ccvboxsync *
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @param pMod Pointer to the module structure.
044af0d1e6474076366759db86f101778c5f20ccvboxsync */
044af0d1e6474076366759db86f101778c5f20ccvboxsync DECLCALLBACKMEMBER(RTDBGSEGIDX, pfnSegmentCount)(PRTDBGMODINT pMod);
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync /**
044af0d1e6474076366759db86f101778c5f20ccvboxsync * Gets information about a segment.
044af0d1e6474076366759db86f101778c5f20ccvboxsync *
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @returns IPRT status code.
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @retval VERR_DBG_INVALID_SEGMENT_INDEX if iSeg is too high.
044af0d1e6474076366759db86f101778c5f20ccvboxsync *
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @param pMod Pointer to the module structure.
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @param iSeg The segment.
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @param pSegInfo Where to store the segment information.
044af0d1e6474076366759db86f101778c5f20ccvboxsync */
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync DECLCALLBACKMEMBER(int, pfnSegmentByIndex)(PRTDBGMODINT pMod, RTDBGSEGIDX iSeg, PRTDBGSEGMENT pSegInfo);
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /**
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * Adds a symbol to the module (optional).
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync *
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @returns IPRT code.
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync * @retval VERR_NOT_SUPPORTED if the interpreter doesn't support this feature.
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync *
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync * @param pMod Pointer to the module structure.
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync * @param pszSymbol The symbol name.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * @param cchSymbol The length for the symbol name.
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync * @param iSeg The segment number (0-based). RTDBGMOD_SEG_RVA can be used.
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync * @param off The offset into the segment.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * @param cb The area covered by the symbol. 0 is fine.
88acfa6629a7976c0583c1712d2b5b22a87a5121vboxsync * @param fFlags Flags.
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @param piOrdinal Where to return the symbol ordinal on success. If the
044af0d1e6474076366759db86f101778c5f20ccvboxsync * interpreter doesn't do ordinals, this will be set to
044af0d1e6474076366759db86f101778c5f20ccvboxsync * UINT32_MAX. Optional
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync DECLCALLBACKMEMBER(int, pfnSymbolAdd)(PRTDBGMODINT pMod, const char *pszSymbol, size_t cchSymbol,
044af0d1e6474076366759db86f101778c5f20ccvboxsync uint32_t iSeg, RTUINTPTR off, RTUINTPTR cb, uint32_t fFlags,
044af0d1e6474076366759db86f101778c5f20ccvboxsync uint32_t *piOrdinal);
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync /**
044af0d1e6474076366759db86f101778c5f20ccvboxsync * Gets the number of symbols in the module.
044af0d1e6474076366759db86f101778c5f20ccvboxsync *
044af0d1e6474076366759db86f101778c5f20ccvboxsync * This is used for figuring out the max value to pass to pfnSymbolByIndex among
044af0d1e6474076366759db86f101778c5f20ccvboxsync * other things.
044af0d1e6474076366759db86f101778c5f20ccvboxsync *
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @returns The number of symbols, UINT32_MAX if not known/supported.
044af0d1e6474076366759db86f101778c5f20ccvboxsync *
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @param pMod Pointer to the module structure.
044af0d1e6474076366759db86f101778c5f20ccvboxsync */
044af0d1e6474076366759db86f101778c5f20ccvboxsync DECLCALLBACKMEMBER(uint32_t, pfnSymbolCount)(PRTDBGMODINT pMod);
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync /**
044af0d1e6474076366759db86f101778c5f20ccvboxsync * Queries symbol information by ordinal number.
044af0d1e6474076366759db86f101778c5f20ccvboxsync *
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @returns IPRT status code.
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @retval VINF_SUCCESS on success, no informational status code.
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @retval VERR_DBG_NO_SYMBOLS if there aren't any symbols.
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @retval VERR_NOT_SUPPORTED if lookup by ordinal is not supported.
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @retval VERR_SYMBOL_NOT_FOUND if there is no symbol at that index.
044af0d1e6474076366759db86f101778c5f20ccvboxsync *
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @param pMod Pointer to the module structure.
a1df400bbe9d64aad400442e56eb637019300a5evboxsync * @param iOrdinal The symbol ordinal number.
a1df400bbe9d64aad400442e56eb637019300a5evboxsync * @param pSymInfo Where to store the symbol information.
044af0d1e6474076366759db86f101778c5f20ccvboxsync */
a1df400bbe9d64aad400442e56eb637019300a5evboxsync DECLCALLBACKMEMBER(int, pfnSymbolByOrdinal)(PRTDBGMODINT pMod, uint32_t iOrdinal, PRTDBGSYMBOL pSymInfo);
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync /**
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * Queries symbol information by symbol name.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync *
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @returns IPRT status code.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * @retval VINF_SUCCESS on success, no informational status code.
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @retval VERR_DBG_NO_SYMBOLS if there aren't any symbols.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * @retval VERR_SYMBOL_NOT_FOUND if no suitable symbol was found.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync *
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * @param pMod Pointer to the module structure.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * @param pszSymbol The symbol name.
a1df400bbe9d64aad400442e56eb637019300a5evboxsync * @param cchSymbol The length of the symbol name.
a1df400bbe9d64aad400442e56eb637019300a5evboxsync * @param pSymInfo Where to store the symbol information.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync */
a1df400bbe9d64aad400442e56eb637019300a5evboxsync DECLCALLBACKMEMBER(int, pfnSymbolByName)(PRTDBGMODINT pMod, const char *pszSymbol, size_t cchSymbol, PRTDBGSYMBOL pSymInfo);
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync /**
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * Queries symbol information by address.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync *
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync * The returned symbol is what the debug info interpreter considers the symbol
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * most applicable to the specified address. This usually means a symbol with an
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * address equal or lower than the requested.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync *
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @returns IPRT status code.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * @retval VINF_SUCCESS on success, no informational status code.
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @retval VERR_DBG_NO_SYMBOLS if there aren't any symbols.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * @retval VERR_SYMBOL_NOT_FOUND if no suitable symbol was found.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync *
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * @param pMod Pointer to the module structure.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * @param iSeg The segment number (0-based) or RTDBGSEGIDX_ABS.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * @param off The offset into the segment.
2d8870843ff566fee9bd3a6a5942414254106479vboxsync * @param fFlags Symbol search flags, see RTDBGSYMADDR_FLAGS_XXX.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * @param poffDisp Where to store the distance between the specified address
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * and the returned symbol. Optional.
a1df400bbe9d64aad400442e56eb637019300a5evboxsync * @param pSymInfo Where to store the symbol information.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync */
2d8870843ff566fee9bd3a6a5942414254106479vboxsync DECLCALLBACKMEMBER(int, pfnSymbolByAddr)(PRTDBGMODINT pMod, uint32_t iSeg, RTUINTPTR off, uint32_t fFlags,
2d8870843ff566fee9bd3a6a5942414254106479vboxsync PRTINTPTR poffDisp, PRTDBGSYMBOL pSymInfo);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /**
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * Adds a line number to the module (optional).
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync *
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @returns IPRT status code.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * @retval VERR_NOT_SUPPORTED if the interpreter doesn't support this feature.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync *
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * @param pMod Pointer to the module structure.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * @param pszFile The filename.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * @param cchFile The length of the filename.
88acfa6629a7976c0583c1712d2b5b22a87a5121vboxsync * @param uLineNo The line number.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * @param iSeg The segment number (0-based).
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * @param off The offset into the segment.
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @param piOrdinal Where to return the line number ordinal on success. If
044af0d1e6474076366759db86f101778c5f20ccvboxsync * the interpreter doesn't do ordinals, this will be set to
044af0d1e6474076366759db86f101778c5f20ccvboxsync * UINT32_MAX. Optional
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync */
044af0d1e6474076366759db86f101778c5f20ccvboxsync DECLCALLBACKMEMBER(int, pfnLineAdd)(PRTDBGMODINT pMod, const char *pszFile, size_t cchFile, uint32_t uLineNo,
044af0d1e6474076366759db86f101778c5f20ccvboxsync uint32_t iSeg, RTUINTPTR off, uint32_t *piOrdinal);
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync /**
044af0d1e6474076366759db86f101778c5f20ccvboxsync * Gets the number of line numbers in the module.
044af0d1e6474076366759db86f101778c5f20ccvboxsync *
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @returns The number or UINT32_MAX if not known/supported.
044af0d1e6474076366759db86f101778c5f20ccvboxsync *
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @param pMod Pointer to the module structure.
044af0d1e6474076366759db86f101778c5f20ccvboxsync */
044af0d1e6474076366759db86f101778c5f20ccvboxsync DECLCALLBACKMEMBER(uint32_t, pfnLineCount)(PRTDBGMODINT pMod);
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync /**
044af0d1e6474076366759db86f101778c5f20ccvboxsync * Queries line number information by ordinal number.
044af0d1e6474076366759db86f101778c5f20ccvboxsync *
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @returns IPRT status code.
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @retval VINF_SUCCESS on success, no informational status code.
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @retval VERR_DBG_NO_LINE_NUMBERS if there aren't any line numbers.
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @retval VERR_DBG_LINE_NOT_FOUND if there is no line number with that
044af0d1e6474076366759db86f101778c5f20ccvboxsync * ordinal.
044af0d1e6474076366759db86f101778c5f20ccvboxsync *
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @param pMod Pointer to the module structure.
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @param iOrdinal The line number ordinal number.
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync * @param pLineInfo Where to store the information about the line number.
044af0d1e6474076366759db86f101778c5f20ccvboxsync */
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync DECLCALLBACKMEMBER(int, pfnLineByOrdinal)(PRTDBGMODINT pMod, uint32_t iOrdinal, PRTDBGLINE pLineInfo);
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync /**
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * Queries line number information by address.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync *
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @returns IPRT status code.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * @retval VINF_SUCCESS on success, no informational status code.
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @retval VERR_DBG_NO_LINE_NUMBERS if there aren't any line numbers.
044af0d1e6474076366759db86f101778c5f20ccvboxsync * @retval VERR_DBG_LINE_NOT_FOUND if no suitable line number was found.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync *
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * @param pMod Pointer to the module structure.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * @param iSeg The segment number (0-based) or RTDBGSEGIDX_ABS.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * @param off The offset into the segment.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * @param poffDisp Where to store the distance between the specified address
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * and the returned line number. Optional.
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync * @param pLineInfo Where to store the information about the closest line
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync * number.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync */
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync DECLCALLBACKMEMBER(int, pfnLineByAddr)(PRTDBGMODINT pMod, uint32_t iSeg, RTUINTPTR off, PRTINTPTR poffDisp, PRTDBGLINE pLineInfo);
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync /** For catching initialization errors (RTDBGMODVTDBG_MAGIC). */
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync uint32_t u32EndMagic;
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync} RTDBGMODVTDBG;
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync/** Pointer to a const RTDBGMODVTDBG. */
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsynctypedef RTDBGMODVTDBG const *PCRTDBGMODVTDBG;
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/**
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * Deferred loading callback.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync *
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @returns IPRT status code. On success the necessary method tables should be
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * installed in @a pMod.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @param pMod Pointer to the debug module structure.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @param pDeferred The deferred load data.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsynctypedef DECLCALLBACK(int) FNRTDBGMODDEFERRED(PRTDBGMODINT pMod, struct RTDBGMODDEFERRED *pDeferred);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** Pointer to a deferred loading callback. */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsynctypedef FNRTDBGMODDEFERRED *PFNRTDBGMODDEFERRED;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/**
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * Structure pointed to by pvDbgPriv and/or pvImgPriv when
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * g_rtDbgModVtDbgDeferred and/or g_rtDbgModVtImgDeferred are being used.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsynctypedef struct RTDBGMODDEFERRED
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /** The image size.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * Deferred loading is almost pointless without knowing the module size, as
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * it cannot be mapped (correctly) without it. */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync RTUINTPTR cbImage;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /** Reference counter. */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync uint32_t volatile cRefs;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /** The configuration instance (referenced), can be NIL. */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync RTDBGCFG hDbgCfg;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /** Performs deferred loading of the module. */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync PFNRTDBGMODDEFERRED pfnDeferred;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /** Callback specific data. */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync union
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync {
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync struct
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync {
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /** The time/date stamp of the executable image and codeview file. */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync uint32_t uTimestamp;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync } PeImage,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync OldCodeView;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync struct
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync {
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /** The PDB uuid. */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync RTUUID Uuid;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /** The PDB age. */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync uint32_t uAge;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync } NewCodeview;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync struct
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync {
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /** The CRC-32 value found in the .gnu_debuglink section. */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync uint32_t uCrc32;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync } GnuDebugLink;
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync struct
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync {
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync /** The image UUID. */
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync RTUUID Uuid;
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync /** Image architecture. */
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync RTLDRARCH enmArch;
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync /** Number of segment mappings. */
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync uint32_t cSegs;
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync /** Segment mappings. */
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync RTDBGSEGMENT aSegs[1];
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync } MachO;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync } u;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync} RTDBGMODDEFERRED;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** Pointer to the deferred loading data. */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsynctypedef RTDBGMODDEFERRED *PRTDBGMODDEFERRED;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync/**
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * Debug module structure.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync */
4a1654dd5b9f0ae4e149d909843a3ab07b8bec33vboxsynctypedef struct RTDBGMODINT
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync{
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync /** Magic value (RTDBGMOD_MAGIC). */
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync uint32_t u32Magic;
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync /** The number of reference there are to this module.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * This is used to perform automatic cleanup and sharing. */
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync uint32_t volatile cRefs;
ae83ea510012552d3286d67b41abddf158ca6654vboxsync /** The module tag. */
ae83ea510012552d3286d67b41abddf158ca6654vboxsync uint64_t uTag;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /** When set, the loading of the image and debug info (including locating any
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * external files), will not have taken place yet. */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync uint32_t fDeferred : 1;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /** Set if deferred loading failed. */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync uint32_t fDeferredFailed : 1;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /** Set if the debug info is based on image exports and segments. */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync uint32_t fExports : 1;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /** Alignment padding. */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync uint32_t fPadding1 : 29;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync#if ARCH_BITS == 64
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync uint32_t u32Padding2;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync#endif
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync /** The module name (short). */
c0e27f622f9bd6d9e77d2d959aab71d69dabf0d3vboxsync char const *pszName;
e9525bea57dc13d82fd3392913aebb33d2cb79e3vboxsync /** The image file specified by the user. Can be NULL. */
e9525bea57dc13d82fd3392913aebb33d2cb79e3vboxsync char const *pszImgFileSpecified;
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync /** The module filename. Can be NULL. */
c0e27f622f9bd6d9e77d2d959aab71d69dabf0d3vboxsync char const *pszImgFile;
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync /** The debug info file (if external). Can be NULL. */
c0e27f622f9bd6d9e77d2d959aab71d69dabf0d3vboxsync char const *pszDbgFile;
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync /** The method table for the executable image interpreter. */
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync PCRTDBGMODVTIMG pImgVt;
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync /** Pointer to the private data of the executable image interpreter. */
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync void *pvImgPriv;
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync /** The method table for the debug info interpreter. */
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync PCRTDBGMODVTDBG pDbgVt;
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync /** Pointer to the private data of the debug info interpreter. */
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync void *pvDbgPriv;
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /** Critical section serializing access to the module. */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync RTCRITSECT CritSect;
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync} RTDBGMODINT;
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync/** Pointer to an debug module structure. */
172ae196da38208e5f1e3485715a89f2d53c6880vboxsynctypedef RTDBGMODINT *PRTDBGMODINT;
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
72a6fe3989272cb2d409b50caca25e1edbca9398vboxsyncextern DECLHIDDEN(RTSTRCACHE) g_hDbgModStrCache;
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsyncextern DECLHIDDEN(RTDBGMODVTDBG const) g_rtDbgModVtDbgCodeView;
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsyncextern DECLHIDDEN(RTDBGMODVTDBG const) g_rtDbgModVtDbgDwarf;
72a6fe3989272cb2d409b50caca25e1edbca9398vboxsyncextern DECLHIDDEN(RTDBGMODVTDBG const) g_rtDbgModVtDbgNm;
e36f03470adaee73199dcdddd8eb9cf39bbdf7advboxsync#ifdef RT_OS_WINDOWS
e36f03470adaee73199dcdddd8eb9cf39bbdf7advboxsyncextern DECLHIDDEN(RTDBGMODVTDBG const) g_rtDbgModVtDbgDbgHelp;
e36f03470adaee73199dcdddd8eb9cf39bbdf7advboxsync#endif
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncextern DECLHIDDEN(RTDBGMODVTDBG const) g_rtDbgModVtDbgDeferred;
31771163041e3661403a806eb3382d2a165c003bvboxsyncextern DECLHIDDEN(RTDBGMODVTDBG const) g_rtDbgModVtDbgContainer;
e36f03470adaee73199dcdddd8eb9cf39bbdf7advboxsync
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsyncextern DECLHIDDEN(RTDBGMODVTIMG const) g_rtDbgModVtImgLdr;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncextern DECLHIDDEN(RTDBGMODVTIMG const) g_rtDbgModVtImgDeferred;
7af218a7441de38fc9e814919db04bae3e917664vboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncDECLHIDDEN(int) rtDbgModContainerCreate(PRTDBGMODINT pMod, RTUINTPTR cbSeg);
31771163041e3661403a806eb3382d2a165c003bvboxsyncDECLHIDDEN(int) rtDbgModContainer_SymbolRemoveAll(PRTDBGMODINT pMod);
31771163041e3661403a806eb3382d2a165c003bvboxsyncDECLHIDDEN(int) rtDbgModContainer_LineRemoveAll(PRTDBGMODINT pMod);
31771163041e3661403a806eb3382d2a165c003bvboxsyncDECLHIDDEN(int) rtDbgModContainer_RemoveAll(PRTDBGMODINT pMod);
31771163041e3661403a806eb3382d2a165c003bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncDECLHIDDEN(int) rtDbgModCreateForExports(PRTDBGMODINT pDbgMod);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncDECLHIDDEN(int) rtDbgModDeferredCreate(PRTDBGMODINT pDbgMod, PFNRTDBGMODDEFERRED pfnDeferred, RTUINTPTR cbImage,
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync RTDBGCFG hDbgCfg, size_t cbDeferred, PRTDBGMODDEFERRED *ppDeferred);
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
830a019ad79a45e6bf7a5419efd5a729a36e599evboxsyncDECLHIDDEN(int) rtDbgModLdrOpenFromHandle(PRTDBGMODINT pDbgMod, RTLDRMOD hLdrMod);
830a019ad79a45e6bf7a5419efd5a729a36e599evboxsync
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync/** @} */
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsyncRT_C_DECLS_END
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync#endif
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync