ldrkStuff.cpp revision 830a019ad79a45e6bf7a5419efd5a729a36e599e
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/* $Id$ */
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @file
298cb3d14d0326f801d6dd105c3e1025227263e0ludo * IPRT - Binary Image Loader, kLdr Interface.
298cb3d14d0326f801d6dd105c3e1025227263e0ludo */
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/*
298cb3d14d0326f801d6dd105c3e1025227263e0ludo * Copyright (C) 2006-2011 Oracle Corporation
8cf870d281dc8c242f083d14dfef05f24aa5fceeJnRouvignac *
298cb3d14d0326f801d6dd105c3e1025227263e0ludo * This file is part of VirtualBox Open Source Edition (OSE), as
298cb3d14d0326f801d6dd105c3e1025227263e0ludo * available from http://www.virtualbox.org. This file is free software;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo * you can redistribute it and/or modify it under the terms of the GNU
298cb3d14d0326f801d6dd105c3e1025227263e0ludo * General Public License (GPL) as published by the Free Software
298cb3d14d0326f801d6dd105c3e1025227263e0ludo * Foundation, in version 2 as it comes in the "COPYING" file of the
8cf870d281dc8c242f083d14dfef05f24aa5fceeJnRouvignac * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
8cf870d281dc8c242f083d14dfef05f24aa5fceeJnRouvignac * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
8cf870d281dc8c242f083d14dfef05f24aa5fceeJnRouvignac *
8cf870d281dc8c242f083d14dfef05f24aa5fceeJnRouvignac * The contents of this file may alternatively be used under the terms
298cb3d14d0326f801d6dd105c3e1025227263e0ludo * of the Common Development and Distribution License Version 1.0
298cb3d14d0326f801d6dd105c3e1025227263e0ludo * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
298cb3d14d0326f801d6dd105c3e1025227263e0ludo * VirtualBox OSE distribution, in which case the provisions of the
298cb3d14d0326f801d6dd105c3e1025227263e0ludo * CDDL are applicable instead of those of the GPL.
298cb3d14d0326f801d6dd105c3e1025227263e0ludo *
298cb3d14d0326f801d6dd105c3e1025227263e0ludo * You may elect to license modified versions of this file under the
7b0d8957b7f589e1fd5553a4cdde13a2ee25ebc2ludo * terms and conditions of either the GPL or the CDDL or both.
298cb3d14d0326f801d6dd105c3e1025227263e0ludo */
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/*******************************************************************************
298cb3d14d0326f801d6dd105c3e1025227263e0ludo* Header Files *
298cb3d14d0326f801d6dd105c3e1025227263e0ludo*******************************************************************************/
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#define LOG_GROUP RTLOGGROUP_LDR
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#include <iprt/ldr.h>
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#include "internal/iprt.h"
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#include <iprt/file.h>
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#include <iprt/alloc.h>
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#include <iprt/alloca.h>
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#include <iprt/assert.h>
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#include <iprt/string.h>
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#include <iprt/path.h>
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#include <iprt/log.h>
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#include <iprt/param.h>
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#include <iprt/err.h>
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#include "internal/ldr.h"
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#define KLDR_ALREADY_INCLUDE_STD_TYPES
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#define KLDR_NO_KLDR_H_INCLUDES
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#include <k/kLdr.h>
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#include <k/kRdrAll.h>
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#include <k/kErr.h>
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#include <k/kErrors.h>
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#include <k/kMagics.h>
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/*******************************************************************************
298cb3d14d0326f801d6dd105c3e1025227263e0ludo* Structures and Typedefs *
298cb3d14d0326f801d6dd105c3e1025227263e0ludo*******************************************************************************/
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/**
298cb3d14d0326f801d6dd105c3e1025227263e0ludo * kLdr file provider.
298cb3d14d0326f801d6dd105c3e1025227263e0ludo */
298cb3d14d0326f801d6dd105c3e1025227263e0ludotypedef struct RTKLDRRDR
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /** The core. */
298cb3d14d0326f801d6dd105c3e1025227263e0ludo KRDR Core;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /** The IPRT bit reader. */
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PRTLDRREADER pReader;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo} RTKLDRRDR, *PRTKLDRRDR;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/**
298cb3d14d0326f801d6dd105c3e1025227263e0ludo * IPRT module.
298cb3d14d0326f801d6dd105c3e1025227263e0ludo */
298cb3d14d0326f801d6dd105c3e1025227263e0ludotypedef struct RTLDRMODKLDR
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /** The Core module structure. */
298cb3d14d0326f801d6dd105c3e1025227263e0ludo RTLDRMODINTERNAL Core;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /** The kLdr module. */
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PKLDRMOD pMod;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo} RTLDRMODKLDR, *PRTLDRMODKLDR;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/**
298cb3d14d0326f801d6dd105c3e1025227263e0ludo * Arguments for a RTLDRMODKLDR callback wrapper.
298cb3d14d0326f801d6dd105c3e1025227263e0ludo */
298cb3d14d0326f801d6dd105c3e1025227263e0ludotypedef struct RTLDRMODKLDRARGS
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo union
298cb3d14d0326f801d6dd105c3e1025227263e0ludo {
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PFNRT pfn;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PFNRTLDRENUMDBG pfnEnumDbgInfo;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PFNRTLDRENUMSYMS pfnEnumSyms;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PFNRTLDRIMPORT pfnGetImport;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo } u;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo void *pvUser;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo const void *pvBits;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PRTLDRMODKLDR pMod;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo int rc;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo} RTLDRMODKLDRARGS, *PRTLDRMODKLDRARGS;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/**
298cb3d14d0326f801d6dd105c3e1025227263e0ludo * Converts a kLdr error code to an IPRT one.
298cb3d14d0326f801d6dd105c3e1025227263e0ludo */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic int rtkldrConvertError(int krc)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo if (!krc)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return VINF_SUCCESS;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo switch (krc)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo {
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KERR_INVALID_PARAMETER: return VERR_INVALID_PARAMETER;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KERR_INVALID_HANDLE: return VERR_INVALID_HANDLE;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KERR_NO_MEMORY: return VERR_NO_MEMORY;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_UNKNOWN_FORMAT:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_MZ_NOT_SUPPORTED: return VERR_MZ_EXE_NOT_SUPPORTED;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_NE_NOT_SUPPORTED: return VERR_NE_EXE_NOT_SUPPORTED;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_LX_NOT_SUPPORTED: return VERR_LX_EXE_NOT_SUPPORTED;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_LE_NOT_SUPPORTED: return VERR_LE_EXE_NOT_SUPPORTED;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_PE_NOT_SUPPORTED: return VERR_PE_EXE_NOT_SUPPORTED;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_ELF_NOT_SUPPORTED: return VERR_ELF_EXE_NOT_SUPPORTED;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_MACHO_NOT_SUPPORTED: return VERR_INVALID_EXE_SIGNATURE;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_AOUT_NOT_SUPPORTED: return VERR_AOUT_EXE_NOT_SUPPORTED;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_MODULE_NOT_FOUND: return VERR_MODULE_NOT_FOUND;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_PREREQUISITE_MODULE_NOT_FOUND: return VERR_MODULE_NOT_FOUND;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_MAIN_STACK_ALLOC_FAILED: return VERR_NO_MEMORY;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KERR_BUFFER_OVERFLOW: return VERR_BUFFER_OVERFLOW;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_SYMBOL_NOT_FOUND: return VERR_SYMBOL_NOT_FOUND;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_FORWARDER_SYMBOL: return VERR_BAD_EXE_FORMAT;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_BAD_FIXUP: AssertMsgFailedReturn(("KLDR_ERR_BAD_FIXUP\n"), VERR_BAD_EXE_FORMAT);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_IMPORT_ORDINAL_OUT_OF_BOUNDS: return VERR_BAD_EXE_FORMAT;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_NO_DEBUG_INFO: return VERR_FILE_NOT_FOUND;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_ALREADY_MAPPED: return VERR_WRONG_ORDER;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_NOT_MAPPED: return VERR_WRONG_ORDER;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_ADDRESS_OVERFLOW: return VERR_NUMBER_TOO_BIG;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_TODO: return VERR_NOT_IMPLEMENTED;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_NOT_LOADED_DYNAMICALLY:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KCPU_ERR_ARCH_CPU_NOT_COMPATIBLE:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_TOO_LONG_FORWARDER_CHAIN:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_MODULE_TERMINATING:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_PREREQUISITE_MODULE_TERMINATING:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_MODULE_INIT_FAILED:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_PREREQUISITE_MODULE_INIT_FAILED:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_MODULE_INIT_FAILED_ALREADY:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_PREREQUISITE_MODULE_INIT_FAILED_ALREADY:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_PREREQUISITE_RECURSED_TOO_DEEPLY:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_THREAD_ATTACH_FAILED:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KRDR_ERR_TOO_MANY_MAPPINGS:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_NOT_DLL:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_NOT_EXE:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo AssertMsgFailedReturn(("krc=%d (%#x): %s\n", krc, krc, kErrName(krc)), VERR_GENERAL_FAILURE);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_PE_UNSUPPORTED_MACHINE:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_PE_BAD_FILE_HEADER:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_PE_BAD_OPTIONAL_HEADER:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_PE_BAD_SECTION_HEADER:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_PE_BAD_FORWARDER:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_PE_FORWARDER_IMPORT_NOT_FOUND:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_PE_BAD_FIXUP:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_PE_BAD_IMPORT:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo AssertMsgFailedReturn(("krc=%d (%#x): %s\n", krc, krc, kErrName(krc)), VERR_GENERAL_FAILURE);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_LX_BAD_HEADER:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_LX_BAD_LOADER_SECTION:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_LX_BAD_FIXUP_SECTION:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_LX_BAD_OBJECT_TABLE:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_LX_BAD_PAGE_MAP:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_LX_BAD_ITERDATA:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_LX_BAD_ITERDATA2:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_LX_BAD_BUNDLE:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_LX_NO_SONAME:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_LX_BAD_SONAME:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_LX_BAD_FORWARDER:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_LX_NRICHAIN_NOT_SUPPORTED:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo AssertMsgFailedReturn(("krc=%d (%#x): %s\n", krc, krc, kErrName(krc)), VERR_GENERAL_FAILURE);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_MACHO_OTHER_ENDIAN_NOT_SUPPORTED:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_MACHO_BAD_HEADER:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_MACHO_UNSUPPORTED_FILE_TYPE:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_MACHO_UNSUPPORTED_MACHINE:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_MACHO_BAD_LOAD_COMMAND:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_MACHO_UNKNOWN_LOAD_COMMAND:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_MACHO_UNSUPPORTED_LOAD_COMMAND:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_MACHO_BAD_SECTION:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_MACHO_UNSUPPORTED_SECTION:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#ifdef KLDR_ERR_MACHO_UNSUPPORTED_INIT_SECTION
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_MACHO_UNSUPPORTED_INIT_SECTION:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_MACHO_UNSUPPORTED_TERM_SECTION:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#endif
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_MACHO_UNKNOWN_SECTION:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_MACHO_BAD_SECTION_ORDER:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_MACHO_BIT_MIX:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_MACHO_BAD_OBJECT_FILE:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_MACHO_BAD_SYMBOL:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDR_ERR_MACHO_UNSUPPORTED_FIXUP_TYPE:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo AssertMsgFailedReturn(("krc=%d (%#x): %s\n", krc, krc, kErrName(krc)), VERR_GENERAL_FAILURE);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo default:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo if (RT_FAILURE(krc))
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return krc;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo AssertMsgFailedReturn(("krc=%d (%#x): %s\n", krc, krc, kErrName(krc)), VERR_NO_TRANSLATION);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo }
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/**
298cb3d14d0326f801d6dd105c3e1025227263e0ludo * Converts a IPRT error code to an kLdr one.
298cb3d14d0326f801d6dd105c3e1025227263e0ludo */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic int rtkldrConvertErrorFromIPRT(int rc)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo if (RT_SUCCESS(rc))
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return 0;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo switch (rc)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo {
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case VERR_NO_MEMORY: return KERR_NO_MEMORY;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case VERR_INVALID_PARAMETER: return KERR_INVALID_PARAMETER;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case VERR_INVALID_HANDLE: return KERR_INVALID_HANDLE;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case VERR_BUFFER_OVERFLOW: return KERR_BUFFER_OVERFLOW;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo default:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return rc;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo }
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @copydoc KLDRRDROPS::pfnCreate
298cb3d14d0326f801d6dd105c3e1025227263e0ludo * @remark This is a dummy which isn't used. */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic int rtkldrRdr_Create( PPKRDR ppRdr, const char *pszFilename)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo NOREF(ppRdr); NOREF(pszFilename);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo AssertReleaseFailed();
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return -1;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @copydoc KLDRRDROPS::pfnDestroy */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic int rtkldrRdr_Destroy( PKRDR pRdr)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PRTKLDRRDR pThis = (PRTKLDRRDR)pRdr;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo pThis->pReader = NULL;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo RTMemFree(pThis);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return 0;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @copydoc KLDRRDROPS::pfnRead */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic int rtkldrRdr_Read( PKRDR pRdr, void *pvBuf, KSIZE cb, KFOFF off)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo int rc = pReader->pfnRead(pReader, pvBuf, cb, off);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return rtkldrConvertErrorFromIPRT(rc);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @copydoc KLDRRDROPS::pfnAllMap */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic int rtkldrRdr_AllMap( PKRDR pRdr, const void **ppvBits)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo int rc = pReader->pfnMap(pReader, ppvBits);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return rtkldrConvertErrorFromIPRT(rc);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @copydoc KLDRRDROPS::pfnAllUnmap */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic int rtkldrRdr_AllUnmap(PKRDR pRdr, const void *pvBits)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo int rc = pReader->pfnUnmap(pReader, pvBits);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return rtkldrConvertErrorFromIPRT(rc);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @copydoc KLDRRDROPS::pfnSize */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic KFOFF rtkldrRdr_Size( PKRDR pRdr)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return (KFOFF)pReader->pfnSize(pReader);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @copydoc KLDRRDROPS::pfnTell */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic KFOFF rtkldrRdr_Tell( PKRDR pRdr)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return (KFOFF)pReader->pfnTell(pReader);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @copydoc KLDRRDROPS::pfnName */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic const char * rtkldrRdr_Name(PKRDR pRdr)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return pReader->pfnLogName(pReader);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @copydoc KLDRRDROPS::pfnNativeFH */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic KIPTR rtkldrRdr_NativeFH(PKRDR pRdr)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo NOREF(pRdr);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo AssertFailed();
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return -1;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @copydoc KLDRRDROPS::pfnPageSize */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic KSIZE rtkldrRdr_PageSize(PKRDR pRdr)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo NOREF(pRdr);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return PAGE_SIZE;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @copydoc KLDRRDROPS::pfnMap */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic int rtkldrRdr_Map( PKRDR pRdr, void **ppvBase, KU32 cSegments, PCKLDRSEG paSegments, KBOOL fFixed)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo //PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo NOREF(pRdr); NOREF(ppvBase); NOREF(cSegments); NOREF(paSegments); NOREF(fFixed);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo AssertFailed();
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return -1;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @copydoc KLDRRDROPS::pfnRefresh */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic int rtkldrRdr_Refresh( PKRDR pRdr, void *pvBase, KU32 cSegments, PCKLDRSEG paSegments)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo //PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo NOREF(pRdr); NOREF(pvBase); NOREF(cSegments); NOREF(paSegments);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo AssertFailed();
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return -1;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @copydoc KLDRRDROPS::pfnProtect */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic int rtkldrRdr_Protect( PKRDR pRdr, void *pvBase, KU32 cSegments, PCKLDRSEG paSegments, KBOOL fUnprotectOrProtect)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo //PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo NOREF(pRdr); NOREF(pvBase); NOREF(cSegments); NOREF(paSegments); NOREF(fUnprotectOrProtect);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo AssertFailed();
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return -1;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @copydoc KLDRRDROPS::pfnUnmap */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic int rtkldrRdr_Unmap( PKRDR pRdr, void *pvBase, KU32 cSegments, PCKLDRSEG paSegments)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo //PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo NOREF(pRdr); NOREF(pvBase); NOREF(cSegments); NOREF(paSegments);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo AssertFailed();
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return -1;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @copydoc KLDRRDROPS::pfnDone */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic void rtkldrRdr_Done( PKRDR pRdr)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo NOREF(pRdr);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo //PRTLDRREADER pReader = ((PRTKLDRRDR)pRdr)->pReader;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/**
298cb3d14d0326f801d6dd105c3e1025227263e0ludo * The file reader operations.
298cb3d14d0326f801d6dd105c3e1025227263e0ludo * We provide our own based on IPRT instead of using the kLdr ones.
298cb3d14d0326f801d6dd105c3e1025227263e0ludo */
298cb3d14d0326f801d6dd105c3e1025227263e0ludoextern "C" const KRDROPS g_kLdrRdrFileOps;
298cb3d14d0326f801d6dd105c3e1025227263e0ludoextern "C" const KRDROPS g_kLdrRdrFileOps =
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* .pszName = */ "IPRT",
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* .pNext = */ NULL,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* .pfnCreate = */ rtkldrRdr_Create,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* .pfnDestroy = */ rtkldrRdr_Destroy,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* .pfnRead = */ rtkldrRdr_Read,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* .pfnAllMap = */ rtkldrRdr_AllMap,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* .pfnAllUnmap = */ rtkldrRdr_AllUnmap,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* .pfnSize = */ rtkldrRdr_Size,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* .pfnTell = */ rtkldrRdr_Tell,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* .pfnName = */ rtkldrRdr_Name,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* .pfnNativeFH = */ rtkldrRdr_NativeFH,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* .pfnPageSize = */ rtkldrRdr_PageSize,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* .pfnMap = */ rtkldrRdr_Map,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* .pfnRefresh = */ rtkldrRdr_Refresh,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* .pfnProtect = */ rtkldrRdr_Protect,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* .pfnUnmap = */ rtkldrRdr_Unmap,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* .pfnDone = */ rtkldrRdr_Done,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* .u32Dummy = */ 42
298cb3d14d0326f801d6dd105c3e1025227263e0ludo};
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @copydoc RTLDROPS::pfnClose */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic DECLCALLBACK(int) rtkldr_Close(PRTLDRMODINTERNAL pMod)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PKLDRMOD pModkLdr = ((PRTLDRMODKLDR)pMod)->pMod;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo int rc = kLdrModClose(pModkLdr);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return rtkldrConvertError(rc);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @copydoc RTLDROPS::pfnDone */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic DECLCALLBACK(int) rtkldr_Done(PRTLDRMODINTERNAL pMod)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PKLDRMOD pModkLdr = ((PRTLDRMODKLDR)pMod)->pMod;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo int rc = kLdrModMostlyDone(pModkLdr);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return rtkldrConvertError(rc);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @copydoc FNKLDRMODENUMSYMS */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic int rtkldrEnumSymbolsWrapper(PKLDRMOD pMod, uint32_t iSymbol,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo const char *pchSymbol, KSIZE cchSymbol, const char *pszVersion,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo KLDRADDR uValue, uint32_t fKind, void *pvUser)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PRTLDRMODKLDRARGS pArgs = (PRTLDRMODKLDRARGS)pvUser;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo NOREF(pMod); NOREF(pszVersion); NOREF(fKind);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* If not zero terminated we'll have to use a temporary buffer. */
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo const char *pszSymbol = pchSymbol;
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo if (pchSymbol && pchSymbol[cchSymbol])
298cb3d14d0326f801d6dd105c3e1025227263e0ludo {
298cb3d14d0326f801d6dd105c3e1025227263e0ludo char *psz = (char *)alloca(cchSymbol + 1);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo memcpy(psz, pchSymbol, cchSymbol);
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo psz[cchSymbol] = '\0';
298cb3d14d0326f801d6dd105c3e1025227263e0ludo pszSymbol = psz;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo }
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#if defined(RT_OS_OS2) || defined(RT_OS_DARWIN)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* skip the underscore prefix. */
298cb3d14d0326f801d6dd105c3e1025227263e0ludo if (*pszSymbol == '_')
298cb3d14d0326f801d6dd105c3e1025227263e0ludo pszSymbol++;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#endif
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo int rc = pArgs->u.pfnEnumSyms(&pArgs->pMod->Core, pszSymbol, iSymbol, uValue, pArgs->pvUser);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo if (RT_FAILURE(rc))
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return rc; /* don't bother converting. */
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return 0;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @copydoc RTLDROPS::pfnEnumSymbols */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic DECLCALLBACK(int) rtkldr_EnumSymbols(PRTLDRMODINTERNAL pMod, unsigned fFlags, const void *pvBits, RTUINTPTR BaseAddress,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PFNRTLDRENUMSYMS pfnCallback, void *pvUser)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo PKLDRMOD pModkLdr = ((PRTLDRMODKLDR)pMod)->pMod;
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo RTLDRMODKLDRARGS Args;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Args.pvUser = pvUser;
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo Args.u.pfnEnumSyms = pfnCallback;
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo Args.pMod = (PRTLDRMODKLDR)pMod;
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo Args.pvBits = pvBits;
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo Args.rc = VINF_SUCCESS;
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo int rc = kLdrModEnumSymbols(pModkLdr, pvBits, BaseAddress,
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo fFlags & RTLDR_ENUM_SYMBOL_FLAGS_ALL ? KLDRMOD_ENUM_SYMS_FLAGS_ALL : 0,
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo rtkldrEnumSymbolsWrapper, &Args);
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo if (Args.rc != VINF_SUCCESS)
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo rc = Args.rc;
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo else
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo rc = rtkldrConvertError(rc);
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo return rc;
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo}
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo/** @copydoc RTLDROPS::pfnGetImageSize */
c1609bb80253d761aebb46efe0e052fb6bb10f5aludostatic DECLCALLBACK(size_t) rtkldr_GetImageSize(PRTLDRMODINTERNAL pMod)
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo{
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo PKLDRMOD pModkLdr = ((PRTLDRMODKLDR)pMod)->pMod;
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo return kLdrModSize(pModkLdr);
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo}
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo/** @copydoc FNKLDRMODGETIMPORT */
c1609bb80253d761aebb46efe0e052fb6bb10f5aludostatic int rtkldrGetImportWrapper(PKLDRMOD pMod, uint32_t iImport, uint32_t iSymbol, const char *pchSymbol, KSIZE cchSymbol,
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo const char *pszVersion, PKLDRADDR puValue, uint32_t *pfKind, void *pvUser)
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo{
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo PRTLDRMODKLDRARGS pArgs = (PRTLDRMODKLDRARGS)pvUser;
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo NOREF(pMod); NOREF(pszVersion); NOREF(pfKind);
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo /* If not zero terminated we'll have to use a temporary buffer. */
c1609bb80253d761aebb46efe0e052fb6bb10f5aludo const char *pszSymbol = pchSymbol;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo if (pchSymbol && pchSymbol[cchSymbol])
298cb3d14d0326f801d6dd105c3e1025227263e0ludo {
298cb3d14d0326f801d6dd105c3e1025227263e0ludo char *psz = (char *)alloca(cchSymbol + 1);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo memcpy(psz, pchSymbol, cchSymbol);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo psz[cchSymbol] = '\0';
298cb3d14d0326f801d6dd105c3e1025227263e0ludo pszSymbol = psz;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo }
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#if defined(RT_OS_OS2) || defined(RT_OS_DARWIN)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* skip the underscore prefix. */
298cb3d14d0326f801d6dd105c3e1025227263e0ludo if (*pszSymbol == '_')
298cb3d14d0326f801d6dd105c3e1025227263e0ludo pszSymbol++;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#endif
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* get the import module name - TODO: cache this */
298cb3d14d0326f801d6dd105c3e1025227263e0ludo const char *pszModule = NULL;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo if (iImport != NIL_KLDRMOD_IMPORT)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo {
298cb3d14d0326f801d6dd105c3e1025227263e0ludo char *pszBuf = (char *)alloca(64);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo int rc = kLdrModGetImport(pMod, pArgs->pvBits, iImport, pszBuf, 64);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo if (rc)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return rc;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo pszModule = pszBuf;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo }
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* do the query */
298cb3d14d0326f801d6dd105c3e1025227263e0ludo RTUINTPTR Value;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo int rc = pArgs->u.pfnGetImport(&pArgs->pMod->Core, pszModule, pszSymbol, pszSymbol ? ~0 : iSymbol, &Value, pArgs->pvUser);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo if (RT_SUCCESS(rc))
298cb3d14d0326f801d6dd105c3e1025227263e0ludo {
298cb3d14d0326f801d6dd105c3e1025227263e0ludo *puValue = Value;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return 0;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo }
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return rtkldrConvertErrorFromIPRT(rc);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @copydoc RTLDROPS::pfnGetBits */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic DECLCALLBACK(int) rtkldr_GetBits(PRTLDRMODINTERNAL pMod, void *pvBits, RTUINTPTR BaseAddress,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PFNRTLDRIMPORT pfnGetImport, void *pvUser)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PKLDRMOD pModkLdr = ((PRTLDRMODKLDR)pMod)->pMod;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo RTLDRMODKLDRARGS Args;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Args.pvUser = pvUser;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Args.u.pfnGetImport = pfnGetImport;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Args.pMod = (PRTLDRMODKLDR)pMod;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Args.pvBits = pvBits;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Args.rc = VINF_SUCCESS;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo int rc = kLdrModGetBits(pModkLdr, pvBits, BaseAddress, rtkldrGetImportWrapper, &Args);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo if (Args.rc != VINF_SUCCESS)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo rc = Args.rc;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo else
298cb3d14d0326f801d6dd105c3e1025227263e0ludo rc = rtkldrConvertError(rc);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return rc;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @copydoc RTLDROPS::pfnRelocate */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic DECLCALLBACK(int) rtkldr_Relocate(PRTLDRMODINTERNAL pMod, void *pvBits, RTUINTPTR NewBaseAddress,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo RTUINTPTR OldBaseAddress, PFNRTLDRIMPORT pfnGetImport, void *pvUser)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PKLDRMOD pModkLdr = ((PRTLDRMODKLDR)pMod)->pMod;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo RTLDRMODKLDRARGS Args;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Args.pvUser = pvUser;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Args.u.pfnGetImport = pfnGetImport;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Args.pMod = (PRTLDRMODKLDR)pMod;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Args.pvBits = pvBits;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Args.rc = VINF_SUCCESS;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo int rc = kLdrModRelocateBits(pModkLdr, pvBits, NewBaseAddress, OldBaseAddress, rtkldrGetImportWrapper, &Args);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo if (Args.rc != VINF_SUCCESS)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo rc = Args.rc;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo else
298cb3d14d0326f801d6dd105c3e1025227263e0ludo rc = rtkldrConvertError(rc);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return rc;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @copydoc RTLDROPS::pfnGetSymbolEx */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic DECLCALLBACK(int) rtkldr_GetSymbolEx(PRTLDRMODINTERNAL pMod, const void *pvBits, RTUINTPTR BaseAddress,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo const char *pszSymbol, RTUINTPTR *pValue)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PKLDRMOD pModkLdr = ((PRTLDRMODKLDR)pMod)->pMod;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo KLDRADDR uValue;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#if defined(RT_OS_OS2) || defined(RT_OS_DARWIN)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /*
298cb3d14d0326f801d6dd105c3e1025227263e0ludo * Add underscore prefix.
298cb3d14d0326f801d6dd105c3e1025227263e0ludo */
298cb3d14d0326f801d6dd105c3e1025227263e0ludo if (pszSymbol)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo {
298cb3d14d0326f801d6dd105c3e1025227263e0ludo size_t cch = strlen(pszSymbol);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo char *psz = (char *)alloca(cch + 2);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo memcpy(psz + 1, pszSymbol, cch + 1);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo *psz = '_';
298cb3d14d0326f801d6dd105c3e1025227263e0ludo pszSymbol = psz;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo }
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#endif
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo int rc = kLdrModQuerySymbol(pModkLdr, pvBits, BaseAddress,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo NIL_KLDRMOD_SYM_ORDINAL, pszSymbol, strlen(pszSymbol), NULL,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo NULL, NULL, &uValue, NULL);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo if (!rc)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo {
298cb3d14d0326f801d6dd105c3e1025227263e0ludo *pValue = uValue;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return VINF_SUCCESS;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo }
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return rtkldrConvertError(rc);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @copydoc FNKLDRENUMDBG */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic int rtkldrEnumDbgInfoWrapper(PKLDRMOD pMod, KU32 iDbgInfo, KLDRDBGINFOTYPE enmType, KI16 iMajorVer, KI16 iMinorVer,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo const char *pszPartNm, KLDRFOFF offFile, KLDRADDR LinkAddress, KLDRSIZE cb,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo const char *pszExtFile, void *pvUser)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PRTLDRMODKLDRARGS pArgs = (PRTLDRMODKLDRARGS)pvUser;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo NOREF(pMod);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo RTLDRDBGINFO DbgInfo;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo RT_ZERO(DbgInfo.u);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo DbgInfo.iDbgInfo = iDbgInfo;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo DbgInfo.offFile = offFile;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo DbgInfo.LinkAddress = LinkAddress;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo DbgInfo.cb = cb;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo DbgInfo.pszExtFile = pszExtFile;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo switch (enmType)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo {
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDRDBGINFOTYPE_UNKNOWN:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo DbgInfo.enmType = RTLDRDBGINFOTYPE_UNKNOWN;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo break;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDRDBGINFOTYPE_STABS:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo DbgInfo.enmType = RTLDRDBGINFOTYPE_STABS;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo break;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDRDBGINFOTYPE_DWARF:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo DbgInfo.enmType = RTLDRDBGINFOTYPE_DWARF;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo if (pszExtFile)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo DbgInfo.enmType = RTLDRDBGINFOTYPE_DWARF_DWO;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo break;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDRDBGINFOTYPE_CODEVIEW:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo DbgInfo.enmType = RTLDRDBGINFOTYPE_CODEVIEW;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* Should make some more effort here... Assume the IPRT loader will kick in before we get here! */
298cb3d14d0326f801d6dd105c3e1025227263e0ludo break;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDRDBGINFOTYPE_WATCOM:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo DbgInfo.enmType = RTLDRDBGINFOTYPE_WATCOM;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo break;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KLDRDBGINFOTYPE_HLL:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo DbgInfo.enmType = RTLDRDBGINFOTYPE_HLL;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo break;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo default:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo AssertFailed();
298cb3d14d0326f801d6dd105c3e1025227263e0ludo DbgInfo.enmType = RTLDRDBGINFOTYPE_UNKNOWN;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo break;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo }
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo int rc = pArgs->u.pfnEnumDbgInfo(&pArgs->pMod->Core, &DbgInfo, pArgs->pvUser);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo if (RT_FAILURE(rc))
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return rc; /* don't bother converting. */
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return 0;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @copydoc RTLDROPS::pfnEnumDbgInfo */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic DECLCALLBACK(int) rtkldr_EnumDbgInfo(PRTLDRMODINTERNAL pMod, const void *pvBits,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PFNRTLDRENUMDBG pfnCallback, void *pvUser)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PRTLDRMODKLDR pThis = (PRTLDRMODKLDR)pMod;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo RTLDRMODKLDRARGS Args;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Args.pvUser = pvUser;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Args.u.pfnEnumDbgInfo = pfnCallback;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Args.pvBits = pvBits;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Args.pMod = pThis;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Args.rc = VINF_SUCCESS;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo int rc = kLdrModEnumDbgInfo(pThis->pMod, pvBits, rtkldrEnumDbgInfoWrapper, &Args);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo if (Args.rc != VINF_SUCCESS)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo rc = Args.rc;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return rc;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @copydoc RTLDROPS::pfnEnumSegments. */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic DECLCALLBACK(int) rtkldr_EnumSegments(PRTLDRMODINTERNAL pMod, PFNRTLDRENUMSEGS pfnCallback, void *pvUser)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PRTLDRMODKLDR pThis = (PRTLDRMODKLDR)pMod;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo uint32_t const cSegments = pThis->pMod->cSegments;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PCKLDRSEG paSegments = &pThis->pMod->aSegments[0];
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo for (uint32_t iSeg = 0; iSeg < cSegments; iSeg++)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo {
298cb3d14d0326f801d6dd105c3e1025227263e0ludo RTLDRSEG Seg;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Seg.pchName = paSegments[iSeg].pchName;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Seg.cchName = paSegments[iSeg].cchName;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Seg.SelFlat = paSegments[iSeg].SelFlat;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Seg.Sel16bit = paSegments[iSeg].Sel16bit;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Seg.fFlags = paSegments[iSeg].fFlags;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo AssertCompile(KLDRSEG_FLAG_16BIT == RTLDRSEG_FLAG_16BIT );
298cb3d14d0326f801d6dd105c3e1025227263e0ludo AssertCompile(KLDRSEG_FLAG_OS2_ALIAS16 == RTLDRSEG_FLAG_OS2_ALIAS16);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo AssertCompile(KLDRSEG_FLAG_OS2_CONFORM == RTLDRSEG_FLAG_OS2_CONFORM);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo AssertCompile(KLDRSEG_FLAG_OS2_IOPL == RTLDRSEG_FLAG_OS2_IOPL );
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo switch (paSegments[iSeg].enmProt)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo {
298cb3d14d0326f801d6dd105c3e1025227263e0ludo default:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo AssertMsgFailed(("%d\n", paSegments[iSeg].enmProt));
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KPROT_NOACCESS:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Seg.fProt = 0;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo break;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KPROT_READONLY: Seg.fProt = RTMEM_PROT_READ; break;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KPROT_READWRITE: Seg.fProt = RTMEM_PROT_READ | RTMEM_PROT_WRITE; break;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KPROT_WRITECOPY: Seg.fProt = RTMEM_PROT_WRITE; break;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KPROT_EXECUTE: Seg.fProt = RTMEM_PROT_EXEC; break;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KPROT_EXECUTE_READ: Seg.fProt = RTMEM_PROT_EXEC | RTMEM_PROT_READ; break;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KPROT_EXECUTE_READWRITE: Seg.fProt = RTMEM_PROT_EXEC | RTMEM_PROT_READ | RTMEM_PROT_WRITE; break;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case KPROT_EXECUTE_WRITECOPY: Seg.fProt = RTMEM_PROT_EXEC | RTMEM_PROT_WRITE; break;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo }
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Seg.cb = paSegments[iSeg].cb;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Seg.Alignment = paSegments[iSeg].Alignment;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Seg.LinkAddress = paSegments[iSeg].LinkAddress;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Seg.offFile = paSegments[iSeg].offFile;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Seg.cbFile = paSegments[iSeg].cbFile;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Seg.RVA = paSegments[iSeg].RVA;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Seg.cbMapped = paSegments[iSeg].cbMapped;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo int rc = pfnCallback(pMod, &Seg, pvUser);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo if (rc != VINF_SUCCESS)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return rc;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo }
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return VINF_SUCCESS;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @copydoc RTLDROPS::pfnLinkAddressToSegOffset. */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic DECLCALLBACK(int) rtkldr_LinkAddressToSegOffset(PRTLDRMODINTERNAL pMod, RTLDRADDR LinkAddress,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo uint32_t *piSeg, PRTLDRADDR poffSeg)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PRTLDRMODKLDR pThis = (PRTLDRMODKLDR)pMod;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo uint32_t const cSegments = pThis->pMod->cSegments;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PCKLDRSEG paSegments = &pThis->pMod->aSegments[0];
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo for (uint32_t iSeg = 0; iSeg < cSegments; iSeg++)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo {
298cb3d14d0326f801d6dd105c3e1025227263e0ludo KLDRADDR offSeg = LinkAddress - paSegments[iSeg].LinkAddress;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo if ( offSeg < paSegments[iSeg].cbMapped
298cb3d14d0326f801d6dd105c3e1025227263e0ludo || offSeg < paSegments[iSeg].cb)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo {
298cb3d14d0326f801d6dd105c3e1025227263e0ludo *piSeg = iSeg;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo *poffSeg = offSeg;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return VINF_SUCCESS;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo }
298cb3d14d0326f801d6dd105c3e1025227263e0ludo }
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return VERR_LDR_INVALID_LINK_ADDRESS;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @copydoc RTLDROPS::pfnLinkAddressToRva. */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic DECLCALLBACK(int) rtkldr_LinkAddressToRva(PRTLDRMODINTERNAL pMod, RTLDRADDR LinkAddress, PRTLDRADDR pRva)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PRTLDRMODKLDR pThis = (PRTLDRMODKLDR)pMod;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo uint32_t const cSegments = pThis->pMod->cSegments;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PCKLDRSEG paSegments = &pThis->pMod->aSegments[0];
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo for (uint32_t iSeg = 0; iSeg < cSegments; iSeg++)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo {
298cb3d14d0326f801d6dd105c3e1025227263e0ludo KLDRADDR offSeg = LinkAddress - paSegments[iSeg].LinkAddress;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo if ( offSeg < paSegments[iSeg].cbMapped
298cb3d14d0326f801d6dd105c3e1025227263e0ludo || offSeg < paSegments[iSeg].cb)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo {
298cb3d14d0326f801d6dd105c3e1025227263e0ludo *pRva = paSegments[iSeg].RVA + offSeg;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return VINF_SUCCESS;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo }
298cb3d14d0326f801d6dd105c3e1025227263e0ludo }
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return VERR_LDR_INVALID_RVA;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @copydoc RTLDROPS::pfnSegOffsetToRva. */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic DECLCALLBACK(int) rtkldr_SegOffsetToRva(PRTLDRMODINTERNAL pMod, uint32_t iSeg, RTLDRADDR offSeg,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PRTLDRADDR pRva)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PRTLDRMODKLDR pThis = (PRTLDRMODKLDR)pMod;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo if (iSeg >= pThis->pMod->cSegments)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return VERR_LDR_INVALID_SEG_OFFSET;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PCKLDRSEG const pSegment = &pThis->pMod->aSegments[iSeg];
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo if ( offSeg > pSegment->cbMapped
298cb3d14d0326f801d6dd105c3e1025227263e0ludo && offSeg > pSegment->cb
298cb3d14d0326f801d6dd105c3e1025227263e0ludo && ( pSegment->cbFile < 0
298cb3d14d0326f801d6dd105c3e1025227263e0ludo || offSeg > (uint64_t)pSegment->cbFile))
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return VERR_LDR_INVALID_SEG_OFFSET;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo *pRva = pSegment->RVA + offSeg;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return VINF_SUCCESS;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/** @copydoc RTLDROPS::pfnRvaToSegOffset. */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic DECLCALLBACK(int) rtkldr_RvaToSegOffset(PRTLDRMODINTERNAL pMod, RTLDRADDR Rva,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo uint32_t *piSeg, PRTLDRADDR poffSeg)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PRTLDRMODKLDR pThis = (PRTLDRMODKLDR)pMod;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo uint32_t const cSegments = pThis->pMod->cSegments;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PCKLDRSEG paSegments = &pThis->pMod->aSegments[0];
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo for (uint32_t iSeg = 0; iSeg < cSegments; iSeg++)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo {
298cb3d14d0326f801d6dd105c3e1025227263e0ludo KLDRADDR offSeg = Rva - paSegments[iSeg].RVA;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo if ( offSeg < paSegments[iSeg].cbMapped
298cb3d14d0326f801d6dd105c3e1025227263e0ludo || offSeg < paSegments[iSeg].cb)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo {
298cb3d14d0326f801d6dd105c3e1025227263e0ludo *piSeg = iSeg;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo *poffSeg = offSeg;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return VINF_SUCCESS;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo }
298cb3d14d0326f801d6dd105c3e1025227263e0ludo }
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return VERR_LDR_INVALID_RVA;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/**
298cb3d14d0326f801d6dd105c3e1025227263e0ludo * Operations for a kLdr module.
298cb3d14d0326f801d6dd105c3e1025227263e0ludo */
298cb3d14d0326f801d6dd105c3e1025227263e0ludostatic const RTLDROPS g_rtkldrOps =
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo "kLdr",
298cb3d14d0326f801d6dd105c3e1025227263e0ludo rtkldr_Close,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo NULL,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo rtkldr_Done,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo rtkldr_EnumSymbols,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* ext */
298cb3d14d0326f801d6dd105c3e1025227263e0ludo rtkldr_GetImageSize,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo rtkldr_GetBits,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo rtkldr_Relocate,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo rtkldr_GetSymbolEx,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo rtkldr_EnumDbgInfo,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo rtkldr_EnumSegments,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo rtkldr_LinkAddressToSegOffset,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo rtkldr_LinkAddressToRva,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo rtkldr_SegOffsetToRva,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo rtkldr_RvaToSegOffset,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo 42
298cb3d14d0326f801d6dd105c3e1025227263e0ludo};
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo/**
298cb3d14d0326f801d6dd105c3e1025227263e0ludo * Open a image using kLdr.
298cb3d14d0326f801d6dd105c3e1025227263e0ludo *
298cb3d14d0326f801d6dd105c3e1025227263e0ludo * @returns iprt status code.
298cb3d14d0326f801d6dd105c3e1025227263e0ludo * @param pReader The loader reader instance which will provide the raw image bits.
298cb3d14d0326f801d6dd105c3e1025227263e0ludo * @param fFlags Reserved, MBZ.
298cb3d14d0326f801d6dd105c3e1025227263e0ludo * @param enmArch CPU architecture specifier for the image to be loaded.
298cb3d14d0326f801d6dd105c3e1025227263e0ludo * @param phLdrMod Where to store the handle.
298cb3d14d0326f801d6dd105c3e1025227263e0ludo */
298cb3d14d0326f801d6dd105c3e1025227263e0ludoint rtldrkLdrOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo{
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* Convert enmArch to k-speak. */
298cb3d14d0326f801d6dd105c3e1025227263e0ludo KCPUARCH enmCpuArch;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo switch (enmArch)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo {
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case RTLDRARCH_WHATEVER:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo enmCpuArch = KCPUARCH_UNKNOWN;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo break;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case RTLDRARCH_X86_32:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo enmCpuArch = KCPUARCH_X86_32;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo break;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo case RTLDRARCH_AMD64:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo enmCpuArch = KCPUARCH_AMD64;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo break;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo default:
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return VERR_INVALID_PARAMETER;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo }
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* Create a rtkldrRdr_ instance. */
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PRTKLDRRDR pRdr = (PRTKLDRRDR)RTMemAllocZ(sizeof(*pRdr));
298cb3d14d0326f801d6dd105c3e1025227263e0ludo if (!pRdr)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return VERR_NO_MEMORY;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo pRdr->Core.u32Magic = KRDR_MAGIC;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo pRdr->Core.pOps = &g_kLdrRdrFileOps;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo pRdr->pReader = pReader;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* Try open it. */
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PKLDRMOD pMod;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo int krc = kLdrModOpenFromRdr(&pRdr->Core, fFlags, enmCpuArch, &pMod);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo if (!krc)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo {
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* Create a module wrapper for it. */
298cb3d14d0326f801d6dd105c3e1025227263e0ludo PRTLDRMODKLDR pNewMod = (PRTLDRMODKLDR)RTMemAllocZ(sizeof(*pNewMod));
298cb3d14d0326f801d6dd105c3e1025227263e0ludo if (pNewMod)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo {
298cb3d14d0326f801d6dd105c3e1025227263e0ludo pNewMod->Core.u32Magic = RTLDRMOD_MAGIC;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo pNewMod->Core.eState = LDR_STATE_OPENED;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo pNewMod->Core.pOps = &g_rtkldrOps;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo pNewMod->Core.pReader = pReader;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo pNewMod->pMod = pMod;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo *phLdrMod = &pNewMod->Core;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#ifdef LOG_ENABLED
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Log(("rtldrkLdrOpen: '%s' (%s) %u segments\n",
298cb3d14d0326f801d6dd105c3e1025227263e0ludo pMod->pszName, pMod->pszFilename, pMod->cSegments));
298cb3d14d0326f801d6dd105c3e1025227263e0ludo for (unsigned iSeg = 0; iSeg < pMod->cSegments; iSeg++)
298cb3d14d0326f801d6dd105c3e1025227263e0ludo {
298cb3d14d0326f801d6dd105c3e1025227263e0ludo Log(("Segment #%-2u: RVA=%08llx cb=%08llx '%.*s'\n", iSeg,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo pMod->aSegments[iSeg].RVA,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo pMod->aSegments[iSeg].cb,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo pMod->aSegments[iSeg].cchName,
298cb3d14d0326f801d6dd105c3e1025227263e0ludo pMod->aSegments[iSeg].pchName));
298cb3d14d0326f801d6dd105c3e1025227263e0ludo }
298cb3d14d0326f801d6dd105c3e1025227263e0ludo#endif
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return VINF_SUCCESS;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo }
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo /* bail out */
298cb3d14d0326f801d6dd105c3e1025227263e0ludo kLdrModClose(pMod);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo krc = KERR_NO_MEMORY;
298cb3d14d0326f801d6dd105c3e1025227263e0ludo }
298cb3d14d0326f801d6dd105c3e1025227263e0ludo else
298cb3d14d0326f801d6dd105c3e1025227263e0ludo RTMemFree(pRdr);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo return rtkldrConvertError(krc);
298cb3d14d0326f801d6dd105c3e1025227263e0ludo}
298cb3d14d0326f801d6dd105c3e1025227263e0ludo
298cb3d14d0326f801d6dd105c3e1025227263e0ludo