VirtualBox

忽略:
時間撮記:
2008-2-18 上午11:05:05 (17 年 以前)
作者:
vboxsync
訊息:

HGCM: reapplied r28137, which got lost when I commited the code Vitali sent me

檔案:
修改 1 筆資料

圖例:

未更動
新增
刪除
  • trunk/src/VBox/Main/hgcm/HGCM.cpp

    r6981 r6985  
    9797        char *m_pszSvcName;
    9898        char *m_pszSvcLibrary;
    99        
     99
    100100        RTLDRMOD m_hLdrMod;
    101101        PFNVBOXHGCMSVCLOAD m_pfnLoad;
     
    107107
    108108        uint32_t *m_paClientIds;
    109        
     109
    110110        HGCMSVCEXTHANDLE m_hExtension;
    111111
     
    240240     * If only library name is specified, then try to load it from:
    241241     *   - RTPathAppPrivateArch
    242      *   - RTPathSharedLibs
    243      *   - default system LIBPATH.
     242     *   - RTPathSharedLibs (legacy)
    244243     */
    245244    int rc = VINF_SUCCESS;
    246    
     245
    247246    if (RTPathHavePath (pszName))
    248247    {
     
    252251    else
    253252    {
    254         if (strlen (pszName) >= RTPATH_MAX)
    255         {
    256             return VERR_FILENAME_TOO_LONG;
    257         }
    258    
    259253        /* Try default locations. */
    260254        char szBase[RTPATH_MAX];
    261        
     255
    262256        /* Get the appropriate base path. */
    263257        int i;
    264         for (i = 0; i < 3; i++)
     258        for (i = 0; i < 2; i++)
    265259        {
    266260            if (i == 0)
     
    268262                rc = RTPathAppPrivateArch(szBase, sizeof (szBase));
    269263            }
    270             else if (i == 1)
     264            else
    271265            {
    272266                rc = RTPathSharedLibs(szBase, sizeof (szBase));
    273267            }
    274             else
    275             {
    276                 szBase[0] = 0;
    277                 rc = VINF_SUCCESS;
    278             }
    279            
     268
    280269            if (RT_SUCCESS(rc))
    281270            {
    282271                char szPath[RTPATH_MAX];
    283        
     272
    284273                /* szPath = pszBase + pszName */
    285                 if (szBase[0] != 0)
    286                 {
    287                     rc = RTPathAbsEx (szBase, pszName, szPath, sizeof (szPath));
    288                 }
    289                 else
    290                 {
    291                     strcpy (szPath, pszName);
    292                 }
    293            
     274                rc = RTPathAbsEx (szBase, pszName, szPath, sizeof (szPath));
     275
    294276                if (RT_SUCCESS(rc))
    295277                {
    296278                    rc = RTLdrLoad (szPath, phLdrMod);
    297            
     279
    298280                    if (RT_SUCCESS(rc))
    299281                    {
     
    305287        }
    306288    }
    307    
     289
    308290    return rc;
    309291}
     
    449431    public:
    450432        HGCMMsgHeader () : pCmd (NULL), pHGCMPort (NULL) {};
    451        
     433
    452434        /* Command pointer/identifier. */
    453435        PVBOXHGCMCMD pCmd;
     
    520502        case SVC_MSG_HOSTCALL:    return new HGCMMsgHostCallSvc ();
    521503        case SVC_MSG_GUESTCALL:   return new HGCMMsgCall ();
    522         case SVC_MSG_LOADSTATE:     
     504        case SVC_MSG_LOADSTATE:
    523505        case SVC_MSG_SAVESTATE:   return new HGCMMsgLoadSaveStateClient ();
    524506        case SVC_MSG_REGEXT:      return new HGCMMsgSvcRegisterExtension ();
     
    695677                }
    696678            } break;
    697            
     679
    698680            case SVC_MSG_REGEXT:
    699681            {
     
    701683
    702684                LogFlowFunc(("SVC_MSG_REGEXT handle = %p, pfn = %p\n", pMsg->handle, pMsg->pfnExtension));
    703                
     685
    704686                if (pSvc->m_hExtension)
    705687                {
     
    716698                        rc = VERR_NOT_SUPPORTED;
    717699                    }
    718                    
     700
    719701                    if (VBOX_SUCCESS (rc))
    720702                    {
     
    729711
    730712                LogFlowFunc(("SVC_MSG_UNREGEXT handle = %p\n", pMsg->handle));
    731                
     713
    732714                if (pSvc->m_hExtension != pMsg->handle)
    733715                {
     
    744726                        rc = VERR_NOT_SUPPORTED;
    745727                    }
    746                    
     728
    747729                    pSvc->m_hExtension = NULL;
    748730                }
     
    772754   if (pMsgCore->MsgId () == SVC_MSG_GUESTCALL)
    773755   {
    774        /* Only call the completion for these messages. The helper 
     756       /* Only call the completion for these messages. The helper
    775757        * is called by the service, and the service does not get
    776758        * any other messages.
     
    832814            RTStrFree (m_pszSvcLibrary);
    833815            m_pszSvcLibrary = NULL;
    834            
     816
    835817            RTStrFree (m_pszSvcName);
    836818            m_pszSvcName = NULL;
    837            
     819
    838820            rc = VERR_NO_MEMORY;
    839821        }
     
    844826            m_svcHelpers.pvInstance          = this;
    845827            m_svcHelpers.pfnDisconnectClient = svcHlpDisconnectClient;
    846            
     828
    847829            /* Execute the load request on the service thread. */
    848830            HGCMMSGHANDLE hMsg;
     
    954936    HGCMService *pSvc;
    955937    int rc = HGCMService::ResolveService (&pSvc, pszServiceName);
    956    
     938
    957939    if (VBOX_SUCCESS (rc))
    958940    {
     
    980962                pSvc->m_pSvcNext = sm_pSvcListHead;
    981963                pSvc->m_pSvcPrev = NULL;
    982                
     964
    983965                if (sm_pSvcListHead)
    984966                {
     
    11091091    ASMAtomicIncU32 (&m_u32RefCnt);
    11101092    LogFlowFunc(("m_u32RefCnt = %d\n", m_u32RefCnt));
    1111 }       
     1093}
    11121094
    11131095/** The method dereferences a service and deletes it when no more refs.
     
    11681150
    11691151    LogFlowFunc(("%d services to be saved:\n", sm_cServices));
    1170    
     1152
    11711153    /* Save number of services. */
    11721154    rc = SSMR3PutU32(pSSM, sm_cServices);
     
    12401222    rc = SSMR3GetU32(pSSM, &cServices);
    12411223    AssertRCReturn(rc, rc);
    1242    
     1224
    12431225    LogFlowFunc(("%d services to be restored:\n", cServices));
    12441226
     
    12491231        AssertRCReturn(rc, rc);
    12501232        AssertReturn(u32 <= VBOX_HGCM_SVC_NAME_MAX_BYTES, VERR_SSM_UNEXPECTED_DATA);
    1251        
     1233
    12521234        char *pszServiceName = (char *)alloca (u32);
    12531235
     
    12551237        rc = SSMR3GetStrZ(pSSM, pszServiceName, u32);
    12561238        AssertRCReturn(rc, rc);
    1257        
     1239
    12581240        LogFlowFunc(("Restoring service [%s]\n", pszServiceName));
    1259    
     1241
    12601242        /* Resolve the service instance. */
    1261         HGCMService *pSvc; 
     1243        HGCMService *pSvc;
    12621244        rc = ResolveService (&pSvc, pszServiceName);
    12631245        AssertReturn(pSvc, VERR_SSM_UNEXPECTED_DATA);
    1264            
     1246
    12651247        /* Get the number of clients. */
    12661248        uint32_t cClients;
     
    13311313
    13321314    uint32_t handle;
    1333    
     1315
    13341316    if (pu32ClientIdOut != NULL)
    13351317    {
     
    13651347
    13661348            rc = hgcmMsgSend (hMsg);
    1367        
     1349
    13681350            if (VBOX_SUCCESS (rc))
    13691351            {
     
    13751357                    m_cClientsAllocated += 64;
    13761358                }
    1377            
     1359
    13781360                m_paClientIds[m_cClients] = handle;
    13791361                m_cClients++;
     
    13951377        ReferenceService ();
    13961378    }
    1397    
     1379
    13981380    LogFlowFunc(("rc = %Vrc\n", rc));
    13991381    return rc;
     
    14411423            {
    14421424                m_cClients--;
    1443                
     1425
    14441426                if (m_cClients > i)
    14451427                {
    14461428                    memmove (&m_paClientIds[i], &m_paClientIds[i + 1], m_cClients - i);
    14471429                }
    1448                
     1430
    14491431                break;
    14501432            }
     
    15901572
    15911573
    1592 /* 
     1574/*
    15931575 * Main HGCM thread that manages services.
    15941576 */
    1595  
     1577
    15961578/* Messages processed by the main HGCM thread. */
    15971579#define HGCM_MSG_CONNECT    (10)  /* Connect a client to a service. */
     
    16871669        case HGCM_MSG_LOAD:       return new HGCMMsgMainLoad ();
    16881670        case HGCM_MSG_HOSTCALL:   return new HGCMMsgMainHostCall ();
    1689         case HGCM_MSG_LOADSTATE:     
     1671        case HGCM_MSG_LOADSTATE:
    16901672        case HGCM_MSG_SAVESTATE:  return new HGCMMsgMainLoadSaveState ();
    16911673        case HGCM_MSG_RESET:      return new HGCMMsgMainReset ();
     
    18391821            {
    18401822                HGCMMsgMainRegisterExtension *pMsg = (HGCMMsgMainRegisterExtension *)pMsgCore;
    1841                
     1823
    18421824                LogFlowFunc(("HGCM_MSG_REGEXT\n"));
    1843                
     1825
    18441826                /* Allocate the handle data. */
    18451827                HGCMSVCEXTHANDLE handle = (HGCMSVCEXTHANDLE)RTMemAllocZ (sizeof (struct _HGCMSVCEXTHANDLEDATA)
    18461828                                                                         + strlen (pMsg->pszServiceName)
    18471829                                                                         + sizeof (char));
    1848                
     1830
    18491831                if (handle == NULL)
    18501832                {
     
    18551837                    handle->pszServiceName = (char *)((uint8_t *)handle + sizeof (struct _HGCMSVCEXTHANDLEDATA));
    18561838                    strcpy (handle->pszServiceName, pMsg->pszServiceName);
    1857                    
     1839
    18581840                    HGCMService *pService;
    18591841                    rc = HGCMService::ResolveService (&pService, handle->pszServiceName);
     
    18651847                        pService->ReleaseService ();
    18661848                    }
    1867                    
     1849
    18681850                    if (VBOX_FAILURE (rc))
    18691851                    {
     
    18921874                    pService->ReleaseService ();
    18931875                }
    1894                
     1876
    18951877                RTMemFree (pMsg->handle);
    18961878            } break;
     
    22572239        HGCMMsgMainHostCall *pMsg = (HGCMMsgMainHostCall *)hgcmObjReference (hMsg, HGCMOBJ_MSG);
    22582240        AssertRelease(pMsg);
    2259        
     2241
    22602242        pMsg->pszServiceName = (char *)pszServiceName;
    22612243        pMsg->u32Function    = u32Function;
     
    22752257{
    22762258    LogFlowFunc(("\n"));
    2277    
     2259
    22782260    /* Disconnect all clients.
    22792261     */
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

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