VirtualBox

Ignore:
Timestamp:
Mar 15, 2012 2:20:20 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
76853
Message:

crOpenGL/wddm: don't use VBoxGuest device to comply woth Metro apps security

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/GuestHost/OpenGL/util/vboxhgcm.c

    r39288 r40483  
    596596 */
    597597/** @todo use vbglR3DoIOCtl here instead */
    598 static int crVBoxHGCMCall(void *pvData, unsigned cbData)
     598static int crVBoxHGCMCall(CRConnection *conn, void *pvData, unsigned cbData)
    599599{
    600600#ifdef IN_GUEST
    601 
     601    PCRVBOXHGSMI_CLIENT pClient = _crVBoxHGSMIClientGet(conn);
     602    if (pClient)
     603    {
     604        return VBoxCrHgsmiCtlConCall(pClient->pHgsmi, (struct VBoxGuestHGCMCallInfo *)pvData, cbData);
     605    }
     606    else
     607    {
    602608# ifdef RT_OS_WINDOWS
    603609    DWORD cbReturned, lerr;
     
    683689    return VERR_NOT_SUPPORTED;
    684690# endif /*#ifdef RT_OS_WINDOWS*/
    685 
     691    }
    686692#else /*#ifdef IN_GUEST*/
    687693    crError("crVBoxHGCMCall called on host side!");
     
    853859        parms.pBuffer.u.Pointer.u.linearAddr = (uintptr_t) buf;
    854860
    855         rc = crVBoxHGCMCall(&parms, sizeof(parms));
     861        rc = crVBoxHGCMCall(conn, &parms, sizeof(parms));
    856862        callRes = parms.hdr.result;
    857863    }
     
    870876        parms.pBuffer.u.Pointer.u.linearAddr = (uintptr_t) buf;
    871877
    872         rc = crVBoxHGCMCall(&parms, sizeof(parms));
     878        rc = crVBoxHGCMCall(conn, &parms, sizeof(parms));
    873879        callRes = parms.hdr.result;
    874880    }
     
    911917    parms.cbBuffer.u.value32 = 0;
    912918
    913     rc = crVBoxHGCMCall(&parms, sizeof(parms));
     919    rc = crVBoxHGCMCall(conn, &parms, sizeof(parms));
    914920
    915921    if (RT_FAILURE(rc) || RT_FAILURE(parms.hdr.result))
     
    967973    parms.cbWriteback.u.value32 = 0;
    968974
    969     rc = crVBoxHGCMCall(&parms, sizeof(parms));
     975    rc = crVBoxHGCMCall(conn, &parms, sizeof(parms));
    970976
    971977#if defined(RT_OS_LINUX) || defined(RT_OS_WINDOWS)
     
    10031009            crDebug("SHCRGL_GUEST_FN_WRITE_BUFFER, offset=%u, size=%u", wbParms.ui32Offset.u.value32, wbParms.pBuffer.u.Pointer.size);
    10041010
    1005             rc = crVBoxHGCMCall(&wbParms, sizeof(wbParms));
     1011            rc = crVBoxHGCMCall(conn, &wbParms, sizeof(wbParms));
    10061012            if (RT_FAILURE(rc) || RT_FAILURE(wbParms.hdr.result))
    10071013            {
     
    10281034            crMemcpy(&wrbParms.cbWriteback, &parms.cbWriteback, sizeof(HGCMFunctionParameter));
    10291035
    1030             rc = crVBoxHGCMCall(&wrbParms, sizeof(wrbParms));
     1036            rc = crVBoxHGCMCall(conn, &wrbParms, sizeof(wrbParms));
    10311037
    10321038            /*bit of hack to reuse code below*/
     
    11641170    parms.cbBuffer.u.value32 = 0;
    11651171
    1166     rc = crVBoxHGCMCall(&parms, sizeof(parms));
     1172    rc = crVBoxHGCMCall(conn, &parms, sizeof(parms));
    11671173
    11681174    if (RT_FAILURE(rc) || RT_FAILURE(parms.hdr.result))
     
    13721378    parms.vMinor.u.value32 = CR_PROTOCOL_VERSION_MINOR;
    13731379
    1374     rc = crVBoxHGCMCall(&parms, sizeof(parms));
     1380    rc = crVBoxHGCMCall(conn, &parms, sizeof(parms));
    13751381
    13761382    if (RT_FAILURE(rc) || RT_FAILURE(parms.hdr.result))
     
    14001406    parms.u64PID.u.value64 = pid;
    14011407
    1402     rc = crVBoxHGCMCall(&parms, sizeof(parms));
     1408    rc = crVBoxHGCMCall(conn, &parms, sizeof(parms));
    14031409
    14041410    if (RT_FAILURE(rc) || RT_FAILURE(parms.hdr.result))
     
    14421448        {
    14431449            crDebug("could not open VBox Guest Additions driver! rc = %d\n", GetLastError());
     1450            CRASSERT(0);
    14441451            VBOXCRHGSMIPROFILE_FUNC_EPILOGUE();
    14451452            return FALSE;
     
    15331540}
    15341541
     1542static bool _crVBoxCommonDoDisconnectLocked( CRConnection *conn )
     1543{
     1544    int i;
     1545    if (conn->pHostBuffer)
     1546    {
     1547        crFree(conn->pHostBuffer);
     1548        conn->pHostBuffer = NULL;
     1549        conn->cbHostBuffer = 0;
     1550        conn->cbHostBufferAllocated = 0;
     1551    }
     1552
     1553    conn->pBuffer = NULL;
     1554    conn->cbBuffer = 0;
     1555
     1556    if (conn->type == CR_VBOXHGCM)
     1557    {
     1558        --g_crvboxhgcm.num_conns;
     1559
     1560        if (conn->index < g_crvboxhgcm.num_conns)
     1561        {
     1562            g_crvboxhgcm.conns[conn->index] = g_crvboxhgcm.conns[g_crvboxhgcm.num_conns];
     1563            g_crvboxhgcm.conns[conn->index]->index = conn->index;
     1564        }
     1565        else g_crvboxhgcm.conns[conn->index] = NULL;
     1566
     1567        conn->type = CR_NO_CONNECTION;
     1568    }
     1569
     1570    for (i = 0; i < g_crvboxhgcm.num_conns; i++)
     1571        if (g_crvboxhgcm.conns[i] && g_crvboxhgcm.conns[i]->type != CR_NO_CONNECTION)
     1572            return true;
     1573    return false;
     1574}
     1575
    15351576/*@todo same, replace DeviceIoControl with vbglR3DoIOCtl */
    15361577static void crVBoxHGCMDoDisconnect( CRConnection *conn )
     
    15411582    DWORD cbReturned;
    15421583# endif
    1543     int i;
    1544 #endif
     1584#endif
     1585    bool fHasActiveCons = false;
    15451586
    15461587    if (!g_crvboxhgcm.initialized) return;
     
    15521593    VBOXCRHGSMIPROFILE_FUNC_PROLOGUE();
    15531594
    1554     if (conn->pHostBuffer)
    1555     {
    1556         crFree(conn->pHostBuffer);
    1557         conn->pHostBuffer = NULL;
    1558         conn->cbHostBuffer = 0;
    1559         conn->cbHostBufferAllocated = 0;
    1560     }
    1561 
    1562     conn->pBuffer = NULL;
    1563     conn->cbBuffer = 0;
    1564 
    1565     if (conn->type == CR_VBOXHGCM)
    1566     {
    1567         --g_crvboxhgcm.num_conns;
    1568 
    1569         if (conn->index < g_crvboxhgcm.num_conns)
    1570         {
    1571             g_crvboxhgcm.conns[conn->index] = g_crvboxhgcm.conns[g_crvboxhgcm.num_conns];
    1572             g_crvboxhgcm.conns[conn->index]->index = conn->index;
    1573         }
    1574         else g_crvboxhgcm.conns[conn->index] = NULL;
    1575 
    1576         conn->type = CR_NO_CONNECTION;
    1577     }
     1595    fHasActiveCons = _crVBoxCommonDoDisconnectLocked(conn);
    15781596
    15791597#ifndef IN_GUEST
     
    16131631    }
    16141632
    1615     /* see if any connections remain */
    1616     for (i = 0; i < g_crvboxhgcm.num_conns; i++)
    1617         if (g_crvboxhgcm.conns[i] && g_crvboxhgcm.conns[i]->type != CR_NO_CONNECTION)
    1618             break;
    1619 
    16201633    /* close guest additions driver*/
    1621     if (i>=g_crvboxhgcm.num_conns)
     1634    if (!fHasActiveCons)
    16221635    {
    16231636# ifdef RT_OS_WINDOWS
     
    16721685        int rc;
    16731686#ifndef VBOX_CRHGSMI_WITH_D3DDEV
    1674         rc = VBoxCrHgsmiInit();
     1687        rc = VBoxCrHgsmiInit(CR_PROTOCOL_VERSION_MAJOR, CR_PROTOCOL_VERSION_MINOR);
    16751688#else
    16761689        VBOXCRHGSMI_CALLBACKS Callbacks;
     
    23052318static int crVBoxHGSMIDoConnect( CRConnection *conn )
    23062319{
    2307     return crVBoxHGCMDoConnect(conn);
     2320    PCRVBOXHGSMI_CLIENT pClient;
     2321    int rc = VINF_SUCCESS;
     2322
     2323#ifdef CHROMIUM_THREADSAFE
     2324    crLockMutex(&g_crvboxhgcm.mutex);
     2325#endif
     2326
     2327    VBOXCRHGSMIPROFILE_FUNC_PROLOGUE();
     2328
     2329    pClient = _crVBoxHGSMIClientGet(conn);
     2330    CRASSERT(pClient);
     2331    if (pClient)
     2332    {
     2333        rc = VBoxCrHgsmiCtlConGetClientID(pClient->pHgsmi, &conn->u32ClientID);
     2334        CRASSERT(RT_SUCCESS(rc));
     2335    }
     2336
     2337    VBOXCRHGSMIPROFILE_FUNC_EPILOGUE();
     2338
     2339#ifdef CHROMIUM_THREADSAFE
     2340    crUnlockMutex(&g_crvboxhgcm.mutex);
     2341#endif
     2342    return RT_SUCCESS(rc);
    23082343}
    23092344
    23102345static void crVBoxHGSMIDoDisconnect( CRConnection *conn )
    23112346{
     2347    bool fHasActiveCons = false;
     2348
     2349    if (!g_crvboxhgcm.initialized) return;
     2350
     2351    VBOXCRHGSMIPROFILE_FUNC_PROLOGUE();
     2352
    23122353#ifdef CHROMIUM_THREADSAFE
    23132354    crLockMutex(&g_crvboxhgcm.mutex);
    23142355#endif
     2356
     2357    fHasActiveCons = _crVBoxCommonDoDisconnectLocked(conn);
     2358
    23152359#ifndef VBOX_CRHGSMI_WITH_D3DDEV
    23162360    if (conn->HgsmiClient.pHgsmi)
     
    23212365        VBoxCrHgsmiDestroy(pHgsmi);
    23222366    }
    2323 #endif
    2324     crVBoxHGCMDoDisconnect(conn);
     2367#else
     2368# error "port me!"
     2369#endif
     2370
     2371    VBOXCRHGSMIPROFILE_FUNC_EPILOGUE();
     2372
    23252373#ifdef CHROMIUM_THREADSAFE
    23262374    crUnlockMutex(&g_crvboxhgcm.mutex);
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette