VirtualBox

Ignore:
Timestamp:
Jan 22, 2025 11:03:23 PM (3 weeks ago)
Author:
vboxsync
Message:

Windows driver installation: VBoxWinDrvStoreQuery doesn't take a DOS-style wildcard pattern, but a RTStrSimplePatternMatch-styled one. Don't lowercase the input pattern more than once in vboxWinDrvStoreListQueryEx, and just call a string a string till you get more complicated matching input. Also, coding style dictates use of 'static' where ever possible. bugref:10762

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/GuestHost/installation/VBoxWinDrvStore.cpp

    r106890 r107903  
    119119 * Duplicates a Windows driver store entry.
    120120 *
    121  * @returns Duplicated Windows driver store entry.
     121 * @returns Duplicated Windows driver store entry.  Caller must correct
     122 *          VBOXWINDRVSTOREENTRY::Node (list entry) immediately.
    122123 * @param   pEntry              Windows driver store list to duplicate.
    123124 */
    124 PVBOXWINDRVSTOREENTRY vboxWinDrvStoreEntryDup(PVBOXWINDRVSTOREENTRY pEntry)
     125static PVBOXWINDRVSTOREENTRY vboxWinDrvStoreEntryDup(PVBOXWINDRVSTOREENTRY pEntry)
    125126{
    126127    return (PVBOXWINDRVSTOREENTRY)RTMemDup(pEntry, sizeof(VBOXWINDRVSTOREENTRY));
     
    132133 * @param   pList               Windows driver store list to initialize.
    133134 */
    134 void vboxWinDrvStoreListInit(PVBOXWINDRVSTORELIST pList)
     135static void vboxWinDrvStoreListInit(PVBOXWINDRVSTORELIST pList)
    135136{
    136137    RT_BZERO(pList, sizeof(VBOXWINDRVSTORELIST));
     
    145146 * @param   ppList              Where to return the created Windows driver store list on success.
    146147 */
    147 int vboxWinDrvStoreListCreate(PVBOXWINDRVSTORELIST *ppList)
     148static int vboxWinDrvStoreListCreate(PVBOXWINDRVSTORELIST *ppList)
    148149{
    149150    PVBOXWINDRVSTORELIST pList = (PVBOXWINDRVSTORELIST)RTMemAlloc(sizeof(VBOXWINDRVSTORELIST));
     
    163164 *                              The pointer will be invalid after return.
    164165 */
    165 void vboxWinDrvStoreListDestroy(PVBOXWINDRVSTORELIST pList)
     166static void vboxWinDrvStoreListDestroy(PVBOXWINDRVSTORELIST pList)
    166167{
    167168    if (!pList)
     
    227228 * @param   pList               Driver store list to query.
    228229 * @param   enmType             Query type.
    229  * @param   pvType              Query data. Must match \a enmType.
     230 * @param   pszTypeConst        Query data. Must match \a enmType.
    230231 * @param   ppListResults       Where to return found results on success.
    231232 *                              Must be destroyed with VBoxWinDrvStoreListFree().
    232233 */
    233 static int vboxWinDrvStoreListQueryEx(PVBOXWINDRVSTORELIST pList, VBOXWINDRVSTORELISTQUERYTYPE enmType, const void *pvType,
     234static int vboxWinDrvStoreListQueryEx(PVBOXWINDRVSTORELIST pList, VBOXWINDRVSTORELISTQUERYTYPE enmType, const char *pszTypeConst,
    234235                                      PVBOXWINDRVSTORELIST *ppListResults)
    235236{
     
    240241    /* Currently all query types require strings, so do this for all query times for now. */
    241242    char *pszType = NULL;
    242     if (pvType)
    243     {
    244         AssertReturn(RTStrIsValidEncoding((const char *)pvType), VERR_INVALID_PARAMETER);
    245         pszType = RTStrDup((const char *)pvType);
     243    if (pszTypeConst)
     244    {
     245        AssertReturn(RTStrIsValidEncoding(pszTypeConst), VERR_INVALID_PARAMETER);
     246        pszType = RTStrDup(pszTypeConst);
    246247        AssertPtrReturnStmt(pszType, VBoxWinDrvStoreListFree(pListResults), VERR_NO_MEMORY);
    247     }
    248 
    249     PRTUTF16 papszHaystacks[4] = { NULL }; /* Array of haystacks to search in. */
    250     size_t   cHaystacks        = 0;        /* Number of haystacks to search in, zero-based. */
     248
     249        /* Convert strings to lowercase, as RTStrSimplePatternMatch() is case sensitive. */
     250        RTStrToLower(pszType);
     251    }
    251252
    252253    PVBOXWINDRVSTOREENTRY pCur;
     
    255256        bool fFound = false;
    256257        if (pszType == NULL) /* No query type specified? Then directly add the entry to the list. */
    257         {
    258258            fFound = true;
    259         }
    260259        else
    261260        {
     261            PRTUTF16 apszHaystacks[3] = {};  /* Array of haystacks to search in. */
     262            size_t   cHaystacks = 0;         /* Number of haystacks to search in, zero-based. */
    262263            switch (enmType)
    263264            {
    264265                case VBOXWINDRVSTORELISTQUERYTYPE_PNP_ID:
    265266                {
    266                     papszHaystacks[cHaystacks++] = pCur->wszPnpId;
     267                    apszHaystacks[cHaystacks++] = pCur->wszPnpId;
    267268                    break;
    268269                }
    269270                case VBOXWINDRVSTORELISTQUERYTYPE_MODEL_NAME:
    270271                {
    271                     papszHaystacks[cHaystacks++] = pCur->wszModel;
     272                    apszHaystacks[cHaystacks++] = pCur->wszModel;
    272273                    break;
    273274                }
    274275                case VBOXWINDRVSTORELISTQUERYTYPE_DRIVER_NAME:
    275276                {
    276                     papszHaystacks[cHaystacks++] = pCur->wszDriverName;
     277                    apszHaystacks[cHaystacks++] = pCur->wszDriverName;
    277278                    break;
    278279                }
    279280                case VBOXWINDRVSTORELISTQUERYTYPE_ANY:
    280281                {
    281                     papszHaystacks[cHaystacks++] = pCur->wszPnpId;
    282                     papszHaystacks[cHaystacks++] = pCur->wszModel;
    283                     papszHaystacks[cHaystacks++] = pCur->wszDriverName;
     282                    apszHaystacks[cHaystacks++] = pCur->wszPnpId;
     283                    apszHaystacks[cHaystacks++] = pCur->wszModel;
     284                    apszHaystacks[cHaystacks++] = pCur->wszDriverName;
    284285                    break;
    285286                }
     
    289290                    break;
    290291            }
    291 
    292292            if (RT_FAILURE(rc))
    293293                break;
    294294
     295            Assert(cHaystacks <= RT_ELEMENTS(apszHaystacks));
    295296            for (size_t i = 0; i < cHaystacks; i++)
    296297            {
    297298                /* Slow, but does the job for now. */
    298299                char *pszHaystack;
    299                 rc = RTUtf16ToUtf8(papszHaystacks[i], &pszHaystack);
     300                rc = RTUtf16ToUtf8(apszHaystacks[i], &pszHaystack);
    300301                if (RT_SUCCESS(rc))
    301302                {
    302                     /* Convert strings to lowercase first, as RTStrSimplePatternMatch() is case sensitive. */
    303                     RTStrToLower(pszType);
    304303                    RTStrToLower(pszHaystack);
    305304
     
    322321                AssertFailedBreakStmt(rc = VERR_NO_MEMORY);
    323322        }
    324 
    325         cHaystacks = 0;
    326323    }
    327324
     
    528525 * @returns VBox status code.
    529526 * @param   pDrvStore           Driver store to query.
    530  * @param   pszPattern          Pattern to query for. DOS-style wildcards supported.
     527 * @param   pszPattern          Pattern (RTStrSimplePatternMatch) to query for.
    531528 * @param   ppResults           Where to return the results list on success.
    532529 *                              Must be free'd with VBoxWinDrvStoreListFree().
     
    555552 * @returns VBox status code.
    556553 * @param   pDrvStore           Driver store to query.
    557  * @param   pszPnpId            PnP ID to query. DOS-style wildcards supported.
     554 * @param   pszPnpId            PnP ID pattern (RTStrSimplePatternMatch) to
     555 *                              query.
    558556 * @param   ppResults           Where to return the results list on success.
    559557 *                              Must be free'd with VBoxWinDrvStoreListFree().
     
    561559int VBoxWinDrvStoreQueryByPnpId(PVBOXWINDRVSTORE pDrvStore, const char *pszPnpId, PVBOXWINDRVSTORELIST *ppResults)
    562560{
    563     return vboxWinDrvStoreListQueryEx(&pDrvStore->lstDrivers, VBOXWINDRVSTORELISTQUERYTYPE_PNP_ID, (const char *)pszPnpId,
    564                                       ppResults);
     561    return vboxWinDrvStoreListQueryEx(&pDrvStore->lstDrivers, VBOXWINDRVSTORELISTQUERYTYPE_PNP_ID, pszPnpId, ppResults);
    565562}
    566563
     
    570567 * @returns VBox status code.
    571568 * @param   pDrvStore           Driver store to query.
    572  * @param   pszPnpId            Model name to query. DOS-style wildcards supported.
     569 * @param   pszPnpId            Model name pattern (RTStrSimplePatternMatch) to
     570 *                              query.
    573571 * @param   ppResults           Where to return the results list on success.
    574572 *                              Must be free'd with VBoxWinDrvStoreListFree().
     
    576574int VBoxWinDrvStoreQueryByModelName(PVBOXWINDRVSTORE pDrvStore, const char *pszModelName, PVBOXWINDRVSTORELIST *ppResults)
    577575{
    578     return vboxWinDrvStoreListQueryEx(&pDrvStore->lstDrivers, VBOXWINDRVSTORELISTQUERYTYPE_MODEL_NAME, (const char *)pszModelName,
    579                                       ppResults);
     576    return vboxWinDrvStoreListQueryEx(&pDrvStore->lstDrivers, VBOXWINDRVSTORELISTQUERYTYPE_MODEL_NAME, pszModelName, ppResults);
    580577}
    581578
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