VirtualBox

Ignore:
Timestamp:
May 16, 2019 10:26:53 AM (6 years ago)
Author:
vboxsync
Message:

winnt/vboxsf: Final VBoxMRxQueryVolumeInfo cleanups. bugref:9172

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/SharedFolders/driver/info.cpp

    r78536 r78541  
    2121*********************************************************************************************************************************/
    2222#include "vbsf.h"
     23#include <iprt/asm.h>
    2324#include <iprt/err.h>
    24 #include <iprt/asm.h>
     25#include <iprt/mem.h>
    2526
    2627extern "C" NTSTATUS NTAPI RxSetEndOfFileInfo(PRX_CONTEXT, PIRP, PFCB, PFOBX);
     
    522523    return Status;
    523524}
     525
     526
     527/*********************************************************************************************************************************
     528*   NtQueryVolumeInformationFile                                                                                                 *
     529*********************************************************************************************************************************/
    524530
    525531/**
     
    583589}
    584590
    585 
    586591/**
    587592 * Handles NtQueryVolumeInformationFile / FileFsVolumeInformation
     
    699704     */
    700705    pRxContext->Info.LengthRemaining = cbInfo - cbCopied;
    701     pRxContext->InformationToReturn  = cbCopied; /* whatever */
     706    pRxContext->InformationToReturn  = cbCopied;
    702707
    703708    return Status;
     
    765770     */
    766771    pRxContext->Info.LengthRemaining = cbInfo - sizeof(*pInfo);
    767     pRxContext->InformationToReturn  = sizeof(*pInfo); /* whatever */
     772    pRxContext->InformationToReturn  = sizeof(*pInfo);
    768773    return STATUS_SUCCESS;
    769774}
     
    833838     */
    834839    pRxContext->Info.LengthRemaining = cbInfo - sizeof(*pInfo);
    835     pRxContext->InformationToReturn  = sizeof(*pInfo); /* whatever */
     840    pRxContext->InformationToReturn  = sizeof(*pInfo);
    836841    return STATUS_SUCCESS;
    837842}
     
    863868     */
    864869    pRxContext->Info.LengthRemaining = cbInfo - sizeof(*pInfo);
    865     pRxContext->InformationToReturn  = sizeof(*pInfo); /* whatever */
     870    pRxContext->InformationToReturn  = sizeof(*pInfo);
    866871    return STATUS_SUCCESS;
    867872}
     
    935940     */
    936941    pRxContext->Info.LengthRemaining = cbInfo - cbStrCopied - RT_UOFFSETOF(FILE_FS_ATTRIBUTE_INFORMATION, FileSystemName);
    937     pRxContext->InformationToReturn  = cbStrCopied + RT_UOFFSETOF(FILE_FS_ATTRIBUTE_INFORMATION, FileSystemName); /* whatever */
     942    pRxContext->InformationToReturn  = cbStrCopied + RT_UOFFSETOF(FILE_FS_ATTRIBUTE_INFORMATION, FileSystemName);
    938943    return cbInfo >= cbNeeded ? STATUS_SUCCESS : STATUS_BUFFER_OVERFLOW;
    939944}
     
    984989     */
    985990    pRxContext->Info.LengthRemaining = cbInfo - sizeof(*pInfo);
    986     pRxContext->InformationToReturn  = sizeof(*pInfo); /* whatever */
     991    pRxContext->InformationToReturn  = sizeof(*pInfo);
    987992    return STATUS_SUCCESS;
    988993}
    989994
    990995
    991 #include <iprt/mem.h>
    992996/**
    993997 * Handles NtQueryVolumeInformationFile and similar.
    994998 *
    995999 * The RDBSS library does not do a whole lot for these queries.  No FCB locking.
    996  *
    997  *
    9981000 * The IO_STATUS_BLOCK updating differs too,  setting of Ios.Information is
    999  * limited to cbInitialBuf
    1000  * - RxContext->Info.LengthRemaining.
     1001 * limited to cbInitialBuf - RxContext->Info.LengthRemaining.
    10011002 */
    10021003NTSTATUS VBoxMRxQueryVolumeInfo(IN OUT PRX_CONTEXT RxContext)
     
    10121013    };
    10131014#endif
    1014 
    1015     NTSTATUS Status;
    1016 
    10171015    RxCaptureFcb;
    10181016    RxCaptureFobx;
    1019 
    10201017    PMRX_VBOX_NETROOT_EXTENSION pNetRootExtension = VBoxMRxGetNetRootExtension(capFcb->pNetRoot);
    1021     PMRX_VBOX_FOBX pVBoxFobx = VBoxMRxGetFileObjectExtension(capFobx);
    1022 
    1023     Log(("VBOXSF: MrxQueryVolumeInfo: pInfoBuffer = %p, cbInfoBuffer = %d\n",
     1018    PMRX_VBOX_FOBX              pVBoxFobx         = VBoxMRxGetFileObjectExtension(capFobx);
     1019    NTSTATUS                    Status;
     1020
     1021    Log(("VBOXSF: VBoxMRxQueryVolumeInfo: pInfoBuffer = %p, cbInfoBuffer = %d\n",
    10241022         RxContext->Info.Buffer, RxContext->Info.LengthRemaining));
    1025     Log(("VBOXSF: MrxQueryVolumeInfo: vboxFobx = %p, Handle = 0x%RX64\n",
     1023    Log(("VBOXSF: VBoxMRxQueryVolumeInfo: vboxFobx = %p, Handle = 0x%RX64\n",
    10261024         pVBoxFobx, pVBoxFobx ? pVBoxFobx->hFile : 0));
    10271025
    1028 /** @todo Consolidate the tail code that updates LengthRemaining. */
    10291026    switch (RxContext->Info.FsInformationClass)
    10301027    {
     
    10351032                                             RxContext->Info.Length, capFcb->pNetRoot, pNetRootExtension, pVBoxFobx,
    10361033                                             VBoxMRxGetFcbExtension(capFcb));
    1037             return Status;
     1034            break;
    10381035
    10391036        case FileFsSizeInformation:
     
    10431040                                           RxContext->Info.Length, pNetRootExtension, pVBoxFobx,
    10441041                                           VBoxMRxGetFcbExtension(capFcb));
    1045             return Status;
     1042            break;
    10461043
    10471044        case FileFsFullSizeInformation:
     
    10511048                                               RxContext->Info.Length, pNetRootExtension, pVBoxFobx,
    10521049                                               VBoxMRxGetFcbExtension(capFcb));
    1053             return Status;
     1050            break;
    10541051
    10551052        case FileFsDeviceInformation:
     
    10581055            Status = vbsfNtQueryFsDeviceInfo(RxContext, (PFILE_FS_DEVICE_INFORMATION)RxContext->Info.Buffer,
    10591056                                             RxContext->Info.Length, capFcb->pNetRoot);
    1060             return Status;
     1057            break;
    10611058
    10621059        case FileFsAttributeInformation:
     
    10661063                                                RxContext->Info.Length, pNetRootExtension, pVBoxFobx,
    10671064                                                VBoxMRxGetFcbExtension(capFcb));
    1068             return Status;
     1065            break;
    10691066
    10701067        case FileFsSectorSizeInformation:
     
    10741071                                                 RxContext->Info.Length, pNetRootExtension, pVBoxFobx,
    10751072                                                 VBoxMRxGetFcbExtension(capFcb));
    1076             return Status;
     1073            break;
    10771074
    10781075        case FileFsLabelInformation:
     
    10801077            RT_FALL_THRU();
    10811078        default:
    1082         {
    1083             Log(("VBOXSF: MrxQueryVolumeInfo: Not supported FS_INFORMATION_CLASS value: %d (%s)!\n",
     1079            Log(("VBOXSF: VBoxMRxQueryVolumeInfo: Not supported FS_INFORMATION_CLASS value: %d (%s)!\n",
    10841080                 RxContext->Info.FsInformationClass,
    10851081                 (ULONG)RxContext->Info.FsInformationClass < RT_ELEMENTS(s_apszNames)
    10861082                 ? s_apszNames[RxContext->Info.FsInformationClass] : "??"));
    1087             /* Here is a weird issue I couldn't quite figure out.  When working directories, I
    1088                seem to get semi-random stuff back in the IO_STATUS_BLOCK.  Difference between
    1089                directories and files seemed to be the IRP_SYNCHRONOUS_API flag.  Poking around
    1090                a little bit more, the UserIosb seems to be a ring-0 stack address rather than
    1091                the usermode one and IopSynchronousApiServiceTail being used for copying it back
    1092                to user mode because the handle wasn't synchronous or something.
    1093 
    1094                So, the following is kludge to make the IOS values 0,0 like FAT does it.  The
    1095                real fix for this escapes me, but this should do the trick... */
    1096             PIRP pIrp = RxContext->CurrentIrp;
    1097             if (   pIrp
    1098                 && (pIrp->Flags & IRP_SYNCHRONOUS_API)
    1099                 && RTR0MemKernelIsValidAddr(pIrp->UserIosb))
    1100             {
    1101                 Log9(("VBOXSF: MrxQueryVolumeInfo: IRP_SYNCHRONOUS_API hack: Setting UserIosb (%p) values to zero!\n", \
    1102                       pIrp->UserIosb));
    1103                 __try
    1104                 {
    1105                     pIrp->UserIosb->Status      = 0;
    1106                     pIrp->UserIosb->Information = 0;
    1107                 }
    1108                 __except(EXCEPTION_EXECUTE_HANDLER)
    1109                 {
     1083            Status = STATUS_INVALID_PARAMETER;
     1084            RxContext->InformationToReturn = 0;
     1085            break;
     1086    }
     1087
     1088    /* Here is a weird issue I couldn't quite figure out.  When working directories, I
     1089       seem to get semi-random stuff back in the IO_STATUS_BLOCK when returning failures
     1090       for unsupported classes.  The difference between directories and files seemed to
     1091       be the IRP_SYNCHRONOUS_API flag.  Poking around a little bit more, the UserIosb
     1092       seems to be a ring-0 stack address rather than the usermode one and
     1093       IopSynchronousApiServiceTail being used for copying it back to user mode because
     1094       the handle wasn't synchronous or something.
     1095
     1096       So, the following is kludge to make the IOS values 0,0 like FAT does it.  The
     1097       real fix for this escapes me, but this should do the trick for now... */
     1098    PIRP pIrp = RxContext->CurrentIrp;
     1099    if (   pIrp
     1100        && (pIrp->Flags & IRP_SYNCHRONOUS_API)
     1101        && RTR0MemKernelIsValidAddr(pIrp->UserIosb))
     1102    {
     1103        Log2(("VBOXSF: VBoxMRxQueryVolumeInfo: IRP_SYNCHRONOUS_API hack: Setting UserIosb (%p) values!\n", pIrp->UserIosb));
     1104        __try
     1105        {
     1106            pIrp->UserIosb->Status      = 0;
     1107            pIrp->UserIosb->Information = RxContext->InformationToReturn;
     1108        }
     1109        __except(EXCEPTION_EXECUTE_HANDLER)
     1110        {
    11101111#ifdef LOG_ENABLED
    1111                     NTSTATUS rcNt = GetExceptionCode();
    1112                     Log(("VBOXSF: MrxQueryVolumeInfo: Oops %#x accessing %p\n", rcNt, pIrp->UserIosb));
     1112            NTSTATUS rcNt = GetExceptionCode();
     1113            Log(("VBOXSF: VBoxMRxQueryVolumeInfo: Oops %#x accessing %p\n", rcNt, pIrp->UserIosb));
    11131114#endif
    1114                 }
    1115             }
    1116             return STATUS_INVALID_PARAMETER;
    1117         }
    1118     }
     1115        }
     1116    }
     1117    Log(("VBOXSF: VBoxMRxQueryVolumeInfo: Returned %#010x\n", Status));
     1118    return Status;
    11191119}
    11201120
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