VirtualBox

Changeset 70420 in vbox for trunk/src


Ignore:
Timestamp:
Jan 2, 2018 11:19:34 AM (7 years ago)
Author:
vboxsync
Message:

iprt/RTPathQueryInfo-nt.cpp: Fixed querying unix attribs for a NT namespace object. Older NTs doesn't know FILE_OPEN_REPARSE_POINT, so drop it when they fail consistently.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/r3/nt/RTPathQueryInfo-nt.cpp

    r70195 r70420  
    413413            if (RT_SUCCESS(rc))
    414414                return rc;
    415             rc = RTErrConvertFromNtStatus(rcNt);
    416415        }
    417416        else if (   rcNt != STATUS_ACCESS_DENIED
     
    430429    if (rc == VINF_TRY_AGAIN)
    431430    {
     431        static int volatile g_fReparsePoints = -1;
     432        uint32_t            fOptions         = FILE_OPEN_FOR_BACKUP_INTENT | FILE_SYNCHRONOUS_IO_NONALERT;
     433        int fReparsePoints = g_fReparsePoints;
     434        if (fReparsePoints != 0 && !(fFlags & RTPATH_F_FOLLOW_LINK))
     435            fOptions |= FILE_OPEN_REPARSE_POINT;
     436
    432437        InitializeObjectAttributes(&ObjAttr, pNtName, OBJ_CASE_INSENSITIVE, hRootDir, NULL);
    433438        rcNt = NtCreateFile(&hFile,
     
    439444                            FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
    440445                            FILE_OPEN,
    441                             FILE_OPEN_FOR_BACKUP_INTENT | FILE_SYNCHRONOUS_IO_NONALERT
    442                             | (fFlags & RTPATH_F_FOLLOW_LINK ? 0 : FILE_OPEN_REPARSE_POINT),
     446                            fOptions,
    443447                            NULL /*pvEaBuffer*/,
    444448                            0 /*cbEa*/);
     449        if (   (   rcNt == STATUS_INVALID_PARAMETER
     450                || rcNt == STATUS_INVALID_PARAMETER_9)
     451            && fReparsePoints == -1
     452            && (fOptions & FILE_OPEN_REPARSE_POINT))
     453        {
     454            fOptions &= ~FILE_OPEN_REPARSE_POINT;
     455            rcNt = NtCreateFile(&hFile,
     456                                FILE_READ_ATTRIBUTES | SYNCHRONIZE,
     457                                &ObjAttr,
     458                                &Ios,
     459                                NULL /*pcbFile*/,
     460                                FILE_ATTRIBUTE_NORMAL,
     461                                FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
     462                                FILE_OPEN,
     463                                fOptions,
     464                                NULL /*pvEaBuffer*/,
     465                                0 /*cbEa*/);
     466            if (rcNt != STATUS_INVALID_PARAMETER)
     467                g_fReparsePoints = fReparsePoints = 0;
     468        }
    445469        if (NT_SUCCESS(rcNt))
    446470        {
     
    489513                rc = VERR_TRY_AGAIN;
    490514        }
     515        else if (   rcNt == STATUS_OBJECT_TYPE_MISMATCH
     516                 || rcNt == STATUS_OBJECT_NAME_INVALID
     517                 /*|| rcNt == STATUS_INVALID_PARAMETER*/)
     518        {
     519            rc = rtPathNtQueryInfoInDirectoryObject(&ObjAttr, pObjInfo, enmAddAttr, fFlags, &uBuf, sizeof(uBuf));
     520            if (RT_SUCCESS(rc))
     521                return rc;
     522        }
    491523        else if (   rcNt != STATUS_ACCESS_DENIED
    492524                 && rcNt != STATUS_SHARING_VIOLATION)
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