ldrEx.cpp revision 13493ab7596e827b8d0caab2c89e635dd65f78f9
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync * IPRT - Binary Image Loader, Extended Features.
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync * Copyright (C) 2006-2013 Oracle Corporation
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync * available from http://www.virtualbox.org. This file is free software;
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync * you can redistribute it and/or modify it under the terms of the GNU
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync * General Public License (GPL) as published by the Free Software
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync * The contents of this file may alternatively be used under the terms
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync * of the Common Development and Distribution License Version 1.0
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync * VirtualBox OSE distribution, in which case the provisions of the
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync * CDDL are applicable instead of those of the GPL.
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync * You may elect to license modified versions of this file under the
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync * terms and conditions of either the GPL or the CDDL or both.
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync/*******************************************************************************
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync* Header Files *
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync*******************************************************************************/
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsyncRTDECL(int) RTLdrOpenWithReader(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phMod, PRTERRINFO pErrInfo)
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync * Resolve RTLDRARCH_HOST.
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync * Read and verify the file signature.
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync int rc = pReader->pfnRead(pReader, &uSign, sizeof(uSign), 0);
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync Log(("rtldrOpenWithReader: %s: unknown magic %#x / '%.4s\n", pReader->pfnLogName(pReader), uSign.u32, &uSign.ach[0]));
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync rc = pReader->pfnRead(pReader, &offHdr, sizeof(offHdr), RT_OFFSETOF(IMAGE_DOS_HEADER, e_lfanew));
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync Log(("rtldrOpenWithReader: %s: no new header / invalid offset %#RX32\n", pReader->pfnLogName(pReader), offHdr));
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync rc = pReader->pfnRead(pReader, &uSign, sizeof(uSign), offHdr);
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync Log(("rtldrOpenWithReader: %s: unknown new magic %#x / '%.4s\n", pReader->pfnLogName(pReader), uSign.u32, &uSign.ach[0]));
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync * Create image interpreter instance depending on the signature.
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync rc = rtldrPEOpen(pReader, fFlags, enmArch, offHdr, phMod, pErrInfo);
320484435d67c1fb90dca3e8836d81bf939c8ba2vboxsync rc = rtldrELFOpen(pReader, fFlags, enmArch, phMod, pErrInfo);
#ifdef LDR_WITH_LX
#ifdef LDR_WITH_LE
#ifdef LDR_WITH_NE
#ifdef LDR_WITH_MZ
#ifdef LDR_WITH_AOUT
#ifndef LDR_WITH_KLDR
Log(("rtldrOpenWithReader: %s: the format isn't implemented %#x / '%.4s\n", pReader->pfnLogName(pReader), uSign.u32, &uSign.ach[0]));
#ifdef LDR_WITH_KLDR
LogFlow(("rtldrOpenWithReader: %s: returns %Rrc *phMod=%p\n", pReader->pfnLogName(pReader), rc, *phMod));
return rc;
return cb;
RTDECL(int) RTLdrGetBits(RTLDRMOD hLdrMod, void *pvBits, RTLDRADDR BaseAddress, PFNRTLDRIMPORT pfnGetImport, void *pvUser)
AssertMsgReturn(VALID_PTR(pfnGetImport), ("pfnGetImport=%p\n", pfnGetImport), VERR_INVALID_PARAMETER);
return rc;
RTDECL(int) RTLdrRelocate(RTLDRMOD hLdrMod, void *pvBits, RTLDRADDR NewBaseAddress, RTLDRADDR OldBaseAddress,
LogFlow(("RTLdrRelocate: hLdrMod=%RTldrm pvBits=%p NewBaseAddress=%RTptr OldBaseAddress=%RTptr pfnGetImport=%p pvUser=%p\n",
AssertMsgReturn(VALID_PTR(pfnGetImport), ("pfnGetImport=%p\n", pfnGetImport), VERR_INVALID_PARAMETER);
int rc = pMod->pOps->pfnRelocate(pMod, pvBits, NewBaseAddress, OldBaseAddress, pfnGetImport, pvUser);
return rc;
RTDECL(int) RTLdrGetSymbolEx(RTLDRMOD hLdrMod, const void *pvBits, RTLDRADDR BaseAddress, const char *pszSymbol,
LogFlow(("RTLdrGetSymbolEx: hLdrMod=%RTldrm pvBits=%p BaseAddress=%RTptr pszSymbol=%p:{%s} pValue\n",
//AssertMsgReturn(pMod->eState == LDR_STATE_OPENED, ("eState=%d\n", pMod->eState), VERR_WRONG_ORDER);
int rc;
void *pvValue;
AssertMsgFailedReturn(("BaseAddress=%RTptr pvBits=%p\n", BaseAddress, pvBits), VERR_INVALID_FUNCTION);
return rc;
RTDECL(int) RTLdrEnumSymbols(RTLDRMOD hLdrMod, unsigned fFlags, const void *pvBits, RTLDRADDR BaseAddress,
LogFlow(("RTLdrEnumSymbols: hLdrMod=%RTldrm fFlags=%#x pvBits=%p BaseAddress=%RTptr pfnCallback=%p pvUser=%p\n",
//AssertMsgReturn(pMod->eState == LDR_STATE_OPENED, ("eState=%d\n", pMod->eState), VERR_WRONG_ORDER);
return rc;
RTDECL(int) RTLdrEnumDbgInfo(RTLDRMOD hLdrMod, const void *pvBits, PFNRTLDRENUMDBG pfnCallback, void *pvUser)
AssertMsgReturn(RT_VALID_PTR(pfnCallback), ("pfnCallback=%p\n", pfnCallback), VERR_INVALID_PARAMETER);
//AssertMsgReturn(pMod->eState == LDR_STATE_OPENED, ("eState=%d\n", pMod->eState), VERR_WRONG_ORDER);
int rc;
return rc;
AssertMsgReturn(RT_VALID_PTR(pfnCallback), ("pfnCallback=%p\n", pfnCallback), VERR_INVALID_PARAMETER);
//AssertMsgReturn(pMod->eState == LDR_STATE_OPENED, ("eState=%d\n", pMod->eState), VERR_WRONG_ORDER);
int rc;
return rc;
RTDECL(int) RTLdrLinkAddressToSegOffset(RTLDRMOD hLdrMod, RTLDRADDR LinkAddress, uint32_t *piSeg, PRTLDRADDR poffSeg)
//AssertMsgReturn(pMod->eState == LDR_STATE_OPENED, ("eState=%d\n", pMod->eState), VERR_WRONG_ORDER);
int rc;
return rc;
//AssertMsgReturn(pMod->eState == LDR_STATE_OPENED, ("eState=%d\n", pMod->eState), VERR_WRONG_ORDER);
int rc;
return rc;
LogFlow(("RTLdrSegOffsetToRva: hLdrMod=%RTldrm LinkAddress=%RTptr iSeg=%#x offSeg=%RTptr pRva=%p\n",
//AssertMsgReturn(pMod->eState == LDR_STATE_OPENED, ("eState=%d\n", pMod->eState), VERR_WRONG_ORDER);
int rc;
return rc;
RTDECL(int) RTLdrRvaToSegOffset(RTLDRMOD hLdrMod, RTLDRADDR Rva, uint32_t *piSeg, PRTLDRADDR poffSeg)
//AssertMsgReturn(pMod->eState == LDR_STATE_OPENED, ("eState=%d\n", pMod->eState), VERR_WRONG_ORDER);
int rc;
return rc;
RTDECL(int) RTLdrQueryPropEx(RTLDRMOD hLdrMod, RTLDRPROP enmProp, void *pvBuf, size_t cbBuf, size_t *pcbRet)
if (!pcbRet)
switch (enmProp)
case RTLDRPROP_UUID:
case RTLDRPROP_IS_SIGNED:
*pcbRet = sizeof(bool);
*pcbRet = 0;
*pcbRet = sizeof(bool);
return VERR_NOT_SUPPORTED;
RTDECL(int) RTLdrVerifySignature(RTLDRMOD hLdrMod, PFNRTLDRVALIDATESIGNEDDATA pfnCallback, void *pvUser, PRTERRINFO pErrInfo)
return VERR_NOT_SUPPORTED;
RTDECL(int) RTLdrHashImage(RTLDRMOD hLdrMod, RTDIGESTTYPE enmDigest, char *pszDigest, size_t cbDigest)
switch (enmDigest)
case RTDIGESTTYPE_SHA1: AssertReturn(cbDigest >= RTSHA1_DIGEST_LEN + 1, VERR_BUFFER_OVERFLOW); break;
case RTDIGESTTYPE_SHA256: AssertReturn(cbDigest >= RTSHA256_DIGEST_LEN + 1, VERR_BUFFER_OVERFLOW); break;
case RTDIGESTTYPE_SHA512: AssertReturn(cbDigest >= RTSHA512_DIGEST_LEN + 1, VERR_BUFFER_OVERFLOW); break;
return VERR_NOT_SUPPORTED;
return VERR_NOT_SUPPORTED;