ldrkStuff.cpp revision 5b0a093ca572a855886faa6747ad46df859dd041
5b281ba489ca18f0380d7efc7a5108b606cce449vboxsync * IPRT - Binary Image Loader, kLdr Interface.
e64031e20c39650a7bc902a3e1aba613b9415deevboxsync * Copyright (C) 2006-2007 Oracle Corporation
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * available from http://www.virtualbox.org. This file is free software;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * The contents of this file may alternatively be used under the terms
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * of the Common Development and Distribution License Version 1.0
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution, in which case the provisions of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * CDDL are applicable instead of those of the GPL.
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * You may elect to license modified versions of this file under the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * terms and conditions of either the GPL or the CDDL or both.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/*******************************************************************************
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync* Header Files *
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync*******************************************************************************/
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/*******************************************************************************
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync* Structures and Typedefs *
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync*******************************************************************************/
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * kLdr file provider.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsynctypedef struct RTKLDRRDR
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** The core. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** The IPRT bit reader. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * IPRT module.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsynctypedef struct RTLDRMODKLDR
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** The Core module structure. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** The kLdr module. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Arguments for a RTLDRMODKLDR callback wrapper.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync const void *pvBits;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Converts a kLdr error code to an IPRT one.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KERR_INVALID_PARAMETER: return VERR_INVALID_PARAMETER;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KERR_INVALID_HANDLE: return VERR_INVALID_HANDLE;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_MZ_NOT_SUPPORTED: return VERR_MZ_EXE_NOT_SUPPORTED;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_NE_NOT_SUPPORTED: return VERR_NE_EXE_NOT_SUPPORTED;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_LX_NOT_SUPPORTED: return VERR_LX_EXE_NOT_SUPPORTED;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_LE_NOT_SUPPORTED: return VERR_LE_EXE_NOT_SUPPORTED;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_PE_NOT_SUPPORTED: return VERR_PE_EXE_NOT_SUPPORTED;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_ELF_NOT_SUPPORTED: return VERR_ELF_EXE_NOT_SUPPORTED;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_MACHO_NOT_SUPPORTED: return VERR_INVALID_EXE_SIGNATURE;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_AOUT_NOT_SUPPORTED: return VERR_AOUT_EXE_NOT_SUPPORTED;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_MODULE_NOT_FOUND: return VERR_MODULE_NOT_FOUND;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_PREREQUISITE_MODULE_NOT_FOUND: return VERR_MODULE_NOT_FOUND;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_MAIN_STACK_ALLOC_FAILED: return VERR_NO_MEMORY;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KERR_BUFFER_OVERFLOW: return VERR_BUFFER_OVERFLOW;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_SYMBOL_NOT_FOUND: return VERR_SYMBOL_NOT_FOUND;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_FORWARDER_SYMBOL: return VERR_BAD_EXE_FORMAT;
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync case KLDR_ERR_BAD_FIXUP: AssertMsgFailedReturn(("KLDR_ERR_BAD_FIXUP\n"), VERR_BAD_EXE_FORMAT);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_IMPORT_ORDINAL_OUT_OF_BOUNDS: return VERR_BAD_EXE_FORMAT;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_NO_DEBUG_INFO: return VERR_FILE_NOT_FOUND;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_ALREADY_MAPPED: return VERR_WRONG_ORDER;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_ADDRESS_OVERFLOW: return VERR_NUMBER_TOO_BIG;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_PREREQUISITE_MODULE_INIT_FAILED_ALREADY:
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync AssertMsgFailedReturn(("krc=%d (%#x): %s\n", krc, krc, kErrName(krc)), VERR_GENERAL_FAILURE);
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync AssertMsgFailedReturn(("krc=%d (%#x): %s\n", krc, krc, kErrName(krc)), VERR_GENERAL_FAILURE);
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync AssertMsgFailedReturn(("krc=%d (%#x): %s\n", krc, krc, kErrName(krc)), VERR_GENERAL_FAILURE);
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync AssertMsgFailedReturn(("krc=%d (%#x): %s\n", krc, krc, kErrName(krc)), VERR_GENERAL_FAILURE);
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync AssertMsgFailedReturn(("krc=%d (%#x): %s\n", krc, krc, kErrName(krc)), VERR_NO_TRANSLATION);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Converts a IPRT error code to an kLdr one.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case VERR_INVALID_PARAMETER: return KERR_INVALID_PARAMETER;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case VERR_INVALID_HANDLE: return KERR_INVALID_HANDLE;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case VERR_BUFFER_OVERFLOW: return KERR_BUFFER_OVERFLOW;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnCreate
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @remark This is a dummy which isn't used. */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic int rtkldrRdr_Create( PPKRDR ppRdr, const char *pszFilename)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnDestroy */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnRead */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic int rtkldrRdr_Read( PKRDR pRdr, void *pvBuf, KSIZE cb, KFOFF off)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync int rc = pReader->pfnRead(pReader, pvBuf, cb, off);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnAllMap */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic int rtkldrRdr_AllMap( PKRDR pRdr, const void **ppvBits)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnAllUnmap */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic int rtkldrRdr_AllUnmap(PKRDR pRdr, const void *pvBits)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnSize */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnTell */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnName */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnNativeFH */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnPageSize */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnMap */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic int rtkldrRdr_Map( PKRDR pRdr, void **ppvBase, KU32 cSegments, PCKLDRSEG paSegments, KBOOL fFixed)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync //PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnRefresh */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic int rtkldrRdr_Refresh( PKRDR pRdr, void *pvBase, KU32 cSegments, PCKLDRSEG paSegments)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync //PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnProtect */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic int rtkldrRdr_Protect( PKRDR pRdr, void *pvBase, KU32 cSegments, PCKLDRSEG paSegments, KBOOL fUnprotectOrProtect)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync //PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnUnmap */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic int rtkldrRdr_Unmap( PKRDR pRdr, void *pvBase, KU32 cSegments, PCKLDRSEG paSegments)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync //PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnDone */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync //PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * The file reader operations.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * We provide our own based on IPRT instead of using the kLdr ones.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc RTLDROPS::pfnClose */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic DECLCALLBACK(int) rtkldr_Close(PRTLDRMODINTERNAL pMod)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc RTLDROPS::pfnDone */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic DECLCALLBACK(int) rtkldr_Done(PRTLDRMODINTERNAL pMod)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc FNKLDRMODENUMSYMS */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic int rtkldrEnumSymbolsWrapper(PKLDRMOD pMod, uint32_t iSymbol,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync const char *pchSymbol, KSIZE cchSymbol, const char *pszVersion,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PRTLDRMODKLDRARGS pArgs = (PRTLDRMODKLDRARGS)pvUser;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* If not zero terminated we'll have to use a temporary buffer. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* skip the underscore prefix. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync int rc = pArgs->u.pfnEnumSyms(&pArgs->pMod->Core, pszSymbol, iSymbol, uValue, pArgs->pvUser);
5b0a093ca572a855886faa6747ad46df859dd041vboxsync/** @copydoc RTLDROPS::pfnEnumSymbols */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic DECLCALLBACK(int) rtkldr_EnumSymbols(PRTLDRMODINTERNAL pMod, unsigned fFlags, const void *pvBits, RTUINTPTR BaseAddress,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync int rc = kLdrModEnumSymbols(pModkLdr, pvBits, BaseAddress,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync fFlags & RTLDR_ENUM_SYMBOL_FLAGS_ALL ? KLDRMOD_ENUM_SYMS_FLAGS_ALL : 0,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync/** @copydoc RTLDROPS::pfnGetImageSize */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic DECLCALLBACK(size_t) rtkldr_GetImageSize(PRTLDRMODINTERNAL pMod)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc FNKLDRMODGETIMPORT */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic int rtkldrGetImportWrapper(PKLDRMOD pMod, uint32_t iImport, uint32_t iSymbol, const char *pchSymbol, KSIZE cchSymbol,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync const char *pszVersion, PKLDRADDR puValue, uint32_t *pfKind, void *pvUser)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PRTLDRMODKLDRARGS pArgs = (PRTLDRMODKLDRARGS)pvUser;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* If not zero terminated we'll have to use a temporary buffer. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* skip the underscore prefix. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* get the import module name - TODO: cache this */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync int rc = kLdrModGetImport(pMod, pArgs->pvBits, iImport, pszBuf, 64);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* do the query */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync int rc = pArgs->u.pfnGetImport(&pArgs->pMod->Core, pszModule, pszSymbol, pszSymbol ? ~0 : iSymbol, &Value, pArgs->pvUser);
5b0a093ca572a855886faa6747ad46df859dd041vboxsync/** @copydoc RTLDROPS::pfnGetBits */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic DECLCALLBACK(int) rtkldr_GetBits(PRTLDRMODINTERNAL pMod, void *pvBits, RTUINTPTR BaseAddress,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync int rc = kLdrModGetBits(pModkLdr, pvBits, BaseAddress, rtkldrGetImportWrapper, &Args);
5b0a093ca572a855886faa6747ad46df859dd041vboxsync/** @copydoc RTLDROPS::pfnRelocate */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic DECLCALLBACK(int) rtkldr_Relocate(PRTLDRMODINTERNAL pMod, void *pvBits, RTUINTPTR NewBaseAddress,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync RTUINTPTR OldBaseAddress, PFNRTLDRIMPORT pfnGetImport, void *pvUser)
5b0a093ca572a855886faa6747ad46df859dd041vboxsync int rc = kLdrModRelocateBits(pModkLdr, pvBits, NewBaseAddress, OldBaseAddress, rtkldrGetImportWrapper, &Args);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc RTLDROPS::pfnGetSymbolEx */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic DECLCALLBACK(int) rtkldr_GetSymbolEx(PRTLDRMODINTERNAL pMod, const void *pvBits, RTUINTPTR BaseAddress,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Add underscore prefix.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync int rc = kLdrModQuerySymbol(pModkLdr, pvBits, BaseAddress,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync NIL_KLDRMOD_SYM_ORDINAL, pszSymbol, strlen(pszSymbol), NULL,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync/** @copydoc FNKLDRENUMDBG */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic int rtkldrEnumDbgInfoWrapper(PKLDRMOD pMod, KU32 iDbgInfo, KLDRDBGINFOTYPE enmType, KI16 iMajorVer, KI16 iMinorVer,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync const char *pszPartNm, KLDRFOFF offFile, KLDRADDR LinkAddress, KLDRSIZE cb,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync PRTLDRMODKLDRARGS pArgs = (PRTLDRMODKLDRARGS)pvUser;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync case KLDRDBGINFOTYPE_UNKNOWN: enmMyType = RTLDRDBGINFOTYPE_UNKNOWN; break;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync case KLDRDBGINFOTYPE_STABS: enmMyType = RTLDRDBGINFOTYPE_STABS; break;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync case KLDRDBGINFOTYPE_DWARF: enmMyType = RTLDRDBGINFOTYPE_DWARF; break;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync case KLDRDBGINFOTYPE_CODEVIEW: enmMyType = RTLDRDBGINFOTYPE_CODEVIEW; break;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync case KLDRDBGINFOTYPE_WATCOM: enmMyType = RTLDRDBGINFOTYPE_WATCOM; break;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync case KLDRDBGINFOTYPE_HLL: enmMyType = RTLDRDBGINFOTYPE_HLL; break;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync int rc = pArgs->u.pfnEnumDbgInfo(&pArgs->pMod->Core, iDbgInfo, enmMyType, iMajorVer, iMinorVer, pszPartNm,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync offFile, LinkAddress, cb, pszExtFile, pArgs->pvUser);
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync/** @copydoc RTLDROPS::pfnEnumDbgInfo */
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsyncstatic DECLCALLBACK(int) rtkldr_EnumDbgInfo(PRTLDRMODINTERNAL pMod, const void *pvBits,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync int rc = kLdrModEnumDbgInfo(pThis->pMod, pvBits, rtkldrEnumDbgInfoWrapper, &Args);
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * Operations for a kLdr module.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Open a image using kLdr.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @returns iprt status code.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param pReader The loader reader instance which will provide the raw image bits.
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync * @param fFlags Reserved, MBZ.
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync * @param enmArch CPU architecture specifier for the image to be loaded.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param phLdrMod Where to store the handle.
6c2750d8e30830bf114880ca33922b108ab3e942vboxsyncint rtldrkLdrOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod)
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync /* Convert enmArch to k-speak. */
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /* Create a rtkldrRdr_ instance. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PRTKLDRRDR pRdr = (PRTKLDRRDR)RTMemAllocZ(sizeof(*pRdr));
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* Try open it. */
35327b0d3e16d29246883d9ffe93d54cb3a47e36vboxsync int krc = kLdrModOpenFromRdr(&pRdr->Core, fFlags, enmCpuArch, &pMod);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* Create a module wrapper for it. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PRTLDRMODKLDR pNewMod = (PRTLDRMODKLDR)RTMemAllocZ(sizeof(*pNewMod));
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync pMod->pszName, pMod->pszFilename, pMod->cSegments));
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync for (unsigned iSeg = 0; iSeg < pMod->cSegments; iSeg++)
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync Log(("Segment #%-2u: RVA=%08llx cb=%08llx '%.*s'\n", iSeg,