dbgmoddeferred.cpp revision daa94352f51be2329ac8660f70396e03a7cb983b
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * IPRT - Debug Module Deferred Loading Stub.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * Copyright (C) 2013 Oracle Corporation
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 * 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 * 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* Header Files *
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync*******************************************************************************/
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * Releases the instance data.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @param pThis The instance data.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic void rtDbgModDeferredReleaseInstanceData(PRTDBGMODDEFERRED pThis)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync uint32_t cRefs = ASMAtomicDecU32(&pThis->cRefs); Assert(cRefs < 8);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * Does the deferred loading of the real data (image and/or debug info).
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.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic int rtDbgModDeferredDoIt(PRTDBGMODINT pMod, bool fForcedRetry)
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 PRTDBGMODDEFERRED pThis = (PRTDBGMODDEFERRED)(fDbgVt ? pMod->pvDbgPriv : pMod->pvImgPriv);
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 /* Do the deferred loading. */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /* Failed, bail out and restore the deferred setup. */
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/** @interface_method_impl{RTDBGMODVTDBG,pfnLineByAddr} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredDbg_LineByAddr(PRTDBGMODINT pMod, RTDBGSEGIDX iSeg, RTUINTPTR off,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = pMod->pDbgVt->pfnLineByAddr(pMod, iSeg, off, poffDisp, pLineInfo);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTDBG,pfnLineByOrdinal} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredDbg_LineByOrdinal(PRTDBGMODINT pMod, uint32_t iOrdinal, PRTDBGLINE pLineInfo)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = pMod->pDbgVt->pfnLineByOrdinal(pMod, iOrdinal, pLineInfo);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTDBG,pfnLineCount} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(uint32_t) rtDbgModDeferredDbg_LineCount(PRTDBGMODINT pMod)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTDBG,pfnLineAdd} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredDbg_LineAdd(PRTDBGMODINT pMod, const char *pszFile, size_t cchFile, uint32_t uLineNo,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = pMod->pDbgVt->pfnLineAdd(pMod, pszFile, cchFile, uLineNo, iSeg, off, piOrdinal);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * Fill in symbol info for the fake start symbol.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @returns VINF_SUCCESS
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @param pThis The deferred load data.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @param pSymInfo The output structure.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic int rtDbgModDeferredDbgSymInfo_Start(PRTDBGMODDEFERRED pThis, PRTDBGSYMBOL pSymInfo)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync memcpy(pSymInfo->szName, RT_STR_TUPLE("DeferredStart"));
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * Fill in symbol info for the fake last symbol.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @returns VINF_SUCCESS
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @param pThis The deferred load data.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @param pSymInfo The output structure.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic int rtDbgModDeferredDbgSymInfo_Last(PRTDBGMODDEFERRED pThis, PRTDBGSYMBOL pSymInfo)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync memcpy(pSymInfo->szName, RT_STR_TUPLE("DeferredLast"));
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTDBG,pfnSymbolByAddr} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredDbg_SymbolByAddr(PRTDBGMODINT pMod, RTDBGSEGIDX iSeg, RTUINTPTR off, uint32_t fFlags,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = pMod->pDbgVt->pfnSymbolByAddr(pMod, iSeg, off, fFlags, poffDisp, pSymInfo);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync PRTDBGMODDEFERRED pThis = (PRTDBGMODDEFERRED)pMod->pvDbgPriv;
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 rc = rtDbgModDeferredDbgSymInfo_Start(pThis, pSymInfo);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTDBG,pfnSymbolByName} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredDbg_SymbolByName(PRTDBGMODINT pMod, const char *pszSymbol, size_t cchSymbol,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = pMod->pDbgVt->pfnSymbolByName(pMod, pszSymbol, cchSymbol, pSymInfo);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync PRTDBGMODDEFERRED pThis = (PRTDBGMODDEFERRED)pMod->pvDbgPriv;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync && !memcmp(pszSymbol, RT_STR_TUPLE("DeferredStart")))
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = rtDbgModDeferredDbgSymInfo_Start(pThis, pSymInfo);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync && !memcmp(pszSymbol, RT_STR_TUPLE("DeferredLast")))
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = rtDbgModDeferredDbgSymInfo_Last(pThis, pSymInfo);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTDBG,pfnSymbolByOrdinal} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredDbg_SymbolByOrdinal(PRTDBGMODINT pMod, uint32_t iOrdinal, PRTDBGSYMBOL pSymInfo)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = pMod->pDbgVt->pfnSymbolByOrdinal(pMod, iOrdinal, pSymInfo);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync PRTDBGMODDEFERRED pThis = (PRTDBGMODDEFERRED)pMod->pvDbgPriv;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = rtDbgModDeferredDbgSymInfo_Start(pThis, pSymInfo);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = rtDbgModDeferredDbgSymInfo_Last(pThis, pSymInfo);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTDBG,pfnSymbolCount} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(uint32_t) rtDbgModDeferredDbg_SymbolCount(PRTDBGMODINT pMod)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
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 int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = pMod->pDbgVt->pfnSymbolAdd(pMod, pszSymbol, cchSymbol, iSeg, off, cb, fFlags, piOrdinal);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTDBG,pfnSegmentByIndex} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredDbg_SegmentByIndex(PRTDBGMODINT pMod, RTDBGSEGIDX iSeg, PRTDBGSEGMENT pSegInfo)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = pMod->pDbgVt->pfnSegmentByIndex(pMod, iSeg, pSegInfo);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync else if (iSeg == 0)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync PRTDBGMODDEFERRED pThis = (PRTDBGMODDEFERRED)pMod->pvDbgPriv;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTDBG,pfnSegmentCount} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(RTDBGSEGIDX) rtDbgModDeferredDbg_SegmentCount(PRTDBGMODINT pMod)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
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 int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = pMod->pDbgVt->pfnSegmentAdd(pMod, uRva, cb, pszName, cchName, fFlags, piSeg);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTDBG,pfnImageSize} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(RTUINTPTR) rtDbgModDeferredDbg_ImageSize(PRTDBGMODINT pMod)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync PRTDBGMODDEFERRED pThis = (PRTDBGMODDEFERRED)pMod->pvDbgPriv;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTDBG,pfnRvaToSegOff} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(RTDBGSEGIDX) rtDbgModDeferredDbg_RvaToSegOff(PRTDBGMODINT pMod, RTUINTPTR uRva, PRTUINTPTR poffSeg)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return pMod->pDbgVt->pfnRvaToSegOff(pMod, uRva, poffSeg);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTDBG,pfnClose} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredDbg_Close(PRTDBGMODINT pMod)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rtDbgModDeferredReleaseInstanceData((PRTDBGMODDEFERRED)pMod->pvImgPriv);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTDBG,pfnTryOpen} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredDbg_TryOpen(PRTDBGMODINT pMod)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return rtDbgModDeferredDoIt(pMod, true /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** Virtual function table for the deferred debug info reader. */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncDECL_HIDDEN_CONST(RTDBGMODVTDBG) const g_rtDbgModVtDbgDeferred =
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnRvaToSegOff = */ rtDbgModDeferredDbg_RvaToSegOff,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnImageSize = */ rtDbgModDeferredDbg_ImageSize,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnSegmentAdd = */ rtDbgModDeferredDbg_SegmentAdd,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnSegmentCount = */ rtDbgModDeferredDbg_SegmentCount,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnSegmentByIndex = */ rtDbgModDeferredDbg_SegmentByIndex,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnSymbolAdd = */ rtDbgModDeferredDbg_SymbolAdd,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnSymbolCount = */ rtDbgModDeferredDbg_SymbolCount,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnSymbolByOrdinal = */ rtDbgModDeferredDbg_SymbolByOrdinal,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnSymbolByName = */ rtDbgModDeferredDbg_SymbolByName,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnSymbolByAddr = */ rtDbgModDeferredDbg_SymbolByAddr,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnLineCount = */ rtDbgModDeferredDbg_LineCount,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnLineByOrdinal = */ rtDbgModDeferredDbg_LineByOrdinal,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnLineByAddr = */ rtDbgModDeferredDbg_LineByAddr,
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/** @interface_method_impl{RTDBGMODVTIMG,pfnUnmapPart} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredImg_UnmapPart(PRTDBGMODINT pMod, size_t cb, void const **ppvMap)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTIMG,pfnMapPart} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredImg_MapPart(PRTDBGMODINT pMod, RTFOFF off, size_t cb, void const **ppvMap)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = pMod->pImgVt->pfnMapPart(pMod, off, cb, ppvMap);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTIMG,pfnImageSize} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(RTUINTPTR) rtDbgModDeferredImg_ImageSize(PRTDBGMODINT pMod)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync PRTDBGMODDEFERRED pThis = (PRTDBGMODDEFERRED)pMod->pvImgPriv;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTIMG,pfnLinkAddressToSegOffset} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredImg_LinkAddressToSegOffset(PRTDBGMODINT pMod, RTLDRADDR LinkAddress,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = pMod->pImgVt->pfnLinkAddressToSegOffset(pMod, LinkAddress, piSeg, poffSeg);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTIMG,pfnEnumSegments} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredImg_EnumSegments(PRTDBGMODINT pMod, PFNRTLDRENUMSEGS pfnCallback, void *pvUser)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = pMod->pImgVt->pfnEnumSegments(pMod, pfnCallback, pvUser);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTIMG,pfnEnumDbgInfo} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredImg_EnumDbgInfo(PRTDBGMODINT pMod, PFNRTLDRENUMDBG pfnCallback, void *pvUser)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rc = pMod->pImgVt->pfnEnumDbgInfo(pMod, pfnCallback, pvUser);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTIMG,pfnClose} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredImg_Close(PRTDBGMODINT pMod)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync rtDbgModDeferredReleaseInstanceData((PRTDBGMODDEFERRED)pMod->pvImgPriv);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** @interface_method_impl{RTDBGMODVTIMG,pfnTryOpen} */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncstatic DECLCALLBACK(int) rtDbgModDeferredImg_TryOpen(PRTDBGMODINT pMod)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return rtDbgModDeferredDoIt(pMod, true /*fForceRetry*/);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/** Virtual function table for the RTLdr based image reader. */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncDECL_HIDDEN_CONST(RTDBGMODVTIMG) const g_rtDbgModVtImgDeferred =
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.fReserved = */ 0,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnEnumDbgInfo = */ rtDbgModDeferredImg_EnumDbgInfo,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnEnumSegments = */ rtDbgModDeferredImg_EnumSegments,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnGetLoadedSize = */ rtDbgModDeferredImg_ImageSize,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnLinkAddressToSegOffset = */ rtDbgModDeferredImg_LinkAddressToSegOffset,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /*.pfnUnmapPart = */ rtDbgModDeferredImg_UnmapPart,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * Creates a deferred loading stub for both image and debug info.
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.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @param ppDeferred Where to return the instance data. Can be NULL.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncDECLHIDDEN(int) rtDbgModDeferredCreate(PRTDBGMODINT pDbgMod, PFNRTDBGMODDEFERRED pfnDeferred, RTUINTPTR cbImage,