crservice.cpp revision 01df41f7a4e5f7de195a059541d1c89676da9673
312N/A * available from http://www.virtualbox.org. This file is free software;
5680N/A#include "cr_server.h"
312N/A#ifndef RT_OS_WINDOWS
5829N/A/* Used to process guest calls exceeding maximum allowed HGCM call size in a sequence of smaller calls */
5829N/Atypedef struct _CRVBOXSVCBUFFER_t {
312N/Atypedef struct _CRVBOXSVCPRESENTFBOCMD_t {
312N/Atypedef struct _CRVBOXSVCPRESENTFBO_t {
5829N/A/* Schedule a call to a separate worker thread to avoid deadlock on EMT thread when the screen configuration changes
623N/Astatic DECLCALLBACK(void) svcPresentFBO(void *data, int32_t screenId, int32_t x, int32_t y, uint32_t w, uint32_t h)
5829N/A LogRel(("SHARED_CROPENGL svcPresentFBO: not enough memory (%d)\n", sizeof(CRVBOXSVCPRESENTFBOCMD_t)));
5829N/A // @todo use critsect only to fetch the list and update the g_SvcPresentFBO's pQueueHead and pQueueTail.
3817N/A CHECK_ERROR_RET(pDisplay, DrawToScreen(pCmd->screenId, (BYTE*)pCmd->pData, pCmd->x, pCmd->y, pCmd->w, pCmd->h), rc);
return rc;
static int svcPresentFBOInit(void)
return rc;
static int svcPresentFBOTearDown(void)
while (pQueue)
return rc;
if (!g_pConsole)
if (!pFramebuffer)
return rc;
return rc;
return rc;
static DECLCALLBACK(int) svcSaveState(void *, uint32_t u32ClientID, void *pvClient, PSSMHANDLE pSSM)
while (pBuffer)
return VINF_SUCCESS;
static DECLCALLBACK(int) svcLoadState(void *, uint32_t u32ClientID, void *pvClient, PSSMHANDLE pSSM)
return VERR_SSM_UNEXPECTED_DATA;
/*@todo ugly hack, as we don't know size of stored opengl data try to read untill end of opengl data marker*/
char current;
while (*pMatch)
pMatch++;
return VINF_SUCCESS;
while (uiId)
if (!pBuffer)
return VERR_NO_MEMORY;
return VERR_NO_MEMORY;
if (g_pCRVBoxSVCBuffers)
return VERR_SSM_UNEXPECTED_DATA;
return VINF_SUCCESS;
/*MS's opengl32 tries to load our ICD around 30 times on failure...this is to prevent unnecessary spam*/
static int shown = 0;
if (iBuffer)
while (pBuffer)
static int shown=0;
shown++;
return NULL;
return pBuffer;
return NULL;
if (pBuffer)
return NULL;
if (g_pCRVBoxSVCBuffers)
return pBuffer;
static DECLCALLBACK(void) svcCall (void *, VBOXHGCMCALLHANDLE callHandle, uint32_t u32ClientID, void *pvClient, uint32_t u32Function, uint32_t cParms, VBOXHGCMSVCPARM paParms[])
Log(("SHARED_CROPENGL svcCall: u32ClientID = %d, fn = %d, cParms = %d, pparms = %d\n", u32ClientID, u32Function, cParms, paParms));
#ifdef DEBUG
uint32_t i;
for (i = 0; i < cParms; i++)
switch (u32Function)
case SHCRGL_GUEST_FN_WRITE:
svcClientVersionUnsupported(0, 0);
case SHCRGL_GUEST_FN_INJECT:
svcClientVersionUnsupported(0, 0);
crWarning("SHCRGL_GUEST_FN_INJECT failed to inject for %i from %i", u32InjectClientID, u32ClientID);
case SHCRGL_GUEST_FN_READ:
svcClientVersionUnsupported(0, 0);
svcClientVersionUnsupported(0, 0);
case SHCRGL_GUEST_FN_SET_PID:
if (!pSvcBuffer)
svcClientVersionUnsupported(0, 0);
case SHCRGL_GUEST_FN_GET_CAPS:
static DECLCALLBACK(int) svcHostCall (void *, uint32_t u32Function, uint32_t cParms, VBOXHGCMSVCPARM paParms[])
Log(("SHARED_CROPENGL svcHostCall: fn = %d, cParms = %d, pparms = %d\n", u32Function, cParms, paParms));
#ifdef DEBUG
uint32_t i;
for (i = 0; i < cParms; i++)
switch (u32Function)
#ifdef VBOX_WITH_CRHGSMI
rc = crVBoxServerCrHgsmiCmd((PVBOXVDMACMD_CHROMIUM_CMD)paParms[0].u.pointer.addr, paParms[0].u.pointer.size);
svcClientVersionUnsupported(0, 0);
rc = crVBoxServerCrHgsmiCtl((PVBOXVDMACMD_CHROMIUM_CTL)paParms[0].u.pointer.addr, paParms[0].u.pointer.size);
else if (!pConsole)
for (i=0; i<monitorCount; ++i)
if (!pFramebuffer)
case SHCRGL_HOST_FN_SET_VM:
rc = crVBoxServerSetRootVisibleRegion(paParms[1].u.uint32, (const RTRECT*)paParms[0].u.pointer.addr);
ULONG w, h;
if (!pFramebuffer)
if (!winId)
for (int i = 0; i < SHCRGL_CPARMS_DEV_RESIZE; ++i)
return VERR_INVALID_PARAMETER;
rc = crVBoxServerNotifyResize((const VBVAINFOSCREEN *)paParms[0].u.pointer.addr, paParms[1].u.pointer.addr);
for (int i = 0; i < SHCRGL_CPARMS_VIEWPORT_CHANGED; ++i)
return rc;
if (!ptable)
Log(("VBoxHGCMSvcLoad: ptable->cbSize = %d, ptable->u32Version = 0x%08X\n", ptable->cbSize, ptable->u32Version));
if (!crVBoxServerInit())
return VERR_NOT_SUPPORTED;
return rc;
#ifdef RT_OS_WINDOWS
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
(void) lpvReserved;
switch (fdwReason)
case DLL_THREAD_ATTACH:
case DLL_PROCESS_DETACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_ATTACH:
return TRUE;