dbgmod.h revision 5b0a093ca572a855886faa6747ad46df859dd041
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync/* $Id$ */
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync/** @file
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync * IPRT - Internal Header for RTDbgMod and the associated interpreters.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync */
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync/*
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync * Copyright (C) 2008-2011 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.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync */
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync DECLCALLBACKMEMBER(int, pfnTryOpen)(PRTDBGMODINT pMod);
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 pvBits Optional pointer to bits returned by
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync * RTLdrGetBits(). This can be used by some module
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync * interpreters to reduce memory consumption.
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
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.
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.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync */
5b0a093ca572a855886faa6747ad46df859dd041vboxsync DECLCALLBACKMEMBER(int, pfnMapPart)(PRTDBGMODINT pMod, 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
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
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.
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync */
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync DECLCALLBACKMEMBER(int, pfnTryOpen)(PRTDBGMODINT pMod);
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.
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 */
a1df400bbe9d64aad400442e56eb637019300a5evboxsync DECLCALLBACKMEMBER(int, pfnSymbolByAddr)(PRTDBGMODINT pMod, uint32_t iSeg, RTUINTPTR off, 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
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;
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync /** The module name (short). */
c0e27f622f9bd6d9e77d2d959aab71d69dabf0d3vboxsync char const *pszName;
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
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync /** Critical section serializing access to the module. */
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync RTCRITSECT CritSect;
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
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
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync} RTDBGMODINT;
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync/** Pointer to an debug module structure. */
172ae196da38208e5f1e3485715a89f2d53c6880vboxsynctypedef RTDBGMODINT *PRTDBGMODINT;
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
72a6fe3989272cb2d409b50caca25e1edbca9398vboxsyncextern DECLHIDDEN(RTSTRCACHE) g_hDbgModStrCache;
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsyncextern DECLHIDDEN(RTDBGMODVTDBG const) g_rtDbgModVtDbgDwarf;
72a6fe3989272cb2d409b50caca25e1edbca9398vboxsyncextern DECLHIDDEN(RTDBGMODVTDBG const) g_rtDbgModVtDbgNm;
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsyncextern DECLHIDDEN(RTDBGMODVTIMG const) g_rtDbgModVtImgLdr;
7af218a7441de38fc9e814919db04bae3e917664vboxsync
c0e27f622f9bd6d9e77d2d959aab71d69dabf0d3vboxsyncint rtDbgModContainerCreate(PRTDBGMODINT pMod, RTUINTPTR cbSeg);
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync/** @} */
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsyncRT_C_DECLS_END
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync#endif
3a4a6501d0ccd629d9951b644d380c7bb2d46086vboxsync