VirtualBox

Ignore:
Timestamp:
Feb 15, 2020 9:19:54 PM (5 years ago)
Author:
vboxsync
Message:

IPRT,VMM,DBGPlugInDarwin: Implemented in-memory guest kernel and kext image loading for OS X / Mach-O. Requires LINKEDIT to not be jettisoned to work.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/dbg/dbgmod.cpp

    r83084 r83085  
    13901390
    13911391
    1392 RTDECL(int) RTDbgModCreateFromMachOImage(PRTDBGMOD phDbgMod, const char *pszFilename, const char *pszName,
    1393                                          RTLDRARCH enmArch, uint32_t cbImage, uint32_t cSegs, PCRTDBGSEGMENT paSegs,
     1392RTDECL(int) RTDbgModCreateFromMachOImage(PRTDBGMOD phDbgMod, const char *pszFilename, const char *pszName, RTLDRARCH enmArch,
     1393                                         PRTLDRMOD phLdrModIn, uint32_t cbImage, uint32_t cSegs, PCRTDBGSEGMENT paSegs,
    13941394                                         PCRTUUID pUuid, RTDBGCFG hDbgCfg, uint32_t fFlags)
    13951395{
     
    14101410        AssertReturn(!cbImage, VERR_INVALID_PARAMETER);
    14111411    }
    1412     AssertReturn(cbImage || cSegs, VERR_INVALID_PARAMETER);
    14131412    AssertPtrNullReturn(pUuid, VERR_INVALID_POINTER);
    14141413    AssertReturn(!(fFlags & ~RTDBGMOD_F_VALID_MASK), VERR_INVALID_FLAGS);
     1414
     1415    AssertPtrNullReturn(phLdrModIn, VERR_INVALID_POINTER);
     1416    RTLDRMOD hLdrModIn = phLdrModIn ? *phLdrModIn : NIL_RTLDRMOD;
     1417    AssertReturn(hLdrModIn == NIL_RTLDRMOD || RTLdrSize(hLdrModIn) != ~(size_t)0, VERR_INVALID_HANDLE);
     1418
     1419    AssertReturn(cbImage || cSegs || hLdrModIn != NIL_RTLDRMOD, VERR_INVALID_PARAMETER);
    14151420
    14161421    int rc = rtDbgModLazyInit();
     
    14231428        rc = RTDbgCfgQueryUInt(hDbgCfg, RTDBGCFGPROP_FLAGS, &fDbgCfg);
    14241429        AssertRCReturn(rc, rc);
     1430    }
     1431
     1432    /*
     1433     * If we got no UUID but the caller passed in a module handle, try
     1434     * query the UUID from it.
     1435     */
     1436    RTUUID UuidFromImage = RTUUID_INITIALIZE_NULL;
     1437    if ((!pUuid || RTUuidIsNull(pUuid)) && hLdrModIn != NIL_RTLDRMOD)
     1438    {
     1439        rc = RTLdrQueryProp(hLdrModIn, RTLDRPROP_UUID, &UuidFromImage, sizeof(UuidFromImage));
     1440        if (RT_SUCCESS(rc))
     1441            pUuid = &UuidFromImage;
    14251442    }
    14261443
     
    14511468                    || cSegs /* for the time being. */
    14521469                    || (!cbImage && !cSegs)
    1453                     || (fFlags & RTDBGMOD_F_NOT_DEFERRED) )
     1470                    || (fFlags & RTDBGMOD_F_NOT_DEFERRED)
     1471                    || hLdrModIn != NIL_RTLDRMOD)
     1472                {
    14541473                    rc = rtDbgModFromMachOImageWorker(pDbgMod, enmArch, cbImage, cSegs, paSegs, pUuid, hDbgCfg, fFlags);
     1474                    if (RT_FAILURE(rc) && hLdrModIn != NIL_RTLDRMOD)
     1475                    {
     1476                        /*
     1477                         * Create module based on exports from hLdrModIn.
     1478                         */
     1479                        if (!cbImage)
     1480                            cbImage = (uint32_t)RTLdrSize(hLdrModIn);
     1481                        pDbgMod->pImgVt = &g_rtDbgModVtImgLdr;
     1482
     1483                        rc = rtDbgModLdrOpenFromHandle(pDbgMod, hLdrModIn);
     1484                        if (RT_SUCCESS(rc))
     1485                        {
     1486                            /* We now own the loader handle, so clear the caller variable. */
     1487                            if (phLdrModIn)
     1488                                *phLdrModIn = NIL_RTLDRMOD;
     1489
     1490                            /** @todo delayed exports stuff   */
     1491                            rc = rtDbgModCreateForExports(pDbgMod);
     1492                        }
     1493                    }
     1494                }
    14551495                else
    14561496                {
     
    14931533    return rc;
    14941534}
    1495 
    1496 
    1497 
    14981535RT_EXPORT_SYMBOL(RTDbgModCreateFromMachOImage);
    14991536
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