VirtualBox

Changeset 74638 in vbox for trunk/src


Ignore:
Timestamp:
Oct 6, 2018 6:31:59 PM (6 years ago)
Author:
vboxsync
Message:

IPRT: Initial adaption of the kstuff loader code. bugref:9232

Location:
trunk/src/VBox/Runtime
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/.scm-settings

    r70384 r74638  
    9797/r3/win/VBoxRT-msvcr100-win32.def              : --external-copyright
    9898
     99/common/ldr/ldrLX.cpp                          : --external-copyright
     100/common/ldr/ldrMachO.cpp                       : --external-copyright
     101
    99102/common/math/x86/fenv-x86.c                    : --external-copyright --no-convert-tabs
    100103
  • trunk/src/VBox/Runtime/Makefile.kmk

    r74460 r74638  
    265265        LDR_WITH_NATIVE \
    266266        LDR_WITH_ELF32 \
     267        LDR_WITH_LX \
    267268        LDR_WITH_PE \
    268269        RT_WITH_VBOX \
     
    271272        IPRT_WITH_OPENSSL \
    272273        NOFILEID
     274#       += LDR_WITH_MACHO
    273275if1of ($(KBUILD_TARGET_ARCH), amd64 x86)
    274276 RuntimeR3_DEFS         += \
     
    456458        common/ldr/ldrFile.cpp \
    457459        common/ldr/ldrVfsFile.cpp \
     460        common/ldr/ldrLX.cpp \
     461        common/ldr/ldrMachO.cpp \
    458462        common/ldr/ldrMemory.cpp \
    459463        common/ldr/ldrNative.cpp \
     
    16251629        common/ldr/ldrFile.cpp \
    16261630        common/ldr/ldrkStuff.cpp \
     1631        common/ldr/ldrLX.cpp \
     1632        common/ldr/ldrMachO.cpp \
    16271633        common/ldr/ldrNative.cpp \
    16281634        common/ldr/ldrPE.cpp \
  • trunk/src/VBox/Runtime/common/ldr/ldrELF.cpp

    r73531 r74638  
    121121 * @param   pErrInfo    Where to return extended error information. Optional.
    122122 */
    123 int rtldrELFOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo)
     123DECLHIDDEN(int) rtldrELFOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo)
    124124{
    125125    const char *pszLogName = pReader->pfnLogName(pReader); NOREF(pszLogName);
  • trunk/src/VBox/Runtime/common/ldr/ldrEx.cpp

    r73759 r74638  
    4242#include <iprt/string.h>
    4343#include <iprt/formats/mz.h>
     44#include <iprt/formats/mach-o.h>
    4445#include "internal/ldr.h"
    4546
     
    8182        &&  uSign.u32     != IMAGE_NT_SIGNATURE
    8283        &&  uSign.u32     != IMAGE_ELF_SIGNATURE
    83         &&  uSign.au16[0] != IMAGE_LX_SIGNATURE)
     84        &&  uSign.au16[0] != IMAGE_LX_SIGNATURE
     85        &&  uSign.u32     != IMAGE_MACHO64_SIGNATURE
     86        &&  uSign.u32     != IMAGE_MACHO64_SIGNATURE_OE
     87        &&  uSign.u32     != IMAGE_MACHO32_SIGNATURE
     88        &&  uSign.u32     != IMAGE_MACHO32_SIGNATURE_OE
     89        &&  uSign.u32     != IMAGE_FAT_SIGNATURE
     90        &&  uSign.u32     != IMAGE_FAT_SIGNATURE_OE )
    8491    {
    8592        Log(("rtldrOpenWithReader: %s: unknown magic %#x / '%.4s\n", pReader->pfnLogName(pReader), uSign.u32, &uSign.ach[0]));
     
    127134        rc = VERR_ELF_EXE_NOT_SUPPORTED;
    128135#endif
     136    else if (   uSign.u32 == IMAGE_MACHO64_SIGNATURE
     137             || uSign.u32 == IMAGE_MACHO64_SIGNATURE_OE
     138             || uSign.u32 == IMAGE_MACHO32_SIGNATURE
     139             || uSign.u32 == IMAGE_MACHO32_SIGNATURE_OE)
     140#if defined(LDR_WITH_MACHO)
     141        rc = rtldrMachOOpen(pReader, fFlags, enmArch, offHdr, phMod, pErrInfo);
     142#else
     143        rc = VERR_INVALID_EXE_SIGNATURE;
     144#endif
     145    else if (   uSign.u32 == IMAGE_FAT_SIGNATURE
     146             || uSign.u32 == IMAGE_FAT_SIGNATURE_OE)
     147#if defined(LDR_WITH_MACHO)
     148        rc = rtldrFatOpen(pReader, fFlags, enmArch, phMod, pErrInfo);
     149#else
     150        rc = VERR_INVALID_EXE_SIGNATURE;
     151#endif
    129152    else if (uSign.au16[0] == IMAGE_LX_SIGNATURE)
    130153#ifdef LDR_WITH_LX
  • trunk/src/VBox/Runtime/common/ldr/ldrLX.cpp

    r74636 r74638  
    2929 */
    3030
    31 /*******************************************************************************
    32 *   Header Files                                                               *
    33 *******************************************************************************/
    34 #include <k/kLdr.h>
    35 #include "kLdrInternal.h"
    36 #include <k/kLdrFmts/lx.h>
    37 
    38 
    39 /*******************************************************************************
    40 *   Defined Constants And Macros                                               *
    41 *******************************************************************************/
     31
     32/*********************************************************************************************************************************
     33*   Header Files                                                                                                                 *
     34*********************************************************************************************************************************/
     35#define LOG_GROUP RTLOGGROUP_LDR
     36#include <iprt/ldr.h>
     37#include "internal/iprt.h"
     38
     39#include <iprt/asm.h>
     40#include <iprt/assert.h>
     41#include <iprt/err.h>
     42#include <iprt/log.h>
     43#include <iprt/mem.h>
     44#include <iprt/string.h>
     45
     46#include <iprt/formats/lx.h>
     47#include "internal/ldr.h"
     48
     49
     50/*********************************************************************************************************************************
     51*   Defined Constants And Macros                                                                                                 *
     52*********************************************************************************************************************************/
    4253/** @def KLDRMODLX_STRICT
    4354 * Define KLDRMODLX_STRICT to enabled strict checks in KLDRMODLX. */
     
    4859 */
    4960#ifdef KLDRMODLX_STRICT
    50 # define KLDRMODLX_ASSERT(expr)  kHlpAssert(expr)
     61# define KLDRMODLX_ASSERT(expr)  Assert(expr)
    5162#else
    5263# define KLDRMODLX_ASSERT(expr)  do {} while (0)
     
    5465
    5566
    56 /*******************************************************************************
    57 *   Structures and Typedefs                                                    *
    58 *******************************************************************************/
     67/*********************************************************************************************************************************
     68*   Structures and Typedefs                                                                                                      *
     69*********************************************************************************************************************************/
    5970/**
    6071 * Instance data for the LX module interpreter.
     
    6273typedef struct KLDRMODLX
    6374{
    64     /** Pointer to the module. (Follows the section table.) */
    65     PKLDRMOD                pMod;
     75    /** Core module structure. */
     76    RTLDRMODINTERNAL        Core;
     77
    6678    /** Pointer to the user mapping. */
    6779    const void             *pvMapping;
    6880    /** The size of the mapped LX image. */
    69     KSIZE                   cbMapped;
     81    size_t                  cbMapped;
    7082    /** Reserved flags. */
    71     KU32                    f32Reserved;
     83    uint32_t                f32Reserved;
    7284
    7385    /** The offset of the LX header. */
    74     KLDRFOFF                offHdr;
     86    RTFOFF                  offHdr;
    7587    /** Copy of the LX header. */
    7688    struct e32_exe          Hdr;
     
    7890    /** Pointer to the loader section.
    7991     * Allocated together with this strcture. */
    80     const KU8              *pbLoaderSection;
     92    const uint8_t          *pbLoaderSection;
    8193    /** Pointer to the last byte in the loader section. */
    82     const KU8              *pbLoaderSectionLast;
     94    const uint8_t          *pbLoaderSectionLast;
    8395    /** Pointer to the object table in the loader section. */
    8496    const struct o32_obj   *paObjs;
     
    88100    const struct rsrc32    *paRsrcs;
    89101    /** Pointer to the resident name table in the loader section. */
    90     const KU8              *pbResNameTab;
     102    const uint8_t          *pbResNameTab;
    91103    /** Pointer to the entry table in the loader section. */
    92     const KU8              *pbEntryTab;
     104    const uint8_t          *pbEntryTab;
    93105
    94106    /** Pointer to the non-resident name table. */
    95     KU8                    *pbNonResNameTab;
     107    uint8_t                *pbNonResNameTab;
    96108    /** Pointer to the last byte in the non-resident name table. */
    97     const KU8              *pbNonResNameTabLast;
     109    const uint8_t          *pbNonResNameTabLast;
    98110
    99111    /** Pointer to the fixup section. */
    100     KU8                    *pbFixupSection;
     112    uint8_t                *pbFixupSection;
    101113    /** Pointer to the last byte in the fixup section. */
    102     const KU8              *pbFixupSectionLast;
     114    const uint8_t          *pbFixupSectionLast;
    103115    /** Pointer to the fixup page table within pvFixupSection. */
    104     const KU32             *paoffPageFixups;
     116    const uint32_t         *paoffPageFixups;
    105117    /** Pointer to the fixup record table within pvFixupSection. */
    106     const KU8              *pbFixupRecs;
     118    const uint8_t          *pbFixupRecs;
    107119    /** Pointer to the import module name table within pvFixupSection. */
    108     const KU8              *pbImportMods;
     120    const uint8_t          *pbImportMods;
    109121    /** Pointer to the import module name table within pvFixupSection. */
    110     const KU8              *pbImportProcs;
     122    const uint8_t          *pbImportProcs;
     123
     124    /** Pointer to the module name (in the resident name table). */
     125    const char             *pszName;
     126    /** The name length. */
     127    size_t                  cchName;
     128
     129    /** The target CPU. */
     130    RTLDRCPU                enmCpu;
     131    /** Number of segments in aSegments. */
     132    uint32_t                cSegments;
     133    /** Segment info. */
     134    RTLDRSEG                aSegments[RT_FLEXIBLE_ARRAY];
    111135} KLDRMODLX, *PKLDRMODLX;
    112136
    113137
    114 /*******************************************************************************
    115 *   Internal Functions                                                         *
    116 *******************************************************************************/
    117 static int kldrModLXHasDbgInfo(PKLDRMOD pMod, const void *pvBits);
    118 static int kldrModLXRelocateBits(PKLDRMOD pMod, void *pvBits, KLDRADDR NewBaseAddress, KLDRADDR OldBaseAddress,
    119                                  PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser);
    120 static int kldrModLXDoCreate(PKRDR pRdr, KLDRFOFF offNewHdr, PKLDRMODLX *ppModLX);
    121 static const KU8 *kldrModLXDoNameTableLookupByOrdinal(const KU8 *pbNameTable, KSSIZE cbNameTable, KU32 iOrdinal);
    122 static int kldrModLXDoNameLookup(PKLDRMODLX pModLX, const char *pchSymbol, KSIZE cchSymbol, KU32 *piSymbol);
    123 static const KU8 *kldrModLXDoNameTableLookupByName(const KU8 *pbNameTable, KSSIZE cbNameTable,
    124                                                        const char *pchSymbol, KSIZE cchSymbol);
     138/*********************************************************************************************************************************
     139*   Internal Functions                                                                                                           *
     140*********************************************************************************************************************************/
     141static int kldrModLXHasDbgInfo(PRTLDRMODINTERNAL pMod, const void *pvBits);
     142static DECLCALLBACK(int) rtldrLX_RelocateBits(PRTLDRMODINTERNAL pMod, void *pvBits, RTUINTPTR NewBaseAddress,
     143                                              RTUINTPTR OldBaseAddress, PFNRTLDRIMPORT pfnGetImport, void *pvUser);
     144static const uint8_t *kldrModLXDoNameTableLookupByOrdinal(const uint8_t *pbNameTable, ssize_t cbNameTable, uint32_t iOrdinal);
     145static int kldrModLXDoNameLookup(PKLDRMODLX pModLX, const char *pchSymbol, size_t cchSymbol, uint32_t *piSymbol);
     146static const uint8_t *kldrModLXDoNameTableLookupByName(const uint8_t *pbNameTable, ssize_t cbNameTable,
     147                                                       const char *pchSymbol, size_t cchSymbol);
     148static int kldrModLXGetImport(PKLDRMODLX pThis, const void *pvBits, uint32_t iImport,
     149                              char *pszName, size_t cchName, size_t *pcbNeeded);
    125150static int kldrModLXDoLoadBits(PKLDRMODLX pModLX, void *pvBits);
    126 static int kldrModLXDoIterDataUnpacking(KU8 *pbDst, const KU8 *pbSrc, int cbSrc);
    127 static int kldrModLXDoIterData2Unpacking(KU8 *pbDst, const KU8 *pbSrc, int cbSrc);
    128 static void kLdrModLXMemCopyW(KU8 *pbDst, const KU8 *pbSrc, int cb);
     151static int kldrModLXDoIterDataUnpacking(uint8_t *pbDst, const uint8_t *pbSrc, int cbSrc);
     152static int kldrModLXDoIterData2Unpacking(uint8_t *pbDst, const uint8_t *pbSrc, int cbSrc);
     153static void kLdrModLXMemCopyW(uint8_t *pbDst, const uint8_t *pbSrc, int cb);
    129154static int kldrModLXDoProtect(PKLDRMODLX pModLX, void *pvBits, unsigned fUnprotectOrProtect);
    130 static int kldrModLXDoCallDLL(PKLDRMODLX pModLX, void *pvMapping, unsigned uOp, KUPTR uHandle);
     155static int kldrModLXDoCallDLL(PKLDRMODLX pModLX, void *pvMapping, unsigned uOp, uintptr_t uHandle);
    131156static int kldrModLXDoForwarderQuery(PKLDRMODLX pModLX, const struct e32_entry *pEntry,
    132                                      PFNKLDRMODGETIMPORT pfnGetForwarder, void *pvUser, PKLDRADDR puValue, KU32 *pfKind);
     157                                     PFNRTLDRIMPORT pfnGetForwarder, void *pvUser, PRTLDRADDR puValue, uint32_t *pfKind);
    133158static int kldrModLXDoLoadFixupSection(PKLDRMODLX pModLX);
    134 static KI32 kldrModLXDoCall(KUPTR uEntrypoint, KUPTR uHandle, KU32 uOp, void *pvReserved);
    135 static int kldrModLXDoReloc(KU8 *pbPage, int off, KLDRADDR PageAddress, const struct r32_rlc *prlc,
    136                             int iSelector, KLDRADDR uValue, KU32 fKind);
    137 
    138 
    139 /**
    140  * Create a loader module instance interpreting the executable image found
    141  * in the specified file provider instance.
    142  *
    143  * @returns 0 on success and *ppMod pointing to a module instance.
    144  *          On failure, a non-zero OS specific error code is returned.
    145  * @param   pOps            Pointer to the registered method table.
    146  * @param   pRdr            The file provider instance to use.
    147  * @param   fFlags          Flags, MBZ.
    148  * @param   enmCpuArch      The desired CPU architecture. KCPUARCH_UNKNOWN means
    149  *                          anything goes, but with a preference for the current
    150  *                          host architecture.
    151  * @param   offNewHdr       The offset of the new header in MZ files. -1 if not found.
    152  * @param   ppMod           Where to store the module instance pointer.
    153  */
    154 static int kldrModLXCreate(PCKLDRMODOPS pOps, PKRDR pRdr, KU32 fFlags, KCPUARCH enmCpuArch, KLDRFOFF offNewHdr, PPKLDRMOD ppMod)
    155 {
    156     PKLDRMODLX pModLX;
    157     int rc;
    158     K_NOREF(fFlags);
    159 
    160     /*
    161      * Create the instance data and do a minimal header validation.
    162      */
    163     rc = kldrModLXDoCreate(pRdr, offNewHdr, &pModLX);
    164     if (!rc)
    165     {
    166         /*
    167          * Match up against the requested CPU architecture.
    168          */
    169         if (    enmCpuArch == KCPUARCH_UNKNOWN
    170             ||  pModLX->pMod->enmArch == enmCpuArch)
    171         {
    172             pModLX->pMod->pOps = pOps;
    173             pModLX->pMod->u32Magic = KLDRMOD_MAGIC;
    174             *ppMod = pModLX->pMod;
    175             return 0;
    176         }
    177         rc = KLDR_ERR_CPU_ARCH_MISMATCH;
    178     }
    179     kHlpFree(pModLX);
    180     return rc;
    181 }
     159static int32_t kldrModLXDoCall(uintptr_t uEntrypoint, uintptr_t uHandle, uint32_t uOp, void *pvReserved);
     160static int kldrModLXDoReloc(uint8_t *pbPage, int off, RTLDRADDR PageAddress, const struct r32_rlc *prlc,
     161                            int iSelector, RTLDRADDR uValue, uint32_t fKind);
    182162
    183163
     
    186166 * simplify cleanup on failure.
    187167 */
    188 static int kldrModLXDoCreate(PKRDR pRdr, KLDRFOFF offNewHdr, PKLDRMODLX *ppModLX)
     168static int kldrModLXDoCreate(PRTLDRREADER pRdr, RTFOFF offNewHdr, uint32_t fFlags, PKLDRMODLX *ppModLX, PRTERRINFO pErrInfo)
    189169{
    190170    struct e32_exe Hdr;
    191171    PKLDRMODLX pModLX;
    192     PKLDRMOD pMod;
    193     KSIZE cb;
    194     KSIZE cchFilename;
    195     KSIZE offLdrStuff;
    196     KU32 off, offEnd;
    197     KU32 i;
    198     int rc;
     172    uint32_t off, offEnd;
     173    uint32_t i;
    199174    int fCanOptimizeMapping;
    200     KU32 NextRVA;
     175    uint32_t NextRVA;
     176
     177    RT_NOREF(fFlags);
    201178    *ppModLX = NULL;
    202179
     
    204181     * Read the signature and file header.
    205182     */
    206     rc = kRdrRead(pRdr, &Hdr, sizeof(Hdr), offNewHdr > 0 ? offNewHdr : 0);
    207     if (rc)
    208         return rc;
     183    int rc = pRdr->pfnRead(pRdr, &Hdr, sizeof(Hdr), offNewHdr > 0 ? offNewHdr : 0);
     184    if (RT_FAILURE(rc))
     185        return RTErrInfoSetF(pErrInfo, rc, "Error reading LX header at %RTfoff: %Rrc", offNewHdr, rc);
    209186    if (    Hdr.e32_magic[0] != E32MAGIC1
    210187        ||  Hdr.e32_magic[1] != E32MAGIC2)
    211         return KLDR_ERR_UNKNOWN_FORMAT;
     188        return RTErrInfoSetF(pErrInfo, VERR_INVALID_EXE_SIGNATURE, "Not LX magic: %02x %02x", Hdr.e32_magic[0], Hdr.e32_magic[1]);
    212189
    213190    /* We're not interested in anything but x86 images. */
     
    219196        ||  Hdr.e32_pagesize != OBJPAGELEN
    220197        )
    221         return KLDR_ERR_LX_BAD_HEADER;
     198        return VERR_LDRLX_BAD_HEADER;
    222199
    223200    /* Some rough sanity checks. */
    224     offEnd = kRdrSize(pRdr) >= (KLDRFOFF)~(KU32)16 ? ~(KU32)16 : (KU32)kRdrSize(pRdr);
     201    offEnd = pRdr->pfnSize(pRdr) >= (RTFOFF)~(uint32_t)16 ? ~(uint32_t)16 : (uint32_t)pRdr->pfnSize(pRdr);
    225202    if (    Hdr.e32_itermap > offEnd
    226203        ||  Hdr.e32_datapage > offEnd
     
    230207        ||  Hdr.e32_fixupsize > offEnd - offNewHdr - sizeof(Hdr)
    231208        ||  Hdr.e32_fixupsize + Hdr.e32_ldrsize > offEnd - offNewHdr - sizeof(Hdr))
    232         return KLDR_ERR_LX_BAD_HEADER;
     209        return VERR_LDRLX_BAD_HEADER;
    233210
    234211    /* Verify the loader section. */
    235212    offEnd = Hdr.e32_objtab + Hdr.e32_ldrsize;
    236213    if (Hdr.e32_objtab < sizeof(Hdr))
    237         return KLDR_ERR_LX_BAD_LOADER_SECTION;
     214        return VERR_LDRLX_BAD_LOADER_SECTION;
    238215    off = Hdr.e32_objtab + sizeof(struct o32_obj) * Hdr.e32_objcnt;
    239216    if (off > offEnd)
    240         return KLDR_ERR_LX_BAD_LOADER_SECTION;
     217        return VERR_LDRLX_BAD_LOADER_SECTION;
    241218    if (    Hdr.e32_objmap
    242219        &&  (Hdr.e32_objmap < off || Hdr.e32_objmap > offEnd))
    243         return KLDR_ERR_LX_BAD_LOADER_SECTION;
     220        return VERR_LDRLX_BAD_LOADER_SECTION;
    244221    if (    Hdr.e32_rsrccnt
    245222        && (   Hdr.e32_rsrctab < off
    246223            || Hdr.e32_rsrctab > offEnd
    247224            || Hdr.e32_rsrctab + sizeof(struct rsrc32) * Hdr.e32_rsrccnt > offEnd))
    248         return KLDR_ERR_LX_BAD_LOADER_SECTION;
     225        return VERR_LDRLX_BAD_LOADER_SECTION;
    249226    if (    Hdr.e32_restab
    250227        &&  (Hdr.e32_restab < off || Hdr.e32_restab > offEnd - 2))
    251         return KLDR_ERR_LX_BAD_LOADER_SECTION;
     228        return VERR_LDRLX_BAD_LOADER_SECTION;
    252229    if (    Hdr.e32_enttab
    253230        &&  (Hdr.e32_enttab < off || Hdr.e32_enttab >= offEnd))
    254         return KLDR_ERR_LX_BAD_LOADER_SECTION;
     231        return VERR_LDRLX_BAD_LOADER_SECTION;
    255232    if (    Hdr.e32_dircnt
    256233        && (Hdr.e32_dirtab < off || Hdr.e32_dirtab > offEnd - 2))
    257         return KLDR_ERR_LX_BAD_LOADER_SECTION;
     234        return VERR_LDRLX_BAD_LOADER_SECTION;
    258235
    259236    /* Verify the fixup section. */
     
    272249    if (    Hdr.e32_frectab
    273250        &&  (Hdr.e32_frectab < off || Hdr.e32_frectab > offEnd))
    274         return KLDR_ERR_LX_BAD_FIXUP_SECTION;
     251        return VERR_LDRLX_BAD_FIXUP_SECTION;
    275252    if (    Hdr.e32_impmod
    276253        &&  (Hdr.e32_impmod < off || Hdr.e32_impmod > offEnd || Hdr.e32_impmod + Hdr.e32_impmodcnt > offEnd))
    277         return KLDR_ERR_LX_BAD_FIXUP_SECTION;
     254        return VERR_LDRLX_BAD_FIXUP_SECTION;
    278255    if (    Hdr.e32_impproc
    279256        &&  (Hdr.e32_impproc < off || Hdr.e32_impproc > offEnd))
    280         return KLDR_ERR_LX_BAD_FIXUP_SECTION;
     257        return VERR_LDRLX_BAD_FIXUP_SECTION;
    281258
    282259    /*
    283260     * Calc the instance size, allocate and initialize it.
    284261     */
    285     cchFilename = kHlpStrLen(kRdrName(pRdr));
    286     cb = K_ALIGN_Z(sizeof(KLDRMODLX), 8)
    287        + K_ALIGN_Z(K_OFFSETOF(KLDRMOD, aSegments[Hdr.e32_objcnt + 1]), 8)
    288        + K_ALIGN_Z(cchFilename + 1, 8);
    289     offLdrStuff = cb;
    290     cb += Hdr.e32_ldrsize + 2; /* +2 for two extra zeros. */
    291     pModLX = (PKLDRMODLX)kHlpAlloc(cb);
     262    size_t cbModLXAndSegments = RT_ALIGN_Z(RT_UOFFSETOF_DYN(KLDRMODLX, aSegments[Hdr.e32_objcnt + 1]), 8);
     263    pModLX = (PKLDRMODLX)RTMemAlloc(cbModLXAndSegments + Hdr.e32_ldrsize + 2 /*for two extra zeros*/);
    292264    if (!pModLX)
    293         return KERR_NO_MEMORY;
     265        return VERR_NO_MEMORY;
    294266    *ppModLX = pModLX;
    295267
    296     /* KLDRMOD */
    297     pMod = (PKLDRMOD)((KU8 *)pModLX + K_ALIGN_Z(sizeof(KLDRMODLX), 8));
    298     pMod->pvData = pModLX;
    299     pMod->pRdr = pRdr;
    300     pMod->pOps = NULL;      /* set upon success. */
    301     pMod->cSegments = Hdr.e32_objcnt;
    302     pMod->cchFilename = (KU32)cchFilename;
    303     pMod->pszFilename = (char *)K_ALIGN_P(&pMod->aSegments[pMod->cSegments], 8);
    304     kHlpMemCopy((char *)pMod->pszFilename, kRdrName(pRdr), cchFilename + 1);
    305     pMod->pszName = NULL; /* finalized further down */
    306     pMod->cchName = 0;
    307     pMod->fFlags = 0;
     268    /* Core & CPU. */
     269    pModLX->Core.u32Magic   = 0;      /* set by caller. */
     270    pModLX->Core.eState     = LDR_STATE_OPENED;
     271    pModLX->Core.pOps       = NULL;   /* set by caller. */
     272    pModLX->Core.pReader    = pRdr;
    308273    switch (Hdr.e32_cpu)
    309274    {
    310275        case E32CPU286:
    311             pMod->enmCpu = KCPU_I80286;
    312             pMod->enmArch = KCPUARCH_X86_16;
     276            pModLX->enmCpu = RTLDRCPU_I80286;
     277            pModLX->Core.enmArch = RTLDRARCH_X86_16;
    313278            break;
    314279        case E32CPU386:
    315             pMod->enmCpu = KCPU_I386;
    316             pMod->enmArch = KCPUARCH_X86_32;
     280            pModLX->enmCpu = RTLDRCPU_I386;
     281            pModLX->Core.enmArch = RTLDRARCH_X86_32;
    317282            break;
    318283        case E32CPU486:
    319             pMod->enmCpu = KCPU_I486;
    320             pMod->enmArch = KCPUARCH_X86_32;
     284            pModLX->enmCpu = RTLDRCPU_I486;
     285            pModLX->Core.enmArch = RTLDRARCH_X86_32;
    321286            break;
    322287    }
    323     pMod->enmEndian = KLDRENDIAN_LITTLE;
    324     pMod->enmFmt = KLDRFMT_LX;
     288    pModLX->Core.enmEndian = RTLDRENDIAN_LITTLE;
     289    pModLX->Core.enmFormat = RTLDRFMT_LX;
    325290    switch (Hdr.e32_mflags & E32MODMASK)
    326291    {
    327292        case E32MODEXE:
    328             pMod->enmType = !(Hdr.e32_mflags & E32NOINTFIX)
    329                 ? KLDRTYPE_EXECUTABLE_RELOCATABLE
    330                 : KLDRTYPE_EXECUTABLE_FIXED;
     293            pModLX->Core.enmType = !(Hdr.e32_mflags & E32NOINTFIX)
     294                                 ? RTLDRTYPE_EXECUTABLE_RELOCATABLE
     295                                 : RTLDRTYPE_EXECUTABLE_FIXED;
    331296            break;
    332297
     
    334299        case E32PROTDLL:
    335300        case E32MODPROTDLL:
    336             pMod->enmType = !(Hdr.e32_mflags & E32SYSDLL)
    337                 ? KLDRTYPE_SHARED_LIBRARY_RELOCATABLE
    338                 : KLDRTYPE_SHARED_LIBRARY_FIXED;
     301            pModLX->Core.enmType = !(Hdr.e32_mflags & E32SYSDLL)
     302                                 ? RTLDRTYPE_SHARED_LIBRARY_RELOCATABLE
     303                                 : RTLDRTYPE_SHARED_LIBRARY_FIXED;
    339304            break;
    340305
    341306        case E32MODPDEV:
    342307        case E32MODVDEV:
    343             pMod->enmType = KLDRTYPE_SHARED_LIBRARY_RELOCATABLE;
     308            pModLX->Core.enmType = RTLDRTYPE_SHARED_LIBRARY_RELOCATABLE;
    344309            break;
    345310    }
    346     pMod->u32Magic = 0;     /* set upon success. */
    347311
    348312    /* KLDRMODLX */
    349     pModLX->pMod = pMod;
     313    pModLX->cSegments = Hdr.e32_objcnt;
     314    pModLX->pszName = NULL; /* finalized further down */
     315    pModLX->cchName = 0;
    350316    pModLX->pvMapping = 0;
    351317    pModLX->cbMapped = 0;
     
    353319
    354320    pModLX->offHdr = offNewHdr >= 0 ? offNewHdr : 0;
    355     kHlpMemCopy(&pModLX->Hdr, &Hdr, sizeof(Hdr));
    356 
    357     pModLX->pbLoaderSection = (uint8_t *)pModLX + offLdrStuff;
     321    memcpy(&pModLX->Hdr, &Hdr, sizeof(Hdr));
     322
     323    pModLX->pbLoaderSection = (uint8_t *)pModLX + cbModLXAndSegments;
    358324    pModLX->pbLoaderSectionLast = pModLX->pbLoaderSection + pModLX->Hdr.e32_ldrsize - 1;
    359325    pModLX->paObjs = NULL;
     
    376342     * Read the loader data.
    377343     */
    378     rc = kRdrRead(pRdr, (void *)pModLX->pbLoaderSection, pModLX->Hdr.e32_ldrsize, pModLX->Hdr.e32_objtab + pModLX->offHdr);
     344    rc = pRdr->pfnRead(pRdr, (void *)pModLX->pbLoaderSection, pModLX->Hdr.e32_ldrsize, pModLX->Hdr.e32_objtab + pModLX->offHdr);
    379345    if (rc)
    380346        return rc;
    381     ((KU8 *)pModLX->pbLoaderSectionLast)[1] = 0;
    382     ((KU8 *)pModLX->pbLoaderSectionLast)[2] = 0;
     347    ((uint8_t *)pModLX->pbLoaderSectionLast)[1] = 0;
     348    ((uint8_t *)pModLX->pbLoaderSectionLast)[2] = 0;
    383349    if (pModLX->Hdr.e32_objcnt)
    384350        pModLX->paObjs = (const struct o32_obj *)pModLX->pbLoaderSection;
     
    399365     */
    400366    if (pModLX->pbResNameTab)
    401         pMod->pszName = (const char *)kldrModLXDoNameTableLookupByOrdinal(pModLX->pbResNameTab,
    402                                                                           pModLX->pbLoaderSectionLast - pModLX->pbResNameTab + 1,
    403                                                                           0);
    404     if (!pMod->pszName)
    405         return KLDR_ERR_LX_NO_SONAME;
    406     pMod->cchName = *(const KU8 *)pMod->pszName++;
    407     if (pMod->cchName != kHlpStrLen(pMod->pszName))
    408         return KLDR_ERR_LX_BAD_SONAME;
     367        pModLX->pszName = (const char *)kldrModLXDoNameTableLookupByOrdinal(pModLX->pbResNameTab,
     368                                                                            pModLX->pbLoaderSectionLast - pModLX->pbResNameTab + 1,
     369                                                                            0);
     370    if (!pModLX->pszName)
     371        return VERR_LDRLX_NO_SONAME;
     372    pModLX->cchName = *(const uint8_t *)pModLX->pszName++;
     373    if (   pModLX->pszName[pModLX->cchName] != '\0'
     374        || pModLX->cchName != strlen(pModLX->pszName))
     375        return VERR_LDRLX_BAD_SONAME;
    409376
    410377    /*
    411378     * Quick validation of the object table.
    412379     */
    413     cb = 0;
    414     for (i = 0; i < pMod->cSegments; i++)
     380    for (i = 0; i < pModLX->cSegments; i++)
    415381    {
    416382        if (pModLX->paObjs[i].o32_base & (OBJPAGELEN - 1))
    417             return KLDR_ERR_LX_BAD_OBJECT_TABLE;
     383            return VERR_LDRLX_BAD_OBJECT_TABLE;
    418384        if (pModLX->paObjs[i].o32_base + pModLX->paObjs[i].o32_size <= pModLX->paObjs[i].o32_base)
    419             return KLDR_ERR_LX_BAD_OBJECT_TABLE;
     385            return VERR_LDRLX_BAD_OBJECT_TABLE;
    420386        if (pModLX->paObjs[i].o32_mapsize > (pModLX->paObjs[i].o32_size + (OBJPAGELEN - 1)))
    421             return KLDR_ERR_LX_BAD_OBJECT_TABLE;
     387            return VERR_LDRLX_BAD_OBJECT_TABLE;
    422388        if (    pModLX->paObjs[i].o32_mapsize
    423             &&  (   (KU8 *)&pModLX->paPageMappings[pModLX->paObjs[i].o32_pagemap] > pModLX->pbLoaderSectionLast
    424                  || (KU8 *)&pModLX->paPageMappings[pModLX->paObjs[i].o32_pagemap + pModLX->paObjs[i].o32_mapsize]
     389            &&  (   (uint8_t *)&pModLX->paPageMappings[pModLX->paObjs[i].o32_pagemap] > pModLX->pbLoaderSectionLast
     390                 || (uint8_t *)&pModLX->paPageMappings[pModLX->paObjs[i].o32_pagemap + pModLX->paObjs[i].o32_mapsize]
    425391                     > pModLX->pbLoaderSectionLast))
    426             return KLDR_ERR_LX_BAD_OBJECT_TABLE;
     392            return VERR_LDRLX_BAD_OBJECT_TABLE;
    427393        if (i > 0 && !(pModLX->paObjs[i].o32_flags & OBJRSRC))
    428394        {
    429395            if (pModLX->paObjs[i].o32_base <= pModLX->paObjs[i - 1].o32_base)
    430                 return KLDR_ERR_LX_BAD_OBJECT_TABLE;
     396                return VERR_LDRLX_BAD_OBJECT_TABLE;
    431397            if (pModLX->paObjs[i].o32_base < pModLX->paObjs[i - 1].o32_base + pModLX->paObjs[i - 1].o32_mapsize)
    432                 return KLDR_ERR_LX_BAD_OBJECT_TABLE;
     398                return VERR_LDRLX_BAD_OBJECT_TABLE;
    433399        }
    434400    }
     
    445411     * Setup the KLDRMOD segment array.
    446412     */
    447     for (i = 0; i < pMod->cSegments; i++)
     413    for (i = 0; i < pModLX->cSegments; i++)
    448414    {
    449415        /* unused */
    450         pMod->aSegments[i].pvUser = NULL;
    451         pMod->aSegments[i].MapAddress = 0;
    452         pMod->aSegments[i].pchName = NULL;
    453         pMod->aSegments[i].cchName = 0;
    454         pMod->aSegments[i].offFile = -1;
    455         pMod->aSegments[i].cbFile = -1;
    456         pMod->aSegments[i].SelFlat = 0;
    457         pMod->aSegments[i].Sel16bit = 0;
     416        pModLX->aSegments[i].pszName    = NULL;
     417        pModLX->aSegments[i].offFile    = -1;
     418        pModLX->aSegments[i].cbFile     = -1;
     419        pModLX->aSegments[i].SelFlat    = 0;
     420        pModLX->aSegments[i].Sel16bit   = 0;
    458421
    459422        /* flags */
    460         pMod->aSegments[i].fFlags = 0;
     423        pModLX->aSegments[i].fFlags = 0;
    461424        if (pModLX->paObjs[i].o32_flags & OBJBIGDEF)
    462             pMod->aSegments[i].fFlags = KLDRSEG_FLAG_16BIT;
     425            pModLX->aSegments[i].fFlags = RTLDRSEG_FLAG_16BIT;
    463426        if (pModLX->paObjs[i].o32_flags & OBJALIAS16)
    464             pMod->aSegments[i].fFlags = KLDRSEG_FLAG_OS2_ALIAS16;
     427            pModLX->aSegments[i].fFlags = RTLDRSEG_FLAG_OS2_ALIAS16;
    465428        if (pModLX->paObjs[i].o32_flags & OBJCONFORM)
    466             pMod->aSegments[i].fFlags = KLDRSEG_FLAG_OS2_CONFORM;
     429            pModLX->aSegments[i].fFlags = RTLDRSEG_FLAG_OS2_CONFORM;
    467430        if (pModLX->paObjs[i].o32_flags & OBJIOPL)
    468             pMod->aSegments[i].fFlags = KLDRSEG_FLAG_OS2_IOPL;
     431            pModLX->aSegments[i].fFlags = RTLDRSEG_FLAG_OS2_IOPL;
    469432
    470433        /* size and addresses */
    471         pMod->aSegments[i].Alignment   = OBJPAGELEN;
    472         pMod->aSegments[i].cb          = pModLX->paObjs[i].o32_size;
    473         pMod->aSegments[i].LinkAddress = pModLX->paObjs[i].o32_base;
    474         pMod->aSegments[i].RVA         = NextRVA;
     434        pModLX->aSegments[i].Alignment   = OBJPAGELEN;
     435        pModLX->aSegments[i].cb          = pModLX->paObjs[i].o32_size;
     436        pModLX->aSegments[i].LinkAddress = pModLX->paObjs[i].o32_base;
     437        pModLX->aSegments[i].RVA         = NextRVA;
    475438        if (    fCanOptimizeMapping
    476             ||  i + 1 >= pMod->cSegments
     439            ||  i + 1 >= pModLX->cSegments
    477440            ||  (pModLX->paObjs[i].o32_flags & OBJRSRC)
    478441            ||  (pModLX->paObjs[i + 1].o32_flags & OBJRSRC))
    479             pMod->aSegments[i].cbMapped = K_ALIGN_Z(pModLX->paObjs[i].o32_size, OBJPAGELEN);
     442            pModLX->aSegments[i].cbMapped = RT_ALIGN_Z(pModLX->paObjs[i].o32_size, OBJPAGELEN);
    480443        else
    481             pMod->aSegments[i].cbMapped = pModLX->paObjs[i + 1].o32_base - pModLX->paObjs[i].o32_base;
    482         NextRVA += (KU32)pMod->aSegments[i].cbMapped;
     444            pModLX->aSegments[i].cbMapped = pModLX->paObjs[i + 1].o32_base - pModLX->paObjs[i].o32_base;
     445        NextRVA += (uint32_t)pModLX->aSegments[i].cbMapped;
    483446
    484447        /* protection */
     
    488451            case 0:
    489452            case OBJSHARED:
    490                 pMod->aSegments[i].enmProt = KPROT_NOACCESS;
     453                pModLX->aSegments[i].fProt = 0;
    491454                break;
    492455            case OBJREAD:
    493456            case OBJREAD | OBJSHARED:
    494                 pMod->aSegments[i].enmProt = KPROT_READONLY;
     457                pModLX->aSegments[i].fProt = RTMEM_PROT_READ;
    495458                break;
    496459            case OBJWRITE:
    497460            case OBJWRITE | OBJREAD:
    498                 pMod->aSegments[i].enmProt = KPROT_WRITECOPY;
     461                pModLX->aSegments[i].fProt = RTMEM_PROT_READ | RTMEM_PROT_WRITECOPY;
    499462                break;
    500463            case OBJWRITE | OBJSHARED:
    501464            case OBJWRITE | OBJSHARED | OBJREAD:
    502                 pMod->aSegments[i].enmProt = KPROT_READWRITE;
     465                pModLX->aSegments[i].fProt = RTMEM_PROT_READ | RTMEM_PROT_WRITE;
    503466                break;
    504467            case OBJEXEC:
    505468            case OBJEXEC | OBJSHARED:
    506                 pMod->aSegments[i].enmProt = KPROT_EXECUTE;
     469                pModLX->aSegments[i].fProt = RTMEM_PROT_EXEC;
    507470                break;
    508471            case OBJEXEC | OBJREAD:
    509472            case OBJEXEC | OBJREAD | OBJSHARED:
    510                 pMod->aSegments[i].enmProt = KPROT_EXECUTE_READ;
     473                pModLX->aSegments[i].fProt = RTMEM_PROT_EXEC | RTMEM_PROT_READ;
    511474                break;
    512475            case OBJEXEC | OBJWRITE:
    513476            case OBJEXEC | OBJWRITE | OBJREAD:
    514                 pMod->aSegments[i].enmProt = KPROT_EXECUTE_WRITECOPY;
     477                pModLX->aSegments[i].fProt = RTMEM_PROT_EXEC | RTMEM_PROT_READ | RTMEM_PROT_WRITECOPY;
    515478                break;
    516479            case OBJEXEC | OBJWRITE | OBJSHARED:
    517480            case OBJEXEC | OBJWRITE | OBJSHARED | OBJREAD:
    518                 pMod->aSegments[i].enmProt = KPROT_EXECUTE_READWRITE;
     481                pModLX->aSegments[i].fProt = RTMEM_PROT_EXEC | RTMEM_PROT_READ | RTMEM_PROT_WRITE;
    519482                break;
    520483        }
    521484        if ((pModLX->paObjs[i].o32_flags & (OBJREAD | OBJWRITE | OBJEXEC | OBJRSRC)) == OBJRSRC)
    522             pMod->aSegments[i].enmProt = KPROT_READONLY;
    523         /*pMod->aSegments[i].f16bit = !(pModLX->paObjs[i].o32_flags & OBJBIGDEF)
    524         pMod->aSegments[i].fIOPL = !(pModLX->paObjs[i].o32_flags & OBJIOPL)
    525         pMod->aSegments[i].fConforming = !(pModLX->paObjs[i].o32_flags & OBJCONFORM) */
     485            pModLX->aSegments[i].fProt = RTMEM_PROT_READ;
     486        /*pModLX->aSegments[i].f16bit = !(pModLX->paObjs[i].o32_flags & OBJBIGDEF)
     487        pModLX->aSegments[i].fIOPL = !(pModLX->paObjs[i].o32_flags & OBJIOPL)
     488        pModLX->aSegments[i].fConforming = !(pModLX->paObjs[i].o32_flags & OBJCONFORM) */
    526489    }
    527490
     
    533496     */
    534497    *ppModLX = pModLX;
    535     return 0;
    536 }
    537 
    538 
    539 /** @copydoc KLDRMODOPS::pfnDestroy */
    540 static int kldrModLXDestroy(PKLDRMOD pMod)
    541 {
    542     PKLDRMODLX pModLX = (PKLDRMODLX)pMod->pvData;
    543     int rc = 0;
     498    return VINF_SUCCESS;
     499}
     500
     501
     502/**
     503 * @interface_method_impl{RTLDROPS,pfnClose}
     504 */
     505static DECLCALLBACK(int) rtldrLX_Close(PRTLDRMODINTERNAL pMod)
     506{
     507    PKLDRMODLX pModLX = RT_FROM_MEMBER(pMod, KLDRMODLX, Core);
    544508    KLDRMODLX_ASSERT(!pModLX->pvMapping);
    545509
    546     if (pMod->pRdr)
    547     {
    548         rc = kRdrClose(pMod->pRdr);
    549         pMod->pRdr = NULL;
     510    int rc = VINF_SUCCESS;
     511    if (pModLX->Core.pReader)
     512    {
     513        rc = pModLX->Core.pReader->pfnDestroy(pModLX->Core.pReader);
     514        pModLX->Core.pReader = NULL;
    550515    }
    551516    if (pModLX->pbNonResNameTab)
    552517    {
    553         kHlpFree(pModLX->pbNonResNameTab);
     518        RTMemFree(pModLX->pbNonResNameTab);
    554519        pModLX->pbNonResNameTab = NULL;
    555520    }
    556521    if (pModLX->pbFixupSection)
    557522    {
    558         kHlpFree(pModLX->pbFixupSection);
     523        RTMemFree(pModLX->pbFixupSection);
    559524        pModLX->pbFixupSection = NULL;
    560525    }
    561     pMod->u32Magic = 0;
    562     pMod->pOps = NULL;
    563     kHlpFree(pModLX);
     526    pModLX->Core.u32Magic = 0;
     527    pModLX->Core.pOps = NULL;
     528    RTMemFree(pModLX);
    564529    return rc;
    565530}
     
    572537 * @param   pBaseAddress    The base address, IN & OUT.
    573538 */
    574 static void kldrModLXResolveBaseAddress(PKLDRMODLX pModLX, PKLDRADDR pBaseAddress)
    575 {
    576     if (*pBaseAddress == KLDRMOD_BASEADDRESS_MAP)
    577         *pBaseAddress = pModLX->pMod->aSegments[0].MapAddress;
    578     else if (*pBaseAddress == KLDRMOD_BASEADDRESS_LINK)
    579         *pBaseAddress = pModLX->pMod->aSegments[0].LinkAddress;
     539static void kldrModLXResolveBaseAddress(PKLDRMODLX pModLX, PRTLDRADDR pBaseAddress)
     540{
     541    if (*pBaseAddress == RTLDR_BASEADDRESS_LINK)
     542        *pBaseAddress = pModLX->aSegments[0].LinkAddress;
    580543}
    581544
    582545
    583546/** @copydoc kLdrModQuerySymbol */
    584 static int kldrModLXQuerySymbol(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, KU32 iSymbol,
    585                                 const char *pchSymbol, KSIZE cchSymbol, const char *pszVersion,
    586                                 PFNKLDRMODGETIMPORT pfnGetForwarder, void *pvUser, PKLDRADDR puValue, KU32 *pfKind)
    587 {
    588     PKLDRMODLX                  pModLX = (PKLDRMODLX)pMod->pvData;
    589     KU32                        iOrdinal;
     547static int kldrModLXQuerySymbol(PRTLDRMODINTERNAL pMod, const void *pvBits, RTLDRADDR BaseAddress, uint32_t iSymbol,
     548                                const char *pchSymbol, size_t cchSymbol, const char *pszVersion,
     549                                PFNRTLDRIMPORT pfnGetForwarder, void *pvUser, PRTLDRADDR puValue, uint32_t *pfKind)
     550{
     551    PKLDRMODLX                  pModLX = RT_FROM_MEMBER(pMod, KLDRMODLX, Core);
     552    uint32_t                    iOrdinal;
    590553    int                         rc;
    591     const struct b32_bundle     *pBundle;
    592     K_NOREF(pvBits);
    593     K_NOREF(pszVersion);
     554    const struct b32_bundle    *pBundle;
     555    RT_NOREF(pvBits);
     556    RT_NOREF(pszVersion);
    594557
    595558    /*
     
    597560     */
    598561    if (!pModLX->Hdr.e32_enttab)
    599         return KLDR_ERR_SYMBOL_NOT_FOUND;
     562        return VERR_SYMBOL_NOT_FOUND;
    600563
    601564    /*
     
    617580    while (pBundle->b32_cnt && iOrdinal <= iSymbol)
    618581    {
    619         static const KSIZE s_cbEntry[] = { 0, 3, 5, 5, 7 };
     582        static const size_t s_cbEntry[] = { 0, 3, 5, 5, 7 };
    620583
    621584        /*
     
    625588        if (iSymbol < iOrdinal)
    626589        {
    627             KU32 offObject;
    628             const struct e32_entry *pEntry = (const struct e32_entry *)((KUPTR)(pBundle + 1)
     590            uint32_t offObject;
     591            const struct e32_entry *pEntry = (const struct e32_entry *)((uintptr_t)(pBundle + 1)
    629592                                                                        +   (iSymbol - (iOrdinal - pBundle->b32_cnt))
    630593                                                                          * s_cbEntry[pBundle->b32_type]);
     
    638601                /* empty bundles are place holders unused ordinal ranges. */
    639602                case EMPTY:
    640                     return KLDR_ERR_SYMBOL_NOT_FOUND;
     603                    return VERR_SYMBOL_NOT_FOUND;
    641604
    642605                /* e32_flags + a 16-bit offset. */
     
    644607                    offObject = pEntry->e32_variant.e32_offset.offset16;
    645608                    if (pfKind)
    646                         *pfKind = KLDRSYMKIND_16BIT | KLDRSYMKIND_NO_TYPE;
     609                        *pfKind = RTLDRSYMKIND_16BIT | RTLDRSYMKIND_NO_TYPE;
    647610                    break;
    648611
     
    651614                    offObject = pEntry->e32_variant.e32_callgate.offset;
    652615                    if (pfKind)
    653                         *pfKind = KLDRSYMKIND_16BIT | KLDRSYMKIND_CODE;
     616                        *pfKind = RTLDRSYMKIND_16BIT | RTLDRSYMKIND_CODE;
    654617                    break;
    655618
     
    658621                    offObject = pEntry->e32_variant.e32_offset.offset32;
    659622                    if (pfKind)
    660                         *pfKind = KLDRSYMKIND_32BIT;
     623                        *pfKind = RTLDRSYMKIND_32BIT;
    661624                    break;
    662625
     
    668631                    /* anyone actually using TYPEINFO will end up here. */
    669632                    KLDRMODLX_ASSERT(!"Bad bundle type");
    670                     return KLDR_ERR_LX_BAD_BUNDLE;
     633                    return VERR_LDRLX_BAD_BUNDLE;
    671634            }
    672635
     
    675638             */
    676639            if (    pBundle->b32_obj <= 0
    677                 ||  pBundle->b32_obj > pMod->cSegments)
    678                 return KLDR_ERR_LX_BAD_BUNDLE;
     640                ||  pBundle->b32_obj > pModLX->cSegments)
     641                return VERR_LDRLX_BAD_BUNDLE;
    679642            if (puValue)
    680643                *puValue = BaseAddress
    681644                         + offObject
    682                          + pMod->aSegments[pBundle->b32_obj - 1].RVA;
     645                         + pModLX->aSegments[pBundle->b32_obj - 1].RVA;
    683646            return 0;
    684647        }
     
    690653        {
    691654            KLDRMODLX_ASSERT(!"Bad type"); /** @todo figure out TYPEINFO. */
    692             return KLDR_ERR_LX_BAD_BUNDLE;
     655            return VERR_LDRLX_BAD_BUNDLE;
    693656        }
    694657        if (pBundle->b32_type == 0)
    695             pBundle = (const struct b32_bundle *)((const KU8 *)pBundle + 2);
     658            pBundle = (const struct b32_bundle *)((const uint8_t *)pBundle + 2);
    696659        else
    697             pBundle = (const struct b32_bundle *)((const KU8 *)(pBundle + 1) + s_cbEntry[pBundle->b32_type] * pBundle->b32_cnt);
    698     }
    699 
    700     return KLDR_ERR_SYMBOL_NOT_FOUND;
     660            pBundle = (const struct b32_bundle *)((const uint8_t *)(pBundle + 1) + s_cbEntry[pBundle->b32_type] * pBundle->b32_cnt);
     661    }
     662
     663    return VERR_SYMBOL_NOT_FOUND;
     664}
     665
     666
     667/**
     668 * @interface_method_impl{RTLDROPS,pfnGetSymbolEx}
     669 */
     670static DECLCALLBACK(int) rtldrLX_GetSymbolEx(PRTLDRMODINTERNAL pMod, const void *pvBits, RTUINTPTR BaseAddress,
     671                                             uint32_t iOrdinal, const char *pszSymbol, RTUINTPTR *pValue)
     672{
     673    uint32_t fKind = RTLDRSYMKIND_REQ_FLAT;
     674    return kldrModLXQuerySymbol(pMod, pvBits, BaseAddress, iOrdinal, pszSymbol, pszSymbol ? strlen(pszSymbol) : 0,
     675                                NULL, NULL, NULL, pValue, &fKind);
    701676}
    702677
     
    711686 * @param   piSymbol    Where to store the symbol ordinal.
    712687 */
    713 static int kldrModLXDoNameLookup(PKLDRMODLX pModLX, const char *pchSymbol, KSIZE cchSymbol, KU32 *piSymbol)
     688static int kldrModLXDoNameLookup(PKLDRMODLX pModLX, const char *pchSymbol, size_t cchSymbol, uint32_t *piSymbol)
    714689{
    715690
     
    722697     * Search the name tables.
    723698     */
    724     const KU8 *pbName = kldrModLXDoNameTableLookupByName(pModLX->pbResNameTab,
     699    const uint8_t *pbName = kldrModLXDoNameTableLookupByName(pModLX->pbResNameTab,
    725700                                                         pModLX->pbLoaderSectionLast - pModLX->pbResNameTab + 1,
    726701                                                         pchSymbol, cchSymbol);
     
    738713    }
    739714    if (!pbName)
    740         return KLDR_ERR_SYMBOL_NOT_FOUND;
    741 
    742     *piSymbol = *(const KU16 *)(pbName + 1 + *pbName);
     715        return VERR_SYMBOL_NOT_FOUND;
     716
     717    *piSymbol = *(const uint16_t *)(pbName + 1 + *pbName);
    743718    return 0;
    744719}
    745 
    746 
    747 #if 0
    748 /**
    749  * Hash a symbol using the algorithm from sdbm.
    750  *
    751  * The following was is the documenation of the orignal sdbm functions:
    752  *
    753  * This algorithm was created for sdbm (a public-domain reimplementation of
    754  * ndbm) database library. it was found to do well in scrambling bits,
    755  * causing better distribution of the keys and fewer splits. it also happens
    756  * to be a good general hashing function with good distribution. the actual
    757  * function is hash(i) = hash(i - 1) * 65599 + str[i]; what is included below
    758  * is the faster version used in gawk. [there is even a faster, duff-device
    759  * version] the magic constant 65599 was picked out of thin air while
    760  * experimenting with different constants, and turns out to be a prime.
    761  * this is one of the algorithms used in berkeley db (see sleepycat) and
    762  * elsewhere.
    763  */
    764 static KU32 kldrModLXDoHash(const char *pchSymbol, KU8 cchSymbol)
    765 {
    766     KU32 hash = 0;
    767     int ch;
    768 
    769     while (     cchSymbol-- > 0
    770            &&   (ch = *(unsigned const char *)pchSymbol++))
    771         hash = ch + (hash << 6) + (hash << 16) - hash;
    772 
    773     return hash;
    774 }
    775 #endif
    776720
    777721
     
    786730 * @param   cchSymbol       The length of the symbol name.
    787731 */
    788 static const KU8 *kldrModLXDoNameTableLookupByName(const KU8 *pbNameTable, KSSIZE cbNameTable,
    789                                                    const char *pchSymbol, KSIZE cchSymbol)
     732static const uint8_t *kldrModLXDoNameTableLookupByName(const uint8_t *pbNameTable, ssize_t cbNameTable,
     733                                                       const char *pchSymbol, size_t cchSymbol)
    790734{
    791735    /*
    792736     * Determin the namelength up front so we can skip anything which doesn't matches the length.
    793737     */
    794     KU8 cbSymbol8Bit = (KU8)cchSymbol;
     738    uint8_t cbSymbol8Bit = (uint8_t)cchSymbol;
    795739    if (cbSymbol8Bit != cchSymbol)
    796740        return NULL; /* too long. */
     
    801745    while (*pbNameTable != 0 && cbNameTable > 0)
    802746    {
    803         const KU8 cbName = *pbNameTable;
     747        const uint8_t cbName = *pbNameTable;
    804748
    805749        cbNameTable -= cbName + 1 + 2;
     
    808752
    809753        if (    cbName == cbSymbol8Bit
    810             &&  !kHlpMemComp(pbNameTable + 1, pchSymbol, cbName))
     754            &&  !memcmp(pbNameTable + 1, pchSymbol, cbName))
    811755            return pbNameTable;
    812756
     
    831775 */
    832776static int kldrModLXDoForwarderQuery(PKLDRMODLX pModLX, const struct e32_entry *pEntry,
    833                                      PFNKLDRMODGETIMPORT pfnGetForwarder, void *pvUser, PKLDRADDR puValue, KU32 *pfKind)
    834 {
    835     int rc;
    836     KU32 iSymbol;
    837     const char *pchSymbol;
    838     KU8 cchSymbol;
    839 
     777                                     PFNRTLDRIMPORT pfnGetForwarder, void *pvUser, PRTLDRADDR puValue, uint32_t *pfKind)
     778{
    840779    if (!pfnGetForwarder)
    841         return KLDR_ERR_FORWARDER_SYMBOL;
     780        return VERR_LDR_FORWARDER;
    842781
    843782    /*
     
    846785    if (    !pEntry->e32_variant.e32_fwd.modord
    847786        ||  pEntry->e32_variant.e32_fwd.modord > pModLX->Hdr.e32_impmodcnt)
    848         return KLDR_ERR_LX_BAD_FORWARDER;
     787        return VERR_LDRLX_BAD_FORWARDER;
     788
     789    char szImpModule[256];
     790    int rc = kldrModLXGetImport(pModLX, NULL, pEntry->e32_variant.e32_fwd.modord - 1, szImpModule, sizeof(szImpModule), NULL);
     791    if (RT_FAILURE(rc))
     792        return rc;
    849793
    850794    /*
    851795     * Figure out the parameters.
    852796     */
     797    uint32_t    iSymbol;
     798    const char *pszSymbol;
     799    char        szSymbol[256];
    853800    if (pEntry->e32_flags & FWD_ORDINAL)
    854801    {
    855802        iSymbol = pEntry->e32_variant.e32_fwd.value;
    856         pchSymbol = NULL;                   /* no symbol name. */
    857         cchSymbol = 0;
     803        pszSymbol = NULL;                   /* no symbol name. */
    858804    }
    859805    else
    860806    {
    861         const KU8 *pbName;
     807        const uint8_t *pbName;
    862808
    863809        /* load the fixup section if necessary. */
     
    874820            ||  pbName < pModLX->pbFixupSection
    875821            || !*pbName)
    876             return KLDR_ERR_LX_BAD_FORWARDER;
     822            return VERR_LDRLX_BAD_FORWARDER;
    877823
    878824
     
    880826        if (pbName[1] == '#')
    881827        {
    882             KU8         cbLeft = *pbName;
    883             const KU8  *pb = pbName + 1;
     828            uint8_t         cbLeft = *pbName;
     829            const uint8_t  *pb = pbName + 1;
    884830            unsigned    uBase;
    885831
     
    910856                    break;
    911857                else
    912                     return KLDR_ERR_LX_BAD_FORWARDER;
     858                    return VERR_LDRLX_BAD_FORWARDER;
    913859                if (uDigit >= uBase)
    914                     return KLDR_ERR_LX_BAD_FORWARDER;
     860                    return VERR_LDRLX_BAD_FORWARDER;
    915861
    916862                /* insert the digit */
     
    919865            }
    920866            if (!iSymbol)
    921                 return KLDR_ERR_LX_BAD_FORWARDER;
    922 
    923             pchSymbol = NULL;               /* no symbol name. */
    924             cchSymbol = 0;
     867                return VERR_LDRLX_BAD_FORWARDER;
     868
     869            pszSymbol = NULL;               /* no symbol name. */
    925870        }
    926871        else
    927872        {
    928             pchSymbol = (char *)pbName + 1;
    929             cchSymbol = *pbName;
    930             iSymbol = NIL_KLDRMOD_SYM_ORDINAL;
     873            memcpy(szSymbol, pbName + 1, *pbName);
     874            szSymbol[*pbName] = '\0';
     875            pszSymbol = szSymbol;
     876            iSymbol = UINT32_MAX;
    931877        }
    932878    }
     
    935881     * Resolve the forwarder.
    936882     */
    937     rc = pfnGetForwarder(pModLX->pMod, pEntry->e32_variant.e32_fwd.modord - 1, iSymbol, pchSymbol, cchSymbol, NULL, puValue, pfKind, pvUser);
    938     if (!rc && pfKind)
    939         *pfKind |= KLDRSYMKIND_FORWARDER;
     883    rc = pfnGetForwarder(&pModLX->Core, szImpModule, pszSymbol, iSymbol, puValue, /*pfKind, */pvUser);
     884    if (RT_SUCCESS(rc) && pfKind)
     885        *pfKind |= RTLDRSYMKIND_FORWARDER;
    940886    return rc;
    941887}
     
    952898static int kldrModLXDoLoadFixupSection(PKLDRMODLX pModLX)
    953899{
    954     int rc;
    955     KU32 off;
    956     void *pv;
    957 
    958     pv = kHlpAlloc(pModLX->Hdr.e32_fixupsize);
     900    void *pv = RTMemAlloc(pModLX->Hdr.e32_fixupsize);
    959901    if (!pv)
    960         return KERR_NO_MEMORY;
    961 
    962     off = pModLX->Hdr.e32_objtab + pModLX->Hdr.e32_ldrsize;
    963     rc = kRdrRead(pModLX->pMod->pRdr, pv, pModLX->Hdr.e32_fixupsize,
    964                      off + pModLX->offHdr);
    965     if (!rc)
    966     {
    967         pModLX->pbFixupSection = pv;
     902        return VERR_NO_MEMORY;
     903
     904    uint32_t off = pModLX->Hdr.e32_objtab + pModLX->Hdr.e32_ldrsize;
     905    int rc = pModLX->Core.pReader->pfnRead(pModLX->Core.pReader, pv, pModLX->Hdr.e32_fixupsize,
     906                                           off + pModLX->offHdr);
     907    if (RT_SUCCESS(rc))
     908    {
     909        pModLX->pbFixupSection = (uint8_t *)pv;
    968910        pModLX->pbFixupSectionLast = pModLX->pbFixupSection + pModLX->Hdr.e32_fixupsize;
    969911        KLDRMODLX_ASSERT(!pModLX->paoffPageFixups);
    970912        if (pModLX->Hdr.e32_fpagetab)
    971             pModLX->paoffPageFixups = (const KU32 *)(pModLX->pbFixupSection + pModLX->Hdr.e32_fpagetab - off);
     913            pModLX->paoffPageFixups = (const uint32_t *)(pModLX->pbFixupSection + pModLX->Hdr.e32_fpagetab - off);
    972914        KLDRMODLX_ASSERT(!pModLX->pbFixupRecs);
    973915        if (pModLX->Hdr.e32_frectab)
     
    981923    }
    982924    else
    983         kHlpFree(pv);
     925        RTMemFree(pv);
    984926    return rc;
    985927}
    986928
    987929
    988 /** @copydoc kLdrModEnumSymbols */
    989 static int kldrModLXEnumSymbols(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress,
    990                                 KU32 fFlags, PFNKLDRMODENUMSYMS pfnCallback, void *pvUser)
    991 {
    992     PKLDRMODLX pModLX = (PKLDRMODLX)pMod->pvData;
    993     const struct b32_bundle *pBundle;
    994     KU32 iOrdinal;
    995     int rc = 0;
    996     K_NOREF(pvBits);
    997     K_NOREF(fFlags);
     930/**
     931 * @interface_method_impl{RTLDROPS,pfnEnumSymbols}
     932 */
     933static DECLCALLBACK(int) rtldrLX_EnumSymbols(PRTLDRMODINTERNAL pMod, unsigned fFlags, const void *pvBits,
     934                                             RTUINTPTR BaseAddress, PFNRTLDRENUMSYMS pfnCallback, void *pvUser)
     935{
     936    PKLDRMODLX pModLX = RT_FROM_MEMBER(pMod, KLDRMODLX, Core);
     937    RT_NOREF(pvBits);
     938    RT_NOREF(fFlags);
    998939
    999940    kldrModLXResolveBaseAddress(pModLX, &BaseAddress);
     
    1003944     * (The entry table is made up of bundles of similar exports.)
    1004945     */
    1005     iOrdinal = 1;
    1006     pBundle = (const struct b32_bundle *)pModLX->pbEntryTab;
     946    int                      rc       = VINF_SUCCESS;
     947    uint32_t                 iOrdinal = 1;
     948    const struct b32_bundle *pBundle  = (const struct b32_bundle *)pModLX->pbEntryTab;
    1007949    while (pBundle->b32_cnt && iOrdinal)
    1008950    {
    1009         static const KSIZE s_cbEntry[] = { 0, 3, 5, 5, 7 };
     951        static const size_t s_cbEntry[] = { 0, 3, 5, 5, 7 };
    1010952
    1011953        /*
     
    1015957        {
    1016958            const struct e32_entry *pEntry;
    1017             KSIZE cbEntry;
    1018             KLDRADDR BundleRVA;
     959            size_t cbEntry;
     960            RTLDRADDR BundleRVA;
    1019961            unsigned cLeft;
    1020962
     
    1027969                case ENTRY32:
    1028970                    if (    pBundle->b32_obj <= 0
    1029                         ||  pBundle->b32_obj > pMod->cSegments)
    1030                         return KLDR_ERR_LX_BAD_BUNDLE;
    1031                     BundleRVA = pMod->aSegments[pBundle->b32_obj - 1].RVA;
     971                        ||  pBundle->b32_obj > pModLX->cSegments)
     972                        return VERR_LDRLX_BAD_BUNDLE;
     973                    BundleRVA = pModLX->aSegments[pBundle->b32_obj - 1].RVA;
    1032974                    break;
    1033975
     
    1039981                    /* anyone actually using TYPEINFO will end up here. */
    1040982                    KLDRMODLX_ASSERT(!"Bad bundle type");
    1041                     return KLDR_ERR_LX_BAD_BUNDLE;
     983                    return VERR_LDRLX_BAD_BUNDLE;
    1042984            }
    1043985
     
    1048990            while (cLeft-- > 0)
    1049991            {
    1050                 KLDRADDR uValue;
    1051                 KU32 fKind;
     992                RTLDRADDR uValue;
     993                uint32_t fKind;
    1052994                int fFoundName;
    1053                 const KU8 *pbName;
     995                const uint8_t *pbName;
    1054996
    1055997                /*
     
    10611003                    case ENTRY16:
    10621004                        uValue = BaseAddress + BundleRVA + pEntry->e32_variant.e32_offset.offset16;
    1063                         fKind = KLDRSYMKIND_16BIT | KLDRSYMKIND_NO_TYPE;
     1005                        fKind = RTLDRSYMKIND_16BIT | RTLDRSYMKIND_NO_TYPE;
    10641006                        break;
    10651007
     
    10671009                    case GATE16:
    10681010                        uValue = BaseAddress + BundleRVA + pEntry->e32_variant.e32_callgate.offset;
    1069                         fKind = KLDRSYMKIND_16BIT | KLDRSYMKIND_CODE;
     1011                        fKind = RTLDRSYMKIND_16BIT | RTLDRSYMKIND_CODE;
    10701012                        break;
    10711013
     
    10731015                    case ENTRY32:
    10741016                        uValue = BaseAddress + BundleRVA + pEntry->e32_variant.e32_offset.offset32;
    1075                         fKind = KLDRSYMKIND_32BIT;
     1017                        fKind = RTLDRSYMKIND_32BIT;
    10761018                        break;
    10771019
     
    10791021                    case ENTRYFWD:
    10801022                        uValue = 0; /** @todo implement enumeration of forwarders properly. */
    1081                         fKind = KLDRSYMKIND_FORWARDER;
     1023                        fKind = RTLDRSYMKIND_FORWARDER;
    10821024                        break;
    10831025
    10841026                    default: /* shut up gcc. */
    10851027                        uValue = 0;
    1086                         fKind = KLDRSYMKIND_NO_BIT | KLDRSYMKIND_NO_TYPE;
     1028                        fKind = RTLDRSYMKIND_NO_BIT | RTLDRSYMKIND_NO_TYPE;
    10871029                        break;
    10881030                }
     
    10921034                 */
    10931035                fFoundName = 0;
     1036                char szName[256];
    10941037
    10951038                /* resident name table. */
     
    11031046                            break;
    11041047                        fFoundName = 1;
    1105                         rc = pfnCallback(pMod, iOrdinal, (const char *)pbName + 1, *pbName, NULL, uValue, fKind, pvUser);
     1048                        memcpy(szName, (const char *)pbName + 1, *pbName);
     1049                        szName[*pbName] = '\0';
     1050                        rc = pfnCallback(pMod, szName, iOrdinal, uValue, /*fKind,*/ pvUser);
    11061051                        if (rc)
    11071052                            return rc;
     
    11231068                            break;
    11241069                        fFoundName = 1;
    1125                         rc = pfnCallback(pMod, iOrdinal, (const char *)pbName + 1, *pbName, NULL, uValue, fKind, pvUser);
     1070                        memcpy(szName, (const char *)pbName + 1, *pbName);
     1071                        szName[*pbName] = '\0';
     1072                        rc = pfnCallback(pMod, szName, iOrdinal, uValue, /*fKind,*/ pvUser);
    11261073                        if (rc)
    11271074                            return rc;
     
    11371084                if (!fFoundName)
    11381085                {
    1139                     rc = pfnCallback(pMod, iOrdinal, NULL, 0, NULL, uValue, fKind, pvUser);
     1086                    RT_NOREF(fKind);
     1087                    rc = pfnCallback(pMod, NULL /*pszName*/, iOrdinal, uValue, /*fKind,*/ pvUser);
    11401088                    if (rc)
    11411089                        return rc;
     
    11441092                /* next */
    11451093                iOrdinal++;
    1146                 pEntry = (const struct e32_entry *)((KUPTR)pEntry + cbEntry);
     1094                pEntry = (const struct e32_entry *)((uintptr_t)pEntry + cbEntry);
    11471095            }
    11481096        }
     
    11541102        {
    11551103            KLDRMODLX_ASSERT(!"Bad type"); /** @todo figure out TYPEINFO. */
    1156             return KLDR_ERR_LX_BAD_BUNDLE;
     1104            return VERR_LDRLX_BAD_BUNDLE;
    11571105        }
    11581106        if (pBundle->b32_type == 0)
    1159             pBundle = (const struct b32_bundle *)((const KU8 *)pBundle + 2);
     1107            pBundle = (const struct b32_bundle *)((const uint8_t *)pBundle + 2);
    11601108        else
    1161             pBundle = (const struct b32_bundle *)((const KU8 *)(pBundle + 1) + s_cbEntry[pBundle->b32_type] * pBundle->b32_cnt);
     1109            pBundle = (const struct b32_bundle *)((const uint8_t *)(pBundle + 1) + s_cbEntry[pBundle->b32_type] * pBundle->b32_cnt);
    11621110    }
    11631111
     
    11751123 * @param   iOrdinal    The ordinal to search for.
    11761124 */
    1177 static const KU8 *kldrModLXDoNameTableLookupByOrdinal(const KU8 *pbNameTable, KSSIZE cbNameTable, KU32 iOrdinal)
     1125static const uint8_t *kldrModLXDoNameTableLookupByOrdinal(const uint8_t *pbNameTable, ssize_t cbNameTable, uint32_t iOrdinal)
    11781126{
    11791127    while (*pbNameTable != 0 && cbNameTable > 0)
    11801128    {
    1181         const KU8   cbName = *pbNameTable;
    1182         KU32        iName;
     1129        const uint8_t   cbName = *pbNameTable;
     1130        uint32_t        iName;
    11831131
    11841132        cbNameTable -= cbName + 1 + 2;
     
    12001148
    12011149/** @copydoc kLdrModGetImport */
    1202 static int kldrModLXGetImport(PKLDRMOD pMod, const void *pvBits, KU32 iImport, char *pszName, KSIZE cchName)
    1203 {
    1204     PKLDRMODLX  pModLX = (PKLDRMODLX)pMod->pvData;
    1205     const KU8 *pb;
    1206     int         rc;
    1207     K_NOREF(pvBits);
     1150static int kldrModLXGetImport(PKLDRMODLX pModLX, const void *pvBits, uint32_t iImport, char *pszName, size_t cchName,
     1151                              size_t *pcbNeeded)
     1152{
     1153    const uint8_t *pb;
     1154    int            rc;
     1155    RT_NOREF(pvBits);
    12081156
    12091157    /*
     
    12111159     */
    12121160    if (iImport >= pModLX->Hdr.e32_impmodcnt)
    1213         return KLDR_ERR_IMPORT_ORDINAL_OUT_OF_BOUNDS;
     1161        return VERR_LDRLX_IMPORT_ORDINAL_OUT_OF_BOUNDS;
    12141162
    12151163    /*
     
    12331181     * Copy out the result.
    12341182     */
     1183    if (pcbNeeded)
     1184        *pcbNeeded = *pb + 1;
    12351185    if (*pb < cchName)
    12361186    {
    1237         kHlpMemCopy(pszName, pb + 1, *pb);
     1187        memcpy(pszName, pb + 1, *pb);
    12381188        pszName[*pb] = '\0';
    12391189        rc = 0;
     
    12411191    else
    12421192    {
    1243         kHlpMemCopy(pszName, pb + 1, cchName);
     1193        memcpy(pszName, pb + 1, cchName);
    12441194        if (cchName)
    12451195            pszName[cchName - 1] = '\0';
    1246         rc = KERR_BUFFER_OVERFLOW;
     1196        rc = VERR_BUFFER_OVERFLOW;
    12471197    }
    12481198
     
    12501200}
    12511201
     1202#if 0
    12521203
    12531204/** @copydoc kLdrModNumberOfImports */
    1254 static KI32 kldrModLXNumberOfImports(PKLDRMOD pMod, const void *pvBits)
    1255 {
    1256     PKLDRMODLX pModLX = (PKLDRMODLX)pMod->pvData;
    1257     K_NOREF(pvBits);
     1205static int32_t kldrModLXNumberOfImports(PRTLDRMODINTERNAL pMod, const void *pvBits)
     1206{
     1207    PKLDRMODLX pModLX = RT_FROM_MEMBER(pMod, KLDRMODLX, Core);
     1208    RT_NOREF(pvBits);
    12581209    return pModLX->Hdr.e32_impmodcnt;
    12591210}
     
    12611212
    12621213/** @copydoc kLdrModGetStackInfo */
    1263 static int kldrModLXGetStackInfo(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, PKLDRSTACKINFO pStackInfo)
    1264 {
    1265     PKLDRMODLX pModLX = (PKLDRMODLX)pMod->pvData;
    1266     const KU32 i = pModLX->Hdr.e32_stackobj;
    1267     K_NOREF(pvBits);
     1214static int kldrModLXGetStackInfo(PRTLDRMODINTERNAL pMod, const void *pvBits, RTLDRADDR BaseAddress, PKLDRSTACKINFO pStackInfo)
     1215{
     1216    PKLDRMODLX pModLX = RT_FROM_MEMBER(pMod, KLDRMODLX, Core);
     1217    const uint32_t i = pModLX->Hdr.e32_stackobj;
     1218    RT_NOREF(pvBits);
    12681219
    12691220    if (    i
    1270         &&  i <= pMod->cSegments
    1271         &&  pModLX->Hdr.e32_esp <= pMod->aSegments[i - 1].LinkAddress + pMod->aSegments[i - 1].cb
     1221        &&  i <= pModLX->cSegments
     1222        &&  pModLX->Hdr.e32_esp <= pModLX->aSegments[i - 1].LinkAddress + pModLX->aSegments[i - 1].cb
    12721223        &&  pModLX->Hdr.e32_stacksize
    1273         &&  pModLX->Hdr.e32_esp - pModLX->Hdr.e32_stacksize >= pMod->aSegments[i - 1].LinkAddress)
     1224        &&  pModLX->Hdr.e32_esp - pModLX->Hdr.e32_stacksize >= pModLX->aSegments[i - 1].LinkAddress)
    12741225    {
    12751226
     
    12771228        pStackInfo->LinkAddress = pModLX->Hdr.e32_esp - pModLX->Hdr.e32_stacksize;
    12781229        pStackInfo->Address = BaseAddress
    1279                             + pMod->aSegments[i - 1].RVA
    1280                             + pModLX->Hdr.e32_esp - pModLX->Hdr.e32_stacksize - pMod->aSegments[i - 1].LinkAddress;
     1230                            + pModLX->aSegments[i - 1].RVA
     1231                            + pModLX->Hdr.e32_esp - pModLX->Hdr.e32_stacksize - pModLX->aSegments[i - 1].LinkAddress;
    12811232    }
    12821233    else
    12831234    {
    1284         pStackInfo->Address = NIL_KLDRADDR;
    1285         pStackInfo->LinkAddress = NIL_KLDRADDR;
     1235        pStackInfo->Address = NIL_RTLDRADDR;
     1236        pStackInfo->LinkAddress = NIL_RTLDRADDR;
    12861237    }
    12871238    pStackInfo->cbStack = pModLX->Hdr.e32_stacksize;
     
    12931244
    12941245/** @copydoc kLdrModQueryMainEntrypoint */
    1295 static int kldrModLXQueryMainEntrypoint(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, PKLDRADDR pMainEPAddress)
    1296 {
    1297     PKLDRMODLX pModLX = (PKLDRMODLX)pMod->pvData;
    1298     K_NOREF(pvBits);
     1246static int kldrModLXQueryMainEntrypoint(PRTLDRMODINTERNAL pMod, const void *pvBits, RTLDRADDR BaseAddress, PRTLDRADDR pMainEPAddress)
     1247{
     1248    PKLDRMODLX pModLX = RT_FROM_MEMBER(pMod, KLDRMODLX, Core);
     1249    RT_NOREF(pvBits);
    12991250
    13001251    /*
     
    13031254    kldrModLXResolveBaseAddress(pModLX, &BaseAddress);
    13041255    *pMainEPAddress = pModLX->Hdr.e32_startobj
    1305                    && pModLX->Hdr.e32_startobj <= pMod->cSegments
    1306                    && pModLX->Hdr.e32_eip < pMod->aSegments[pModLX->Hdr.e32_startobj - 1].cb
    1307         ? BaseAddress + pMod->aSegments[pModLX->Hdr.e32_startobj - 1].RVA + pModLX->Hdr.e32_eip
    1308         : NIL_KLDRADDR;
     1256                   && pModLX->Hdr.e32_startobj <= pModLX->cSegments
     1257                   && pModLX->Hdr.e32_eip < pModLX->aSegments[pModLX->Hdr.e32_startobj - 1].cb
     1258        ? BaseAddress + pModLX->aSegments[pModLX->Hdr.e32_startobj - 1].RVA + pModLX->Hdr.e32_eip
     1259        : NIL_RTLDRADDR;
    13091260    return 0;
    13101261}
    13111262
    1312 
    1313 /** @copydoc kLdrModEnumDbgInfo */
    1314 static int kldrModLXEnumDbgInfo(PKLDRMOD pMod, const void *pvBits, PFNKLDRENUMDBG pfnCallback, void *pvUser)
    1315 {
    1316     /*PKLDRMODLX pModLX = (PKLDRMODLX)pMod->pvData;*/
    1317     K_NOREF(pfnCallback);
    1318     K_NOREF(pvUser);
     1263#endif
     1264
     1265
     1266/**
     1267 * @interface_method_impl{RTLDROPS,pfnEnumDbgInfo}
     1268 */
     1269static DECLCALLBACK(int) rtldrLX_EnumDbgInfo(PRTLDRMODINTERNAL pMod, const void *pvBits,
     1270                                             PFNRTLDRENUMDBG pfnCallback, void *pvUser)
     1271{
     1272    /*PKLDRMODLX pModLX = RT_FROM_MEMBER(pMod, KLDRMODLX, Core);*/
     1273    RT_NOREF(pfnCallback);
     1274    RT_NOREF(pvUser);
    13191275
    13201276    /*
     
    13351291
    13361292/** @copydoc kLdrModHasDbgInfo */
    1337 static int kldrModLXHasDbgInfo(PKLDRMOD pMod, const void *pvBits)
    1338 {
    1339     PKLDRMODLX pModLX = (PKLDRMODLX)pMod->pvData;
    1340     K_NOREF(pvBits);
     1293static int kldrModLXHasDbgInfo(PRTLDRMODINTERNAL pMod, const void *pvBits)
     1294{
     1295    PKLDRMODLX pModLX = RT_FROM_MEMBER(pMod, KLDRMODLX, Core);
     1296    RT_NOREF(pvBits);
    13411297
    13421298    /*
     
    13451301    if (    !pModLX->Hdr.e32_debuginfo
    13461302        ||  !pModLX->Hdr.e32_debuglen)
    1347         return KLDR_ERR_NO_DEBUG_INFO;
     1303        return VERR_NOT_FOUND;
    13481304    return 0;
    13491305}
    13501306
     1307#if 0
    13511308
    13521309/** @copydoc kLdrModMap */
    1353 static int kldrModLXMap(PKLDRMOD pMod)
    1354 {
    1355     PKLDRMODLX  pModLX = (PKLDRMODLX)pMod->pvData;
     1310static int kldrModLXMap(PRTLDRMODINTERNAL pMod)
     1311{
     1312    PKLDRMODLX  pModLX = RT_FROM_MEMBER(pMod, KLDRMODLX, Core);
    13561313    unsigned    fFixed;
    13571314    void       *pvBase;
     
    13681325     */
    13691326    /* fixed image? */
    1370     fFixed = pMod->enmType == KLDRTYPE_EXECUTABLE_FIXED
    1371           || pMod->enmType == KLDRTYPE_SHARED_LIBRARY_FIXED;
     1327    fFixed = pModLX->Core.enmType == RTLDRTYPE_EXECUTABLE_FIXED
     1328          || pModLX->Core.enmType == RTLDRTYPE_SHARED_LIBRARY_FIXED;
    13721329    if (!fFixed)
    13731330        pvBase = NULL;
    13741331    else
    13751332    {
    1376         pvBase = (void *)(KUPTR)pMod->aSegments[0].LinkAddress;
    1377         if ((KUPTR)pvBase != pMod->aSegments[0].LinkAddress)
     1333        pvBase = (void *)(uintptr_t)pModLX->aSegments[0].LinkAddress;
     1334        if ((uintptr_t)pvBase != pModLX->aSegments[0].LinkAddress)
    13781335            return KLDR_ERR_ADDRESS_OVERFLOW;
    13791336    }
     
    13901347    if (!rc)
    13911348    {
    1392         KU32 i;
    1393         for (i = 0; i < pMod->cSegments; i++)
     1349        uint32_t i;
     1350        for (i = 0; i < pModLX->cSegments; i++)
    13941351        {
    1395             if (pMod->aSegments[i].RVA != NIL_KLDRADDR)
    1396                 pMod->aSegments[i].MapAddress = (KUPTR)pvBase + (KUPTR)pMod->aSegments[i].RVA;
     1352            if (pModLX->aSegments[i].RVA != NIL_RTLDRADDR)
     1353                pModLX->aSegments[i].MapAddress = (uintptr_t)pvBase + (uintptr_t)pModLX->aSegments[i].RVA;
    13971354        }
    13981355        pModLX->pvMapping = pvBase;
     
    14031360}
    14041361
     1362#endif
    14051363
    14061364/**
     
    14151373static int kldrModLXDoLoadBits(PKLDRMODLX pModLX, void *pvBits)
    14161374{
    1417     const PKRDR pRdr = pModLX->pMod->pRdr;
    1418     KU8 *pbTmpPage = NULL;
     1375    const PRTLDRREADER pRdr = pModLX->Core.pReader;
     1376    uint8_t *pbTmpPage = NULL;
    14191377    int rc = 0;
    1420     KU32 i;
     1378    uint32_t i;
    14211379
    14221380    /*
     
    14261384    {
    14271385        const struct o32_obj * const pObj = &pModLX->paObjs[i];
    1428         const KU32      cPages = (KU32)(pModLX->pMod->aSegments[i].cbMapped / OBJPAGELEN);
    1429         KU32            iPage;
    1430         KU8            *pbPage = (KU8 *)pvBits + (KUPTR)pModLX->pMod->aSegments[i].RVA;
     1386        const uint32_t      cPages = (uint32_t)(pModLX->aSegments[i].cbMapped / OBJPAGELEN);
     1387        uint32_t            iPage;
     1388        uint8_t            *pbPage = (uint8_t *)pvBits + (uintptr_t)pModLX->aSegments[i].RVA;
    14311389
    14321390        /*
     
    14401398                case VALID:
    14411399                    if (pMap->o32_pagesize == OBJPAGELEN)
    1442                         rc = kRdrRead(pRdr, pbPage, OBJPAGELEN,
    1443                                          pModLX->Hdr.e32_datapage + (pMap->o32_pagedataoffset << pModLX->Hdr.e32_pageshift));
     1400                        rc = pRdr->pfnRead(pRdr, pbPage, OBJPAGELEN,
     1401                                           pModLX->Hdr.e32_datapage + (pMap->o32_pagedataoffset << pModLX->Hdr.e32_pageshift));
    14441402                    else if (pMap->o32_pagesize < OBJPAGELEN)
    14451403                    {
    1446                         rc = kRdrRead(pRdr, pbPage, pMap->o32_pagesize,
    1447                                          pModLX->Hdr.e32_datapage + (pMap->o32_pagedataoffset << pModLX->Hdr.e32_pageshift));
    1448                         kHlpMemSet(pbPage + pMap->o32_pagesize, 0, OBJPAGELEN - pMap->o32_pagesize);
     1404                        rc = pRdr->pfnRead(pRdr, pbPage, pMap->o32_pagesize,
     1405                                           pModLX->Hdr.e32_datapage + (pMap->o32_pagedataoffset << pModLX->Hdr.e32_pageshift));
     1406                        memset(pbPage + pMap->o32_pagesize, 0, OBJPAGELEN - pMap->o32_pagesize);
    14491407                    }
    14501408                    else
    1451                         rc = KLDR_ERR_LX_BAD_PAGE_MAP;
     1409                        rc = VERR_LDRLX_BAD_PAGE_MAP;
    14521410                    break;
    14531411
     
    14571415                    if (!pbTmpPage)
    14581416                    {
    1459                         pbTmpPage = kHlpAlloc(OBJPAGELEN + 256);
     1417                        pbTmpPage = (uint8_t *)RTMemAlloc(OBJPAGELEN + 256);
    14601418                        if (!pbTmpPage)
    14611419                            break;
     
    14641422                    if (pMap->o32_pagesize > OBJPAGELEN + 252)
    14651423                    {
    1466                         rc = KLDR_ERR_LX_BAD_PAGE_MAP;
     1424                        rc = VERR_LDRLX_BAD_PAGE_MAP;
    14671425                        break;
    14681426                    }
    14691427
    14701428                    /* read it and ensure 4 extra zero bytes. */
    1471                     rc = kRdrRead(pRdr, pbTmpPage, pMap->o32_pagesize,
    1472                                      pModLX->Hdr.e32_datapage + (pMap->o32_pagedataoffset << pModLX->Hdr.e32_pageshift));
     1429                    rc = pRdr->pfnRead(pRdr, pbTmpPage, pMap->o32_pagesize,
     1430                                       pModLX->Hdr.e32_datapage + (pMap->o32_pagedataoffset << pModLX->Hdr.e32_pageshift));
    14731431                    if (rc)
    14741432                        break;
    1475                     kHlpMemSet(pbTmpPage + pMap->o32_pagesize, 0, 4);
     1433                    memset(pbTmpPage + pMap->o32_pagesize, 0, 4);
    14761434
    14771435                    /* unpack it into the image page. */
     
    14841442                case INVALID: /* we're probably not dealing correctly with INVALID pages... */
    14851443                case ZEROED:
    1486                     kHlpMemSet(pbPage, 0, OBJPAGELEN);
     1444                    memset(pbPage, 0, OBJPAGELEN);
    14871445                    break;
    14881446
     
    14911449                    /* Falls through. */
    14921450                default:
    1493                     rc = KLDR_ERR_LX_BAD_PAGE_MAP;
     1451                    rc = VERR_LDRLX_BAD_PAGE_MAP;
    14941452                    break;
    14951453            }
     
    15021460         */
    15031461        if (iPage < cPages)
    1504             kHlpMemSet(pbPage, 0, (cPages - iPage) * OBJPAGELEN);
     1462            memset(pbPage, 0, (cPages - iPage) * OBJPAGELEN);
    15051463    }
    15061464
    15071465    if (pbTmpPage)
    1508         kHlpFree(pbTmpPage);
     1466        RTMemFree(pbTmpPage);
    15091467    return rc;
    15101468}
     
    15201478 *                      contains 4 additional zero bytes.
    15211479 */
    1522 static int kldrModLXDoIterDataUnpacking(KU8 *pbDst, const KU8 *pbSrc, int cbSrc)
     1480static int kldrModLXDoIterDataUnpacking(uint8_t *pbDst, const uint8_t *pbSrc, int cbSrc)
    15231481{
    15241482    const struct LX_Iter   *pIter = (const struct LX_Iter *)pbSrc;
     
    15271485    /* Validate size of data. */
    15281486    if (cbSrc >= (int)OBJPAGELEN - 2)
    1529         return KLDR_ERR_LX_BAD_ITERDATA;
     1487        return VERR_LDRLX_BAD_ITERDATA;
    15301488
    15311489    /*
     
    15411499            cbDst -= pIter->LX_nIter;
    15421500            if (cbDst < 0)
    1543                 return KLDR_ERR_LX_BAD_ITERDATA;
     1501                return VERR_LDRLX_BAD_ITERDATA;
    15441502
    15451503            cbSrc -= 4 + 1;
    15461504            if (cbSrc < -4)
    1547                 return KLDR_ERR_LX_BAD_ITERDATA;
    1548 
    1549             kHlpMemSet(pbDst, pIter->LX_Iterdata, pIter->LX_nIter);
     1505                return VERR_LDRLX_BAD_ITERDATA;
     1506
     1507            memset(pbDst, pIter->LX_Iterdata, pIter->LX_nIter);
    15501508            pbDst += pIter->LX_nIter;
    15511509            pIter++;
     
    15601518            cbDst -= pIter->LX_nIter * pIter->LX_nBytes;
    15611519            if (cbDst < 0)
    1562                 return KLDR_ERR_LX_BAD_ITERDATA;
     1520                return VERR_LDRLX_BAD_ITERDATA;
    15631521
    15641522            cbSrc -= 4 + pIter->LX_nBytes;
    15651523            if (cbSrc < -4)
    1566                 return KLDR_ERR_LX_BAD_ITERDATA;
     1524                return VERR_LDRLX_BAD_ITERDATA;
    15671525
    15681526            for (i = pIter->LX_nIter; i > 0; i--, pbDst += pIter->LX_nBytes)
    1569                 kHlpMemCopy(pbDst, &pIter->LX_Iterdata, pIter->LX_nBytes);
     1527                memcpy(pbDst, &pIter->LX_Iterdata, pIter->LX_nBytes);
    15701528            pIter   = (struct LX_Iter *)((char*)pIter + 4 + pIter->LX_nBytes);
    15711529        }
     
    15761534     */
    15771535    if (cbDst > 0)
    1578         kHlpMemSet(pbDst, 0, cbDst);
     1536        memset(pbDst, 0, cbDst);
    15791537
    15801538    return 0;
     
    15911549 *                      contains 4 additional zero bytes.
    15921550 */
    1593 static int kldrModLXDoIterData2Unpacking(KU8 *pbDst, const KU8 *pbSrc, int cbSrc)
     1551static int kldrModLXDoIterData2Unpacking(uint8_t *pbDst, const uint8_t *pbSrc, int cbSrc)
    15941552{
    15951553    int cbDst = OBJPAGELEN;
     
    16291587                    cbDst -= cb;
    16301588                    if (cbDst < 0)
    1631                         return KLDR_ERR_LX_BAD_ITERDATA2;
     1589                        return VERR_LDRLX_BAD_ITERDATA2;
    16321590                    cbSrc -= cb + 1;
    16331591                    if (cbSrc < 0)
    1634                         return KLDR_ERR_LX_BAD_ITERDATA2;
    1635                     kHlpMemCopy(pbDst, ++pbSrc, cb);
     1592                        return VERR_LDRLX_BAD_ITERDATA2;
     1593                    memcpy(pbDst, ++pbSrc, cb);
    16361594                    pbDst += cb;
    16371595                    pbSrc += cb;
    16381596                }
    16391597                else if (cbSrc < 2)
    1640                     return KLDR_ERR_LX_BAD_ITERDATA2;
     1598                    return VERR_LDRLX_BAD_ITERDATA2;
    16411599                else
    16421600                {
     
    16461604                    cbDst -= cb;
    16471605                    if (cbDst < 0)
    1648                         return KLDR_ERR_LX_BAD_ITERDATA2;
     1606                        return VERR_LDRLX_BAD_ITERDATA2;
    16491607                    cbSrc -= 3;
    16501608                    if (cbSrc < 0)
    1651                         return KLDR_ERR_LX_BAD_ITERDATA2;
    1652                     kHlpMemSet(pbDst, pbSrc[2], cb);
     1609                        return VERR_LDRLX_BAD_ITERDATA2;
     1610                    memset(pbDst, pbSrc[2], cb);
    16531611                    pbDst += cb;
    16541612                    pbSrc += 3;
     
    16721630                cbSrc -= 2;
    16731631                if (cbSrc < 0)
    1674                     return KLDR_ERR_LX_BAD_ITERDATA2;
     1632                    return VERR_LDRLX_BAD_ITERDATA2;
    16751633                else
    16761634                {
     
    16821640                    cbSrc -= cb1;
    16831641                    if (cbSrc < 0)
    1684                         return KLDR_ERR_LX_BAD_ITERDATA2;
     1642                        return VERR_LDRLX_BAD_ITERDATA2;
    16851643                    cbDst -= cb1;
    16861644                    if (cbDst < 0)
    1687                         return KLDR_ERR_LX_BAD_ITERDATA2;
    1688                     kHlpMemCopy(pbDst, pbSrc, cb1);
     1645                        return VERR_LDRLX_BAD_ITERDATA2;
     1646                    memcpy(pbDst, pbSrc, cb1);
    16891647                    pbDst += cb1;
    16901648                    pbSrc += cb1;
    16911649
    16921650                    if (off > OBJPAGELEN - (unsigned)cbDst)
    1693                         return KLDR_ERR_LX_BAD_ITERDATA2;
     1651                        return VERR_LDRLX_BAD_ITERDATA2;
    16941652                    cbDst -= cb2;
    16951653                    if (cbDst < 0)
    1696                         return KLDR_ERR_LX_BAD_ITERDATA2;
    1697                     kHlpMemMove(pbDst, pbDst - off, cb2);
     1654                        return VERR_LDRLX_BAD_ITERDATA2;
     1655                    memmove(pbDst, pbDst - off, cb2);
    16981656                    pbDst += cb2;
    16991657                }
     
    17181676                cbSrc -= 2;
    17191677                if (cbSrc < 0)
    1720                     return KLDR_ERR_LX_BAD_ITERDATA2;
     1678                    return VERR_LDRLX_BAD_ITERDATA2;
    17211679                else
    17221680                {
     
    17261684                    pbSrc += 2;
    17271685                    if (off > OBJPAGELEN - (unsigned)cbDst)
    1728                         return KLDR_ERR_LX_BAD_ITERDATA2;
     1686                        return VERR_LDRLX_BAD_ITERDATA2;
    17291687                    cbDst -= cb;
    17301688                    if (cbDst < 0)
    1731                         return KLDR_ERR_LX_BAD_ITERDATA2;
     1689                        return VERR_LDRLX_BAD_ITERDATA2;
    17321690                    kLdrModLXMemCopyW(pbDst, pbDst - off, cb);
    17331691                    pbDst += cb;
     
    17531711                cbSrc -= 3;
    17541712                if (cbSrc < 0)
    1755                     return KLDR_ERR_LX_BAD_ITERDATA2;
     1713                    return VERR_LDRLX_BAD_ITERDATA2;
    17561714                else
    17571715                {
     
    17631721                    cbSrc -= cb1;
    17641722                    if (cbSrc < 0)
    1765                         return KLDR_ERR_LX_BAD_ITERDATA2;
     1723                        return VERR_LDRLX_BAD_ITERDATA2;
    17661724                    cbDst -= cb1;
    17671725                    if (cbDst < 0)
    1768                         return KLDR_ERR_LX_BAD_ITERDATA2;
    1769                     kHlpMemCopy(pbDst, pbSrc, cb1);
     1726                        return VERR_LDRLX_BAD_ITERDATA2;
     1727                    memcpy(pbDst, pbSrc, cb1);
    17701728                    pbDst += cb1;
    17711729                    pbSrc += cb1;
    17721730
    17731731                    if (off > OBJPAGELEN - (unsigned)cbDst)
    1774                         return KLDR_ERR_LX_BAD_ITERDATA2;
     1732                        return VERR_LDRLX_BAD_ITERDATA2;
    17751733                    cbDst -= cb2;
    17761734                    if (cbDst < 0)
    1777                         return KLDR_ERR_LX_BAD_ITERDATA2;
     1735                        return VERR_LDRLX_BAD_ITERDATA2;
    17781736                    kLdrModLXMemCopyW(pbDst, pbDst - off, cb2);
    17791737                    pbDst += cb2;
     
    17911749     */
    17921750    if (cbDst > 0)
    1793         kHlpMemSet(pbDst, 0, cbDst);
     1751        memset(pbDst, 0, cbDst);
    17941752
    17951753    return 0;
     
    18081766 * @remark  This assumes that unaligned word and dword access is fine.
    18091767 */
    1810 static void kLdrModLXMemCopyW(KU8 *pbDst, const KU8 *pbSrc, int cb)
     1768static void kLdrModLXMemCopyW(uint8_t *pbDst, const uint8_t *pbSrc, int cb)
    18111769{
    18121770    switch (pbDst - pbSrc)
     
    18201778                *pbDst++ = *pbSrc++;
    18211779            for (cb >>= 1; cb > 0; cb--, pbDst += 2, pbSrc += 2)
    1822                 *(KU16 *)pbDst = *(const KU16 *)pbSrc;
     1780                *(uint16_t *)pbDst = *(const uint16_t *)pbSrc;
    18231781            break;
    18241782
     
    18291787            if (cb & 2)
    18301788            {
    1831                 *(KU16 *)pbDst = *(const KU16 *)pbSrc;
     1789                *(uint16_t *)pbDst = *(const uint16_t *)pbSrc;
    18321790                pbDst += 2;
    18331791                pbSrc += 2;
    18341792            }
    18351793            for (cb >>= 2; cb > 0; cb--, pbDst += 4, pbSrc += 4)
    1836                 *(KU32 *)pbDst = *(const KU32 *)pbSrc;
     1794                *(uint32_t *)pbDst = *(const uint32_t *)pbSrc;
    18371795            break;
    18381796    }
    18391797}
    18401798
     1799#if 0
    18411800
    18421801/**
     
    18531812static int kldrModLXDoProtect(PKLDRMODLX pModLX, void *pvBits, unsigned fUnprotectOrProtect)
    18541813{
    1855     KU32 i;
    1856     PKLDRMOD pMod = pModLX->pMod;
     1814    uint32_t i;
    18571815
    18581816    /*
    18591817     * Change object protection.
    18601818     */
    1861     for (i = 0; i < pMod->cSegments; i++)
     1819    for (i = 0; i < pModLX->cSegments; i++)
    18621820    {
    18631821        int rc;
     
    18661824
    18671825        /* calc new protection. */
    1868         enmProt = pMod->aSegments[i].enmProt;
     1826        enmProt = pModLX->aSegments[i].enmProt;
    18691827        if (fUnprotectOrProtect)
    18701828        {
     
    18991857
    19001858        /* calc the address and set page protection. */
    1901         pv = (KU8 *)pvBits + pMod->aSegments[i].RVA;
    1902 
    1903         rc = kHlpPageProtect(pv, pMod->aSegments[i].cbMapped, enmProt);
     1859        pv = (uint8_t *)pvBits + pModLX->aSegments[i].RVA;
     1860
     1861        rc = kHlpPageProtect(pv, pModLX->aSegments[i].cbMapped, enmProt);
    19041862        if (rc)
    19051863            break;
     
    19131871
    19141872/** @copydoc kLdrModUnmap */
    1915 static int kldrModLXUnmap(PKLDRMOD pMod)
    1916 {
    1917     PKLDRMODLX  pModLX = (PKLDRMODLX)pMod->pvData;
    1918     KU32        i;
     1873static int kldrModLXUnmap(PRTLDRMODINTERNAL pMod)
     1874{
     1875    PKLDRMODLX  pModLX = RT_FROM_MEMBER(pMod, KLDRMODLX, Core);
     1876    uint32_t    i;
    19191877    int         rc;
    19201878
     
    19321890    pModLX->pvMapping = NULL;
    19331891
    1934     for (i = 0; i < pMod->cSegments; i++)
    1935         pMod->aSegments[i].MapAddress = 0;
     1892    for (i = 0; i < pModLX->cSegments; i++)
     1893        pModLX->aSegments[i].MapAddress = 0;
    19361894
    19371895    return rc;
     
    19401898
    19411899/** @copydoc kLdrModAllocTLS */
    1942 static int kldrModLXAllocTLS(PKLDRMOD pMod, void *pvMapping)
    1943 {
    1944     PKLDRMODLX  pModLX = (PKLDRMODLX)pMod->pvData;
     1900static int kldrModLXAllocTLS(PRTLDRMODINTERNAL pMod, void *pvMapping)
     1901{
     1902    PKLDRMODLX  pModLX = RT_FROM_MEMBER(pMod, KLDRMODLX, Core);
    19451903
    19461904    /* no tls, just do the error checking. */
     
    19531911
    19541912/** @copydoc kLdrModFreeTLS */
    1955 static void kldrModLXFreeTLS(PKLDRMOD pMod, void *pvMapping)
     1913static void kldrModLXFreeTLS(PRTLDRMODINTERNAL pMod, void *pvMapping)
    19561914{
    19571915    /* no tls. */
    1958     K_NOREF(pMod);
    1959     K_NOREF(pvMapping);
     1916    RT_NOREF(pMod);
     1917    RT_NOREF(pvMapping);
    19601918
    19611919}
     
    19631921
    19641922/** @copydoc kLdrModReload */
    1965 static int kldrModLXReload(PKLDRMOD pMod)
    1966 {
    1967     PKLDRMODLX pModLX = (PKLDRMODLX)pMod->pvData;
     1923static int kldrModLXReload(PRTLDRMODINTERNAL pMod)
     1924{
     1925    PKLDRMODLX pModLX = RT_FROM_MEMBER(pMod, KLDRMODLX, Core);
    19681926    int rc, rc2;
    19691927
     
    19971955
    19981956/** @copydoc kLdrModFixupMapping */
    1999 static int kldrModLXFixupMapping(PKLDRMOD pMod, PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser)
    2000 {
    2001     PKLDRMODLX pModLX = (PKLDRMODLX)pMod->pvData;
     1957static int kldrModLXFixupMapping(PRTLDRMODINTERNAL pMod, PFNRTLDRIMPORT pfnGetImport, void *pvUser)
     1958{
     1959    PKLDRMODLX pModLX = RT_FROM_MEMBER(pMod, KLDRMODLX, Core);
    20021960    int rc, rc2;
    20031961
     
    20181976     * Apply fixups and resolve imports.
    20191977     */
    2020     rc = kldrModLXRelocateBits(pMod, (void *)pModLX->pvMapping, (KUPTR)pModLX->pvMapping,
    2021                                pMod->aSegments[0].LinkAddress, pfnGetImport, pvUser);
     1978    rc = rtldrLX_RelocateBits(pMod, (void *)pModLX->pvMapping, (uintptr_t)pModLX->pvMapping,
     1979                              pModLX->aSegments[0].LinkAddress, pfnGetImport, pvUser);
    20221980
    20231981    /*
     
    20321990
    20331991/** @copydoc kLdrModCallInit */
    2034 static int kldrModLXCallInit(PKLDRMOD pMod, void *pvMapping, KUPTR uHandle)
    2035 {
    2036     PKLDRMODLX pModLX = (PKLDRMODLX)pMod->pvData;
     1992static int kldrModLXCallInit(PRTLDRMODINTERNAL pMod, void *pvMapping, uintptr_t uHandle)
     1993{
     1994    PKLDRMODLX pModLX = RT_FROM_MEMBER(pMod, KLDRMODLX, Core);
    20371995    int rc;
    20381996
     
    20682026 * @param   uHandle         The module handle to present.
    20692027 */
    2070 static int kldrModLXDoCallDLL(PKLDRMODLX pModLX, void *pvMapping, unsigned uOp, KUPTR uHandle)
     2028static int kldrModLXDoCallDLL(PKLDRMODLX pModLX, void *pvMapping, unsigned uOp, uintptr_t uHandle)
    20712029{
    20722030    int rc;
     
    20822040     * Invoke the entrypoint and convert the boolean result to a kLdr status code.
    20832041     */
    2084     rc = kldrModLXDoCall((KUPTR)pvMapping
    2085                          + (KUPTR)pModLX->pMod->aSegments[pModLX->Hdr.e32_startobj - 1].RVA
     2042    rc = kldrModLXDoCall((uintptr_t)pvMapping
     2043                         + (uintptr_t)pModLX->aSegments[pModLX->Hdr.e32_startobj - 1].RVA
    20862044                         + pModLX->Hdr.e32_eip,
    20872045                         uHandle, uOp, NULL);
     
    21052063 * @param   pvReserved      The third argument, reserved argument. (figure this one out)
    21062064 */
    2107 static KI32 kldrModLXDoCall(KUPTR uEntrypoint, KUPTR uHandle, KU32 uOp, void *pvReserved)
     2065static int32_t kldrModLXDoCall(uintptr_t uEntrypoint, uintptr_t uHandle, uint32_t uOp, void *pvReserved)
    21082066{
    21092067#if defined(__X86__) || defined(__i386__) || defined(_M_IX86)
    2110     KI32 rc;
     2068    int32_t rc;
    21112069/** @todo try/except */
    21122070
     
    21462104#  error "port me!"
    21472105# endif
    2148     K_NOREF(pvReserved);
     2106    RT_NOREF(pvReserved);
    21492107    return rc;
    21502108
    21512109#else
    2152     K_NOREF(uEntrypoint);
    2153     K_NOREF(uHandle);
    2154     K_NOREF(uOp);
    2155     K_NOREF(pvReserved);
     2110    RT_NOREF(uEntrypoint);
     2111    RT_NOREF(uHandle);
     2112    RT_NOREF(uOp);
     2113    RT_NOREF(pvReserved);
    21562114    return KCPU_ERR_ARCH_CPU_NOT_COMPATIBLE;
    21572115#endif
     
    21602118
    21612119/** @copydoc kLdrModCallTerm */
    2162 static int kldrModLXCallTerm(PKLDRMOD pMod, void *pvMapping, KUPTR uHandle)
    2163 {
    2164     PKLDRMODLX  pModLX = (PKLDRMODLX)pMod->pvData;
     2120static int kldrModLXCallTerm(PRTLDRMODINTERNAL pMod, void *pvMapping, uintptr_t uHandle)
     2121{
     2122    PKLDRMODLX  pModLX = RT_FROM_MEMBER(pMod, KLDRMODLX, Core);
    21652123
    21662124    /*
     
    21852143
    21862144/** @copydoc kLdrModCallThread */
    2187 static int kldrModLXCallThread(PKLDRMOD pMod, void *pvMapping, KUPTR uHandle, unsigned fAttachingOrDetaching)
     2145static int kldrModLXCallThread(PRTLDRMODINTERNAL pMod, void *pvMapping, uintptr_t uHandle, unsigned fAttachingOrDetaching)
    21882146{
    21892147    /* no thread attach/detach callout. */
    2190     K_NOREF(pMod);
    2191     K_NOREF(pvMapping);
    2192     K_NOREF(uHandle);
    2193     K_NOREF(fAttachingOrDetaching);
     2148    RT_NOREF(pMod);
     2149    RT_NOREF(pvMapping);
     2150    RT_NOREF(uHandle);
     2151    RT_NOREF(fAttachingOrDetaching);
    21942152    return 0;
    21952153}
    21962154
    2197 
    2198 /** @copydoc kLdrModSize */
    2199 static KLDRADDR kldrModLXSize(PKLDRMOD pMod)
    2200 {
    2201     PKLDRMODLX pModLX = (PKLDRMODLX)pMod->pvData;
     2155#endif
     2156
     2157/**
     2158 * @interface_method_impl{RTLDROPS,pfnGetImageSize}
     2159 */
     2160static DECLCALLBACK(size_t) rtldrLX_GetImageSize(PRTLDRMODINTERNAL pMod)
     2161{
     2162    PKLDRMODLX pModLX = RT_FROM_MEMBER(pMod, KLDRMODLX, Core);
    22022163    return pModLX->cbMapped;
    22032164}
    22042165
    22052166
    2206 /** @copydoc kLdrModGetBits */
    2207 static int kldrModLXGetBits(PKLDRMOD pMod, void *pvBits, KLDRADDR BaseAddress, PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser)
    2208 {
    2209     PKLDRMODLX  pModLX = (PKLDRMODLX)pMod->pvData;
    2210     int         rc;
     2167/**
     2168 * @interface_method_impl{RTLDROPS,pfnGetBits}
     2169 */
     2170static DECLCALLBACK(int) rtldrLX_GetBits(PRTLDRMODINTERNAL pMod, void *pvBits, RTUINTPTR BaseAddress,
     2171                                         PFNRTLDRIMPORT pfnGetImport, void *pvUser)
     2172{
     2173    PKLDRMODLX pModLX = RT_FROM_MEMBER(pMod, KLDRMODLX, Core);
    22112174
    22122175    /*
    22132176     * Load the image bits.
    22142177     */
    2215     rc = kldrModLXDoLoadBits(pModLX, pvBits);
    2216     if (rc)
    2217         return rc;
    2218 
    2219     /*
    2220      * Perform relocations.
    2221      */
    2222     return kldrModLXRelocateBits(pMod, pvBits, BaseAddress, pMod->aSegments[0].LinkAddress, pfnGetImport, pvUser);
    2223 
    2224 }
    2225 
    2226 
    2227 /** @copydoc kLdrModRelocateBits */
    2228 static int kldrModLXRelocateBits(PKLDRMOD pMod, void *pvBits, KLDRADDR NewBaseAddress, KLDRADDR OldBaseAddress,
    2229                                  PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser)
    2230 {
    2231     PKLDRMODLX pModLX = (PKLDRMODLX)pMod->pvData;
    2232     KU32 iSeg;
     2178    int rc = kldrModLXDoLoadBits(pModLX, pvBits);
     2179    if (RT_SUCCESS(rc))
     2180    {
     2181        /*
     2182         * Perform relocations.
     2183         */
     2184        rc = rtldrLX_RelocateBits(pMod, pvBits, BaseAddress, pModLX->aSegments[0].LinkAddress, pfnGetImport, pvUser);
     2185    }
     2186    return rc;
     2187}
     2188
     2189
     2190/**
     2191 * @interface_method_impl{RTLDROPS,pfnRelocate}
     2192 */
     2193static DECLCALLBACK(int) rtldrLX_RelocateBits(PRTLDRMODINTERNAL pMod, void *pvBits, RTUINTPTR NewBaseAddress,
     2194                                              RTUINTPTR OldBaseAddress, PFNRTLDRIMPORT pfnGetImport, void *pvUser)
     2195{
     2196    PKLDRMODLX pModLX = RT_FROM_MEMBER(pMod, KLDRMODLX, Core);
     2197    uint32_t iSeg;
    22332198    int rc;
    22342199
     
    22572222    {
    22582223        const struct o32_obj * const pObj = &pModLX->paObjs[iSeg];
    2259         KLDRADDR        PageAddress = NewBaseAddress + pModLX->pMod->aSegments[iSeg].RVA;
    2260         KU32            iPage;
    2261         KU8            *pbPage = (KU8 *)pvBits + (KUPTR)pModLX->pMod->aSegments[iSeg].RVA;
     2224        RTLDRADDR           PageAddress = NewBaseAddress + pModLX->aSegments[iSeg].RVA;
     2225        uint32_t            iPage;
     2226        uint8_t            *pbPage = (uint8_t *)pvBits + (uintptr_t)pModLX->aSegments[iSeg].RVA;
    22622227
    22632228        /*
     
    22662231        for (iPage = 0, rc = 0; !rc && iPage < pObj->o32_mapsize; iPage++, pbPage += OBJPAGELEN, PageAddress += OBJPAGELEN)
    22672232        {
    2268             const KU8 * const   pbFixupRecEnd = pModLX->pbFixupRecs + pModLX->paoffPageFixups[iPage + pObj->o32_pagemap];
    2269             const KU8          *pb            = pModLX->pbFixupRecs + pModLX->paoffPageFixups[iPage + pObj->o32_pagemap - 1];
    2270             KLDRADDR            uValue        = NIL_KLDRADDR;
    2271             KU32                fKind         = 0;
    2272             int                 iSelector;
     2233            const uint8_t * const   pbFixupRecEnd = pModLX->pbFixupRecs + pModLX->paoffPageFixups[iPage + pObj->o32_pagemap];
     2234            const uint8_t          *pb            = pModLX->pbFixupRecs + pModLX->paoffPageFixups[iPage + pObj->o32_pagemap - 1];
     2235            RTLDRADDR               uValue        = NIL_RTLDRADDR;
     2236            uint32_t                fKind         = 0;
     2237            int                     iSelector;
    22732238
    22742239            /* sanity */
    22752240            if (pbFixupRecEnd < pb)
    2276                 return KLDR_ERR_BAD_FIXUP;
     2241                return VERR_LDR_BAD_FIXUP;
    22772242            if (pbFixupRecEnd - 1 > pModLX->pbFixupSectionLast)
    2278                 return KLDR_ERR_BAD_FIXUP;
     2243                return VERR_LDR_BAD_FIXUP;
    22792244            if (pb < pModLX->pbFixupSection)
    2280                 return KLDR_ERR_BAD_FIXUP;
     2245                return VERR_LDR_BAD_FIXUP;
    22812246
    22822247            /*
     
    22872252                union _rel
    22882253                {
    2289                     const KU8 *             pb;
     2254                    const uint8_t *             pb;
    22902255                    const struct r32_rlc   *prlc;
    22912256                } u;
    2292 
     2257                char szImpModule[256];
    22932258                u.pb = pb;
    22942259                pb += 3 + (u.prlc->nr_stype & NRCHAIN ? 0 : 1); /* place pch at the 4th member. */
     
    23042269                    case NRRINT:
    23052270                    {
    2306                         KU16 iTrgObject;
    2307                         KU32 offTrgObject;
     2271                        uint16_t iTrgObject;
     2272                        uint32_t offTrgObject;
    23082273
    23092274                        /* the object */
    23102275                        if (u.prlc->nr_flags & NR16OBJMOD)
    23112276                        {
    2312                             iTrgObject = *(const KU16 *)pb;
     2277                            iTrgObject = *(const uint16_t *)pb;
    23132278                            pb += 2;
    23142279                        }
     
    23172282                        iTrgObject--;
    23182283                        if (iTrgObject >= pModLX->Hdr.e32_objcnt)
    2319                             return KLDR_ERR_BAD_FIXUP;
     2284                            return VERR_LDR_BAD_FIXUP;
    23202285
    23212286                        /* the target */
     
    23242289                            if (u.prlc->nr_flags & NR32BITOFF)
    23252290                            {
    2326                                 offTrgObject = *(const KU32 *)pb;
     2291                                offTrgObject = *(const uint32_t *)pb;
    23272292                                pb += 4;
    23282293                            }
    23292294                            else
    23302295                            {
    2331                                 offTrgObject = *(const KU16 *)pb;
     2296                                offTrgObject = *(const uint16_t *)pb;
    23322297                                pb += 2;
    23332298                            }
    23342299
    23352300                            /* calculate the symbol info. */
    2336                             uValue = offTrgObject + NewBaseAddress + pMod->aSegments[iTrgObject].RVA;
     2301                            uValue = offTrgObject + NewBaseAddress + pModLX->aSegments[iTrgObject].RVA;
    23372302                        }
    23382303                        else
    2339                             uValue = NewBaseAddress + pMod->aSegments[iTrgObject].RVA;
     2304                            uValue = NewBaseAddress + pModLX->aSegments[iTrgObject].RVA;
    23402305                        if (    (u.prlc->nr_stype & NRALIAS)
    2341                             ||  (pMod->aSegments[iTrgObject].fFlags & KLDRSEG_FLAG_16BIT))
    2342                             iSelector = pMod->aSegments[iTrgObject].Sel16bit;
     2306                            ||  (pModLX->aSegments[iTrgObject].fFlags & RTLDRSEG_FLAG_16BIT))
     2307                            iSelector = pModLX->aSegments[iTrgObject].Sel16bit;
    23432308                        else
    2344                             iSelector = pMod->aSegments[iTrgObject].SelFlat;
     2309                            iSelector = pModLX->aSegments[iTrgObject].SelFlat;
    23452310                        fKind = 0;
    23462311                        break;
     
    23522317                    case NRRORD:
    23532318                    {
    2354                         KU16 iModule;
    2355                         KU32 iSymbol;
     2319                        uint16_t iModule;
     2320                        uint32_t iSymbol;
    23562321
    23572322                        /* the module ordinal */
    23582323                        if (u.prlc->nr_flags & NR16OBJMOD)
    23592324                        {
    2360                             iModule = *(const KU16 *)pb;
     2325                            iModule = *(const uint16_t *)pb;
    23612326                            pb += 2;
    23622327                        }
     
    23652330                        iModule--;
    23662331                        if (iModule >= pModLX->Hdr.e32_impmodcnt)
    2367                             return KLDR_ERR_BAD_FIXUP;
     2332                            return VERR_LDR_BAD_FIXUP;
     2333                        rc = kldrModLXGetImport(pModLX, NULL, iModule, szImpModule, sizeof(szImpModule), NULL);
     2334                        if (RT_FAILURE(rc))
     2335                            return rc;
     2336
    23682337#if 1
    23692338                        if (u.prlc->nr_flags & NRICHAIN)
    2370                             return KLDR_ERR_BAD_FIXUP;
     2339                            return VERR_LDR_BAD_FIXUP;
    23712340#endif
    23722341
     
    23742343                        if (u.prlc->nr_flags & NR32BITOFF)
    23752344                        {
    2376                             iSymbol = *(const KU32 *)pb;
     2345                            iSymbol = *(const uint32_t *)pb;
    23772346                            pb += 4;
    23782347                        }
    23792348                        else if (!(u.prlc->nr_flags & NR8BITORD))
    23802349                        {
    2381                             iSymbol = *(const KU16 *)pb;
     2350                            iSymbol = *(const uint16_t *)pb;
    23822351                            pb += 2;
    23832352                        }
     
    23862355
    23872356                        /* resolve it. */
    2388                         rc = pfnGetImport(pMod, iModule, iSymbol, NULL, 0, NULL, &uValue, &fKind, pvUser);
     2357                        rc = pfnGetImport(pMod, szImpModule, NULL, iSymbol, &uValue, /*&fKind,*/ pvUser);
    23892358                        if (rc)
    23902359                            return rc;
     
    23982367                    case NRRNAM:
    23992368                    {
    2400                         KU32 iModule;
    2401                         KU16 offSymbol;
    2402                         const KU8 *pbSymbol;
     2369                        uint32_t iModule;
     2370                        uint16_t offSymbol;
     2371                        const uint8_t *pbSymbol;
    24032372
    24042373                        /* the module ordinal */
    24052374                        if (u.prlc->nr_flags & NR16OBJMOD)
    24062375                        {
    2407                             iModule = *(const KU16 *)pb;
     2376                            iModule = *(const uint16_t *)pb;
    24082377                            pb += 2;
    24092378                        }
     
    24122381                        iModule--;
    24132382                        if (iModule >= pModLX->Hdr.e32_impmodcnt)
    2414                             return KLDR_ERR_BAD_FIXUP;
     2383                            return VERR_LDR_BAD_FIXUP;
     2384                        rc = kldrModLXGetImport(pModLX, NULL, iModule, szImpModule, sizeof(szImpModule), NULL);
     2385                        if (RT_FAILURE(rc))
     2386                            return rc;
    24152387#if 1
    24162388                        if (u.prlc->nr_flags & NRICHAIN)
    2417                             return KLDR_ERR_BAD_FIXUP;
     2389                            return VERR_LDR_BAD_FIXUP;
    24182390#endif
    24192391
     
    24212393                        if (u.prlc->nr_flags & NR32BITOFF)
    24222394                        {
    2423                             offSymbol = *(const KU32 *)pb;
     2395                            offSymbol = *(const uint32_t *)pb;
    24242396                            pb += 4;
    24252397                        }
    24262398                        else if (!(u.prlc->nr_flags & NR8BITORD))
    24272399                        {
    2428                             offSymbol = *(const KU16 *)pb;
     2400                            offSymbol = *(const uint16_t *)pb;
    24292401                            pb += 2;
    24302402                        }
     
    24342406                        if (    pbSymbol < pModLX->pbImportProcs
    24352407                            ||  pbSymbol > pModLX->pbFixupSectionLast)
    2436                             return KLDR_ERR_BAD_FIXUP;
     2408                            return VERR_LDR_BAD_FIXUP;
     2409                        char szSymbol[256];
     2410                        memcpy(szSymbol, pbSymbol + 1, *pbSymbol);
     2411                        szSymbol[*pbSymbol] = '\0';
    24372412
    24382413                        /* resolve it. */
    2439                         rc = pfnGetImport(pMod, iModule, NIL_KLDRMOD_SYM_ORDINAL, (const char *)pbSymbol + 1, *pbSymbol, NULL,
    2440                                           &uValue, &fKind, pvUser);
     2414                        rc = pfnGetImport(pMod, szImpModule, szSymbol, UINT32_MAX, &uValue, /*&fKind,*/ pvUser);
    24412415                        if (rc)
    24422416                            return rc;
     
    24582432                    if (u.prlc->nr_flags & NR32BITADD)
    24592433                    {
    2460                         uValue += *(const KU32 *)pb;
     2434                        uValue += *(const uint32_t *)pb;
    24612435                        pb += 4;
    24622436                    }
    24632437                    else
    24642438                    {
    2465                         uValue += *(const KU16 *)pb;
     2439                        uValue += *(const uint16_t *)pb;
    24662440                        pb += 2;
    24672441                    }
     
    24802454                        &&  off >= 0
    24812455                        &&  off <= (int)OBJPAGELEN - 4)
    2482                         *(KU32 *)&pbPage[off] = (KU32)uValue;
     2456                        *(uint32_t *)&pbPage[off] = (uint32_t)uValue;
    24832457                    else if (    (u.prlc->nr_stype & NRSRCMASK) == NRSOFF32
    24842458                            &&  off >= 0
    24852459                            &&  off <= (int)OBJPAGELEN - 4)
    2486                         *(KU32 *)&pbPage[off] = (KU32)(uValue - (PageAddress + off + 4));
     2460                        *(uint32_t *)&pbPage[off] = (uint32_t)(uValue - (PageAddress + off + 4));
    24872461                    else
    24882462                    {
     
    24952469                else if (!(u.prlc->nr_flags & NRICHAIN))
    24962470                {
    2497                     const KI16 *poffSrc = (const KI16 *)pb;
    2498                     KU8 c = u.pb[2];
     2471                    const int16_t *poffSrc = (const int16_t *)pb;
     2472                    uint8_t c = u.pb[2];
    24992473
    25002474                    /* common / simple */
     
    25052479                            int off = *poffSrc++;
    25062480                            if (off >= 0 && off <= (int)OBJPAGELEN - 4)
    2507                                 *(KU32 *)&pbPage[off] = (KU32)uValue;
     2481                                *(uint32_t *)&pbPage[off] = (uint32_t)uValue;
    25082482                            else
    25092483                            {
     
    25202494                            int off = *poffSrc++;
    25212495                            if (off >= 0 && off <= (int)OBJPAGELEN - 4)
    2522                                 *(KU32 *)&pbPage[off] = (KU32)(uValue - (PageAddress + off + 4));
     2496                                *(uint32_t *)&pbPage[off] = (uint32_t)(uValue - (PageAddress + off + 4));
    25232497                            else
    25242498                            {
     
    25382512                        }
    25392513                    }
    2540                     pb = (const KU8 *)poffSrc;
     2514                    pb = (const uint8_t *)poffSrc;
    25412515                }
    25422516                else
     
    25442518                    /* This is a pain because it will require virgin pages on a relocation. */
    25452519                    KLDRMODLX_ASSERT(!"NRICHAIN");
    2546                     return KLDR_ERR_LX_NRICHAIN_NOT_SUPPORTED;
     2520                    return VERR_LDRLX_NRICHAIN_NOT_SUPPORTED;
    25472521                }
    25482522            }
     
    25662540 * @param   fKind       The target kind.
    25672541 */
    2568 static int kldrModLXDoReloc(KU8 *pbPage, int off, KLDRADDR PageAddress, const struct r32_rlc *prlc,
    2569                             int iSelector, KLDRADDR uValue, KU32 fKind)
     2542static int kldrModLXDoReloc(uint8_t *pbPage, int off, RTLDRADDR PageAddress, const struct r32_rlc *prlc,
     2543                            int iSelector, RTLDRADDR uValue, uint32_t fKind)
    25702544{
    25712545#pragma pack(1) /* just to be sure */
    25722546    union
    25732547    {
    2574         KU8         ab[6];
    2575         KU32        off32;
    2576         KU16        off16;
    2577         KU8         off8;
     2548        uint8_t         ab[6];
     2549        uint32_t        off32;
     2550        uint16_t        off16;
     2551        uint8_t         off8;
    25782552        struct
    25792553        {
    2580             KU16    off;
    2581             KU16    Sel;
     2554            uint16_t    off;
     2555            uint16_t    Sel;
    25822556        }           Far16;
    25832557        struct
    25842558        {
    2585             KU32    off;
    2586             KU16    Sel;
     2559            uint32_t    off;
     2560            uint16_t    Sel;
    25872561        }           Far32;
    25882562    }               uData;
    25892563#pragma pack()
    2590     const KU8      *pbSrc;
    2591     KU8            *pbDst;
    2592     KU8             cb;
    2593 
    2594     K_NOREF(fKind);
     2564    const uint8_t      *pbSrc;
     2565    uint8_t            *pbDst;
     2566    uint8_t             cb;
     2567
     2568    RT_NOREF(fKind);
    25952569
    25962570    /*
     
    26002574    {
    26012575        case NRSBYT:
    2602             uData.off8 = (KU8)uValue;
     2576            uData.off8 = (uint8_t)uValue;
    26032577            cb = 1;
    26042578            break;
     
    26162590                /* fixme */
    26172591            }
    2618             uData.Far16.off = (KU16)uValue;
     2592            uData.Far16.off = (uint16_t)uValue;
    26192593            uData.Far16.Sel = iSelector;
    26202594            cb = 4;
    26212595            break;
    26222596        case NRSOFF:
    2623             uData.off16 = (KU16)uValue;
     2597            uData.off16 = (uint16_t)uValue;
    26242598            cb = 2;
    26252599            break;
     
    26292603                /* fixme */
    26302604            }
    2631             uData.Far32.off = (KU32)uValue;
     2605            uData.Far32.off = (uint32_t)uValue;
    26322606            uData.Far32.Sel = iSelector;
    26332607            cb = 6;
    26342608            break;
    26352609        case NROFF32:
    2636             uData.off32 = (KU32)uValue;
     2610            uData.off32 = (uint32_t)uValue;
    26372611            cb = 4;
    26382612            break;
    26392613        case NRSOFF32:
    2640             uData.off32 = (KU32)(uValue - (PageAddress + off + 4));
     2614            uData.off32 = (uint32_t)(uValue - (PageAddress + off + 4));
    26412615            cb = 4;
    26422616            break;
    26432617        default:
    2644             return KLDR_ERR_LX_BAD_FIXUP_SECTION; /** @todo fix error, add more checks! */
     2618            return VERR_LDRLX_BAD_FIXUP_SECTION; /** @todo fix error, add more checks! */
    26452619    }
    26462620
     
    26652639
    26662640/**
    2667  * The LX module interpreter method table.
    2668  */
    2669 KLDRMODOPS g_kLdrModLXOps =
     2641 * @interface_method_impl{RTLDROPS,pfnEnumSegments}
     2642 */
     2643static DECLCALLBACK(int) rtldrLX_EnumSegments(PRTLDRMODINTERNAL pMod, PFNRTLDRENUMSEGS pfnCallback, void *pvUser)
     2644{
     2645    PKLDRMODLX      pThis     = RT_FROM_MEMBER(pMod, KLDRMODLX, Core);
     2646    uint32_t const  cSegments = pThis->cSegments;
     2647    for (uint32_t iSeg = 0; iSeg < cSegments; iSeg++)
     2648    {
     2649        RTLDRSEG Seg = pThis->aSegments[iSeg];
     2650        int rc = pfnCallback(pMod, &Seg, pvUser);
     2651        if (rc != VINF_SUCCESS)
     2652            return rc;
     2653    }
     2654
     2655    return VINF_SUCCESS;
     2656}
     2657
     2658
     2659/**
     2660 * @interface_method_impl{RTLDROPS,pfnLinkAddressToSegOffset}
     2661 */
     2662static DECLCALLBACK(int) rtldrLX_LinkAddressToSegOffset(PRTLDRMODINTERNAL pMod, RTLDRADDR LinkAddress,
     2663                                                           uint32_t *piSeg, PRTLDRADDR poffSeg)
     2664{
     2665    PKLDRMODLX     pThis     = RT_FROM_MEMBER(pMod, KLDRMODLX, Core);
     2666    uint32_t const cSegments = pThis->cSegments;
     2667    for (uint32_t iSeg = 0; iSeg < cSegments; iSeg++)
     2668    {
     2669        RTLDRADDR offSeg = LinkAddress - pThis->aSegments[iSeg].LinkAddress;
     2670        if (   offSeg < pThis->aSegments[iSeg].cbMapped
     2671            || offSeg < pThis->aSegments[iSeg].cb)
     2672        {
     2673            *piSeg = iSeg;
     2674            *poffSeg = offSeg;
     2675            return VINF_SUCCESS;
     2676        }
     2677    }
     2678
     2679    return VERR_LDR_INVALID_LINK_ADDRESS;
     2680}
     2681
     2682
     2683/**
     2684 * @interface_method_impl{RTLDROPS,pfnLinkAddressToRva}.
     2685 */
     2686static DECLCALLBACK(int) rtldrLX_LinkAddressToRva(PRTLDRMODINTERNAL pMod, RTLDRADDR LinkAddress, PRTLDRADDR pRva)
     2687{
     2688    PKLDRMODLX     pThis     = RT_FROM_MEMBER(pMod, KLDRMODLX, Core);
     2689    uint32_t const cSegments = pThis->cSegments;
     2690    for (uint32_t iSeg = 0; iSeg < cSegments; iSeg++)
     2691    {
     2692        RTLDRADDR offSeg = LinkAddress - pThis->aSegments[iSeg].LinkAddress;
     2693        if (   offSeg < pThis->aSegments[iSeg].cbMapped
     2694            || offSeg < pThis->aSegments[iSeg].cb)
     2695        {
     2696            *pRva = pThis->aSegments[iSeg].RVA + offSeg;
     2697            return VINF_SUCCESS;
     2698        }
     2699    }
     2700
     2701    return VERR_LDR_INVALID_RVA;
     2702}
     2703
     2704
     2705/**
     2706 * @interface_method_impl{RTLDROPS,pfnSegOffsetToRva}
     2707 */
     2708static DECLCALLBACK(int) rtldrLX_SegOffsetToRva(PRTLDRMODINTERNAL pMod, uint32_t iSeg, RTLDRADDR offSeg, PRTLDRADDR pRva)
     2709{
     2710    PKLDRMODLX  pThis = RT_FROM_MEMBER(pMod, KLDRMODLX, Core);
     2711
     2712    if (iSeg >= pThis->cSegments)
     2713        return VERR_LDR_INVALID_SEG_OFFSET;
     2714    PCRTLDRSEG pSegment = &pThis->aSegments[iSeg];
     2715
     2716    if (   offSeg > pSegment->cbMapped
     2717        && offSeg > pSegment->cb
     2718        && (    pSegment->cbFile < 0
     2719            ||  offSeg > (uint64_t)pSegment->cbFile))
     2720        return VERR_LDR_INVALID_SEG_OFFSET;
     2721
     2722    *pRva = pSegment->RVA + offSeg;
     2723    return VINF_SUCCESS;
     2724}
     2725
     2726
     2727/**
     2728 * @interface_method_impl{RTLDROPS,pfnRvaToSegOffset}
     2729 */
     2730static DECLCALLBACK(int) rtldrLX_RvaToSegOffset(PRTLDRMODINTERNAL pMod, RTLDRADDR Rva, uint32_t *piSeg, PRTLDRADDR poffSeg)
     2731{
     2732    PKLDRMODLX     pThis     = RT_FROM_MEMBER(pMod, KLDRMODLX, Core);
     2733    uint32_t const cSegments = pThis->cSegments;
     2734    for (uint32_t iSeg = 0; iSeg < cSegments; iSeg++)
     2735    {
     2736        RTLDRADDR offSeg = Rva - pThis->aSegments[iSeg].RVA;
     2737        if (   offSeg < pThis->aSegments[iSeg].cbMapped
     2738            || offSeg < pThis->aSegments[iSeg].cb)
     2739        {
     2740            *piSeg = iSeg;
     2741            *poffSeg = offSeg;
     2742            return VINF_SUCCESS;
     2743        }
     2744    }
     2745
     2746    return VERR_LDR_INVALID_RVA;
     2747}
     2748
     2749
     2750/**
     2751 * @interface_method_impl{RTLDROPS,pfnReadDbgInfo}
     2752 */
     2753static DECLCALLBACK(int) rtldrLX_ReadDbgInfo(PRTLDRMODINTERNAL pMod, uint32_t iDbgInfo, RTFOFF off, size_t cb, void *pvBuf)
     2754{
     2755    //PKLDRMODLX pThis = RT_FROM_MEMBER(pMod, KLDRMODLX, Core);
     2756    RT_NOREF(pMod, iDbgInfo, off, cb, pvBuf);
     2757    return VERR_OUT_OF_RANGE;
     2758}
     2759
     2760
     2761/** @interface_method_impl{RTLDROPS,pfnQueryProp} */
     2762static DECLCALLBACK(int) rtldrLX_QueryProp(PRTLDRMODINTERNAL pMod, RTLDRPROP enmProp, void const *pvBits,
     2763                                          void *pvBuf, size_t cbBuf, size_t *pcbRet)
     2764{
     2765    PKLDRMODLX pThis = RT_FROM_MEMBER(pMod, KLDRMODLX, Core);
     2766    int           rc;
     2767    switch (enmProp)
     2768    {
     2769        case RTLDRPROP_IMPORT_COUNT:
     2770            Assert(cbBuf == sizeof(uint32_t));
     2771            Assert(*pcbRet == cbBuf);
     2772            *(uint32_t *)pvBuf = pThis->Hdr.e32_impmodcnt;
     2773            rc = VINF_SUCCESS;
     2774            break;
     2775
     2776        case RTLDRPROP_IMPORT_MODULE:
     2777            rc = kldrModLXGetImport(pThis, pvBits, *(uint32_t const *)pvBuf, (char *)pvBuf, cbBuf, pcbRet);
     2778            break;
     2779
     2780        case RTLDRPROP_INTERNAL_NAME:
     2781            *pcbRet = pThis->cchName + 1;
     2782            if (cbBuf >= pThis->cchName + 1)
     2783            {
     2784                memcpy(pvBuf, pThis->pszName, pThis->cchName + 1);
     2785                rc = VINF_SUCCESS;
     2786            }
     2787            else
     2788                rc = VERR_BUFFER_OVERFLOW;
     2789            break;
     2790
     2791
     2792        default:
     2793            rc = VERR_NOT_FOUND;
     2794            break;
     2795    }
     2796    RT_NOREF_PV(pvBits);
     2797    return rc;
     2798}
     2799
     2800
     2801/**
     2802 * Operations for a Mach-O module interpreter.
     2803 */
     2804static const RTLDROPS s_rtldrLXOps=
    26702805{
    26712806    "LX",
     2807    rtldrLX_Close,
    26722808    NULL,
    2673     kldrModLXCreate,
    2674     kldrModLXDestroy,
    2675     kldrModLXQuerySymbol,
    2676     kldrModLXEnumSymbols,
    2677     kldrModLXGetImport,
    2678     kldrModLXNumberOfImports,
    2679     NULL /* can execute one is optional */,
    2680     kldrModLXGetStackInfo,
    2681     kldrModLXQueryMainEntrypoint,
    2682     NULL /* pfnQueryImageUuid */,
    2683     NULL /* fixme */,
    2684     NULL /* fixme */,
    2685     kldrModLXEnumDbgInfo,
    2686     kldrModLXHasDbgInfo,
    2687     kldrModLXMap,
    2688     kldrModLXUnmap,
    2689     kldrModLXAllocTLS,
    2690     kldrModLXFreeTLS,
    2691     kldrModLXReload,
    2692     kldrModLXFixupMapping,
    2693     kldrModLXCallInit,
    2694     kldrModLXCallTerm,
    2695     kldrModLXCallThread,
    2696     kldrModLXSize,
    2697     kldrModLXGetBits,
    2698     kldrModLXRelocateBits,
    2699     NULL /* fixme: pfnMostlyDone */,
    2700     42 /* the end */
     2809    NULL /*pfnDone*/,
     2810    rtldrLX_EnumSymbols,
     2811    /* ext */
     2812    rtldrLX_GetImageSize,
     2813    rtldrLX_GetBits,
     2814    rtldrLX_RelocateBits,
     2815    rtldrLX_GetSymbolEx,
     2816    NULL /*pfnQueryForwarderInfo*/,
     2817    rtldrLX_EnumDbgInfo,
     2818    rtldrLX_EnumSegments,
     2819    rtldrLX_LinkAddressToSegOffset,
     2820    rtldrLX_LinkAddressToRva,
     2821    rtldrLX_SegOffsetToRva,
     2822    rtldrLX_RvaToSegOffset,
     2823    NULL,
     2824    rtldrLX_QueryProp,
     2825    NULL /*pfnVerifySignature*/,
     2826    NULL /*pfnHashImage*/,
     2827    NULL /*pfnUnwindFrame*/,
     2828    42
    27012829};
    27022830
     2831
     2832/**
     2833 * Handles opening LX images.
     2834 */
     2835DECLHIDDEN(int) rtldrLXOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, RTFOFF offLxHdr,
     2836                            PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo)
     2837{
     2838
     2839    /*
     2840     * Create the instance data and do a minimal header validation.
     2841     */
     2842    PKLDRMODLX pThis = NULL;
     2843    int rc = kldrModLXDoCreate(pReader, offLxHdr, fFlags, &pThis, pErrInfo);
     2844    if (RT_SUCCESS(rc))
     2845    {
     2846        /*
     2847         * Match up against the requested CPU architecture.
     2848         */
     2849        if (   enmArch == RTLDRARCH_WHATEVER
     2850            || pThis->Core.enmArch == enmArch)
     2851        {
     2852            pThis->Core.pOps     = &s_rtldrLXOps;
     2853            pThis->Core.u32Magic = RTLDRMOD_MAGIC;
     2854            *phLdrMod = &pThis->Core;
     2855            return 0;
     2856        }
     2857        rc = VERR_LDR_ARCH_MISMATCH;
     2858    }
     2859    if (pThis)
     2860        RTMemFree(pThis);
     2861    return rc;
     2862
     2863}
     2864
  • trunk/src/VBox/Runtime/common/ldr/ldrMachO.cpp

    r74636 r74638  
    2929 */
    3030
    31 /*******************************************************************************
    32 *   Header Files                                                               *
    33 *******************************************************************************/
    34 #include <k/kLdr.h>
    35 #include "kLdrInternal.h"
    36 #include <k/kLdrFmts/mach-o.h>
    37 
    38 
    39 /*******************************************************************************
    40 *   Defined Constants And Macros                                               *
    41 *******************************************************************************/
     31
     32/*********************************************************************************************************************************
     33*   Header Files                                                                                                                 *
     34*********************************************************************************************************************************/
     35#define LOG_GROUP RTLOGGROUP_LDR
     36#include <iprt/ldr.h>
     37#include "internal/iprt.h"
     38
     39#include <iprt/asm.h>
     40#include <iprt/assert.h>
     41#include <iprt/err.h>
     42#include <iprt/log.h>
     43#include <iprt/mem.h>
     44#include <iprt/string.h>
     45
     46#include <iprt/formats/mach-o.h>
     47#include "internal/ldr.h"
     48
     49
     50/*********************************************************************************************************************************
     51*   Defined Constants And Macros                                                                                                 *
     52*********************************************************************************************************************************/
    4253/** @def KLDRMODMACHO_STRICT
    4354 * Define KLDRMODMACHO_STRICT to enabled strict checks in KLDRMODMACHO. */
     
    4859 */
    4960#ifdef KLDRMODMACHO_STRICT
    50 # define KLDRMODMACHO_ASSERT(expr)  kHlpAssert(expr)
     61# define KLDRMODMACHO_ASSERT(expr)  Assert(expr)
    5162#else
    5263# define KLDRMODMACHO_ASSERT(expr)  do {} while (0)
     
    5869 */
    5970#ifdef KLDRMODMACHO_STRICT2
    60 # define KLDRMODMACHO_CHECK_RETURN(expr, rc)  kHlpAssertReturn(expr, rc)
     71# define KLDRMODMACHO_CHECK_RETURN(expr, rc)  AssertReturn(expr, rc)
    6172#else
    6273# define KLDRMODMACHO_CHECK_RETURN(expr, rc)  do { if (!(expr)) { return (rc); } } while (0)
     
    6879 */
    6980#ifdef KLDRMODMACHO_STRICT2
    70 # define KLDRMODMACHO_FAILED_RETURN(rc)  kHlpAssertFailedReturn(rc)
     81# define KLDRMODMACHO_FAILED_RETURN(rc)  AssertFailedReturn(rc)
    7182#else
    7283# define KLDRMODMACHO_FAILED_RETURN(rc)  return (rc)
     
    7485
    7586
    76 /*******************************************************************************
    77 *   Structures and Typedefs                                                    *
    78 *******************************************************************************/
     87/*********************************************************************************************************************************
     88*   Structures and Typedefs                                                                                                      *
     89*********************************************************************************************************************************/
    7990/**
    8091 * Mach-O section details.
     
    8394{
    8495    /** The size of the section (in bytes). */
    85     KLDRSIZE                cb;
     96    RTLDRADDR               cb;
    8697    /** The link address of this section. */
    87     KLDRADDR                LinkAddress;
     98    RTLDRADDR               LinkAddress;
    8899    /** The RVA of this section. */
    89     KLDRADDR                RVA;
     100    RTLDRADDR               RVA;
    90101    /** The file offset of this section.
    91102     * This is -1 if the section doesn't have a file backing. */
    92     KLDRFOFF                offFile;
     103    RTFOFF                  offFile;
    93104    /** The number of fixups. */
    94     KU32                    cFixups;
     105    uint32_t                cFixups;
    95106    /** The array of fixups. (lazy loaded) */
    96107    macho_relocation_info_t *paFixups;
    97108    /** The file offset of the fixups for this section.
    98109     * This is -1 if the section doesn't have any fixups. */
    99     KLDRFOFF                offFixups;
     110    RTFOFF                  offFixups;
    100111    /** Mach-O section flags. */
    101     KU32                    fFlags;
     112    uint32_t                fFlags;
    102113    /** kLdr segment index. */
    103     KU32                    iSegment;
     114    uint32_t                iSegment;
    104115    /** Pointer to the Mach-O section structure. */
    105116    void                   *pvMachoSection;
     
    113124typedef struct KLDRMODMACHOSEG
    114125{
     126    /** Common segment info. */
     127    RTLDRSEG                SegInfo;
     128
    115129    /** The orignal segment number (in case we had to resort it). */
    116     KU32                    iOrgSegNo;
     130    uint32_t                iOrgSegNo;
    117131    /** The number of sections in the segment. */
    118     KU32                    cSections;
     132    uint32_t                cSections;
    119133    /** Pointer to the sections belonging to this segment.
    120134     * The array resides in the big memory chunk allocated for
     
    130144typedef struct KLDRMODMACHO
    131145{
    132     /** Pointer to the module. (Follows the section table.) */
    133     PKLDRMOD                pMod;
     146    /** Core module structure. */
     147    RTLDRMODINTERNAL        Core;
     148
     149    /** The minium cpu this module was built for.
     150     * This might not be accurate, so use kLdrModCanExecuteOn() to check. */
     151    RTLDRCPU                enmCpu;
     152    /** The number of segments in the module. */
     153    uint32_t                cSegments;
     154
    134155    /** Pointer to the RDR file mapping of the raw file bits. NULL if not mapped. */
    135156    const void             *pvBits;
     
    137158    void                   *pvMapping;
    138159    /** The module open flags. */
    139     KU32                    fOpenFlags;
     160    uint32_t                fOpenFlags;
    140161
    141162    /** The offset of the image. (FAT fun.) */
    142     KLDRFOFF                offImage;
     163    RTFOFF                  offImage;
    143164    /** The link address. */
    144     KLDRADDR                LinkAddress;
     165    RTLDRADDR               LinkAddress;
    145166    /** The size of the mapped image. */
    146     KLDRADDR                cbImage;
     167    RTLDRADDR               cbImage;
    147168    /** Whether we're capable of loading the image. */
    148     KBOOL                   fCanLoad;
     169    bool                    fCanLoad;
    149170    /** Whether we're creating a global offset table segment.
    150171     * This dependes on the cputype and image type. */
    151     KBOOL                   fMakeGot;
     172    bool                    fMakeGot;
    152173    /** The size of a indirect GOT jump stub entry.
    153174     * This is 0 if not needed. */
    154     KU8                     cbJmpStub;
     175    uint32_t                cbJmpStub;
    155176    /** Effective file type.  If the original was a MH_OBJECT file, the
    156177     * corresponding MH_DSYM needs the segment translation of a MH_OBJECT too.
    157178     * The MH_DSYM normally has a separate __DWARF segment, but this is
    158179     * automatically skipped during the transation. */
    159     KU8                     uEffFileType;
     180    uint32_t                uEffFileType;
    160181    /** Pointer to the load commands. (endian converted) */
    161     KU8                    *pbLoadCommands;
     182    uint8_t                *pbLoadCommands;
    162183    /** The Mach-O header. (endian converted)
    163184     * @remark The reserved field is only valid for real 64-bit headers. */
     
    165186
    166187    /** The offset of the symbol table. */
    167     KLDRFOFF                offSymbols;
     188    RTFOFF                  offSymbols;
    168189    /** The number of symbols. */
    169     KU32                    cSymbols;
     190    uint32_t                cSymbols;
    170191    /** The pointer to the loaded symbol table. */
    171192    void                   *pvaSymbols;
    172193    /** The offset of the string table. */
    173     KLDRFOFF                offStrings;
     194    RTFOFF                  offStrings;
    174195    /** The size of the of the string table. */
    175     KU32                    cchStrings;
     196    uint32_t                cchStrings;
    176197    /** Pointer to the loaded string table. */
    177198    char                   *pchStrings;
    178199
    179200    /** The image UUID, all zeros if not found. */
    180     KU8                     abImageUuid[16];
     201    uint32_t                abImageUuid[16];
    181202
    182203    /** The RVA of the Global Offset Table. */
    183     KLDRADDR                GotRVA;
     204    RTLDRADDR               GotRVA;
    184205    /** The RVA of the indirect GOT jump stubs.  */
    185     KLDRADDR                JmpStubsRVA;
     206    RTLDRADDR               JmpStubsRVA;
    186207
    187208    /** The number of sections. */
    188     KU32                    cSections;
     209    uint32_t                cSections;
    189210    /** Pointer to the section array running in parallel to the Mach-O one. */
    190211    PKLDRMODMACHOSECT       paSections;
     
    196217
    197218
    198 /*******************************************************************************
    199 *   Internal Functions                                                         *
    200 *******************************************************************************/
     219
     220/*********************************************************************************************************************************
     221*   Internal Functions                                                                                                           *
     222*********************************************************************************************************************************/
    201223#if 0
    202 static KI32 kldrModMachONumberOfImports(PKLDRMOD pMod, const void *pvBits);
     224static int32_t kldrModMachONumberOfImports(PRTLDRMODINTERNAL pMod, const void *pvBits);
    203225#endif
    204 static int kldrModMachORelocateBits(PKLDRMOD pMod, void *pvBits, KLDRADDR NewBaseAddress, KLDRADDR OldBaseAddress,
    205                                     PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser);
    206 
    207 static int  kldrModMachODoCreate(PKRDR pRdr, KLDRFOFF offImage, KU32 fOpenFlags, PKLDRMODMACHO *ppMod);
    208 static int  kldrModMachOPreParseLoadCommands(KU8 *pbLoadCommands, const mach_header_32_t *pHdr, PKRDR pRdr, KLDRFOFF offImage,
    209                                              KU32 fOpenFlags, KU32 *pcSegments, KU32 *pcSections, KU32 *pcbStringPool,
    210                                              PKBOOL pfCanLoad, PKLDRADDR pLinkAddress, KU8 *puEffFileType);
    211 static int  kldrModMachOParseLoadCommands(PKLDRMODMACHO pModMachO, char *pbStringPool, KU32 cbStringPool);
    212 static int  kldrModMachOAdjustBaseAddress(PKLDRMODMACHO pModMachO, PKLDRADDR pBaseAddress);
    213 
    214 /*static int  kldrModMachOLoadLoadCommands(PKLDRMODMACHO pModMachO);*/
    215 static int  kldrModMachOLoadObjSymTab(PKLDRMODMACHO pModMachO);
    216 static int  kldrModMachOLoadFixups(PKLDRMODMACHO pModMachO, KLDRFOFF offFixups, KU32 cFixups, macho_relocation_info_t **ppaFixups);
    217 static int  kldrModMachOMapVirginBits(PKLDRMODMACHO pModMachO);
    218 
    219 static int  kldrModMachODoQuerySymbol32Bit(PKLDRMODMACHO pModMachO, const macho_nlist_32_t *paSyms, KU32 cSyms, const char *pchStrings,
    220                                            KU32 cchStrings, KLDRADDR BaseAddress, KU32 iSymbol, const char *pchSymbol,
    221                                            KU32 cchSymbol, PKLDRADDR puValue, KU32 *pfKind);
    222 static int  kldrModMachODoQuerySymbol64Bit(PKLDRMODMACHO pModMachO, const macho_nlist_64_t *paSyms, KU32 cSyms, const char *pchStrings,
    223                                            KU32 cchStrings, KLDRADDR BaseAddress, KU32 iSymbol, const char *pchSymbol,
    224                                            KU32 cchSymbol, PKLDRADDR puValue, KU32 *pfKind);
    225 static int  kldrModMachODoEnumSymbols32Bit(PKLDRMODMACHO pModMachO, const macho_nlist_32_t *paSyms, KU32 cSyms,
    226                                            const char *pchStrings, KU32 cchStrings, KLDRADDR BaseAddress,
    227                                            KU32 fFlags, PFNKLDRMODENUMSYMS pfnCallback, void *pvUser);
    228 static int  kldrModMachODoEnumSymbols64Bit(PKLDRMODMACHO pModMachO, const macho_nlist_64_t *paSyms, KU32 cSyms,
    229                                            const char *pchStrings, KU32 cchStrings, KLDRADDR BaseAddress,
    230                                            KU32 fFlags, PFNKLDRMODENUMSYMS pfnCallback, void *pvUser);
    231 static int  kldrModMachOObjDoImports(PKLDRMODMACHO pModMachO, KLDRADDR BaseAddress, PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser);
    232 static int  kldrModMachOObjDoFixups(PKLDRMODMACHO pModMachO, void *pvMapping, KLDRADDR NewBaseAddress);
    233 static int  kldrModMachOFixupSectionGeneric32Bit(PKLDRMODMACHO pModMachO, KU8 *pbSectBits, PKLDRMODMACHOSECT pFixupSect,
    234                                                  macho_nlist_32_t *paSyms, KU32 cSyms, KLDRADDR NewBaseAddress);
    235 static int  kldrModMachOFixupSectionAMD64(PKLDRMODMACHO pModMachO, KU8 *pbSectBits, PKLDRMODMACHOSECT pFixupSect,
    236                                           macho_nlist_64_t *paSyms, KU32 cSyms, KLDRADDR NewBaseAddress);
    237 
    238 static int  kldrModMachOMakeGOT(PKLDRMODMACHO pModMachO, void *pvBits, KLDRADDR NewBaseAddress);
    239 
    240 /*static int  kldrModMachODoFixups(PKLDRMODMACHO pModMachO, void *pvMapping, KLDRADDR NewBaseAddress, KLDRADDR OldBaseAddress);
    241 static int  kldrModMachODoImports(PKLDRMODMACHO pModMachO, void *pvMapping, PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser);*/
    242 
    243 
    244 /**
    245  * Create a loader module instance interpreting the executable image found
    246  * in the specified file provider instance.
    247  *
    248  * @returns 0 on success and *ppMod pointing to a module instance.
    249  *          On failure, a non-zero OS specific error code is returned.
    250  * @param   pOps            Pointer to the registered method table.
    251  * @param   pRdr            The file provider instance to use.
    252  * @param   fFlags          Flags, MBZ.
    253  * @param   enmCpuArch      The desired CPU architecture. KCPUARCH_UNKNOWN means
    254  *                          anything goes, but with a preference for the current
    255  *                          host architecture.
    256  * @param   offNewHdr       The offset of the new header in MZ files. -1 if not found.
    257  * @param   ppMod           Where to store the module instance pointer.
    258  */
    259 static int kldrModMachOCreate(PCKLDRMODOPS pOps, PKRDR pRdr, KU32 fFlags, KCPUARCH enmCpuArch, KLDRFOFF offNewHdr, PPKLDRMOD ppMod)
    260 {
    261     PKLDRMODMACHO pModMachO;
    262     int rc;
    263 
    264     /*
    265      * Create the instance data and do a minimal header validation.
    266      */
    267     rc = kldrModMachODoCreate(pRdr, offNewHdr == -1 ? 0 : offNewHdr, fFlags, &pModMachO);
    268     if (!rc)
    269     {
    270 
    271         /*
    272          * Match up against the requested CPU architecture.
    273          */
    274         if (    enmCpuArch == KCPUARCH_UNKNOWN
    275             ||  pModMachO->pMod->enmArch == enmCpuArch)
    276         {
    277             pModMachO->pMod->pOps = pOps;
    278             pModMachO->pMod->u32Magic = KLDRMOD_MAGIC;
    279             *ppMod = pModMachO->pMod;
    280             return 0;
    281         }
    282         rc = KLDR_ERR_CPU_ARCH_MISMATCH;
    283     }
    284     if (pModMachO)
    285     {
    286         kHlpFree(pModMachO->pbLoadCommands);
    287         kHlpFree(pModMachO);
    288     }
    289     return rc;
    290 }
     226static DECLCALLBACK(int) rtldrMachO_RelocateBits(PRTLDRMODINTERNAL pMod, void *pvBits, RTUINTPTR NewBaseAddress,
     227                                                 RTUINTPTR OldBaseAddress, PFNRTLDRIMPORT pfnGetImport, void *pvUser);
     228
     229
     230static int  kldrModMachOPreParseLoadCommands(uint8_t *pbLoadCommands, const mach_header_32_t *pHdr, PRTLDRREADER pRdr, RTFOFF   offImage,
     231                                             uint32_t fOpenFlags, uint32_t *pcSegments, uint32_t *pcSections, uint32_t *pcbStringPool,
     232                                             bool *pfCanLoad, PRTLDRADDR pLinkAddress, uint8_t *puEffFileType);
     233static int  kldrModMachOParseLoadCommands(PKLDRMODMACHO pThis, char *pbStringPool, uint32_t cbStringPool);
     234
     235static int  kldrModMachOLoadObjSymTab(PKLDRMODMACHO pThis);
     236static int  kldrModMachOLoadFixups(PKLDRMODMACHO pThis, RTFOFF offFixups, uint32_t cFixups, macho_relocation_info_t **ppaFixups);
     237static int  kldrModMachOMapVirginBits(PKLDRMODMACHO pThis);
     238
     239static int  kldrModMachODoQuerySymbol32Bit(PKLDRMODMACHO pThis, const macho_nlist_32_t *paSyms, uint32_t cSyms, const char *pchStrings,
     240                                           uint32_t cchStrings, RTLDRADDR BaseAddress, uint32_t iSymbol, const char *pchSymbol,
     241                                           uint32_t cchSymbol, PRTLDRADDR puValue, uint32_t *pfKind);
     242static int  kldrModMachODoQuerySymbol64Bit(PKLDRMODMACHO pThis, const macho_nlist_64_t *paSyms, uint32_t cSyms, const char *pchStrings,
     243                                           uint32_t cchStrings, RTLDRADDR BaseAddress, uint32_t iSymbol, const char *pchSymbol,
     244                                           uint32_t cchSymbol, PRTLDRADDR puValue, uint32_t *pfKind);
     245static int  kldrModMachODoEnumSymbols32Bit(PKLDRMODMACHO pThis, const macho_nlist_32_t *paSyms, uint32_t cSyms,
     246                                           const char *pchStrings, uint32_t cchStrings, RTLDRADDR BaseAddress,
     247                                           uint32_t fFlags, PFNRTLDRENUMSYMS pfnCallback, void *pvUser);
     248static int  kldrModMachODoEnumSymbols64Bit(PKLDRMODMACHO pThis, const macho_nlist_64_t *paSyms, uint32_t cSyms,
     249                                           const char *pchStrings, uint32_t cchStrings, RTLDRADDR BaseAddress,
     250                                           uint32_t fFlags, PFNRTLDRENUMSYMS pfnCallback, void *pvUser);
     251static int  kldrModMachOObjDoImports(PKLDRMODMACHO pThis, RTLDRADDR BaseAddress, PFNRTLDRIMPORT pfnGetImport, void *pvUser);
     252static int  kldrModMachOObjDoFixups(PKLDRMODMACHO pThis, void *pvMapping, RTLDRADDR NewBaseAddress);
     253static int  kldrModMachOFixupSectionGeneric32Bit(PKLDRMODMACHO pThis, uint8_t *pbSectBits, PKLDRMODMACHOSECT pFixupSect,
     254                                                 macho_nlist_32_t *paSyms, uint32_t cSyms, RTLDRADDR NewBaseAddress);
     255static int  kldrModMachOFixupSectionAMD64(PKLDRMODMACHO pThis, uint8_t *pbSectBits, PKLDRMODMACHOSECT pFixupSect,
     256                                          macho_nlist_64_t *paSyms, uint32_t cSyms, RTLDRADDR NewBaseAddress);
     257
     258static int  kldrModMachOMakeGOT(PKLDRMODMACHO pThis, void *pvBits, RTLDRADDR NewBaseAddress);
     259
     260/*static int  kldrModMachODoFixups(PKLDRMODMACHO pThis, void *pvMapping, RTLDRADDR NewBaseAddress, RTLDRADDR OldBaseAddress);
     261static int  kldrModMachODoImports(PKLDRMODMACHO pThis, void *pvMapping, PFNRTLDRIMPORT pfnGetImport, void *pvUser);*/
     262
    291263
    292264
     
    295267 * simplify cleanup on failure.
    296268 */
    297 static int kldrModMachODoCreate(PKRDR pRdr, KLDRFOFF offImage, KU32 fOpenFlags, PKLDRMODMACHO *ppModMachO)
    298 {
     269static int kldrModMachODoCreate(PRTLDRREADER pRdr, RTFOFF offImage, uint32_t fOpenFlags,
     270                                PKLDRMODMACHO *ppModMachO, PRTERRINFO pErrInfo)
     271{
     272    *ppModMachO = NULL;
     273
     274    /*
     275     * Read the Mach-O header.
     276     */
    299277    union
    300278    {
     
    302280        mach_header_64_t    Hdr64;
    303281    } s;
    304     PKLDRMODMACHO pModMachO;
    305     PKLDRMOD pMod;
    306     KU8 *pbLoadCommands;
    307     KU32 cSegments = 0; /* (MSC maybe used uninitialized) */
    308     KU32 cSections = 0; /* (MSC maybe used uninitialized) */
    309     KU32 cbStringPool = 0; /* (MSC maybe used uninitialized) */
    310     KSIZE cchFilename;
    311     KSIZE cb;
    312     KBOOL fMakeGot;
    313     KBOOL fCanLoad = K_TRUE;
    314     KLDRADDR LinkAddress = NIL_KLDRADDR; /* (MSC maybe used uninitialized) */
    315     KU8 cbJmpStub;
    316     KU8 uEffFileType = 0; /* (MSC maybe used uninitialized) */
    317     int rc;
    318     *ppModMachO = NULL;
    319 
    320     kHlpAssert(&s.Hdr32.magic == &s.Hdr64.magic);
    321     kHlpAssert(&s.Hdr32.flags == &s.Hdr64.flags);
    322 
    323     /*
    324      * Read the Mach-O header.
    325      */
    326     rc = kRdrRead(pRdr, &s, sizeof(s), offImage);
     282    Assert(&s.Hdr32.magic == &s.Hdr64.magic);
     283    Assert(&s.Hdr32.flags == &s.Hdr64.flags);
     284    int rc = pRdr->pfnRead(pRdr, &s, sizeof(s), offImage);
    327285    if (rc)
    328         return rc;
     286        return RTErrInfoSetF(pErrInfo, rc, "Error reading Mach-O header at %RTfoff: %Rrc", offImage, rc);
    329287    if (    s.Hdr32.magic != IMAGE_MACHO32_SIGNATURE
    330         &&  s.Hdr32.magic != IMAGE_MACHO64_SIGNATURE
    331         )
     288        &&  s.Hdr32.magic != IMAGE_MACHO64_SIGNATURE)
    332289    {
    333290        if (    s.Hdr32.magic == IMAGE_MACHO32_SIGNATURE_OE
    334291            ||  s.Hdr32.magic == IMAGE_MACHO64_SIGNATURE_OE)
    335             return KLDR_ERR_MACHO_OTHER_ENDIAN_NOT_SUPPORTED;
    336         return KLDR_ERR_UNKNOWN_FORMAT;
     292            return VERR_LDRMACHO_OTHER_ENDIAN_NOT_SUPPORTED;
     293        return VERR_INVALID_EXE_SIGNATURE;
    337294    }
    338295
    339296    /* sanity checks. */
    340     if (    s.Hdr32.sizeofcmds > kRdrSize(pRdr) - sizeof(mach_header_32_t)
     297    if (    s.Hdr32.sizeofcmds > pRdr->pfnSize(pRdr) - sizeof(mach_header_32_t)
    341298        ||  s.Hdr32.sizeofcmds < sizeof(load_command_t) * s.Hdr32.ncmds
    342299        ||  (s.Hdr32.flags & ~MH_VALID_FLAGS))
    343         return KLDR_ERR_MACHO_BAD_HEADER;
     300        return VERR_LDRMACHO_BAD_HEADER;
     301
     302    bool fMakeGot;
     303    uint8_t cbJmpStub;
    344304    switch (s.Hdr32.cputype)
    345305    {
    346306        case CPU_TYPE_X86:
    347             fMakeGot = K_FALSE;
     307            fMakeGot = false;
    348308            cbJmpStub = 0;
    349309            break;
     
    353313            break;
    354314        default:
    355             return KLDR_ERR_MACHO_UNSUPPORTED_MACHINE;
    356     }
     315            return VERR_LDRMACHO_UNSUPPORTED_MACHINE;
     316    }
     317
    357318    if (   s.Hdr32.filetype != MH_OBJECT
    358319        && s.Hdr32.filetype != MH_EXECUTE
     
    361322        && s.Hdr32.filetype != MH_DSYM
    362323        && s.Hdr32.filetype != MH_KEXT_BUNDLE)
    363         return KLDR_ERR_MACHO_UNSUPPORTED_FILE_TYPE;
     324        return VERR_LDRMACHO_UNSUPPORTED_FILE_TYPE;
    364325
    365326    /*
    366327     * Read and pre-parse the load commands to figure out how many segments we'll be needing.
    367328     */
    368     pbLoadCommands = kHlpAlloc(s.Hdr32.sizeofcmds);
     329    uint8_t *pbLoadCommands = (uint8_t *)RTMemAlloc(s.Hdr32.sizeofcmds);
    369330    if (!pbLoadCommands)
    370         return KERR_NO_MEMORY;
    371     rc = kRdrRead(pRdr, pbLoadCommands, s.Hdr32.sizeofcmds,
    372                      s.Hdr32.magic == IMAGE_MACHO32_SIGNATURE
    373                   || s.Hdr32.magic == IMAGE_MACHO32_SIGNATURE_OE
    374                   ? sizeof(mach_header_32_t) + offImage
    375                   : sizeof(mach_header_64_t) + offImage);
     331        return VERR_NO_MEMORY;
     332    rc = pRdr->pfnRead(pRdr, pbLoadCommands, s.Hdr32.sizeofcmds,
     333                          s.Hdr32.magic == IMAGE_MACHO32_SIGNATURE
     334                       || s.Hdr32.magic == IMAGE_MACHO32_SIGNATURE_OE
     335                       ? sizeof(mach_header_32_t) + offImage
     336                       : sizeof(mach_header_64_t) + offImage);
     337
     338    uint32_t    cSegments    = 0;
     339    uint32_t    cSections    = 0;
     340    uint32_t    cbStringPool = 0;
     341    bool        fCanLoad     = true;
     342    RTLDRADDR   LinkAddress  = NIL_RTLDRADDR;
     343    uint8_t     uEffFileType = 0;
    376344    if (!rc)
    377345        rc = kldrModMachOPreParseLoadCommands(pbLoadCommands, &s.Hdr32, pRdr, offImage, fOpenFlags,
     
    379347    if (rc)
    380348    {
    381         kHlpFree(pbLoadCommands);
     349        RTMemFree(pbLoadCommands);
    382350        return rc;
    383351    }
     
    388356     * Calc the instance size, allocate and initialize it.
    389357     */
    390     cchFilename = kHlpStrLen(kRdrName(pRdr));
    391     cb = K_ALIGN_Z(  K_OFFSETOF(KLDRMODMACHO, aSegments[cSegments])
    392                       + sizeof(KLDRMODMACHOSECT) * cSections, 16)
    393        + K_OFFSETOF(KLDRMOD, aSegments[cSegments])
    394        + cchFilename + 1
    395        + cbStringPool;
    396     pModMachO = (PKLDRMODMACHO)kHlpAlloc(cb);
    397     if (!pModMachO)
    398         return KERR_NO_MEMORY;
    399     *ppModMachO = pModMachO;
    400     pModMachO->pbLoadCommands = pbLoadCommands;
    401     pModMachO->offImage = offImage;
    402 
    403     /* KLDRMOD */
    404     pMod = (PKLDRMOD)((KU8 *)pModMachO + K_ALIGN_Z(  K_OFFSETOF(KLDRMODMACHO, aSegments[cSegments])
    405                                                       + sizeof(KLDRMODMACHOSECT) * cSections, 16));
    406     pMod->pvData = pModMachO;
    407     pMod->pRdr = pRdr;
    408     pMod->pOps = NULL;      /* set upon success. */
    409     pMod->cSegments = cSegments;
    410     pMod->cchFilename = (KU32)cchFilename;
    411     pMod->pszFilename = (char *)&pMod->aSegments[pMod->cSegments];
    412     kHlpMemCopy((char *)pMod->pszFilename, kRdrName(pRdr), cchFilename + 1);
    413     pMod->pszName = kHlpGetFilename(pMod->pszFilename);
    414     pMod->cchName = (KU32)(cchFilename - (pMod->pszName - pMod->pszFilename));
    415     pMod->fFlags = 0;
     358    size_t const cbModAndSegs = RT_ALIGN_Z(RT_UOFFSETOF_DYN(KLDRMODMACHO, aSegments[cSegments])
     359                                           + sizeof(KLDRMODMACHOSECT) * cSections, 16);
     360    PKLDRMODMACHO pThis = (PKLDRMODMACHO)RTMemAlloc(cbModAndSegs + cbStringPool);
     361    if (!pThis)
     362        return VERR_NO_MEMORY;
     363    *ppModMachO = pThis;
     364    pThis->pbLoadCommands = pbLoadCommands;
     365    pThis->offImage = offImage;
     366
     367    /* Core & CPU.*/
     368    pThis->Core.u32Magic  = 0;          /* set by caller */
     369    pThis->Core.eState    = LDR_STATE_OPENED;
     370    pThis->Core.pOps      = NULL;       /* set by caller. */
     371    pThis->Core.pReader   = pRdr;
    416372    switch (s.Hdr32.cputype)
    417373    {
    418374        case CPU_TYPE_X86:
    419             pMod->enmArch = KCPUARCH_X86_32;
    420             pMod->enmEndian = KLDRENDIAN_LITTLE;
     375            pThis->Core.enmArch   = RTLDRARCH_X86_32;
     376            pThis->Core.enmEndian = RTLDRENDIAN_LITTLE;
    421377            switch (s.Hdr32.cpusubtype)
    422378            {
    423379                case CPU_SUBTYPE_I386_ALL: /* == CPU_SUBTYPE_386 */
    424                     pMod->enmCpu = KCPU_X86_32_BLEND;
     380                    pThis->enmCpu = RTLDRCPU_X86_32_BLEND;
    425381                    break;
    426382                case CPU_SUBTYPE_486:
    427                     pMod->enmCpu = KCPU_I486;
     383                    pThis->enmCpu = RTLDRCPU_I486;
    428384                    break;
    429385                case CPU_SUBTYPE_486SX:
    430                     pMod->enmCpu = KCPU_I486SX;
     386                    pThis->enmCpu = RTLDRCPU_I486SX;
    431387                    break;
    432388                case CPU_SUBTYPE_PENT: /* == CPU_SUBTYPE_586 */
    433                     pMod->enmCpu = KCPU_I586;
     389                    pThis->enmCpu = RTLDRCPU_I586;
    434390                    break;
    435391                case CPU_SUBTYPE_PENTPRO:
     
    441397                case CPU_SUBTYPE_PENTIUM_3_M:
    442398                case CPU_SUBTYPE_PENTIUM_3_XEON:
    443                     pMod->enmCpu = KCPU_I686;
     399                    pThis->enmCpu = RTLDRCPU_I686;
    444400                    break;
    445401                case CPU_SUBTYPE_PENTIUM_M:
     
    448404                case CPU_SUBTYPE_XEON:
    449405                case CPU_SUBTYPE_XEON_MP:
    450                     pMod->enmCpu = KCPU_P4;
     406                    pThis->enmCpu = RTLDRCPU_P4;
    451407                    break;
    452408
     
    456412                        && s.Hdr32.filetype   == MH_OBJECT)
    457413                        break;
    458                     return KLDR_ERR_MACHO_UNSUPPORTED_MACHINE;
     414                    return VERR_LDRMACHO_UNSUPPORTED_MACHINE;
    459415            }
    460416            break;
    461417
    462418        case CPU_TYPE_X86_64:
    463             pMod->enmArch = KCPUARCH_AMD64;
    464             pMod->enmEndian = KLDRENDIAN_LITTLE;
     419            pThis->Core.enmArch   = RTLDRARCH_AMD64;
     420            pThis->Core.enmEndian = RTLDRENDIAN_LITTLE;
    465421            switch (s.Hdr32.cpusubtype & ~CPU_SUBTYPE_MASK)
    466422            {
    467                 case CPU_SUBTYPE_X86_64_ALL:        pMod->enmCpu = KCPU_AMD64_BLEND; break;
     423                case CPU_SUBTYPE_X86_64_ALL: pThis->enmCpu = RTLDRCPU_AMD64_BLEND; break;
    468424                default:
    469                     return KLDR_ERR_MACHO_UNSUPPORTED_MACHINE;
     425                    return VERR_LDRMACHO_UNSUPPORTED_MACHINE;
    470426            }
    471427            break;
    472428
    473429        default:
    474             return KLDR_ERR_MACHO_UNSUPPORTED_MACHINE;
    475     }
    476 
    477     pMod->enmFmt = KLDRFMT_MACHO;
     430            return VERR_LDRMACHO_UNSUPPORTED_MACHINE;
     431    }
     432
     433    pThis->Core.enmFormat = RTLDRFMT_MACHO;
    478434    switch (s.Hdr32.filetype)
    479435    {
    480         case MH_OBJECT:     pMod->enmType = KLDRTYPE_OBJECT; break;
    481         case MH_EXECUTE:    pMod->enmType = KLDRTYPE_EXECUTABLE_FIXED; break;
    482         case MH_DYLIB:      pMod->enmType = KLDRTYPE_SHARED_LIBRARY_RELOCATABLE; break;
    483         case MH_BUNDLE:     pMod->enmType = KLDRTYPE_SHARED_LIBRARY_RELOCATABLE; break;
    484         case MH_KEXT_BUNDLE:pMod->enmType = KLDRTYPE_SHARED_LIBRARY_RELOCATABLE; break;
    485         case MH_DSYM:       pMod->enmType = KLDRTYPE_DEBUG_INFO; break;
     436        case MH_OBJECT:     pThis->Core.enmType = RTLDRTYPE_OBJECT; break;
     437        case MH_EXECUTE:    pThis->Core.enmType = RTLDRTYPE_EXECUTABLE_FIXED; break;
     438        case MH_DYLIB:      pThis->Core.enmType = RTLDRTYPE_SHARED_LIBRARY_RELOCATABLE; break;
     439        case MH_BUNDLE:     pThis->Core.enmType = RTLDRTYPE_SHARED_LIBRARY_RELOCATABLE; break;
     440        case MH_KEXT_BUNDLE:pThis->Core.enmType = RTLDRTYPE_SHARED_LIBRARY_RELOCATABLE; break;
     441        case MH_DSYM:       pThis->Core.enmType = RTLDRTYPE_DEBUG_INFO; break;
    486442        default:
    487             return KLDR_ERR_MACHO_UNSUPPORTED_FILE_TYPE;
    488     }
    489     pMod->u32Magic = 0;     /* set upon success. */
     443            return VERR_LDRMACHO_UNSUPPORTED_FILE_TYPE;
     444    }
    490445
    491446    /* KLDRMODMACHO */
    492     pModMachO->pMod = pMod;
    493     pModMachO->pvBits = NULL;
    494     pModMachO->pvMapping = NULL;
    495     pModMachO->fOpenFlags = fOpenFlags;
    496     pModMachO->Hdr = s.Hdr64;
     447    pThis->cSegments = cSegments;
     448    pThis->pvBits = NULL;
     449    pThis->pvMapping = NULL;
     450    pThis->fOpenFlags = fOpenFlags;
     451    pThis->Hdr = s.Hdr64;
    497452    if (    s.Hdr32.magic == IMAGE_MACHO32_SIGNATURE
    498453        ||  s.Hdr32.magic == IMAGE_MACHO32_SIGNATURE_OE)
    499         pModMachO->Hdr.reserved = 0;
    500     pModMachO->LinkAddress = LinkAddress;
    501     pModMachO->cbImage = 0;
    502     pModMachO->fCanLoad = fCanLoad;
    503     pModMachO->fMakeGot = fMakeGot;
    504     pModMachO->cbJmpStub = cbJmpStub;
    505     pModMachO->uEffFileType = uEffFileType;
    506     pModMachO->offSymbols = 0;
    507     pModMachO->cSymbols = 0;
    508     pModMachO->pvaSymbols = NULL;
    509     pModMachO->offStrings = 0;
    510     pModMachO->cchStrings = 0;
    511     pModMachO->pchStrings = NULL;
    512     kHlpMemSet(pModMachO->abImageUuid, 0, sizeof(pModMachO->abImageUuid));
    513     pModMachO->GotRVA = NIL_KLDRADDR;
    514     pModMachO->JmpStubsRVA = NIL_KLDRADDR;
    515     pModMachO->cSections = cSections;
    516     pModMachO->paSections = (PKLDRMODMACHOSECT)&pModMachO->aSegments[pModMachO->pMod->cSegments];
     454        pThis->Hdr.reserved = 0;
     455    pThis->LinkAddress = LinkAddress;
     456    pThis->cbImage = 0;
     457    pThis->fCanLoad = fCanLoad;
     458    pThis->fMakeGot = fMakeGot;
     459    pThis->cbJmpStub = cbJmpStub;
     460    pThis->uEffFileType = uEffFileType;
     461    pThis->offSymbols = 0;
     462    pThis->cSymbols = 0;
     463    pThis->pvaSymbols = NULL;
     464    pThis->offStrings = 0;
     465    pThis->cchStrings = 0;
     466    pThis->pchStrings = NULL;
     467    memset(pThis->abImageUuid, 0, sizeof(pThis->abImageUuid));
     468    pThis->GotRVA = NIL_RTLDRADDR;
     469    pThis->JmpStubsRVA = NIL_RTLDRADDR;
     470    pThis->cSections = cSections;
     471    pThis->paSections = (PKLDRMODMACHOSECT)&pThis->aSegments[pThis->cSegments];
    517472
    518473    /*
    519474     * Setup the KLDRMOD segment array.
    520475     */
    521     rc = kldrModMachOParseLoadCommands(pModMachO, (char *)pMod->pszFilename + pMod->cchFilename + 1, cbStringPool);
     476    rc = kldrModMachOParseLoadCommands(pThis, (char *)pThis + cbModAndSegs, cbStringPool);
    522477    if (rc)
    523478        return rc;
     
    551506 *
    552507 * @returns 0 on success.
    553  * @returns KLDR_ERR_MACHO_* on failure.
     508 * @returns VERR_LDRMACHO_* on failure.
    554509 * @param   pbLoadCommands  The load commands to parse.
    555510 * @param   pHdr            The header.
     
    563518 *                          lowest segment address).
    564519 */
    565 static int  kldrModMachOPreParseLoadCommands(KU8 *pbLoadCommands, const mach_header_32_t *pHdr, PKRDR pRdr, KLDRFOFF offImage,
    566                                              KU32 fOpenFlags, KU32 *pcSegments, KU32 *pcSections, KU32 *pcbStringPool,
    567                                              PKBOOL pfCanLoad, PKLDRADDR pLinkAddress, KU8 *puEffFileType)
     520static int  kldrModMachOPreParseLoadCommands(uint8_t *pbLoadCommands, const mach_header_32_t *pHdr, PRTLDRREADER pRdr, RTFOFF  offImage,
     521                                             uint32_t fOpenFlags, uint32_t *pcSegments, uint32_t *pcSections, uint32_t *pcbStringPool,
     522                                             bool *pfCanLoad, PRTLDRADDR pLinkAddress, uint8_t *puEffFileType)
    568523{
    569524    union
    570525    {
    571         KU8                  *pb;
     526        uint8_t              *pb;
    572527        load_command_t       *pLoadCmd;
    573528        segment_command_32_t *pSeg32;
     
    577532        uuid_command_t       *pUuid;
    578533    } u;
    579     const KU64 cbFile = kRdrSize(pRdr) - offImage;
    580     KU32 cSegments = 0;
    581     KU32 cSections = 0;
    582     KSIZE cbStringPool = 0;
    583     KU32 cLeft = pHdr->ncmds;
    584     KU32 cbLeft = pHdr->sizeofcmds;
    585     KU8 *pb = pbLoadCommands;
     534    const uint64_t cbFile = pRdr->pfnSize(pRdr) - offImage;
     535    uint32_t cSegments = 0;
     536    uint32_t cSections = 0;
     537    size_t cbStringPool = 0;
     538    uint32_t cLeft = pHdr->ncmds;
     539    uint32_t cbLeft = pHdr->sizeofcmds;
     540    uint8_t *pb = pbLoadCommands;
    586541    int cSegmentCommands = 0;
    587542    int cSymbolTabs = 0;
    588543    int fConvertEndian = pHdr->magic == IMAGE_MACHO32_SIGNATURE_OE
    589544                      || pHdr->magic == IMAGE_MACHO64_SIGNATURE_OE;
    590     KU8 uEffFileType = *puEffFileType = pHdr->filetype;
     545    uint8_t uEffFileType = *puEffFileType = pHdr->filetype;
    591546
    592547    *pcSegments = 0;
    593548    *pcSections = 0;
    594549    *pcbStringPool = 0;
    595     *pfCanLoad = K_TRUE;
    596     *pLinkAddress = ~(KLDRADDR)0;
     550    *pfCanLoad = true;
     551    *pLinkAddress = ~(RTLDRADDR)0;
    597552
    598553    while (cLeft-- > 0)
     
    603558         * Convert and validate command header.
    604559         */
    605         KLDRMODMACHO_CHECK_RETURN(cbLeft >= sizeof(load_command_t), KLDR_ERR_MACHO_BAD_LOAD_COMMAND);
     560        KLDRMODMACHO_CHECK_RETURN(cbLeft >= sizeof(load_command_t), VERR_LDRMACHO_BAD_LOAD_COMMAND);
    606561        if (fConvertEndian)
    607562        {
    608             u.pLoadCmd->cmd = K_E2E_U32(u.pLoadCmd->cmd);
    609             u.pLoadCmd->cmdsize = K_E2E_U32(u.pLoadCmd->cmdsize);
    610         }
    611         KLDRMODMACHO_CHECK_RETURN(u.pLoadCmd->cmdsize <= cbLeft, KLDR_ERR_MACHO_BAD_LOAD_COMMAND);
     563            u.pLoadCmd->cmd = RT_BSWAP_U32(u.pLoadCmd->cmd);
     564            u.pLoadCmd->cmdsize = RT_BSWAP_U32(u.pLoadCmd->cmdsize);
     565        }
     566        KLDRMODMACHO_CHECK_RETURN(u.pLoadCmd->cmdsize <= cbLeft, VERR_LDRMACHO_BAD_LOAD_COMMAND);
    612567        cbLeft -= u.pLoadCmd->cmdsize;
    613568        pb += u.pLoadCmd->cmdsize;
     
    623578                section_32_t   *pFirstSect    = (section_32_t *)(pSrcSeg + 1);
    624579                section_32_t   *pSect         = pFirstSect;
    625                 KU32            cSectionsLeft = pSrcSeg->nsects;
    626                 KU64            offSect       = 0;
     580                uint32_t        cSectionsLeft = pSrcSeg->nsects;
     581                uint64_t            offSect       = 0;
    627582
    628583                /* Convert and verify the segment. */
    629                 KLDRMODMACHO_CHECK_RETURN(u.pLoadCmd->cmdsize >= sizeof(segment_command_32_t), KLDR_ERR_MACHO_BAD_LOAD_COMMAND);
     584                KLDRMODMACHO_CHECK_RETURN(u.pLoadCmd->cmdsize >= sizeof(segment_command_32_t), VERR_LDRMACHO_BAD_LOAD_COMMAND);
    630585                KLDRMODMACHO_CHECK_RETURN(   pHdr->magic == IMAGE_MACHO32_SIGNATURE_OE
    631                                           || pHdr->magic == IMAGE_MACHO32_SIGNATURE, KLDR_ERR_MACHO_BIT_MIX);
     586                                          || pHdr->magic == IMAGE_MACHO32_SIGNATURE, VERR_LDRMACHO_BIT_MIX);
    632587                if (fConvertEndian)
    633588                {
    634                     pSrcSeg->vmaddr   = K_E2E_U32(pSrcSeg->vmaddr);
    635                     pSrcSeg->vmsize   = K_E2E_U32(pSrcSeg->vmsize);
    636                     pSrcSeg->fileoff  = K_E2E_U32(pSrcSeg->fileoff);
    637                     pSrcSeg->filesize = K_E2E_U32(pSrcSeg->filesize);
    638                     pSrcSeg->maxprot  = K_E2E_U32(pSrcSeg->maxprot);
    639                     pSrcSeg->initprot = K_E2E_U32(pSrcSeg->initprot);
    640                     pSrcSeg->nsects   = K_E2E_U32(pSrcSeg->nsects);
    641                     pSrcSeg->flags    = K_E2E_U32(pSrcSeg->flags);
     589                    pSrcSeg->vmaddr   = RT_BSWAP_U32(pSrcSeg->vmaddr);
     590                    pSrcSeg->vmsize   = RT_BSWAP_U32(pSrcSeg->vmsize);
     591                    pSrcSeg->fileoff  = RT_BSWAP_U32(pSrcSeg->fileoff);
     592                    pSrcSeg->filesize = RT_BSWAP_U32(pSrcSeg->filesize);
     593                    pSrcSeg->maxprot  = RT_BSWAP_U32(pSrcSeg->maxprot);
     594                    pSrcSeg->initprot = RT_BSWAP_U32(pSrcSeg->initprot);
     595                    pSrcSeg->nsects   = RT_BSWAP_U32(pSrcSeg->nsects);
     596                    pSrcSeg->flags    = RT_BSWAP_U32(pSrcSeg->flags);
    642597                }
    643598
     
    645600                #define VALIDATE_AND_ADD_SEGMENT(a_cBits) \
    646601                do { \
    647                     KBOOL fSkipSeg = !kHlpStrComp(pSrcSeg->segname, "__DWARF")   /* Note: Not for non-object files. */ \
    648                                   || (   !kHlpStrComp(pSrcSeg->segname, "__CTF") /* Their CTF tool did/does weird things, */ \
     602                    bool fSkipSeg = !strcmp(pSrcSeg->segname, "__DWARF")   /* Note: Not for non-object files. */ \
     603                                  || (   !strcmp(pSrcSeg->segname, "__CTF") /* Their CTF tool did/does weird things, */ \
    649604                                      && pSrcSeg->vmsize == 0)                   /* overlapping vmaddr and zero vmsize. */ \
    650605                                  || (cSectionsLeft > 0 && (pFirstSect->flags & S_ATTR_DEBUG)); \
     
    658613                    KLDRMODMACHO_CHECK_RETURN(   pSrcSeg->filesize == 0 \
    659614                                              || (   pSrcSeg->fileoff <= cbFile \
    660                                                   && (KU64)pSrcSeg->fileoff + pSrcSeg->filesize <= cbFile), \
    661                                               KLDR_ERR_MACHO_BAD_LOAD_COMMAND); \
     615                                                  && (uint64_t)pSrcSeg->fileoff + pSrcSeg->filesize <= cbFile), \
     616                                              VERR_LDRMACHO_BAD_LOAD_COMMAND); \
    662617                    KLDRMODMACHO_CHECK_RETURN(   pSrcSeg->filesize <= pSrcSeg->vmsize \
    663                                               || (fSkipSeg && !kHlpStrComp(pSrcSeg->segname, "__CTF") /* see above */), \
    664                                               KLDR_ERR_MACHO_BAD_LOAD_COMMAND); \
     618                                              || (fSkipSeg && !strcmp(pSrcSeg->segname, "__CTF") /* see above */), \
     619                                              VERR_LDRMACHO_BAD_LOAD_COMMAND); \
    665620                    KLDRMODMACHO_CHECK_RETURN(!(~pSrcSeg->maxprot & pSrcSeg->initprot), \
    666                                               KLDR_ERR_MACHO_BAD_LOAD_COMMAND); \
     621                                              VERR_LDRMACHO_BAD_LOAD_COMMAND); \
    667622                    KLDRMODMACHO_CHECK_RETURN(!(pSrcSeg->flags & ~(SG_HIGHVM | SG_FVMLIB | SG_NORELOC | SG_PROTECTED_VERSION_1)), \
    668                                               KLDR_ERR_MACHO_BAD_LOAD_COMMAND); \
     623                                              VERR_LDRMACHO_BAD_LOAD_COMMAND); \
    669624                    KLDRMODMACHO_CHECK_RETURN(   pSrcSeg->nsects * sizeof(section_##a_cBits##_t) \
    670625                                              <= u.pLoadCmd->cmdsize - sizeof(segment_command_##a_cBits##_t), \
    671                                               KLDR_ERR_MACHO_BAD_LOAD_COMMAND); \
     626                                              VERR_LDRMACHO_BAD_LOAD_COMMAND); \
    672627                    KLDRMODMACHO_CHECK_RETURN(   uEffFileType != MH_OBJECT \
    673628                                              || cSegmentCommands == 0 \
     
    676631                                                  && pHdr->filetype == MH_DSYM \
    677632                                                  && fSkipSeg), \
    678                                               KLDR_ERR_MACHO_BAD_OBJECT_FILE); \
     633                                              VERR_LDRMACHO_BAD_OBJECT_FILE); \
    679634                    cSegmentCommands++; \
    680635                    \
     
    682637                    if (!fSkipSeg && uEffFileType != MH_OBJECT) \
    683638                    { \
    684                         cbStringPool += kHlpStrNLen(&pSrcSeg->segname[0], sizeof(pSrcSeg->segname)) + 1; \
     639                        cbStringPool += RTStrNLen(&pSrcSeg->segname[0], sizeof(pSrcSeg->segname)) + 1; \
    685640                        cSegments++; \
    686641                        if (cSegments == 1) /* The link address is set by the first segment. */  \
     
    700655                    if (fConvertEndian)
    701656                    {
    702                         pSect->addr      = K_E2E_U32(pSect->addr);
    703                         pSect->size      = K_E2E_U32(pSect->size);
    704                         pSect->offset    = K_E2E_U32(pSect->offset);
    705                         pSect->align     = K_E2E_U32(pSect->align);
    706                         pSect->reloff    = K_E2E_U32(pSect->reloff);
    707                         pSect->nreloc    = K_E2E_U32(pSect->nreloc);
    708                         pSect->flags     = K_E2E_U32(pSect->flags);
    709                         pSect->reserved1 = K_E2E_U32(pSect->reserved1);
    710                         pSect->reserved2 = K_E2E_U32(pSect->reserved2);
     657                        pSect->addr      = RT_BSWAP_U32(pSect->addr);
     658                        pSect->size      = RT_BSWAP_U32(pSect->size);
     659                        pSect->offset    = RT_BSWAP_U32(pSect->offset);
     660                        pSect->align     = RT_BSWAP_U32(pSect->align);
     661                        pSect->reloff    = RT_BSWAP_U32(pSect->reloff);
     662                        pSect->nreloc    = RT_BSWAP_U32(pSect->nreloc);
     663                        pSect->flags     = RT_BSWAP_U32(pSect->flags);
     664                        pSect->reserved1 = RT_BSWAP_U32(pSect->reserved1);
     665                        pSect->reserved2 = RT_BSWAP_U32(pSect->reserved2);
    711666                    }
    712667
     
    718673                        /* validate */ \
    719674                        if (uEffFileType != MH_OBJECT) \
    720                             KLDRMODMACHO_CHECK_RETURN(!kHlpStrComp(pSect->segname, pSrcSeg->segname),\
    721                                                       KLDR_ERR_MACHO_BAD_SECTION); \
     675                            KLDRMODMACHO_CHECK_RETURN(!strcmp(pSect->segname, pSrcSeg->segname),\
     676                                                      VERR_LDRMACHO_BAD_SECTION); \
    722677                        \
    723678                        switch (pSect->flags & SECTION_TYPE) \
    724679                        { \
    725680                            case S_ZEROFILL: \
    726                                 KLDRMODMACHO_CHECK_RETURN(!pSect->reserved1, KLDR_ERR_MACHO_BAD_SECTION); \
    727                                 KLDRMODMACHO_CHECK_RETURN(!pSect->reserved2, KLDR_ERR_MACHO_BAD_SECTION); \
     681                                KLDRMODMACHO_CHECK_RETURN(!pSect->reserved1, VERR_LDRMACHO_BAD_SECTION); \
     682                                KLDRMODMACHO_CHECK_RETURN(!pSect->reserved2, VERR_LDRMACHO_BAD_SECTION); \
    728683                                fFileBits = 0; \
    729684                                break; \
     
    734689                            case S_8BYTE_LITERALS: \
    735690                            case S_16BYTE_LITERALS: \
    736                                 KLDRMODMACHO_CHECK_RETURN(!pSect->reserved1, KLDR_ERR_MACHO_BAD_SECTION); \
    737                                 KLDRMODMACHO_CHECK_RETURN(!pSect->reserved2, KLDR_ERR_MACHO_BAD_SECTION); \
     691                                KLDRMODMACHO_CHECK_RETURN(!pSect->reserved1, VERR_LDRMACHO_BAD_SECTION); \
     692                                KLDRMODMACHO_CHECK_RETURN(!pSect->reserved2, VERR_LDRMACHO_BAD_SECTION); \
    738693                                fFileBits = 1; \
    739694                                break; \
    740695                            \
    741696                            case S_SYMBOL_STUBS: \
    742                                 KLDRMODMACHO_CHECK_RETURN(!pSect->reserved1, KLDR_ERR_MACHO_BAD_SECTION); \
     697                                KLDRMODMACHO_CHECK_RETURN(!pSect->reserved1, VERR_LDRMACHO_BAD_SECTION); \
    743698                                /* reserved2 == stub size. 0 has been seen (corecrypto.kext) */ \
    744                                 KLDRMODMACHO_CHECK_RETURN(pSect->reserved2 < 64, KLDR_ERR_MACHO_BAD_SECTION); \
     699                                KLDRMODMACHO_CHECK_RETURN(pSect->reserved2 < 64, VERR_LDRMACHO_BAD_SECTION); \
    745700                                fFileBits = 1; \
    746701                                break; \
     
    750705                            case S_LAZY_DYLIB_SYMBOL_POINTERS: \
    751706                                /* (reserved 1 = is indirect symbol table index) */ \
    752                                 KLDRMODMACHO_CHECK_RETURN(!pSect->reserved2, KLDR_ERR_MACHO_BAD_SECTION); \
    753                                 *pfCanLoad = K_FALSE; \
     707                                KLDRMODMACHO_CHECK_RETURN(!pSect->reserved2, VERR_LDRMACHO_BAD_SECTION); \
     708                                *pfCanLoad = false; \
    754709                                fFileBits = -1; /* __DATA.__got in the 64-bit mach_kernel has bits, any things without bits? */ \
    755710                                break; \
     
    757712                            case S_MOD_INIT_FUNC_POINTERS: \
    758713                                /** @todo this requires a query API or flag... (e.g. C++ constructors) */ \
    759                                 KLDRMODMACHO_CHECK_RETURN(fOpenFlags & KLDRMOD_OPEN_FLAGS_FOR_INFO, \
    760                                                           KLDR_ERR_MACHO_UNSUPPORTED_INIT_SECTION); \
     714                                KLDRMODMACHO_CHECK_RETURN(fOpenFlags & RTLDR_O_FOR_DEBUG, \
     715                                                          VERR_LDRMACHO_UNSUPPORTED_INIT_SECTION); \
    761716                                /* Falls through. */ \
    762717                            case S_MOD_TERM_FUNC_POINTERS: \
    763718                                /** @todo this requires a query API or flag... (e.g. C++ destructors) */ \
    764                                 KLDRMODMACHO_CHECK_RETURN(fOpenFlags & KLDRMOD_OPEN_FLAGS_FOR_INFO, \
    765                                                           KLDR_ERR_MACHO_UNSUPPORTED_TERM_SECTION); \
    766                                 KLDRMODMACHO_CHECK_RETURN(!pSect->reserved1, KLDR_ERR_MACHO_BAD_SECTION); \
    767                                 KLDRMODMACHO_CHECK_RETURN(!pSect->reserved2, KLDR_ERR_MACHO_BAD_SECTION); \
     719                                KLDRMODMACHO_CHECK_RETURN(fOpenFlags & RTLDR_O_FOR_DEBUG, \
     720                                                          VERR_LDRMACHO_UNSUPPORTED_TERM_SECTION); \
     721                                KLDRMODMACHO_CHECK_RETURN(!pSect->reserved1, VERR_LDRMACHO_BAD_SECTION); \
     722                                KLDRMODMACHO_CHECK_RETURN(!pSect->reserved2, VERR_LDRMACHO_BAD_SECTION); \
    768723                                fFileBits = 1; \
    769724                                break; /* ignored */ \
     
    771726                            case S_LITERAL_POINTERS: \
    772727                            case S_DTRACE_DOF: \
    773                                 KLDRMODMACHO_CHECK_RETURN(!pSect->reserved1, KLDR_ERR_MACHO_BAD_SECTION); \
    774                                 KLDRMODMACHO_CHECK_RETURN(!pSect->reserved2, KLDR_ERR_MACHO_BAD_SECTION); \
     728                                KLDRMODMACHO_CHECK_RETURN(!pSect->reserved1, VERR_LDRMACHO_BAD_SECTION); \
     729                                KLDRMODMACHO_CHECK_RETURN(!pSect->reserved2, VERR_LDRMACHO_BAD_SECTION); \
    775730                                fFileBits = 1; \
    776731                                break; \
     
    778733                            case S_INTERPOSING: \
    779734                            case S_GB_ZEROFILL: \
    780                                 KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_UNSUPPORTED_SECTION); \
     735                                KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_UNSUPPORTED_SECTION); \
    781736                            \
    782737                            default: \
    783                                 KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_UNKNOWN_SECTION); \
     738                                KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_UNKNOWN_SECTION); \
    784739                        } \
    785740                        KLDRMODMACHO_CHECK_RETURN(!(pSect->flags & ~(  S_ATTR_PURE_INSTRUCTIONS | S_ATTR_NO_TOC | S_ATTR_STRIP_STATIC_SYMS \
     
    787742                                                                     | S_ATTR_DEBUG | S_ATTR_SOME_INSTRUCTIONS | S_ATTR_EXT_RELOC \
    788743                                                                     | S_ATTR_LOC_RELOC | SECTION_TYPE)), \
    789                                                   KLDR_ERR_MACHO_BAD_SECTION); \
     744                                                  VERR_LDRMACHO_BAD_SECTION); \
    790745                        KLDRMODMACHO_CHECK_RETURN((pSect->flags & S_ATTR_DEBUG) == (pFirstSect->flags & S_ATTR_DEBUG), \
    791                                                   KLDR_ERR_MACHO_MIXED_DEBUG_SECTION_FLAGS); \
     746                                                  VERR_LDRMACHO_MIXED_DEBUG_SECTION_FLAGS); \
    792747                        \
    793748                        KLDRMODMACHO_CHECK_RETURN(pSect->addr - pSrcSeg->vmaddr <= pSrcSeg->vmsize, \
    794                                                   KLDR_ERR_MACHO_BAD_SECTION); \
     749                                                  VERR_LDRMACHO_BAD_SECTION); \
    795750                        KLDRMODMACHO_CHECK_RETURN(   pSect->addr - pSrcSeg->vmaddr + pSect->size <= pSrcSeg->vmsize \
    796                                                   || !kHlpStrComp(pSrcSeg->segname, "__CTF") /* see above */, \
    797                                                   KLDR_ERR_MACHO_BAD_SECTION); \
     751                                                  || !strcmp(pSrcSeg->segname, "__CTF") /* see above */, \
     752                                                  VERR_LDRMACHO_BAD_SECTION); \
    798753                        KLDRMODMACHO_CHECK_RETURN(pSect->align < 31, \
    799                                                   KLDR_ERR_MACHO_BAD_SECTION); \
     754                                                  VERR_LDRMACHO_BAD_SECTION); \
    800755                        /* Workaround for buggy ld64 (or as, llvm, ++) that produces a misaligned __TEXT.__unwind_info. */ \
    801756                        /* Seen: pSect->align = 4, pSect->addr = 0x5ebe14.  Just adjust the alignment down. */ \
    802                         if (   ((K_BIT32(pSect->align) - KU32_C(1)) & pSect->addr) \
     757                        if (   ((RT_BIT_32(pSect->align) - UINT32_C(1)) & pSect->addr) \
    803758                            && pSect->align == 4 \
    804                             && kHlpStrComp(pSect->sectname, "__unwind_info") == 0) \
     759                            && strcmp(pSect->sectname, "__unwind_info") == 0) \
    805760                            pSect->align = 2; \
    806                         KLDRMODMACHO_CHECK_RETURN(!((K_BIT32(pSect->align) - KU32_C(1)) & pSect->addr), \
    807                                                   KLDR_ERR_MACHO_BAD_SECTION); \
    808                         KLDRMODMACHO_CHECK_RETURN(!((K_BIT32(pSect->align) - KU32_C(1)) & pSrcSeg->vmaddr), \
    809                                                   KLDR_ERR_MACHO_BAD_SECTION); \
     761                        KLDRMODMACHO_CHECK_RETURN(!((RT_BIT_32(pSect->align) - UINT32_C(1)) & pSect->addr), \
     762                                                  VERR_LDRMACHO_BAD_SECTION); \
     763                        KLDRMODMACHO_CHECK_RETURN(!((RT_BIT_32(pSect->align) - UINT32_C(1)) & pSrcSeg->vmaddr), \
     764                                                  VERR_LDRMACHO_BAD_SECTION); \
    810765                        \
    811766                        /* Adjust the section offset before we check file offset. */ \
    812                         offSect = (offSect + K_BIT64(pSect->align) - KU64_C(1)) & ~(K_BIT64(pSect->align) - KU64_C(1)); \
     767                        offSect = (offSect + RT_BIT_64(pSect->align) - UINT64_C(1)) & ~(RT_BIT_64(pSect->align) - UINT64_C(1)); \
    813768                        if (pSect->addr) \
    814769                        { \
    815                             KLDRMODMACHO_CHECK_RETURN(offSect <= pSect->addr - pSrcSeg->vmaddr, KLDR_ERR_MACHO_BAD_SECTION); \
     770                            KLDRMODMACHO_CHECK_RETURN(offSect <= pSect->addr - pSrcSeg->vmaddr, VERR_LDRMACHO_BAD_SECTION); \
    816771                            if (offSect < pSect->addr - pSrcSeg->vmaddr) \
    817772                                offSect = pSect->addr - pSrcSeg->vmaddr; \
     
    825780                            { \
    826781                                KLDRMODMACHO_CHECK_RETURN(pSect->offset == pSrcSeg->fileoff + offSect, \
    827                                                           KLDR_ERR_MACHO_NON_CONT_SEG_BITS); \
     782                                                          VERR_LDRMACHO_NON_CONT_SEG_BITS); \
    828783                                KLDRMODMACHO_CHECK_RETURN(pSect->offset - pSrcSeg->fileoff <= pSrcSeg->filesize, \
    829                                                           KLDR_ERR_MACHO_BAD_SECTION); \
     784                                                          VERR_LDRMACHO_BAD_SECTION); \
    830785                            } \
    831786                            KLDRMODMACHO_CHECK_RETURN(pSect->offset <= cbFile, \
    832                                                       KLDR_ERR_MACHO_BAD_SECTION); \
    833                             KLDRMODMACHO_CHECK_RETURN((KU64)pSect->offset + pSect->size <= cbFile, \
    834                                                       KLDR_ERR_MACHO_BAD_SECTION); \
     787                                                      VERR_LDRMACHO_BAD_SECTION); \
     788                            KLDRMODMACHO_CHECK_RETURN((uint64_t)pSect->offset + pSect->size <= cbFile, \
     789                                                      VERR_LDRMACHO_BAD_SECTION); \
    835790                        } \
    836791                        else \
    837                             KLDRMODMACHO_CHECK_RETURN(pSect->offset == 0, KLDR_ERR_MACHO_BAD_SECTION); \
     792                            KLDRMODMACHO_CHECK_RETURN(pSect->offset == 0, VERR_LDRMACHO_BAD_SECTION); \
    838793                        \
    839794                        if (!pSect->nreloc) \
    840795                            KLDRMODMACHO_CHECK_RETURN(!pSect->reloff, \
    841                                                       KLDR_ERR_MACHO_BAD_SECTION); \
     796                                                      VERR_LDRMACHO_BAD_SECTION); \
    842797                        else \
    843798                        { \
    844799                            KLDRMODMACHO_CHECK_RETURN(pSect->reloff <= cbFile, \
    845                                                       KLDR_ERR_MACHO_BAD_SECTION); \
    846                             KLDRMODMACHO_CHECK_RETURN(     (KU64)pSect->reloff \
    847                                                          + (KLDRFOFF)pSect->nreloc * sizeof(macho_relocation_info_t) \
     800                                                      VERR_LDRMACHO_BAD_SECTION); \
     801                            KLDRMODMACHO_CHECK_RETURN(     (uint64_t)pSect->reloff \
     802                                                         + (RTFOFF)pSect->nreloc * sizeof(macho_relocation_info_t) \
    848803                                                      <= cbFile, \
    849                                                       KLDR_ERR_MACHO_BAD_SECTION); \
     804                                                      VERR_LDRMACHO_BAD_SECTION); \
    850805                        } \
    851806                        \
     
    855810                            case MH_OBJECT: \
    856811                                if (   !(pSect->flags & S_ATTR_DEBUG) \
    857                                     && kHlpStrComp(pSect->segname, "__DWARF")) \
     812                                    && strcmp(pSect->segname, "__DWARF")) \
    858813                                { \
    859                                     cbStringPool += kHlpStrNLen(&pSect->segname[0], sizeof(pSect->segname)) + 1; \
    860                                     cbStringPool += kHlpStrNLen(&pSect->sectname[0], sizeof(pSect->sectname)) + 1; \
     814                                    cbStringPool += RTStrNLen(&pSect->segname[0], sizeof(pSect->segname)) + 1; \
     815                                    cbStringPool += RTStrNLen(&pSect->sectname[0], sizeof(pSect->sectname)) + 1; \
    861816                                    cSegments++; \
    862817                                    if (cSegments == 1) /* The link address is set by the first segment. */  \
     
    872827                                break; \
    873828                            default: \
    874                                 KLDRMODMACHO_FAILED_RETURN(KERR_INVALID_PARAMETER); \
     829                                KLDRMODMACHO_FAILED_RETURN(VERR_INVALID_PARAMETER); \
    875830                        } \
    876831                        \
     
    892847                section_64_t   *pFirstSect    = (section_64_t *)(pSrcSeg + 1);
    893848                section_64_t   *pSect         = pFirstSect;
    894                 KU32            cSectionsLeft = pSrcSeg->nsects;
    895                 KU64            offSect       = 0;
     849                uint32_t        cSectionsLeft = pSrcSeg->nsects;
     850                uint64_t            offSect       = 0;
    896851
    897852                /* Convert and verify the segment. */
    898                 KLDRMODMACHO_CHECK_RETURN(u.pLoadCmd->cmdsize >= sizeof(segment_command_64_t), KLDR_ERR_MACHO_BAD_LOAD_COMMAND);
     853                KLDRMODMACHO_CHECK_RETURN(u.pLoadCmd->cmdsize >= sizeof(segment_command_64_t), VERR_LDRMACHO_BAD_LOAD_COMMAND);
    899854                KLDRMODMACHO_CHECK_RETURN(   pHdr->magic == IMAGE_MACHO64_SIGNATURE_OE
    900                                           || pHdr->magic == IMAGE_MACHO64_SIGNATURE, KLDR_ERR_MACHO_BIT_MIX);
     855                                          || pHdr->magic == IMAGE_MACHO64_SIGNATURE, VERR_LDRMACHO_BIT_MIX);
    901856                if (fConvertEndian)
    902857                {
    903                     pSrcSeg->vmaddr   = K_E2E_U64(pSrcSeg->vmaddr);
    904                     pSrcSeg->vmsize   = K_E2E_U64(pSrcSeg->vmsize);
    905                     pSrcSeg->fileoff  = K_E2E_U64(pSrcSeg->fileoff);
    906                     pSrcSeg->filesize = K_E2E_U64(pSrcSeg->filesize);
    907                     pSrcSeg->maxprot  = K_E2E_U32(pSrcSeg->maxprot);
    908                     pSrcSeg->initprot = K_E2E_U32(pSrcSeg->initprot);
    909                     pSrcSeg->nsects   = K_E2E_U32(pSrcSeg->nsects);
    910                     pSrcSeg->flags    = K_E2E_U32(pSrcSeg->flags);
     858                    pSrcSeg->vmaddr   = RT_BSWAP_U64(pSrcSeg->vmaddr);
     859                    pSrcSeg->vmsize   = RT_BSWAP_U64(pSrcSeg->vmsize);
     860                    pSrcSeg->fileoff  = RT_BSWAP_U64(pSrcSeg->fileoff);
     861                    pSrcSeg->filesize = RT_BSWAP_U64(pSrcSeg->filesize);
     862                    pSrcSeg->maxprot  = RT_BSWAP_U32(pSrcSeg->maxprot);
     863                    pSrcSeg->initprot = RT_BSWAP_U32(pSrcSeg->initprot);
     864                    pSrcSeg->nsects   = RT_BSWAP_U32(pSrcSeg->nsects);
     865                    pSrcSeg->flags    = RT_BSWAP_U32(pSrcSeg->flags);
    911866                }
    912867
     
    920875                    if (fConvertEndian)
    921876                    {
    922                         pSect->addr      = K_E2E_U64(pSect->addr);
    923                         pSect->size      = K_E2E_U64(pSect->size);
    924                         pSect->offset    = K_E2E_U32(pSect->offset);
    925                         pSect->align     = K_E2E_U32(pSect->align);
    926                         pSect->reloff    = K_E2E_U32(pSect->reloff);
    927                         pSect->nreloc    = K_E2E_U32(pSect->nreloc);
    928                         pSect->flags     = K_E2E_U32(pSect->flags);
    929                         pSect->reserved1 = K_E2E_U32(pSect->reserved1);
    930                         pSect->reserved2 = K_E2E_U32(pSect->reserved2);
     877                        pSect->addr      = RT_BSWAP_U64(pSect->addr);
     878                        pSect->size      = RT_BSWAP_U64(pSect->size);
     879                        pSect->offset    = RT_BSWAP_U32(pSect->offset);
     880                        pSect->align     = RT_BSWAP_U32(pSect->align);
     881                        pSect->reloff    = RT_BSWAP_U32(pSect->reloff);
     882                        pSect->nreloc    = RT_BSWAP_U32(pSect->nreloc);
     883                        pSect->flags     = RT_BSWAP_U32(pSect->flags);
     884                        pSect->reserved1 = RT_BSWAP_U32(pSect->reserved1);
     885                        pSect->reserved2 = RT_BSWAP_U32(pSect->reserved2);
    931886                    }
    932887
     
    942897            case LC_SYMTAB:
    943898            {
    944                 KSIZE cbSym;
     899                size_t cbSym;
    945900                if (fConvertEndian)
    946901                {
    947                     u.pSymTab->symoff  = K_E2E_U32(u.pSymTab->symoff);
    948                     u.pSymTab->nsyms   = K_E2E_U32(u.pSymTab->nsyms);
    949                     u.pSymTab->stroff  = K_E2E_U32(u.pSymTab->stroff);
    950                     u.pSymTab->strsize = K_E2E_U32(u.pSymTab->strsize);
     902                    u.pSymTab->symoff  = RT_BSWAP_U32(u.pSymTab->symoff);
     903                    u.pSymTab->nsyms   = RT_BSWAP_U32(u.pSymTab->nsyms);
     904                    u.pSymTab->stroff  = RT_BSWAP_U32(u.pSymTab->stroff);
     905                    u.pSymTab->strsize = RT_BSWAP_U32(u.pSymTab->strsize);
    951906                }
    952907
     
    957912                      : sizeof(macho_nlist_64_t);
    958913                if (    u.pSymTab->symoff >= cbFile
    959                     ||  (KU64)u.pSymTab->symoff + u.pSymTab->nsyms * cbSym > cbFile)
    960                     KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_BAD_LOAD_COMMAND);
     914                    ||  (uint64_t)u.pSymTab->symoff + u.pSymTab->nsyms * cbSym > cbFile)
     915                    KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_BAD_LOAD_COMMAND);
    961916                if (    u.pSymTab->stroff >= cbFile
    962                     ||  (KU64)u.pSymTab->stroff + u.pSymTab->strsize > cbFile)
    963                     KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_BAD_LOAD_COMMAND);
     917                    ||  (uint64_t)u.pSymTab->stroff + u.pSymTab->strsize > cbFile)
     918                    KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_BAD_LOAD_COMMAND);
    964919
    965920                /* only one string in objects, please. */
     
    967922                if (    uEffFileType == MH_OBJECT
    968923                    &&  cSymbolTabs != 1)
    969                     KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_BAD_OBJECT_FILE);
     924                    KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_BAD_OBJECT_FILE);
    970925                break;
    971926            }
     
    978933            case LC_UNIXTHREAD:
    979934            {
    980                 KU32 *pu32 = (KU32 *)(u.pb + sizeof(load_command_t));
    981                 KU32 cItemsLeft = (u.pThread->cmdsize - sizeof(load_command_t)) / sizeof(KU32);
     935                uint32_t *pu32 = (uint32_t *)(u.pb + sizeof(load_command_t));
     936                uint32_t cItemsLeft = (u.pThread->cmdsize - sizeof(load_command_t)) / sizeof(uint32_t);
    982937                while (cItemsLeft)
    983938                {
    984                     /* convert & verify header items ([0] == flavor, [1] == KU32 count). */
     939                    /* convert & verify header items ([0] == flavor, [1] == uint32_t count). */
    985940                    if (cItemsLeft < 2)
    986                         KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_BAD_LOAD_COMMAND);
     941                        KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_BAD_LOAD_COMMAND);
    987942                    if (fConvertEndian)
    988943                    {
    989                         pu32[0] = K_E2E_U32(pu32[0]);
    990                         pu32[1] = K_E2E_U32(pu32[1]);
     944                        pu32[0] = RT_BSWAP_U32(pu32[0]);
     945                        pu32[1] = RT_BSWAP_U32(pu32[1]);
    991946                    }
    992947                    if (pu32[1] + 2 > cItemsLeft)
    993                         KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_BAD_LOAD_COMMAND);
     948                        KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_BAD_LOAD_COMMAND);
    994949
    995950                    /* convert & verify according to flavor. */
     
    1010965            case LC_UUID:
    1011966                if (u.pUuid->cmdsize != sizeof(uuid_command_t))
    1012                     KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_BAD_LOAD_COMMAND);
     967                    KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_BAD_LOAD_COMMAND);
    1013968                /** @todo Check anything here need converting? */
    1014969                break;
     
    1016971            case LC_CODE_SIGNATURE:
    1017972                if (u.pUuid->cmdsize != sizeof(linkedit_data_command_t))
    1018                     KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_BAD_LOAD_COMMAND);
     973                    KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_BAD_LOAD_COMMAND);
    1019974                break;
    1020975
     
    1022977            case LC_VERSION_MIN_IPHONEOS:
    1023978                if (u.pUuid->cmdsize != sizeof(version_min_command_t))
    1024                     KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_BAD_LOAD_COMMAND);
     979                    KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_BAD_LOAD_COMMAND);
    1025980                break;
    1026981
     
    10491004            case LC_MAIN: /** @todo parse this and find and entry point or smth. */
    10501005                /** @todo valid command size. */
    1051                 if (!(fOpenFlags & KLDRMOD_OPEN_FLAGS_FOR_INFO))
    1052                     KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_UNSUPPORTED_LOAD_COMMAND);
    1053                 *pfCanLoad = K_FALSE;
     1006                if (!(fOpenFlags & RTLDR_O_FOR_DEBUG))
     1007                    KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_UNSUPPORTED_LOAD_COMMAND);
     1008                *pfCanLoad = false;
    10541009                break;
    10551010
     
    10681023            case LC_PREBIND_CKSUM:
    10691024            case LC_SYMSEG:
    1070                 KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_UNSUPPORTED_LOAD_COMMAND);
     1025                KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_UNSUPPORTED_LOAD_COMMAND);
    10711026
    10721027            default:
    1073                 KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_UNKNOWN_LOAD_COMMAND);
     1028                KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_UNKNOWN_LOAD_COMMAND);
    10741029        }
    10751030    }
     
    10771032    /* be strict. */
    10781033    if (cbLeft)
    1079         KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_BAD_LOAD_COMMAND);
     1034        KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_BAD_LOAD_COMMAND);
    10801035
    10811036    switch (uEffFileType)
     
    10881043        case MH_KEXT_BUNDLE:
    10891044            if (!cSegments)
    1090                 KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_BAD_OBJECT_FILE);
     1045                KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_BAD_OBJECT_FILE);
    10911046            break;
    10921047    }
     
    10941049    *pcSegments = cSegments;
    10951050    *pcSections = cSections;
    1096     *pcbStringPool = (KU32)cbStringPool;
     1051    *pcbStringPool = (uint32_t)cbStringPool;
    10971052
    10981053    return 0;
     
    11061061 *
    11071062 * @returns 0 on success.
    1108  * @returns KLDR_ERR_MACHO_* on failure.
    1109  * @param   pModMachO       The module.
     1063 * @returns VERR_LDRMACHO_* on failure.
     1064 * @param   pThis       The module.
    11101065 * @param   pbStringPool    The string pool
    11111066 * @param   cbStringPool    The size of the string pool.
    11121067 */
    1113 static int  kldrModMachOParseLoadCommands(PKLDRMODMACHO pModMachO, char *pbStringPool, KU32 cbStringPool)
     1068static int  kldrModMachOParseLoadCommands(PKLDRMODMACHO pThis, char *pbStringPool, uint32_t cbStringPool)
    11141069{
    11151070    union
    11161071    {
    1117         const KU8                  *pb;
     1072        const uint8_t              *pb;
    11181073        const load_command_t       *pLoadCmd;
    11191074        const segment_command_32_t *pSeg32;
     
    11221077        const uuid_command_t       *pUuid;
    11231078    } u;
    1124     KU32 cLeft = pModMachO->Hdr.ncmds;
    1125     KU32 cbLeft = pModMachO->Hdr.sizeofcmds;
    1126     const KU8 *pb = pModMachO->pbLoadCommands;
    1127     PKLDRSEG pDstSeg = &pModMachO->pMod->aSegments[0];
    1128     PKLDRMODMACHOSEG pSegExtra = &pModMachO->aSegments[0];
    1129     PKLDRMODMACHOSECT pSectExtra = pModMachO->paSections;
    1130     const KU32 cSegments = pModMachO->pMod->cSegments;
    1131     PKLDRSEG pSegItr;
    1132     K_NOREF(cbStringPool);
     1079    uint32_t cLeft = pThis->Hdr.ncmds;
     1080    uint32_t cbLeft = pThis->Hdr.sizeofcmds;
     1081    const uint8_t *pb = pThis->pbLoadCommands;
     1082    PKLDRMODMACHOSEG pDstSeg = &pThis->aSegments[0];
     1083    PKLDRMODMACHOSECT pSectExtra = pThis->paSections;
     1084    const uint32_t cSegments = pThis->cSegments;
     1085    PKLDRMODMACHOSEG pSegItr;
     1086    RT_NOREF(cbStringPool);
    11331087
    11341088    while (cLeft-- > 0)
     
    11481102                section_32_t   *pFirstSect    = (section_32_t *)(pSrcSeg + 1);
    11491103                section_32_t   *pSect         = pFirstSect;
    1150                 KU32            cSectionsLeft = pSrcSeg->nsects;
     1104                uint32_t        cSectionsLeft = pSrcSeg->nsects;
    11511105
    11521106                /* Adds a segment, used by the macro below and thus shared with the 64-bit segment variant. */
    11531107                #define NEW_SEGMENT(a_cBits, a_achName1, a_fObjFile, a_achName2, a_SegAddr, a_cbSeg, a_fFileBits, a_offFile, a_cbFile) \
    11541108                do { \
    1155                     pDstSeg->pvUser = NULL; \
    1156                     pDstSeg->pchName = pbStringPool; \
    1157                     pDstSeg->cchName = (KU32)kHlpStrNLen(a_achName1, sizeof(a_achName1)); \
    1158                     kHlpMemCopy(pbStringPool, a_achName1, pDstSeg->cchName); \
    1159                     pbStringPool += pDstSeg->cchName; \
     1109                    pDstSeg->SegInfo.pszName = pbStringPool; \
     1110                    pDstSeg->SegInfo.cchName = (uint32_t)RTStrNLen(a_achName1, sizeof(a_achName1)); \
     1111                    memcpy(pbStringPool, a_achName1, pDstSeg->SegInfo.cchName); \
     1112                    pbStringPool += pDstSeg->SegInfo.cchName; \
    11601113                    if (a_fObjFile) \
    11611114                    {   /* MH_OBJECT: Add '.sectname' - sections aren't sorted by segments. */ \
    1162                         KSIZE cchName2 = kHlpStrNLen(a_achName2, sizeof(a_achName2)); \
     1115                        size_t cchName2 = RTStrNLen(a_achName2, sizeof(a_achName2)); \
    11631116                        *pbStringPool++ = '.'; \
    1164                         kHlpMemCopy(pbStringPool, a_achName2, cchName2); \
     1117                        memcpy(pbStringPool, a_achName2, cchName2); \
    11651118                        pbStringPool += cchName2; \
    1166                         pDstSeg->cchName += (KU32)cchName2; \
     1119                        pDstSeg->SegInfo.cchName += (uint32_t)cchName2; \
    11671120                    } \
    11681121                    *pbStringPool++ = '\0'; \
    1169                     pDstSeg->SelFlat = 0; \
    1170                     pDstSeg->Sel16bit = 0; \
    1171                     pDstSeg->fFlags = 0; \
    1172                     pDstSeg->enmProt = KPROT_EXECUTE_WRITECOPY; /** @todo fixme! */ \
    1173                     pDstSeg->cb = (a_cbSeg); \
    1174                     pDstSeg->Alignment = 1; /* updated while parsing sections. */ \
    1175                     pDstSeg->LinkAddress = (a_SegAddr); \
     1122                    pDstSeg->SegInfo.SelFlat = 0; \
     1123                    pDstSeg->SegInfo.Sel16bit = 0; \
     1124                    pDstSeg->SegInfo.fFlags = 0; \
     1125                    pDstSeg->SegInfo.fProt = RTMEM_PROT_READ | RTMEM_PROT_WRITE | RTMEM_PROT_EXEC; /** @todo fixme! */ \
     1126                    pDstSeg->SegInfo.cb = (a_cbSeg); \
     1127                    pDstSeg->SegInfo.Alignment = 1; /* updated while parsing sections. */ \
     1128                    pDstSeg->SegInfo.LinkAddress = (a_SegAddr); \
    11761129                    if (a_fFileBits) \
    11771130                    { \
    1178                         pDstSeg->offFile = (KLDRFOFF)((a_offFile) + pModMachO->offImage); \
    1179                         pDstSeg->cbFile  = (KLDRFOFF)(a_cbFile); \
     1131                        pDstSeg->SegInfo.offFile = (RTFOFF)((a_offFile) + pThis->offImage); \
     1132                        pDstSeg->SegInfo.cbFile  = (RTFOFF)(a_cbFile); \
    11801133                    } \
    11811134                    else \
    11821135                    { \
    1183                         pDstSeg->offFile = -1; \
    1184                         pDstSeg->cbFile  = -1; \
     1136                        pDstSeg->SegInfo.offFile = -1; \
     1137                        pDstSeg->SegInfo.cbFile  = -1; \
    11851138                    } \
    1186                     pDstSeg->RVA = (a_SegAddr) - pModMachO->LinkAddress; \
    1187                     pDstSeg->cbMapped = 0; \
    1188                     pDstSeg->MapAddress = 0; \
     1139                    pDstSeg->SegInfo.RVA = (a_SegAddr) - pThis->LinkAddress; \
     1140                    pDstSeg->SegInfo.cbMapped = 0; \
    11891141                    \
    1190                     pSegExtra->iOrgSegNo = (KU32)(pSegExtra - &pModMachO->aSegments[0]); \
    1191                     pSegExtra->cSections = 0; \
    1192                     pSegExtra->paSections = pSectExtra; \
     1142                    pDstSeg->iOrgSegNo = (uint32_t)(pDstSeg - &pThis->aSegments[0]); \
     1143                    pDstSeg->cSections = 0; \
     1144                    pDstSeg->paSections = pSectExtra; \
    11931145                } while (0)
    11941146
     
    11961148                #define CLOSE_SEGMENT() \
    11971149                do { \
    1198                     pSegExtra->cSections = (KU32)(pSectExtra - pSegExtra->paSections); \
    1199                     pSegExtra++; \
     1150                    pDstSeg->cSections = (uint32_t)(pSectExtra - pDstSeg->paSections); \
    12001151                    pDstSeg++; \
    12011152                } while (0)
     
    12051156                #define ADD_SEGMENT_AND_ITS_SECTIONS(a_cBits) \
    12061157                do { \
    1207                     KBOOL fAddSegOuter = K_FALSE; \
     1158                    bool fAddSegOuter = false; \
    12081159                    \
    12091160                    /* \
     
    12111162                     * in the preparsing stage. \
    12121163                     */ \
    1213                     if (pModMachO->uEffFileType != MH_OBJECT) \
    1214                         for (pSegItr = &pModMachO->pMod->aSegments[0]; pSegItr != pDstSeg; pSegItr++) \
    1215                             if (!kHlpStrNComp(pSegItr->pchName, pSrcSeg->segname, sizeof(pSrcSeg->segname))) \
    1216                                 KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_DUPLICATE_SEGMENT_NAME); \
     1164                    if (pThis->uEffFileType != MH_OBJECT) \
     1165                        for (pSegItr = &pThis->aSegments[0]; pSegItr != pDstSeg; pSegItr++) \
     1166                            if (!strncmp(pSegItr->SegInfo.pszName, pSrcSeg->segname, sizeof(pSrcSeg->segname))) \
     1167                                KLDRMODMACHO_FAILED_RETURN(VERR_LDR_DUPLICATE_SEGMENT_NAME); \
    12171168                    \
    12181169                    /* \
    12191170                     * Create a new segment, unless we're supposed to skip this one. \
    12201171                     */ \
    1221                     if (   pModMachO->uEffFileType != MH_OBJECT \
     1172                    if (   pThis->uEffFileType != MH_OBJECT \
    12221173                        && (cSectionsLeft == 0 || !(pFirstSect->flags & S_ATTR_DEBUG)) \
    1223                         && kHlpStrComp(pSrcSeg->segname, "__DWARF") \
    1224                         && kHlpStrComp(pSrcSeg->segname, "__CTF") ) \
     1174                        && strcmp(pSrcSeg->segname, "__DWARF") \
     1175                        && strcmp(pSrcSeg->segname, "__CTF") ) \
    12251176                    { \
    1226                         NEW_SEGMENT(a_cBits, pSrcSeg->segname, K_FALSE /*a_fObjFile*/, 0 /*a_achName2*/, \
     1177                        NEW_SEGMENT(a_cBits, pSrcSeg->segname, false /*a_fObjFile*/, 0 /*a_achName2*/, \
    12271178                                    pSrcSeg->vmaddr, pSrcSeg->vmsize, \
    12281179                                    pSrcSeg->filesize != 0, pSrcSeg->fileoff, pSrcSeg->filesize); \
    1229                         fAddSegOuter = K_TRUE; \
     1180                        fAddSegOuter = true; \
    12301181                    } \
    12311182                    \
     
    12361187                    { \
    12371188                        /* New segment if object file. */ \
    1238                         KBOOL fAddSegInner = K_FALSE; \
    1239                         if (   pModMachO->uEffFileType == MH_OBJECT \
     1189                        bool fAddSegInner = false; \
     1190                        if (   pThis->uEffFileType == MH_OBJECT \
    12401191                            && !(pSect->flags & S_ATTR_DEBUG) \
    1241                             && kHlpStrComp(pSrcSeg->segname, "__DWARF") \
    1242                             && kHlpStrComp(pSrcSeg->segname, "__CTF") ) \
     1192                            && strcmp(pSrcSeg->segname, "__DWARF") \
     1193                            && strcmp(pSrcSeg->segname, "__CTF") ) \
    12431194                        { \
    1244                             kHlpAssert(!fAddSegOuter); \
    1245                             NEW_SEGMENT(a_cBits, pSect->segname, K_TRUE /*a_fObjFile*/, pSect->sectname, \
     1195                            Assert(!fAddSegOuter); \
     1196                            NEW_SEGMENT(a_cBits, pSect->segname, true /*a_fObjFile*/, pSect->sectname, \
    12461197                                        pSect->addr, pSect->size, \
    12471198                                        pSect->offset != 0, pSect->offset, pSect->size); \
    1248                             fAddSegInner = K_TRUE; \
     1199                            fAddSegInner = true; \
    12491200                        } \
    12501201                        \
    12511202                        /* Section data extract. */ \
    12521203                        pSectExtra->cb = pSect->size; \
    1253                         pSectExtra->RVA = pSect->addr - pDstSeg->LinkAddress; \
     1204                        pSectExtra->RVA = pSect->addr - pDstSeg->SegInfo.LinkAddress; \
    12541205                        pSectExtra->LinkAddress = pSect->addr; \
    12551206                        if (pSect->offset) \
    1256                             pSectExtra->offFile = pSect->offset + pModMachO->offImage; \
     1207                            pSectExtra->offFile = pSect->offset + pThis->offImage; \
    12571208                        else \
    12581209                            pSectExtra->offFile = -1; \
     
    12601211                        pSectExtra->paFixups = NULL; \
    12611212                        if (pSect->nreloc) \
    1262                             pSectExtra->offFixups = pSect->reloff + pModMachO->offImage; \
     1213                            pSectExtra->offFixups = pSect->reloff + pThis->offImage; \
    12631214                        else \
    12641215                            pSectExtra->offFixups = -1; \
    12651216                        pSectExtra->fFlags = pSect->flags; \
    1266                         pSectExtra->iSegment = (KU32)(pSegExtra - &pModMachO->aSegments[0]); \
     1217                        pSectExtra->iSegment = (uint32_t)(pDstSeg - &pThis->aSegments[0]); \
    12671218                        pSectExtra->pvMachoSection = pSect; \
    12681219                        \
    12691220                        /* Update the segment alignment, if we're not skipping it. */ \
    12701221                        if (   (fAddSegOuter || fAddSegInner) \
    1271                             && pDstSeg->Alignment < ((KLDRADDR)1 << pSect->align)) \
    1272                             pDstSeg->Alignment = (KLDRADDR)1 << pSect->align; \
     1222                            && pDstSeg->SegInfo.Alignment < ((RTLDRADDR)1 << pSect->align)) \
     1223                            pDstSeg->SegInfo.Alignment = (RTLDRADDR)1 << pSect->align; \
    12731224                        \
    12741225                        /* Next section, and if object file next segment. */ \
     
    12931244                section_64_t   *pFirstSect    = (section_64_t *)(pSrcSeg + 1);
    12941245                section_64_t   *pSect         = pFirstSect;
    1295                 KU32            cSectionsLeft = pSrcSeg->nsects;
     1246                uint32_t        cSectionsLeft = pSrcSeg->nsects;
    12961247
    12971248                ADD_SEGMENT_AND_ITS_SECTIONS(64);
     
    13001251
    13011252            case LC_SYMTAB:
    1302                 switch (pModMachO->uEffFileType)
     1253                switch (pThis->uEffFileType)
    13031254                {
    13041255                    case MH_OBJECT:
     
    13081259                    case MH_DSYM:
    13091260                    case MH_KEXT_BUNDLE:
    1310                         pModMachO->offSymbols = u.pSymTab->symoff + pModMachO->offImage;
    1311                         pModMachO->cSymbols = u.pSymTab->nsyms;
    1312                         pModMachO->offStrings = u.pSymTab->stroff + pModMachO->offImage;
    1313                         pModMachO->cchStrings = u.pSymTab->strsize;
     1261                        pThis->offSymbols = u.pSymTab->symoff + pThis->offImage;
     1262                        pThis->cSymbols = u.pSymTab->nsyms;
     1263                        pThis->offStrings = u.pSymTab->stroff + pThis->offImage;
     1264                        pThis->cchStrings = u.pSymTab->strsize;
    13141265                        break;
    13151266                }
     
    13171268
    13181269            case LC_UUID:
    1319                 kHlpMemCopy(pModMachO->abImageUuid, u.pUuid->uuid, sizeof(pModMachO->abImageUuid));
     1270                memcpy(pThis->abImageUuid, u.pUuid->uuid, sizeof(pThis->abImageUuid));
    13201271                break;
    13211272
     
    13251276    } /* while more commands */
    13261277
    1327     kHlpAssert(pDstSeg == &pModMachO->pMod->aSegments[cSegments - pModMachO->fMakeGot]);
     1278    Assert(pDstSeg == &pThis->aSegments[cSegments - pThis->fMakeGot]);
    13281279
    13291280    /*
     
    13311282     */
    13321283    {
    1333         KBOOL               fLoadLinkEdit = K_FALSE;
     1284        bool                fLoadLinkEdit = false;
    13341285        PKLDRMODMACHOSECT   pSectExtraItr;
    1335         KLDRADDR            uNextRVA = 0;
    1336         KLDRADDR            cb;
    1337         KU32                cSegmentsToAdjust = cSegments - pModMachO->fMakeGot;
    1338         KU32                c;
     1286        RTLDRADDR           uNextRVA = 0;
     1287        RTLDRADDR           cb;
     1288        uint32_t            cSegmentsToAdjust = cSegments - pThis->fMakeGot;
     1289        uint32_t            c;
    13391290
    13401291        for (;;)
     
    13431294               out of the RVA negotiations and image loading. */
    13441295            if (   cSegmentsToAdjust > 0
    1345                 && !kHlpStrComp(pModMachO->pMod->aSegments[cSegmentsToAdjust - 1].pchName, "__DWARF"))
     1296                && !strcmp(pThis->aSegments[cSegmentsToAdjust - 1].SegInfo.pszName, "__DWARF"))
    13461297            {
    13471298                cSegmentsToAdjust--;
    1348                 pModMachO->pMod->aSegments[cSegmentsToAdjust].RVA = NIL_KLDRADDR;
    1349                 pModMachO->pMod->aSegments[cSegmentsToAdjust].cbMapped = 0;
     1299                pThis->aSegments[cSegmentsToAdjust].SegInfo.RVA = NIL_RTLDRADDR;
     1300                pThis->aSegments[cSegmentsToAdjust].SegInfo.cbMapped = 0;
    13501301                continue;
    13511302            }
     
    13561307            if (   !fLoadLinkEdit
    13571308                && cSegmentsToAdjust > 0
    1358                 && !kHlpStrComp(pModMachO->pMod->aSegments[cSegmentsToAdjust - 1].pchName, "__LINKEDIT"))
     1309                && !strcmp(pThis->aSegments[cSegmentsToAdjust - 1].SegInfo.pszName, "__LINKEDIT"))
    13591310            {
    13601311                cSegmentsToAdjust--;
    1361                 pModMachO->pMod->aSegments[cSegmentsToAdjust].RVA = NIL_KLDRADDR;
    1362                 pModMachO->pMod->aSegments[cSegmentsToAdjust].cbMapped = 0;
     1312                pThis->aSegments[cSegmentsToAdjust].SegInfo.RVA = NIL_RTLDRADDR;
     1313                pThis->aSegments[cSegmentsToAdjust].SegInfo.cbMapped = 0;
    13631314                continue;
    13641315            }
     
    13681319        /* Adjust RVAs. */
    13691320        c = cSegmentsToAdjust;
    1370         for (pDstSeg = &pModMachO->pMod->aSegments[0]; c-- > 0; pDstSeg++)
    1371         {
    1372             cb = pDstSeg->RVA - uNextRVA;
     1321        for (pDstSeg = &pThis->aSegments[0]; c-- > 0; pDstSeg++)
     1322        {
     1323            cb = pDstSeg->SegInfo.RVA - uNextRVA;
    13731324            if (cb >= 0x00100000) /* 1MB */
    13741325            {
    1375                 pDstSeg->RVA = uNextRVA;
    1376                 pModMachO->pMod->fFlags |= KLDRMOD_FLAGS_NON_CONTIGUOUS_LINK_ADDRS;
     1326                pDstSeg->SegInfo.RVA = uNextRVA;
     1327                //pThis->pMod->fFlags |= KLDRMOD_FLAGS_NON_CONTIGUOUS_LINK_ADDRS;
    13771328            }
    1378             uNextRVA = pDstSeg->RVA + KLDR_ALIGN_ADDR(pDstSeg->cb, pDstSeg->Alignment);
     1329            uNextRVA = pDstSeg->SegInfo.RVA + RTLDR_ALIGN_ADDR(pDstSeg->SegInfo.cb, pDstSeg->SegInfo.Alignment);
    13791330        }
    13801331
    13811332        /* Calculate the cbMapping members. */
    13821333        c = cSegmentsToAdjust;
    1383         for (pDstSeg = &pModMachO->pMod->aSegments[0]; c-- > 1; pDstSeg++)
    1384         {
    1385 
    1386             cb = pDstSeg[1].RVA - pDstSeg->RVA;
    1387             pDstSeg->cbMapped = (KSIZE)cb == cb ? (KSIZE)cb : KSIZE_MAX;
    1388         }
    1389 
    1390         cb = KLDR_ALIGN_ADDR(pDstSeg->cb, pDstSeg->Alignment);
    1391         pDstSeg->cbMapped = (KSIZE)cb == cb ? (KSIZE)cb : KSIZE_MAX;
     1334        for (pDstSeg = &pThis->aSegments[0]; c-- > 1; pDstSeg++)
     1335        {
     1336
     1337            cb = pDstSeg[1].SegInfo.RVA - pDstSeg->SegInfo.RVA;
     1338            pDstSeg->SegInfo.cbMapped = (size_t)cb == cb ? (size_t)cb : ~(size_t)0;
     1339        }
     1340
     1341        cb = RTLDR_ALIGN_ADDR(pDstSeg->SegInfo.cb, pDstSeg->SegInfo.Alignment);
     1342        pDstSeg->SegInfo.cbMapped = (size_t)cb == cb ? (size_t)cb : ~(size_t)0;
    13921343
    13931344        /* Set the image size. */
    1394         pModMachO->cbImage = pDstSeg->RVA + cb;
     1345        pThis->cbImage = pDstSeg->SegInfo.RVA + cb;
    13951346
    13961347        /* Fixup the section RVAs (internal). */
    13971348        c        = cSegmentsToAdjust;
    1398         uNextRVA = pModMachO->cbImage;
    1399         pDstSeg  = &pModMachO->pMod->aSegments[0];
    1400         for (pSectExtraItr = pModMachO->paSections; pSectExtraItr != pSectExtra; pSectExtraItr++)
     1349        uNextRVA = pThis->cbImage;
     1350        pDstSeg  = &pThis->aSegments[0];
     1351        for (pSectExtraItr = pThis->paSections; pSectExtraItr != pSectExtra; pSectExtraItr++)
    14011352        {
    14021353            if (pSectExtraItr->iSegment < c)
    1403                 pSectExtraItr->RVA += pDstSeg[pSectExtraItr->iSegment].RVA;
     1354                pSectExtraItr->RVA += pDstSeg[pSectExtraItr->iSegment].SegInfo.RVA;
    14041355            else
    14051356            {
    14061357                pSectExtraItr->RVA = uNextRVA;
    1407                 uNextRVA += KLDR_ALIGN_ADDR(pSectExtraItr->cb, 64);
     1358                uNextRVA += RTLDR_ALIGN_ADDR(pSectExtraItr->cb, 64);
    14081359            }
    14091360        }
     
    14131364     * Make the GOT segment if necessary.
    14141365     */
    1415     if (pModMachO->fMakeGot)
    1416     {
    1417         KU32 cbPtr = (   pModMachO->Hdr.magic == IMAGE_MACHO32_SIGNATURE
    1418                       || pModMachO->Hdr.magic == IMAGE_MACHO32_SIGNATURE_OE)
    1419                    ? sizeof(KU32)
    1420                    : sizeof(KU64);
    1421         KU32 cbGot = pModMachO->cSymbols * cbPtr;
    1422         KU32 cbJmpStubs;
    1423 
    1424         pModMachO->GotRVA = pModMachO->cbImage;
    1425 
    1426         if (pModMachO->cbJmpStub)
    1427         {
    1428             cbGot = K_ALIGN_Z(cbGot, 64);
    1429             pModMachO->JmpStubsRVA = pModMachO->GotRVA + cbGot;
    1430             cbJmpStubs = pModMachO->cbJmpStub * pModMachO->cSymbols;
     1366    if (pThis->fMakeGot)
     1367    {
     1368        uint32_t cbPtr = (   pThis->Hdr.magic == IMAGE_MACHO32_SIGNATURE
     1369                      || pThis->Hdr.magic == IMAGE_MACHO32_SIGNATURE_OE)
     1370                   ? sizeof(uint32_t)
     1371                   : sizeof(uint64_t);
     1372        uint32_t cbGot = pThis->cSymbols * cbPtr;
     1373        uint32_t cbJmpStubs;
     1374
     1375        pThis->GotRVA = pThis->cbImage;
     1376
     1377        if (pThis->cbJmpStub)
     1378        {
     1379            cbGot = RT_ALIGN_Z(cbGot, 64);
     1380            pThis->JmpStubsRVA = pThis->GotRVA + cbGot;
     1381            cbJmpStubs = pThis->cbJmpStub * pThis->cSymbols;
    14311382        }
    14321383        else
    14331384        {
    1434             pModMachO->JmpStubsRVA = NIL_KLDRADDR;
     1385            pThis->JmpStubsRVA = NIL_RTLDRADDR;
    14351386            cbJmpStubs = 0;
    14361387        }
    14371388
    1438         pDstSeg = &pModMachO->pMod->aSegments[cSegments - 1];
    1439         pDstSeg->pvUser = NULL;
    1440         pDstSeg->pchName = "GOT";
    1441         pDstSeg->cchName = 3;
    1442         pDstSeg->SelFlat = 0;
    1443         pDstSeg->Sel16bit = 0;
    1444         pDstSeg->fFlags = 0;
    1445         pDstSeg->enmProt = KPROT_READONLY;
    1446         pDstSeg->cb = cbGot + cbJmpStubs;
    1447         pDstSeg->Alignment = 64;
    1448         pDstSeg->LinkAddress = pModMachO->LinkAddress + pModMachO->GotRVA;
    1449         pDstSeg->offFile = -1;
    1450         pDstSeg->cbFile  = -1;
    1451         pDstSeg->RVA = pModMachO->GotRVA;
    1452         pDstSeg->cbMapped = (KSIZE)KLDR_ALIGN_ADDR(cbGot + cbJmpStubs, pDstSeg->Alignment);
    1453         pDstSeg->MapAddress = 0;
    1454 
    1455         pSegExtra->iOrgSegNo = KU32_MAX;
    1456         pSegExtra->cSections = 0;
    1457         pSegExtra->paSections = NULL;
    1458 
    1459         pModMachO->cbImage += pDstSeg->cbMapped;
     1389        pDstSeg = &pThis->aSegments[cSegments - 1];
     1390        pDstSeg->SegInfo.pszName = "GOT";
     1391        pDstSeg->SegInfo.cchName = 3;
     1392        pDstSeg->SegInfo.SelFlat = 0;
     1393        pDstSeg->SegInfo.Sel16bit = 0;
     1394        pDstSeg->SegInfo.fFlags = 0;
     1395        pDstSeg->SegInfo.fProt = RTMEM_PROT_READ;
     1396        pDstSeg->SegInfo.cb = cbGot + cbJmpStubs;
     1397        pDstSeg->SegInfo.Alignment = 64;
     1398        pDstSeg->SegInfo.LinkAddress = pThis->LinkAddress + pThis->GotRVA;
     1399        pDstSeg->SegInfo.offFile = -1;
     1400        pDstSeg->SegInfo.cbFile  = -1;
     1401        pDstSeg->SegInfo.RVA = pThis->GotRVA;
     1402        pDstSeg->SegInfo.cbMapped = (size_t)RTLDR_ALIGN_ADDR(cbGot + cbJmpStubs, pDstSeg->SegInfo.Alignment);
     1403
     1404        pDstSeg->iOrgSegNo = UINT32_MAX;
     1405        pDstSeg->cSections = 0;
     1406        pDstSeg->paSections = NULL;
     1407
     1408        pThis->cbImage += pDstSeg->SegInfo.cbMapped;
    14601409    }
    14611410
     
    14641413
    14651414
    1466 /** @copydoc KLDRMODOPS::pfnDestroy */
    1467 static int kldrModMachODestroy(PKLDRMOD pMod)
    1468 {
    1469     PKLDRMODMACHO pModMachO = (PKLDRMODMACHO)pMod->pvData;
     1415/**
     1416 * @interface_method_impl{RTLDROPS,pfnClose}
     1417 */
     1418static DECLCALLBACK(int) rtldrMachO_Close(PRTLDRMODINTERNAL pMod)
     1419{
     1420    PKLDRMODMACHO pThis = RT_FROM_MEMBER(pMod, KLDRMODMACHO, Core);
    14701421    int rc = 0;
    1471     KU32 i, j;
    1472     KLDRMODMACHO_ASSERT(!pModMachO->pvMapping);
    1473 
    1474     i = pMod->cSegments;
     1422    KLDRMODMACHO_ASSERT(!pThis->pvMapping);
     1423
     1424    uint32_t i = pThis->cSegments;
    14751425    while (i-- > 0)
    14761426    {
    1477         j = pModMachO->aSegments[i].cSections;
     1427        uint32_t j = pThis->aSegments[i].cSections;
    14781428        while (j-- > 0)
    14791429        {
    1480             kHlpFree(pModMachO->aSegments[i].paSections[j].paFixups);
    1481             pModMachO->aSegments[i].paSections[j].paFixups = NULL;
    1482         }
    1483     }
    1484 
    1485     if (pMod->pRdr)
    1486     {
    1487         rc = kRdrClose(pMod->pRdr);
    1488         pMod->pRdr = NULL;
    1489     }
    1490     pMod->u32Magic = 0;
    1491     pMod->pOps = NULL;
    1492     kHlpFree(pModMachO->pbLoadCommands);
    1493     pModMachO->pbLoadCommands = NULL;
    1494     kHlpFree(pModMachO->pchStrings);
    1495     pModMachO->pchStrings = NULL;
    1496     kHlpFree(pModMachO->pvaSymbols);
    1497     pModMachO->pvaSymbols = NULL;
    1498     kHlpFree(pModMachO);
     1430            RTMemFree(pThis->aSegments[i].paSections[j].paFixups);
     1431            pThis->aSegments[i].paSections[j].paFixups = NULL;
     1432        }
     1433    }
     1434
     1435    if (pThis->Core.pReader)
     1436    {
     1437        rc = pThis->Core.pReader->pfnDestroy(pThis->Core.pReader);
     1438        pThis->Core.pReader = NULL;
     1439    }
     1440    pThis->Core.u32Magic = 0;
     1441    pThis->Core.pOps = NULL;
     1442    RTMemFree(pThis->pbLoadCommands);
     1443    pThis->pbLoadCommands = NULL;
     1444    RTMemFree(pThis->pchStrings);
     1445    pThis->pchStrings = NULL;
     1446    RTMemFree(pThis->pvaSymbols);
     1447    pThis->pvaSymbols = NULL;
     1448    RTMemFree(pThis);
    14991449    return rc;
    15001450}
     
    15061456 * @returns 0 on success.
    15071457 * @returns A non-zero status code if the BaseAddress isn't right.
    1508  * @param   pModMachO       The interpreter module instance
     1458 * @param   pThis       The interpreter module instance
    15091459 * @param   pBaseAddress    The base address, IN & OUT. Optional.
    15101460 */
    1511 static int kldrModMachOAdjustBaseAddress(PKLDRMODMACHO pModMachO, PKLDRADDR pBaseAddress)
     1461static int kldrModMachOAdjustBaseAddress(PKLDRMODMACHO pThis, PRTLDRADDR pBaseAddress)
    15121462{
    15131463    /*
    15141464     * Adjust the base address.
    15151465     */
    1516     if (*pBaseAddress == KLDRMOD_BASEADDRESS_MAP)
    1517         *pBaseAddress = pModMachO->pMod->aSegments[0].MapAddress;
    1518     else if (*pBaseAddress == KLDRMOD_BASEADDRESS_LINK)
    1519         *pBaseAddress = pModMachO->LinkAddress;
    1520 
     1466    if (*pBaseAddress == RTLDR_BASEADDRESS_LINK)
     1467        *pBaseAddress = pThis->LinkAddress;
    15211468    return 0;
    15221469}
     
    15291476 * and segments.  This function checks for these and returns the right value.
    15301477 *
    1531  * @returns 0 or KLDR_ERR_SYMBOL_NOT_FOUND.
    1532  * @param   pModMachO           The interpreter module instance.
    1533  * @param   pMod                The generic module instance.
     1478 * @returns 0 or VERR_SYMBOL_NOT_FOUND.
     1479 * @param   pThis           The interpreter module instance.
    15341480 * @param   pchSymbol           The symbol.
    15351481 * @param   cchSymbol           The length of the symbol.
     
    15381484 * @param   puValue             Where to return the symbol value.
    15391485 */
    1540 static int kldrModMachOQueryLinkerSymbol(PKLDRMODMACHO pModMachO, PKLDRMOD pMod, const char *pchSymbol, KSIZE cchSymbol,
    1541                                          KLDRADDR BaseAddress, PKLDRADDR puValue)
     1486static int kldrModMachOQueryLinkerSymbol(PKLDRMODMACHO pThis, const char *pchSymbol, size_t cchSymbol,
     1487                                         RTLDRADDR BaseAddress, PRTLDRADDR puValue)
    15421488{
    15431489    /*
     
    15471493    {
    15481494        const char *pszPrefix;
    1549         KU8         cchPrefix;
    1550         KBOOL       fSection;
    1551         KBOOL       fStart;
     1495        uint32_t    cchPrefix;
     1496        bool        fSection;
     1497        bool        fStart;
    15521498    }   s_aPrefixes[] =
    15531499    {
    1554         { "section$start$",  (KU8)sizeof("section$start$") - 1,   K_TRUE,  K_TRUE },
    1555         { "section$end$",    (KU8)sizeof("section$end$") - 1,     K_TRUE,  K_FALSE},
    1556         { "segment$start$",  (KU8)sizeof("segment$start$") - 1,   K_FALSE, K_TRUE },
    1557         { "segment$end$",    (KU8)sizeof("segment$end$") - 1,     K_FALSE, K_FALSE},
     1500        { "section$start$",  (uint8_t)sizeof("section$start$") - 1,   true,  true },
     1501        { "section$end$",    (uint8_t)sizeof("section$end$") - 1,     true,  false},
     1502        { "segment$start$",  (uint8_t)sizeof("segment$start$") - 1,   false, true },
     1503        { "segment$end$",    (uint8_t)sizeof("segment$end$") - 1,     false, false},
    15581504    };
    1559     KSIZE       cchSectName = 0;
     1505    size_t      cchSectName = 0;
    15601506    const char *pchSectName = "";
    1561     KSIZE       cchSegName  = 0;
     1507    size_t      cchSegName  = 0;
    15621508    const char *pchSegName  = NULL;
    1563     KU32        iPrefix     = K_ELEMENTS(s_aPrefixes) - 1;
    1564     KU32        iSeg;
    1565     KLDRADDR    uValue;
     1509    uint32_t    iPrefix     = RT_ELEMENTS(s_aPrefixes) - 1;
     1510    uint32_t    iSeg;
     1511    RTLDRADDR   uValue;
    15661512
    15671513    for (;;)
    15681514    {
    1569         KU8 const cchPrefix = s_aPrefixes[iPrefix].cchPrefix;
     1515        uint8_t const cchPrefix = s_aPrefixes[iPrefix].cchPrefix;
    15701516        if (   cchSymbol > cchPrefix
    1571             && kHlpStrNComp(pchSymbol, s_aPrefixes[iPrefix].pszPrefix, cchPrefix) == 0)
     1517            && strncmp(pchSymbol, s_aPrefixes[iPrefix].pszPrefix, cchPrefix) == 0)
    15721518        {
    15731519            pchSegName = pchSymbol + cchPrefix;
     
    15781524        /* next */
    15791525        if (!iPrefix)
    1580             return KLDR_ERR_SYMBOL_NOT_FOUND;
     1526            return VERR_SYMBOL_NOT_FOUND;
    15811527        iPrefix--;
    15821528    }
     
    15871533    if (s_aPrefixes[iPrefix].fSection)
    15881534    {
    1589         pchSectName = kHlpMemChr(pchSegName, '$', cchSegName);
     1535        pchSectName = (const char *)memchr(pchSegName, '$', cchSegName);
    15901536        if (!pchSectName)
    1591             return KLDR_ERR_SYMBOL_NOT_FOUND;
     1537            return VERR_SYMBOL_NOT_FOUND;
    15921538        cchSegName  = pchSectName - pchSegName;
    15931539        pchSectName++;
     
    15981544     * Locate the segment.
    15991545     */
    1600     if (!pMod->cSegments)
    1601         return KLDR_ERR_SYMBOL_NOT_FOUND;
    1602     for (iSeg = 0; iSeg < pMod->cSegments; iSeg++)
    1603     {
    1604         if (   pMod->aSegments[iSeg].cchName >= cchSegName
    1605             && kHlpMemComp(pMod->aSegments[iSeg].pchName, pchSegName, cchSegName) == 0)
     1546    if (!pThis->cSegments)
     1547        return VERR_SYMBOL_NOT_FOUND;
     1548    for (iSeg = 0; iSeg < pThis->cSegments; iSeg++)
     1549    {
     1550        if (   pThis->aSegments[iSeg].SegInfo.cchName >= cchSegName
     1551            && memcmp(pThis->aSegments[iSeg].SegInfo.pszName, pchSegName, cchSegName) == 0)
    16061552        {
    16071553            section_32_t const *pSect;
    1608             if (   pMod->aSegments[iSeg].cchName == cchSegName
    1609                 && pModMachO->Hdr.filetype != MH_OBJECT /* Good enough for __DWARF segs in MH_DHSYM, I hope. */)
     1554            if (   pThis->aSegments[iSeg].SegInfo.cchName == cchSegName
     1555                && pThis->Hdr.filetype != MH_OBJECT /* Good enough for __DWARF segs in MH_DHSYM, I hope. */)
    16101556                break;
    16111557
    1612             pSect = (section_32_t *)pModMachO->aSegments[iSeg].paSections[0].pvMachoSection;
    1613             if (   pModMachO->uEffFileType == MH_OBJECT
    1614                 && pMod->aSegments[iSeg].cchName > cchSegName + 1
    1615                 && pMod->aSegments[iSeg].pchName[cchSegName] == '.'
    1616                 && kHlpStrNComp(&pMod->aSegments[iSeg].pchName[cchSegName + 1], pSect->sectname, sizeof(pSect->sectname)) == 0
    1617                 && pMod->aSegments[iSeg].cchName - cchSegName - 1 <= sizeof(pSect->sectname) )
     1558            pSect = (section_32_t *)pThis->aSegments[iSeg].paSections[0].pvMachoSection;
     1559            if (   pThis->uEffFileType == MH_OBJECT
     1560                && pThis->aSegments[iSeg].SegInfo.cchName > cchSegName + 1
     1561                && pThis->aSegments[iSeg].SegInfo.pszName[cchSegName] == '.'
     1562                && strncmp(&pThis->aSegments[iSeg].SegInfo.pszName[cchSegName + 1], pSect->sectname, sizeof(pSect->sectname)) == 0
     1563                && pThis->aSegments[iSeg].SegInfo.cchName - cchSegName - 1 <= sizeof(pSect->sectname) )
    16181564                break;
    16191565        }
    16201566    }
    1621     if (iSeg >= pMod->cSegments)
    1622         return KLDR_ERR_SYMBOL_NOT_FOUND;
     1567    if (iSeg >= pThis->cSegments)
     1568        return VERR_SYMBOL_NOT_FOUND;
    16231569
    16241570    if (!s_aPrefixes[iPrefix].fSection)
     
    16271573         * Calculate the segment start/end address.
    16281574         */
    1629         uValue = pMod->aSegments[iSeg].RVA;
     1575        uValue = pThis->aSegments[iSeg].SegInfo.RVA;
    16301576        if (!s_aPrefixes[iPrefix].fStart)
    1631             uValue += pMod->aSegments[iSeg].cb;
     1577            uValue += pThis->aSegments[iSeg].SegInfo.cb;
    16321578    }
    16331579    else
     
    16361582         * Locate the section.
    16371583         */
    1638         KU32 iSect = pModMachO->aSegments[iSeg].cSections;
     1584        uint32_t iSect = pThis->aSegments[iSeg].cSections;
    16391585        if (!iSect)
    1640             return KLDR_ERR_SYMBOL_NOT_FOUND;
     1586            return VERR_SYMBOL_NOT_FOUND;
    16411587        for (;;)
    16421588        {
    1643             section_32_t *pSect = (section_32_t *)pModMachO->aSegments[iSeg].paSections[iSect].pvMachoSection;
     1589            section_32_t *pSect = (section_32_t *)pThis->aSegments[iSeg].paSections[iSect].pvMachoSection;
    16441590            if (   cchSectName <= sizeof(pSect->sectname)
    1645                 && kHlpMemComp(pSect->sectname, pchSectName, cchSectName) == 0
     1591                && memcmp(pSect->sectname, pchSectName, cchSectName) == 0
    16461592                && (   cchSectName == sizeof(pSect->sectname)
    16471593                    || pSect->sectname[cchSectName] == '\0') )
     
    16491595            /* next */
    16501596            if (!iSect)
    1651                 return KLDR_ERR_SYMBOL_NOT_FOUND;
     1597                return VERR_SYMBOL_NOT_FOUND;
    16521598            iSect--;
    16531599        }
    16541600
    1655         uValue = pModMachO->aSegments[iSeg].paSections[iSect].RVA;
     1601        uValue = pThis->aSegments[iSeg].paSections[iSect].RVA;
    16561602        if (!s_aPrefixes[iPrefix].fStart)
    1657             uValue += pModMachO->aSegments[iSeg].paSections[iSect].cb;
     1603            uValue += pThis->aSegments[iSeg].paSections[iSect].cb;
    16581604    }
    16591605
     
    16691615
    16701616
    1671 /** @copydoc kLdrModQuerySymbol */
    1672 static int kldrModMachOQuerySymbol(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, KU32 iSymbol,
    1673                                    const char *pchSymbol, KSIZE cchSymbol, const char *pszVersion,
    1674                                    PFNKLDRMODGETIMPORT pfnGetForwarder, void *pvUser, PKLDRADDR puValue, KU32 *pfKind)
    1675 {
    1676     PKLDRMODMACHO pModMachO = (PKLDRMODMACHO)pMod->pvData;
    1677     int rc;
    1678     K_NOREF(pvBits);
    1679     K_NOREF(pszVersion);
    1680     K_NOREF(pfnGetForwarder);
    1681     K_NOREF(pvUser);
     1617/**
     1618 * @interface_method_impl{RTLDROPS,pfnGetSymbolEx}
     1619 */
     1620static DECLCALLBACK(int) rtldrMachO_GetSymbolEx(PRTLDRMODINTERNAL pMod, const void *pvBits, RTUINTPTR BaseAddress,
     1621                                                uint32_t iOrdinal, const char *pszSymbol, RTUINTPTR *pValue)
     1622{
     1623    PKLDRMODMACHO pThis = RT_FROM_MEMBER(pMod, KLDRMODMACHO, Core);
     1624    RT_NOREF(pvBits);
     1625    //RT_NOREF(pszVersion);
     1626    //RT_NOREF(pfnGetForwarder);
     1627    //RT_NOREF(pvUser);
     1628    uint32_t fKind = RTLDRSYMKIND_REQ_FLAT;
     1629    uint32_t *pfKind = &fKind;
     1630    size_t cchSymbol = pszSymbol ? strlen(pszSymbol) : 0;
    16821631
    16831632    /*
    16841633     * Resolve defaults.
    16851634     */
    1686     rc  = kldrModMachOAdjustBaseAddress(pModMachO, &BaseAddress);
     1635    int rc = kldrModMachOAdjustBaseAddress(pThis, &BaseAddress);
    16871636    if (rc)
    16881637        return rc;
     
    16921641     */
    16931642    KLDRMODMACHO_CHECK_RETURN(   !pfKind
    1694                               || (*pfKind & KLDRSYMKIND_REQ_TYPE_MASK) == KLDRSYMKIND_REQ_FLAT,
    1695                               KLDR_ERR_TODO);
     1643                              || (*pfKind & RTLDRSYMKIND_REQ_TYPE_MASK) == RTLDRSYMKIND_REQ_FLAT,
     1644                              VERR_LDRMACHO_TODO);
    16961645
    16971646    /*
    16981647     * Take action according to file type.
    16991648     */
    1700     if (   pModMachO->Hdr.filetype == MH_OBJECT
    1701         || pModMachO->Hdr.filetype == MH_EXECUTE /** @todo dylib, execute, dsym: symbols */
    1702         || pModMachO->Hdr.filetype == MH_DYLIB
    1703         || pModMachO->Hdr.filetype == MH_BUNDLE
    1704         || pModMachO->Hdr.filetype == MH_DSYM
    1705         || pModMachO->Hdr.filetype == MH_KEXT_BUNDLE)
    1706     {
    1707         rc = kldrModMachOLoadObjSymTab(pModMachO);
     1649    if (   pThis->Hdr.filetype == MH_OBJECT
     1650        || pThis->Hdr.filetype == MH_EXECUTE /** @todo dylib, execute, dsym: symbols */
     1651        || pThis->Hdr.filetype == MH_DYLIB
     1652        || pThis->Hdr.filetype == MH_BUNDLE
     1653        || pThis->Hdr.filetype == MH_DSYM
     1654        || pThis->Hdr.filetype == MH_KEXT_BUNDLE)
     1655    {
     1656        rc = kldrModMachOLoadObjSymTab(pThis);
    17081657        if (!rc)
    17091658        {
    1710             if (    pModMachO->Hdr.magic == IMAGE_MACHO32_SIGNATURE
    1711                 ||  pModMachO->Hdr.magic == IMAGE_MACHO32_SIGNATURE_OE)
    1712                 rc = kldrModMachODoQuerySymbol32Bit(pModMachO, (macho_nlist_32_t *)pModMachO->pvaSymbols, pModMachO->cSymbols,
    1713                                                     pModMachO->pchStrings, pModMachO->cchStrings, BaseAddress, iSymbol, pchSymbol,
    1714                                                     (KU32)cchSymbol, puValue, pfKind);
     1659            if (    pThis->Hdr.magic == IMAGE_MACHO32_SIGNATURE
     1660                ||  pThis->Hdr.magic == IMAGE_MACHO32_SIGNATURE_OE)
     1661                rc = kldrModMachODoQuerySymbol32Bit(pThis, (macho_nlist_32_t *)pThis->pvaSymbols, pThis->cSymbols,
     1662                                                    pThis->pchStrings, pThis->cchStrings, BaseAddress, iOrdinal, pszSymbol,
     1663                                                    (uint32_t)cchSymbol, pValue, pfKind);
    17151664            else
    1716                 rc = kldrModMachODoQuerySymbol64Bit(pModMachO, (macho_nlist_64_t *)pModMachO->pvaSymbols, pModMachO->cSymbols,
    1717                                                     pModMachO->pchStrings, pModMachO->cchStrings, BaseAddress, iSymbol, pchSymbol,
    1718                                                     (KU32)cchSymbol, puValue, pfKind);
     1665                rc = kldrModMachODoQuerySymbol64Bit(pThis, (macho_nlist_64_t *)pThis->pvaSymbols, pThis->cSymbols,
     1666                                                    pThis->pchStrings, pThis->cchStrings, BaseAddress, iOrdinal, pszSymbol,
     1667                                                    (uint32_t)cchSymbol, pValue, pfKind);
    17191668        }
    17201669
     
    17251674         * before querying symbols, we will ignore the prefix.
    17261675         */
    1727         if (  rc == KLDR_ERR_SYMBOL_NOT_FOUND
     1676        if (  rc == VERR_SYMBOL_NOT_FOUND
    17281677            && cchSymbol > sizeof("section$end$") - 1
    1729             && (    pchSymbol[0] == 's'
    1730                 || (pchSymbol[1] == 's' && pchSymbol[0] == '_') )
    1731             && kHlpMemChr(pchSymbol, '$', cchSymbol) )
    1732         {
    1733             if (pchSymbol[0] == '_')
    1734                 rc = kldrModMachOQueryLinkerSymbol(pModMachO, pMod, pchSymbol + 1, cchSymbol - 1, BaseAddress, puValue);
     1678            && (    pszSymbol[0] == 's'
     1679                || (pszSymbol[1] == 's' && pszSymbol[0] == '_') )
     1680            && memchr(pszSymbol, '$', cchSymbol) )
     1681        {
     1682            if (pszSymbol[0] == '_')
     1683                rc = kldrModMachOQueryLinkerSymbol(pThis, pszSymbol + 1, cchSymbol - 1, BaseAddress, pValue);
    17351684            else
    1736                 rc = kldrModMachOQueryLinkerSymbol(pModMachO, pMod, pchSymbol, cchSymbol, BaseAddress, puValue);
     1685                rc = kldrModMachOQueryLinkerSymbol(pThis, pszSymbol, cchSymbol, BaseAddress, pValue);
    17371686        }
    17381687    }
    17391688    else
    1740         rc = KLDR_ERR_TODO;
     1689        rc = VERR_LDRMACHO_TODO;
    17411690
    17421691    return rc;
     
    17481697 *
    17491698 * @returns See kLdrModQuerySymbol.
    1750  * @param   pModMachO
     1699 * @param   pThis
    17511700 * @param   paSyms      Pointer to the symbol table.
    17521701 * @param   cSyms       Number of symbols in the table.
     
    17601709 * @param   pfKind      See kLdrModQuerySymbol.
    17611710 */
    1762 static int kldrModMachODoQuerySymbol32Bit(PKLDRMODMACHO pModMachO, const macho_nlist_32_t *paSyms, KU32 cSyms,
    1763                                           const char *pchStrings, KU32 cchStrings, KLDRADDR BaseAddress, KU32 iSymbol,
    1764                                           const char *pchSymbol, KU32 cchSymbol, PKLDRADDR puValue, KU32 *pfKind)
     1711static int kldrModMachODoQuerySymbol32Bit(PKLDRMODMACHO pThis, const macho_nlist_32_t *paSyms, uint32_t cSyms,
     1712                                          const char *pchStrings, uint32_t cchStrings, RTLDRADDR BaseAddress, uint32_t iSymbol,
     1713                                          const char *pchSymbol, uint32_t cchSymbol, PRTLDRADDR puValue, uint32_t *pfKind)
    17651714{
    17661715    /*
    17671716     * Find a valid symbol matching the search criteria.
    17681717     */
    1769     if (iSymbol == NIL_KLDRMOD_SYM_ORDINAL)
     1718    if (iSymbol == UINT32_MAX)
    17701719    {
    17711720        /* simplify validation. */
    17721721        if (cchStrings <= cchSymbol)
    1773             return KLDR_ERR_SYMBOL_NOT_FOUND;
     1722            return VERR_SYMBOL_NOT_FOUND;
    17741723        cchStrings -= cchSymbol;
    17751724
    17761725        /* external symbols are usually at the end, so search the other way. */
    1777         for (iSymbol = cSyms - 1; iSymbol != KU32_MAX; iSymbol--)
     1726        for (iSymbol = cSyms - 1; iSymbol != UINT32_MAX; iSymbol--)
    17781727        {
    17791728            const char *psz;
     
    17921741            if (!paSyms[iSymbol].n_un.n_strx)
    17931742                continue;
    1794             if ((KU32)paSyms[iSymbol].n_un.n_strx >= cchStrings)
     1743            if ((uint32_t)paSyms[iSymbol].n_un.n_strx >= cchStrings)
    17951744                continue;
    17961745            psz = &pchStrings[paSyms[iSymbol].n_un.n_strx];
    17971746            if (psz[cchSymbol])
    17981747                continue;
    1799             if (kHlpMemComp(psz, pchSymbol, cchSymbol))
     1748            if (memcmp(psz, pchSymbol, cchSymbol))
    18001749                continue;
    18011750
     
    18031752            break;
    18041753        }
    1805         if (iSymbol == KU32_MAX)
    1806             return KLDR_ERR_SYMBOL_NOT_FOUND;
     1754        if (iSymbol == UINT32_MAX)
     1755            return VERR_SYMBOL_NOT_FOUND;
    18071756    }
    18081757    else
    18091758    {
    18101759        if (iSymbol >= cSyms)
    1811             return KLDR_ERR_SYMBOL_NOT_FOUND;
     1760            return VERR_SYMBOL_NOT_FOUND;
    18121761        if (paSyms[iSymbol].n_type & MACHO_N_STAB)
    1813             return KLDR_ERR_SYMBOL_NOT_FOUND;
     1762            return VERR_SYMBOL_NOT_FOUND;
    18141763        if ((paSyms[iSymbol].n_type & MACHO_N_TYPE) == MACHO_N_UNDF)
    1815             return KLDR_ERR_SYMBOL_NOT_FOUND;
     1764            return VERR_SYMBOL_NOT_FOUND;
    18161765    }
    18171766
     
    18211770    if (pfKind)
    18221771    {
    1823         if (    pModMachO->Hdr.magic == IMAGE_MACHO32_SIGNATURE
    1824             ||  pModMachO->Hdr.magic == IMAGE_MACHO32_SIGNATURE_OE)
    1825             *pfKind = KLDRSYMKIND_32BIT | KLDRSYMKIND_NO_TYPE;
     1772        if (    pThis->Hdr.magic == IMAGE_MACHO32_SIGNATURE
     1773            ||  pThis->Hdr.magic == IMAGE_MACHO32_SIGNATURE_OE)
     1774            *pfKind = RTLDRSYMKIND_32BIT | RTLDRSYMKIND_NO_TYPE;
    18261775        else
    1827             *pfKind = KLDRSYMKIND_64BIT | KLDRSYMKIND_NO_TYPE;
     1776            *pfKind = RTLDRSYMKIND_64BIT | RTLDRSYMKIND_NO_TYPE;
    18281777        if (paSyms[iSymbol].n_desc & N_WEAK_DEF)
    1829             *pfKind |= KLDRSYMKIND_WEAK;
     1778            *pfKind |= RTLDRSYMKIND_WEAK;
    18301779    }
    18311780
     
    18351784        {
    18361785            PKLDRMODMACHOSECT pSect;
    1837             KLDRADDR offSect;
    1838             KLDRMODMACHO_CHECK_RETURN((KU32)(paSyms[iSymbol].n_sect - 1) < pModMachO->cSections, KLDR_ERR_MACHO_BAD_SYMBOL);
    1839             pSect = &pModMachO->paSections[paSyms[iSymbol].n_sect - 1];
     1786            RTLDRADDR offSect;
     1787            KLDRMODMACHO_CHECK_RETURN((uint32_t)(paSyms[iSymbol].n_sect - 1) < pThis->cSections, VERR_LDRMACHO_BAD_SYMBOL);
     1788            pSect = &pThis->paSections[paSyms[iSymbol].n_sect - 1];
    18401789
    18411790            offSect = paSyms[iSymbol].n_value - pSect->LinkAddress;
     
    18431792                                      || (   paSyms[iSymbol].n_sect == 1 /* special hack for __mh_execute_header */
    18441793                                          && offSect == 0U - pSect->RVA
    1845                                           && pModMachO->uEffFileType != MH_OBJECT),
    1846                                       KLDR_ERR_MACHO_BAD_SYMBOL);
     1794                                          && pThis->uEffFileType != MH_OBJECT),
     1795                                      VERR_LDRMACHO_BAD_SYMBOL);
    18471796            if (puValue)
    18481797                *puValue = BaseAddress + pSect->RVA + offSect;
     
    18501799            if (    pfKind
    18511800                &&  (pSect->fFlags & (S_ATTR_PURE_INSTRUCTIONS | S_ATTR_SELF_MODIFYING_CODE)))
    1852                 *pfKind = (*pfKind & ~KLDRSYMKIND_TYPE_MASK) | KLDRSYMKIND_CODE;
     1801                *pfKind = (*pfKind & ~RTLDRSYMKIND_TYPE_MASK) | RTLDRSYMKIND_CODE;
    18531802            break;
    18541803        }
     
    18581807                *puValue = paSyms[iSymbol].n_value;
    18591808            /*if (pfKind)
    1860                 pfKind |= KLDRSYMKIND_ABS;*/
     1809                pfKind |= RTLDRSYMKIND_ABS;*/
    18611810            break;
    18621811
     
    18651814            /** @todo implement indirect and prebound symbols. */
    18661815        default:
    1867             KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_TODO);
     1816            KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_TODO);
    18681817    }
    18691818
     
    18761825 *
    18771826 * @returns See kLdrModQuerySymbol.
    1878  * @param   pModMachO
     1827 * @param   pThis
    18791828 * @param   paSyms      Pointer to the symbol table.
    18801829 * @param   cSyms       Number of symbols in the table.
     
    18881837 * @param   pfKind      See kLdrModQuerySymbol.
    18891838 */
    1890 static int kldrModMachODoQuerySymbol64Bit(PKLDRMODMACHO pModMachO, const macho_nlist_64_t *paSyms, KU32 cSyms,
    1891                                           const char *pchStrings, KU32 cchStrings, KLDRADDR BaseAddress, KU32 iSymbol,
    1892                                           const char *pchSymbol, KU32 cchSymbol, PKLDRADDR puValue, KU32 *pfKind)
     1839static int kldrModMachODoQuerySymbol64Bit(PKLDRMODMACHO pThis, const macho_nlist_64_t *paSyms, uint32_t cSyms,
     1840                                          const char *pchStrings, uint32_t cchStrings, RTLDRADDR BaseAddress, uint32_t iSymbol,
     1841                                          const char *pchSymbol, uint32_t cchSymbol, PRTLDRADDR puValue, uint32_t *pfKind)
    18931842{
    18941843    /*
    18951844     * Find a valid symbol matching the search criteria.
    18961845     */
    1897     if (iSymbol == NIL_KLDRMOD_SYM_ORDINAL)
     1846    if (iSymbol == UINT32_MAX)
    18981847    {
    18991848        /* simplify validation. */
    19001849        if (cchStrings <= cchSymbol)
    1901             return KLDR_ERR_SYMBOL_NOT_FOUND;
     1850            return VERR_SYMBOL_NOT_FOUND;
    19021851        cchStrings -= cchSymbol;
    19031852
    19041853        /* external symbols are usually at the end, so search the other way. */
    1905         for (iSymbol = cSyms - 1; iSymbol != KU32_MAX; iSymbol--)
     1854        for (iSymbol = cSyms - 1; iSymbol != UINT32_MAX; iSymbol--)
    19061855        {
    19071856            const char *psz;
     
    19201869            if (!paSyms[iSymbol].n_un.n_strx)
    19211870                continue;
    1922             if ((KU32)paSyms[iSymbol].n_un.n_strx >= cchStrings)
     1871            if ((uint32_t)paSyms[iSymbol].n_un.n_strx >= cchStrings)
    19231872                continue;
    19241873            psz = &pchStrings[paSyms[iSymbol].n_un.n_strx];
    19251874            if (psz[cchSymbol])
    19261875                continue;
    1927             if (kHlpMemComp(psz, pchSymbol, cchSymbol))
     1876            if (memcmp(psz, pchSymbol, cchSymbol))
    19281877                continue;
    19291878
     
    19311880            break;
    19321881        }
    1933         if (iSymbol == KU32_MAX)
    1934             return KLDR_ERR_SYMBOL_NOT_FOUND;
     1882        if (iSymbol == UINT32_MAX)
     1883            return VERR_SYMBOL_NOT_FOUND;
    19351884    }
    19361885    else
    19371886    {
    19381887        if (iSymbol >= cSyms)
    1939             return KLDR_ERR_SYMBOL_NOT_FOUND;
     1888            return VERR_SYMBOL_NOT_FOUND;
    19401889        if (paSyms[iSymbol].n_type & MACHO_N_STAB)
    1941             return KLDR_ERR_SYMBOL_NOT_FOUND;
     1890            return VERR_SYMBOL_NOT_FOUND;
    19421891        if ((paSyms[iSymbol].n_type & MACHO_N_TYPE) == MACHO_N_UNDF)
    1943             return KLDR_ERR_SYMBOL_NOT_FOUND;
     1892            return VERR_SYMBOL_NOT_FOUND;
    19441893    }
    19451894
     
    19491898    if (pfKind)
    19501899    {
    1951         if (    pModMachO->Hdr.magic == IMAGE_MACHO32_SIGNATURE
    1952             ||  pModMachO->Hdr.magic == IMAGE_MACHO32_SIGNATURE_OE)
    1953             *pfKind = KLDRSYMKIND_32BIT | KLDRSYMKIND_NO_TYPE;
     1900        if (    pThis->Hdr.magic == IMAGE_MACHO32_SIGNATURE
     1901            ||  pThis->Hdr.magic == IMAGE_MACHO32_SIGNATURE_OE)
     1902            *pfKind = RTLDRSYMKIND_32BIT | RTLDRSYMKIND_NO_TYPE;
    19541903        else
    1955             *pfKind = KLDRSYMKIND_64BIT | KLDRSYMKIND_NO_TYPE;
     1904            *pfKind = RTLDRSYMKIND_64BIT | RTLDRSYMKIND_NO_TYPE;
    19561905        if (paSyms[iSymbol].n_desc & N_WEAK_DEF)
    1957             *pfKind |= KLDRSYMKIND_WEAK;
     1906            *pfKind |= RTLDRSYMKIND_WEAK;
    19581907    }
    19591908
     
    19631912        {
    19641913            PKLDRMODMACHOSECT pSect;
    1965             KLDRADDR offSect;
    1966             KLDRMODMACHO_CHECK_RETURN((KU32)(paSyms[iSymbol].n_sect - 1) < pModMachO->cSections, KLDR_ERR_MACHO_BAD_SYMBOL);
    1967             pSect = &pModMachO->paSections[paSyms[iSymbol].n_sect - 1];
     1914            RTLDRADDR offSect;
     1915            KLDRMODMACHO_CHECK_RETURN((uint32_t)(paSyms[iSymbol].n_sect - 1) < pThis->cSections, VERR_LDRMACHO_BAD_SYMBOL);
     1916            pSect = &pThis->paSections[paSyms[iSymbol].n_sect - 1];
    19681917
    19691918            offSect = paSyms[iSymbol].n_value - pSect->LinkAddress;
     
    19711920                                      || (   paSyms[iSymbol].n_sect == 1 /* special hack for __mh_execute_header */
    19721921                                          && offSect == 0U - pSect->RVA
    1973                                           && pModMachO->uEffFileType != MH_OBJECT),
    1974                                       KLDR_ERR_MACHO_BAD_SYMBOL);
     1922                                          && pThis->uEffFileType != MH_OBJECT),
     1923                                      VERR_LDRMACHO_BAD_SYMBOL);
    19751924            if (puValue)
    19761925                *puValue = BaseAddress + pSect->RVA + offSect;
     
    19781927            if (    pfKind
    19791928                &&  (pSect->fFlags & (S_ATTR_PURE_INSTRUCTIONS | S_ATTR_SELF_MODIFYING_CODE)))
    1980                 *pfKind = (*pfKind & ~KLDRSYMKIND_TYPE_MASK) | KLDRSYMKIND_CODE;
     1929                *pfKind = (*pfKind & ~RTLDRSYMKIND_TYPE_MASK) | RTLDRSYMKIND_CODE;
    19811930            break;
    19821931        }
     
    19861935                *puValue = paSyms[iSymbol].n_value;
    19871936            /*if (pfKind)
    1988                 pfKind |= KLDRSYMKIND_ABS;*/
     1937                pfKind |= RTLDRSYMKIND_ABS;*/
    19891938            break;
    19901939
     
    19931942            /** @todo implement indirect and prebound symbols. */
    19941943        default:
    1995             KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_TODO);
     1944            KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_TODO);
    19961945    }
    19971946
     
    20001949
    20011950
    2002 /** @copydoc kLdrModEnumSymbols */
    2003 static int kldrModMachOEnumSymbols(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress,
    2004                                    KU32 fFlags, PFNKLDRMODENUMSYMS pfnCallback, void *pvUser)
    2005 {
    2006     PKLDRMODMACHO pModMachO = (PKLDRMODMACHO)pMod->pvData;
     1951/**
     1952 * @interface_method_impl{RTLDROPS,pfnEnumSymbols}
     1953 */
     1954static DECLCALLBACK(int) rtldrMachO_EnumSymbols(PRTLDRMODINTERNAL pMod, unsigned fFlags, const void *pvBits,
     1955                                                RTUINTPTR BaseAddress, PFNRTLDRENUMSYMS pfnCallback, void *pvUser)
     1956{
     1957    PKLDRMODMACHO pThis = RT_FROM_MEMBER(pMod, KLDRMODMACHO, Core);
    20071958    int rc;
    2008     K_NOREF(pvBits);
     1959    RT_NOREF(pvBits);
    20091960
    20101961    /*
    20111962     * Resolve defaults.
    20121963     */
    2013     rc  = kldrModMachOAdjustBaseAddress(pModMachO, &BaseAddress);
     1964    rc  = kldrModMachOAdjustBaseAddress(pThis, &BaseAddress);
    20141965    if (rc)
    20151966        return rc;
     
    20181969     * Take action according to file type.
    20191970     */
    2020     if (   pModMachO->Hdr.filetype == MH_OBJECT
    2021         || pModMachO->Hdr.filetype == MH_EXECUTE /** @todo dylib, execute, dsym: symbols */
    2022         || pModMachO->Hdr.filetype == MH_DYLIB
    2023         || pModMachO->Hdr.filetype == MH_BUNDLE
    2024         || pModMachO->Hdr.filetype == MH_DSYM
    2025         || pModMachO->Hdr.filetype == MH_KEXT_BUNDLE)
    2026     {
    2027         rc = kldrModMachOLoadObjSymTab(pModMachO);
     1971    if (   pThis->Hdr.filetype == MH_OBJECT
     1972        || pThis->Hdr.filetype == MH_EXECUTE /** @todo dylib, execute, dsym: symbols */
     1973        || pThis->Hdr.filetype == MH_DYLIB
     1974        || pThis->Hdr.filetype == MH_BUNDLE
     1975        || pThis->Hdr.filetype == MH_DSYM
     1976        || pThis->Hdr.filetype == MH_KEXT_BUNDLE)
     1977    {
     1978        rc = kldrModMachOLoadObjSymTab(pThis);
    20281979        if (!rc)
    20291980        {
    2030             if (    pModMachO->Hdr.magic == IMAGE_MACHO32_SIGNATURE
    2031                 ||  pModMachO->Hdr.magic == IMAGE_MACHO32_SIGNATURE_OE)
    2032                 rc = kldrModMachODoEnumSymbols32Bit(pModMachO, (macho_nlist_32_t *)pModMachO->pvaSymbols, pModMachO->cSymbols,
    2033                                                     pModMachO->pchStrings, pModMachO->cchStrings, BaseAddress,
     1981            if (    pThis->Hdr.magic == IMAGE_MACHO32_SIGNATURE
     1982                ||  pThis->Hdr.magic == IMAGE_MACHO32_SIGNATURE_OE)
     1983                rc = kldrModMachODoEnumSymbols32Bit(pThis, (macho_nlist_32_t *)pThis->pvaSymbols, pThis->cSymbols,
     1984                                                    pThis->pchStrings, pThis->cchStrings, BaseAddress,
    20341985                                                    fFlags, pfnCallback, pvUser);
    20351986            else
    2036                 rc = kldrModMachODoEnumSymbols64Bit(pModMachO, (macho_nlist_64_t *)pModMachO->pvaSymbols, pModMachO->cSymbols,
    2037                                                     pModMachO->pchStrings, pModMachO->cchStrings, BaseAddress,
     1987                rc = kldrModMachODoEnumSymbols64Bit(pThis, (macho_nlist_64_t *)pThis->pvaSymbols, pThis->cSymbols,
     1988                                                    pThis->pchStrings, pThis->cchStrings, BaseAddress,
    20381989                                                    fFlags, pfnCallback, pvUser);
    20391990        }
    20401991    }
    20411992    else
    2042         KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_TODO);
     1993        KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_TODO);
    20431994
    20441995    return rc;
     
    20502001 *
    20512002 * @returns See kLdrModQuerySymbol.
    2052  * @param   pModMachO
     2003 * @param   pThis
    20532004 * @param   paSyms      Pointer to the symbol table.
    20542005 * @param   cSyms       Number of symbols in the table.
     
    20602011 * @param   pvUser      See kLdrModEnumSymbols.
    20612012 */
    2062 static int kldrModMachODoEnumSymbols32Bit(PKLDRMODMACHO pModMachO, const macho_nlist_32_t *paSyms, KU32 cSyms,
    2063                                           const char *pchStrings, KU32 cchStrings, KLDRADDR BaseAddress,
    2064                                           KU32 fFlags, PFNKLDRMODENUMSYMS pfnCallback, void *pvUser)
    2065 {
    2066     const KU32 fKindBase =    pModMachO->Hdr.magic == IMAGE_MACHO32_SIGNATURE
    2067                            || pModMachO->Hdr.magic == IMAGE_MACHO32_SIGNATURE_OE
    2068                          ? KLDRSYMKIND_32BIT : KLDRSYMKIND_64BIT;
    2069     KU32 iSym;
     2013static int kldrModMachODoEnumSymbols32Bit(PKLDRMODMACHO pThis, const macho_nlist_32_t *paSyms, uint32_t cSyms,
     2014                                          const char *pchStrings, uint32_t cchStrings, RTLDRADDR BaseAddress,
     2015                                          uint32_t fFlags, PFNRTLDRENUMSYMS pfnCallback, void *pvUser)
     2016{
     2017    const uint32_t fKindBase =    pThis->Hdr.magic == IMAGE_MACHO32_SIGNATURE
     2018                           || pThis->Hdr.magic == IMAGE_MACHO32_SIGNATURE_OE
     2019                         ? RTLDRSYMKIND_32BIT : RTLDRSYMKIND_64BIT;
     2020    uint32_t iSym;
    20702021    int rc;
    20712022
     
    20752026    for (iSym = 0; iSym < cSyms; iSym++)
    20762027    {
    2077         KU32 fKind;
    2078         KLDRADDR uValue;
     2028        uint32_t fKind;
     2029        RTLDRADDR uValue;
    20792030        const char *psz;
    2080         KSIZE cch;
     2031        size_t cch;
    20812032
    20822033        /* Skip debug symbols and undefined symbols. */
     
    20872038
    20882039        /* Skip non-public symbols unless they are requested explicitly. */
    2089         if (!(fFlags & KLDRMOD_ENUM_SYMS_FLAGS_ALL))
     2040        if (!(fFlags & RTLDR_ENUM_SYMBOL_FLAGS_ALL))
    20902041        {
    20912042            if (!(paSyms[iSym].n_type & MACHO_N_EXT)) /*??*/
     
    21022053
    21032054        /* name */
    2104         KLDRMODMACHO_CHECK_RETURN((KU32)paSyms[iSym].n_un.n_strx < cchStrings, KLDR_ERR_MACHO_BAD_SYMBOL);
     2055        KLDRMODMACHO_CHECK_RETURN((uint32_t)paSyms[iSym].n_un.n_strx < cchStrings, VERR_LDRMACHO_BAD_SYMBOL);
    21052056        psz = &pchStrings[paSyms[iSym].n_un.n_strx];
    2106         cch = kHlpStrLen(psz);
     2057        cch = strlen(psz);
    21072058        if (!cch)
    21082059            psz = NULL;
     
    21112062        fKind = fKindBase;
    21122063        if (paSyms[iSym].n_desc & N_WEAK_DEF)
    2113             fKind |= KLDRSYMKIND_WEAK;
     2064            fKind |= RTLDRSYMKIND_WEAK;
    21142065        switch (paSyms[iSym].n_type & MACHO_N_TYPE)
    21152066        {
     
    21172068            {
    21182069                PKLDRMODMACHOSECT pSect;
    2119                 KLDRMODMACHO_CHECK_RETURN((KU32)(paSyms[iSym].n_sect - 1) < pModMachO->cSections, KLDR_ERR_MACHO_BAD_SYMBOL);
    2120                 pSect = &pModMachO->paSections[paSyms[iSym].n_sect - 1];
     2070                KLDRMODMACHO_CHECK_RETURN((uint32_t)(paSyms[iSym].n_sect - 1) < pThis->cSections, VERR_LDRMACHO_BAD_SYMBOL);
     2071                pSect = &pThis->paSections[paSyms[iSym].n_sect - 1];
    21212072
    21222073                uValue = paSyms[iSym].n_value - pSect->LinkAddress;
     
    21242075                                          || (   paSyms[iSym].n_sect == 1 /* special hack for __mh_execute_header */
    21252076                                              && uValue == 0U - pSect->RVA
    2126                                               && pModMachO->uEffFileType != MH_OBJECT),
    2127                                           KLDR_ERR_MACHO_BAD_SYMBOL);
     2077                                              && pThis->uEffFileType != MH_OBJECT),
     2078                                          VERR_LDRMACHO_BAD_SYMBOL);
    21282079                uValue += BaseAddress + pSect->RVA;
    21292080
    21302081                if (pSect->fFlags & (S_ATTR_PURE_INSTRUCTIONS | S_ATTR_SELF_MODIFYING_CODE))
    2131                     fKind |= KLDRSYMKIND_CODE;
     2082                    fKind |= RTLDRSYMKIND_CODE;
    21322083                else
    2133                     fKind |= KLDRSYMKIND_NO_TYPE;
     2084                    fKind |= RTLDRSYMKIND_NO_TYPE;
    21342085                break;
    21352086            }
     
    21372088            case MACHO_N_ABS:
    21382089                uValue = paSyms[iSym].n_value;
    2139                 fKind |= KLDRSYMKIND_NO_TYPE /*KLDRSYMKIND_ABS*/;
     2090                fKind |= RTLDRSYMKIND_NO_TYPE /*RTLDRSYMKIND_ABS*/;
    21402091                break;
    21412092
     
    21442095                /** @todo implement indirect and prebound symbols. */
    21452096            default:
    2146                 KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_TODO);
     2097                KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_TODO);
    21472098        }
    21482099
     
    21502101         * Do callback.
    21512102         */
    2152         rc = pfnCallback(pModMachO->pMod, iSym, psz, cch, NULL, uValue, fKind, pvUser);
     2103        rc = pfnCallback(&pThis->Core, psz, iSym, uValue/*, fKind*/, pvUser);
    21532104        if (rc)
    21542105            return rc;
     
    21622113 *
    21632114 * @returns See kLdrModQuerySymbol.
    2164  * @param   pModMachO
     2115 * @param   pThis
    21652116 * @param   paSyms      Pointer to the symbol table.
    21662117 * @param   cSyms       Number of symbols in the table.
     
    21722123 * @param   pvUser      See kLdrModEnumSymbols.
    21732124 */
    2174 static int kldrModMachODoEnumSymbols64Bit(PKLDRMODMACHO pModMachO, const macho_nlist_64_t *paSyms, KU32 cSyms,
    2175                                           const char *pchStrings, KU32 cchStrings, KLDRADDR BaseAddress,
    2176                                           KU32 fFlags, PFNKLDRMODENUMSYMS pfnCallback, void *pvUser)
    2177 {
    2178     const KU32 fKindBase =    pModMachO->Hdr.magic == IMAGE_MACHO64_SIGNATURE
    2179                            || pModMachO->Hdr.magic == IMAGE_MACHO64_SIGNATURE_OE
    2180                          ? KLDRSYMKIND_64BIT : KLDRSYMKIND_32BIT;
    2181     KU32 iSym;
     2125static int kldrModMachODoEnumSymbols64Bit(PKLDRMODMACHO pThis, const macho_nlist_64_t *paSyms, uint32_t cSyms,
     2126                                          const char *pchStrings, uint32_t cchStrings, RTLDRADDR BaseAddress,
     2127                                          uint32_t fFlags, PFNRTLDRENUMSYMS pfnCallback, void *pvUser)
     2128{
     2129    const uint32_t fKindBase =    pThis->Hdr.magic == IMAGE_MACHO64_SIGNATURE
     2130                           || pThis->Hdr.magic == IMAGE_MACHO64_SIGNATURE_OE
     2131                         ? RTLDRSYMKIND_64BIT : RTLDRSYMKIND_32BIT;
     2132    uint32_t iSym;
    21822133    int rc;
    21832134
     
    21872138    for (iSym = 0; iSym < cSyms; iSym++)
    21882139    {
    2189         KU32 fKind;
    2190         KLDRADDR uValue;
     2140        uint32_t fKind;
     2141        RTLDRADDR uValue;
    21912142        const char *psz;
    2192         KSIZE cch;
     2143        size_t cch;
    21932144
    21942145        /* Skip debug symbols and undefined symbols. */
     
    21992150
    22002151        /* Skip non-public symbols unless they are requested explicitly. */
    2201         if (!(fFlags & KLDRMOD_ENUM_SYMS_FLAGS_ALL))
     2152        if (!(fFlags & RTLDR_ENUM_SYMBOL_FLAGS_ALL))
    22022153        {
    22032154            if (!(paSyms[iSym].n_type & MACHO_N_EXT)) /*??*/
     
    22142165
    22152166        /* name */
    2216         KLDRMODMACHO_CHECK_RETURN((KU32)paSyms[iSym].n_un.n_strx < cchStrings, KLDR_ERR_MACHO_BAD_SYMBOL);
     2167        KLDRMODMACHO_CHECK_RETURN((uint32_t)paSyms[iSym].n_un.n_strx < cchStrings, VERR_LDRMACHO_BAD_SYMBOL);
    22172168        psz = &pchStrings[paSyms[iSym].n_un.n_strx];
    2218         cch = kHlpStrLen(psz);
     2169        cch = strlen(psz);
    22192170        if (!cch)
    22202171            psz = NULL;
     
    22232174        fKind = fKindBase;
    22242175        if (paSyms[iSym].n_desc & N_WEAK_DEF)
    2225             fKind |= KLDRSYMKIND_WEAK;
     2176            fKind |= RTLDRSYMKIND_WEAK;
    22262177        switch (paSyms[iSym].n_type & MACHO_N_TYPE)
    22272178        {
     
    22292180            {
    22302181                PKLDRMODMACHOSECT pSect;
    2231                 KLDRMODMACHO_CHECK_RETURN((KU32)(paSyms[iSym].n_sect - 1) < pModMachO->cSections, KLDR_ERR_MACHO_BAD_SYMBOL);
    2232                 pSect = &pModMachO->paSections[paSyms[iSym].n_sect - 1];
     2182                KLDRMODMACHO_CHECK_RETURN((uint32_t)(paSyms[iSym].n_sect - 1) < pThis->cSections, VERR_LDRMACHO_BAD_SYMBOL);
     2183                pSect = &pThis->paSections[paSyms[iSym].n_sect - 1];
    22332184
    22342185                uValue = paSyms[iSym].n_value - pSect->LinkAddress;
     
    22362187                                          || (   paSyms[iSym].n_sect == 1 /* special hack for __mh_execute_header */
    22372188                                              && uValue == 0U - pSect->RVA
    2238                                               && pModMachO->uEffFileType != MH_OBJECT),
    2239                                           KLDR_ERR_MACHO_BAD_SYMBOL);
     2189                                              && pThis->uEffFileType != MH_OBJECT),
     2190                                          VERR_LDRMACHO_BAD_SYMBOL);
    22402191                uValue += BaseAddress + pSect->RVA;
    22412192
    22422193                if (pSect->fFlags & (S_ATTR_PURE_INSTRUCTIONS | S_ATTR_SELF_MODIFYING_CODE))
    2243                     fKind |= KLDRSYMKIND_CODE;
     2194                    fKind |= RTLDRSYMKIND_CODE;
    22442195                else
    2245                     fKind |= KLDRSYMKIND_NO_TYPE;
     2196                    fKind |= RTLDRSYMKIND_NO_TYPE;
    22462197                break;
    22472198            }
     
    22492200            case MACHO_N_ABS:
    22502201                uValue = paSyms[iSym].n_value;
    2251                 fKind |= KLDRSYMKIND_NO_TYPE /*KLDRSYMKIND_ABS*/;
     2202                fKind |= RTLDRSYMKIND_NO_TYPE /*RTLDRSYMKIND_ABS*/;
    22522203                break;
    22532204
     
    22562207                /** @todo implement indirect and prebound symbols. */
    22572208            default:
    2258                 KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_TODO);
     2209                KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_TODO);
    22592210        }
    22602211
     
    22622213         * Do callback.
    22632214         */
    2264         rc = pfnCallback(pModMachO->pMod, iSym, psz, cch, NULL, uValue, fKind, pvUser);
     2215        rc = pfnCallback(&pThis->Core, psz, iSym, uValue/*, fKind*/, pvUser);
    22652216        if (rc)
    22662217            return rc;
     
    22692220}
    22702221
     2222#if 0
    22712223
    22722224/** @copydoc kLdrModGetImport */
    2273 static int kldrModMachOGetImport(PKLDRMOD pMod, const void *pvBits, KU32 iImport, char *pszName, KSIZE cchName)
    2274 {
    2275     PKLDRMODMACHO pModMachO = (PKLDRMODMACHO)pMod->pvData;
    2276     K_NOREF(pvBits);
    2277     K_NOREF(iImport);
    2278     K_NOREF(pszName);
    2279     K_NOREF(cchName);
    2280 
    2281     if (pModMachO->Hdr.filetype == MH_OBJECT)
     2225static int kldrModMachOGetImport(PRTLDRMODINTERNAL pMod, const void *pvBits, uint32_t iImport, char *pszName, size_t cchName)
     2226{
     2227    PKLDRMODMACHO pThis = RT_FROM_MEMBER(pMod, KLDRMODMACHO, Core);
     2228    RT_NOREF(pvBits);
     2229    RT_NOREF(iImport);
     2230    RT_NOREF(pszName);
     2231    RT_NOREF(cchName);
     2232
     2233    if (pThis->Hdr.filetype == MH_OBJECT)
    22822234        return KLDR_ERR_IMPORT_ORDINAL_OUT_OF_BOUNDS;
    22832235
     
    22872239
    22882240
     2241
    22892242/** @copydoc kLdrModNumberOfImports */
    2290 static KI32 kldrModMachONumberOfImports(PKLDRMOD pMod, const void *pvBits)
    2291 {
    2292     PKLDRMODMACHO pModMachO = (PKLDRMODMACHO)pMod->pvData;
    2293     K_NOREF(pvBits);
    2294 
    2295     if (pModMachO->Hdr.filetype == MH_OBJECT)
     2243static int32_t kldrModMachONumberOfImports(PRTLDRMODINTERNAL pMod, const void *pvBits)
     2244{
     2245    PKLDRMODMACHO pThis = RT_FROM_MEMBER(pMod, KLDRMODMACHO, Core);
     2246    RT_NOREF(pvBits);
     2247
     2248    if (pThis->Hdr.filetype == MH_OBJECT)
    22962249        return 0;
    22972250
     
    23022255
    23032256/** @copydoc kLdrModGetStackInfo */
    2304 static int kldrModMachOGetStackInfo(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, PKLDRSTACKINFO pStackInfo)
    2305 {
    2306     /*PKLDRMODMACHO pModMachO = (PKLDRMODMACHO)pMod->pvData;*/
    2307     K_NOREF(pMod);
    2308     K_NOREF(pvBits);
    2309     K_NOREF(BaseAddress);
    2310 
    2311     pStackInfo->Address = NIL_KLDRADDR;
    2312     pStackInfo->LinkAddress = NIL_KLDRADDR;
     2257static int kldrModMachOGetStackInfo(PRTLDRMODINTERNAL pMod, const void *pvBits, RTLDRADDR BaseAddress, PKLDRSTACKINFO pStackInfo)
     2258{
     2259    /*PKLDRMODMACHO pThis = RT_FROM_MEMBER(pMod, KLDRMODMACHO, Core);*/
     2260    RT_NOREF(pMod);
     2261    RT_NOREF(pvBits);
     2262    RT_NOREF(BaseAddress);
     2263
     2264    pStackInfo->Address = NIL_RTLDRADDR;
     2265    pStackInfo->LinkAddress = NIL_RTLDRADDR;
    23132266    pStackInfo->cbStack = pStackInfo->cbStackThread = 0;
    23142267    /* later */
     
    23172270}
    23182271
     2272#endif
     2273
    23192274
    23202275/** @copydoc kLdrModQueryMainEntrypoint */
    2321 static int kldrModMachOQueryMainEntrypoint(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, PKLDRADDR pMainEPAddress)
     2276static int kldrModMachOQueryMainEntrypoint(PRTLDRMODINTERNAL pMod, const void *pvBits, RTLDRADDR BaseAddress, PRTLDRADDR pMainEPAddress)
    23222277{
    23232278#if 0
    2324     PKLDRMODMACHO pModMachO = (PKLDRMODMACHO)pMod->pvData;
     2279    PKLDRMODMACHO pThis = RT_FROM_MEMBER(pMod, KLDRMODMACHO, Core);
    23252280    int rc;
    23262281
     
    23282283     * Resolve base address alias if any.
    23292284     */
    2330     rc = kldrModMachOBitsAndBaseAddress(pModMachO, NULL, &BaseAddress);
     2285    rc = kldrModMachOBitsAndBaseAddress(pThis, NULL, &BaseAddress);
    23312286    if (rc)
    23322287        return rc;
     
    23352290     * Convert the address from the header.
    23362291     */
    2337     *pMainEPAddress = pModMachO->Hdrs.OptionalHeader.AddressOfEntryPoint
    2338         ? BaseAddress + pModMachO->Hdrs.OptionalHeader.AddressOfEntryPoint
    2339         : NIL_KLDRADDR;
     2292    *pMainEPAddress = pThis->Hdrs.OptionalHeader.AddressOfEntryPoint
     2293        ? BaseAddress + pThis->Hdrs.OptionalHeader.AddressOfEntryPoint
     2294        : NIL_RTLDRADDR;
    23402295#else
    2341     *pMainEPAddress = NIL_KLDRADDR;
    2342     K_NOREF(pvBits);
    2343     K_NOREF(BaseAddress);
    2344     K_NOREF(pMod);
     2296    *pMainEPAddress = NIL_RTLDRADDR;
     2297    RT_NOREF(pvBits);
     2298    RT_NOREF(BaseAddress);
     2299    RT_NOREF(pMod);
    23452300#endif
    23462301    return 0;
     
    23492304
    23502305/** @copydoc kLdrModQueryImageUuid */
    2351 static int kldrModMachOQueryImageUuid(PKLDRMOD pMod, const void *pvBits, void *pvUuid, KSIZE cbUuid)
    2352 {
    2353     PKLDRMODMACHO pModMachO = (PKLDRMODMACHO)pMod->pvData;
    2354     K_NOREF(pvBits);
    2355 
    2356     kHlpMemSet(pvUuid, 0, cbUuid);
    2357     if (kHlpMemComp(pvUuid, pModMachO->abImageUuid, sizeof(pModMachO->abImageUuid)) == 0)
    2358         return KLDR_ERR_NO_IMAGE_UUID;
    2359 
    2360     kHlpMemCopy(pvUuid, pModMachO->abImageUuid, sizeof(pModMachO->abImageUuid));
    2361     return 0;
    2362 }
    2363 
    2364 
    2365 /** @copydoc kLdrModEnumDbgInfo */
    2366 static int kldrModMachOEnumDbgInfo(PKLDRMOD pMod, const void *pvBits, PFNKLDRENUMDBG pfnCallback, void *pvUser)
    2367 {
    2368     PKLDRMODMACHO pModMachO = (PKLDRMODMACHO)pMod->pvData;
    2369     int rc = 0;
    2370     KU32 iSect;
    2371     K_NOREF(pvBits);
    2372 
    2373     for (iSect = 0; iSect < pModMachO->cSections; iSect++)
    2374     {
    2375         section_32_t *pMachOSect = pModMachO->paSections[iSect].pvMachoSection; /* (32-bit & 64-bit starts the same way) */
     2306static int kldrModMachOQueryImageUuid(PKLDRMODMACHO pThis, const void *pvBits, void *pvUuid, size_t cbUuid)
     2307{
     2308    RT_NOREF(pvBits);
     2309
     2310    memset(pvUuid, 0, cbUuid);
     2311    if (memcmp(pvUuid, pThis->abImageUuid, sizeof(pThis->abImageUuid)) == 0)
     2312        return VERR_NOT_FOUND;
     2313
     2314    memcpy(pvUuid, pThis->abImageUuid, sizeof(pThis->abImageUuid));
     2315    return VINF_SUCCESS;
     2316}
     2317
     2318
     2319/**
     2320 * @interface_method_impl{RTLDROPS,pfnEnumDbgInfo}
     2321 */
     2322static DECLCALLBACK(int) rtldrMachO_EnumDbgInfo(PRTLDRMODINTERNAL pMod, const void *pvBits, PFNRTLDRENUMDBG pfnCallback, void *pvUser)
     2323{
     2324    PKLDRMODMACHO pThis = RT_FROM_MEMBER(pMod, KLDRMODMACHO, Core);
     2325    int rc = VINF_SUCCESS;
     2326    uint32_t iSect;
     2327    RT_NOREF(pvBits);
     2328
     2329    for (iSect = 0; iSect < pThis->cSections; iSect++)
     2330    {
     2331        /* (32-bit & 64-bit starts the same way) */
     2332        section_32_t *pMachOSect = (section_32_t *)pThis->paSections[iSect].pvMachoSection;
    23762333        char          szTmp[sizeof(pMachOSect->sectname) + 1];
    23772334
    2378         if (kHlpStrComp(pMachOSect->segname, "__DWARF"))
     2335        if (strcmp(pMachOSect->segname, "__DWARF"))
    23792336            continue;
    23802337
    2381         kHlpMemCopy(szTmp, pMachOSect->sectname, sizeof(pMachOSect->sectname));
     2338        memcpy(szTmp, pMachOSect->sectname, sizeof(pMachOSect->sectname));
    23822339        szTmp[sizeof(pMachOSect->sectname)] = '\0';
    23832340
    2384         rc = pfnCallback(pMod, iSect, KLDRDBGINFOTYPE_DWARF, 0, 0, szTmp,
    2385                          pModMachO->paSections[iSect].offFile,
    2386                          pModMachO->paSections[iSect].LinkAddress,
    2387                          pModMachO->paSections[iSect].cb,
    2388                          NULL, pvUser);
    2389         if (rc != 0)
     2341        RTLDRDBGINFO DbgInfo;
     2342        DbgInfo.enmType            = RTLDRDBGINFOTYPE_DWARF;
     2343        DbgInfo.iDbgInfo           = iSect;
     2344        DbgInfo.LinkAddress        = pThis->paSections[iSect].LinkAddress;
     2345        DbgInfo.cb                 = pThis->paSections[iSect].cb;
     2346        DbgInfo.pszExtFile         = NULL;
     2347        DbgInfo.u.Dwarf.pszSection = szTmp;
     2348        rc = pfnCallback(&pThis->Core, &DbgInfo, pvUser);
     2349        if (rc != VINF_SUCCESS)
    23902350            break;
    23912351    }
     
    23942354}
    23952355
     2356#if 0
    23962357
    23972358/** @copydoc kLdrModHasDbgInfo */
    2398 static int kldrModMachOHasDbgInfo(PKLDRMOD pMod, const void *pvBits)
    2399 {
    2400     /*PKLDRMODMACHO pModMachO = (PKLDRMODMACHO)pMod->pvData;*/
     2359static int kldrModMachOHasDbgInfo(PRTLDRMODINTERNAL pMod, const void *pvBits)
     2360{
     2361    /*PKLDRMODMACHO pThis = RT_FROM_MEMBER(pMod, KLDRMODMACHO, Core);*/
    24012362
    24022363#if 0
     
    24042365     * Base this entirely on the presence of a debug directory.
    24052366     */
    2406     if (    pModMachO->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].Size
     2367    if (    pThis->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].Size
    24072368            < sizeof(IMAGE_DEBUG_DIRECTORY) /* screw borland linkers */
    2408         ||  !pModMachO->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress)
     2369        ||  !pThis->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress)
    24092370        return KLDR_ERR_NO_DEBUG_INFO;
    24102371    return 0;
    24112372#else
    2412     K_NOREF(pMod);
    2413     K_NOREF(pvBits);
    2414     return KLDR_ERR_NO_DEBUG_INFO;
     2373    RT_NOREF(pMod);
     2374    RT_NOREF(pvBits);
     2375    return VERR_LDR_NO_DEBUG_INFO;
    24152376#endif
    24162377}
     
    24182379
    24192380/** @copydoc kLdrModMap */
    2420 static int kldrModMachOMap(PKLDRMOD pMod)
    2421 {
    2422     PKLDRMODMACHO pModMachO = (PKLDRMODMACHO)pMod->pvData;
     2381static int kldrModMachOMap(PRTLDRMODINTERNAL pMod)
     2382{
     2383    PKLDRMODMACHO pThis = RT_FROM_MEMBER(pMod, KLDRMODMACHO, Core);
    24232384    unsigned fFixed;
    2424     KU32 i;
     2385    uint32_t i;
    24252386    void *pvBase;
    24262387    int rc;
    24272388
    2428     if (!pModMachO->fCanLoad)
    2429         return KLDR_ERR_TODO;
     2389    if (!pThis->fCanLoad)
     2390        return VERR_LDRMACHO_TODO;
    24302391
    24312392    /*
    24322393     * Already mapped?
    24332394     */
    2434     if (pModMachO->pvMapping)
     2395    if (pThis->pvMapping)
    24352396        return KLDR_ERR_ALREADY_MAPPED;
    24362397
     
    24452406    else
    24462407    {
    2447         pvBase = (void *)(KUPTR)pMod->aSegments[0].LinkAddress;
    2448         if ((KUPTR)pvBase != pMod->aSegments[0].LinkAddress)
    2449             return KLDR_ERR_ADDRESS_OVERFLOW;
     2408        pvBase = (void *)(uintptr_t)pMod->aSegments[0].LinkAddress;
     2409        if ((uintptr_t)pvBase != pMod->aSegments[0].LinkAddress)
     2410            return VERR_LDR_ADDRESS_OVERFLOW;
    24502411    }
    24512412
     
    24602421    for (i = 0; i < pMod->cSegments; i++)
    24612422    {
    2462         if (pMod->aSegments[i].RVA != NIL_KLDRADDR)
    2463             pMod->aSegments[i].MapAddress = (KUPTR)pvBase + (KUPTR)pMod->aSegments[i].RVA;
    2464     }
    2465     pModMachO->pvMapping = pvBase;
     2423        if (pMod->aSegments[i].RVA != NIL_RTLDRADDR)
     2424            pMod->aSegments[i].MapAddress = (uintptr_t)pvBase + (uintptr_t)pMod->aSegments[i].RVA;
     2425    }
     2426    pThis->pvMapping = pvBase;
    24662427
    24672428    return 0;
     
    24702431
    24712432/** @copydoc kLdrModUnmap */
    2472 static int kldrModMachOUnmap(PKLDRMOD pMod)
    2473 {
    2474     PKLDRMODMACHO pModMachO = (PKLDRMODMACHO)pMod->pvData;
    2475     KU32 i;
     2433static int kldrModMachOUnmap(PRTLDRMODINTERNAL pMod)
     2434{
     2435    PKLDRMODMACHO pThis = RT_FROM_MEMBER(pMod, KLDRMODMACHO, Core);
     2436    uint32_t i;
    24762437    int rc;
    24772438
     
    24792440     * Mapped?
    24802441     */
    2481     if (!pModMachO->pvMapping)
     2442    if (!pThis->pvMapping)
    24822443        return KLDR_ERR_NOT_MAPPED;
    24832444
     
    24852446     * Try unmap the image.
    24862447     */
    2487     rc = kRdrUnmap(pMod->pRdr, pModMachO->pvMapping, pMod->cSegments, pMod->aSegments);
     2448    rc = kRdrUnmap(pMod->pRdr, pThis->pvMapping, pMod->cSegments, pMod->aSegments);
    24882449    if (rc)
    24892450        return rc;
     
    24922453     * Update the segments to reflect that they aren't mapped any longer.
    24932454     */
    2494     pModMachO->pvMapping = NULL;
     2455    pThis->pvMapping = NULL;
    24952456    for (i = 0; i < pMod->cSegments; i++)
    24962457        pMod->aSegments[i].MapAddress = 0;
     
    25012462
    25022463/** @copydoc kLdrModAllocTLS */
    2503 static int kldrModMachOAllocTLS(PKLDRMOD pMod, void *pvMapping)
    2504 {
    2505     PKLDRMODMACHO pModMachO = (PKLDRMODMACHO)pMod->pvData;
     2464static int kldrModMachOAllocTLS(PRTLDRMODINTERNAL pMod, void *pvMapping)
     2465{
     2466    PKLDRMODMACHO pThis = RT_FROM_MEMBER(pMod, KLDRMODMACHO, Core);
    25062467
    25072468    /*
     
    25092470     */
    25102471    if (   pvMapping == KLDRMOD_INT_MAP
    2511         && !pModMachO->pvMapping )
     2472        && !pThis->pvMapping )
    25122473        return KLDR_ERR_NOT_MAPPED;
    25132474    return 0;
     
    25162477
    25172478/** @copydoc kLdrModFreeTLS */
    2518 static void kldrModMachOFreeTLS(PKLDRMOD pMod, void *pvMapping)
    2519 {
    2520     K_NOREF(pMod);
    2521     K_NOREF(pvMapping);
    2522 }
     2479static void kldrModMachOFreeTLS(PRTLDRMODINTERNAL pMod, void *pvMapping)
     2480{
     2481    RT_NOREF(pMod);
     2482    RT_NOREF(pvMapping);
     2483}
     2484
    25232485
    25242486
    25252487/** @copydoc kLdrModReload */
    2526 static int kldrModMachOReload(PKLDRMOD pMod)
    2527 {
    2528     PKLDRMODMACHO pModMachO = (PKLDRMODMACHO)pMod->pvData;
     2488static int kldrModMachOReload(PRTLDRMODINTERNAL pMod)
     2489{
     2490    PKLDRMODMACHO pThis = RT_FROM_MEMBER(pMod, KLDRMODMACHO, Core);
    25292491
    25302492    /*
    25312493     * Mapped?
    25322494     */
    2533     if (!pModMachO->pvMapping)
     2495    if (!pThis->pvMapping)
    25342496        return KLDR_ERR_NOT_MAPPED;
    25352497
    25362498    /* the file provider does it all */
    2537     return kRdrRefresh(pMod->pRdr, pModMachO->pvMapping, pMod->cSegments, pMod->aSegments);
     2499    return kRdrRefresh(pMod->pRdr, pThis->pvMapping, pMod->cSegments, pMod->aSegments);
    25382500}
    25392501
    25402502
    25412503/** @copydoc kLdrModFixupMapping */
    2542 static int kldrModMachOFixupMapping(PKLDRMOD pMod, PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser)
    2543 {
    2544     PKLDRMODMACHO pModMachO = (PKLDRMODMACHO)pMod->pvData;
     2504static int kldrModMachOFixupMapping(PRTLDRMODINTERNAL pMod, PFNRTLDRIMPORT pfnGetImport, void *pvUser)
     2505{
     2506    PKLDRMODMACHO pThis = RT_FROM_MEMBER(pMod, KLDRMODMACHO, Core);
    25452507    int rc, rc2;
    25462508
     
    25482510     * Mapped?
    25492511     */
    2550     if (!pModMachO->pvMapping)
     2512    if (!pThis->pvMapping)
    25512513        return KLDR_ERR_NOT_MAPPED;
    25522514
     
    25542516     * Before doing anything we'll have to make all pages writable.
    25552517     */
    2556     rc = kRdrProtect(pMod->pRdr, pModMachO->pvMapping, pMod->cSegments, pMod->aSegments, 1 /* unprotect */);
     2518    rc = kRdrProtect(pMod->pRdr, pThis->pvMapping, pMod->cSegments, pMod->aSegments, 1 /* unprotect */);
    25572519    if (rc)
    25582520        return rc;
     
    25612523     * Resolve imports and apply base relocations.
    25622524     */
    2563     rc = kldrModMachORelocateBits(pMod, pModMachO->pvMapping, (KUPTR)pModMachO->pvMapping, pModMachO->LinkAddress,
    2564                                   pfnGetImport, pvUser);
     2525    rc = rtldrMachO_RelocateBits(pMod, pThis->pvMapping, (uintptr_t)pThis->pvMapping, pThis->LinkAddress,
     2526                                      pfnGetImport, pvUser);
    25652527
    25662528    /*
    25672529     * Restore protection.
    25682530     */
    2569     rc2 = kRdrProtect(pMod->pRdr, pModMachO->pvMapping, pMod->cSegments, pMod->aSegments, 0 /* protect */);
     2531    rc2 = kRdrProtect(pMod->pRdr, pThis->pvMapping, pMod->cSegments, pMod->aSegments, 0 /* protect */);
    25702532    if (!rc && rc2)
    25712533        rc = rc2;
     
    25732535}
    25742536
     2537#endif
    25752538
    25762539/**
     
    25782541 *
    25792542 * @returns 0 on success, non-zero kLdr status code on failure.
    2580  * @param   pModMachO       The Mach-O module interpreter instance.
     2543 * @param   pThis       The Mach-O module interpreter instance.
    25812544 * @param   pfnGetImport    The callback for resolving an imported symbol.
    25822545 * @param   pvUser          User argument to the callback.
    25832546 */
    2584 static int  kldrModMachOObjDoImports(PKLDRMODMACHO pModMachO, KLDRADDR BaseAddress, PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser)
    2585 {
    2586     const KU32 cSyms = pModMachO->cSymbols;
    2587     KU32 iSym;
     2547static int  kldrModMachOObjDoImports(PKLDRMODMACHO pThis, RTLDRADDR BaseAddress, PFNRTLDRIMPORT pfnGetImport, void *pvUser)
     2548{
     2549    const uint32_t cSyms = pThis->cSymbols;
     2550    uint32_t iSym;
    25882551    int rc;
    25892552
     
    25912554     * Ensure that we've got the symbol table and section fixups handy.
    25922555     */
    2593     rc = kldrModMachOLoadObjSymTab(pModMachO);
     2556    rc = kldrModMachOLoadObjSymTab(pThis);
    25942557    if (rc)
    25952558        return rc;
     
    25992562     * We currently ignore REFERENCE_TYPE.
    26002563     */
    2601     if (    pModMachO->Hdr.magic == IMAGE_MACHO32_SIGNATURE
    2602         ||  pModMachO->Hdr.magic == IMAGE_MACHO32_SIGNATURE_OE)
    2603     {
    2604         macho_nlist_32_t *paSyms = (macho_nlist_32_t *)pModMachO->pvaSymbols;
     2564    if (    pThis->Hdr.magic == IMAGE_MACHO32_SIGNATURE
     2565        ||  pThis->Hdr.magic == IMAGE_MACHO32_SIGNATURE_OE)
     2566    {
     2567        macho_nlist_32_t *paSyms = (macho_nlist_32_t *)pThis->pvaSymbols;
    26052568        for (iSym = 0; iSym < cSyms; iSym++)
    26062569        {
     
    26122575            {
    26132576                const char *pszSymbol;
    2614                 KSIZE cchSymbol;
    2615                 KU32 fKind = KLDRSYMKIND_REQ_FLAT;
    2616                 KLDRADDR Value = NIL_KLDRADDR;
     2577                size_t cchSymbol;
     2578                //uint32_t fKind = RTLDRSYMKIND_REQ_FLAT;
     2579                RTLDRADDR Value = NIL_RTLDRADDR;
    26172580
    26182581                /** @todo Implement N_REF_TO_WEAK. */
    2619                 KLDRMODMACHO_CHECK_RETURN(!(paSyms[iSym].n_desc & N_REF_TO_WEAK), KLDR_ERR_TODO);
     2582                KLDRMODMACHO_CHECK_RETURN(!(paSyms[iSym].n_desc & N_REF_TO_WEAK), VERR_LDRMACHO_TODO);
    26202583
    26212584                /* Get the symbol name. */
    2622                 KLDRMODMACHO_CHECK_RETURN((KU32)paSyms[iSym].n_un.n_strx < pModMachO->cchStrings, KLDR_ERR_MACHO_BAD_SYMBOL);
    2623                 pszSymbol = &pModMachO->pchStrings[paSyms[iSym].n_un.n_strx];
    2624                 cchSymbol = kHlpStrLen(pszSymbol);
     2585                KLDRMODMACHO_CHECK_RETURN((uint32_t)paSyms[iSym].n_un.n_strx < pThis->cchStrings, VERR_LDRMACHO_BAD_SYMBOL);
     2586                pszSymbol = &pThis->pchStrings[paSyms[iSym].n_un.n_strx];
     2587                cchSymbol = strlen(pszSymbol);
    26252588
    26262589                /* Check for linker defined symbols relating to sections and segments. */
    26272590                if (   cchSymbol > sizeof("section$end$") - 1
    26282591                    && *pszSymbol == 's'
    2629                     && kHlpMemChr(pszSymbol, '$', cchSymbol))
    2630                     rc = kldrModMachOQueryLinkerSymbol(pModMachO, pModMachO->pMod, pszSymbol, cchSymbol, BaseAddress, &Value);
     2592                    && memchr(pszSymbol, '$', cchSymbol))
     2593                    rc = kldrModMachOQueryLinkerSymbol(pThis, pszSymbol, cchSymbol, BaseAddress, &Value);
    26312594                else
    2632                     rc = KLDR_ERR_SYMBOL_NOT_FOUND;
     2595                    rc = VERR_SYMBOL_NOT_FOUND;
    26332596
    26342597                /* Ask the user for an address to the symbol. */
    26352598                if (rc)
    2636                     rc = pfnGetImport(pModMachO->pMod, NIL_KLDRMOD_IMPORT, iSym, pszSymbol, cchSymbol, NULL,
    2637                                       &Value, &fKind, pvUser);
     2599                    rc = pfnGetImport(&pThis->Core, NULL /*pszModule*/, pszSymbol, iSym, &Value/*, &fKind*/, pvUser);
    26382600                if (rc)
    26392601                {
     
    26452607
    26462608                /* Update the symbol. */
    2647                 paSyms[iSym].n_value = (KU32)Value;
     2609                paSyms[iSym].n_value = (uint32_t)Value;
    26482610                if (paSyms[iSym].n_value != Value)
    26492611                {
    2650                     rc = KLDR_ERR_ADDRESS_OVERFLOW;
     2612                    rc = VERR_LDR_ADDRESS_OVERFLOW;
    26512613                    break;
    26522614                }
     
    26552617            {
    26562618                /** @todo implement weak symbols. */
    2657                 /*return KLDR_ERR_TODO; - ignored for now. */
     2619                /*return VERR_LDRMACHO_TODO; - ignored for now. */
    26582620            }
    26592621        }
     
    26622624    {
    26632625        /* (Identical to the 32-bit code, just different paSym type. (and n_strx is unsigned)) */
    2664         macho_nlist_64_t *paSyms = (macho_nlist_64_t *)pModMachO->pvaSymbols;
     2626        macho_nlist_64_t *paSyms = (macho_nlist_64_t *)pThis->pvaSymbols;
    26652627        for (iSym = 0; iSym < cSyms; iSym++)
    26662628        {
     
    26722634            {
    26732635                const char *pszSymbol;
    2674                 KSIZE cchSymbol;
    2675                 KU32 fKind = KLDRSYMKIND_REQ_FLAT;
    2676                 KLDRADDR Value = NIL_KLDRADDR;
     2636                size_t cchSymbol;
     2637                //uint32_t fKind = RTLDRSYMKIND_REQ_FLAT;
     2638                RTLDRADDR Value = NIL_RTLDRADDR;
    26772639
    26782640                /** @todo Implement N_REF_TO_WEAK. */
    2679                 KLDRMODMACHO_CHECK_RETURN(!(paSyms[iSym].n_desc & N_REF_TO_WEAK), KLDR_ERR_TODO);
     2641                KLDRMODMACHO_CHECK_RETURN(!(paSyms[iSym].n_desc & N_REF_TO_WEAK), VERR_LDRMACHO_TODO);
    26802642
    26812643                 /* Get the symbol name. */
    2682                 KLDRMODMACHO_CHECK_RETURN(paSyms[iSym].n_un.n_strx < pModMachO->cchStrings, KLDR_ERR_MACHO_BAD_SYMBOL);
    2683                 pszSymbol = &pModMachO->pchStrings[paSyms[iSym].n_un.n_strx];
    2684                 cchSymbol = kHlpStrLen(pszSymbol);
     2644                KLDRMODMACHO_CHECK_RETURN(paSyms[iSym].n_un.n_strx < pThis->cchStrings, VERR_LDRMACHO_BAD_SYMBOL);
     2645                pszSymbol = &pThis->pchStrings[paSyms[iSym].n_un.n_strx];
     2646                cchSymbol = strlen(pszSymbol);
    26852647
    26862648                /* Check for linker defined symbols relating to sections and segments. */
    26872649                if (   cchSymbol > sizeof("section$end$") - 1
    26882650                    && *pszSymbol == 's'
    2689                     && kHlpMemChr(pszSymbol, '$', cchSymbol))
    2690                     rc = kldrModMachOQueryLinkerSymbol(pModMachO, pModMachO->pMod, pszSymbol, cchSymbol, BaseAddress, &Value);
     2651                    && memchr(pszSymbol, '$', cchSymbol))
     2652                    rc = kldrModMachOQueryLinkerSymbol(pThis, pszSymbol, cchSymbol, BaseAddress, &Value);
    26912653                else
    2692                     rc = KLDR_ERR_SYMBOL_NOT_FOUND;
     2654                    rc = VERR_SYMBOL_NOT_FOUND;
    26932655
    26942656                /* Ask the user for an address to the symbol. */
    26952657                if (rc)
    2696                     rc = pfnGetImport(pModMachO->pMod, NIL_KLDRMOD_IMPORT, iSym, pszSymbol, cchSymbol, NULL,
    2697                                       &Value, &fKind, pvUser);
     2658                    rc = pfnGetImport(&pThis->Core, NULL, pszSymbol, iSym, &Value, /*&fKind,*/ pvUser);
    26982659                if (rc)
    26992660                {
     
    27082669                if (paSyms[iSym].n_value != Value)
    27092670                {
    2710                     rc = KLDR_ERR_ADDRESS_OVERFLOW;
     2671                    rc = VERR_LDR_ADDRESS_OVERFLOW;
    27112672                    break;
    27122673                }
     
    27152676            {
    27162677                /** @todo implement weak symbols. */
    2717                 /*return KLDR_ERR_TODO; - ignored for now. */
     2678                /*return VERR_LDRMACHO_TODO; - ignored for now. */
    27182679            }
    27192680        }
     
    27282689 *
    27292690 * @returns 0 on success, non-zero kLdr status code on failure.
    2730  * @param   pModMachO       The Mach-O module interpreter instance.
     2691 * @param   pThis       The Mach-O module interpreter instance.
    27312692 * @param   pvMapping       The mapping to fixup.
    27322693 * @param   NewBaseAddress  The address to fixup the mapping to.
    27332694 * @param   OldBaseAddress  The address the mapping is currently fixed up to.
    27342695 */
    2735 static int  kldrModMachOObjDoFixups(PKLDRMODMACHO pModMachO, void *pvMapping, KLDRADDR NewBaseAddress)
    2736 {
    2737     KU32 iSeg;
     2696static int  kldrModMachOObjDoFixups(PKLDRMODMACHO pThis, void *pvMapping, RTLDRADDR NewBaseAddress)
     2697{
     2698    uint32_t iSeg;
    27382699    int rc;
    27392700
     
    27422703     * Ensure that we've got the symbol table and section fixups handy.
    27432704     */
    2744     rc = kldrModMachOLoadObjSymTab(pModMachO);
     2705    rc = kldrModMachOLoadObjSymTab(pThis);
    27452706    if (rc)
    27462707        return rc;
     
    27492710     * Iterate over the segments and their sections and apply fixups.
    27502711     */
    2751     for (iSeg = rc = 0; !rc && iSeg < pModMachO->pMod->cSegments; iSeg++)
    2752     {
    2753         PKLDRMODMACHOSEG pSeg = &pModMachO->aSegments[iSeg];
    2754         KU32 iSect;
     2712    for (iSeg = rc = 0; !rc && iSeg < pThis->cSegments; iSeg++)
     2713    {
     2714        PKLDRMODMACHOSEG pSeg = &pThis->aSegments[iSeg];
     2715        uint32_t iSect;
    27552716
    27562717        for (iSect = 0; iSect < pSeg->cSections; iSect++)
    27572718        {
    27582719            PKLDRMODMACHOSECT pSect = &pSeg->paSections[iSect];
    2759             KU8 *pbSectBits;
     2720            uint8_t *pbSectBits;
    27602721
    27612722            /* skip sections without fixups. */
     
    27662727            if (!pSect->paFixups)
    27672728            {
    2768                 rc = kldrModMachOLoadFixups(pModMachO, pSect->offFixups, pSect->cFixups, &pSect->paFixups);
     2729                rc = kldrModMachOLoadFixups(pThis, pSect->offFixups, pSect->cFixups, &pSect->paFixups);
    27692730                if (rc)
    27702731                    break;
     
    27742735             * Apply the fixups.
    27752736             */
    2776             pbSectBits = (KU8 *)pvMapping + (KUPTR)pSect->RVA;
    2777             if (pModMachO->Hdr.magic == IMAGE_MACHO32_SIGNATURE) /** @todo this aint right. */
    2778                 rc = kldrModMachOFixupSectionGeneric32Bit(pModMachO, pbSectBits, pSect,
    2779                                                           (macho_nlist_32_t *)pModMachO->pvaSymbols,
    2780                                                           pModMachO->cSymbols, NewBaseAddress);
    2781             else if (   pModMachO->Hdr.magic == IMAGE_MACHO64_SIGNATURE
    2782                      && pModMachO->Hdr.cputype == CPU_TYPE_X86_64)
    2783                 rc = kldrModMachOFixupSectionAMD64(pModMachO, pbSectBits, pSect,
    2784                                                    (macho_nlist_64_t *)pModMachO->pvaSymbols,
    2785                                                    pModMachO->cSymbols, NewBaseAddress);
     2737            pbSectBits = (uint8_t *)pvMapping + (uintptr_t)pSect->RVA;
     2738            if (pThis->Hdr.magic == IMAGE_MACHO32_SIGNATURE) /** @todo this aint right. */
     2739                rc = kldrModMachOFixupSectionGeneric32Bit(pThis, pbSectBits, pSect,
     2740                                                          (macho_nlist_32_t *)pThis->pvaSymbols,
     2741                                                          pThis->cSymbols, NewBaseAddress);
     2742            else if (   pThis->Hdr.magic == IMAGE_MACHO64_SIGNATURE
     2743                     && pThis->Hdr.cputype == CPU_TYPE_X86_64)
     2744                rc = kldrModMachOFixupSectionAMD64(pThis, pbSectBits, pSect,
     2745                                                   (macho_nlist_64_t *)pThis->pvaSymbols,
     2746                                                   pThis->cSymbols, NewBaseAddress);
    27862747            else
    2787                 KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_TODO);
     2748                KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_TODO);
    27882749            if (rc)
    27892750                break;
     
    28002761 *
    28012762 * @returns 0 on success, non-zero kLdr status code on failure.
    2802  * @param   pModMachO       The Mach-O module interpreter instance.
     2763 * @param   pThis       The Mach-O module interpreter instance.
    28032764 * @param   pbSectBits      Pointer to the section bits.
    28042765 * @param   pFixupSect      The section being fixed up.
    28052766 * @param   NewBaseAddress  The new base image address.
    28062767 */
    2807 static int  kldrModMachOFixupSectionGeneric32Bit(PKLDRMODMACHO pModMachO, KU8 *pbSectBits, PKLDRMODMACHOSECT pFixupSect,
    2808                                                  macho_nlist_32_t *paSyms, KU32 cSyms, KLDRADDR NewBaseAddress)
     2768static int  kldrModMachOFixupSectionGeneric32Bit(PKLDRMODMACHO pThis, uint8_t *pbSectBits, PKLDRMODMACHOSECT pFixupSect,
     2769                                                 macho_nlist_32_t *paSyms, uint32_t cSyms, RTLDRADDR NewBaseAddress)
    28092770{
    28102771    const macho_relocation_info_t *paFixups = pFixupSect->paFixups;
    2811     const KU32 cFixups = pFixupSect->cFixups;
    2812     KSIZE cbSectBits = (KSIZE)pFixupSect->cb;
    2813     const KU8 *pbSectVirginBits;
    2814     KU32 iFixup;
    2815     KLDRPU uFixVirgin;
    2816     KLDRPU uFix;
    2817     KLDRADDR SymAddr = ~(KLDRADDR)0;
     2772    const uint32_t cFixups = pFixupSect->cFixups;
     2773    size_t cbSectBits = (size_t)pFixupSect->cb;
     2774    const uint8_t *pbSectVirginBits;
     2775    uint32_t iFixup;
     2776    RTLDRADDR SymAddr = ~(RTLDRADDR)0;
    28182777    int rc;
    28192778
     
    28232782    if (pFixupSect->offFile != -1)
    28242783    {
    2825         rc = kldrModMachOMapVirginBits(pModMachO);
     2784        rc = kldrModMachOMapVirginBits(pThis);
    28262785        if (rc)
    28272786            return rc;
    2828         pbSectVirginBits = (const KU8 *)pModMachO->pvBits + pFixupSect->offFile;
     2787        pbSectVirginBits = (const uint8_t *)pThis->pvBits + pFixupSect->offFile;
    28292788    }
    28302789    else
     
    28362795    for (iFixup = 0; iFixup < cFixups; iFixup++)
    28372796    {
     2797        RTPTRUNION uFix;
     2798        RTPTRUNION uFixVirgin;
    28382799        union
    28392800        {
     
    28462807        {
    28472808            /* sanity */
    2848             if ((KU32)Fixup.r.r_address >= cbSectBits)
    2849                 return KLDR_ERR_BAD_FIXUP;
     2809            if ((uint32_t)Fixup.r.r_address >= cbSectBits)
     2810                return VERR_LDR_BAD_FIXUP;
    28502811
    28512812            /* calc fixup addresses. */
    28522813            uFix.pv = pbSectBits + Fixup.r.r_address;
    2853             uFixVirgin.pv = pbSectVirginBits ? (KU8 *)pbSectVirginBits + Fixup.r.r_address : 0;
     2814            uFixVirgin.pv = pbSectVirginBits ? (uint8_t *)pbSectVirginBits + Fixup.r.r_address : 0;
    28542815
    28552816            /*
     
    28732834                const macho_nlist_32_t *pSym;
    28742835                if (Fixup.r.r_symbolnum >= cSyms)
    2875                     return KLDR_ERR_BAD_FIXUP;
     2836                    return VERR_LDR_BAD_FIXUP;
    28762837                pSym = &paSyms[Fixup.r.r_symbolnum];
    28772838
    28782839                if (pSym->n_type & MACHO_N_STAB)
    2879                     return KLDR_ERR_BAD_FIXUP;
     2840                    return VERR_LDR_BAD_FIXUP;
    28802841
    28812842                switch (pSym->n_type & MACHO_N_TYPE)
     
    28842845                    {
    28852846                        PKLDRMODMACHOSECT pSymSect;
    2886                         KLDRMODMACHO_CHECK_RETURN((KU32)pSym->n_sect - 1 <= pModMachO->cSections, KLDR_ERR_MACHO_BAD_SYMBOL);
    2887                         pSymSect = &pModMachO->paSections[pSym->n_sect - 1];
     2847                        KLDRMODMACHO_CHECK_RETURN((uint32_t)pSym->n_sect - 1 <= pThis->cSections, VERR_LDRMACHO_BAD_SYMBOL);
     2848                        pSymSect = &pThis->paSections[pSym->n_sect - 1];
    28882849
    28892850                        SymAddr += pSym->n_value - pSymSect->LinkAddress + pSymSect->RVA + NewBaseAddress;
     
    28982859                    case MACHO_N_INDR:
    28992860                    case MACHO_N_PBUD:
    2900                         KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_TODO);
     2861                        KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_TODO);
    29012862                    default:
    2902                         KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_BAD_SYMBOL);
     2863                        KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_BAD_SYMBOL);
    29032864                }
    29042865            }
     
    29062867            {
    29072868                PKLDRMODMACHOSECT pSymSect;
    2908                 if (Fixup.r.r_symbolnum > pModMachO->cSections)
    2909                     return KLDR_ERR_BAD_FIXUP;
    2910                 pSymSect = &pModMachO->paSections[Fixup.r.r_symbolnum - 1];
     2869                if (Fixup.r.r_symbolnum > pThis->cSections)
     2870                    return VERR_LDR_BAD_FIXUP;
     2871                pSymSect = &pThis->paSections[Fixup.r.r_symbolnum - 1];
    29112872
    29122873                SymAddr -= pSymSect->LinkAddress;
     
    29212882        {
    29222883            PKLDRMODMACHOSECT pSymSect;
    2923             KU32 iSymSect;
    2924             KLDRADDR Value;
     2884            uint32_t iSymSect;
     2885            RTLDRADDR Value;
    29252886
    29262887            /* sanity */
    29272888            KLDRMODMACHO_ASSERT(Fixup.s.r_scattered);
    2928             if ((KU32)Fixup.s.r_address >= cbSectBits)
    2929                 return KLDR_ERR_BAD_FIXUP;
     2889            if ((uint32_t)Fixup.s.r_address >= cbSectBits)
     2890                return VERR_LDR_BAD_FIXUP;
    29302891
    29312892            /* calc fixup addresses. */
    29322893            uFix.pv = pbSectBits + Fixup.s.r_address;
    2933             uFixVirgin.pv = pbSectVirginBits ? (KU8 *)pbSectVirginBits + Fixup.s.r_address : 0;
     2894            uFixVirgin.pv = pbSectVirginBits ? (uint8_t *)pbSectVirginBits + Fixup.s.r_address : 0;
    29342895
    29352896            /*
     
    29512912            /* Find the section number from the r_value. */
    29522913            pSymSect = NULL;
    2953             for (iSymSect = 0; iSymSect < pModMachO->cSections; iSymSect++)
     2914            for (iSymSect = 0; iSymSect < pThis->cSections; iSymSect++)
    29542915            {
    2955                 KLDRADDR off = Value - pModMachO->paSections[iSymSect].LinkAddress;
    2956                 if (off < pModMachO->paSections[iSymSect].cb)
     2916                RTLDRADDR off = Value - pThis->paSections[iSymSect].LinkAddress;
     2917                if (off < pThis->paSections[iSymSect].cb)
    29572918                {
    2958                     pSymSect = &pModMachO->paSections[iSymSect];
     2919                    pSymSect = &pThis->paSections[iSymSect];
    29592920                    break;
    29602921                }
    2961                 else if (off == pModMachO->paSections[iSymSect].cb) /* edge case */
    2962                     pSymSect = &pModMachO->paSections[iSymSect];
     2922                else if (off == pThis->paSections[iSymSect].cb) /* edge case */
     2923                    pSymSect = &pThis->paSections[iSymSect];
    29632924            }
    29642925            if (!pSymSect)
    2965                 return KLDR_ERR_BAD_FIXUP;
     2926                return VERR_LDR_BAD_FIXUP;
    29662927
    29672928            /* Calc the symbol address. */
     
    29812942            switch (Fixup.r.r_length)
    29822943            {
    2983                 case 0: *uFix.pu8  = (KU8)SymAddr; break;
    2984                 case 1: *uFix.pu16 = (KU16)SymAddr; break;
    2985                 case 2: *uFix.pu32 = (KU32)SymAddr; break;
    2986                 case 3: *uFix.pu64 = (KU64)SymAddr; break;
     2944                case 0: *uFix.pu8  = (uint8_t)SymAddr; break;
     2945                case 1: *uFix.pu16 = (uint16_t)SymAddr; break;
     2946                case 2: *uFix.pu32 = (uint32_t)SymAddr; break;
     2947                case 3: *uFix.pu64 = (uint64_t)SymAddr; break;
    29872948            }
    29882949        }
    29892950        else if (Fixup.r.r_type <= GENERIC_RELOC_LOCAL_SECTDIFF)
    2990             return KLDR_ERR_MACHO_UNSUPPORTED_FIXUP_TYPE;
     2951            return VERR_LDRMACHO_UNSUPPORTED_FIXUP_TYPE;
    29912952        else
    2992             return KLDR_ERR_BAD_FIXUP;
     2953            return VERR_LDR_BAD_FIXUP;
    29932954    }
    29942955
     
    30012962 *
    30022963 * @returns 0 on success, non-zero kLdr status code on failure.
    3003  * @param   pModMachO       The Mach-O module interpreter instance.
     2964 * @param   pThis       The Mach-O module interpreter instance.
    30042965 * @param   pbSectBits      Pointer to the section bits.
    30052966 * @param   pFixupSect      The section being fixed up.
    30062967 * @param   NewBaseAddress  The new base image address.
    30072968 */
    3008 static int  kldrModMachOFixupSectionAMD64(PKLDRMODMACHO pModMachO, KU8 *pbSectBits, PKLDRMODMACHOSECT pFixupSect,
    3009                                           macho_nlist_64_t *paSyms, KU32 cSyms, KLDRADDR NewBaseAddress)
     2969static int  kldrModMachOFixupSectionAMD64(PKLDRMODMACHO pThis, uint8_t *pbSectBits, PKLDRMODMACHOSECT pFixupSect,
     2970                                          macho_nlist_64_t *paSyms, uint32_t cSyms, RTLDRADDR NewBaseAddress)
    30102971{
    30112972    const macho_relocation_info_t *paFixups = pFixupSect->paFixups;
    3012     const KU32 cFixups = pFixupSect->cFixups;
    3013     KSIZE cbSectBits = (KSIZE)pFixupSect->cb;
    3014     const KU8 *pbSectVirginBits;
    3015     KU32 iFixup;
    3016     KLDRPU uFixVirgin;
    3017     KLDRPU uFix;
    3018     KLDRADDR SymAddr;
     2973    const uint32_t cFixups = pFixupSect->cFixups;
     2974    size_t cbSectBits = (size_t)pFixupSect->cb;
     2975    const uint8_t *pbSectVirginBits;
     2976    uint32_t iFixup;
     2977    RTLDRADDR SymAddr;
    30192978    int rc;
    30202979
     
    30242983    if (pFixupSect->offFile != -1)
    30252984    {
    3026         rc = kldrModMachOMapVirginBits(pModMachO);
     2985        rc = kldrModMachOMapVirginBits(pThis);
    30272986        if (rc)
    30282987            return rc;
    3029         pbSectVirginBits = (const KU8 *)pModMachO->pvBits + pFixupSect->offFile;
     2988        pbSectVirginBits = (const uint8_t *)pThis->pvBits + pFixupSect->offFile;
    30302989    }
    30312990    else
     
    30453004
    30463005        /* AMD64 doesn't use scattered fixups. */
    3047         KLDRMODMACHO_CHECK_RETURN(!(Fixup.r.r_address & R_SCATTERED), KLDR_ERR_BAD_FIXUP);
     3006        KLDRMODMACHO_CHECK_RETURN(!(Fixup.r.r_address & R_SCATTERED), VERR_LDR_BAD_FIXUP);
    30483007
    30493008        /* sanity */
    3050         KLDRMODMACHO_CHECK_RETURN((KU32)Fixup.r.r_address < cbSectBits, KLDR_ERR_BAD_FIXUP);
     3009        KLDRMODMACHO_CHECK_RETURN((uint32_t)Fixup.r.r_address < cbSectBits, VERR_LDR_BAD_FIXUP);
    30513010
    30523011        /* calc fixup addresses. */
     3012        RTPTRUNION uFix;
    30533013        uFix.pv = pbSectBits + Fixup.r.r_address;
    3054         uFixVirgin.pv = pbSectVirginBits ? (KU8 *)pbSectVirginBits + Fixup.r.r_address : 0;
     3014        RTPTRUNION uFixVirgin;
     3015        uFixVirgin.pv = pbSectVirginBits ? (uint8_t *)pbSectVirginBits + Fixup.r.r_address : 0;
    30553016
    30563017        /*
     
    30643025            case 3: SymAddr = *uFixVirgin.pi64; break;
    30653026            default:
    3066                 KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_BAD_FIXUP);
     3027                KLDRMODMACHO_FAILED_RETURN(VERR_LDR_BAD_FIXUP);
    30673028        }
    30683029
     
    30723033            const macho_nlist_64_t *pSym;
    30733034
    3074             KLDRMODMACHO_CHECK_RETURN(Fixup.r.r_symbolnum < cSyms, KLDR_ERR_BAD_FIXUP);
     3035            KLDRMODMACHO_CHECK_RETURN(Fixup.r.r_symbolnum < cSyms, VERR_LDR_BAD_FIXUP);
    30753036            pSym = &paSyms[Fixup.r.r_symbolnum];
    3076             KLDRMODMACHO_CHECK_RETURN(!(pSym->n_type & MACHO_N_STAB), KLDR_ERR_BAD_FIXUP);
     3037            KLDRMODMACHO_CHECK_RETURN(!(pSym->n_type & MACHO_N_STAB), VERR_LDR_BAD_FIXUP);
    30773038
    30783039            switch (Fixup.r.r_type)
     
    30903051                        case MACHO_N_INDR:
    30913052                        case MACHO_N_PBUD:
    3092                             KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_TODO);
     3053                            KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_TODO);
    30933054                        default:
    3094                             KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_BAD_SYMBOL);
     3055                            KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_BAD_SYMBOL);
    30953056                    }
    3096                     SymAddr = sizeof(KU64) * Fixup.r.r_symbolnum + pModMachO->GotRVA + NewBaseAddress;
    3097                     KLDRMODMACHO_CHECK_RETURN(Fixup.r.r_length == 2, KLDR_ERR_BAD_FIXUP);
     3057                    SymAddr = sizeof(uint64_t) * Fixup.r.r_symbolnum + pThis->GotRVA + NewBaseAddress;
     3058                    KLDRMODMACHO_CHECK_RETURN(Fixup.r.r_length == 2, VERR_LDR_BAD_FIXUP);
    30983059                    SymAddr -= 4;
    30993060                    break;
     
    31053066                case X86_64_RELOC_SIGNED_2:
    31063067                case X86_64_RELOC_SIGNED_4:
    3107                     KLDRMODMACHO_CHECK_RETURN(Fixup.r.r_pcrel, KLDR_ERR_BAD_FIXUP);
     3068                    KLDRMODMACHO_CHECK_RETURN(Fixup.r.r_pcrel, VERR_LDR_BAD_FIXUP);
    31083069                    /* Falls through. */
    31093070                default:
     
    31133074                    {
    31143075                        case X86_64_RELOC_UNSIGNED:
    3115                             KLDRMODMACHO_CHECK_RETURN(!Fixup.r.r_pcrel, KLDR_ERR_BAD_FIXUP);
     3076                            KLDRMODMACHO_CHECK_RETURN(!Fixup.r.r_pcrel, VERR_LDR_BAD_FIXUP);
    31163077                            break;
    31173078                        case X86_64_RELOC_BRANCH:
    3118                             KLDRMODMACHO_CHECK_RETURN(Fixup.r.r_length == 2, KLDR_ERR_BAD_FIXUP);
     3079                            KLDRMODMACHO_CHECK_RETURN(Fixup.r.r_length == 2, VERR_LDR_BAD_FIXUP);
    31193080                            SymAddr -= 4;
    31203081                            break;
     
    31263087                            break;
    31273088                        default:
    3128                             KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_BAD_FIXUP);
     3089                            KLDRMODMACHO_FAILED_RETURN(VERR_LDR_BAD_FIXUP);
    31293090                    }
    31303091
     
    31343095                        {
    31353096                            PKLDRMODMACHOSECT pSymSect;
    3136                             KLDRMODMACHO_CHECK_RETURN((KU32)pSym->n_sect - 1 <= pModMachO->cSections, KLDR_ERR_MACHO_BAD_SYMBOL);
    3137                             pSymSect = &pModMachO->paSections[pSym->n_sect - 1];
     3097                            KLDRMODMACHO_CHECK_RETURN((uint32_t)pSym->n_sect - 1 <= pThis->cSections, VERR_LDRMACHO_BAD_SYMBOL);
     3098                            pSymSect = &pThis->paSections[pSym->n_sect - 1];
    31383099                            SymAddr += pSym->n_value - pSymSect->LinkAddress + pSymSect->RVA + NewBaseAddress;
    31393100                            break;
     
    31453106                                &&       SymAddr + Fixup.r.r_address + pFixupSect->RVA + NewBaseAddress
    31463107                                       - pSym->n_value
    3147                                        + KU64_C(0x80000000)
    3148                                     >= KU64_C(0xffffff20))
    3149                                 SymAddr += pModMachO->cbJmpStub * Fixup.r.r_symbolnum + pModMachO->JmpStubsRVA + NewBaseAddress;
     3108                                       + UINT64_C(0x80000000)
     3109                                    >= UINT64_C(0xffffff20))
     3110                                SymAddr += pThis->cbJmpStub * Fixup.r.r_symbolnum + pThis->JmpStubsRVA + NewBaseAddress;
    31503111                            else
    31513112                                SymAddr += pSym->n_value;
     
    31583119                        case MACHO_N_INDR:
    31593120                        case MACHO_N_PBUD:
    3160                             KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_TODO);
     3121                            KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_TODO);
    31613122                        default:
    3162                             KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_BAD_SYMBOL);
     3123                            KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_BAD_SYMBOL);
    31633124                    }
    31643125                    break;
     
    31783139                        {
    31793140                            PKLDRMODMACHOSECT pSymSect;
    3180                             KLDRMODMACHO_CHECK_RETURN((KU32)pSym->n_sect - 1 <= pModMachO->cSections, KLDR_ERR_MACHO_BAD_SYMBOL);
    3181                             pSymSect = &pModMachO->paSections[pSym->n_sect - 1];
     3141                            KLDRMODMACHO_CHECK_RETURN((uint32_t)pSym->n_sect - 1 <= pThis->cSections, VERR_LDRMACHO_BAD_SYMBOL);
     3142                            pSymSect = &pThis->paSections[pSym->n_sect - 1];
    31823143                            SymAddr -= pSym->n_value - pSymSect->LinkAddress + pSymSect->RVA + NewBaseAddress;
    31833144                            break;
     
    31913152                        case MACHO_N_INDR:
    31923153                        case MACHO_N_PBUD:
    3193                             KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_TODO);
     3154                            KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_TODO);
    31943155                        default:
    3195                             KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_BAD_SYMBOL);
     3156                            KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_BAD_SYMBOL);
    31963157                    }
    31973158
    31983159                    /* Load the 2nd fixup, check sanity. */
    31993160                    iFixup++;
    3200                     KLDRMODMACHO_CHECK_RETURN(!Fixup.r.r_pcrel && iFixup < cFixups, KLDR_ERR_BAD_FIXUP);
     3161                    KLDRMODMACHO_CHECK_RETURN(!Fixup.r.r_pcrel && iFixup < cFixups, VERR_LDR_BAD_FIXUP);
    32013162                    Fixup2 = paFixups[iFixup];
    32023163                    KLDRMODMACHO_CHECK_RETURN(   Fixup2.r_address == Fixup.r.r_address
     
    32053166                                              && !Fixup2.r_pcrel
    32063167                                              && Fixup2.r_symbolnum < cSyms,
    3207                                               KLDR_ERR_BAD_FIXUP);
     3168                                              VERR_LDR_BAD_FIXUP);
    32083169
    32093170                    if (Fixup2.r_extern)
    32103171                    {
    3211                         KLDRMODMACHO_CHECK_RETURN(Fixup2.r_symbolnum < cSyms, KLDR_ERR_BAD_FIXUP);
     3172                        KLDRMODMACHO_CHECK_RETURN(Fixup2.r_symbolnum < cSyms, VERR_LDR_BAD_FIXUP);
    32123173                        pSym = &paSyms[Fixup2.r_symbolnum];
    3213                         KLDRMODMACHO_CHECK_RETURN(!(pSym->n_type & MACHO_N_STAB), KLDR_ERR_BAD_FIXUP);
     3174                        KLDRMODMACHO_CHECK_RETURN(!(pSym->n_type & MACHO_N_STAB), VERR_LDR_BAD_FIXUP);
    32143175
    32153176                        /* Add it's value to SymAddr. */
     
    32193180                            {
    32203181                                PKLDRMODMACHOSECT pSymSect;
    3221                                 KLDRMODMACHO_CHECK_RETURN((KU32)pSym->n_sect - 1 <= pModMachO->cSections, KLDR_ERR_MACHO_BAD_SYMBOL);
    3222                                 pSymSect = &pModMachO->paSections[pSym->n_sect - 1];
     3182                                KLDRMODMACHO_CHECK_RETURN((uint32_t)pSym->n_sect - 1 <= pThis->cSections, VERR_LDRMACHO_BAD_SYMBOL);
     3183                                pSymSect = &pThis->paSections[pSym->n_sect - 1];
    32233184                                SymAddr += pSym->n_value - pSymSect->LinkAddress + pSymSect->RVA + NewBaseAddress;
    32243185                                break;
     
    32323193                            case MACHO_N_INDR:
    32333194                            case MACHO_N_PBUD:
    3234                                 KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_TODO);
     3195                                KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_TODO);
    32353196                            default:
    3236                                 KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_BAD_SYMBOL);
     3197                                KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_BAD_SYMBOL);
    32373198                        }
    32383199                    }
     
    32403201                    {
    32413202                        PKLDRMODMACHOSECT pSymSect;
    3242                         KLDRMODMACHO_CHECK_RETURN(Fixup2.r_symbolnum <= pModMachO->cSections, KLDR_ERR_BAD_FIXUP);
    3243                         pSymSect = &pModMachO->paSections[Fixup2.r_symbolnum - 1];
     3203                        KLDRMODMACHO_CHECK_RETURN(Fixup2.r_symbolnum <= pThis->cSections, VERR_LDR_BAD_FIXUP);
     3204                        pSymSect = &pThis->paSections[Fixup2.r_symbolnum - 1];
    32443205                        SymAddr += pSymSect->RVA + NewBaseAddress;
    32453206                    }
    32463207                    else
    3247                         KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_BAD_FIXUP);
     3208                        KLDRMODMACHO_FAILED_RETURN(VERR_LDR_BAD_FIXUP);
    32483209                }
    32493210                break;
     
    32563217            {
    32573218                case X86_64_RELOC_UNSIGNED:
    3258                     KLDRMODMACHO_CHECK_RETURN(!Fixup.r.r_pcrel, KLDR_ERR_BAD_FIXUP);
     3219                    KLDRMODMACHO_CHECK_RETURN(!Fixup.r.r_pcrel, VERR_LDR_BAD_FIXUP);
    32593220                    break;
    32603221                case X86_64_RELOC_BRANCH:
    3261                     KLDRMODMACHO_CHECK_RETURN(Fixup.r.r_pcrel, KLDR_ERR_BAD_FIXUP);
     3222                    KLDRMODMACHO_CHECK_RETURN(Fixup.r.r_pcrel, VERR_LDR_BAD_FIXUP);
    32623223                    SymAddr += 4; /* dunno what the assmbler/linker really is doing here... */
    32633224                    break;
     
    32663227                case X86_64_RELOC_SIGNED_2:
    32673228                case X86_64_RELOC_SIGNED_4:
    3268                     KLDRMODMACHO_CHECK_RETURN(Fixup.r.r_pcrel, KLDR_ERR_BAD_FIXUP);
     3229                    KLDRMODMACHO_CHECK_RETURN(Fixup.r.r_pcrel, VERR_LDR_BAD_FIXUP);
    32693230                    break;
    32703231                /*case X86_64_RELOC_GOT_LOAD:*/
     
    32723233                /*case X86_64_RELOC_SUBTRACTOR: - must be r_extern=1 says as. */
    32733234                default:
    3274                     KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_BAD_FIXUP);
     3235                    KLDRMODMACHO_FAILED_RETURN(VERR_LDR_BAD_FIXUP);
    32753236            }
    32763237            if (Fixup.r.r_symbolnum != R_ABS)
    32773238            {
    32783239                PKLDRMODMACHOSECT pSymSect;
    3279                 KLDRMODMACHO_CHECK_RETURN(Fixup.r.r_symbolnum <= pModMachO->cSections, KLDR_ERR_BAD_FIXUP);
    3280                 pSymSect = &pModMachO->paSections[Fixup.r.r_symbolnum - 1];
     3240                KLDRMODMACHO_CHECK_RETURN(Fixup.r.r_symbolnum <= pThis->cSections, VERR_LDR_BAD_FIXUP);
     3241                pSymSect = &pThis->paSections[Fixup.r.r_symbolnum - 1];
    32813242
    32823243                SymAddr -= pSymSect->LinkAddress;
     
    32973258        {
    32983259            case 3:
    3299                 *uFix.pu64 = (KU64)SymAddr;
     3260                *uFix.pu64 = (uint64_t)SymAddr;
    33003261                break;
    33013262            case 2:
    3302                 KLDRMODMACHO_CHECK_RETURN(Fixup.r.r_pcrel || Fixup.r.r_type == X86_64_RELOC_SUBTRACTOR, KLDR_ERR_BAD_FIXUP);
    3303                 KLDRMODMACHO_CHECK_RETURN((KI32)SymAddr == (KI64)SymAddr, KLDR_ERR_ADDRESS_OVERFLOW);
    3304                 *uFix.pu32 = (KU32)SymAddr;
     3263                KLDRMODMACHO_CHECK_RETURN(Fixup.r.r_pcrel || Fixup.r.r_type == X86_64_RELOC_SUBTRACTOR, VERR_LDR_BAD_FIXUP);
     3264                KLDRMODMACHO_CHECK_RETURN((int32_t)SymAddr == (int64_t)SymAddr, VERR_LDR_ADDRESS_OVERFLOW);
     3265                *uFix.pu32 = (uint32_t)SymAddr;
    33053266                break;
    33063267            default:
    3307                 KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_BAD_FIXUP);
     3268                KLDRMODMACHO_FAILED_RETURN(VERR_LDR_BAD_FIXUP);
    33083269        }
    33093270    }
     
    33193280 *
    33203281 * @returns 0 on success, non-zero kLdr status code on failure.
    3321  * @param   pModMachO       The Mach-O module interpreter instance.
    3322  */
    3323 static int  kldrModMachOLoadObjSymTab(PKLDRMODMACHO pModMachO)
     3282 * @param   pThis       The Mach-O module interpreter instance.
     3283 */
     3284static int  kldrModMachOLoadObjSymTab(PKLDRMODMACHO pThis)
    33243285{
    33253286    int rc = 0;
    33263287
    3327     if (    !pModMachO->pvaSymbols
    3328         &&  pModMachO->cSymbols)
    3329     {
    3330         KSIZE cbSyms;
    3331         KSIZE cbSym;
     3288    if (    !pThis->pvaSymbols
     3289        &&  pThis->cSymbols)
     3290    {
     3291        size_t cbSyms;
     3292        size_t cbSym;
    33323293        void *pvSyms;
    33333294        void *pvStrings;
    33343295
    33353296        /* sanity */
    3336         KLDRMODMACHO_CHECK_RETURN(   pModMachO->offSymbols
    3337                                   && (!pModMachO->cchStrings || pModMachO->offStrings),
    3338                                   KLDR_ERR_MACHO_BAD_OBJECT_FILE);
     3297        KLDRMODMACHO_CHECK_RETURN(   pThis->offSymbols
     3298                                  && (!pThis->cchStrings || pThis->offStrings),
     3299                                  VERR_LDRMACHO_BAD_OBJECT_FILE);
    33393300
    33403301        /* allocate */
    3341         cbSym = pModMachO->Hdr.magic == IMAGE_MACHO32_SIGNATURE
    3342              || pModMachO->Hdr.magic == IMAGE_MACHO32_SIGNATURE_OE
     3302        cbSym = pThis->Hdr.magic == IMAGE_MACHO32_SIGNATURE
     3303             || pThis->Hdr.magic == IMAGE_MACHO32_SIGNATURE_OE
    33433304             ? sizeof(macho_nlist_32_t)
    33443305             : sizeof(macho_nlist_64_t);
    3345         cbSyms = pModMachO->cSymbols * cbSym;
    3346         KLDRMODMACHO_CHECK_RETURN(cbSyms / cbSym == pModMachO->cSymbols, KLDR_ERR_SIZE_OVERFLOW);
    3347         rc = KERR_NO_MEMORY;
    3348         pvSyms = kHlpAlloc(cbSyms);
     3306        cbSyms = pThis->cSymbols * cbSym;
     3307        KLDRMODMACHO_CHECK_RETURN(cbSyms / cbSym == pThis->cSymbols, VERR_LDRMACHO_BAD_SYMTAB_SIZE);
     3308        rc = VERR_NO_MEMORY;
     3309        pvSyms = RTMemAlloc(cbSyms);
    33493310        if (pvSyms)
    33503311        {
    3351             if (pModMachO->cchStrings)
    3352                 pvStrings = kHlpAlloc(pModMachO->cchStrings);
     3312            if (pThis->cchStrings)
     3313                pvStrings = RTMemAlloc(pThis->cchStrings);
    33533314            else
    3354                 pvStrings = kHlpAllocZ(4);
     3315                pvStrings = RTMemAllocZ(4);
    33553316            if (pvStrings)
    33563317            {
    33573318                /* read */
    3358                 rc = kRdrRead(pModMachO->pMod->pRdr, pvSyms, cbSyms, pModMachO->offSymbols);
    3359                 if (!rc && pModMachO->cchStrings)
    3360                     rc = kRdrRead(pModMachO->pMod->pRdr, pvStrings, pModMachO->cchStrings, pModMachO->offStrings);
     3319                rc = pThis->Core.pReader->pfnRead(pThis->Core.pReader, pvSyms, cbSyms, pThis->offSymbols);
     3320                if (!rc && pThis->cchStrings)
     3321                    rc = pThis->Core.pReader->pfnRead(pThis->Core.pReader, pvStrings,
     3322                                                          pThis->cchStrings, pThis->offStrings);
    33613323                if (!rc)
    33623324                {
    3363                     pModMachO->pvaSymbols = pvSyms;
    3364                     pModMachO->pchStrings = (char *)pvStrings;
     3325                    pThis->pvaSymbols = pvSyms;
     3326                    pThis->pchStrings = (char *)pvStrings;
    33653327
    33663328                    /* perform endian conversion? */
    3367                     if (pModMachO->Hdr.magic == IMAGE_MACHO32_SIGNATURE_OE)
     3329                    if (pThis->Hdr.magic == IMAGE_MACHO32_SIGNATURE_OE)
    33683330                    {
    3369                         KU32 cLeft = pModMachO->cSymbols;
     3331                        uint32_t cLeft = pThis->cSymbols;
    33703332                        macho_nlist_32_t *pSym = (macho_nlist_32_t *)pvSyms;
    33713333                        while (cLeft-- > 0)
    33723334                        {
    3373                             pSym->n_un.n_strx = K_E2E_U32(pSym->n_un.n_strx);
    3374                             pSym->n_desc = (KI16)K_E2E_U16(pSym->n_desc);
    3375                             pSym->n_value = K_E2E_U32(pSym->n_value);
     3335                            pSym->n_un.n_strx = RT_BSWAP_U32(pSym->n_un.n_strx);
     3336                            pSym->n_desc = (int16_t)RT_BSWAP_U16(pSym->n_desc);
     3337                            pSym->n_value = RT_BSWAP_U32(pSym->n_value);
    33763338                            pSym++;
    33773339                        }
    33783340                    }
    3379                     else if (pModMachO->Hdr.magic == IMAGE_MACHO64_SIGNATURE_OE)
     3341                    else if (pThis->Hdr.magic == IMAGE_MACHO64_SIGNATURE_OE)
    33803342                    {
    3381                         KU32 cLeft = pModMachO->cSymbols;
     3343                        uint32_t cLeft = pThis->cSymbols;
    33823344                        macho_nlist_64_t *pSym = (macho_nlist_64_t *)pvSyms;
    33833345                        while (cLeft-- > 0)
    33843346                        {
    3385                             pSym->n_un.n_strx = K_E2E_U32(pSym->n_un.n_strx);
    3386                             pSym->n_desc = (KI16)K_E2E_U16(pSym->n_desc);
    3387                             pSym->n_value = K_E2E_U64(pSym->n_value);
     3347                            pSym->n_un.n_strx = RT_BSWAP_U32(pSym->n_un.n_strx);
     3348                            pSym->n_desc = (int16_t)RT_BSWAP_U16(pSym->n_desc);
     3349                            pSym->n_value = RT_BSWAP_U64(pSym->n_value);
    33883350                            pSym++;
    33893351                        }
     
    33923354                    return 0;
    33933355                }
    3394                 kHlpFree(pvStrings);
     3356                RTMemFree(pvStrings);
    33953357            }
    3396             kHlpFree(pvSyms);
     3358            RTMemFree(pvSyms);
    33973359        }
    33983360    }
    33993361    else
    3400         KLDRMODMACHO_ASSERT(pModMachO->pchStrings || pModMachO->Hdr.filetype == MH_DSYM);
     3362        KLDRMODMACHO_ASSERT(pThis->pchStrings || pThis->Hdr.filetype == MH_DSYM);
    34013363
    34023364    return rc;
     
    34093371 *
    34103372 * @returns 0 on success, non-zero kLdr status code on failure.
    3411  * @param   pModMachO       The Mach-O module interpreter instance.
     3373 * @param   pThis       The Mach-O module interpreter instance.
    34123374 * @param   offFixups       The file offset of the fixups.
    34133375 * @param   cFixups         The number of fixups to load.
    34143376 * @param   ppaFixups       Where to put the pointer to the allocated fixup array.
    34153377 */
    3416 static int  kldrModMachOLoadFixups(PKLDRMODMACHO pModMachO, KLDRFOFF offFixups, KU32 cFixups, macho_relocation_info_t **ppaFixups)
     3378static int  kldrModMachOLoadFixups(PKLDRMODMACHO pThis, RTFOFF offFixups, uint32_t cFixups, macho_relocation_info_t **ppaFixups)
    34173379{
    34183380    macho_relocation_info_t *paFixups;
    3419     KSIZE cbFixups;
     3381    size_t cbFixups;
    34203382    int rc;
    34213383
    34223384    /* allocate the memory. */
    34233385    cbFixups = cFixups * sizeof(*paFixups);
    3424     KLDRMODMACHO_CHECK_RETURN(cbFixups / sizeof(*paFixups) == cFixups, KLDR_ERR_SIZE_OVERFLOW);
    3425     paFixups = (macho_relocation_info_t *)kHlpAlloc(cbFixups);
     3386    KLDRMODMACHO_CHECK_RETURN(cbFixups / sizeof(*paFixups) == cFixups, VERR_LDRMACHO_BAD_SYMTAB_SIZE);
     3387    paFixups = (macho_relocation_info_t *)RTMemAlloc(cbFixups);
    34263388    if (!paFixups)
    3427         return KERR_NO_MEMORY;
     3389        return VERR_NO_MEMORY;
    34283390
    34293391    /* read the fixups. */
    3430     rc = kRdrRead(pModMachO->pMod->pRdr, paFixups, cbFixups, offFixups);
     3392    rc = pThis->Core.pReader->pfnRead(pThis->Core.pReader, paFixups, cbFixups, offFixups);
    34313393    if (!rc)
    34323394    {
     
    34343396
    34353397        /* do endian conversion if necessary. */
    3436         if (    pModMachO->Hdr.magic == IMAGE_MACHO32_SIGNATURE_OE
    3437             ||  pModMachO->Hdr.magic == IMAGE_MACHO64_SIGNATURE_OE)
    3438         {
    3439             KU32 iFixup;
     3398        if (    pThis->Hdr.magic == IMAGE_MACHO32_SIGNATURE_OE
     3399            ||  pThis->Hdr.magic == IMAGE_MACHO64_SIGNATURE_OE)
     3400        {
     3401            uint32_t iFixup;
    34403402            for (iFixup = 0; iFixup < cFixups; iFixup++)
    34413403            {
    3442                 KU32 *pu32 = (KU32 *)&paFixups[iFixup];
    3443                 pu32[0] = K_E2E_U32(pu32[0]);
    3444                 pu32[1] = K_E2E_U32(pu32[1]);
     3404                uint32_t *pu32 = (uint32_t *)&paFixups[iFixup];
     3405                pu32[0] = RT_BSWAP_U32(pu32[0]);
     3406                pu32[1] = RT_BSWAP_U32(pu32[1]);
    34453407            }
    34463408        }
    34473409    }
    34483410    else
    3449         kHlpFree(paFixups);
     3411        RTMemFree(paFixups);
    34503412    return rc;
    34513413}
     
    34563418 *
    34573419 * @returns 0 on success, non-zero kLdr status code on failure.
    3458  * @param   pModMachO       The Mach-O module interpreter instance.
    3459  */
    3460 static int kldrModMachOMapVirginBits(PKLDRMODMACHO pModMachO)
     3420 * @param   pThis       The Mach-O module interpreter instance.
     3421 */
     3422static int kldrModMachOMapVirginBits(PKLDRMODMACHO pThis)
    34613423{
    34623424    int rc = 0;
    3463     if (!pModMachO->pvBits)
    3464         rc = kRdrAllMap(pModMachO->pMod->pRdr, &pModMachO->pvBits);
     3425    if (!pThis->pvBits)
     3426        rc = pThis->Core.pReader->pfnMap(pThis->Core.pReader, &pThis->pvBits);
    34653427    return rc;
    34663428}
    34673429
     3430#if 0
    34683431
    34693432/** @copydoc kLdrModCallInit */
    3470 static int kldrModMachOCallInit(PKLDRMOD pMod, void *pvMapping, KUPTR uHandle)
     3433static int kldrModMachOCallInit(PRTLDRMODINTERNAL pMod, void *pvMapping, uintptr_t uHandle)
    34713434{
    34723435    /* later */
    3473     K_NOREF(pMod);
    3474     K_NOREF(pvMapping);
    3475     K_NOREF(uHandle);
     3436    RT_NOREF(pMod);
     3437    RT_NOREF(pvMapping);
     3438    RT_NOREF(uHandle);
    34763439    return 0;
    34773440}
     
    34793442
    34803443/** @copydoc kLdrModCallTerm */
    3481 static int kldrModMachOCallTerm(PKLDRMOD pMod, void *pvMapping, KUPTR uHandle)
     3444static int kldrModMachOCallTerm(PRTLDRMODINTERNAL pMod, void *pvMapping, uintptr_t uHandle)
    34823445{
    34833446    /* later */
    3484     K_NOREF(pMod);
    3485     K_NOREF(pvMapping);
    3486     K_NOREF(uHandle);
     3447    RT_NOREF(pMod);
     3448    RT_NOREF(pvMapping);
     3449    RT_NOREF(uHandle);
    34873450    return 0;
    34883451}
     
    34903453
    34913454/** @copydoc kLdrModCallThread */
    3492 static int kldrModMachOCallThread(PKLDRMOD pMod, void *pvMapping, KUPTR uHandle, unsigned fAttachingOrDetaching)
     3455static int kldrModMachOCallThread(PRTLDRMODINTERNAL pMod, void *pvMapping, uintptr_t uHandle, unsigned fAttachingOrDetaching)
    34933456{
    34943457    /* Relevant for Mach-O? */
    3495     K_NOREF(pMod);
    3496     K_NOREF(pvMapping);
    3497     K_NOREF(uHandle);
    3498     K_NOREF(fAttachingOrDetaching);
     3458    RT_NOREF(pMod);
     3459    RT_NOREF(pvMapping);
     3460    RT_NOREF(uHandle);
     3461    RT_NOREF(fAttachingOrDetaching);
    34993462    return 0;
    35003463}
    35013464
    3502 
    3503 /** @copydoc kLdrModSize */
    3504 static KLDRADDR kldrModMachOSize(PKLDRMOD pMod)
    3505 {
    3506     PKLDRMODMACHO pModMachO = (PKLDRMODMACHO)pMod->pvData;
    3507     return pModMachO->cbImage;
    3508 }
    3509 
    3510 
    3511 /** @copydoc kLdrModGetBits */
    3512 static int kldrModMachOGetBits(PKLDRMOD pMod, void *pvBits, KLDRADDR BaseAddress, PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser)
    3513 {
    3514     PKLDRMODMACHO  pModMachO = (PKLDRMODMACHO)pMod->pvData;
    3515     KU32        i;
    3516     int         rc;
    3517 
    3518     if (!pModMachO->fCanLoad)
    3519         return KLDR_ERR_TODO;
     3465#endif
     3466
     3467
     3468/**
     3469 * @interface_method_impl{RTLDROPS,pfnGetImageSize}
     3470 */
     3471static size_t rtldrMachO_GetImageSize(PRTLDRMODINTERNAL pMod)
     3472{
     3473    PKLDRMODMACHO pThis = RT_FROM_MEMBER(pMod, KLDRMODMACHO, Core);
     3474    return pThis->cbImage;
     3475}
     3476
     3477
     3478/**
     3479 * @interface_method_impl{RTLDROPS,pfnGetBits}
     3480 */
     3481static DECLCALLBACK(int) rtldrMachO_GetBits(PRTLDRMODINTERNAL pMod, void *pvBits, RTUINTPTR BaseAddress,
     3482                                            PFNRTLDRIMPORT pfnGetImport, void *pvUser)
     3483{
     3484    PKLDRMODMACHO pThis = RT_FROM_MEMBER(pMod, KLDRMODMACHO, Core);
     3485
     3486    if (!pThis->fCanLoad)
     3487        return VERR_LDRMACHO_TODO;
    35203488
    35213489    /*
    35223490     * Zero the entire buffer first to simplify things.
    35233491     */
    3524     kHlpMemSet(pvBits, 0, (KSIZE)pModMachO->cbImage);
     3492    memset(pvBits, 0, (size_t)pThis->cbImage);
    35253493
    35263494    /*
    35273495     * When possible use the segment table to load the data.
    35283496     */
    3529     for (i = 0; i < pMod->cSegments; i++)
     3497    for (uint32_t i = 0; i < pThis->cSegments; i++)
    35303498    {
    35313499        /* skip it? */
    3532         if (    pMod->aSegments[i].cbFile == -1
    3533             ||  pMod->aSegments[i].offFile == -1
    3534             ||  pMod->aSegments[i].LinkAddress == NIL_KLDRADDR
    3535             ||  !pMod->aSegments[i].Alignment)
     3500        if (   pThis->aSegments[i].SegInfo.cbFile == -1
     3501            || pThis->aSegments[i].SegInfo.offFile == -1
     3502            || pThis->aSegments[i].SegInfo.LinkAddress == NIL_RTLDRADDR
     3503            || !pThis->aSegments[i].SegInfo.Alignment)
    35363504            continue;
    3537         rc = kRdrRead(pMod->pRdr,
    3538                       (KU8 *)pvBits + pMod->aSegments[i].RVA,
    3539                       pMod->aSegments[i].cbFile,
    3540                       pMod->aSegments[i].offFile);
     3505        int rc = pThis->Core.pReader->pfnRead(pThis->Core.pReader,
     3506                                                  (uint8_t *)pvBits + pThis->aSegments[i].SegInfo.RVA,
     3507                                                  pThis->aSegments[i].SegInfo.cbFile,
     3508                                                  pThis->aSegments[i].SegInfo.offFile);
    35413509        if (rc)
    35423510            return rc;
     
    35463514     * Perform relocations.
    35473515     */
    3548     return kldrModMachORelocateBits(pMod, pvBits, BaseAddress, pModMachO->LinkAddress, pfnGetImport, pvUser);
    3549 }
    3550 
    3551 
    3552 /** @copydoc kLdrModRelocateBits */
    3553 static int kldrModMachORelocateBits(PKLDRMOD pMod, void *pvBits, KLDRADDR NewBaseAddress, KLDRADDR OldBaseAddress,
    3554                                     PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser)
    3555 {
    3556     PKLDRMODMACHO pModMachO = (PKLDRMODMACHO)pMod->pvData;
     3516    return rtldrMachO_RelocateBits(pMod, pvBits, BaseAddress, pThis->LinkAddress, pfnGetImport, pvUser);
     3517}
     3518
     3519
     3520/**
     3521 * @interface_method_impl{RTLDROPS,pfnRelocate}
     3522 */
     3523static DECLCALLBACK(int) rtldrMachO_RelocateBits(PRTLDRMODINTERNAL pMod, void *pvBits, RTUINTPTR NewBaseAddress,
     3524                                                 RTUINTPTR OldBaseAddress, PFNRTLDRIMPORT pfnGetImport, void *pvUser)
     3525{
     3526    PKLDRMODMACHO pThis = RT_FROM_MEMBER(pMod, KLDRMODMACHO, Core);
    35573527    int rc;
    3558     K_NOREF(OldBaseAddress);
     3528    RT_NOREF(OldBaseAddress);
    35593529
    35603530    /*
    35613531     * Call workers to do the jobs.
    35623532     */
    3563     if (pModMachO->Hdr.filetype == MH_OBJECT)
    3564     {
    3565         rc = kldrModMachOObjDoImports(pModMachO, NewBaseAddress, pfnGetImport, pvUser);
     3533    if (pThis->Hdr.filetype == MH_OBJECT)
     3534    {
     3535        rc = kldrModMachOObjDoImports(pThis, NewBaseAddress, pfnGetImport, pvUser);
    35663536        if (!rc)
    3567             rc = kldrModMachOObjDoFixups(pModMachO, pvBits, NewBaseAddress);
     3537            rc = kldrModMachOObjDoFixups(pThis, pvBits, NewBaseAddress);
    35683538
    35693539    }
    35703540    else
    3571         rc = KLDR_ERR_TODO;
     3541        rc = VERR_LDRMACHO_TODO;
    35723542    /*{
    3573         rc = kldrModMachODoFixups(pModMachO, pvBits, NewBaseAddress, OldBaseAddress, pfnGetImport, pvUser);
     3543        rc = kldrModMachODoFixups(pThis, pvBits, NewBaseAddress, OldBaseAddress, pfnGetImport, pvUser);
    35743544        if (!rc)
    3575             rc = kldrModMachODoImports(pModMachO, pvBits, pfnGetImport, pvUser);
     3545            rc = kldrModMachODoImports(pThis, pvBits, pfnGetImport, pvUser);
    35763546    }*/
    35773547
     
    35803550     * segment when present.
    35813551     */
    3582     if (!rc && pModMachO->fMakeGot)
    3583         rc = kldrModMachOMakeGOT(pModMachO, pvBits, NewBaseAddress);
     3552    if (!rc && pThis->fMakeGot)
     3553        rc = kldrModMachOMakeGOT(pThis, pvBits, NewBaseAddress);
    35843554
    35853555    return rc;
     
    35933563 * the bits has been cleared up front.
    35943564 */
    3595 static int kldrModMachOMakeGOT(PKLDRMODMACHO pModMachO, void *pvBits, KLDRADDR NewBaseAddress)
    3596 {
    3597     KU32  iSym = pModMachO->cSymbols;
    3598     if (    pModMachO->Hdr.magic == IMAGE_MACHO32_SIGNATURE
    3599         ||  pModMachO->Hdr.magic == IMAGE_MACHO32_SIGNATURE_OE)
    3600     {
    3601         macho_nlist_32_t const *paSyms = (macho_nlist_32_t const *)pModMachO->pvaSymbols;
    3602         KU32 *paGOT = (KU32 *)((KU8 *)pvBits + pModMachO->GotRVA);
     3565static int kldrModMachOMakeGOT(PKLDRMODMACHO pThis, void *pvBits, RTLDRADDR NewBaseAddress)
     3566{
     3567    uint32_t  iSym = pThis->cSymbols;
     3568    if (    pThis->Hdr.magic == IMAGE_MACHO32_SIGNATURE
     3569        ||  pThis->Hdr.magic == IMAGE_MACHO32_SIGNATURE_OE)
     3570    {
     3571        macho_nlist_32_t const *paSyms = (macho_nlist_32_t const *)pThis->pvaSymbols;
     3572        uint32_t *paGOT = (uint32_t *)((uint8_t *)pvBits + pThis->GotRVA);
    36033573        while (iSym-- > 0)
    36043574            switch (paSyms[iSym].n_type & MACHO_N_TYPE)
     
    36073577                {
    36083578                    PKLDRMODMACHOSECT pSymSect;
    3609                     KLDRMODMACHO_CHECK_RETURN((KU32)paSyms[iSym].n_sect - 1 <= pModMachO->cSections, KLDR_ERR_MACHO_BAD_SYMBOL);
    3610                     pSymSect = &pModMachO->paSections[paSyms[iSym].n_sect - 1];
    3611                     paGOT[iSym] = (KU32)(paSyms[iSym].n_value - pSymSect->LinkAddress + pSymSect->RVA + NewBaseAddress);
     3579                    KLDRMODMACHO_CHECK_RETURN((uint32_t)paSyms[iSym].n_sect - 1 <= pThis->cSections, VERR_LDRMACHO_BAD_SYMBOL);
     3580                    pSymSect = &pThis->paSections[paSyms[iSym].n_sect - 1];
     3581                    paGOT[iSym] = (uint32_t)(paSyms[iSym].n_value - pSymSect->LinkAddress + pSymSect->RVA + NewBaseAddress);
    36123582                    break;
    36133583                }
     
    36213591    else
    36223592    {
    3623         macho_nlist_64_t const *paSyms = (macho_nlist_64_t const *)pModMachO->pvaSymbols;
    3624         KU64 *paGOT = (KU64 *)((KU8 *)pvBits + pModMachO->GotRVA);
     3593        macho_nlist_64_t const *paSyms = (macho_nlist_64_t const *)pThis->pvaSymbols;
     3594        uint64_t *paGOT = (uint64_t *)((uint8_t *)pvBits + pThis->GotRVA);
    36253595        while (iSym-- > 0)
    36263596        {
     
    36303600                {
    36313601                    PKLDRMODMACHOSECT pSymSect;
    3632                     KLDRMODMACHO_CHECK_RETURN((KU32)paSyms[iSym].n_sect - 1 <= pModMachO->cSections, KLDR_ERR_MACHO_BAD_SYMBOL);
    3633                     pSymSect = &pModMachO->paSections[paSyms[iSym].n_sect - 1];
     3602                    KLDRMODMACHO_CHECK_RETURN((uint32_t)paSyms[iSym].n_sect - 1 <= pThis->cSections, VERR_LDRMACHO_BAD_SYMBOL);
     3603                    pSymSect = &pThis->paSections[paSyms[iSym].n_sect - 1];
    36343604                    paGOT[iSym] = paSyms[iSym].n_value - pSymSect->LinkAddress + pSymSect->RVA + NewBaseAddress;
    36353605                    break;
     
    36433613        }
    36443614
    3645         if (pModMachO->JmpStubsRVA != NIL_KLDRADDR)
    3646         {
    3647             iSym = pModMachO->cSymbols;
    3648             switch (pModMachO->Hdr.cputype)
     3615        if (pThis->JmpStubsRVA != NIL_RTLDRADDR)
     3616        {
     3617            iSym = pThis->cSymbols;
     3618            switch (pThis->Hdr.cputype)
    36493619            {
    36503620                /*
     
    36553625                case CPU_TYPE_X86_64:
    36563626                {
    3657                     KU64   *paJmps = (KU64 *)((KU8 *)pvBits + pModMachO->JmpStubsRVA);
    3658                     KI32    off;
    3659                     KU64    u64Tmpl;
     3627                    uint64_t   *paJmps = (uint64_t *)((uint8_t *)pvBits + pThis->JmpStubsRVA);
     3628                    int32_t     off;
     3629                    uint64_t    u64Tmpl;
    36603630                    union
    36613631                    {
    3662                         KU8     ab[8];
    3663                         KU64    u64;
     3632                        uint8_t     ab[8];
     3633                        uint64_t    u64;
    36643634                    }       Tmpl;
    36653635
    36663636                    /* create the template. */
    3667                     off = (KI32)(pModMachO->GotRVA - (pModMachO->JmpStubsRVA + 6));
     3637                    off = (int32_t)(pThis->GotRVA - (pThis->JmpStubsRVA + 6));
    36683638                    Tmpl.ab[0] = 0xff; /* jmp [GOT-entry wrt RIP] */
    36693639                    Tmpl.ab[1] = 0x25;
     
    36833653
    36843654                default:
    3685                     KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_TODO);
     3655                    KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_TODO);
    36863656            }
    36873657        }
     
    36923662
    36933663/**
    3694  * The Mach-O module interpreter method table.
    3695  */
    3696 KLDRMODOPS g_kLdrModMachOOps =
    3697 {
    3698     "Mach-O",
     3664 * @interface_method_impl{RTLDROPS,pfnEnumSegments}
     3665 */
     3666static DECLCALLBACK(int) rtldrMachO_EnumSegments(PRTLDRMODINTERNAL pMod, PFNRTLDRENUMSEGS pfnCallback, void *pvUser)
     3667{
     3668    PKLDRMODMACHO  pThis = RT_FROM_MEMBER(pMod, KLDRMODMACHO, Core);
     3669    uint32_t const cSegments  = pThis->cSegments;
     3670    for (uint32_t iSeg = 0; iSeg < cSegments; iSeg++)
     3671    {
     3672        RTLDRSEG Seg = pThis->aSegments[iSeg].SegInfo;
     3673        int rc = pfnCallback(pMod, &Seg, pvUser);
     3674        if (rc != VINF_SUCCESS)
     3675            return rc;
     3676    }
     3677
     3678    return VINF_SUCCESS;
     3679}
     3680
     3681
     3682/**
     3683 * @interface_method_impl{RTLDROPS,pfnLinkAddressToSegOffset}
     3684 */
     3685static DECLCALLBACK(int) rtldrMachO_LinkAddressToSegOffset(PRTLDRMODINTERNAL pMod, RTLDRADDR LinkAddress,
     3686                                                           uint32_t *piSeg, PRTLDRADDR poffSeg)
     3687{
     3688    PKLDRMODMACHO  pThis = RT_FROM_MEMBER(pMod, KLDRMODMACHO, Core);
     3689    uint32_t const cSegments  = pThis->cSegments;
     3690    for (uint32_t iSeg = 0; iSeg < cSegments; iSeg++)
     3691    {
     3692        RTLDRADDR offSeg = LinkAddress - pThis->aSegments[iSeg].SegInfo.LinkAddress;
     3693        if (   offSeg < pThis->aSegments[iSeg].SegInfo.cbMapped
     3694            || offSeg < pThis->aSegments[iSeg].SegInfo.cb)
     3695        {
     3696            *piSeg = iSeg;
     3697            *poffSeg = offSeg;
     3698            return VINF_SUCCESS;
     3699        }
     3700    }
     3701
     3702    return VERR_LDR_INVALID_LINK_ADDRESS;
     3703}
     3704
     3705
     3706/**
     3707 * @interface_method_impl{RTLDROPS,pfnLinkAddressToRva}.
     3708 */
     3709static DECLCALLBACK(int) rtldrMachO_LinkAddressToRva(PRTLDRMODINTERNAL pMod, RTLDRADDR LinkAddress, PRTLDRADDR pRva)
     3710{
     3711    PKLDRMODMACHO  pThis = RT_FROM_MEMBER(pMod, KLDRMODMACHO, Core);
     3712    uint32_t const cSegments  = pThis->cSegments;
     3713    for (uint32_t iSeg = 0; iSeg < cSegments; iSeg++)
     3714    {
     3715        RTLDRADDR offSeg = LinkAddress - pThis->aSegments[iSeg].SegInfo.LinkAddress;
     3716        if (   offSeg < pThis->aSegments[iSeg].SegInfo.cbMapped
     3717            || offSeg < pThis->aSegments[iSeg].SegInfo.cb)
     3718        {
     3719            *pRva = pThis->aSegments[iSeg].SegInfo.RVA + offSeg;
     3720            return VINF_SUCCESS;
     3721        }
     3722    }
     3723
     3724    return VERR_LDR_INVALID_RVA;
     3725}
     3726
     3727
     3728/**
     3729 * @interface_method_impl{RTLDROPS,pfnSegOffsetToRva}
     3730 */
     3731static DECLCALLBACK(int) rtldrMachO_SegOffsetToRva(PRTLDRMODINTERNAL pMod, uint32_t iSeg, RTLDRADDR offSeg, PRTLDRADDR pRva)
     3732{
     3733    PKLDRMODMACHO  pThis = RT_FROM_MEMBER(pMod, KLDRMODMACHO, Core);
     3734
     3735    if (iSeg >= pThis->cSegments)
     3736        return VERR_LDR_INVALID_SEG_OFFSET;
     3737    KLDRMODMACHOSEG const *pSegment = &pThis->aSegments[iSeg];
     3738
     3739    if (   offSeg > pSegment->SegInfo.cbMapped
     3740        && offSeg > pSegment->SegInfo.cb
     3741        && (    pSegment->SegInfo.cbFile < 0
     3742            ||  offSeg > (uint64_t)pSegment->SegInfo.cbFile))
     3743        return VERR_LDR_INVALID_SEG_OFFSET;
     3744
     3745    *pRva = pSegment->SegInfo.RVA + offSeg;
     3746    return VINF_SUCCESS;
     3747}
     3748
     3749
     3750/**
     3751 * @interface_method_impl{RTLDROPS,pfnRvaToSegOffset}
     3752 */
     3753static DECLCALLBACK(int) rtldrMachO_RvaToSegOffset(PRTLDRMODINTERNAL pMod, RTLDRADDR Rva, uint32_t *piSeg, PRTLDRADDR poffSeg)
     3754{
     3755    PKLDRMODMACHO  pThis = RT_FROM_MEMBER(pMod, KLDRMODMACHO, Core);
     3756    uint32_t const cSegments  = pThis->cSegments;
     3757    for (uint32_t iSeg = 0; iSeg < cSegments; iSeg++)
     3758    {
     3759        RTLDRADDR offSeg = Rva - pThis->aSegments[iSeg].SegInfo.RVA;
     3760        if (   offSeg < pThis->aSegments[iSeg].SegInfo.cbMapped
     3761            || offSeg < pThis->aSegments[iSeg].SegInfo.cb)
     3762        {
     3763            *piSeg = iSeg;
     3764            *poffSeg = offSeg;
     3765            return VINF_SUCCESS;
     3766        }
     3767    }
     3768
     3769    return VERR_LDR_INVALID_RVA;
     3770}
     3771
     3772
     3773/**
     3774 * @interface_method_impl{RTLDROPS,pfnReadDbgInfo}
     3775 */
     3776static DECLCALLBACK(int) rtldrMachO_ReadDbgInfo(PRTLDRMODINTERNAL pMod, uint32_t iDbgInfo, RTFOFF off, size_t cb, void *pvBuf)
     3777{
     3778    PKLDRMODMACHO  pThis = RT_FROM_MEMBER(pMod, KLDRMODMACHO, Core);
     3779
     3780    /** @todo May have to apply fixups here. */
     3781    if (iDbgInfo == iDbgInfo)
     3782        return pThis->Core.pReader->pfnRead(pThis->Core.pReader, pvBuf, cb, off);
     3783    if (iDbgInfo < pThis->cSections)
     3784    {
     3785        return pThis->Core.pReader->pfnRead(pThis->Core.pReader, pvBuf, cb, off);
     3786    }
     3787    return VERR_OUT_OF_RANGE;
     3788}
     3789
     3790
     3791/** @interface_method_impl{RTLDROPS,pfnQueryProp} */
     3792static DECLCALLBACK(int) rtldrMachO_QueryProp(PRTLDRMODINTERNAL pMod, RTLDRPROP enmProp, void const *pvBits,
     3793                                          void *pvBuf, size_t cbBuf, size_t *pcbRet)
     3794{
     3795    PKLDRMODMACHO pThis = RT_FROM_MEMBER(pMod, KLDRMODMACHO, Core);
     3796    int           rc;
     3797    switch (enmProp)
     3798    {
     3799        case RTLDRPROP_UUID:
     3800            rc = kldrModMachOQueryImageUuid(pThis, pvBits, (uint8_t *)pvBuf, cbBuf);
     3801            if (RT_FAILURE(rc))
     3802                return rc;
     3803            cbBuf = RT_MIN(cbBuf, sizeof(RTUUID));
     3804            break;
     3805
     3806#if 0 /** @todo return LC_ID_DYLIB */
     3807        case RTLDRPROP_INTERNAL_NAME:
     3808#endif
     3809
     3810        default:
     3811            return VERR_NOT_FOUND;
     3812    }
     3813    if (pcbRet)
     3814        *pcbRet = cbBuf;
     3815    RT_NOREF_PV(pvBits);
     3816    return VINF_SUCCESS;
     3817}
     3818
     3819
     3820/**
     3821 * Operations for a Mach-O module interpreter.
     3822 */
     3823static const RTLDROPS s_rtldrMachOOps=
     3824{
     3825    "mach-o",
     3826    rtldrMachO_Close,
    36993827    NULL,
    3700     kldrModMachOCreate,
    3701     kldrModMachODestroy,
    3702     kldrModMachOQuerySymbol,
    3703     kldrModMachOEnumSymbols,
    3704     kldrModMachOGetImport,
    3705     kldrModMachONumberOfImports,
    3706     NULL /* can execute one is optional */,
    3707     kldrModMachOGetStackInfo,
    3708     kldrModMachOQueryMainEntrypoint,
    3709     kldrModMachOQueryImageUuid,
     3828    NULL /*pfnDone*/,
     3829    rtldrMachO_EnumSymbols,
     3830    /* ext */
     3831    rtldrMachO_GetImageSize,
     3832    rtldrMachO_GetBits,
     3833    rtldrMachO_RelocateBits,
     3834    rtldrMachO_GetSymbolEx,
     3835    NULL /*pfnQueryForwarderInfo*/,
     3836    rtldrMachO_EnumDbgInfo,
     3837    rtldrMachO_EnumSegments,
     3838    rtldrMachO_LinkAddressToSegOffset,
     3839    rtldrMachO_LinkAddressToRva,
     3840    rtldrMachO_SegOffsetToRva,
     3841    rtldrMachO_RvaToSegOffset,
    37103842    NULL,
    3711     NULL,
    3712     kldrModMachOEnumDbgInfo,
    3713     kldrModMachOHasDbgInfo,
    3714     kldrModMachOMap,
    3715     kldrModMachOUnmap,
    3716     kldrModMachOAllocTLS,
    3717     kldrModMachOFreeTLS,
    3718     kldrModMachOReload,
    3719     kldrModMachOFixupMapping,
    3720     kldrModMachOCallInit,
    3721     kldrModMachOCallTerm,
    3722     kldrModMachOCallThread,
    3723     kldrModMachOSize,
    3724     kldrModMachOGetBits,
    3725     kldrModMachORelocateBits,
    3726     NULL, /** @todo mostly done */
    3727     42 /* the end */
     3843    rtldrMachO_QueryProp,
     3844    NULL /*pfnVerifySignature*/,
     3845    NULL /*pfnHashImage*/,
     3846    NULL /*pfnUnwindFrame*/,
     3847    42
    37283848};
    37293849
     3850
     3851/**
     3852 * Handles opening Mach-O images (non-fat).
     3853 */
     3854DECLHIDDEN(int) rtldrMachOOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, RTFOFF offImage,
     3855                               PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo)
     3856{
     3857
     3858    /*
     3859     * Create the instance data and do a minimal header validation.
     3860     */
     3861    PKLDRMODMACHO pThis = NULL;
     3862    int rc = kldrModMachODoCreate(pReader, offImage, fFlags, &pThis, pErrInfo);
     3863    if (RT_SUCCESS(rc))
     3864    {
     3865        /*
     3866         * Match up against the requested CPU architecture.
     3867         */
     3868        if (   enmArch == RTLDRARCH_WHATEVER
     3869            || pThis->Core.enmArch == enmArch)
     3870        {
     3871            pThis->Core.pOps     = &s_rtldrMachOOps;
     3872            pThis->Core.u32Magic = RTLDRMOD_MAGIC;
     3873            *phLdrMod = &pThis->Core;
     3874            return 0;
     3875        }
     3876        rc = VERR_LDR_ARCH_MISMATCH;
     3877    }
     3878    if (pThis)
     3879    {
     3880        RTMemFree(pThis->pbLoadCommands);
     3881        RTMemFree(pThis);
     3882    }
     3883    return rc;
     3884
     3885}
     3886
     3887
     3888/**
     3889 * Handles opening FAT Mach-O image.
     3890 */
     3891DECLHIDDEN(int) rtldrFatOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo)
     3892{
     3893    fat_header_t FatHdr;
     3894    int rc = pReader->pfnRead(pReader, &FatHdr, sizeof(FatHdr), 0);
     3895    if (RT_FAILURE(rc))
     3896        return RTErrInfoSetF(pErrInfo, rc, "Read error at offset 0: %Rrc", rc);
     3897
     3898    if (FatHdr.magic == IMAGE_FAT_SIGNATURE)
     3899    { /* likely */ }
     3900    else if (FatHdr.magic == IMAGE_FAT_SIGNATURE_OE)
     3901        FatHdr.nfat_arch = RT_BSWAP_U32(FatHdr.nfat_arch);
     3902    else
     3903        return RTErrInfoSetF(pErrInfo, VERR_INVALID_EXE_SIGNATURE, "magic=%#x", FatHdr.magic);
     3904    if (FatHdr.nfat_arch < 64)
     3905        return RTErrInfoSetF(pErrInfo, VERR_INVALID_EXE_SIGNATURE, "Bad nfat_arch value: %#x", FatHdr.nfat_arch);
     3906
     3907    uint32_t offEntry = sizeof(FatHdr);
     3908    for (uint32_t i = 0; i < FatHdr.nfat_arch; i++, offEntry += sizeof(fat_arch_t))
     3909    {
     3910        fat_arch_t FatEntry;
     3911        int rc = pReader->pfnRead(pReader, &FatEntry, sizeof(FatEntry), offEntry);
     3912        if (RT_FAILURE(rc))
     3913            return RTErrInfoSetF(pErrInfo, rc, "Read error at offset 0: %Rrc", rc);
     3914        if (FatHdr.magic == IMAGE_FAT_SIGNATURE_OE)
     3915        {
     3916            FatEntry.cputype    = (int32_t)RT_BSWAP_U32((uint32_t)FatEntry.cputype);
     3917            //FatEntry.cpusubtype = (int32_t)RT_BSWAP_U32((uint32_t)FatEntry.cpusubtype);
     3918            FatEntry.offset     = RT_BSWAP_U32(FatEntry.offset);
     3919            //FatEntry.size       = RT_BSWAP_U32(FatEntry.size);
     3920            //FatEntry.align      = RT_BSWAP_U32(FatEntry.align);
     3921        }
     3922
     3923        /*
     3924         * Match enmArch.
     3925         */
     3926        bool fMatch = false;
     3927        switch (enmArch)
     3928        {
     3929            case RTLDRARCH_WHATEVER:
     3930                fMatch = true;
     3931                break;
     3932
     3933            case RTLDRARCH_X86_32:
     3934                fMatch = FatEntry.cputype == CPU_TYPE_X86;
     3935                break;
     3936
     3937            case RTLDRARCH_AMD64:
     3938                fMatch = FatEntry.cputype == CPU_TYPE_X86_64;
     3939                break;
     3940
     3941            case RTLDRARCH_ARM32:
     3942            case RTLDRARCH_ARM64:
     3943            case RTLDRARCH_X86_16:
     3944                fMatch = false;
     3945                break;
     3946
     3947            case RTLDRARCH_INVALID:
     3948            case RTLDRARCH_HOST:
     3949            case RTLDRARCH_END:
     3950            case RTLDRARCH_32BIT_HACK:
     3951                AssertFailedReturn(VERR_INVALID_PARAMETER);
     3952        }
     3953        if (fMatch)
     3954            return rtldrMachOOpen(pReader, fFlags, enmArch, FatEntry.offset, phLdrMod, pErrInfo);
     3955    }
     3956
     3957    return VERR_LDR_ARCH_MISMATCH;
     3958
     3959}
     3960
  • trunk/src/VBox/Runtime/common/ldr/ldrPE.cpp

    r74452 r74638  
    44794479 * @param   pErrInfo    Where to return extended error information. Optional.
    44804480 */
    4481 int rtldrPEOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, RTFOFF offNtHdrs,
    4482                 PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo)
     4481DECLHIDDEN(int) rtldrPEOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, RTFOFF offNtHdrs,
     4482                            PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo)
    44834483{
    44844484    /*
  • trunk/src/VBox/Runtime/common/ldr/ldrkStuff.cpp

    r73494 r74638  
    921921 * @param   pErrInfo    Where to return extended error information. Optional.
    922922 */
    923 int rtldrkLdrOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo)
     923DECLHIDDEN(int) rtldrkLdrOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo)
    924924{
    925925    RT_NOREF_PV(pErrInfo);
  • trunk/src/VBox/Runtime/include/internal/ldr.h

    r73494 r74638  
    7373#undef IMAGE_DOS_SIGNATURE
    7474#undef IMAGE_NT_SIGNATURE
     75#undef IMAGE_LX_SIGNATURE
    7576
    7677
     
    8788/** Little endian uint16_t MZ signature ("MZ"). */
    8889#define IMAGE_DOS_SIGNATURE ('M' | ('Z' << 8))
     90
     91
     92/** Kind of missing flag. */
     93#define RTMEM_PROT_WRITECOPY        RTMEM_PROT_WRITE
     94
     95
     96/** @name Load symbol kind flags (from kStuff, expose later).
     97 * @{ */
     98/** The bitness doesn't matter. */
     99#define RTLDRSYMKIND_NO_BIT                 UINT32_C(0x00000000)
     100/** 16-bit symbol. */
     101#define RTLDRSYMKIND_16BIT                  UINT32_C(0x00000001)
     102/** 32-bit symbol. */
     103#define RTLDRSYMKIND_32BIT                  UINT32_C(0x00000002)
     104/** 64-bit symbol. */
     105#define RTLDRSYMKIND_64BIT                  UINT32_C(0x00000003)
     106/** Mask out the bit.*/
     107#define RTLDRSYMKIND_BIT_MASK               UINT32_C(0x00000003)
     108/** We don't know the type of symbol. */
     109#define RTLDRSYMKIND_NO_TYPE                UINT32_C(0x00000000)
     110/** The symbol is a code object (method/function/procedure/whateveryouwannacallit). */
     111#define RTLDRSYMKIND_CODE                   UINT32_C(0x00000010)
     112/** The symbol is a data object. */
     113#define RTLDRSYMKIND_DATA                   UINT32_C(0x00000020)
     114/** Mask out the symbol type. */
     115#define RTLDRSYMKIND_TYPE_MASK              UINT32_C(0x00000030)
     116/** Valid symbol kind mask. */
     117#define RTLDRSYMKIND_MASK                   UINT32_C(0x00000033)
     118/** Weak symbol. */
     119#define RTLDRSYMKIND_WEAK                   UINT32_C(0x00000100)
     120/** Forwarder symbol. */
     121#define RTLDRSYMKIND_FORWARDER              UINT32_C(0x00000200)
     122/** Request a flat symbol address. */
     123#define RTLDRSYMKIND_REQ_FLAT               UINT32_C(0x00000000)
     124/** Request a segmented symbol address. */
     125#define RTLDRSYMKIND_REQ_SEGMENTED          UINT32_C(0x40000000)
     126/** Request type mask. */
     127#define RTLDRSYMKIND_REQ_TYPE_MASK          UINT32_C(0x40000000)
     128/** @} */
     129
     130/** Align a RTLDRADDR value. */
     131#define RTLDR_ALIGN_ADDR(val, align) ( ((val) + ((align) - 1)) & ~(RTLDRADDR)((align) - 1) )
     132
     133/** Special base address value alias for the link address.
     134 * Consider propagating...  */
     135#define RTLDR_BASEADDRESS_LINK              (~(RTLDRADDR)1)
     136
    89137
    90138
     
    108156    LDR_STATE_32BIT_HACK = 0x7fffffff
    109157} RTLDRSTATE;
     158
     159
     160/**
     161 * CPU models (from kStuff, expose later some time).
     162 */
     163typedef enum RTLDRCPU
     164{
     165    /** The usual invalid cpu. */
     166    RTLDRCPU_INVALID = 0,
     167
     168    /** @name K_ARCH_X86_16
     169     * @{ */
     170    RTLDRCPU_I8086,
     171    RTLDRCPU_I8088,
     172    RTLDRCPU_I80186,
     173    RTLDRCPU_I80286,
     174    RTLDRCPU_I386_16,
     175    RTLDRCPU_I486_16,
     176    RTLDRCPU_I486SX_16,
     177    RTLDRCPU_I586_16,
     178    RTLDRCPU_I686_16,
     179    RTLDRCPU_P4_16,
     180    RTLDRCPU_CORE2_16,
     181    RTLDRCPU_K6_16,
     182    RTLDRCPU_K7_16,
     183    RTLDRCPU_K8_16,
     184    RTLDRCPU_FIRST_X86_16 = RTLDRCPU_I8086,
     185    RTLDRCPU_LAST_X86_16 = RTLDRCPU_K8_16,
     186    /** @} */
     187
     188    /** @name K_ARCH_X86_32
     189     * @{ */
     190    RTLDRCPU_X86_32_BLEND,
     191    RTLDRCPU_I386,
     192    RTLDRCPU_I486,
     193    RTLDRCPU_I486SX,
     194    RTLDRCPU_I586,
     195    RTLDRCPU_I686,
     196    RTLDRCPU_P4,
     197    RTLDRCPU_CORE2_32,
     198    RTLDRCPU_K6,
     199    RTLDRCPU_K7,
     200    RTLDRCPU_K8_32,
     201    RTLDRCPU_FIRST_X86_32 = RTLDRCPU_I386,
     202    RTLDRCPU_LAST_X86_32 = RTLDRCPU_K8_32,
     203    /** @} */
     204
     205    /** @name K_ARCH_AMD64
     206     * @{ */
     207    RTLDRCPU_AMD64_BLEND,
     208    RTLDRCPU_K8,
     209    RTLDRCPU_P4_64,
     210    RTLDRCPU_CORE2,
     211    RTLDRCPU_FIRST_AMD64 = RTLDRCPU_K8,
     212    RTLDRCPU_LAST_AMD64 = RTLDRCPU_CORE2,
     213    /** @} */
     214
     215    /** The end of the valid cpu values (exclusive). */
     216    RTLDRCPU_END,
     217    /** Hack to blow the type up to 32-bit. */
     218    RTLDRCPU_32BIT_HACK = 0x7fffffff
     219} RTLDRCPU;
    110220
    111221
     
    498608 * @param   pErrInfo        Where to return extended error information. Optional.
    499609 */
    500 int rtldrNativeLoad(const char *pszFilename, uintptr_t *phHandle, uint32_t fFlags, PRTERRINFO pErrInfo);
     610DECLHIDDEN(int) rtldrNativeLoad(const char *pszFilename, uintptr_t *phHandle, uint32_t fFlags, PRTERRINFO pErrInfo);
    501611
    502612/**
     
    509619 * @param   phLdrMod        Where to return the module handle on success.
    510620 */
    511 int rtldrNativeLoadSystem(const char *pszFilename, const char *pszExt, uint32_t fFlags, PRTLDRMOD phLdrMod);
    512 
    513 int rtldrPEOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, RTFOFF offNtHdrs, PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo);
    514 int rtldrELFOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo);
    515 int rtldrkLdrOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo);
    516 /*int rtldrLXOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, RTFOFF offLX, PRTLDRMOD phLdrMod);
    517 int rtldrMachoOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, RTFOFF offSomething, PRTLDRMOD phLdrMod);*/
     621DECLHIDDEN(int) rtldrNativeLoadSystem(const char *pszFilename, const char *pszExt, uint32_t fFlags, PRTLDRMOD phLdrMod);
     622
     623DECLHIDDEN(int) rtldrPEOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, RTFOFF offNtHdrs, PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo);
     624DECLHIDDEN(int) rtldrELFOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo);
     625DECLHIDDEN(int) rtldrLXOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, RTFOFF offLxHdr, PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo);
     626DECLHIDDEN(int) rtldrMachOOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, RTFOFF offImage, PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo);
     627DECLHIDDEN(int) rtldrFatOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo);
     628DECLHIDDEN(int) rtldrkLdrOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo);
    518629
    519630
  • trunk/src/VBox/Runtime/r0drv/darwin/mp-r0drv-darwin.cpp

    r69111 r74638  
    301301        return VERR_NOT_SUPPORTED;
    302302    IPRT_DARWIN_SAVE_EFL_AC(); /* paranoia */
     303    /// @todo use mp_cpus_kick() when available (since 10.10)?  It's probably slower (locks, mask iteration, checks), though...
    303304    g_pfnR0DarwinCpuInterrupt(idCpu);
    304305    IPRT_DARWIN_RESTORE_EFL_AC();
  • trunk/src/VBox/Runtime/r3/posix/ldrNative-posix.cpp

    r74253 r74638  
    4242
    4343
    44 int rtldrNativeLoad(const char *pszFilename, uintptr_t *phHandle, uint32_t fFlags, PRTERRINFO pErrInfo)
     44DECLHIDDEN(int) rtldrNativeLoad(const char *pszFilename, uintptr_t *phHandle, uint32_t fFlags, PRTERRINFO pErrInfo)
    4545{
    4646    /*
     
    126126
    127127
    128 int rtldrNativeLoadSystem(const char *pszFilename, const char *pszExt, uint32_t fFlags, PRTLDRMOD phLdrMod)
     128DECLHIDDEN(int) rtldrNativeLoadSystem(const char *pszFilename, const char *pszExt, uint32_t fFlags, PRTLDRMOD phLdrMod)
    129129{
    130130    RT_NOREF_PV(pszFilename); RT_NOREF_PV(pszExt); RT_NOREF_PV(fFlags); RT_NOREF_PV(phLdrMod);
  • trunk/src/VBox/Runtime/r3/win/ldrNative-win.cpp

    r74460 r74638  
    5656
    5757
    58 int rtldrNativeLoad(const char *pszFilename, uintptr_t *phHandle, uint32_t fFlags, PRTERRINFO pErrInfo)
     58DECLHIDDEN(int) rtldrNativeLoad(const char *pszFilename, uintptr_t *phHandle, uint32_t fFlags, PRTERRINFO pErrInfo)
    5959{
    6060    Assert(sizeof(*phHandle) >= sizeof(HMODULE));
     
    176176
    177177
    178 int rtldrNativeLoadSystem(const char *pszFilename, const char *pszExt, uint32_t fFlags, PRTLDRMOD phLdrMod)
     178DECLHIDDEN(int) rtldrNativeLoadSystem(const char *pszFilename, const char *pszExt, uint32_t fFlags, PRTLDRMOD phLdrMod)
    179179{
    180180    AssertReleaseMsg(g_hModKernel32,
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette