DECLVBGL(int) VbglR0CrCtlCreate(VBGLCRCTLHANDLE *phCtl) { int rc; if (phCtl) { struct VBGLHGCMHANDLEDATA *pHandleData = vbglHGCMHandleAlloc(); if (pHandleData) { rc = vbglDriverOpen(&pHandleData->driver); if (RT_SUCCESS(rc)) { *phCtl = pHandleData; return VINF_SUCCESS; } vbglHGCMHandleFree(pHandleData); } else rc = VERR_NO_MEMORY; *phCtl = NULL; } else rc = VERR_INVALID_PARAMETER; return rc; }
DECLVBGL(int) VbglHGCMConnect (VBGLHGCMHANDLE *pHandle, VBoxGuestHGCMConnectInfo *pData) { int rc; struct VBGLHGCMHANDLEDATA *pHandleData; if (!pHandle || !pData) return VERR_INVALID_PARAMETER; pHandleData = vbglHGCMHandleAlloc(); if (!pHandleData) rc = VERR_NO_MEMORY; else { rc = vbglDriverOpen (&pHandleData->driver); if (RT_SUCCESS(rc)) { rc = vbglDriverIOCtl (&pHandleData->driver, VBOXGUEST_IOCTL_HGCM_CONNECT, pData, sizeof (*pData)); if (RT_SUCCESS(rc)) rc = pData->result; if (RT_SUCCESS(rc)) { *pHandle = pHandleData; return rc; } vbglDriverClose (&pHandleData->driver); } vbglHGCMHandleFree (pHandleData); } return rc; }
DECLVBGL(int) vboxCrCtlCreate(HVBOXCRCTL *phCtl) { int rc; struct VBGLHGCMHANDLEDATA *pHandleData; if (!phCtl) return VERR_INVALID_PARAMETER; pHandleData = vbglHGCMHandleAlloc (); rc = VINF_SUCCESS; if (!pHandleData) { rc = VERR_NO_MEMORY; } else { rc = vbglDriverOpen (&pHandleData->driver); if (RT_SUCCESS(rc)) { *phCtl = pHandleData; return VINF_SUCCESS; } vbglHGCMHandleFree (pHandleData); } *phCtl = NULL; return rc; }
/** * The guest library uses lazy initialization for VMMDev port and memory, * because these values are provided by the VBoxGuest driver and it might * be loaded later than other drivers. * * The VbglEnter checks the current library status, tries to retrieve these * values and fails if they are unavailable. * */ static void vbglQueryDriverInfo (void) { int rc = VINF_SUCCESS; rc = RTSemMutexRequest(g_vbgldata.mutexDriverInit, RT_INDEFINITE_WAIT); if (RT_FAILURE(rc)) return; if (g_vbgldata.status == VbglStatusReady) { RTSemMutexRelease(g_vbgldata.mutexDriverInit); return; } rc = vbglDriverOpen(&g_vbgldata.driver); if (RT_SUCCESS(rc)) { /* * Try query the port info. */ VBoxGuestPortInfo port; rc = vbglDriverIOCtl (&g_vbgldata.driver, VBOXGUEST_IOCTL_GETVMMDEVPORT, &port, sizeof (port)); if (RT_SUCCESS (rc)) { dprintf (("port = 0x%04X, mem = %p\n", port.portAddress, port.pVMMDevMemory)); g_vbgldata.portVMMDev = (RTIOPORT)port.portAddress; g_vbgldata.pVMMDevMemory = port.pVMMDevMemory; g_vbgldata.status = VbglStatusReady; vbglR0QueryHostVersion(); } } RTSemMutexRelease(g_vbgldata.mutexDriverInit); dprintf (("vbglQueryDriverInfo rc = %d\n", rc)); }