VirtualBox

Ignore:
Timestamp:
Dec 9, 2009 1:52:52 AM (15 years ago)
Author:
vboxsync
Message:

SUPDrv: Sketched out support for native module loading. (OS parts are all stubs and the IOC interface changes disabled.)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/Support/SUPLib.cpp

    r23725 r25258  
    272272        strcpy(CookieReq.u.In.szMagic, SUPCOOKIE_MAGIC);
    273273        CookieReq.u.In.u32ReqVersion = SUPDRV_IOC_VERSION;
    274         const uint32_t uMinVersion = (SUPDRV_IOC_VERSION & 0xffff0000) == 0x00100001
    275                                    ?  0x00100001
     274#ifdef SUPDRV_USE_NATIVE_LOADER
     275        const uint32_t uMinVersion = (SUPDRV_IOC_VERSION & 0xffff0000) == 0x00120000
     276                                   ?  0x00120000
    276277                                   :  SUPDRV_IOC_VERSION & 0xffff0000;
     278#else
     279       const uint32_t uMinVersion = (SUPDRV_IOC_VERSION & 0xffff0000) == 0x00100001
     280                                       ?  0x00100001
     281                                   :  SUPDRV_IOC_VERSION & 0xffff0000;
     282#endif
    277283        CookieReq.u.In.u32MinVersion = uMinVersion;
    278284        rc = suplibOsIOCtl(&g_supLibData, SUP_IOCTL_COOKIE, &CookieReq, SUP_IOCTL_COOKIE_SIZE);
     
    16441650static int supLoadModule(const char *pszFilename, const char *pszModule, const char *pszSrvReqHandler, void **ppvImageBase)
    16451651{
     1652    int rc;
     1653
    16461654    /*
    16471655     * Validate input.
     
    16511659    AssertPtrReturn(ppvImageBase, VERR_INVALID_PARAMETER);
    16521660    AssertReturn(strlen(pszModule) < RT_SIZEOFMEMB(SUPLDROPEN, u.In.szName), VERR_FILENAME_TOO_LONG);
     1661#ifdef SUPDRV_USE_NATIVE_LOADER
     1662    char szAbsFilename[RT_SIZEOFMEMB(SUPLDROPEN, u.In.szFilename)];
     1663    rc = RTPathAbs(pszFilename, szAbsFilename, sizeof(szAbsFilename));
     1664    if (RT_FAILURE(rc))
     1665        return rc;
     1666    pszFilename = szAbsFilename;
     1667#endif
    16531668
    16541669    const bool fIsVMMR0 = !strcmp(pszModule, "VMMR0.r0");
     
    16601675     */
    16611676    RTLDRMOD hLdrMod;
    1662     int rc = RTLdrOpen(pszFilename, 0, RTLDRARCH_HOST, &hLdrMod);
     1677    rc = RTLdrOpen(pszFilename, 0, RTLDRARCH_HOST, &hLdrMod);
    16631678    if (!RT_SUCCESS(rc))
    16641679        return rc;
     
    16731688        const uint32_t  offSymTab = RT_ALIGN_32(CalcArgs.cbImage, 8);
    16741689        const uint32_t  offStrTab = offSymTab + CalcArgs.cSymbols * sizeof(SUPLDRSYM);
    1675         const uint32_t  cbImage  = RT_ALIGN_32(offStrTab + CalcArgs.cbStrings, 8);
     1690        const uint32_t  cbImageWithTabs = RT_ALIGN_32(offStrTab + CalcArgs.cbStrings, 8);
    16761691
    16771692        /*
     
    16851700        OpenReq.Hdr.fFlags = SUPREQHDR_FLAGS_DEFAULT;
    16861701        OpenReq.Hdr.rc = VERR_INTERNAL_ERROR;
    1687         OpenReq.u.In.cbImage = cbImage;
     1702        OpenReq.u.In.cbImageWithTabs = cbImageWithTabs;
     1703#ifdef SUPDRV_USE_NATIVE_LOADER
     1704        OpenReq.u.In.cbImageBits = (uint32_t)CalcArgs.cbImage;
     1705#endif
    16881706        strcpy(OpenReq.u.In.szName, pszModule);
     1707#ifdef SUPDRV_USE_NATIVE_LOADER
     1708        strcpy(OpenReq.u.In.szFilename, pszFilename);
     1709#endif
    16891710        if (!g_u32FakeMode)
    16901711        {
     
    17061727             * Allocate memory for the image bits.
    17071728             */
    1708             PSUPLDRLOAD pLoadReq = (PSUPLDRLOAD)RTMemTmpAlloc(SUP_IOCTL_LDR_LOAD_SIZE(cbImage));
     1729            PSUPLDRLOAD pLoadReq = (PSUPLDRLOAD)RTMemTmpAlloc(SUP_IOCTL_LDR_LOAD_SIZE(cbImageWithTabs));
    17091730            if (pLoadReq)
    17101731            {
     
    17671788                            pLoadReq->Hdr.u32Cookie = g_u32Cookie;
    17681789                            pLoadReq->Hdr.u32SessionCookie = g_u32SessionCookie;
    1769                             pLoadReq->Hdr.cbIn = SUP_IOCTL_LDR_LOAD_SIZE_IN(cbImage);
     1790                            pLoadReq->Hdr.cbIn = SUP_IOCTL_LDR_LOAD_SIZE_IN(cbImageWithTabs);
    17701791                            pLoadReq->Hdr.cbOut = SUP_IOCTL_LDR_LOAD_SIZE_OUT;
    17711792                            pLoadReq->Hdr.fFlags = SUPREQHDR_FLAGS_MAGIC | SUPREQHDR_FLAGS_EXTRA_IN;
     
    17951816                            pLoadReq->u.In.cbStrTab                   = (uint32_t)CalcArgs.cbStrings;
    17961817                            AssertRelease(pLoadReq->u.In.cbStrTab == CalcArgs.cbStrings);
     1818#ifdef SUPDRV_USE_NATIVE_LOADER
     1819                            pLoadReq->u.In.cbImageBits                = (uint32_t)CalcArgs.cbImage;
     1820#endif
    17971821                            pLoadReq->u.In.offSymbols                 = offSymTab;
    17981822                            pLoadReq->u.In.cSymbols                   = CalcArgs.cSymbols;
    1799                             pLoadReq->u.In.cbImage                    = cbImage;
     1823                            pLoadReq->u.In.cbImageWithTabs            = cbImageWithTabs;
    18001824                            pLoadReq->u.In.pvImageBase                = OpenReq.u.Out.pvImageBase;
    18011825                            if (!g_u32FakeMode)
    18021826                            {
    1803                                 rc = suplibOsIOCtl(&g_supLibData, SUP_IOCTL_LDR_LOAD, pLoadReq, SUP_IOCTL_LDR_LOAD_SIZE(cbImage));
     1827                                rc = suplibOsIOCtl(&g_supLibData, SUP_IOCTL_LDR_LOAD, pLoadReq, SUP_IOCTL_LDR_LOAD_SIZE(cbImageWithTabs));
    18041828                                if (RT_SUCCESS(rc))
    18051829                                    rc = pLoadReq->Hdr.rc;
     
    18341858            else
    18351859            {
    1836                 AssertMsgFailed(("failed to allocated %d bytes for SUPLDRLOAD_IN structure!\n", SUP_IOCTL_LDR_LOAD_SIZE(cbImage)));
     1860                AssertMsgFailed(("failed to allocated %u bytes for SUPLDRLOAD_IN structure!\n", SUP_IOCTL_LDR_LOAD_SIZE(cbImageWithTabs)));
    18371861                rc = VERR_NO_TMP_MEMORY;
    18381862            }
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