VirtualBox

Changeset 32631 in vbox


Ignore:
Timestamp:
Sep 20, 2010 9:55:38 AM (14 years ago)
Author:
vboxsync
Message:

Devices/VMMDev and Additions/common/VBoxGuestLib: get the mouse pointer shape IOCTL size right on the guest side and check it better on the host side

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/VMMDev.h

    r32313 r32631  
    342342} VMMDevReqMousePointer;
    343343AssertCompileSize(VMMDevReqMousePointer, 24+24);
     344
     345/**
     346 * Get the size that a VMMDevReqMousePointer request should have for a given
     347 * size of cursor, including the trailing cursor image and mask data.
     348 * @note an "empty" request still has the four preallocated bytes of data
     349 *
     350 * @returns the size
     351 * @param  width   the cursor width
     352 * @param  height  the cursor height
     353 */
     354DECLINLINE(size_t) vmmdevGetMousePointerReqSize(uint32_t width, uint32_t height)
     355{
     356    size_t cbBase = RT_OFFSETOF(VMMDevReqMousePointer, pointerData);
     357    size_t cbMask = (width + 7) / 8 * height;
     358    size_t cbArgb = width * height * 4;
     359    return RT_MAX(cbBase + ((cbMask + 3) & ~3) + cbArgb,
     360                  sizeof(VMMDevReqMousePointer));
     361}
    344362
    345363/** @name VMMDevReqMousePointer::fFlags
  • trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibVideo.cpp

    r31409 r32631  
    9999{
    100100    VMMDevReqMousePointer *pReq;
    101     int rc = vbglR3GRAlloc((VMMDevRequestHeader **)&pReq, RT_OFFSETOF(VMMDevReqMousePointer, pointerData) + cbImg, VMMDevReq_SetPointerShape);
     101    size_t cbReq = vmmdevGetMousePointerReqSize(cx, cy);
     102    AssertReturn(   !pvImg
     103                 || cbReq == RT_OFFSETOF(VMMDevReqMousePointer, pointerData) + cbImg,
     104                 VERR_INVALID_PARAMETER);
     105    int rc = vbglR3GRAlloc((VMMDevRequestHeader **)&pReq, cbReq,
     106                           VMMDevReq_SetPointerShape);
    102107    if (RT_SUCCESS(rc))
    103108    {
     
    111116
    112117        rc = vbglR3GRPerform(&pReq->header);
    113         vbglR3GRFree(&pReq->header);
    114118        if (RT_SUCCESS(rc))
    115119            rc = pReq->header.rc;
     120        vbglR3GRFree(&pReq->header);
    116121    }
    117122    return rc;
  • trunk/src/VBox/Devices/VMMDev/VMMDev.cpp

    r32616 r32631  
    751751            if (pRequestHeader->size < sizeof(VMMDevReqMousePointer))
    752752            {
    753                 AssertMsg(pRequestHeader->size == 0x10028 && pRequestHeader->version == 10000,  /* don't bitch about legacy!!! */
     753                AssertMsg(pRequestHeader->size == 0x10028 && pRequestHeader->version == 10000,  /* don't complain about legacy!!! */
    754754                          ("VMMDev mouse shape structure has invalid size %d (%#x) version=%d!\n",
    755755                           pRequestHeader->size, pRequestHeader->size, pRequestHeader->size, pRequestHeader->version));
     
    767767                     fVisible, fAlpha, fShape, pointerShape->width, pointerShape->height));
    768768
    769                 if (pRequestHeader->size == sizeof(VMMDevReqMousePointer))
     769                if (      pRequestHeader->size
     770                       != vmmdevGetMousePointerReqSize(pointerShape->width,
     771                                                       pointerShape->height)
     772                    || !pointerShape->width
     773                    || !pointerShape->height)
    770774                {
    771775                    /* The guest did not provide the shape actually. */
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