VBoxGuest.h revision df7afe1616ad2fc849cf92cc9c7a681d24d5328d
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * VBoxGuest - VirtualBox Guest Additions interface
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Copyright (C) 2006-2007 Sun Microsystems, Inc.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * This file is part of VirtualBox Open Source Edition (OSE), as
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * available from http://www.virtualbox.org. This file is free software;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * you can redistribute it and/or modify it under the terms of the GNU
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * General Public License (GPL) as published by the Free Software
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Foundation, in version 2 as it comes in the "COPYING" file of the
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * The contents of this file may alternatively be used under the terms
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * of the Common Development and Distribution License Version 1.0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * VirtualBox OSE distribution, in which case the provisions of the
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * CDDL are applicable instead of those of the GPL.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * You may elect to license modified versions of this file under the
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * terms and conditions of either the GPL or the CDDL or both.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Clara, CA 95054 USA or visit http://www.sun.com if you need
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * additional information or have any questions.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*******************************************************************************
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis* Defined Constants And Macros *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis*******************************************************************************/
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/** @todo The following is a temporary fix for the problem of accessing
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis hypervisor pointers from within guest additions */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/** Hypervisor linear pointer size type */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/* @todo support 64 bits virtual addresses (interface change) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/** Hypervisor physical pointer size type */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/* @todo support 64 bits physical addresses (interface change) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/** The support device name. */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis# define VBOXGUEST_DEVICE_NAME "/dev/vboxadd"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/** The support device name. */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis# define VBOXGUEST_DEVICE_NAME "\\Dev\\VBoxGst$"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/** The support device name. */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis# define VBOXGUEST_DEVICE_NAME "/devices/pci@0,0/pci80ee,cafe@4:vboxguest"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/** The support service name. */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis# define VBOXGUEST_SERVICE_NAME "VBoxGuest"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/** Win32 Device name. */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis# define VBOXGUEST_DEVICE_NAME "\\\\.\\VBoxGuest"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/** Global name for Win2k+ */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis# define VBOXGUEST_DEVICE_NAME_GLOBAL "\\\\.\\Global\\VBoxGuest"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/** Win32 driver name */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis# define VBOXGUEST_DEVICE_NAME_NT L"\\Device\\VBoxGuest"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/** device name */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis# define VBOXGUEST_DEVICE_NAME_DOS L"\\DosDevices\\VBoxGuest"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/** The support device name. */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis# define VBOXGUEST_DEVICE_NAME "/dev/vboxguest"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/** VirtualBox vendor ID */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/** VMMDev PCI card identifiers */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/** VirtualBox graphics card identifiers */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define VBOX_VESA_VENDORID VBOX_PCI_VENDORID
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * VBoxGuest port definitions
#define PORT_VMMDEV_REQUEST_OFFSET 0
#ifdef VBOX_HGCM
#ifdef VBOX_WITH_64_BITS_GUESTS
#ifdef VBOX_WITH_64_BITS_GUESTS
# ifndef VBOX_HGCM_HOST_CODE
/** mouse pointer shape/visibility change request */
} VMMDevEvents;
typedef struct VBoxGuestInfo
typedef struct VBoxGuestStatistics
bool fSupported;
#pragma pack()
#ifdef VBOX_HGCM
typedef struct _VMMDevHGCMRequestHeader
typedef struct HGCMSERVICELOCATION
#ifdef VBOX_WITH_64_BITS_GUESTS
typedef struct _HGCMFUNCTIONPARAMETER32
} Pointer;
typedef struct _HGCMFUNCTIONPARAMETER64
} Pointer;
typedef struct _HGCMFUNCTIONPARAMETER
} Pointer;
#ifdef VBOX_WITH_64_BITS_GUESTS
# ifndef VBOX_HGCM_HOST_CODE
#pragma pack()
#define VMMDEV_HGCM_CALL_PARMS(a) ((HGCMFunctionParameter *)((uint8_t *)a + sizeof (VMMDevHGCMCall)))
#ifdef VBOX_WITH_64_BITS_GUESTS
# ifdef VBOX_HGCM_HOST_CODE
# define VMMDEV_HGCM_CALL_PARMS32(a) ((HGCMFunctionParameter32 *)((uint8_t *)a + sizeof (VMMDevHGCMCall)))
# define VMMDEV_HGCM_CALL_PARMS64(a) ((HGCMFunctionParameter64 *)((uint8_t *)a + sizeof (VMMDevHGCMCall)))
typedef struct _VMMDevVideoAccelEnable
typedef struct _VMMDevVideoAccelFlush
typedef struct _VMMDevVideoSetVisibleRegion
VMMDev_Seamless_Visible_Region = 1, /* visible region mode; only top-level guest windows displayed */
VMMDev_Seamless_Host_Window = 2 /* windowed mode; each top-level guest window is represented in a host window */
#pragma pack()
typedef struct _VBVACMDHDR
int16_t x;
int16_t y;
uint16_t w;
uint16_t h;
} VBVACMDHDR;
#pragma pack()
typedef struct _VBVARECORD
} VBVARECORD;
typedef struct _VBVAMEMORY
} VBVAMEMORY;
#pragma pack()
bool fHaveEvents;
} V1_04;
} V1_03;
} VMMDevMemory;
#pragma pack()
* bet was copied from my SUPDRVIOC.h once upon a time (although the concept of
* More info can be found in SUPDRVIOC.h and related sources.
#ifdef RT_ARCH_AMD64
# define VBOXGUEST_IOCTL_FLAG 0
typedef struct VBGLBIGREQ
} VBGLBIGREQ;
#if defined(RT_OS_WINDOWS)
# define VBOXGUEST_IOCTL_CODE(Function, Size) _IOWRN('V', (Function) | VBOXGUEST_IOCTL_FLAG, sizeof(VBGLBIGREQ))
# define VBOXGUEST_IOCTL_CODE(Function, Size) _IOC(_IOC_READ|_IOC_WRITE, 'V', (Function) | VBOXGUEST_IOCTL_FLAG, (Size))
#elif defined(RT_OS_FREEBSD) /** @todo r=bird: Please do it like SUPDRVIOC to keep it as similar as possible. */
# define VBOXGUEST_IOCTL_CODE(Function, Size) _IOWR('V', (Function) | VBOXGUEST_IOCTL_FLAG, VBGLBIGREQ)
#ifdef VBOXGUEST_IOCTL_CODE
# define IOCTL_VBOXGUEST_GETVMMDEVPORT IOCTL_CODE(FILE_DEVICE_UNKNOWN, 2048, METHOD_BUFFERED, FILE_WRITE_ACCESS, sizeof(VBoxGuestPortInfo))
typedef struct _VBoxGuestPortInfo
#ifdef VBOXGUEST_IOCTL_CODE
# define IOCTL_VBOXGUEST_WAITEVENT IOCTL_CODE(FILE_DEVICE_UNKNOWN, 2049, METHOD_BUFFERED, FILE_WRITE_ACCESS, sizeof(VBoxGuestWaitEventInfo))
#ifdef VBOXGUEST_IOCTL_CODE
# define VBOXGUEST_IOCTL_CANCEL_ALL_WAITEVENTS IOCTL_CODE(FILE_DEVICE_UNKNOWN, 2054, METHOD_BUFFERED, FILE_WRITE_ACCESS, 0)
#define VBOXGUEST_WAITEVENT_OK (0)
typedef struct _VBoxGuestWaitEventInfo
#ifdef VBOXGUEST_IOCTL_CODE
# define IOCTL_VBOXGUEST_VMMREQUEST IOCTL_CODE(FILE_DEVICE_UNKNOWN, 2050, METHOD_BUFFERED, FILE_WRITE_ACCESS, sizeof(VMMDevRequestHeader))
typedef struct _VBoxGuestFilterMaskInfo
#pragma pack()
#ifdef VBOXGUEST_IOCTL_CODE
# define IOCTL_VBOXGUEST_CTL_FILTER_MASK IOCTL_CODE(FILE_DEVICE_UNKNOWN, 2051, METHOD_BUFFERED, FILE_WRITE_ACCESS, sizeof (VBoxGuestFilterMaskInfo))
#ifdef VBOXGUEST_IOCTL_CODE
# define IOCTL_VBOXGUEST_CTL_CHECK_BALLOON IOCTL_CODE(FILE_DEVICE_UNKNOWN, 2052, METHOD_BUFFERED, FILE_WRITE_ACCESS, 0)
#ifdef VBOXGUEST_IOCTL_CODE
# define VBOXGUEST_IOCTL_LOG(Size) IOCTL_CODE(FILE_DEVICE_UNKNOWN, 2055, METHOD_BUFFERED, FILE_WRITE_ACCESS, (Size))
#ifdef VBOX_HGCM
typedef struct _VBoxGuestHGCMConnectInfo
typedef struct _VBoxGuestHGCMDisconnectInfo
typedef struct _VBoxGuestHGCMCallInfo
#pragma pack()
#ifdef VBOXGUEST_IOCTL_CODE
# define VBOXGUEST_IOCTL_HGCM_DISCONNECT VBOXGUEST_IOCTL_CODE(17, sizeof(VBoxGuestHGCMDisconnectInfo))
# define IOCTL_VBOXGUEST_HGCM_CONNECT IOCTL_CODE(FILE_DEVICE_UNKNOWN, 3072, METHOD_BUFFERED, FILE_WRITE_ACCESS, sizeof(VBoxGuestHGCMConnectInfo))
# define IOCTL_VBOXGUEST_HGCM_DISCONNECT IOCTL_CODE(FILE_DEVICE_UNKNOWN, 3073, METHOD_BUFFERED, FILE_WRITE_ACCESS, sizeof(VBoxGuestHGCMDisconnectInfo))
# define IOCTL_VBOXGUEST_HGCM_CALL IOCTL_CODE(FILE_DEVICE_UNKNOWN, 3074, METHOD_BUFFERED, FILE_WRITE_ACCESS, sizeof(VBoxGuestHGCMCallInfo))
# define IOCTL_VBOXGUEST_CLIPBOARD_CONNECT IOCTL_CODE(FILE_DEVICE_UNKNOWN, 3075, METHOD_BUFFERED, FILE_WRITE_ACCESS, sizeof(uint32_t))
#define VBOXGUEST_HGCM_CALL_PARMS(a) ((HGCMFunctionParameter *)((uint8_t *)(a) + sizeof (VBoxGuestHGCMCallInfo)))
typedef struct _VMMDevCredentials
#pragma pack()
switch (requestType)
case VMMDevReq_GetMouseStatus:
case VMMDevReq_SetMouseStatus:
return sizeof(VMMDevReqMouseStatus);
return sizeof(VMMDevReqMousePointer);
case VMMDevReq_GetHostVersion:
return sizeof(VMMDevReqHostVersion);
case VMMDevReq_Idle:
return sizeof(VMMDevReqIdle);
case VMMDevReq_GetHostTime:
return sizeof(VMMDevReqHostTime);
return sizeof(VMMDevReqHypervisorInfo);
case VMMDevReq_SetPowerStatus:
return sizeof(VMMDevPowerStateRequest);
return sizeof(VMMDevEvents);
return sizeof(VMMDevReportGuestInfo);
return sizeof(VMMDevDisplayChangeRequest);
return sizeof(VMMDevDisplayChangeRequest2);
return sizeof(VMMDevVideoModeSupportedRequest);
return sizeof(VMMDevGetHeightReductionRequest);
return sizeof(VMMDevReqGuestCapabilities);
return sizeof(VMMDevReqGuestCapabilities2);
#ifdef VBOX_HGCM
case VMMDevReq_HGCMConnect:
return sizeof(VMMDevHGCMConnect);
case VMMDevReq_HGCMDisconnect:
return sizeof(VMMDevHGCMDisconnect);
#ifdef VBOX_WITH_64_BITS_GUESTS
case VMMDevReq_HGCMCall32:
return sizeof(VMMDevHGCMCall);
case VMMDevReq_HGCMCall64:
return sizeof(VMMDevHGCMCall);
case VMMDevReq_HGCMCall:
return sizeof(VMMDevHGCMCall);
case VMMDevReq_HGCMCancel:
return sizeof(VMMDevHGCMCancel);
return sizeof(VMMDevVideoAccelEnable);
return sizeof(VMMDevVideoAccelFlush);
return sizeof(VMMDevVideoSetVisibleRegion);
return sizeof(VMMDevSeamlessChangeRequest);
return sizeof(VMMDevCredentials);
return sizeof(VMMDevReportGuestStats);
return sizeof(VMMDevGetMemBalloonChangeRequest);
return sizeof(VMMDevGetStatisticsChangeRequest);
return sizeof(VMMDevChangeMemBalloon);
return sizeof(VMMDevVRDPChangeRequest);
case VMMDevReq_LogString:
return sizeof(VMMDevReqLogString);
if (!req)
return VERR_INVALID_PARAMETER;
if (!requestSize)
return VERR_INVALID_PARAMETER;
return VINF_SUCCESS;
#ifdef RT_OS_OS2
typedef struct VBOXGUESTOS2IDCCONNECT
DECLCALLBACKMEMBER(int, pfnServiceEP)(uint32_t u32Session, unsigned iFunction, void *pvData, size_t cbData, size_t *pcbDataReturned);
#ifdef IN_RING3
# ifdef ___iprt_time_h
VBGLR3DECL(int) VbglR3ClipboardGetHostMsg(uint32_t u32ClientId, uint32_t *pMsg, uint32_t *pfFormats);
VBGLR3DECL(int) VbglR3ClipboardReadData(uint32_t u32ClientId, uint32_t fFormat, void *pv, uint32_t cb, uint32_t *pcb);
VBGLR3DECL(int) VbglR3ClipboardWriteData(uint32_t u32ClientId, uint32_t fFormat, void *pv, uint32_t cb);
VBGLR3DECL(int) VbglR3SetPointerShape(uint32_t fFlags, uint32_t xHot, uint32_t yHot, uint32_t cx, uint32_t cy, const void *pvImg, size_t cbImg);
VBGLR3DECL(int) VbglR3GetLastDisplayChangeRequest(uint32_t *pcx, uint32_t *pcy, uint32_t *pcBits, uint32_t *piDisplay);
VBGLR3DECL(int) VbglR3DisplayChangeWaitEvent(uint32_t *pcx, uint32_t *pcy, uint32_t *pcBits, uint32_t *piDisplay);
VBGLR3DECL(int) VbglR3RetrieveVideoMode(char *pszName, uint32_t *pcx, uint32_t *pcy, uint32_t *pcBits);
VBGLR3DECL(int) VbglR3InfoSvcReadKey(uint32_t u32ClientId, char *pszKey, char *pszValue, uint32_t cbValue, uint32_t *pcbActual);