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;
}
Exemple #2
0
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;
}
Exemple #4
0
/**
 * 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));
}