278688e1dd719e82e8b77a7953a40875fb39e129vboxsync/* $Id$ */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @file
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * IPRT - Debug Module Deferred Loading Stub.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/*
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * Copyright (C) 2013 Oracle Corporation
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync *
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * available from http://www.virtualbox.org. This file is free software;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * you can redistribute it and/or modify it under the terms of the GNU
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * General Public License (GPL) as published by the Free Software
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync *
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * The contents of this file may alternatively be used under the terms
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * of the Common Development and Distribution License Version 1.0
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * VirtualBox OSE distribution, in which case the provisions of the
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * CDDL are applicable instead of those of the GPL.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync *
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * You may elect to license modified versions of this file under the
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * terms and conditions of either the GPL or the CDDL or both.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/*******************************************************************************
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync* Header Files *
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync*******************************************************************************/
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync#include <iprt/dbg.h>
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync#include "internal/iprt.h"
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync#include <iprt/asm.h>
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync#include <iprt/assert.h>
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync#include <iprt/err.h>
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync#include <iprt/mem.h>
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync#include <iprt/param.h>
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync#include <iprt/path.h>
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync#include <iprt/string.h>
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync#include "internal/dbgmod.h"
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync#include "internal/magics.h"
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/**
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * Releases the instance data.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync *
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @param pThis The instance data.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic void rtDbgModDeferredReleaseInstanceData(PRTDBGMODDEFERRED pThis)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync AssertPtr(pThis);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync uint32_t cRefs = ASMAtomicDecU32(&pThis->cRefs); Assert(cRefs < 8);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (!cRefs)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync {
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync RTDbgCfgRelease(pThis->hDbgCfg);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pThis->hDbgCfg = NIL_RTDBGCFG;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync RTMemFree(pThis);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync }
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync}
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/**
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * Does the deferred loading of the real data (image and/or debug info).
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync *
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @returns VINF_SUCCESS or VERR_DBG_DEFERRED_LOAD_FAILED.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @param pMod The generic module instance data.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @param fForcedRetry Whether it's a forced retry by one of the
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * pfnTryOpen methods.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic int rtDbgModDeferredDoIt(PRTDBGMODINT pMod, bool fForcedRetry)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync RTCritSectEnter(&pMod->CritSect);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (!pMod->fDeferredFailed || fForcedRetry)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync {
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync bool const fDbgVt = pMod->pDbgVt == &g_rtDbgModVtDbgDeferred;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync bool const fImgVt = pMod->pImgVt == &g_rtDbgModVtImgDeferred;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync AssertReturnStmt(fDbgVt || fImgVt, RTCritSectLeave(&pMod->CritSect), VERR_INTERNAL_ERROR_5);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync PRTDBGMODDEFERRED pThis = (PRTDBGMODDEFERRED)(fDbgVt ? pMod->pvDbgPriv : pMod->pvImgPriv);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /* Reset the method tables and private data pointes so the deferred loading
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync procedure can figure out what to do and won't get confused. */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (fDbgVt)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync {
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pMod->pvDbgPriv = NULL;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pMod->pDbgVt = NULL;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync }
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (fImgVt)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync {
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pMod->pvImgPriv = NULL;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pMod->pImgVt = NULL;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync }
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /* Do the deferred loading. */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = pThis->pfnDeferred(pMod, pThis);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (RT_SUCCESS(rc))
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync {
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync Assert(!fDbgVt || pMod->pDbgVt != NULL);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync Assert(!fImgVt || pMod->pImgVt != NULL);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pMod->fDeferred = false;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pMod->fDeferredFailed = false;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rtDbgModDeferredReleaseInstanceData(pThis);
d90eec53c9dcaa0f3d1054e8734ed46875b9093avboxsync if (fImgVt && fDbgVt)
d90eec53c9dcaa0f3d1054e8734ed46875b9093avboxsync rtDbgModDeferredReleaseInstanceData(pThis);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync }
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync else
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync {
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /* Failed, bail out and restore the deferred setup. */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pMod->fDeferredFailed = true;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (fDbgVt)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync {
d90eec53c9dcaa0f3d1054e8734ed46875b9093avboxsync Assert(!pMod->pDbgVt);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pMod->pDbgVt = &g_rtDbgModVtDbgDeferred;
d90eec53c9dcaa0f3d1054e8734ed46875b9093avboxsync pMod->pvDbgPriv = pThis;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync }
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (fImgVt)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync {
d90eec53c9dcaa0f3d1054e8734ed46875b9093avboxsync Assert(!pMod->pImgVt);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pMod->pImgVt = &g_rtDbgModVtImgDeferred;
d90eec53c9dcaa0f3d1054e8734ed46875b9093avboxsync pMod->pvImgPriv = pThis;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync }
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync }
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync }
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync else
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = VERR_DBG_DEFERRED_LOAD_FAILED;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync RTCritSectLeave(&pMod->CritSect);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return rc;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync}
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/*
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync *
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * D e b u g I n f o M e t h o d s
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * D e b u g I n f o M e t h o d s
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * D e b u g I n f o M e t h o d s
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync *
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTDBG,pfnLineByAddr} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredDbg_LineByAddr(PRTDBGMODINT pMod, RTDBGSEGIDX iSeg, RTUINTPTR off,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync PRTINTPTR poffDisp, PRTDBGLINE pLineInfo)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (RT_SUCCESS(rc))
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = pMod->pDbgVt->pfnLineByAddr(pMod, iSeg, off, poffDisp, pLineInfo);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return rc;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync}
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTDBG,pfnLineByOrdinal} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredDbg_LineByOrdinal(PRTDBGMODINT pMod, uint32_t iOrdinal, PRTDBGLINE pLineInfo)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (RT_SUCCESS(rc))
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = pMod->pDbgVt->pfnLineByOrdinal(pMod, iOrdinal, pLineInfo);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return rc;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync}
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTDBG,pfnLineCount} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(uint32_t) rtDbgModDeferredDbg_LineCount(PRTDBGMODINT pMod)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (RT_SUCCESS(rc))
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return pMod->pDbgVt->pfnLineCount(pMod);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return 0;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync}
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTDBG,pfnLineAdd} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredDbg_LineAdd(PRTDBGMODINT pMod, const char *pszFile, size_t cchFile, uint32_t uLineNo,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync uint32_t iSeg, RTUINTPTR off, uint32_t *piOrdinal)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (RT_SUCCESS(rc))
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = pMod->pDbgVt->pfnLineAdd(pMod, pszFile, cchFile, uLineNo, iSeg, off, piOrdinal);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return rc;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync}
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/**
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * Fill in symbol info for the fake start symbol.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync *
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @returns VINF_SUCCESS
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @param pThis The deferred load data.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @param pSymInfo The output structure.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic int rtDbgModDeferredDbgSymInfo_Start(PRTDBGMODDEFERRED pThis, PRTDBGSYMBOL pSymInfo)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pSymInfo->Value = 0;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pSymInfo->cb = pThis->cbImage;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pSymInfo->offSeg = 0;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pSymInfo->iSeg = 0;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pSymInfo->fFlags = 0;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pSymInfo->iOrdinal = 0;
848a8a60f4429fb74d007753d6a2e588d38516dfvboxsync strcpy(pSymInfo->szName, "DeferredStart");
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return VINF_SUCCESS;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync}
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/**
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * Fill in symbol info for the fake last symbol.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync *
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @returns VINF_SUCCESS
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @param pThis The deferred load data.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @param pSymInfo The output structure.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic int rtDbgModDeferredDbgSymInfo_Last(PRTDBGMODDEFERRED pThis, PRTDBGSYMBOL pSymInfo)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pSymInfo->Value = pThis->cbImage - 1;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pSymInfo->cb = 0;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pSymInfo->offSeg = pThis->cbImage - 1;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pSymInfo->iSeg = 0;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pSymInfo->fFlags = 0;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pSymInfo->iOrdinal = 1;
848a8a60f4429fb74d007753d6a2e588d38516dfvboxsync strcpy(pSymInfo->szName, "DeferredLast");
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return VINF_SUCCESS;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync}
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTDBG,pfnSymbolByAddr} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredDbg_SymbolByAddr(PRTDBGMODINT pMod, RTDBGSEGIDX iSeg, RTUINTPTR off, uint32_t fFlags,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync PRTINTPTR poffDisp, PRTDBGSYMBOL pSymInfo)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (RT_SUCCESS(rc))
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = pMod->pDbgVt->pfnSymbolByAddr(pMod, iSeg, off, fFlags, poffDisp, pSymInfo);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync else
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync {
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync PRTDBGMODDEFERRED pThis = (PRTDBGMODDEFERRED)pMod->pvDbgPriv;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (off == 0)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = rtDbgModDeferredDbgSymInfo_Start(pThis, pSymInfo);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync else if (off >= pThis->cbImage - 1 || (fFlags & RTDBGSYMADDR_FLAGS_GREATER_OR_EQUAL))
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = rtDbgModDeferredDbgSymInfo_Last(pThis, pSymInfo);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync else
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = rtDbgModDeferredDbgSymInfo_Start(pThis, pSymInfo);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (poffDisp)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync *poffDisp = off - pSymInfo->offSeg;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync }
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return rc;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync}
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTDBG,pfnSymbolByName} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredDbg_SymbolByName(PRTDBGMODINT pMod, const char *pszSymbol, size_t cchSymbol,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync PRTDBGSYMBOL pSymInfo)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (RT_SUCCESS(rc))
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = pMod->pDbgVt->pfnSymbolByName(pMod, pszSymbol, cchSymbol, pSymInfo);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync else
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync {
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync PRTDBGMODDEFERRED pThis = (PRTDBGMODDEFERRED)pMod->pvDbgPriv;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if ( cchSymbol == sizeof("DeferredStart") - 1
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync && !memcmp(pszSymbol, RT_STR_TUPLE("DeferredStart")))
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = rtDbgModDeferredDbgSymInfo_Start(pThis, pSymInfo);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync else if ( cchSymbol == sizeof("DeferredLast") - 1
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync && !memcmp(pszSymbol, RT_STR_TUPLE("DeferredLast")))
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = rtDbgModDeferredDbgSymInfo_Last(pThis, pSymInfo);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync else
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = VERR_SYMBOL_NOT_FOUND;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync }
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return rc;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync}
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTDBG,pfnSymbolByOrdinal} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredDbg_SymbolByOrdinal(PRTDBGMODINT pMod, uint32_t iOrdinal, PRTDBGSYMBOL pSymInfo)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (RT_SUCCESS(rc))
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = pMod->pDbgVt->pfnSymbolByOrdinal(pMod, iOrdinal, pSymInfo);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync else
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync {
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync PRTDBGMODDEFERRED pThis = (PRTDBGMODDEFERRED)pMod->pvDbgPriv;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (iOrdinal == 0)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = rtDbgModDeferredDbgSymInfo_Start(pThis, pSymInfo);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync else if (iOrdinal == 1)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = rtDbgModDeferredDbgSymInfo_Last(pThis, pSymInfo);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync else
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = VERR_SYMBOL_NOT_FOUND;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync }
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return rc;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync}
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTDBG,pfnSymbolCount} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(uint32_t) rtDbgModDeferredDbg_SymbolCount(PRTDBGMODINT pMod)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (RT_SUCCESS(rc))
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return pMod->pDbgVt->pfnSymbolCount(pMod);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return 2;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync}
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTDBG,pfnSymbolAdd} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredDbg_SymbolAdd(PRTDBGMODINT pMod, const char *pszSymbol, size_t cchSymbol,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync RTDBGSEGIDX iSeg, RTUINTPTR off, RTUINTPTR cb, uint32_t fFlags,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync uint32_t *piOrdinal)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (RT_SUCCESS(rc))
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = pMod->pDbgVt->pfnSymbolAdd(pMod, pszSymbol, cchSymbol, iSeg, off, cb, fFlags, piOrdinal);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return rc;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync}
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTDBG,pfnSegmentByIndex} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredDbg_SegmentByIndex(PRTDBGMODINT pMod, RTDBGSEGIDX iSeg, PRTDBGSEGMENT pSegInfo)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (RT_SUCCESS(rc))
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = pMod->pDbgVt->pfnSegmentByIndex(pMod, iSeg, pSegInfo);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync else if (iSeg == 0)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync {
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync PRTDBGMODDEFERRED pThis = (PRTDBGMODDEFERRED)pMod->pvDbgPriv;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pSegInfo->Address = 0;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pSegInfo->uRva = 0;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pSegInfo->cb = pThis->cbImage;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pSegInfo->fFlags = 0;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pSegInfo->iSeg = 0;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync memcpy(pSegInfo->szName, RT_STR_TUPLE("LATER"));
e9684b4f760eb8ec77e3883dd2e3c42db9d7cc80vboxsync rc = VINF_SUCCESS;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync }
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync else
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = VERR_DBG_INVALID_SEGMENT_INDEX;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return rc;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync}
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTDBG,pfnSegmentCount} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(RTDBGSEGIDX) rtDbgModDeferredDbg_SegmentCount(PRTDBGMODINT pMod)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (RT_SUCCESS(rc))
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return pMod->pDbgVt->pfnSegmentCount(pMod);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return 1;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync}
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTDBG,pfnSegmentAdd} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredDbg_SegmentAdd(PRTDBGMODINT pMod, RTUINTPTR uRva, RTUINTPTR cb, const char *pszName,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync size_t cchName, uint32_t fFlags, PRTDBGSEGIDX piSeg)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (RT_SUCCESS(rc))
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = pMod->pDbgVt->pfnSegmentAdd(pMod, uRva, cb, pszName, cchName, fFlags, piSeg);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return rc;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync}
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTDBG,pfnImageSize} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(RTUINTPTR) rtDbgModDeferredDbg_ImageSize(PRTDBGMODINT pMod)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync PRTDBGMODDEFERRED pThis = (PRTDBGMODDEFERRED)pMod->pvDbgPriv;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return pThis->cbImage;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync}
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTDBG,pfnRvaToSegOff} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(RTDBGSEGIDX) rtDbgModDeferredDbg_RvaToSegOff(PRTDBGMODINT pMod, RTUINTPTR uRva, PRTUINTPTR poffSeg)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (RT_SUCCESS(rc))
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return pMod->pDbgVt->pfnRvaToSegOff(pMod, uRva, poffSeg);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return 0;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync}
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTDBG,pfnClose} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredDbg_Close(PRTDBGMODINT pMod)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rtDbgModDeferredReleaseInstanceData((PRTDBGMODDEFERRED)pMod->pvImgPriv);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return VINF_SUCCESS;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync}
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTDBG,pfnTryOpen} */
d1e9999d55e7ac80a28692c161710be98071fc00vboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredDbg_TryOpen(PRTDBGMODINT pMod, RTLDRARCH enmArch)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync NOREF(enmArch);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return rtDbgModDeferredDoIt(pMod, true /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync}
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** Virtual function table for the deferred debug info reader. */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncDECL_HIDDEN_CONST(RTDBGMODVTDBG) const g_rtDbgModVtDbgDeferred =
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.u32Magic = */ RTDBGMODVTDBG_MAGIC,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.fSupports = */ RT_DBGTYPE_MAP,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pszName = */ "deferred",
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnTryOpen = */ rtDbgModDeferredDbg_TryOpen,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnClose = */ rtDbgModDeferredDbg_Close,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnRvaToSegOff = */ rtDbgModDeferredDbg_RvaToSegOff,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnImageSize = */ rtDbgModDeferredDbg_ImageSize,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnSegmentAdd = */ rtDbgModDeferredDbg_SegmentAdd,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnSegmentCount = */ rtDbgModDeferredDbg_SegmentCount,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnSegmentByIndex = */ rtDbgModDeferredDbg_SegmentByIndex,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnSymbolAdd = */ rtDbgModDeferredDbg_SymbolAdd,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnSymbolCount = */ rtDbgModDeferredDbg_SymbolCount,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnSymbolByOrdinal = */ rtDbgModDeferredDbg_SymbolByOrdinal,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnSymbolByName = */ rtDbgModDeferredDbg_SymbolByName,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnSymbolByAddr = */ rtDbgModDeferredDbg_SymbolByAddr,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnLineAdd = */ rtDbgModDeferredDbg_LineAdd,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnLineCount = */ rtDbgModDeferredDbg_LineCount,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnLineByOrdinal = */ rtDbgModDeferredDbg_LineByOrdinal,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnLineByAddr = */ rtDbgModDeferredDbg_LineByAddr,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.u32EndMagic = */ RTDBGMODVTDBG_MAGIC
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync};
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/*
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync *
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * I m a g e M e t h o d s
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * I m a g e M e t h o d s
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * I m a g e M e t h o d s
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync *
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync/** @interface_method_impl{RTDBGMODVTIMG,pfnQueryProp} */
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsyncstatic DECLCALLBACK(int ) rtDbgModDeferredImg_QueryProp(PRTDBGMODINT pMod, RTLDRPROP enmProp, void *pvBuf, size_t cbBuf)
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync{
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync if (RT_SUCCESS(rc))
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync rc = pMod->pImgVt->pfnQueryProp(pMod, enmProp, pvBuf, cbBuf);
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync return rc;
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync}
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync/** @interface_method_impl{RTDBGMODVTIMG,pfnGetArch} */
d1e9999d55e7ac80a28692c161710be98071fc00vboxsyncstatic DECLCALLBACK(RTLDRARCH) rtDbgModDeferredImg_GetArch(PRTDBGMODINT pMod)
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync{
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync RTLDRARCH enmArch;
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync if (RT_SUCCESS(rc))
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync enmArch = pMod->pImgVt->pfnGetArch(pMod);
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync else
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync enmArch = RTLDRARCH_WHATEVER;
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync return enmArch;
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync}
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync/** @interface_method_impl{RTDBGMODVTIMG,pfnGetFormat} */
6ba706e9f431401d425d16817fdcd6316f83b584vboxsyncstatic DECLCALLBACK(RTLDRFMT) rtDbgModDeferredImg_GetFormat(PRTDBGMODINT pMod)
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync{
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync RTLDRFMT enmFmt;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync if (RT_SUCCESS(rc))
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync enmFmt = pMod->pImgVt->pfnGetFormat(pMod);
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync else
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync enmFmt = RTLDRFMT_INVALID;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync return enmFmt;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync}
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync/** @interface_method_impl{RTDBGMODVTIMG,pfnReadAt} */
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredImg_ReadAt(PRTDBGMODINT pMod, uint32_t iDbgInfoHint, RTFOFF off, void *pvBuf, size_t cb)
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync{
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync if (RT_SUCCESS(rc))
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync rc = pMod->pImgVt->pfnReadAt(pMod, iDbgInfoHint, off, pvBuf, cb);
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync return rc;
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync}
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTIMG,pfnUnmapPart} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredImg_UnmapPart(PRTDBGMODINT pMod, size_t cb, void const **ppvMap)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (RT_SUCCESS(rc))
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = pMod->pImgVt->pfnUnmapPart(pMod, cb, ppvMap);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return rc;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync}
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTIMG,pfnMapPart} */
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredImg_MapPart(PRTDBGMODINT pMod, uint32_t iDbgInfo, RTFOFF off, size_t cb, void const **ppvMap)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (RT_SUCCESS(rc))
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync rc = pMod->pImgVt->pfnMapPart(pMod, iDbgInfo, off, cb, ppvMap);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return rc;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync}
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTIMG,pfnImageSize} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(RTUINTPTR) rtDbgModDeferredImg_ImageSize(PRTDBGMODINT pMod)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync PRTDBGMODDEFERRED pThis = (PRTDBGMODDEFERRED)pMod->pvImgPriv;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return pThis->cbImage;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync}
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync/** @interface_method_impl{RTDBGMODVTIMG,pfnRvaToSegOffset} */
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredImg_RvaToSegOffset(PRTDBGMODINT pMod, RTLDRADDR uRva,
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync PRTDBGSEGIDX piSeg, PRTLDRADDR poffSeg)
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync{
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync if (RT_SUCCESS(rc))
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync rc = pMod->pImgVt->pfnRvaToSegOffset(pMod, uRva, piSeg, poffSeg);
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync return rc;
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync}
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTIMG,pfnLinkAddressToSegOffset} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredImg_LinkAddressToSegOffset(PRTDBGMODINT pMod, RTLDRADDR LinkAddress,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync PRTDBGSEGIDX piSeg, PRTLDRADDR poffSeg)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (RT_SUCCESS(rc))
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = pMod->pImgVt->pfnLinkAddressToSegOffset(pMod, LinkAddress, piSeg, poffSeg);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return rc;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync}
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
abe1b07126bb9f5644b2ad8424534c2d1e97a66cvboxsync/** @interface_method_impl{RTDBGMODVTIMG,pfnEnumSymbols} */
abe1b07126bb9f5644b2ad8424534c2d1e97a66cvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredImg_EnumSymbols(PRTDBGMODINT pMod, uint32_t fFlags, RTLDRADDR BaseAddress,
abe1b07126bb9f5644b2ad8424534c2d1e97a66cvboxsync PFNRTLDRENUMSYMS pfnCallback, void *pvUser)
abe1b07126bb9f5644b2ad8424534c2d1e97a66cvboxsync{
abe1b07126bb9f5644b2ad8424534c2d1e97a66cvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
abe1b07126bb9f5644b2ad8424534c2d1e97a66cvboxsync if (RT_SUCCESS(rc))
abe1b07126bb9f5644b2ad8424534c2d1e97a66cvboxsync rc = pMod->pImgVt->pfnEnumSymbols(pMod, fFlags, BaseAddress, pfnCallback, pvUser);
abe1b07126bb9f5644b2ad8424534c2d1e97a66cvboxsync return rc;
abe1b07126bb9f5644b2ad8424534c2d1e97a66cvboxsync}
abe1b07126bb9f5644b2ad8424534c2d1e97a66cvboxsync
abe1b07126bb9f5644b2ad8424534c2d1e97a66cvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTIMG,pfnEnumSegments} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredImg_EnumSegments(PRTDBGMODINT pMod, PFNRTLDRENUMSEGS pfnCallback, void *pvUser)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (RT_SUCCESS(rc))
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = pMod->pImgVt->pfnEnumSegments(pMod, pfnCallback, pvUser);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return rc;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync}
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTIMG,pfnEnumDbgInfo} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredImg_EnumDbgInfo(PRTDBGMODINT pMod, PFNRTLDRENUMDBG pfnCallback, void *pvUser)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (RT_SUCCESS(rc))
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = pMod->pImgVt->pfnEnumDbgInfo(pMod, pfnCallback, pvUser);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return rc;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync}
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTIMG,pfnClose} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredImg_Close(PRTDBGMODINT pMod)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rtDbgModDeferredReleaseInstanceData((PRTDBGMODDEFERRED)pMod->pvImgPriv);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return VINF_SUCCESS;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync}
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTIMG,pfnTryOpen} */
6ba706e9f431401d425d16817fdcd6316f83b584vboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredImg_TryOpen(PRTDBGMODINT pMod, RTLDRARCH enmArch)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync NOREF(enmArch);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return rtDbgModDeferredDoIt(pMod, true /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync}
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** Virtual function table for the RTLdr based image reader. */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncDECL_HIDDEN_CONST(RTDBGMODVTIMG) const g_rtDbgModVtImgDeferred =
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.u32Magic = */ RTDBGMODVTIMG_MAGIC,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.fReserved = */ 0,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pszName = */ "deferred",
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnTryOpen = */ rtDbgModDeferredImg_TryOpen,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnClose = */ rtDbgModDeferredImg_Close,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnEnumDbgInfo = */ rtDbgModDeferredImg_EnumDbgInfo,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnEnumSegments = */ rtDbgModDeferredImg_EnumSegments,
abe1b07126bb9f5644b2ad8424534c2d1e97a66cvboxsync /*.pfnEnumSymbols = */ rtDbgModDeferredImg_EnumSymbols,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnGetLoadedSize = */ rtDbgModDeferredImg_ImageSize,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnLinkAddressToSegOffset = */ rtDbgModDeferredImg_LinkAddressToSegOffset,
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync /*.pfnRvaToSegOffset = */ rtDbgModDeferredImg_RvaToSegOffset,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnMapPart = */ rtDbgModDeferredImg_MapPart,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnUnmapPart = */ rtDbgModDeferredImg_UnmapPart,
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync /*.pfnReadAt = */ rtDbgModDeferredImg_ReadAt,
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync /*.pfnGetFormat = */ rtDbgModDeferredImg_GetFormat,
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync /*.pfnGetArch = */ rtDbgModDeferredImg_GetArch,
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync /*.pfnQueryProp = */ rtDbgModDeferredImg_QueryProp,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.u32EndMagic = */ RTDBGMODVTIMG_MAGIC
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync};
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/**
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * Creates a deferred loading stub for both image and debug info.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync *
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @returns IPRT status code.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @param pDbgMod The debug module.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @param pfnDeferred The callback that will try load the image and
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * debug info.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @param cbImage The size of the image.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @param hDbgCfg The debug config handle. Can be NIL. A
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * reference will be retained.
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync * @param cbDeferred The size of the deferred instance data, 0 if the
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync * default structure is good enough.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @param ppDeferred Where to return the instance data. Can be NULL.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncDECLHIDDEN(int) rtDbgModDeferredCreate(PRTDBGMODINT pDbgMod, PFNRTDBGMODDEFERRED pfnDeferred, RTUINTPTR cbImage,
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync RTDBGCFG hDbgCfg, size_t cbDeferred, PRTDBGMODDEFERRED *ppDeferred)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync AssertReturn(!pDbgMod->pDbgVt, VERR_DBG_MOD_IPE);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync if (cbDeferred < sizeof(RTDBGMODDEFERRED))
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync cbDeferred = sizeof(RTDBGMODDEFERRED);
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync PRTDBGMODDEFERRED pDeferred = (PRTDBGMODDEFERRED)RTMemAllocZ(cbDeferred);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (!pDeferred)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return VERR_NO_MEMORY;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pDeferred->cbImage = cbImage;
d90eec53c9dcaa0f3d1054e8734ed46875b9093avboxsync pDeferred->cRefs = 1 + (pDbgMod->pImgVt == NULL);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (hDbgCfg != NIL_RTDBGCFG)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync RTDbgCfgRetain(hDbgCfg);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pDeferred->hDbgCfg = hDbgCfg;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync pDeferred->pfnDeferred = pfnDeferred;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
d90eec53c9dcaa0f3d1054e8734ed46875b9093avboxsync pDbgMod->pDbgVt = &g_rtDbgModVtDbgDeferred;
d90eec53c9dcaa0f3d1054e8734ed46875b9093avboxsync pDbgMod->pvDbgPriv = pDeferred;
d90eec53c9dcaa0f3d1054e8734ed46875b9093avboxsync if (!pDbgMod->pImgVt)
d90eec53c9dcaa0f3d1054e8734ed46875b9093avboxsync {
d90eec53c9dcaa0f3d1054e8734ed46875b9093avboxsync pDbgMod->pImgVt = &g_rtDbgModVtImgDeferred;
d90eec53c9dcaa0f3d1054e8734ed46875b9093avboxsync pDbgMod->pvImgPriv = pDeferred;
d90eec53c9dcaa0f3d1054e8734ed46875b9093avboxsync }
d90eec53c9dcaa0f3d1054e8734ed46875b9093avboxsync pDbgMod->fDeferred = true;
d90eec53c9dcaa0f3d1054e8734ed46875b9093avboxsync pDbgMod->fDeferredFailed = false;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync if (ppDeferred)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync *ppDeferred = pDeferred;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return VINF_SUCCESS;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync}
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync