VirtualBox

Changeset 17210 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Feb 27, 2009 2:12:16 PM (16 years ago)
Author:
vboxsync
Message:

VBoxGuest.cpp: Merged VBoxGuestCommonIOCtl_HGCMCall32 into VBoxGuestCommonIOCtl_HGCMCall.

File:
1 edited

Legend:

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

    r17196 r17210  
    10511051                                         PVBOXGUESTSESSION pSession,
    10521052                                         VBoxGuestHGCMCallInfo *pInfo,
    1053                                          uint32_t cMillies, bool fInterruptible,
     1053                                         uint32_t cMillies, bool fInterruptible, bool f32bit,
    10541054                                         size_t cbExtra, size_t cbData, size_t *pcbDataReturned)
    10551055{
     
    10621062        return VERR_INVALID_PARAMETER;
    10631063    }
    1064     const size_t cbActual = cbExtra + sizeof(*pInfo) + pInfo->cParms * sizeof(HGCMFunctionParameter);
     1064    size_t cbActual = cbExtra + sizeof(*pInfo);
     1065#ifdef RT_ARCH_AMD64
     1066    if (f32bit)
     1067        cbActual += pInfo->cParms * sizeof(HGCMFunctionParameter32);
     1068    else
     1069#endif
     1070        cbActual += pInfo->cParms * sizeof(HGCMFunctionParameter);
    10651071    if (cbData < cbActual)
    10661072    {
     
    10971103    Log(("VBoxGuestCommonIOCtl: HGCM_CALL: u32Client=%RX32\n", pInfo->u32ClientID));
    10981104    int rc;
    1099     if (fInterruptible)
    1100         rc = VbglHGCMCall(pInfo, VBoxGuestHGCMAsyncWaitCallbackInterruptible, pDevExt, cMillies);
     1105#ifdef RT_ARCH_AMD64
     1106    if (f32bit)
     1107    {
     1108        if (fInterruptible)
     1109            rc = VbglHGCMCall32(pInfo, VBoxGuestHGCMAsyncWaitCallbackInterruptible, pDevExt, cMillies);
     1110        else
     1111            rc = VbglHGCMCall32(pInfo, VBoxGuestHGCMAsyncWaitCallback, pDevExt, cMillies);
     1112    }
    11011113    else
    1102         rc = VbglHGCMCall(pInfo, VBoxGuestHGCMAsyncWaitCallback, pDevExt, cMillies);
     1114#endif
     1115    {
     1116        if (fInterruptible)
     1117            rc = VbglHGCMCall(pInfo, VBoxGuestHGCMAsyncWaitCallbackInterruptible, pDevExt, cMillies);
     1118        else
     1119            rc = VbglHGCMCall(pInfo, VBoxGuestHGCMAsyncWaitCallback, pDevExt, cMillies);
     1120    }
    11031121    if (RT_SUCCESS(rc))
    11041122    {
     
    11101128    return rc;
    11111129}
    1112 
    1113 
    1114 #ifdef RT_ARCH_AMD64
    1115 /** The 32-bit version HGCM call for 64-bit driver. */
    1116 static 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
    11791130
    11801131
     
    13291280        bool fInterruptible = pSession->R0Process != NIL_RTR0PROCESS;
    13301281        rc = VBoxGuestCommonIOCtl_HGCMCall(pDevExt, pSession, (VBoxGuestHGCMCallInfo *)pvData, RT_INDEFINITE_WAIT,
    1331                                            fInterruptible,
     1282                                           fInterruptible, false /*f32bit*/,
    13321283                                           0, cbData, pcbDataReturned);
    13331284    }
     
    13381289        rc = VBoxGuestCommonIOCtl_HGCMCall(pDevExt, pSession, &pInfo->info, pInfo->u32Timeout,
    13391290                                           !!pInfo->fInterruptible || pSession->R0Process != NIL_RTR0PROCESS,
     1291                                           false /*f32bit*/,
    13401292                                           RT_OFFSETOF(VBoxGuestHGCMCallInfoTimed, info), cbData, pcbDataReturned);
    13411293    }
     
    13451297        CHECKRET_MIN_SIZE("HGCM_CALL", sizeof(VBoxGuestHGCMCallInfo));
    13461298        bool fInterruptible = pSession->R0Process != NIL_RTR0PROCESS;
    1347         rc = VBoxGuestCommonIOCtl_HGCMCall32(pDevExt, pSession, (VBoxGuestHGCMCallInfo *)pvData, RT_INDEFINITE_WAIT,
    1348                                              fInterruptible,
    1349                                              0, cbData, pcbDataReturned);
     1299        rc = VBoxGuestCommonIOCtl_HGCMCall(pDevExt, pSession, (VBoxGuestHGCMCallInfo *)pvData, RT_INDEFINITE_WAIT,
     1300                                           fInterruptible, true /*f32bit*/,
     1301                                           0, cbData, pcbDataReturned);
    13501302    }
    13511303    else if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_HGCM_CALL_TIMED_32(0)))
     
    13531305        CHECKRET_MIN_SIZE("HGCM_CALL_TIMED", sizeof(VBoxGuestHGCMCallInfoTimed));
    13541306        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   
     1307        rc = VBoxGuestCommonIOCtl_HGCMCall(pDevExt, pSession, &pInfo->info, pInfo->u32Timeout,
     1308                                           !!pInfo->fInterruptible || pSession->R0Process != NIL_RTR0PROCESS,
     1309                                           true /*f32bit*/,
     1310                                           RT_OFFSETOF(VBoxGuestHGCMCallInfoTimed, info), cbData, pcbDataReturned);
     1311    }
     1312# endif
    13601313#endif /* VBOX_WITH_HGCM */
    13611314    else if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_LOG(0)))
     
    13891342# ifdef RT_ARCH_AMD64
    13901343            case VBOXGUEST_IOCTL_HGCM_CONNECT_32:
    1391 # endif             
     1344# endif
    13921345                CHECKRET_MIN_SIZE("HGCM_CONNECT", sizeof(VBoxGuestHGCMConnectInfo));
    13931346                rc = VBoxGuestCommonIOCtl_HGCMConnect(pDevExt, pSession, (VBoxGuestHGCMConnectInfo *)pvData, pcbDataReturned);
     
    13971350# ifdef RT_ARCH_AMD64
    13981351            case VBOXGUEST_IOCTL_HGCM_DISCONNECT_32:
    1399 # endif             
     1352# endif
    14001353                CHECKRET_MIN_SIZE("HGCM_DISCONNECT", sizeof(VBoxGuestHGCMDisconnectInfo));
    14011354                rc = VBoxGuestCommonIOCtl_HGCMDisconnect(pDevExt, pSession, (VBoxGuestHGCMDisconnectInfo *)pvData, pcbDataReturned);
     
    14061359                rc = VBoxGuestCommonIOCtl_HGCMClipboardReConnect(pDevExt, (uint32_t *)pvData, pcbDataReturned);
    14071360                break;
    1408                
    14091361#endif /* VBOX_WITH_HGCM */
    14101362
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