1889
1889
static int VBoxGuestCommonIOCtl_HGCMCall(PVBOXGUESTDEVEXT pDevExt,
1890
1890
PVBOXGUESTSESSION pSession,
1891
1891
VBoxGuestHGCMCallInfo *pInfo,
1892
uint32_t cMillies, bool fInterruptible, bool f32bit,
1892
uint32_t cMillies, bool fInterruptible, bool f32bit, bool fUserData,
1893
1893
size_t cbExtra, size_t cbData, size_t *pcbDataReturned)
1895
1895
const uint32_t u32ClientId = pInfo->u32ClientID;
1945
1945
* be interruptible (should add a flag for this later I guess).
1947
1947
Log(("VBoxGuestCommonIOCtl: HGCM_CALL: u32Client=%RX32\n", pInfo->u32ClientID));
1948
fFlags = pSession->R0Process == NIL_RTR0PROCESS ? VBGLR0_HGCMCALL_F_KERNEL : VBGLR0_HGCMCALL_F_USER;
1948
fFlags = !fUserData && pSession->R0Process == NIL_RTR0PROCESS ? VBGLR0_HGCMCALL_F_KERNEL : VBGLR0_HGCMCALL_F_USER;
1949
1949
#ifdef RT_ARCH_AMD64
2445
2445
bool fInterruptible = pSession->R0Process != NIL_RTR0PROCESS;
2446
2446
CHECKRET_MIN_SIZE("HGCM_CALL", sizeof(VBoxGuestHGCMCallInfo));
2447
2447
rc = VBoxGuestCommonIOCtl_HGCMCall(pDevExt, pSession, (VBoxGuestHGCMCallInfo *)pvData, RT_INDEFINITE_WAIT,
2448
fInterruptible, false /*f32bit*/,
2448
fInterruptible, false /*f32bit*/, false /* fUserData */,
2449
2449
0, cbData, pcbDataReturned);
2451
2451
else if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_HGCM_CALL_TIMED(0)))
2454
2454
CHECKRET_MIN_SIZE("HGCM_CALL_TIMED", sizeof(VBoxGuestHGCMCallInfoTimed));
2455
2455
rc = VBoxGuestCommonIOCtl_HGCMCall(pDevExt, pSession, &pInfo->info, pInfo->u32Timeout,
2456
2456
!!pInfo->fInterruptible || pSession->R0Process != NIL_RTR0PROCESS,
2457
false /*f32bit*/, false /* fUserData */,
2458
2458
RT_OFFSETOF(VBoxGuestHGCMCallInfoTimed, info), cbData, pcbDataReturned);
2460
else if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_HGCM_CALL_USERDATA(0)))
2462
bool fInterruptible = true;
2463
CHECKRET_MIN_SIZE("HGCM_CALL", sizeof(VBoxGuestHGCMCallInfo));
2464
rc = VBoxGuestCommonIOCtl_HGCMCall(pDevExt, pSession, (VBoxGuestHGCMCallInfo *)pvData, RT_INDEFINITE_WAIT,
2465
fInterruptible, false /*f32bit*/, true /* fUserData */,
2466
0, cbData, pcbDataReturned);
2460
2468
# ifdef RT_ARCH_AMD64
2461
2469
else if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_HGCM_CALL_32(0)))
2463
2471
bool fInterruptible = pSession->R0Process != NIL_RTR0PROCESS;
2464
2472
CHECKRET_MIN_SIZE("HGCM_CALL", sizeof(VBoxGuestHGCMCallInfo));
2465
2473
rc = VBoxGuestCommonIOCtl_HGCMCall(pDevExt, pSession, (VBoxGuestHGCMCallInfo *)pvData, RT_INDEFINITE_WAIT,
2466
fInterruptible, true /*f32bit*/,
2474
fInterruptible, true /*f32bit*/, false /* fUserData */,
2467
2475
0, cbData, pcbDataReturned);
2469
2477
else if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_HGCM_CALL_TIMED_32(0)))
2472
2480
VBoxGuestHGCMCallInfoTimed *pInfo = (VBoxGuestHGCMCallInfoTimed *)pvData;
2473
2481
rc = VBoxGuestCommonIOCtl_HGCMCall(pDevExt, pSession, &pInfo->info, pInfo->u32Timeout,
2474
2482
!!pInfo->fInterruptible || pSession->R0Process != NIL_RTR0PROCESS,
2483
true /*f32bit*/, false /* fUserData */,
2476
2484
RT_OFFSETOF(VBoxGuestHGCMCallInfoTimed, info), cbData, pcbDataReturned);