dbgmod.h revision 5b0a093ca572a855886faa6747ad46df859dd041
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/* $Id$ */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/** @file
45565249f149f7562fc6ee85be7ca3a3706e32e6vboxsync * IPRT - Internal Header for RTDbgMod and the associated interpreters.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/*
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Copyright (C) 2008-2011 Oracle Corporation
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * available from http://www.virtualbox.org. This file is free software;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * you can redistribute it and/or modify it under the terms of the GNU
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * General Public License (GPL) as published by the Free Software
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * The contents of this file may alternatively be used under the terms
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * of the Common Development and Distribution License Version 1.0
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * VirtualBox OSE distribution, in which case the provisions of the
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * CDDL are applicable instead of those of the GPL.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * You may elect to license modified versions of this file under the
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * terms and conditions of either the GPL or the CDDL or both.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#ifndef ___internal_dbgmod_h
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#define ___internal_dbgmod_h
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include <iprt/types.h>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include <iprt/critsect.h>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include <iprt/ldr.h> /* for PFNRTLDRENUMDBG */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include "internal/magics.h"
45565249f149f7562fc6ee85be7ca3a3706e32e6vboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncRT_C_DECLS_BEGIN
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/** @addtogroup grp_rt_dbgmod
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @internal
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @{
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync/** Pointer to the internal module structure. */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsynctypedef struct RTDBGMODINT *PRTDBGMODINT;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/**
3393c62e395aa8388303d99f765a219efc289158vboxsync * Virtual method table for executable image interpreters.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsynctypedef struct RTDBGMODVTIMG
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync{
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /** Magic number (RTDBGMODVTIMG_MAGIC). */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync uint32_t u32Magic;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /** Reserved. */
cea5568645ca17479265436cfd5ba010ddd106d9vboxsync uint32_t fReserved;
45565249f149f7562fc6ee85be7ca3a3706e32e6vboxsync /** The name of the interpreter. */
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync const char *pszName;
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync
8bc32f3cdc28219d881eb67346c88a8e8acd5c6cvboxsync /**
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Try open the image.
cea5568645ca17479265436cfd5ba010ddd106d9vboxsync *
cea5568645ca17479265436cfd5ba010ddd106d9vboxsync * This combines probing and opening.
cea5568645ca17479265436cfd5ba010ddd106d9vboxsync *
cea5568645ca17479265436cfd5ba010ddd106d9vboxsync * @returns IPRT status code. No informational returns defined.
cea5568645ca17479265436cfd5ba010ddd106d9vboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param pMod Pointer to the module that is being opened.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * The RTDBGMOD::pszDbgFile member will point to
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * the filename of any debug info we're aware of
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * on input. Also, or alternatively, it is expected
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * that the interpreter will look for debug info in
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * the executable image file when present and that it
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * may ask the image interpreter for this when it's
59e8feed5ffd306be4de820c67f766591aaa9b69vboxsync * around.
59e8feed5ffd306be4de820c67f766591aaa9b69vboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Upon successful return the method is expected to
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * initialize pImgOps and pvImgPriv.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync DECLCALLBACKMEMBER(int, pfnTryOpen)(PRTDBGMODINT pMod);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /**
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Close the interpreter, freeing all associated resources.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * The caller sets the pDbgOps and pvDbgPriv RTDBGMOD members
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * to NULL upon return.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param pMod Pointer to the module structure.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync DECLCALLBACKMEMBER(int, pfnClose)(PRTDBGMODINT pMod);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /**
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Enumerate the debug info contained in the executable image.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * Identical to RTLdrEnumDbgInfo.
c5019986bed37ec649721e6f7bc2117386fa5ac3vboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @returns IPRT status code or whatever pfnCallback returns.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param pMod Pointer to the module structure.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param pvBits Optional pointer to bits returned by
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * RTLdrGetBits(). This can be used by some module
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * interpreters to reduce memory consumption.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param pfnCallback The callback function. Ignore the module
59e8feed5ffd306be4de820c67f766591aaa9b69vboxsync * handle argument!
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param pvUser The user argument.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync DECLCALLBACKMEMBER(int, pfnEnumDbgInfo)(PRTDBGMODINT pMod, PFNRTLDRENUMDBG pfnCallback, void *pvUser);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
59e8feed5ffd306be4de820c67f766591aaa9b69vboxsync /**
59e8feed5ffd306be4de820c67f766591aaa9b69vboxsync * Creates a read-only mapping of a part of the image file.
a93da6c0946d71f517dc6d64a633704cb99068b8vboxsync *
a93da6c0946d71f517dc6d64a633704cb99068b8vboxsync * @returns IPRT status code and *ppvMap set on success.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param pMod Pointer to the module structure.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param off The offset into the image file.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param cb The number of bytes to map.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param ppvMap Where to return the mapping address on success.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync DECLCALLBACKMEMBER(int, pfnMapPart)(PRTDBGMODINT pMod, RTFOFF off, size_t cb, void const **ppvMap);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /**
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Unmaps memory previously mapped by pfnMapPart.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @returns IPRT status code, *ppvMap set to NULL on success.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param pMod Pointer to the module structure.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param cb The size of the mapping.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param ppvMap The mapping address on input, NULL on
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * successful return.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync DECLCALLBACKMEMBER(int, pfnUnmapPart)(PRTDBGMODINT pMod, size_t cb, void const **ppvMap);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /** For catching initialization errors (RTDBGMODVTIMG_MAGIC). */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync uint32_t u32EndMagic;
cf0b951d0e7a93540b3931ca506ed97c1dc300ccvboxsync} RTDBGMODVTIMG;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/** Pointer to a const RTDBGMODVTIMG. */
cf0b951d0e7a93540b3931ca506ed97c1dc300ccvboxsynctypedef RTDBGMODVTIMG const *PCRTDBGMODVTIMG;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/**
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Virtual method table for debug info interpreters.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsynctypedef struct RTDBGMODVTDBG
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync{
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /** Magic number (RTDBGMODVTDBG_MAGIC). */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync uint32_t u32Magic;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /** Mask of supported debug info types, see grp_rt_dbg_type.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * Used to speed up the search for a suitable interpreter. */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync uint32_t fSupports;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /** The name of the interpreter. */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync const char *pszName;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /**
a93da6c0946d71f517dc6d64a633704cb99068b8vboxsync * Try open the image.
b47847090b3c99e4fdf905536053595e75845265vboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * This combines probing and opening.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @returns IPRT status code. No informational returns defined.
4b30f6c72b07654509606857da385afcc09aaae3vboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param pMod Pointer to the module that is being opened.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
36ebaddfec017eee7e82ee466c25de002cdc4231vboxsync * The RTDBGMOD::pszDbgFile member will point to
36ebaddfec017eee7e82ee466c25de002cdc4231vboxsync * the filename of any debug info we're aware of
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * on input. Also, or alternatively, it is expected
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * that the interpreter will look for debug info in
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * the executable image file when present and that it
ec382ee8bf6c277150eaad532778850e88273741vboxsync * may ask the image interpreter for this when it's
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * around.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Upon successful return the method is expected to
59e8feed5ffd306be4de820c67f766591aaa9b69vboxsync * initialize pDbgOps and pvDbgPriv.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
59e8feed5ffd306be4de820c67f766591aaa9b69vboxsync DECLCALLBACKMEMBER(int, pfnTryOpen)(PRTDBGMODINT pMod);
59e8feed5ffd306be4de820c67f766591aaa9b69vboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /**
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Close the interpreter, freeing all associated resources.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
4b30f6c72b07654509606857da385afcc09aaae3vboxsync * The caller sets the pDbgOps and pvDbgPriv RTDBGMOD members
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * to NULL upon return.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param pMod Pointer to the module structure.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync DECLCALLBACKMEMBER(int, pfnClose)(PRTDBGMODINT pMod);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
36ebaddfec017eee7e82ee466c25de002cdc4231vboxsync /**
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Converts an image relative virtual address address to a segmented address.
a93da6c0946d71f517dc6d64a633704cb99068b8vboxsync *
a1537beae84f906549aaabab46d498051e438267vboxsync * @returns Segment index on success, NIL_RTDBGSEGIDX on failure.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param pMod Pointer to the module structure.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param uRva The image relative address to convert.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param poffSeg Where to return the segment offset. Optional.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
59e8feed5ffd306be4de820c67f766591aaa9b69vboxsync DECLCALLBACKMEMBER(RTDBGSEGIDX, pfnRvaToSegOff)(PRTDBGMODINT pMod, RTUINTPTR uRva, PRTUINTPTR poffSeg);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync /**
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Image size when mapped if segments are mapped adjacently.
4b30f6c72b07654509606857da385afcc09aaae3vboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * For ELF, PE, and Mach-O images this is (usually) a natural query, for LX and
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * NE and such it's a bit odder and the answer may not make much sense for them.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
36ebaddfec017eee7e82ee466c25de002cdc4231vboxsync * @returns Image mapped size.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param pMod Pointer to the module structure.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync DECLCALLBACKMEMBER(RTUINTPTR, pfnImageSize)(PRTDBGMODINT pMod);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync /**
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * Adds a segment to the module (optional).
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync *
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @returns IPRT status code.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @retval VERR_NOT_SUPPORTED if the interpreter doesn't support this feature.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @retval VERR_DBG_SEGMENT_INDEX_CONFLICT if the segment index exists already.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync *
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param pMod Pointer to the module structure.
59e8feed5ffd306be4de820c67f766591aaa9b69vboxsync * @param uRva The segment image relative address.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param cb The segment size.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param pszName The segment name.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param cchName The length of the segment name.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param fFlags Segment flags.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param piSeg The segment index or NIL_RTDBGSEGIDX on input.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * The assigned segment index on successful return.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * Optional.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync */
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync DECLCALLBACKMEMBER(int, pfnSegmentAdd)(PRTDBGMODINT pMod, RTUINTPTR uRva, RTUINTPTR cb, const char *pszName, size_t cchName,
36ebaddfec017eee7e82ee466c25de002cdc4231vboxsync uint32_t fFlags, PRTDBGSEGIDX piSeg);
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync /**
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * Gets the segment count.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync *
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @returns Number of segments.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @retval NIL_RTDBGSEGIDX if unknown.
3a5d16e1911830b585d10278ea2cdbb408e261e6vboxsync *
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param pMod Pointer to the module structure.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync DECLCALLBACKMEMBER(RTDBGSEGIDX, pfnSegmentCount)(PRTDBGMODINT pMod);
3a5d16e1911830b585d10278ea2cdbb408e261e6vboxsync
3a5d16e1911830b585d10278ea2cdbb408e261e6vboxsync /**
59e8feed5ffd306be4de820c67f766591aaa9b69vboxsync * Gets information about a segment.
59e8feed5ffd306be4de820c67f766591aaa9b69vboxsync *
59e8feed5ffd306be4de820c67f766591aaa9b69vboxsync * @returns IPRT status code.
59e8feed5ffd306be4de820c67f766591aaa9b69vboxsync * @retval VERR_DBG_INVALID_SEGMENT_INDEX if iSeg is too high.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync *
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param pMod Pointer to the module structure.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param iSeg The segment.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param pSegInfo Where to store the segment information.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
0a769a6be37f526faeabe88f77422ee6291afa37vboxsync DECLCALLBACKMEMBER(int, pfnSegmentByIndex)(PRTDBGMODINT pMod, RTDBGSEGIDX iSeg, PRTDBGSEGMENT pSegInfo);
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync /**
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * Adds a symbol to the module (optional).
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync *
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @returns IPRT code.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @retval VERR_NOT_SUPPORTED if the interpreter doesn't support this feature.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync *
59e8feed5ffd306be4de820c67f766591aaa9b69vboxsync * @param pMod Pointer to the module structure.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param pszSymbol The symbol name.
59e8feed5ffd306be4de820c67f766591aaa9b69vboxsync * @param cchSymbol The length for the symbol name.
59e8feed5ffd306be4de820c67f766591aaa9b69vboxsync * @param iSeg The segment number (0-based). RTDBGMOD_SEG_RVA can be used.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param off The offset into the segment.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param cb The area covered by the symbol. 0 is fine.
59e8feed5ffd306be4de820c67f766591aaa9b69vboxsync * @param fFlags Flags.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param piOrdinal Where to return the symbol ordinal on success. If the
59e8feed5ffd306be4de820c67f766591aaa9b69vboxsync * interpreter doesn't do ordinals, this will be set to
59e8feed5ffd306be4de820c67f766591aaa9b69vboxsync * UINT32_MAX. Optional
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync */
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync DECLCALLBACKMEMBER(int, pfnSymbolAdd)(PRTDBGMODINT pMod, const char *pszSymbol, size_t cchSymbol,
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync uint32_t iSeg, RTUINTPTR off, RTUINTPTR cb, uint32_t fFlags,
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync uint32_t *piOrdinal);
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync /**
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * Gets the number of symbols in the module.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync *
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * This is used for figuring out the max value to pass to pfnSymbolByIndex among
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * other things.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync *
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @returns The number of symbols, UINT32_MAX if not known/supported.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync *
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param pMod Pointer to the module structure.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
59e8feed5ffd306be4de820c67f766591aaa9b69vboxsync DECLCALLBACKMEMBER(uint32_t, pfnSymbolCount)(PRTDBGMODINT pMod);
59e8feed5ffd306be4de820c67f766591aaa9b69vboxsync
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync /**
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * Queries symbol information by ordinal number.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync *
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @returns IPRT status code.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @retval VINF_SUCCESS on success, no informational status code.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @retval VERR_DBG_NO_SYMBOLS if there aren't any symbols.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @retval VERR_NOT_SUPPORTED if lookup by ordinal is not supported.
0dd363d45ea01de87d37118985064da6e0f86f36vboxsync * @retval VERR_SYMBOL_NOT_FOUND if there is no symbol at that index.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync *
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param pMod Pointer to the module structure.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param iOrdinal The symbol ordinal number.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param pSymInfo Where to store the symbol information.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync DECLCALLBACKMEMBER(int, pfnSymbolByOrdinal)(PRTDBGMODINT pMod, uint32_t iOrdinal, PRTDBGSYMBOL pSymInfo);
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /**
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * Queries symbol information by symbol name.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync *
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @returns IPRT status code.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @retval VINF_SUCCESS on success, no informational status code.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @retval VERR_DBG_NO_SYMBOLS if there aren't any symbols.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @retval VERR_SYMBOL_NOT_FOUND if no suitable symbol was found.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param pMod Pointer to the module structure.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param pszSymbol The symbol name.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param cchSymbol The length of the symbol name.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param pSymInfo Where to store the symbol information.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync */
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync DECLCALLBACKMEMBER(int, pfnSymbolByName)(PRTDBGMODINT pMod, const char *pszSymbol, size_t cchSymbol, PRTDBGSYMBOL pSymInfo);
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync /**
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * Queries symbol information by address.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * The returned symbol is what the debug info interpreter considers the symbol
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * most applicable to the specified address. This usually means a symbol with an
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * address equal or lower than the requested.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync *
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @returns IPRT status code.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @retval VINF_SUCCESS on success, no informational status code.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @retval VERR_DBG_NO_SYMBOLS if there aren't any symbols.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @retval VERR_SYMBOL_NOT_FOUND if no suitable symbol was found.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync *
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param pMod Pointer to the module structure.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param iSeg The segment number (0-based) or RTDBGSEGIDX_ABS.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param off The offset into the segment.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param poffDisp Where to store the distance between the specified address
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * and the returned symbol. Optional.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param pSymInfo Where to store the symbol information.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync */
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync DECLCALLBACKMEMBER(int, pfnSymbolByAddr)(PRTDBGMODINT pMod, uint32_t iSeg, RTUINTPTR off, PRTINTPTR poffDisp, PRTDBGSYMBOL pSymInfo);
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync /**
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * Adds a line number to the module (optional).
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync *
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @returns IPRT status code.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @retval VERR_NOT_SUPPORTED if the interpreter doesn't support this feature.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync *
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param pMod Pointer to the module structure.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param pszFile The filename.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param cchFile The length of the filename.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param uLineNo The line number.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param iSeg The segment number (0-based).
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param off The offset into the segment.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param piOrdinal Where to return the line number ordinal on success. If
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * the interpreter doesn't do ordinals, this will be set to
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * UINT32_MAX. Optional
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync */
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync DECLCALLBACKMEMBER(int, pfnLineAdd)(PRTDBGMODINT pMod, const char *pszFile, size_t cchFile, uint32_t uLineNo,
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync uint32_t iSeg, RTUINTPTR off, uint32_t *piOrdinal);
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync /**
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * Gets the number of line numbers in the module.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync *
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @returns The number or UINT32_MAX if not known/supported.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync *
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param pMod Pointer to the module structure.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync */
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync DECLCALLBACKMEMBER(uint32_t, pfnLineCount)(PRTDBGMODINT pMod);
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /**
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * Queries line number information by ordinal number.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync *
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @returns IPRT status code.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @retval VINF_SUCCESS on success, no informational status code.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @retval VERR_DBG_NO_LINE_NUMBERS if there aren't any line numbers.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @retval VERR_DBG_LINE_NOT_FOUND if there is no line number with that
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * ordinal.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync *
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param pMod Pointer to the module structure.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param iOrdinal The line number ordinal number.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param pLineInfo Where to store the information about the line number.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync */
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync DECLCALLBACKMEMBER(int, pfnLineByOrdinal)(PRTDBGMODINT pMod, uint32_t iOrdinal, PRTDBGLINE pLineInfo);
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync /**
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * Queries line number information by address.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync *
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @returns IPRT status code.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @retval VINF_SUCCESS on success, no informational status code.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @retval VERR_DBG_NO_LINE_NUMBERS if there aren't any line numbers.
36ebaddfec017eee7e82ee466c25de002cdc4231vboxsync * @retval VERR_DBG_LINE_NOT_FOUND if no suitable line number was found.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync *
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param pMod Pointer to the module structure.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param iSeg The segment number (0-based) or RTDBGSEGIDX_ABS.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param off The offset into the segment.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param poffDisp Where to store the distance between the specified address
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * and the returned line number. Optional.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param pLineInfo Where to store the information about the closest line
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * number.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync */
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync DECLCALLBACKMEMBER(int, pfnLineByAddr)(PRTDBGMODINT pMod, uint32_t iSeg, RTUINTPTR off, PRTINTPTR poffDisp, PRTDBGLINE pLineInfo);
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync /** For catching initialization errors (RTDBGMODVTDBG_MAGIC). */
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync uint32_t u32EndMagic;
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync} RTDBGMODVTDBG;
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync/** Pointer to a const RTDBGMODVTDBG. */
84eeabfd29e718854e00e795879dab6ce61469e5vboxsynctypedef RTDBGMODVTDBG const *PCRTDBGMODVTDBG;
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync/**
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * Debug module structure.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync */
84eeabfd29e718854e00e795879dab6ce61469e5vboxsynctypedef struct RTDBGMODINT
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync{
36ebaddfec017eee7e82ee466c25de002cdc4231vboxsync /** Magic value (RTDBGMOD_MAGIC). */
b47847090b3c99e4fdf905536053595e75845265vboxsync uint32_t u32Magic;
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync /** The number of reference there are to this module.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * This is used to perform automatic cleanup and sharing. */
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync uint32_t volatile cRefs;
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync /** The module tag. */
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync uint64_t uTag;
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync /** The module name (short). */
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync char const *pszName;
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync /** The module filename. Can be NULL. */
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync char const *pszImgFile;
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync /** The debug info file (if external). Can be NULL. */
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync char const *pszDbgFile;
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync
36ebaddfec017eee7e82ee466c25de002cdc4231vboxsync /** Critical section serializing access to the module. */
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync RTCRITSECT CritSect;
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync /** The method table for the executable image interpreter. */
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync PCRTDBGMODVTIMG pImgVt;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /** Pointer to the private data of the executable image interpreter. */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync void *pvImgPriv;
0a769a6be37f526faeabe88f77422ee6291afa37vboxsync
3393c62e395aa8388303d99f765a219efc289158vboxsync /** The method table for the debug info interpreter. */
3393c62e395aa8388303d99f765a219efc289158vboxsync PCRTDBGMODVTDBG pDbgVt;
3393c62e395aa8388303d99f765a219efc289158vboxsync /** Pointer to the private data of the debug info interpreter. */
3393c62e395aa8388303d99f765a219efc289158vboxsync void *pvDbgPriv;
3393c62e395aa8388303d99f765a219efc289158vboxsync
3393c62e395aa8388303d99f765a219efc289158vboxsync} RTDBGMODINT;
3393c62e395aa8388303d99f765a219efc289158vboxsync/** Pointer to an debug module structure. */
3393c62e395aa8388303d99f765a219efc289158vboxsynctypedef RTDBGMODINT *PRTDBGMODINT;
3393c62e395aa8388303d99f765a219efc289158vboxsync
3393c62e395aa8388303d99f765a219efc289158vboxsync
3393c62e395aa8388303d99f765a219efc289158vboxsyncextern DECLHIDDEN(RTSTRCACHE) g_hDbgModStrCache;
3393c62e395aa8388303d99f765a219efc289158vboxsyncextern DECLHIDDEN(RTDBGMODVTDBG const) g_rtDbgModVtDbgDwarf;
3393c62e395aa8388303d99f765a219efc289158vboxsyncextern DECLHIDDEN(RTDBGMODVTDBG const) g_rtDbgModVtDbgNm;
3393c62e395aa8388303d99f765a219efc289158vboxsyncextern DECLHIDDEN(RTDBGMODVTIMG const) g_rtDbgModVtImgLdr;
3393c62e395aa8388303d99f765a219efc289158vboxsync
3393c62e395aa8388303d99f765a219efc289158vboxsyncint rtDbgModContainerCreate(PRTDBGMODINT pMod, RTUINTPTR cbSeg);
3393c62e395aa8388303d99f765a219efc289158vboxsync
3393c62e395aa8388303d99f765a219efc289158vboxsync/** @} */
3393c62e395aa8388303d99f765a219efc289158vboxsync
3393c62e395aa8388303d99f765a219efc289158vboxsyncRT_C_DECLS_END
3393c62e395aa8388303d99f765a219efc289158vboxsync
3393c62e395aa8388303d99f765a219efc289158vboxsync#endif
cea5568645ca17479265436cfd5ba010ddd106d9vboxsync
3393c62e395aa8388303d99f765a219efc289158vboxsync