VirtualBox

Changeset 17196 in vbox for trunk/src/VBox/Additions


Ignore:
Timestamp:
Feb 27, 2009 11:57:04 AM (16 years ago)
Author:
vboxsync
Message:

Additions, VBoxGuestR3Lib: 32-bit ioctl handling for 64-bit guest driver. This fixes broken additions on S10 u6.

Location:
trunk/src/VBox/Additions/common
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp

    r14462 r17196  
    11121112
    11131113
     1114#ifdef RT_ARCH_AMD64
     1115/** The 32-bit version HGCM call for 64-bit driver. */
     1116static int VBoxGuestCommonIOCtl_HGCMCall32(PVBOXGUESTDEVEXT pDevExt,
     1117                                           PVBOXGUESTSESSION pSession,
     1118                                           VBoxGuestHGCMCallInfo *pInfo,
     1119                                           uint32_t cMillies, bool fInterruptible,
     1120                                           size_t cbExtra, size_t cbData, size_t *pcbDataReturned)
     1121{
     1122    /*
     1123     * Some more validations.
     1124     */
     1125    if (pInfo->cParms > 4096) /* (Just make sure it doesn't overflow the next check.) */
     1126    {
     1127        Log(("VBoxGuestCommonIOCtl: HGCM_CALL: cParm=%RX32 is not sane\n", pInfo->cParms));
     1128        return VERR_INVALID_PARAMETER;
     1129    }
     1130    const size_t cbActual = cbExtra + sizeof(*pInfo) + pInfo->cParms * sizeof(HGCMFunctionParameter32);
     1131    if (cbData < cbActual)
     1132    {
     1133        Log(("VBoxGuestCommonIOCtl: HGCM_CALL: cbData=%#zx (%zu) required size is %#zx (%zu)\n",
     1134             cbData, cbActual));
     1135        return VERR_INVALID_PARAMETER;
     1136    }
     1137
     1138    /*
     1139     * Validate the client id.
     1140     */
     1141    const uint32_t u32ClientId = pInfo->u32ClientID;
     1142    unsigned i;
     1143    RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;
     1144    RTSpinlockAcquireNoInts(pDevExt->SessionSpinlock, &Tmp);
     1145    for (i = 0; i < RT_ELEMENTS(pSession->aHGCMClientIds); i++)
     1146        if (pSession->aHGCMClientIds[i] == u32ClientId)
     1147            break;
     1148    RTSpinlockReleaseNoInts(pDevExt->SessionSpinlock, &Tmp);
     1149    if (RT_UNLIKELY(i >= RT_ELEMENTS(pSession->aHGCMClientIds)))
     1150    {
     1151        static unsigned s_cErrors = 0;
     1152        if (s_cErrors++ > 32)
     1153            LogRel(("VBoxGuestCommonIOCtl: HGCM_CALL: Invalid handle. u32Client=%RX32\n", u32ClientId));
     1154        return VERR_INVALID_HANDLE;
     1155    }
     1156
     1157    /*
     1158     * The VbglHGCMCall call will invoke the callback if the HGCM
     1159     * call is performed in an ASYNC fashion. This function can
     1160     * deal with cancelled requests, so we let user more requests
     1161     * be interruptible (should add a flag for this later I guess).
     1162     */
     1163    Log(("VBoxGuestCommonIOCtl: HGCM_CALL: u32Client=%RX32\n", pInfo->u32ClientID));
     1164    int rc;
     1165    if (fInterruptible)
     1166        rc = VbglHGCMCall32(pInfo, VBoxGuestHGCMAsyncWaitCallbackInterruptible, pDevExt, cMillies);
     1167    else
     1168        rc = VbglHGCMCall32(pInfo, VBoxGuestHGCMAsyncWaitCallback, pDevExt, cMillies);
     1169    if (RT_SUCCESS(rc))
     1170    {
     1171        Log(("VBoxGuestCommonIOCtl: HGCM_CALL: result=%Rrc\n", pInfo->result));
     1172        if (pcbDataReturned)
     1173            *pcbDataReturned = cbActual;
     1174    }
     1175    Log(("VBoxGuestCommonIOCtl: HGCM_CALL: Failed. rc=%Rrc.\n", rc));
     1176    return rc;
     1177}
     1178#endif
     1179
     1180
    11141181/**
    11151182 * @returns VBox status code. Unlike the other HGCM IOCtls this will combine
     
    12731340                                           RT_OFFSETOF(VBoxGuestHGCMCallInfoTimed, info), cbData, pcbDataReturned);
    12741341    }
     1342# ifdef RT_ARCH_AMD64
     1343    else if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_HGCM_CALL_32(0)))
     1344    {
     1345        CHECKRET_MIN_SIZE("HGCM_CALL", sizeof(VBoxGuestHGCMCallInfo));
     1346        bool fInterruptible = pSession->R0Process != NIL_RTR0PROCESS;
     1347        rc = VBoxGuestCommonIOCtl_HGCMCall32(pDevExt, pSession, (VBoxGuestHGCMCallInfo *)pvData, RT_INDEFINITE_WAIT,
     1348                                             fInterruptible,
     1349                                             0, cbData, pcbDataReturned);
     1350    }
     1351    else if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_HGCM_CALL_TIMED_32(0)))
     1352    {
     1353        CHECKRET_MIN_SIZE("HGCM_CALL_TIMED", sizeof(VBoxGuestHGCMCallInfoTimed));
     1354        VBoxGuestHGCMCallInfoTimed *pInfo = (VBoxGuestHGCMCallInfoTimed *)pvData;
     1355        rc = VBoxGuestCommonIOCtl_HGCMCall32(pDevExt, pSession, &pInfo->info, pInfo->u32Timeout,
     1356                                             !!pInfo->fInterruptible || pSession->R0Process != NIL_RTR0PROCESS,
     1357                                             RT_OFFSETOF(VBoxGuestHGCMCallInfoTimed, info), cbData, pcbDataReturned);
     1358    }   
     1359# endif   
    12751360#endif /* VBOX_WITH_HGCM */
    12761361    else if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_LOG(0)))
     
    13021387#ifdef VBOX_WITH_HGCM
    13031388            case VBOXGUEST_IOCTL_HGCM_CONNECT:
     1389# ifdef RT_ARCH_AMD64
     1390            case VBOXGUEST_IOCTL_HGCM_CONNECT_32:
     1391# endif             
    13041392                CHECKRET_MIN_SIZE("HGCM_CONNECT", sizeof(VBoxGuestHGCMConnectInfo));
    13051393                rc = VBoxGuestCommonIOCtl_HGCMConnect(pDevExt, pSession, (VBoxGuestHGCMConnectInfo *)pvData, pcbDataReturned);
     
    13071395
    13081396            case VBOXGUEST_IOCTL_HGCM_DISCONNECT:
     1397# ifdef RT_ARCH_AMD64
     1398            case VBOXGUEST_IOCTL_HGCM_DISCONNECT_32:
     1399# endif             
    13091400                CHECKRET_MIN_SIZE("HGCM_DISCONNECT", sizeof(VBoxGuestHGCMDisconnectInfo));
    13101401                rc = VBoxGuestCommonIOCtl_HGCMDisconnect(pDevExt, pSession, (VBoxGuestHGCMDisconnectInfo *)pvData, pcbDataReturned);
     
    13151406                rc = VBoxGuestCommonIOCtl_HGCMClipboardReConnect(pDevExt, (uint32_t *)pvData, pcbDataReturned);
    13161407                break;
     1408               
    13171409#endif /* VBOX_WITH_HGCM */
    13181410
  • trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3Lib.cpp

    r14217 r17196  
    337337    Hdr.cbData = cbData;
    338338    Hdr.pvDataR3 = pvData;
     339# if HC_ARCH_BITS == 32
     340    Hdr.u32Padding = 0;
     341# endif
    339342
    340343/** @todo test status code passing! */
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