VirtualBox

Changeset 57378 in vbox for trunk/src/VBox/HostDrivers


Ignore:
Timestamp:
Aug 17, 2015 11:54:27 AM (9 years ago)
Author:
vboxsync
Message:

SUPDrv: Modified SUP_IOCTL_LDR_LOAD to return an error string, major support driver version bump, and removed the long obsolete VMMR0EntryInt.

Location:
trunk/src/VBox/HostDrivers/Support
Files:
5 edited

Legend:

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

    r57358 r57378  
    141141static int                  supdrvIOCtl_LdrGetSymbol(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPLDRGETSYMBOL pReq);
    142142static int                  supdrvIDC_LdrGetSymbol(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPDRVIDCREQGETSYM pReq);
    143 static int                  supdrvLdrSetVMMR0EPs(PSUPDRVDEVEXT pDevExt, void *pvVMMR0, void *pvVMMR0EntryInt,void *pvVMMR0EntryFast, void *pvVMMR0EntryEx);
     143static int                  supdrvLdrSetVMMR0EPs(PSUPDRVDEVEXT pDevExt, void *pvVMMR0, void *pvVMMR0EntryFast, void *pvVMMR0EntryEx);
    144144static void                 supdrvLdrUnsetVMMR0EPs(PSUPDRVDEVEXT pDevExt);
    145145static int                  supdrvLdrAddUsage(PSUPDRVSESSION pSession, PSUPDRVLDRIMAGE pImage);
     
    46934693
    46944694/**
     4695 * Formats a load error message.
     4696 *
     4697 * @returns @a rc
     4698 * @param   rc                  Return code.
     4699 * @param   pReq                The request.
     4700 * @param   pszFormat           The error message format string.
     4701 * @param   ...                 Argument to the format string.
     4702 */
     4703int VBOXCALL supdrvLdrLoadError(int rc, PSUPLDRLOAD pReq, const char *pszFormat, ...)
     4704{
     4705    va_list va;
     4706    va_start(va, pszFormat);
     4707    pReq->u.Out.uErrorMagic = SUPLDRLOAD_ERROR_MAGIC;
     4708    RTStrPrintfV(pReq->u.Out.szError, sizeof(pReq->u.Out.szError), pszFormat, va);
     4709    va_end(va);
     4710    Log(("SUP_IOCTL_LDR_LOAD: %s [rc=%Rrc]\n", pReq->u.Out.szError, rc));
     4711    return rc;
     4712}
     4713
     4714
     4715/**
    46954716 * Loads the image bits.
    46964717 *
     
    47234744    {
    47244745        supdrvLdrUnlock(pDevExt);
    4725         Log(("SUP_IOCTL_LDR_LOAD: couldn't find image!\n"));
    4726         return VERR_INVALID_HANDLE;
     4746        return supdrvLdrLoadError(VERR_INVALID_HANDLE, pReq, "Image not found");
    47274747    }
    47284748    pImage = pUsage->pImage;
     
    47354755    {
    47364756        supdrvLdrUnlock(pDevExt);
    4737         Log(("SUP_IOCTL_LDR_LOAD: image size mismatch!! %d(prep) != %d(load) or %d != %d\n",
    4738              pImage->cbImageWithTabs, pReq->u.In.cbImageWithTabs, pImage->cbImageBits, pReq->u.In.cbImageBits));
    4739         return VERR_INVALID_HANDLE;
     4757        return supdrvLdrLoadError(VERR_INVALID_HANDLE, pReq, "Image size mismatch found: %d(prep) != %d(load) or %d != %d",
     4758                                  pImage->cbImageWithTabs, pReq->u.In.cbImageWithTabs, pImage->cbImageBits, pReq->u.In.cbImageBits);
    47404759    }
    47414760
     
    47464765        if (uState != SUP_IOCTL_LDR_LOAD)
    47474766            AssertMsgFailed(("SUP_IOCTL_LDR_LOAD: invalid image state %d (%#x)!\n", uState, uState));
     4767        pReq->u.Out.uErrorMagic = 0;
    47484768        return VERR_ALREADY_LOADED;
    47494769    }
     
    47534773    {
    47544774        supdrvLdrUnlock(pDevExt);
    4755         Log(("SUP_IOCTL_LDR_LOAD: Not loading '%s' image bits, loader interface is locked down!\n", pImage->szName));
    4756         return VERR_PERMISSION_DENIED;
     4775        return supdrvLdrLoadError(VERR_PERMISSION_DENIED, pReq, "Loader is locked down");
    47574776    }
    47584777
     
    47644783        case SUPLDRLOADEP_VMMR0:
    47654784            rc = supdrvLdrValidatePointer(    pDevExt, pImage, pReq->u.In.EP.VMMR0.pvVMMR0,          false, pReq->u.In.abImage, "pvVMMR0");
    4766             if (RT_SUCCESS(rc))
    4767                 rc = supdrvLdrValidatePointer(pDevExt, pImage, pReq->u.In.EP.VMMR0.pvVMMR0EntryInt,  false, pReq->u.In.abImage, "pvVMMR0EntryInt");
    47684785            if (RT_SUCCESS(rc))
    47694786                rc = supdrvLdrValidatePointer(pDevExt, pImage, pReq->u.In.EP.VMMR0.pvVMMR0EntryFast, false, pReq->u.In.abImage, "pvVMMR0EntryFast");
     
    47714788                rc = supdrvLdrValidatePointer(pDevExt, pImage, pReq->u.In.EP.VMMR0.pvVMMR0EntryEx,   false, pReq->u.In.abImage, "pvVMMR0EntryEx");
    47724789            if (RT_FAILURE(rc))
    4773                 return rc;
     4790                return supdrvLdrLoadError(rc, pReq, "Invalid VMMR0 pointer");
    47744791            break;
    47754792
     
    47774794            rc = supdrvLdrValidatePointer(pDevExt, pImage, pReq->u.In.EP.Service.pfnServiceReq, false, pReq->u.In.abImage, "pfnServiceReq");
    47784795            if (RT_FAILURE(rc))
    4779                 return rc;
     4796                return supdrvLdrLoadError(rc, pReq, "Invalid pfnServiceReq pointer: %p", pReq->u.In.EP.Service.pfnServiceReq);
    47804797            if (    pReq->u.In.EP.Service.apvReserved[0] != NIL_RTR0PTR
    47814798                ||  pReq->u.In.EP.Service.apvReserved[1] != NIL_RTR0PTR
     
    47834800            {
    47844801                supdrvLdrUnlock(pDevExt);
    4785                 Log(("Out of range (%p LB %#x): apvReserved={%p,%p,%p} MBZ!\n",
    4786                      pImage->pvImage, pReq->u.In.cbImageWithTabs,
    4787                      pReq->u.In.EP.Service.apvReserved[0],
    4788                      pReq->u.In.EP.Service.apvReserved[1],
    4789                      pReq->u.In.EP.Service.apvReserved[2]));
    4790                 return VERR_INVALID_PARAMETER;
     4802                return supdrvLdrLoadError(VERR_INVALID_PARAMETER, pReq,
     4803                                          "Out of range (%p LB %#x): apvReserved={%p,%p,%p} MBZ!",
     4804                                          pImage->pvImage, pReq->u.In.cbImageWithTabs,
     4805                                          pReq->u.In.EP.Service.apvReserved[0],
     4806                                          pReq->u.In.EP.Service.apvReserved[1],
     4807                                          pReq->u.In.EP.Service.apvReserved[2]);
    47914808            }
    47924809            break;
     
    47944811        default:
    47954812            supdrvLdrUnlock(pDevExt);
    4796             Log(("Invalid eEPType=%d\n", pReq->u.In.eEPType));
    4797             return VERR_INVALID_PARAMETER;
     4813            return supdrvLdrLoadError(VERR_INVALID_PARAMETER, pReq, "Invalid eEPType=%d", pReq->u.In.eEPType);
    47984814    }
    47994815
    48004816    rc = supdrvLdrValidatePointer(pDevExt, pImage, pReq->u.In.pfnModuleInit, true, pReq->u.In.abImage, "pfnModuleInit");
    48014817    if (RT_FAILURE(rc))
    4802         return rc;
     4818        return supdrvLdrLoadError(rc, pReq, "Invalid pfnModuleInit pointer: %p", pReq->u.In.pfnModuleInit);
    48034819    rc = supdrvLdrValidatePointer(pDevExt, pImage, pReq->u.In.pfnModuleTerm, true, pReq->u.In.abImage, "pfnModuleTerm");
    48044820    if (RT_FAILURE(rc))
    4805         return rc;
     4821        return supdrvLdrLoadError(rc, pReq, "Invalid pfnModuleTerm pointer: %p", pReq->u.In.pfnModuleTerm);
    48064822    SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING);
    48074823
     
    48174833            memcpy(pImage->pachStrTab, &pReq->u.In.abImage[pReq->u.In.offStrTab], pImage->cbStrTab);
    48184834        else
    4819             rc = /*VERR_NO_MEMORY*/ VERR_INTERNAL_ERROR_3;
     4835            rc = supdrvLdrLoadError(VERR_NO_MEMORY, pReq, "Out of memory for string table: %#x", pImage->cbStrTab);
    48204836        SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING);
    48214837    }
     
    48294845            memcpy(pImage->paSymbols, &pReq->u.In.abImage[pReq->u.In.offSymbols], cbSymbols);
    48304846        else
    4831             rc = /*VERR_NO_MEMORY*/ VERR_INTERNAL_ERROR_4;
     4847            rc = supdrvLdrLoadError(VERR_NO_MEMORY, pReq, "Out of memory for symbol table: %#x", cbSymbols);
    48324848        SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING);
    48334849    }
     
    48644880                break;
    48654881            case SUPLDRLOADEP_VMMR0:
    4866                 rc = supdrvLdrSetVMMR0EPs(pDevExt, pReq->u.In.EP.VMMR0.pvVMMR0, pReq->u.In.EP.VMMR0.pvVMMR0EntryInt,
     4882                rc = supdrvLdrSetVMMR0EPs(pDevExt, pReq->u.In.EP.VMMR0.pvVMMR0,
    48674883                                          pReq->u.In.EP.VMMR0.pvVMMR0EntryFast, pReq->u.In.EP.VMMR0.pvVMMR0EntryEx);
    48684884                break;
     
    48884904        pDevExt->pLdrInitImage  = NULL;
    48894905        pDevExt->hLdrInitThread = NIL_RTNATIVETHREAD;
    4890         if (RT_FAILURE(rc) && pDevExt->pvVMMR0 == pImage->pvImage)
    4891             supdrvLdrUnsetVMMR0EPs(pDevExt);
     4906        if (RT_FAILURE(rc))
     4907        {
     4908            if (pDevExt->pvVMMR0 == pImage->pvImage)
     4909                supdrvLdrUnsetVMMR0EPs(pDevExt);
     4910            supdrvLdrLoadError(rc, pReq, "ModuleInit failed: %Rrc", rc);
     4911        }
    48924912    }
    48934913    SUPR0Printf("vboxdrv: %p %s\n", pImage->pvImage, pImage->szName);
     
    52105230 * @param   pSession            Session data.
    52115231 * @param   pVMMR0              VMMR0 image handle.
    5212  * @param   pvVMMR0EntryInt     VMMR0EntryInt address.
    52135232 * @param   pvVMMR0EntryFast    VMMR0EntryFast address.
    52145233 * @param   pvVMMR0EntryEx      VMMR0EntryEx address.
    52155234 * @remark  Caller must own the loader mutex.
    52165235 */
    5217 static int supdrvLdrSetVMMR0EPs(PSUPDRVDEVEXT pDevExt, void *pvVMMR0, void *pvVMMR0EntryInt, void *pvVMMR0EntryFast, void *pvVMMR0EntryEx)
     5236static int supdrvLdrSetVMMR0EPs(PSUPDRVDEVEXT pDevExt, void *pvVMMR0, void *pvVMMR0EntryFast, void *pvVMMR0EntryEx)
    52185237{
    52195238    int rc = VINF_SUCCESS;
    5220     LogFlow(("supdrvLdrSetR0EP pvVMMR0=%p pvVMMR0EntryInt=%p\n", pvVMMR0, pvVMMR0EntryInt));
     5239    LogFlow(("supdrvLdrSetR0EP pvVMMR0=%p pvVMMR0EntryFast=%p\n", pvVMMR0, pvVMMR0EntryFast));
    52215240
    52225241
     
    52275246    {
    52285247        pDevExt->pvVMMR0 = pvVMMR0;
    5229         *(void **)&pDevExt->pfnVMMR0EntryInt  = pvVMMR0EntryInt;
    52305248        *(void **)&pDevExt->pfnVMMR0EntryFast = pvVMMR0EntryFast;
    52315249        *(void **)&pDevExt->pfnVMMR0EntryEx   = pvVMMR0EntryEx;
     
    52385256         */
    52395257        if (    pDevExt->pvVMMR0 != pvVMMR0
    5240             ||  (void *)pDevExt->pfnVMMR0EntryInt   != pvVMMR0EntryInt
    52415258            ||  (void *)pDevExt->pfnVMMR0EntryFast  != pvVMMR0EntryFast
    52425259            ||  (void *)pDevExt->pfnVMMR0EntryEx    != pvVMMR0EntryEx)
     
    52585275{
    52595276    pDevExt->pvVMMR0            = NULL;
    5260     pDevExt->pfnVMMR0EntryInt   = NULL;
    52615277    pDevExt->pfnVMMR0EntryFast  = NULL;
    52625278    pDevExt->pfnVMMR0EntryEx    = NULL;
  • trunk/src/VBox/HostDrivers/Support/SUPDrvIOC.h

    r57229 r57378  
    215215 *          - nothing.
    216216 */
    217 #define SUPDRV_IOC_VERSION                              0x00230003
     217#define SUPDRV_IOC_VERSION                              0x00240000
    218218
    219219/** SUP_IOCTL_COOKIE. */
     
    338338 */
    339339#define SUP_IOCTL_LDR_LOAD                              SUP_CTL_CODE_BIG(4)
    340 #define SUP_IOCTL_LDR_LOAD_SIZE(cbImage)                RT_UOFFSETOF(SUPLDRLOAD, u.In.abImage[cbImage])
     340#define SUP_IOCTL_LDR_LOAD_SIZE(cbImage)                RT_MAX(RT_UOFFSETOF(SUPLDRLOAD, u.In.abImage[cbImage]), SUP_IOCTL_LDR_LOAD_SIZE_OUT)
    341341#define SUP_IOCTL_LDR_LOAD_SIZE_IN(cbImage)             RT_UOFFSETOF(SUPLDRLOAD, u.In.abImage[cbImage])
    342 #define SUP_IOCTL_LDR_LOAD_SIZE_OUT                     sizeof(SUPREQHDR)
     342#define SUP_IOCTL_LDR_LOAD_SIZE_OUT                     (RT_UOFFSETOF(SUPLDRLOAD, u.Out.szError) + RT_SIZEOFMEMB(SUPLDRLOAD, u.Out.szError))
    343343
    344344/**
     
    414414                    /** The module handle (i.e. address). */
    415415                    RTR0PTR                 pvVMMR0;
    416                     /** Address of VMMR0EntryInt function. */
    417                     RTR0PTR                 pvVMMR0EntryInt;
    418416                    /** Address of VMMR0EntryFast function. */
    419417                    RTR0PTR                 pvVMMR0EntryFast;
     
    451449            uint8_t         abImage[1];
    452450        } In;
     451        struct
     452        {
     453            /** Magic value indicating whether extended error information is
     454             * present or not (SUPLDRLOAD_ERROR_MAGIC). */
     455            uint64_t        uErrorMagic;
     456            /** Extended error information. */
     457            char            szError[2048];
     458        } Out;
    453459    } u;
    454460} SUPLDRLOAD, *PSUPLDRLOAD;
     461/** Magic value that indicates that there is a valid error information string
     462 * present on SUP_IOCTL_LDR_LOAD failure.
     463 * @remarks The value is choosen to be an unlikely init and term address. */
     464#define SUPLDRLOAD_ERROR_MAGIC      UINT64_C(0xabcdefef0feddcb9)
    455465/** @} */
    456466
  • trunk/src/VBox/HostDrivers/Support/SUPDrvInternal.h

    r57229 r57378  
    603603     * 0 if the code VMM isn't loaded and Idt are nops. */
    604604    void * volatile                 pvVMMR0;
    605     /** VMMR0EntryInt() pointer. */
    606     DECLR0CALLBACKMEMBER(int,       pfnVMMR0EntryInt, (PVM pVM, unsigned uOperation, void *pvArg));
    607605    /** VMMR0EntryFast() pointer. */
    608606    DECLR0CALLBACKMEMBER(void,      pfnVMMR0EntryFast, (PVM pVM, VMCPUID idCpu, unsigned uOperation));
     
    957955void VBOXCALL   supdrvBadContext(PSUPDRVDEVEXT pDevExt, const char *pszFile, uint32_t uLine, const char *pszExtra);
    958956int VBOXCALL    supdrvQueryVTCapsInternal(uint32_t *pfCaps);
     957int VBOXCALL    supdrvLdrLoadError(int rc, PSUPLDRLOAD pReq, const char *pszFormat, ...);
    959958
    960959/* SUPDrvGip.cpp */
  • trunk/src/VBox/HostDrivers/Support/SUPLibLdr.cpp

    r57358 r57378  
    112112    {
    113113        rc = supLoadModule(pszFilename, pszModule, NULL, pErrInfo, ppvImageBase);
    114         if (RT_FAILURE(rc))
     114        if (RT_FAILURE(rc) && !RTErrInfoIsSet(pErrInfo))
    115115            RTErrInfoSetF(pErrInfo, rc, "SUPR3LoadModule: supLoadModule returned %Rrc", rc);
    116116    }
     
    445445                     * Get the entry points.
    446446                     */
    447                     RTUINTPTR VMMR0EntryInt = 0;
    448447                    RTUINTPTR VMMR0EntryFast = 0;
    449448                    RTUINTPTR VMMR0EntryEx = 0;
     
    451450                    RTUINTPTR ModuleInit = 0;
    452451                    RTUINTPTR ModuleTerm = 0;
     452                    const char *pszEp = NULL;
    453453                    if (fIsVMMR0)
    454454                    {
    455                         rc = RTLdrGetSymbolEx(hLdrMod, &pLoadReq->u.In.abImage[0], (uintptr_t)OpenReq.u.Out.pvImageBase, UINT32_MAX, "VMMR0EntryInt", &VMMR0EntryInt);
     455                        rc = RTLdrGetSymbolEx(hLdrMod, &pLoadReq->u.In.abImage[0], (uintptr_t)OpenReq.u.Out.pvImageBase,
     456                                              UINT32_MAX, pszEp = "VMMR0EntryFast", &VMMR0EntryFast);
    456457                        if (RT_SUCCESS(rc))
    457                             rc = RTLdrGetSymbolEx(hLdrMod, &pLoadReq->u.In.abImage[0], (uintptr_t)OpenReq.u.Out.pvImageBase, UINT32_MAX, "VMMR0EntryFast", &VMMR0EntryFast);
    458                         if (RT_SUCCESS(rc))
    459                             rc = RTLdrGetSymbolEx(hLdrMod, &pLoadReq->u.In.abImage[0], (uintptr_t)OpenReq.u.Out.pvImageBase, UINT32_MAX, "VMMR0EntryEx", &VMMR0EntryEx);
     458                            rc = RTLdrGetSymbolEx(hLdrMod, &pLoadReq->u.In.abImage[0], (uintptr_t)OpenReq.u.Out.pvImageBase,
     459                                                  UINT32_MAX, pszEp = "VMMR0EntryEx", &VMMR0EntryEx);
    460460                    }
    461461                    else if (pszSrvReqHandler)
    462                         rc = RTLdrGetSymbolEx(hLdrMod, &pLoadReq->u.In.abImage[0], (uintptr_t)OpenReq.u.Out.pvImageBase, UINT32_MAX, pszSrvReqHandler, &SrvReqHandler);
     462                        rc = RTLdrGetSymbolEx(hLdrMod, &pLoadReq->u.In.abImage[0], (uintptr_t)OpenReq.u.Out.pvImageBase,
     463                                              UINT32_MAX, pszEp = pszSrvReqHandler, &SrvReqHandler);
    463464                    if (RT_SUCCESS(rc))
    464465                    {
    465                         int rc2 = RTLdrGetSymbolEx(hLdrMod, &pLoadReq->u.In.abImage[0], (uintptr_t)OpenReq.u.Out.pvImageBase, UINT32_MAX, "ModuleInit", &ModuleInit);
     466                        int rc2 = RTLdrGetSymbolEx(hLdrMod, &pLoadReq->u.In.abImage[0], (uintptr_t)OpenReq.u.Out.pvImageBase,
     467                                                   UINT32_MAX, pszEp = "ModuleInit", &ModuleInit);
    466468                        if (RT_FAILURE(rc2))
    467469                            ModuleInit = 0;
    468470
    469                         rc2 = RTLdrGetSymbolEx(hLdrMod, &pLoadReq->u.In.abImage[0], (uintptr_t)OpenReq.u.Out.pvImageBase, UINT32_MAX, "ModuleTerm", &ModuleTerm);
     471                        rc2 = RTLdrGetSymbolEx(hLdrMod, &pLoadReq->u.In.abImage[0], (uintptr_t)OpenReq.u.Out.pvImageBase,
     472                                               UINT32_MAX, pszEp = "ModuleTerm", &ModuleTerm);
    470473                        if (RT_FAILURE(rc2))
    471474                            ModuleTerm = 0;
     
    503506                                pLoadReq->u.In.eEPType                = SUPLDRLOADEP_VMMR0;
    504507                                pLoadReq->u.In.EP.VMMR0.pvVMMR0       = OpenReq.u.Out.pvImageBase;
    505                                 pLoadReq->u.In.EP.VMMR0.pvVMMR0EntryInt = (RTR0PTR)VMMR0EntryInt;
    506508                                pLoadReq->u.In.EP.VMMR0.pvVMMR0EntryFast= (RTR0PTR)VMMR0EntryFast;
    507509                                pLoadReq->u.In.EP.VMMR0.pvVMMR0EntryEx  = (RTR0PTR)VMMR0EntryEx;
     
    545547                                {
    546548                                    g_pvVMMR0 = OpenReq.u.Out.pvImageBase;
    547                                     LogRel(("SUP: VMMR0EntryEx located at %RTptr, VMMR0EntryFast at %RTptr and VMMR0EntryInt at %RTptr\n",
    548                                             VMMR0EntryEx, VMMR0EntryFast, VMMR0EntryInt));
     549                                    LogRel(("SUP: VMMR0EntryEx located at %RTptr and VMMR0EntryFast at %RTptr\n", VMMR0EntryEx, VMMR0EntryFast));
    549550                                }
    550551#ifdef RT_OS_WINDOWS
     
    556557                                return VINF_SUCCESS;
    557558                            }
     559
     560                            /*
     561                             * Failed, bail out.
     562                             */
     563                            LogRel(("SUP: Loading failed for %s (%s) rc=%Rrc\n", pszModule, pszFilename, rc));
     564                            if (   pLoadReq->u.Out.uErrorMagic == SUPLDRLOAD_ERROR_MAGIC
     565                                && pLoadReq->u.Out.szError[0] != '\0')
     566                            {
     567                                LogRel(("SUP: %s\n", pLoadReq->u.Out.szError));
     568                                RTErrInfoSet(pErrInfo, rc, pLoadReq->u.Out.szError);
     569                            }
    558570                            else
    559                                 LogRel(("SUP: Loading failed for %s (%s) rc=%Rrc\n", pszModule, pszFilename, rc));
     571                                RTErrInfoSet(pErrInfo, rc, "SUP_IOCTL_LDR_LOAD failed");
    560572                        }
    561573                        else
     574                        {
    562575                            LogRel(("SUP: RTLdrEnumSymbols failed for %s (%s) rc=%Rrc\n", pszModule, pszFilename, rc));
     576                            RTErrInfoSetF(pErrInfo, rc, "RTLdrEnumSymbols #2 failed");
     577                        }
    563578                    }
    564579                    else
    565                         LogRel(("SUP: Failed to get entry points for %s (%s) rc=%Rrc\n", pszModule, pszFilename, rc));
     580                    {
     581                        LogRel(("SUP: Failed to get entry point '%s' for %s (%s) rc=%Rrc\n", pszEp, pszModule, pszFilename, rc));
     582                        RTErrInfoSetF(pErrInfo, rc, "Failed to resolve entry point '%s'", pszEp);
     583                    }
    566584                }
    567585                else
     586                {
    568587                    LogRel(("SUP: RTLdrGetBits failed for %s (%s). rc=%Rrc\n", pszModule, pszFilename, rc));
     588                    if (!RTErrInfoIsSet(pErrInfo))
     589                        RTErrInfoSetF(pErrInfo, rc, "RTLdrGetBits failed");
     590                }
    569591                RTMemTmpFree(pLoadReq);
    570592            }
     
    573595                AssertMsgFailed(("failed to allocated %u bytes for SUPLDRLOAD_IN structure!\n", SUP_IOCTL_LDR_LOAD_SIZE(cbImageWithTabs)));
    574596                rc = VERR_NO_TMP_MEMORY;
     597                RTErrInfoSetF(pErrInfo, rc, "Failed to allocate %u bytes for the load request", SUP_IOCTL_LDR_LOAD_SIZE(cbImageWithTabs));
    575598            }
    576599        }
     600        /*
     601         * Already loaded?
     602         */
    577603        else if (RT_SUCCESS(rc))
    578604        {
     
    585611#endif
    586612        }
    587     }
     613        /*
     614         * No, failed.
     615         */
     616        else
     617            RTErrInfoSet(pErrInfo, rc, "SUP_IOCTL_LDR_OPEN failed");
     618    }
     619    else
     620        RTErrInfoSetF(pErrInfo, rc, "RTLdrEnumSymbols #1 failed");
    588621    RTLdrClose(hLdrMod);
    589622    return rc;
  • trunk/src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp

    r57358 r57378  
    18431843
    18441844/**
    1845  * memcmp + log.
     1845 * memcmp + errormsg + log.
    18461846 *
    18471847 * @returns Same as memcmp.
     
    18501850 * @param   uRva            The RVA to start comparing at.
    18511851 * @param   cb              The number of bytes to compare.
    1852  */
    1853 static int supdrvNtCompare(PSUPDRVLDRIMAGE pImage, const uint8_t *pbImageBits, uint32_t uRva, uint32_t cb)
     1852 * @param   pReq            The load request.
     1853 */
     1854static int supdrvNtCompare(PSUPDRVLDRIMAGE pImage, const uint8_t *pbImageBits, uint32_t uRva, uint32_t cb, PSUPLDRLOAD pReq)
    18541855{
    18551856    int iDiff = memcmp((uint8_t const *)pImage->pvImage + uRva, pbImageBits + uRva, cb);
     
    18611862            if (pbNativeBits[off] != pbImageBits[off])
    18621863            {
    1863                 char szBytes[128];
    1864                 RTStrPrintf(szBytes, sizeof(szBytes), "native: %.*Rhxs  our: %.*Rhxs",
    1865                             RT_MIN(12, cbLeft), &pbNativeBits[off],
    1866                             RT_MIN(12, cbLeft), &pbImageBits[off]);
    1867                 SUPR0Printf("VBoxDrv: Mismatch at %#x of %s: %s\n", off, pImage->szName, szBytes);
     1864                /* Note! We need to copy image bits into a temporary stack buffer here as we'd
     1865                         otherwise risk overwriting them while formatting the error message. */
     1866                uint8_t abBytes[64];
     1867                memcpy(abBytes, &pbImageBits[off], RT_MIN(64, cbLeft));
     1868                supdrvLdrLoadError(VERR_LDR_MISMATCH_NATIVE, pReq,
     1869                                   "Mismatch at %#x of %s:\n"
     1870                                   "ntld: %.*Rhxs\n"
     1871                                   "iprt: %.*Rhxs",
     1872                                   off, pImage->szName,
     1873                                   RT_MIN(64, cbLeft), &pbNativeBits[off],
     1874                                   RT_MIN(64, cbLeft), &abBytes[0]);
     1875                SUPR0Printf("VBoxDrv: %s", pReq->u.Out.szError);
    18681876                break;
    18691877            }
     
    18721880}
    18731881
     1882
    18741883int  VBOXCALL   supdrvOSLdrLoad(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage, const uint8_t *pbImageBits, PSUPLDRLOAD pReq)
    18751884{
    1876     NOREF(pDevExt); NOREF(pReq);
     1885    NOREF(pDevExt);
    18771886    if (pImage->pvNtSectionObj)
    18781887    {
     
    19551964            {
    19561965                if (uRvaNext < aExcludeRgns[i].uRva)
    1957                     iDiff = supdrvNtCompare(pImage, pbImageBits, uRvaNext, aExcludeRgns[i].uRva - uRvaNext);
     1966                    iDiff = supdrvNtCompare(pImage, pbImageBits, uRvaNext, aExcludeRgns[i].uRva - uRvaNext, pReq);
    19581967                uRvaNext = aExcludeRgns[i].uRva + aExcludeRgns[i].cb;
    19591968            }
    19601969            if (!iDiff && uRvaNext < pImage->cbImageBits)
    1961                 iDiff = supdrvNtCompare(pImage, pbImageBits, uRvaNext, pImage->cbImageBits - uRvaNext);
     1970                iDiff = supdrvNtCompare(pImage, pbImageBits, uRvaNext, pImage->cbImageBits - uRvaNext, pReq);
    19621971            if (!iDiff)
    19631972                return VINF_SUCCESS;
    19641973        }
    19651974        else
    1966             supdrvNtCompare(pImage, pbImageBits, 0, pImage->cbImageBits);
     1975            supdrvNtCompare(pImage, pbImageBits, 0, pImage->cbImageBits, pReq);
    19671976        return VERR_LDR_MISMATCH_NATIVE;
    19681977    }
    1969     return VERR_INTERNAL_ERROR_4;
     1978    return supdrvLdrLoadError(VERR_INTERNAL_ERROR_4, pReq, "No NT section object! Impossible!");
    19701979}
    19711980
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