in vboxguest/vboxguest_core.c [1679:1744]
int vbg_core_ioctl(struct vbg_session *session, unsigned int req, void *data)
{
unsigned int req_no_size = req & ~IOCSIZE_MASK;
struct vbg_dev *gdev = session->gdev;
struct vbg_ioctl_hdr *hdr = data;
bool f32bit = false;
hdr->rc = VINF_SUCCESS;
if (!hdr->size_out)
hdr->size_out = hdr->size_in;
/*
* hdr->version and hdr->size_in / hdr->size_out minimum size are
* already checked by vbg_misc_device_ioctl().
*/
/* For VMMDEV_REQUEST hdr->type != VBG_IOCTL_HDR_TYPE_DEFAULT */
if (req_no_size == VBG_IOCTL_VMMDEV_REQUEST(0) ||
req == VBG_IOCTL_VMMDEV_REQUEST_BIG ||
req == VBG_IOCTL_VMMDEV_REQUEST_BIG_ALT)
return vbg_ioctl_vmmrequest(gdev, session, data);
if (hdr->type != VBG_IOCTL_HDR_TYPE_DEFAULT)
return -EINVAL;
/* Fixed size requests. */
switch (req) {
case VBG_IOCTL_DRIVER_VERSION_INFO:
return vbg_ioctl_driver_version_info(data);
case VBG_IOCTL_HGCM_CONNECT:
return vbg_ioctl_hgcm_connect(gdev, session, data);
case VBG_IOCTL_HGCM_DISCONNECT:
return vbg_ioctl_hgcm_disconnect(gdev, session, data);
case VBG_IOCTL_WAIT_FOR_EVENTS:
return vbg_ioctl_wait_for_events(gdev, session, data);
case VBG_IOCTL_INTERRUPT_ALL_WAIT_FOR_EVENTS:
return vbg_ioctl_interrupt_all_wait_events(gdev, session, data);
case VBG_IOCTL_CHANGE_FILTER_MASK:
return vbg_ioctl_change_filter_mask(gdev, session, data);
case VBG_IOCTL_ACQUIRE_GUEST_CAPABILITIES:
return vbg_ioctl_acquire_guest_capabilities(gdev, session, data);
case VBG_IOCTL_CHANGE_GUEST_CAPABILITIES:
return vbg_ioctl_change_guest_capabilities(gdev, session, data);
case VBG_IOCTL_CHECK_BALLOON:
return vbg_ioctl_check_balloon(gdev, data);
case VBG_IOCTL_WRITE_CORE_DUMP:
return vbg_ioctl_write_core_dump(gdev, session, data);
}
/* Variable sized requests. */
switch (req_no_size) {
#ifdef CONFIG_COMPAT
case VBG_IOCTL_HGCM_CALL_32(0):
f32bit = true;
fallthrough;
#endif
case VBG_IOCTL_HGCM_CALL(0):
return vbg_ioctl_hgcm_call(gdev, session, f32bit, data);
case VBG_IOCTL_LOG(0):
case VBG_IOCTL_LOG_ALT(0):
return vbg_ioctl_log(data);
}
vbg_err_ratelimited("Userspace made an unknown ioctl req %#08x\n", req);
return -ENOTTY;
}