809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/* $Id$ */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @file
5b281ba489ca18f0380d7efc7a5108b606cce449vboxsync * IPRT - Binary Image Loader, kLdr Interface.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/*
c58f1213e628a545081c70e26c6b67a841cff880vboxsync * Copyright (C) 2006-2011 Oracle Corporation
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
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 *
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 *
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
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/*******************************************************************************
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync* Header Files *
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync*******************************************************************************/
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#define LOG_GROUP RTLOGGROUP_LDR
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#include <iprt/ldr.h>
aa4bcf0a4b2db3ac352b56a291d49cb8d4b66d32vboxsync#include "internal/iprt.h"
aa4bcf0a4b2db3ac352b56a291d49cb8d4b66d32vboxsync
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>
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync#include <k/kErr.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;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync PFNRTLDRENUMDBG pfnEnumDbgInfo;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PFNRTLDRENUMSYMS pfnEnumSyms;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PFNRTLDRIMPORT pfnGetImport;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync } u;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync void *pvUser;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync const void *pvBits;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PRTLDRMODKLDR pMod;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync int rc;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync} RTLDRMODKLDRARGS, *PRTLDRMODKLDRARGS;
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;
ed5b7c45a1afeb14ae8c2dfd7e01723dbb869f31vboxsync case KLDR_ERR_CPU_ARCH_MISMATCH: return VERR_LDR_ARCH_MISMATCH;
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;
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_NOT_MAPPED: return VERR_WRONG_ORDER;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync case KLDR_ERR_ADDRESS_OVERFLOW: return VERR_NUMBER_TOO_BIG;
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync case KLDR_ERR_TODO: return VERR_NOT_IMPLEMENTED;
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:
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync AssertMsgFailedReturn(("krc=%d (%#x): %s\n", krc, krc, kErrName(krc)), VERR_LDR_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:
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync AssertMsgFailedReturn(("krc=%d (%#x): %s\n", krc, krc, kErrName(krc)), VERR_LDR_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:
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync AssertMsgFailedReturn(("krc=%d (%#x): %s\n", krc, krc, kErrName(krc)), VERR_LDR_GENERAL_FAILURE);
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync case KLDR_ERR_MACHO_UNSUPPORTED_FILE_TYPE: return VERR_LDR_GENERAL_FAILURE;
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync case KLDR_ERR_MACHO_OTHER_ENDIAN_NOT_SUPPORTED:
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync case KLDR_ERR_MACHO_BAD_HEADER:
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync case KLDR_ERR_MACHO_UNSUPPORTED_MACHINE:
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync case KLDR_ERR_MACHO_BAD_LOAD_COMMAND:
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync case KLDR_ERR_MACHO_UNKNOWN_LOAD_COMMAND:
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync case KLDR_ERR_MACHO_UNSUPPORTED_LOAD_COMMAND:
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync case KLDR_ERR_MACHO_BAD_SECTION:
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync case KLDR_ERR_MACHO_UNSUPPORTED_SECTION:
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync#ifdef KLDR_ERR_MACHO_UNSUPPORTED_INIT_SECTION
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync case KLDR_ERR_MACHO_UNSUPPORTED_INIT_SECTION:
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync case KLDR_ERR_MACHO_UNSUPPORTED_TERM_SECTION:
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync#endif
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync case KLDR_ERR_MACHO_UNKNOWN_SECTION:
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync case KLDR_ERR_MACHO_BAD_SECTION_ORDER:
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync case KLDR_ERR_MACHO_BIT_MIX:
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync case KLDR_ERR_MACHO_BAD_OBJECT_FILE:
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync case KLDR_ERR_MACHO_BAD_SYMBOL:
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync case KLDR_ERR_MACHO_UNSUPPORTED_FIXUP_TYPE:
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync AssertMsgFailedReturn(("krc=%d (%#x): %s\n", krc, krc, kErrName(krc)), VERR_LDR_GENERAL_FAILURE);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync default:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (RT_FAILURE(krc))
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return krc;
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync AssertMsgFailedReturn(("krc=%d (%#x): %s\n", krc, krc, kErrName(krc)), 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/** @copydoc KLDRRDROPS::pfnCreate
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @remark This is a dummy which isn't used. */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic int rtkldrRdr_Create( PPKRDR ppRdr, const char *pszFilename)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
4e47bb772df0d04d1ded3e06354de547d52e2d06vboxsync NOREF(ppRdr); NOREF(pszFilename);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync AssertReleaseFailed();
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return -1;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnDestroy */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic int rtkldrRdr_Destroy( PKRDR pRdr)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
830a019ad79a45e6bf7a5419efd5a729a36e599evboxsync PRTKLDRRDR pThis = (PRTKLDRRDR)pRdr;
830a019ad79a45e6bf7a5419efd5a729a36e599evboxsync pThis->pReader = NULL;
830a019ad79a45e6bf7a5419efd5a729a36e599evboxsync RTMemFree(pThis);
830a019ad79a45e6bf7a5419efd5a729a36e599evboxsync return 0;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnRead */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic int rtkldrRdr_Read( 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 */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic int rtkldrRdr_AllMap( 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 */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic int rtkldrRdr_AllUnmap(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 */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic KFOFF rtkldrRdr_Size( PKRDR pRdr)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return (KFOFF)pReader->pfnSize(pReader);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnTell */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic KFOFF rtkldrRdr_Tell( PKRDR pRdr)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return (KFOFF)pReader->pfnTell(pReader);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnName */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic const char * rtkldrRdr_Name(PKRDR pRdr)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return pReader->pfnLogName(pReader);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnNativeFH */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic KIPTR rtkldrRdr_NativeFH(PKRDR pRdr)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
4e47bb772df0d04d1ded3e06354de547d52e2d06vboxsync NOREF(pRdr);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync AssertFailed();
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return -1;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnPageSize */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic KSIZE rtkldrRdr_PageSize(PKRDR pRdr)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
4e47bb772df0d04d1ded3e06354de547d52e2d06vboxsync NOREF(pRdr);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return PAGE_SIZE;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnMap */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic int rtkldrRdr_Map( PKRDR pRdr, void **ppvBase, KU32 cSegments, PCKLDRSEG paSegments, KBOOL fFixed)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync //PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
4e47bb772df0d04d1ded3e06354de547d52e2d06vboxsync NOREF(pRdr); NOREF(ppvBase); NOREF(cSegments); NOREF(paSegments); NOREF(fFixed);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync AssertFailed();
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return -1;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnRefresh */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic int rtkldrRdr_Refresh( PKRDR pRdr, void *pvBase, KU32 cSegments, PCKLDRSEG paSegments)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync //PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
4e47bb772df0d04d1ded3e06354de547d52e2d06vboxsync NOREF(pRdr); NOREF(pvBase); NOREF(cSegments); NOREF(paSegments);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync AssertFailed();
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return -1;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnProtect */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic int rtkldrRdr_Protect( PKRDR pRdr, void *pvBase, KU32 cSegments, PCKLDRSEG paSegments, KBOOL fUnprotectOrProtect)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync //PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
4e47bb772df0d04d1ded3e06354de547d52e2d06vboxsync NOREF(pRdr); NOREF(pvBase); NOREF(cSegments); NOREF(paSegments); NOREF(fUnprotectOrProtect);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync AssertFailed();
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return -1;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnUnmap */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic int rtkldrRdr_Unmap( PKRDR pRdr, void *pvBase, KU32 cSegments, PCKLDRSEG paSegments)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync //PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
4e47bb772df0d04d1ded3e06354de547d52e2d06vboxsync NOREF(pRdr); NOREF(pvBase); NOREF(cSegments); NOREF(paSegments);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync AssertFailed();
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return -1;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc KLDRRDROPS::pfnDone */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic void rtkldrRdr_Done( PKRDR pRdr)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
4e47bb772df0d04d1ded3e06354de547d52e2d06vboxsync NOREF(pRdr);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync //PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * The file reader operations.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * We provide our own based on IPRT instead of using the kLdr ones.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncextern "C" const KRDROPS g_kLdrRdrFileOps;
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncextern "C" const KRDROPS g_kLdrRdrFileOps =
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /* .pszName = */ "IPRT",
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /* .pNext = */ NULL,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /* .pfnCreate = */ rtkldrRdr_Create,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /* .pfnDestroy = */ rtkldrRdr_Destroy,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /* .pfnRead = */ rtkldrRdr_Read,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /* .pfnAllMap = */ rtkldrRdr_AllMap,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /* .pfnAllUnmap = */ rtkldrRdr_AllUnmap,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /* .pfnSize = */ rtkldrRdr_Size,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /* .pfnTell = */ rtkldrRdr_Tell,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /* .pfnName = */ rtkldrRdr_Name,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /* .pfnNativeFH = */ rtkldrRdr_NativeFH,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /* .pfnPageSize = */ rtkldrRdr_PageSize,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /* .pfnMap = */ rtkldrRdr_Map,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /* .pfnRefresh = */ rtkldrRdr_Refresh,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /* .pfnProtect = */ rtkldrRdr_Protect,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /* .pfnUnmap = */ rtkldrRdr_Unmap,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /* .pfnDone = */ rtkldrRdr_Done,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /* .u32Dummy = */ 42
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync};
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc RTLDROPS::pfnClose */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic DECLCALLBACK(int) rtkldr_Close(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 */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic DECLCALLBACK(int) rtkldr_Done(PRTLDRMODINTERNAL pMod)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PKLDRMOD pModkLdr = ((PRTLDRMODKLDR)pMod)->pMod;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync int rc = kLdrModMostlyDone(pModkLdr);
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;
4e47bb772df0d04d1ded3e06354de547d52e2d06vboxsync NOREF(pMod); NOREF(pszVersion); NOREF(fKind);
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 {
993a55bd118e0b54549b3f0b380a8fbd6246a040vboxsync char *psz = (char *)alloca(cchSymbol + 1);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync memcpy(psz, pchSymbol, cchSymbol);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync psz[cchSymbol] = '\0';
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync pszSymbol = psz;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync }
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync#if defined(RT_OS_OS2) || defined(RT_OS_DARWIN)
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
5b0a093ca572a855886faa6747ad46df859dd041vboxsync/** @copydoc RTLDROPS::pfnEnumSymbols */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic DECLCALLBACK(int) rtkldr_EnumSymbols(PRTLDRMODINTERNAL pMod, unsigned fFlags, const void *pvBits, RTUINTPTR BaseAddress,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync PFNRTLDRENUMSYMS pfnCallback, void *pvUser)
5b0a093ca572a855886faa6747ad46df859dd041vboxsync{
5b0a093ca572a855886faa6747ad46df859dd041vboxsync PKLDRMOD pModkLdr = ((PRTLDRMODKLDR)pMod)->pMod;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync RTLDRMODKLDRARGS Args;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync Args.pvUser = pvUser;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync Args.u.pfnEnumSyms = pfnCallback;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync Args.pMod = (PRTLDRMODKLDR)pMod;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync Args.pvBits = pvBits;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync Args.rc = VINF_SUCCESS;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync int rc = kLdrModEnumSymbols(pModkLdr, pvBits, BaseAddress,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync fFlags & RTLDR_ENUM_SYMBOL_FLAGS_ALL ? KLDRMOD_ENUM_SYMS_FLAGS_ALL : 0,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync rtkldrEnumSymbolsWrapper, &Args);
5b0a093ca572a855886faa6747ad46df859dd041vboxsync if (Args.rc != VINF_SUCCESS)
5b0a093ca572a855886faa6747ad46df859dd041vboxsync rc = Args.rc;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync else
5b0a093ca572a855886faa6747ad46df859dd041vboxsync rc = rtkldrConvertError(rc);
5b0a093ca572a855886faa6747ad46df859dd041vboxsync return rc;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync/** @copydoc RTLDROPS::pfnGetImageSize */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic DECLCALLBACK(size_t) rtkldr_GetImageSize(PRTLDRMODINTERNAL pMod)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PKLDRMOD pModkLdr = ((PRTLDRMODKLDR)pMod)->pMod;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync return kLdrModSize(pModkLdr);
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;
4e47bb772df0d04d1ded3e06354de547d52e2d06vboxsync NOREF(pMod); NOREF(pszVersion); NOREF(pfKind);
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 {
993a55bd118e0b54549b3f0b380a8fbd6246a040vboxsync char *psz = (char *)alloca(cchSymbol + 1);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync memcpy(psz, pchSymbol, cchSymbol);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync psz[cchSymbol] = '\0';
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync pszSymbol = psz;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync }
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync#if defined(RT_OS_OS2) || defined(RT_OS_DARWIN)
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
5b0a093ca572a855886faa6747ad46df859dd041vboxsync/** @copydoc RTLDROPS::pfnGetBits */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic DECLCALLBACK(int) rtkldr_GetBits(PRTLDRMODINTERNAL pMod, void *pvBits, RTUINTPTR BaseAddress,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync PFNRTLDRIMPORT pfnGetImport, void *pvUser)
5b0a093ca572a855886faa6747ad46df859dd041vboxsync{
5b0a093ca572a855886faa6747ad46df859dd041vboxsync PKLDRMOD pModkLdr = ((PRTLDRMODKLDR)pMod)->pMod;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync RTLDRMODKLDRARGS Args;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync Args.pvUser = pvUser;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync Args.u.pfnGetImport = pfnGetImport;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync Args.pMod = (PRTLDRMODKLDR)pMod;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync Args.pvBits = pvBits;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync Args.rc = VINF_SUCCESS;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync int rc = kLdrModGetBits(pModkLdr, pvBits, BaseAddress, rtkldrGetImportWrapper, &Args);
5b0a093ca572a855886faa6747ad46df859dd041vboxsync if (Args.rc != VINF_SUCCESS)
5b0a093ca572a855886faa6747ad46df859dd041vboxsync rc = Args.rc;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync else
5b0a093ca572a855886faa6747ad46df859dd041vboxsync rc = rtkldrConvertError(rc);
5b0a093ca572a855886faa6747ad46df859dd041vboxsync return rc;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync}
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync/** @copydoc RTLDROPS::pfnRelocate */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic DECLCALLBACK(int) rtkldr_Relocate(PRTLDRMODINTERNAL pMod, void *pvBits, RTUINTPTR NewBaseAddress,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync RTUINTPTR OldBaseAddress, PFNRTLDRIMPORT pfnGetImport, void *pvUser)
5b0a093ca572a855886faa6747ad46df859dd041vboxsync{
5b0a093ca572a855886faa6747ad46df859dd041vboxsync PKLDRMOD pModkLdr = ((PRTLDRMODKLDR)pMod)->pMod;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync RTLDRMODKLDRARGS Args;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync Args.pvUser = pvUser;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync Args.u.pfnGetImport = pfnGetImport;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync Args.pMod = (PRTLDRMODKLDR)pMod;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync Args.pvBits = pvBits;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync Args.rc = VINF_SUCCESS;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync int rc = kLdrModRelocateBits(pModkLdr, pvBits, NewBaseAddress, OldBaseAddress, rtkldrGetImportWrapper, &Args);
5b0a093ca572a855886faa6747ad46df859dd041vboxsync if (Args.rc != VINF_SUCCESS)
5b0a093ca572a855886faa6747ad46df859dd041vboxsync rc = Args.rc;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync else
5b0a093ca572a855886faa6747ad46df859dd041vboxsync rc = rtkldrConvertError(rc);
5b0a093ca572a855886faa6747ad46df859dd041vboxsync return rc;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync}
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @copydoc RTLDROPS::pfnGetSymbolEx */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic DECLCALLBACK(int) rtkldr_GetSymbolEx(PRTLDRMODINTERNAL pMod, const void *pvBits, RTUINTPTR BaseAddress,
0c8e85263a357c44964520942cb5816ab1c2e69dvboxsync uint32_t iOrdinal, const char *pszSymbol, RTUINTPTR *pValue)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PKLDRMOD pModkLdr = ((PRTLDRMODKLDR)pMod)->pMod;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync KLDRADDR uValue;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync#if defined(RT_OS_OS2) || defined(RT_OS_DARWIN)
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,
0c8e85263a357c44964520942cb5816ab1c2e69dvboxsync iOrdinal == UINT32_MAX ? NIL_KLDRMOD_SYM_ORDINAL : iOrdinal,
0c8e85263a357c44964520942cb5816ab1c2e69dvboxsync pszSymbol, strlen(pszSymbol), NULL,
0c8e85263a357c44964520942cb5816ab1c2e69dvboxsync NULL, NULL,
0c8e85263a357c44964520942cb5816ab1c2e69dvboxsync &uValue, NULL);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (!rc)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync {
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync *pValue = uValue;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return VINF_SUCCESS;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync }
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return rtkldrConvertError(rc);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
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 const char *pszExtFile, void *pvUser)
5b0a093ca572a855886faa6747ad46df859dd041vboxsync{
5b0a093ca572a855886faa6747ad46df859dd041vboxsync PRTLDRMODKLDRARGS pArgs = (PRTLDRMODKLDRARGS)pvUser;
4e47bb772df0d04d1ded3e06354de547d52e2d06vboxsync NOREF(pMod);
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync RTLDRDBGINFO DbgInfo;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync RT_ZERO(DbgInfo.u);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync DbgInfo.iDbgInfo = iDbgInfo;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync DbgInfo.offFile = offFile;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync DbgInfo.LinkAddress = LinkAddress;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync DbgInfo.cb = cb;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync DbgInfo.pszExtFile = pszExtFile;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync switch (enmType)
5b0a093ca572a855886faa6747ad46df859dd041vboxsync {
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync case KLDRDBGINFOTYPE_UNKNOWN:
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync DbgInfo.enmType = RTLDRDBGINFOTYPE_UNKNOWN;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync break;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync case KLDRDBGINFOTYPE_STABS:
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync DbgInfo.enmType = RTLDRDBGINFOTYPE_STABS;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync break;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync case KLDRDBGINFOTYPE_DWARF:
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync DbgInfo.enmType = RTLDRDBGINFOTYPE_DWARF;
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync if (!pszExtFile)
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync DbgInfo.u.Dwarf.pszSection = pszPartNm;
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync else
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync {
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync DbgInfo.enmType = RTLDRDBGINFOTYPE_DWARF_DWO;
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync DbgInfo.u.Dwo.uCrc32 = 0;
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync }
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync break;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync case KLDRDBGINFOTYPE_CODEVIEW:
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync DbgInfo.enmType = RTLDRDBGINFOTYPE_CODEVIEW;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /* Should make some more effort here... Assume the IPRT loader will kick in before we get here! */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync break;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync case KLDRDBGINFOTYPE_WATCOM:
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync DbgInfo.enmType = RTLDRDBGINFOTYPE_WATCOM;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync break;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync case KLDRDBGINFOTYPE_HLL:
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync DbgInfo.enmType = RTLDRDBGINFOTYPE_HLL;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync break;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync default:
5b0a093ca572a855886faa6747ad46df859dd041vboxsync AssertFailed();
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync DbgInfo.enmType = RTLDRDBGINFOTYPE_UNKNOWN;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync break;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync }
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync int rc = pArgs->u.pfnEnumDbgInfo(&pArgs->pMod->Core, &DbgInfo, pArgs->pvUser);
5b0a093ca572a855886faa6747ad46df859dd041vboxsync if (RT_FAILURE(rc))
5b0a093ca572a855886faa6747ad46df859dd041vboxsync return rc; /* don't bother converting. */
5b0a093ca572a855886faa6747ad46df859dd041vboxsync return 0;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync}
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync/** @copydoc RTLDROPS::pfnEnumDbgInfo */
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsyncstatic DECLCALLBACK(int) rtkldr_EnumDbgInfo(PRTLDRMODINTERNAL pMod, const void *pvBits,
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync PFNRTLDRENUMDBG pfnCallback, void *pvUser)
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync{
5b0a093ca572a855886faa6747ad46df859dd041vboxsync PRTLDRMODKLDR pThis = (PRTLDRMODKLDR)pMod;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync RTLDRMODKLDRARGS Args;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync Args.pvUser = pvUser;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync Args.u.pfnEnumDbgInfo = pfnCallback;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync Args.pvBits = pvBits;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync Args.pMod = pThis;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync Args.rc = VINF_SUCCESS;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync int rc = kLdrModEnumDbgInfo(pThis->pMod, pvBits, rtkldrEnumDbgInfoWrapper, &Args);
5b0a093ca572a855886faa6747ad46df859dd041vboxsync if (Args.rc != VINF_SUCCESS)
5b0a093ca572a855886faa6747ad46df859dd041vboxsync rc = Args.rc;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync return rc;
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync}
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
d3dea25ec07f6546715fe3af943ea863294b392evboxsync/** @copydoc RTLDROPS::pfnEnumSegments. */
d3dea25ec07f6546715fe3af943ea863294b392evboxsyncstatic DECLCALLBACK(int) rtkldr_EnumSegments(PRTLDRMODINTERNAL pMod, PFNRTLDRENUMSEGS pfnCallback, void *pvUser)
d3dea25ec07f6546715fe3af943ea863294b392evboxsync{
d3dea25ec07f6546715fe3af943ea863294b392evboxsync PRTLDRMODKLDR pThis = (PRTLDRMODKLDR)pMod;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync uint32_t const cSegments = pThis->pMod->cSegments;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync PCKLDRSEG paSegments = &pThis->pMod->aSegments[0];
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync char szName[128];
d3dea25ec07f6546715fe3af943ea863294b392evboxsync
d3dea25ec07f6546715fe3af943ea863294b392evboxsync for (uint32_t iSeg = 0; iSeg < cSegments; iSeg++)
d3dea25ec07f6546715fe3af943ea863294b392evboxsync {
d3dea25ec07f6546715fe3af943ea863294b392evboxsync RTLDRSEG Seg;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync if (!paSegments[iSeg].cchName)
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync {
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync Seg.pszName = szName;
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync Seg.cchName = (uint32_t)RTStrPrintf(szName, sizeof(szName), "Seg%02u", iSeg);
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync }
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync else if (paSegments[iSeg].pchName[paSegments[iSeg].cchName])
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync {
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync AssertReturn(paSegments[iSeg].cchName < sizeof(szName), VERR_INTERNAL_ERROR_3);
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync RTStrCopyEx(szName, sizeof(szName), paSegments[iSeg].pchName, paSegments[iSeg].cchName);
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync Seg.pszName = szName;
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync Seg.cchName = paSegments[iSeg].cchName;
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync }
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync else
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync {
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync Seg.pszName = paSegments[iSeg].pchName;
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync Seg.cchName = paSegments[iSeg].cchName;
e8859cfff41731e3688972d64cf6d5575addcd8fvboxsync }
d3dea25ec07f6546715fe3af943ea863294b392evboxsync Seg.SelFlat = paSegments[iSeg].SelFlat;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync Seg.Sel16bit = paSegments[iSeg].Sel16bit;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync Seg.fFlags = paSegments[iSeg].fFlags;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync AssertCompile(KLDRSEG_FLAG_16BIT == RTLDRSEG_FLAG_16BIT );
d3dea25ec07f6546715fe3af943ea863294b392evboxsync AssertCompile(KLDRSEG_FLAG_OS2_ALIAS16 == RTLDRSEG_FLAG_OS2_ALIAS16);
d3dea25ec07f6546715fe3af943ea863294b392evboxsync AssertCompile(KLDRSEG_FLAG_OS2_CONFORM == RTLDRSEG_FLAG_OS2_CONFORM);
d3dea25ec07f6546715fe3af943ea863294b392evboxsync AssertCompile(KLDRSEG_FLAG_OS2_IOPL == RTLDRSEG_FLAG_OS2_IOPL );
d3dea25ec07f6546715fe3af943ea863294b392evboxsync
d3dea25ec07f6546715fe3af943ea863294b392evboxsync switch (paSegments[iSeg].enmProt)
d3dea25ec07f6546715fe3af943ea863294b392evboxsync {
d3dea25ec07f6546715fe3af943ea863294b392evboxsync default:
d3dea25ec07f6546715fe3af943ea863294b392evboxsync AssertMsgFailed(("%d\n", paSegments[iSeg].enmProt));
d3dea25ec07f6546715fe3af943ea863294b392evboxsync case KPROT_NOACCESS:
d3dea25ec07f6546715fe3af943ea863294b392evboxsync Seg.fProt = 0;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync break;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync
d3dea25ec07f6546715fe3af943ea863294b392evboxsync case KPROT_READONLY: Seg.fProt = RTMEM_PROT_READ; break;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync case KPROT_READWRITE: Seg.fProt = RTMEM_PROT_READ | RTMEM_PROT_WRITE; break;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync case KPROT_WRITECOPY: Seg.fProt = RTMEM_PROT_WRITE; break;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync case KPROT_EXECUTE: Seg.fProt = RTMEM_PROT_EXEC; break;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync case KPROT_EXECUTE_READ: Seg.fProt = RTMEM_PROT_EXEC | RTMEM_PROT_READ; break;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync case KPROT_EXECUTE_READWRITE: Seg.fProt = RTMEM_PROT_EXEC | RTMEM_PROT_READ | RTMEM_PROT_WRITE; break;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync case KPROT_EXECUTE_WRITECOPY: Seg.fProt = RTMEM_PROT_EXEC | RTMEM_PROT_WRITE; break;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync }
d3dea25ec07f6546715fe3af943ea863294b392evboxsync Seg.cb = paSegments[iSeg].cb;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync Seg.Alignment = paSegments[iSeg].Alignment;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync Seg.LinkAddress = paSegments[iSeg].LinkAddress;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync Seg.offFile = paSegments[iSeg].offFile;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync Seg.cbFile = paSegments[iSeg].cbFile;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync Seg.RVA = paSegments[iSeg].RVA;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync Seg.cbMapped = paSegments[iSeg].cbMapped;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync
d3dea25ec07f6546715fe3af943ea863294b392evboxsync int rc = pfnCallback(pMod, &Seg, pvUser);
d3dea25ec07f6546715fe3af943ea863294b392evboxsync if (rc != VINF_SUCCESS)
d3dea25ec07f6546715fe3af943ea863294b392evboxsync return rc;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync }
d3dea25ec07f6546715fe3af943ea863294b392evboxsync
d3dea25ec07f6546715fe3af943ea863294b392evboxsync return VINF_SUCCESS;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync}
d3dea25ec07f6546715fe3af943ea863294b392evboxsync
d3dea25ec07f6546715fe3af943ea863294b392evboxsync
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync/** @copydoc RTLDROPS::pfnLinkAddressToSegOffset. */
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncstatic DECLCALLBACK(int) rtkldr_LinkAddressToSegOffset(PRTLDRMODINTERNAL pMod, RTLDRADDR LinkAddress,
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync uint32_t *piSeg, PRTLDRADDR poffSeg)
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync{
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync PRTLDRMODKLDR pThis = (PRTLDRMODKLDR)pMod;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync uint32_t const cSegments = pThis->pMod->cSegments;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync PCKLDRSEG paSegments = &pThis->pMod->aSegments[0];
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync for (uint32_t iSeg = 0; iSeg < cSegments; iSeg++)
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync {
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync KLDRADDR offSeg = LinkAddress - paSegments[iSeg].LinkAddress;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync if ( offSeg < paSegments[iSeg].cbMapped
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync || offSeg < paSegments[iSeg].cb)
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync {
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync *piSeg = iSeg;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync *poffSeg = offSeg;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync return VINF_SUCCESS;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync }
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync }
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync return VERR_LDR_INVALID_LINK_ADDRESS;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync}
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync/** @copydoc RTLDROPS::pfnLinkAddressToRva. */
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncstatic DECLCALLBACK(int) rtkldr_LinkAddressToRva(PRTLDRMODINTERNAL pMod, RTLDRADDR LinkAddress, PRTLDRADDR pRva)
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync{
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync PRTLDRMODKLDR pThis = (PRTLDRMODKLDR)pMod;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync uint32_t const cSegments = pThis->pMod->cSegments;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync PCKLDRSEG paSegments = &pThis->pMod->aSegments[0];
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync for (uint32_t iSeg = 0; iSeg < cSegments; iSeg++)
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync {
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync KLDRADDR offSeg = LinkAddress - paSegments[iSeg].LinkAddress;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync if ( offSeg < paSegments[iSeg].cbMapped
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync || offSeg < paSegments[iSeg].cb)
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync {
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync *pRva = paSegments[iSeg].RVA + offSeg;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync return VINF_SUCCESS;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync }
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync }
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync return VERR_LDR_INVALID_RVA;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync}
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync/** @copydoc RTLDROPS::pfnSegOffsetToRva. */
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncstatic DECLCALLBACK(int) rtkldr_SegOffsetToRva(PRTLDRMODINTERNAL pMod, uint32_t iSeg, RTLDRADDR offSeg,
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync PRTLDRADDR pRva)
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync{
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync PRTLDRMODKLDR pThis = (PRTLDRMODKLDR)pMod;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync if (iSeg >= pThis->pMod->cSegments)
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync return VERR_LDR_INVALID_SEG_OFFSET;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync PCKLDRSEG const pSegment = &pThis->pMod->aSegments[iSeg];
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync if ( offSeg > pSegment->cbMapped
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync && offSeg > pSegment->cb
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync && ( pSegment->cbFile < 0
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync || offSeg > (uint64_t)pSegment->cbFile))
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync return VERR_LDR_INVALID_SEG_OFFSET;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync *pRva = pSegment->RVA + offSeg;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync return VINF_SUCCESS;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync}
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync/** @copydoc RTLDROPS::pfnRvaToSegOffset. */
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncstatic DECLCALLBACK(int) rtkldr_RvaToSegOffset(PRTLDRMODINTERNAL pMod, RTLDRADDR Rva,
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync uint32_t *piSeg, PRTLDRADDR poffSeg)
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync{
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync PRTLDRMODKLDR pThis = (PRTLDRMODKLDR)pMod;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync uint32_t const cSegments = pThis->pMod->cSegments;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync PCKLDRSEG paSegments = &pThis->pMod->aSegments[0];
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync for (uint32_t iSeg = 0; iSeg < cSegments; iSeg++)
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync {
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync KLDRADDR offSeg = Rva - paSegments[iSeg].RVA;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync if ( offSeg < paSegments[iSeg].cbMapped
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync || offSeg < paSegments[iSeg].cb)
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync {
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync *piSeg = iSeg;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync *poffSeg = offSeg;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync return VINF_SUCCESS;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync }
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync }
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync return VERR_LDR_INVALID_RVA;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync}
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync
682342827b0e80c493c820603508e79e76c42658vboxsync/** @copydoc RTLDROPS::pfnReadDbgInfo. */
682342827b0e80c493c820603508e79e76c42658vboxsyncstatic DECLCALLBACK(int) rtkldr_ReadDbgInfo(PRTLDRMODINTERNAL pMod, uint32_t iDbgInfo, RTFOFF off, size_t cb, void *pvBuf)
682342827b0e80c493c820603508e79e76c42658vboxsync{
682342827b0e80c493c820603508e79e76c42658vboxsync PRTLDRMODKLDR pThis = (PRTLDRMODKLDR)pMod;
682342827b0e80c493c820603508e79e76c42658vboxsync /** @todo May have to apply fixups here. */
682342827b0e80c493c820603508e79e76c42658vboxsync return pThis->Core.pReader->pfnRead(pThis->Core.pReader, pvBuf, cb, off);
682342827b0e80c493c820603508e79e76c42658vboxsync}
682342827b0e80c493c820603508e79e76c42658vboxsync
682342827b0e80c493c820603508e79e76c42658vboxsync
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync/** @interface_method_impl{RTLDROPS,pfnQueryProp} */
a60be2c64ea23bb7ce4c9998bcd541c4db879fbavboxsyncstatic DECLCALLBACK(int) rtkldr_QueryProp(PRTLDRMODINTERNAL pMod, RTLDRPROP enmProp, void const *pvBits,
a60be2c64ea23bb7ce4c9998bcd541c4db879fbavboxsync void *pvBuf, size_t cbBuf, size_t *pcbRet)
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync{
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync PRTLDRMODKLDR pThis = (PRTLDRMODKLDR)pMod;
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync int rc;
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync switch (enmProp)
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync {
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync case RTLDRPROP_UUID:
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync rc = kLdrModQueryImageUuid(pThis->pMod, /*pvBits*/ NULL, (uint8_t *)pvBuf, cbBuf);
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync if (rc == KLDR_ERR_NO_IMAGE_UUID)
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync return VERR_NOT_FOUND;
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync AssertReturn(rc == 0, VERR_INVALID_PARAMETER);
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync break;
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync default:
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync return VERR_NOT_FOUND;
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync }
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync return VINF_SUCCESS;
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync}
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync/**
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * Operations for a kLdr module.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncstatic const RTLDROPS g_rtkldrOps =
5b0a093ca572a855886faa6747ad46df859dd041vboxsync{
5b0a093ca572a855886faa6747ad46df859dd041vboxsync "kLdr",
5b0a093ca572a855886faa6747ad46df859dd041vboxsync rtkldr_Close,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync NULL,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync rtkldr_Done,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync rtkldr_EnumSymbols,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /* ext */
5b0a093ca572a855886faa6747ad46df859dd041vboxsync rtkldr_GetImageSize,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync rtkldr_GetBits,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync rtkldr_Relocate,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync rtkldr_GetSymbolEx,
0c8e85263a357c44964520942cb5816ab1c2e69dvboxsync NULL /*pfnQueryForwarderInfo*/,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync rtkldr_EnumDbgInfo,
d3dea25ec07f6546715fe3af943ea863294b392evboxsync rtkldr_EnumSegments,
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync rtkldr_LinkAddressToSegOffset,
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync rtkldr_LinkAddressToRva,
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync rtkldr_SegOffsetToRva,
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync rtkldr_RvaToSegOffset,
682342827b0e80c493c820603508e79e76c42658vboxsync rtkldr_ReadDbgInfo,
2a2b173b54c259e34320ce0acf26f18e9382ce2avboxsync rtkldr_QueryProp,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync NULL,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync NULL,
5b0a093ca572a855886faa6747ad46df859dd041vboxsync 42
5b0a093ca572a855886faa6747ad46df859dd041vboxsync};
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
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.
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.
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * @param pErrInfo Where to return extended error information. Optional.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncint rtldrkLdrOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync /* Convert enmArch to k-speak. */
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync KCPUARCH enmCpuArch;
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync switch (enmArch)
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync {
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync case RTLDRARCH_WHATEVER:
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync enmCpuArch = KCPUARCH_UNKNOWN;
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync break;
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync case RTLDRARCH_X86_32:
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync enmCpuArch = KCPUARCH_X86_32;
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync break;
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync case RTLDRARCH_AMD64:
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync enmCpuArch = KCPUARCH_AMD64;
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync break;
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync default:
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync return VERR_INVALID_PARAMETER;
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync }
f9f1d016018f6c0d3c4a81299816198e1a377c90vboxsync KU32 fKFlags = 0;
f9f1d016018f6c0d3c4a81299816198e1a377c90vboxsync if (fFlags & RTLDR_O_FOR_DEBUG)
f9f1d016018f6c0d3c4a81299816198e1a377c90vboxsync fKFlags |= KLDRMOD_OPEN_FLAGS_FOR_INFO;
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /* 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;
f9f1d016018f6c0d3c4a81299816198e1a377c90vboxsync int krc = kLdrModOpenFromRdr(&pRdr->Core, fKFlags, enmCpuArch, &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;
830a019ad79a45e6bf7a5419efd5a729a36e599evboxsync pNewMod->Core.eState = LDR_STATE_OPENED;
830a019ad79a45e6bf7a5419efd5a729a36e599evboxsync pNewMod->Core.pOps = &g_rtkldrOps;
830a019ad79a45e6bf7a5419efd5a729a36e599evboxsync pNewMod->Core.pReader = pReader;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync switch (pMod->enmFmt)
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync {
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync case KLDRFMT_NATIVE: pNewMod->Core.enmFormat = RTLDRFMT_NATIVE; break;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync case KLDRFMT_AOUT: pNewMod->Core.enmFormat = RTLDRFMT_AOUT; break;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync case KLDRFMT_ELF: pNewMod->Core.enmFormat = RTLDRFMT_ELF; break;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync case KLDRFMT_LX: pNewMod->Core.enmFormat = RTLDRFMT_LX; break;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync case KLDRFMT_MACHO: pNewMod->Core.enmFormat = RTLDRFMT_MACHO; break;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync case KLDRFMT_PE: pNewMod->Core.enmFormat = RTLDRFMT_PE; break;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync default:
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync AssertMsgFailed(("%d\n", pMod->enmFmt));
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync pNewMod->Core.enmFormat = RTLDRFMT_NATIVE;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync break;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync }
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync switch (pMod->enmType)
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync {
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync case KLDRTYPE_OBJECT: pNewMod->Core.enmType = RTLDRTYPE_OBJECT; break;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync case KLDRTYPE_EXECUTABLE_FIXED: pNewMod->Core.enmType = RTLDRTYPE_EXECUTABLE_FIXED; break;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync case KLDRTYPE_EXECUTABLE_RELOCATABLE: pNewMod->Core.enmType = RTLDRTYPE_EXECUTABLE_RELOCATABLE; break;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync case KLDRTYPE_EXECUTABLE_PIC: pNewMod->Core.enmType = RTLDRTYPE_EXECUTABLE_PIC; break;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync case KLDRTYPE_SHARED_LIBRARY_FIXED: pNewMod->Core.enmType = RTLDRTYPE_SHARED_LIBRARY_FIXED; break;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync case KLDRTYPE_SHARED_LIBRARY_RELOCATABLE: pNewMod->Core.enmType = RTLDRTYPE_SHARED_LIBRARY_RELOCATABLE; break;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync case KLDRTYPE_SHARED_LIBRARY_PIC: pNewMod->Core.enmType = RTLDRTYPE_SHARED_LIBRARY_PIC; break;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync case KLDRTYPE_FORWARDER_DLL: pNewMod->Core.enmType = RTLDRTYPE_FORWARDER_DLL; break;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync case KLDRTYPE_CORE: pNewMod->Core.enmType = RTLDRTYPE_CORE; break;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync case KLDRTYPE_DEBUG_INFO: pNewMod->Core.enmType = RTLDRTYPE_DEBUG_INFO; break;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync default:
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync AssertMsgFailed(("%d\n", pMod->enmType));
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync pNewMod->Core.enmType = RTLDRTYPE_OBJECT;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync break;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync }
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync switch (pMod->enmEndian)
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync {
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync case KLDRENDIAN_LITTLE: pNewMod->Core.enmEndian = RTLDRENDIAN_LITTLE; break;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync case KLDRENDIAN_BIG: pNewMod->Core.enmEndian = RTLDRENDIAN_BIG; break;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync case KLDRENDIAN_NA: pNewMod->Core.enmEndian = RTLDRENDIAN_NA; break;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync default:
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync AssertMsgFailed(("%d\n", pMod->enmEndian));
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync pNewMod->Core.enmEndian = RTLDRENDIAN_NA;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync break;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync }
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync switch (pMod->enmArch)
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync {
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync case KCPUARCH_X86_32: pNewMod->Core.enmArch = RTLDRARCH_X86_32; break;
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync case KCPUARCH_AMD64: pNewMod->Core.enmArch = RTLDRARCH_AMD64; break;
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync default:
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync AssertMsgFailed(("%d\n", pMod->enmArch));
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync pNewMod->Core.enmArch = RTLDRARCH_WHATEVER;
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync break;
d1e9999d55e7ac80a28692c161710be98071fc00vboxsync }
830a019ad79a45e6bf7a5419efd5a729a36e599evboxsync pNewMod->pMod = pMod;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync *phLdrMod = &pNewMod->Core;
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync#ifdef LOG_ENABLED
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync Log(("rtldrkLdrOpen: '%s' (%s) %u segments\n",
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync pMod->pszName, pMod->pszFilename, pMod->cSegments));
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync for (unsigned iSeg = 0; iSeg < pMod->cSegments; iSeg++)
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync {
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync Log(("Segment #%-2u: RVA=%08llx cb=%08llx '%.*s'\n", iSeg,
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync pMod->aSegments[iSeg].RVA,
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync pMod->aSegments[iSeg].cb,
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync pMod->aSegments[iSeg].cchName,
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync pMod->aSegments[iSeg].pchName));
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync }
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync#endif
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return VINF_SUCCESS;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync }
830a019ad79a45e6bf7a5419efd5a729a36e599evboxsync
830a019ad79a45e6bf7a5419efd5a729a36e599evboxsync /* bail out */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync kLdrModClose(pMod);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync krc = KERR_NO_MEMORY;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync }
830a019ad79a45e6bf7a5419efd5a729a36e599evboxsync else
830a019ad79a45e6bf7a5419efd5a729a36e599evboxsync RTMemFree(pRdr);
830a019ad79a45e6bf7a5419efd5a729a36e599evboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return rtkldrConvertError(krc);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync