ldrkStuff.cpp revision 809e0c4b84167932d92a1df4edcbab2edf0ddf25
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/* $Id$ */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @file
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * innotek Portable Runtime - Binary Image Loader, kLdr Interface.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/*
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Copyright (C) 2006-2007 innotek GmbH
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync *
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
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * General Public License as published by the Free Software Foundation,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * distribution. VirtualBox OSE is distributed in the hope that it will
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * be useful, but WITHOUT ANY WARRANTY of any kind.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/*******************************************************************************
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync* Header Files *
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync*******************************************************************************/
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#define LOG_GROUP RTLOGGROUP_LDR
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#include <iprt/ldr.h>
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#include <iprt/file.h>
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#include <iprt/alloc.h>
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#include <iprt/alloca.h>
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#include <iprt/assert.h>
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#include <iprt/string.h>
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#include <iprt/path.h>
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#include <iprt/log.h>
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#include <iprt/param.h>
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#include <iprt/err.h>
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#include "internal/ldr.h"
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#define KLDR_ALREADY_INCLUDE_STD_TYPES
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#define KLDR_NO_KLDR_H_INCLUDES
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#include <k/kLdr.h>
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#include <k/kRdrAll.h>
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#include <k/kErrors.h>
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#include <k/kMagics.h>
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/*******************************************************************************
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync* Structures and Typedefs *
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync*******************************************************************************/
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * kLdr file provider.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsynctypedef struct RTKLDRRDR
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** The core. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync KRDR Core;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** The IPRT bit reader. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PRTLDRREADER pReader;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync} RTKLDRRDR, *PRTKLDRRDR;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * IPRT module.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsynctypedef struct RTLDRMODKLDR
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** The Core module structure. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync RTLDRMODINTERNAL Core;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** The kLdr module. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PKLDRMOD pMod;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync} RTLDRMODKLDR, *PRTLDRMODKLDR;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Arguments for a RTLDRMODKLDR callback wrapper.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsynctypedef struct RTLDRMODKLDRARGS
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync union
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync {
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PFNRT pfn;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PFNRTLDRENUMSYMS pfnEnumSyms;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PFNRTLDRIMPORT pfnGetImport;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync } u;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync void *pvUser;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync const void *pvBits;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PRTLDRMODKLDR pMod;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync} RTLDRMODKLDRARGS, *PRTLDRMODKLDRARGS;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/*******************************************************************************
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync* Internal Functions *
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync*******************************************************************************/
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic int rtkldrConvertError(int krc);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic int rtkldrConvertErrorFromIPRT(int rc);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic int rtkldrRdrCreate( PPKRDR ppRdr, const char *pszFilename);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic int rtkldrRdrDestroy( PKRDR pRdr);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic int rtkldrRdrRead( PKRDR pRdr, void *pvBuf, KSIZE cb, KFOFF off);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic int rtkldrRdrAllMap( PKRDR pRdr, const void **ppvBits);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic int rtkldrRdrAllUnmap(PKRDR pRdr, const void *pvBits);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic KFOFF rtkldrRdrSize( PKRDR pRdr);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic KFOFF rtkldrRdrTell( PKRDR pRdr);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic const char * rtkldrRdrName(PKRDR pRdr);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic KIPTR rtkldrRdrNativeFH(PKRDR pRdr);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic KSIZE rtkldrRdrPageSize(PKRDR pRdr);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic int rtkldrRdrMap( PKRDR pRdr, void **ppvBase, KU32 cSegments, PCKLDRSEG paSegments, KBOOL fFixed);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic int rtkldrRdrRefresh( PKRDR pRdr, void *pvBase, KU32 cSegments, PCKLDRSEG paSegments);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic int rtkldrRdrProtect( PKRDR pRdr, void *pvBase, KU32 cSegments, PCKLDRSEG paSegments, KBOOL fUnprotectOrProtect);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic int rtkldrRdrUnmap( PKRDR pRdr, void *pvBase, KU32 cSegments, PCKLDRSEG paSegments);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic void rtkldrRdrDone( PKRDR pRdr);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic DECLCALLBACK(int) rtkldrClose(PRTLDRMODINTERNAL pMod);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic DECLCALLBACK(int) rtkldrDone(PRTLDRMODINTERNAL pMod);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic DECLCALLBACK(int) rtkldrEnumSymbols(PRTLDRMODINTERNAL pMod, unsigned fFlags, const void *pvBits,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync RTUINTPTR BaseAddress,PFNRTLDRENUMSYMS pfnCallback, void *pvUser);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic int rtkldrEnumSymbolsWrapper(PKLDRMOD pMod, uint32_t iSymbol,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync const char *pchSymbol, KSIZE cchSymbol, const char *pszVersion,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync KLDRADDR uValue, uint32_t fKind, void *pvUser);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic DECLCALLBACK(KSIZE) rtkldrGetImageSize(PRTLDRMODINTERNAL pMod);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic DECLCALLBACK(int) rtkldrGetBits(PRTLDRMODINTERNAL pMod, void *pvBits, RTUINTPTR BaseAddress,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PFNRTLDRIMPORT pfnGetImport, void *pvUser);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic DECLCALLBACK(int) rtkldrRelocate(PRTLDRMODINTERNAL pMod, void *pvBits, RTUINTPTR NewBaseAddress,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync RTUINTPTR OldBaseAddress, PFNRTLDRIMPORT pfnGetImport, void *pvUser);
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
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic DECLCALLBACK(int) rtkldrGetSymbolEx(PRTLDRMODINTERNAL pMod, const void *pvBits, RTUINTPTR BaseAddress,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync const char *pszSymbol, RTUINTPTR *pValue);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Converts a kLdr error code to an IPRT one.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic int rtkldrConvertError(int krc)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (!krc)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return VINF_SUCCESS;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync switch (krc)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync {
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KERR_INVALID_PARAMETER: return VERR_INVALID_PARAMETER;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KERR_INVALID_HANDLE: return VERR_INVALID_HANDLE;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KERR_NO_MEMORY: return VERR_NO_MEMORY;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_UNKNOWN_FORMAT:
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
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;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_BAD_FIXUP: return 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_NOT_MAPPED: return VERR_WRONG_ORDER;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_ADDRESS_OVERFLOW: return VERR_NUMBER_TOO_BIG;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_NOT_LOADED_DYNAMICALLY:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KCPU_ERR_ARCH_CPU_NOT_COMPATIBLE:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_TOO_LONG_FORWARDER_CHAIN:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_MODULE_TERMINATING:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_PREREQUISITE_MODULE_TERMINATING:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_MODULE_INIT_FAILED:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_PREREQUISITE_MODULE_INIT_FAILED:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_MODULE_INIT_FAILED_ALREADY:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_PREREQUISITE_MODULE_INIT_FAILED_ALREADY:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_PREREQUISITE_RECURSED_TOO_DEEPLY:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_THREAD_ATTACH_FAILED:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KRDR_ERR_TOO_MANY_MAPPINGS:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_NOT_DLL:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_NOT_EXE:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return VERR_GENERAL_FAILURE;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_PE_UNSUPPORTED_MACHINE:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_PE_BAD_FILE_HEADER:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_PE_BAD_OPTIONAL_HEADER:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_PE_BAD_SECTION_HEADER:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_PE_BAD_FORWARDER:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_PE_FORWARDER_IMPORT_NOT_FOUND:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_PE_BAD_FIXUP:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_PE_BAD_IMPORT:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return VERR_GENERAL_FAILURE;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_LX_BAD_HEADER:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_LX_BAD_LOADER_SECTION:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_LX_BAD_FIXUP_SECTION:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_LX_BAD_OBJECT_TABLE:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_LX_BAD_PAGE_MAP:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_LX_BAD_ITERDATA:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_LX_BAD_ITERDATA2:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_LX_BAD_BUNDLE:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_LX_NO_SONAME:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_LX_BAD_SONAME:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_LX_BAD_FORWARDER:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_LX_NRICHAIN_NOT_SUPPORTED:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return VERR_GENERAL_FAILURE;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync default:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (RT_FAILURE(krc))
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return krc;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync AssertMsgFailed(("krc=%d (%#x)\n", krc, krc));
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return VERR_NO_TRANSLATION;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync }
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Converts a IPRT error code to an kLdr one.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic int rtkldrConvertErrorFromIPRT(int rc)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (RT_SUCCESS(rc))
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return 0;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync switch (rc)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync {
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case VERR_NO_MEMORY: return KERR_NO_MEMORY;
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 default:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return rc;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync }
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * The file reader operations.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * We provide our own based on IPRT instead of using the kLdr ones.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncextern "C" const KRDROPS g_kLdrRdrFileOps;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncextern "C" const KRDROPS g_kLdrRdrFileOps =
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* .pszName = */ "IPRT",
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* .pNext = */ NULL,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* .pfnCreate = */ rtkldrRdrCreate,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* .pfnDestroy = */ rtkldrRdrDestroy,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* .pfnRead = */ rtkldrRdrRead,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* .pfnAllMap = */ rtkldrRdrAllMap,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* .pfnAllUnmap = */ rtkldrRdrAllUnmap,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* .pfnSize = */ rtkldrRdrSize,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* .pfnTell = */ rtkldrRdrTell,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* .pfnName = */ rtkldrRdrName,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* .pfnNativeFH = */ rtkldrRdrNativeFH,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* .pfnPageSize = */ rtkldrRdrPageSize,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* .pfnMap = */ rtkldrRdrMap,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* .pfnRefresh = */ rtkldrRdrRefresh,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* .pfnProtect = */ rtkldrRdrProtect,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* .pfnUnmap = */ rtkldrRdrUnmap,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* .pfnDone = */ rtkldrRdrDone,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* .u32Dummy = */ 42
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync};
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnCreate
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @remark This is a dummy which isn't used. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic int rtkldrRdrCreate( PPKRDR ppRdr, const char *pszFilename)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync AssertReleaseFailed();
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return -1;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnDestroy */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic int rtkldrRdrDestroy( PKRDR pRdr)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync int rc = pReader->pfnDestroy(pReader);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return rtkldrConvertErrorFromIPRT(rc);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnRead */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic int rtkldrRdrRead( PKRDR pRdr, void *pvBuf, KSIZE cb, KFOFF off)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync int rc = pReader->pfnRead(pReader, pvBuf, cb, off);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return rtkldrConvertErrorFromIPRT(rc);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnAllMap */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic int rtkldrRdrAllMap( PKRDR pRdr, const void **ppvBits)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync int rc = pReader->pfnMap(pReader, ppvBits);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return rtkldrConvertErrorFromIPRT(rc);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnAllUnmap */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic int rtkldrRdrAllUnmap(PKRDR pRdr, const void *pvBits)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync int rc = pReader->pfnUnmap(pReader, pvBits);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return rtkldrConvertErrorFromIPRT(rc);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnSize */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic KFOFF rtkldrRdrSize( PKRDR pRdr)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return (KFOFF)pReader->pfnSize(pReader);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnTell */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic KFOFF rtkldrRdrTell( PKRDR pRdr)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return (KFOFF)pReader->pfnTell(pReader);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnName */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic const char * rtkldrRdrName(PKRDR pRdr)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return pReader->pfnLogName(pReader);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnNativeFH */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic KIPTR rtkldrRdrNativeFH(PKRDR pRdr)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync AssertFailed();
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return -1;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnPageSize */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic KSIZE rtkldrRdrPageSize(PKRDR pRdr)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return PAGE_SIZE;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnMap */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic int rtkldrRdrMap( PKRDR pRdr, void **ppvBase, KU32 cSegments, PCKLDRSEG paSegments, KBOOL fFixed)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync //PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync AssertFailed();
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return -1;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnRefresh */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic int rtkldrRdrRefresh( PKRDR pRdr, void *pvBase, KU32 cSegments, PCKLDRSEG paSegments)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync //PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync AssertFailed();
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return -1;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnProtect */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic int rtkldrRdrProtect( PKRDR pRdr, void *pvBase, KU32 cSegments, PCKLDRSEG paSegments, KBOOL fUnprotectOrProtect)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync //PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync AssertFailed();
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return -1;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnUnmap */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic int rtkldrRdrUnmap( PKRDR pRdr, void *pvBase, KU32 cSegments, PCKLDRSEG paSegments)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync //PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync AssertFailed();
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return -1;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnDone */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic void rtkldrRdrDone( PKRDR pRdr)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync //PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Operations for a kLdr module.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic const RTLDROPS g_rtkldrOps =
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync "kLdr",
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync rtkldrClose,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync NULL,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync rtkldrDone,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync rtkldrEnumSymbols,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* ext */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync rtkldrGetImageSize,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync rtkldrGetBits,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync rtkldrRelocate,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync rtkldrGetSymbolEx,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync 42
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync};
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc RTLDROPS::pfnClose */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic DECLCALLBACK(int) rtkldrClose(PRTLDRMODINTERNAL pMod)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PKLDRMOD pModkLdr = ((PRTLDRMODKLDR)pMod)->pMod;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync int rc = kLdrModClose(pModkLdr);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return rtkldrConvertError(rc);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc RTLDROPS::pfnDone */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic DECLCALLBACK(int) rtkldrDone(PRTLDRMODINTERNAL pMod)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PKLDRMOD pModkLdr = ((PRTLDRMODKLDR)pMod)->pMod;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync int rc = kLdrModMostlyDone(pModkLdr);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return rtkldrConvertError(rc);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc RTLDROPS::pfnEnumSymbols */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic DECLCALLBACK(int) rtkldrEnumSymbols(PRTLDRMODINTERNAL pMod, unsigned fFlags, const void *pvBits, RTUINTPTR BaseAddress,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PFNRTLDRENUMSYMS pfnCallback, void *pvUser)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PKLDRMOD pModkLdr = ((PRTLDRMODKLDR)pMod)->pMod;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync RTLDRMODKLDRARGS Args;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync Args.pvUser = pvUser;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync Args.u.pfnEnumSyms = pfnCallback;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync Args.pMod = (PRTLDRMODKLDR)pMod;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync Args.pvBits = pvBits;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync int rc = kLdrModEnumSymbols(pModkLdr, pvBits, BaseAddress,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync fFlags & RTLDR_ENUM_SYMBOL_FLAGS_ALL ? KLDRMOD_ENUM_SYMS_FLAGS_ALL : 0,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync rtkldrEnumSymbolsWrapper, &Args);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return rtkldrConvertError(rc);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc FNKLDRMODENUMSYMS */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic int rtkldrEnumSymbolsWrapper(PKLDRMOD pMod, uint32_t iSymbol,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync const char *pchSymbol, KSIZE cchSymbol, const char *pszVersion,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync KLDRADDR uValue, uint32_t fKind, void *pvUser)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PRTLDRMODKLDRARGS pArgs = (PRTLDRMODKLDRARGS)pvUser;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* If not zero terminated we'll have to use a temporary buffer. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync const char *pszSymbol = pchSymbol;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (pchSymbol && pchSymbol[cchSymbol])
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync {
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync char *psz = (char *)alloca(cchSymbol) + 1;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync memcpy(psz, pchSymbol, cchSymbol);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync psz[cchSymbol] = '\0';
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync pszSymbol = psz;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync }
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#if defined(RT_OS_OS2) || (defined(RT_OS_DARWIN) && defined(RT_ARCH_X86))
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* skip the underscore prefix. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (*pszSymbol == '_')
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync pszSymbol++;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#endif
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync int rc = pArgs->u.pfnEnumSyms(&pArgs->pMod->Core, pszSymbol, iSymbol, uValue, pArgs->pvUser);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (RT_FAILURE(rc))
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return rc; /* don't bother converting. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return 0;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc RTLDROPS::pfnGetImageSize */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic DECLCALLBACK(KSIZE) rtkldrGetImageSize(PRTLDRMODINTERNAL pMod)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PKLDRMOD pModkLdr = ((PRTLDRMODKLDR)pMod)->pMod;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return kLdrModSize(pModkLdr);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc RTLDROPS::pfnGetBits */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic DECLCALLBACK(int) rtkldrGetBits(PRTLDRMODINTERNAL pMod, void *pvBits, RTUINTPTR BaseAddress,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PFNRTLDRIMPORT pfnGetImport, void *pvUser)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PKLDRMOD pModkLdr = ((PRTLDRMODKLDR)pMod)->pMod;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync RTLDRMODKLDRARGS Args;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync Args.pvUser = pvUser;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync Args.u.pfnGetImport = pfnGetImport;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync Args.pMod = (PRTLDRMODKLDR)pMod;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync Args.pvBits = pvBits;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync int rc = kLdrModGetBits(pModkLdr, pvBits, BaseAddress, rtkldrGetImportWrapper, &Args);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return rtkldrConvertError(rc);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc RTLDROPS::pfnRelocate */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic DECLCALLBACK(int) rtkldrRelocate(PRTLDRMODINTERNAL pMod, void *pvBits, RTUINTPTR NewBaseAddress,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync RTUINTPTR OldBaseAddress, PFNRTLDRIMPORT pfnGetImport, void *pvUser)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PKLDRMOD pModkLdr = ((PRTLDRMODKLDR)pMod)->pMod;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync RTLDRMODKLDRARGS Args;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync Args.pvUser = pvUser;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync Args.u.pfnGetImport = pfnGetImport;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync Args.pMod = (PRTLDRMODKLDR)pMod;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync Args.pvBits = pvBits;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync int rc = kLdrModRelocateBits(pModkLdr, pvBits, NewBaseAddress, OldBaseAddress, rtkldrGetImportWrapper, &Args);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return rtkldrConvertError(rc);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
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{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PRTLDRMODKLDRARGS pArgs = (PRTLDRMODKLDRARGS)pvUser;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* If not zero terminated we'll have to use a temporary buffer. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync const char *pszSymbol = pchSymbol;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (pchSymbol && pchSymbol[cchSymbol])
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync {
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync char *psz = (char *)alloca(cchSymbol) + 1;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync memcpy(psz, pchSymbol, cchSymbol);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync psz[cchSymbol] = '\0';
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync pszSymbol = psz;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync }
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#if defined(RT_OS_OS2) || (defined(RT_OS_DARWIN) && defined(RT_ARCH_X86))
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* skip the underscore prefix. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (*pszSymbol == '_')
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync pszSymbol++;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#endif
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* get the import module name - TODO: cache this */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync const char *pszModule = NULL;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (iImport != NIL_KLDRMOD_IMPORT)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync {
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync char *pszBuf = (char *)alloca(64);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync int rc = kLdrModGetImport(pMod, pArgs->pvBits, iImport, pszBuf, 64);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (rc)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return rc;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync pszModule = pszBuf;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync }
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* do the query */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync RTUINTPTR Value;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync int rc = pArgs->u.pfnGetImport(&pArgs->pMod->Core, pszModule, pszSymbol, pszSymbol ? ~0 : iSymbol, &Value, pArgs->pvUser);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (RT_SUCCESS(rc))
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync {
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync *puValue = Value;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return 0;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync }
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return rtkldrConvertErrorFromIPRT(rc);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc RTLDROPS::pfnGetSymbolEx */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic DECLCALLBACK(int) rtkldrGetSymbolEx(PRTLDRMODINTERNAL pMod, const void *pvBits, RTUINTPTR BaseAddress,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync const char *pszSymbol, RTUINTPTR *pValue)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PKLDRMOD pModkLdr = ((PRTLDRMODKLDR)pMod)->pMod;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync KLDRADDR uValue;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#if defined(RT_OS_OS2) || (defined(RT_OS_DARWIN) && defined(RT_ARCH_X86))
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /*
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Add underscore prefix.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (pszSymbol)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync {
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync size_t cch = strlen(pszSymbol);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync char *psz = (char *)alloca(cch + 2);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync memcpy(psz + 1, pszSymbol, cch + 1);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync *psz = '_';
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync pszSymbol = psz;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync }
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#endif
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync int rc = kLdrModQuerySymbol(pModkLdr, pvBits, BaseAddress,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync NIL_KLDRMOD_SYM_ORDINAL, pszSymbol, strlen(pszSymbol), NULL,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync NULL, NULL, &uValue, NULL);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (!rc)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync {
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync *pValue = uValue;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return VINF_SUCCESS;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync }
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return rtkldrConvertError(rc);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Open a image using kLdr.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync *
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @returns iprt status code.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param pReader The loader reader instance which will provide the raw image bits.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param phLdrMod Where to store the handle.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncint rtldrkLdrOpen(PRTLDRREADER pReader, PRTLDRMOD phLdrMod)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* Create a rtkldrRdr instance. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PRTKLDRRDR pRdr = (PRTKLDRRDR)RTMemAllocZ(sizeof(*pRdr));
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (!pRdr)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return VERR_NO_MEMORY;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync pRdr->Core.u32Magic = KRDR_MAGIC;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync pRdr->Core.pOps = &g_kLdrRdrFileOps;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync pRdr->pReader = pReader;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* Try open it. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PKLDRMOD pMod;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync int krc = kLdrModOpenFromRdr(&pRdr->Core, &pMod);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (!krc)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync {
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* Create a module wrapper for it. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PRTLDRMODKLDR pNewMod = (PRTLDRMODKLDR)RTMemAllocZ(sizeof(*pNewMod));
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (pNewMod)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync {
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync pNewMod->Core.u32Magic = RTLDRMOD_MAGIC;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync pNewMod->Core.eState = LDR_STATE_OPENED;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync pNewMod->Core.pOps = &g_rtkldrOps;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync pNewMod->pMod = pMod;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync *phLdrMod = &pNewMod->Core;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return VINF_SUCCESS;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync }
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync kLdrModClose(pMod);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync krc = KERR_NO_MEMORY;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync }
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return rtkldrConvertError(krc);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync