VirtualBox

Changeset 1080 in vbox


Ignore:
Timestamp:
Feb 28, 2007 8:28:11 AM (18 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
18972
Message:
  • Support for save and restore added for shared folders.
  • Object type checking added
Location:
trunk/src/VBox/Main
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/VMMDevInterface.cpp

    r906 r1080  
    3636#ifdef VBOX_HGCM
    3737#include "hgcm/HGCM.h"
     38#include "hgcm/HGCMObjects.h"
    3839#endif
    3940
     
    328329    PDRVMAINVMMDEV pDrv = PDMINS2DATA(pDrvIns, PDRVMAINVMMDEV);
    329330   
    330     return hgcmSaveStateInternal (pDrv->pHGCMPort, pDrv->pVMMDev->mSharedFolderClientId, pSSM);
     331    /* Save the current handle count and restore afterwards to avoid client id conflicts. */
     332    int rc = SSMR3PutU32(pSSM, hgcmObjQueryHandleCount());
     333    AssertRCReturn(rc, rc);
     334
     335    return hgcmSaveStateInternal (pDrv->pVMMDev->mSharedFolderClientId, pSSM);
    331336}
    332337
     
    343348{
    344349    PDRVMAINVMMDEV pDrv = PDMINS2DATA(pDrvIns, PDRVMAINVMMDEV);
     350    uint32_t       u32HandleCount;
    345351
    346352    if (u32Version != HGCM_SSM_VERSION)
    347353        return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION;
    348354
    349     return hgcmLoadStateInternal (pDrv->pHGCMPort, pDrv->pVMMDev->mSharedFolderClientId, pSSM);
     355    /* Save the current handle count and restore afterwards to avoid client id conflicts. */
     356    int rc = SSMR3GetU32(pSSM, &u32HandleCount);
     357    AssertRCReturn(rc, rc);
     358    hgcmObjSetHandleCount(u32HandleCount);
     359
     360    /* Unload all HGCM services to refresh client ids. */
     361    /** @todo shared clipboard too! */
     362    /** @todo need other solution! */
     363    if (pDrv->pVMMDev->mSharedFolderClientId)
     364    {
     365        uint64_t     dummy = 0;
     366        PVBOXHGCMCMD cmd = (PVBOXHGCMCMD)&dummy;
     367
     368        pDrv->pVMMDev->hgcmDisconnect(cmd, pDrv->pVMMDev->getShFlClientId());
     369
     370        /* Reload Shared Folder HGCM service */
     371        HGCMSERVICELOCATION loc;
     372
     373        cmd = (PVBOXHGCMCMD)&dummy;
     374
     375        Log(("Connect to Shared Folders service\n"));
     376        pDrv->pVMMDev->mSharedFolderClientId = 0;
     377        loc.type = VMMDevHGCMLoc_LocalHost;
     378        strcpy(loc.u.host.achName, "VBoxSharedFolders");
     379        int rc = pDrv->pVMMDev->hgcmConnect(cmd, &loc, &pDrv->pVMMDev->mSharedFolderClientId);
     380        if (rc != VINF_SUCCESS)
     381        {
     382            AssertMsgFailed(("hgcmConnect returned %Vrc\n", rc));
     383        }
     384    }
     385
     386    return hgcmLoadStateInternal (pDrv->pVMMDev->mSharedFolderClientId, pSSM);
    350387}
    351388
     
    575612        pData->pVMMDev->mSharedFolderClientId = 0;
    576613    }
    577 #if 0 /* enable later */
    578614    pDrvIns->pDrvHlp->pfnSSMRegister(pDrvIns, "HGCM", 0, HGCM_SSM_VERSION, 4096/* bad guess */, NULL, iface_hgcmSave, NULL, NULL, iface_hgcmLoad, NULL);
    579 #endif
    580615#endif
    581616
  • trunk/src/VBox/Main/hgcm/HGCM.cpp

    r910 r1080  
    161161        int GuestCall (PPDMIHGCMPORT pHGCMPort, PVBOXHGCMCMD pCmd, uint32_t u32ClientID, uint32_t u32Function, uint32_t cParms, VBOXHGCMSVCPARM aParms[], bool fBlock);
    162162        int HostCall (PVBOXHGCMCMD pCmd, uint32_t u32ClientID, uint32_t u32Function, uint32_t cParms, VBOXHGCMSVCPARM aParms[]);
     163
     164        int SaveState(uint32_t u32ClientID, PSSMHANDLE pSSM);
     165        int LoadState(uint32_t u32ClientID, PSSMHANDLE pSSM);
    163166};
    164167
     
    167170{
    168171    public:
     172        HGCMClient () : HGCMObject(HGCMOBJ_CLIENT) {};
    169173        ~HGCMClient ();
    170174
     
    471475                rc = VINF_SUCCESS;
    472476
    473                 HGCMClient *pClient = (HGCMClient *)hgcmObjReference (pMsg->u32ClientID);
     477                HGCMClient *pClient = (HGCMClient *)hgcmObjReference (pMsg->u32ClientID, HGCMOBJ_CLIENT);
    474478
    475479                if (pClient)
     
    489493                rc = VINF_SUCCESS;
    490494
    491                 HGCMClient *pClient = (HGCMClient *)hgcmObjReference (pMsg->u32ClientID);
     495                HGCMClient *pClient = (HGCMClient *)hgcmObjReference (pMsg->u32ClientID, HGCMOBJ_CLIENT);
    492496
    493497                if (pClient)
     
    507511                rc = VINF_SUCCESS;
    508512
    509                 HGCMClient *pClient = (HGCMClient *)hgcmObjReference (pMsg->u32ClientID);
     513                HGCMClient *pClient = (HGCMClient *)hgcmObjReference (pMsg->u32ClientID, HGCMOBJ_CLIENT);
    510514
    511515                if (pClient)
     
    517521                else
    518522                {
    519                     rc = VERR_INVALID_HANDLE;
     523                    rc = VERR_HGCM_INVALID_CLIENT_ID;
    520524                }
    521525            } break;
     
    531535                rc = VINF_SUCCESS;
    532536            } break;
     537
     538            case HGCMMSGID_LOADSTATE:
     539            {
     540                LogFlow(("HGCMMSGID_LOADSTATE\n"));
     541
     542                HGCMMsgLoadSaveState *pMsg = (HGCMMsgLoadSaveState *)pMsgCore;
     543                HGCMClient *pClient = (HGCMClient *)hgcmObjReference (pMsg->u32ClientID, HGCMOBJ_CLIENT);
     544
     545                rc = VINF_SUCCESS;
     546                if (pClient && pSvc->m_fntable.pfnLoadState)
     547                {
     548                    rc = pSvc->m_fntable.pfnLoadState (pMsg->u32ClientID, HGCM_CLIENT_DATA(pSvc, pClient), pMsg->pSSM);
     549                    hgcmObjDereference (pClient);
     550                }
     551                break;
     552            }
     553
     554            case HGCMMSGID_SAVESTATE:
     555            {
     556                LogFlow(("HGCMMSGID_SAVESTATE\n"));
     557
     558                HGCMMsgLoadSaveState *pMsg = (HGCMMsgLoadSaveState *)pMsgCore;
     559                HGCMClient *pClient = (HGCMClient *)hgcmObjReference (pMsg->u32ClientID, HGCMOBJ_CLIENT);
     560
     561                rc = VINF_SUCCESS;
     562                if (pClient && pSvc->m_fntable.pfnSaveState)
     563                {
     564                    rc = pSvc->m_fntable.pfnSaveState (pMsg->u32ClientID, HGCM_CLIENT_DATA(pSvc, pClient), pMsg->pSSM);
     565                    hgcmObjDereference (pClient);
     566                }
     567                break;
     568            }
    533569
    534570            default:
     
    894930    if (VBOX_SUCCESS(rc))
    895931    {
    896         HGCMMsgSvcConnect *pMsg = (HGCMMsgSvcConnect *)hgcmObjReference (hMsg);
     932        HGCMMsgSvcConnect *pMsg = (HGCMMsgSvcConnect *)hgcmObjReference (hMsg, HGCMOBJ_MSG);
    897933
    898934        AssertRelease(pMsg);
     
    924960    if (VBOX_SUCCESS(rc))
    925961    {
    926         HGCMMsgSvcDisconnect *pMsg = (HGCMMsgSvcDisconnect *)hgcmObjReference (hMsg);
     962        HGCMMsgSvcDisconnect *pMsg = (HGCMMsgSvcDisconnect *)hgcmObjReference (hMsg, HGCMOBJ_MSG);
    927963
    928964        AssertRelease(pMsg);
     
    954990    if (VBOX_SUCCESS(rc))
    955991    {
    956         HGCMMsgCall *pMsg = (HGCMMsgCall *)hgcmObjReference (hMsg);
     992        HGCMMsgCall *pMsg = (HGCMMsgCall *)hgcmObjReference (hMsg, HGCMOBJ_MSG);
    957993
    958994        AssertRelease(pMsg);
     
    9981034    if (VBOX_SUCCESS(rc))
    9991035    {
    1000         HGCMMsgHostCall *pMsg = (HGCMMsgHostCall *)hgcmObjReference (hMsg);
     1036        HGCMMsgHostCall *pMsg = (HGCMMsgHostCall *)hgcmObjReference (hMsg, HGCMOBJ_MSG);
    10011037
    10021038        AssertRelease(pMsg);
     
    10161052    {
    10171053        Log(("MAIN::HGCMService::Call: Message allocation failed: %Vrc\n", rc));
     1054    }
     1055
     1056    return rc;
     1057}
     1058
     1059int HGCMService::SaveState(uint32_t u32ClientID, PSSMHANDLE pSSM)
     1060{
     1061    HGCMMSGHANDLE hMsg = 0;
     1062
     1063    LogFlow(("MAIN::HGCMService::SaveState %s\n", m_pszSvcName));
     1064
     1065    int rc = hgcmMsgAlloc (m_thread, &hMsg, HGCMMSGID_SAVESTATE, sizeof (HGCMMsgLoadSaveState), hgcmMessageAlloc);
     1066
     1067    if (VBOX_SUCCESS(rc))
     1068    {
     1069        HGCMMsgLoadSaveState *pMsg = (HGCMMsgLoadSaveState *)hgcmObjReference (hMsg, HGCMOBJ_MSG);
     1070
     1071        AssertRelease(pMsg);
     1072
     1073        pMsg->u32ClientID = u32ClientID;
     1074        pMsg->pSSM        = pSSM;
     1075
     1076        hgcmObjDereference (pMsg);
     1077
     1078        rc = hgcmMsgSend (hMsg);
     1079    }
     1080    else
     1081    {
     1082        Log(("MAIN::HGCMService::SaveState: Message allocation failed: %Vrc\n", rc));
     1083    }
     1084
     1085    return rc;
     1086}
     1087
     1088int HGCMService::LoadState (uint32_t u32ClientID, PSSMHANDLE pSSM)
     1089{
     1090    HGCMMSGHANDLE hMsg = 0;
     1091
     1092    LogFlow(("MAIN::HGCMService::LoadState %s\n", m_pszSvcName));
     1093
     1094    int rc = hgcmMsgAlloc (m_thread, &hMsg, HGCMMSGID_LOADSTATE, sizeof (HGCMMsgLoadSaveState), hgcmMessageAlloc);
     1095
     1096    if (VBOX_SUCCESS(rc))
     1097    {
     1098        HGCMMsgLoadSaveState *pMsg = (HGCMMsgLoadSaveState *)hgcmObjReference (hMsg, HGCMOBJ_MSG);
     1099
     1100        AssertRelease(pMsg);
     1101
     1102        pMsg->u32ClientID = u32ClientID;
     1103        pMsg->pSSM        = pSSM;
     1104
     1105        hgcmObjDereference (pMsg);
     1106
     1107        rc = hgcmMsgSend (hMsg);
     1108    }
     1109    else
     1110    {
     1111        Log(("MAIN::HGCMService::LoadState: Message allocation failed: %Vrc\n", rc));
    10181112    }
    10191113
     
    11191213
    11201214                /* Forward call to the service dedicated HGCM thread. */
    1121                 HGCMClient *pClient = (HGCMClient *)hgcmObjReference (pMsg->u32ClientID);
     1215                HGCMClient *pClient = (HGCMClient *)hgcmObjReference (pMsg->u32ClientID, HGCMOBJ_CLIENT);
    11221216
    11231217                if (!pClient)
     
    11641258            } break;
    11651259
    1166 #if 0
    1167             case HGCMMSGID_LOADSTATE:
    1168             {
    1169                 LogFlow(("HGCMMSGID_LOADSTATE\n"));
    1170 
    1171                 HGCMMsgLoadSaveState *pMsg = (HGCMMsgLoadSaveState *)pMsgCore;
    1172                 HGCMClient *pClient = (HGCMClient *)hgcmObjReference (pMsg->u32ClientID);
    1173 
    1174                 rc = VINF_SUCCESS;
    1175                 if (pClient && pService->m_fntable.pfnLoadState)
    1176                 {
    1177                     rc = pService->m_fntable.pfnLoadState (pMsg->u32ClientID, HGCM_CLIENT_DATA(pService, pClient), pMsg->pSSM);
    1178                     hgcmObjDereference (pClient);
    1179                 }
    1180                 break;
    1181             }
    1182 
    1183             case HGCMMSGID_SAVESTATE:
    1184             {
    1185                 LogFlow(("HGCMMSGID_SAVESTATE\n"));
    1186 
    1187                 HGCMMsgLoadSaveState *pMsg = (HGCMMsgLoadSaveState *)pMsgCore;
    1188                 HGCMClient *pClient = (HGCMClient *)hgcmObjReference (pMsg->u32ClientID);
    1189 
    1190                 rc = VINF_SUCCESS;
    1191                 if (pClient && pService->m_fntable.pfnSaveState)
    1192                 {
    1193                     rc = pService->m_fntable.pfnSaveState (pMsg->u32ClientID, HGCM_CLIENT_DATA(pService, pClient), pMsg->pSSM);
    1194                     hgcmObjDereference (pClient);
    1195                 }
    1196                 break;
    1197             }
    1198 #endif       
    11991260            default:
    12001261            {
     
    12341295    if (VBOX_SUCCESS(rc))
    12351296    {
    1236         HGCMMsgConnect *pMsg = (HGCMMsgConnect *)hgcmObjReference (hMsg);
     1297        HGCMMsgConnect *pMsg = (HGCMMsgConnect *)hgcmObjReference (hMsg, HGCMOBJ_MSG);
    12371298
    12381299        AssertRelease(pMsg);
     
    12891350    if (VBOX_SUCCESS(rc))
    12901351    {
    1291         HGCMMsgDisconnect *pMsg = (HGCMMsgDisconnect *)hgcmObjReference (hMsg);
     1352        HGCMMsgDisconnect *pMsg = (HGCMMsgDisconnect *)hgcmObjReference (hMsg, HGCMOBJ_MSG);
    12921353
    12931354        AssertRelease(pMsg);
     
    13191380}
    13201381
    1321 int hgcmSaveStateInternal (PPDMIHGCMPORT pHGCMPort, uint32_t u32ClientID, PSSMHANDLE pSSM)
     1382int hgcmSaveStateInternal (uint32_t u32ClientID, PSSMHANDLE pSSM)
    13221383{
    13231384    int rc = VINF_SUCCESS;
    13241385
    1325     LogFlow(("MAIN::hgcmSaveStateInternal: pHGCMPort = %p, u32ClientID = %d\n",
    1326              pHGCMPort, u32ClientID));
    1327 
    1328     if (!pHGCMPort)
    1329     {
    1330         return VERR_INVALID_PARAMETER;
    1331     }
    1332 
    1333     HGCMMSGHANDLE hMsg = 0;
    1334 
    1335     rc = hgcmMsgAlloc (g_hgcmThread, &hMsg, HGCMMSGID_SAVESTATE, sizeof (HGCMMsgLoadSaveState), hgcmMessageAlloc);
    1336 
    1337     if (VBOX_SUCCESS(rc))
    1338     {
    1339         HGCMMsgLoadSaveState *pMsg = (HGCMMsgLoadSaveState *)hgcmObjReference (hMsg);
    1340 
    1341         AssertRelease(pMsg);
    1342 
    1343         pMsg->pHGCMPort   = pHGCMPort;
    1344         pMsg->u32ClientID = u32ClientID;
    1345         pMsg->pSSM        = pSSM;
    1346 
    1347         rc = hgcmMsgSend (hMsg);
    1348 
    1349         hgcmObjDereference (pMsg);
    1350     }
    1351     else
    1352     {
    1353         Log(("MAIN::hgcmSaveStateInternal: Message allocation failed: %Vrc\n", rc));
    1354     }
    1355 
    1356     return rc;
    1357 }
    1358 
    1359 int hgcmLoadStateInternal (PPDMIHGCMPORT pHGCMPort, uint32_t u32ClientID, PSSMHANDLE pSSM)
     1386    LogFlow(("MAIN::hgcmSaveStateInternal: u32ClientID = %d\n", u32ClientID));
     1387
     1388    HGCMClient *pClient = (HGCMClient *)hgcmObjReference (u32ClientID, HGCMOBJ_CLIENT);
     1389
     1390    if (!pClient)
     1391    {
     1392        Log(("MAIN::hgcmCallInternal: FAILURE resolving client id %d\n", u32ClientID));
     1393        return VERR_HGCM_INVALID_CLIENT_ID;
     1394    }
     1395
     1396    AssertRelease(pClient->pService);
     1397
     1398    rc = pClient->pService->SaveState (u32ClientID, pSSM);
     1399
     1400    hgcmObjDereference (pClient);
     1401
     1402    return rc;
     1403}
     1404
     1405int hgcmLoadStateInternal (uint32_t u32ClientID, PSSMHANDLE pSSM)
    13601406{
    13611407    int rc = VINF_SUCCESS;
    13621408
    1363     LogFlow(("MAIN::hgcmLoadStateInternal: pHGCMPort = %p, u32ClientID = %d\n",
    1364              pHGCMPort, u32ClientID));
    1365 
    1366     if (!pHGCMPort)
    1367     {
    1368         return VERR_INVALID_PARAMETER;
    1369     }
    1370 
    1371     HGCMMSGHANDLE hMsg = 0;
    1372 
    1373     rc = hgcmMsgAlloc (g_hgcmThread, &hMsg, HGCMMSGID_LOADSTATE, sizeof (HGCMMsgLoadSaveState), hgcmMessageAlloc);
    1374 
    1375     if (VBOX_SUCCESS(rc))
    1376     {
    1377         HGCMMsgLoadSaveState *pMsg = (HGCMMsgLoadSaveState *)hgcmObjReference (hMsg);
    1378 
    1379         AssertRelease(pMsg);
    1380 
    1381         pMsg->pHGCMPort   = pHGCMPort;
    1382         pMsg->u32ClientID = u32ClientID;
    1383         pMsg->pSSM        = pSSM;
    1384 
    1385         rc = hgcmMsgSend (hMsg);
    1386 
    1387         hgcmObjDereference (pMsg);
    1388     }
    1389     else
    1390     {
    1391         Log(("MAIN::hgcmLoadStateInternal: Message allocation failed: %Vrc\n", rc));
    1392     }
    1393 
     1409    LogFlow(("MAIN::hgcmLoadStateInternal: u32ClientID = %d\n", u32ClientID));
     1410
     1411    HGCMClient *pClient = (HGCMClient *)hgcmObjReference (u32ClientID, HGCMOBJ_CLIENT);
     1412
     1413    if (!pClient)
     1414    {
     1415        Log(("MAIN::hgcmCallInternal: FAILURE resolving client id %d\n", u32ClientID));
     1416        return VERR_HGCM_INVALID_CLIENT_ID;
     1417    }
     1418
     1419    AssertRelease(pClient->pService);
     1420
     1421    rc = pClient->pService->LoadState (u32ClientID, pSSM);
     1422
     1423    hgcmObjDereference (pClient);
    13941424    return rc;
    13951425}
     
    14131443    if (VBOX_SUCCESS(rc))
    14141444    {
    1415         HGCMMsgLoad *pMsg = (HGCMMsgLoad *)hgcmObjReference (hMsg);
     1445        HGCMMsgLoad *pMsg = (HGCMMsgLoad *)hgcmObjReference (hMsg, HGCMOBJ_MSG);
    14161446
    14171447        AssertRelease(pMsg);
     
    14551485    }
    14561486
    1457     HGCMClient *pClient = (HGCMClient *)hgcmObjReference (u32ClientID);
     1487    HGCMClient *pClient = (HGCMClient *)hgcmObjReference (u32ClientID, HGCMOBJ_CLIENT);
    14581488
    14591489    if (!pClient)
    14601490    {
    14611491        Log(("MAIN::hgcmCallInternal: FAILURE resolving client id %d\n", u32ClientID));
    1462         return VERR_INVALID_PARAMETER;
     1492        return VERR_HGCM_INVALID_CLIENT_ID;
    14631493    }
    14641494
     
    14941524    if (VBOX_SUCCESS(rc))
    14951525    {
    1496         HGCMMsgHostCall *pMsg = (HGCMMsgHostCall *)hgcmObjReference (hMsg);
     1526        HGCMMsgHostCall *pMsg = (HGCMMsgHostCall *)hgcmObjReference (hMsg, HGCMOBJ_MSG);
    14971527
    14981528        AssertRelease(pMsg);
  • trunk/src/VBox/Main/hgcm/HGCMObjects.cpp

    r1 r1080  
    173173}
    174174
    175 HGCMObject *hgcmObjReference (uint32_t handle)
     175HGCMObject *hgcmObjReference (uint32_t handle, HGCMOBJ_TYPE enmObjType)
    176176{
    177177    LogFlow(("MAIN::hgcmObjReference: handle %d\n", handle));
     
    185185        ObjectAVLCore *pCore = (ObjectAVLCore *)RTAvlULGet (&g_pTree, handle);
    186186
    187         if (pCore)
     187        Assert(!pCore || (pCore->pSelf && pCore->pSelf->Type() == enmObjType));
     188        if (    pCore
     189            &&  pCore->pSelf
     190            &&  pCore->pSelf->Type() == enmObjType)
    188191        {
    189192            pObject = pCore->pSelf;
     
    216219    LogFlow(("MAIN::hgcmObjDereference: return\n"));
    217220}
     221
     222uint32_t hgcmObjQueryHandleCount ()
     223{
     224    return g_u32HandleCount;
     225}
     226
     227void hgcmObjSetHandleCount (uint32_t u32HandleCount)
     228{
     229    Assert(g_u32HandleCount <= u32HandleCount);
     230
     231    int rc = hgcmObjEnter ();
     232
     233    if (VBOX_SUCCESS(rc))
     234    {
     235        if (g_u32HandleCount <= u32HandleCount)
     236            g_u32HandleCount = u32HandleCount;
     237        hgcmObjLeave ();
     238   }
     239}
  • trunk/src/VBox/Main/hgcm/HGCMThread.cpp

    r313 r1080  
    209209}
    210210
    211 HGCMThread::HGCMThread ()
     211HGCMThread::HGCMThread () 
    212212    :
     213    HGCMObject(HGCMOBJ_THREAD),
    213214    m_pfnThread (NULL),
    214215    m_pvUser (NULL),
     
    733734    int rc = VINF_SUCCESS;
    734735
    735     HGCMThread *pThread = (HGCMThread *)hgcmObjReference (hThread);
     736    HGCMThread *pThread = (HGCMThread *)hgcmObjReference (hThread, HGCMOBJ_THREAD);
    736737
    737738    if (!pThread)
     
    757758    int rc = VINF_SUCCESS;
    758759
    759     HGCMMsgCore *pMsg = (HGCMMsgCore *)hgcmObjReference (hMsg);
     760    HGCMMsgCore *pMsg = (HGCMMsgCore *)hgcmObjReference (hMsg, HGCMOBJ_MSG);
    760761
    761762    if (!pMsg)
     
    808809    int rc = VINF_SUCCESS;
    809810
    810     HGCMThread *pThread = (HGCMThread *)hgcmObjReference (hThread);
     811    HGCMThread *pThread = (HGCMThread *)hgcmObjReference (hThread, HGCMOBJ_THREAD);
    811812
    812813    if (!pThread)
  • trunk/src/VBox/Main/include/hgcm/HGCM.h

    r906 r1080  
    4343int hgcmHostCallInternal (const char *pszServiceName, uint32_t function, uint32_t cParms, VBOXHGCMSVCPARM aParms[]);
    4444
    45 int hgcmSaveStateInternal (PPDMIHGCMPORT pHGCMPort, uint32_t clientID, PSSMHANDLE pSSM);
    46 int hgcmLoadStateInternal (PPDMIHGCMPORT pHGCMPort, uint32_t clientID, PSSMHANDLE pSSM);
     45int hgcmSaveStateInternal (uint32_t clientID, PSSMHANDLE pSSM);
     46int hgcmLoadStateInternal (uint32_t clientID, PSSMHANDLE pSSM);
    4747
    4848__END_DECLS
  • trunk/src/VBox/Main/include/hgcm/HGCMObjects.h

    r1 r1080  
    3636} ObjectAVLCore;
    3737
     38typedef enum
     39{
     40    HGCMOBJ_CLIENT,
     41    HGCMOBJ_THREAD,
     42    HGCMOBJ_MSG,
     43    HGCMOBJ_SizeHack   = 0x7fffffff
     44} HGCMOBJ_TYPE;
     45
    3846class HGCMObject
    3947{
     
    4250
    4351        int32_t volatile cRef;
     52        HGCMOBJ_TYPE     enmObjType;
    4453
    4554        ObjectAVLCore Core;
     
    5160
    5261    public:
    53         HGCMObject () : cRef (0) {};
     62        HGCMObject (HGCMOBJ_TYPE enmObjType) : cRef (0)
     63        {
     64            this->enmObjType  = enmObjType;
     65        };
    5466
    5567        void Reference (void)
     
    7991            return Core.AvlCore.Key;
    8092        };
     93
     94        HGCMOBJ_TYPE Type (void)
     95        {
     96            return enmObjType;
     97        };
    8198};
    8299
     
    89106void hgcmObjDeleteHandle (uint32_t handle);
    90107
    91 HGCMObject *hgcmObjReference (uint32_t handle);
     108HGCMObject *hgcmObjReference (uint32_t handle, HGCMOBJ_TYPE enmObjType);
    92109
    93110void hgcmObjDereference (HGCMObject *pObject);
    94111
     112uint32_t hgcmObjQueryHandleCount ();
     113void     hgcmObjSetHandleCount (uint32_t u32HandleCount);
     114
    95115#endif /* __HGCMOBJECTS__H */
  • trunk/src/VBox/Main/include/hgcm/HGCMThread.h

    r1 r1080  
    9595
    9696    public:
    97         HGCMMsgCore () {};
     97        HGCMMsgCore () : HGCMObject(HGCMOBJ_MSG) {};
    9898
    9999        uint32_t MsgId (void) { return m_u32Msg; };
Note: See TracChangeset for help on using the changeset viewer.

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