VirtualBox

Changeset 40278 in vbox for trunk/src/VBox/Additions/WINNT


Ignore:
Timestamp:
Feb 28, 2012 2:29:06 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
76505
Message:

VBOXSF: QueryVolumeInfo fixes.

File:
1 edited

Legend:

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

    r40269 r40278  
    539539    ULONG cbInfoBuffer = RxContext->Info.LengthRemaining;
    540540    ULONG cbToCopy = 0;
     541    ULONG cbString = 0;
    541542
    542543    Log(("VBOXSF: MrxQueryVolumeInfo: pInfoBuffer = %p, cbInfoBuffer = %d\n",
     
    578579            pRootName++; /* Remove the leading backslash. */
    579580
    580             Log(("VBOXSF: MrxQueryVolumeInfo: FileFsVolumeInformation: Root name = %.*ls\n",
    581                  cbRootName / sizeof(WCHAR), pRootName));
    582 
    583             cbToCopy = sizeof(FILE_FS_VOLUME_INFORMATION);
    584             cbToCopy += VBOX_VOLNAME_PREFIX_SIZE;
    585             cbToCopy += cbRootName;
     581            Log(("VBOXSF: MrxQueryVolumeInfo: FileFsVolumeInformation: Root name = %.*ls, %d bytes\n",
     582                 cbRootName / sizeof(WCHAR), pRootName, cbRootName));
     583
     584            cbToCopy = FIELD_OFFSET(FILE_FS_VOLUME_INFORMATION, VolumeLabel);
     585
     586            cbString  = VBOX_VOLNAME_PREFIX_SIZE;
     587            cbString += cbRootName;
     588            cbString += sizeof(WCHAR);
     589
     590            Log(("VBOXSF: MrxQueryVolumeInfo: FileFsVolumeInformation: cbToCopy %d, cbString %d\n",
     591                 cbToCopy, cbString));
    586592
    587593            if (cbInfoBuffer < cbToCopy)
     
    591597            }
    592598
    593             RtlZeroMemory(pInfo, sizeof(FILE_FS_VOLUME_INFORMATION));
     599            RtlZeroMemory(pInfo, cbToCopy);
    594600
    595601            /* Query serial number. */
     
    617623
    618624            pInfo->VolumeCreationTime.QuadPart = 0;
    619             pInfo->VolumeLabelLength = VBOX_VOLNAME_PREFIX_SIZE + cbRootName;
    620625            pInfo->SupportsObjects = FALSE;
    621626
    622             RtlCopyMemory(&pInfo->VolumeLabel[0], VBOX_VOLNAME_PREFIX, VBOX_VOLNAME_PREFIX_SIZE);
    623             RtlCopyMemory(&pInfo->VolumeLabel[VBOX_VOLNAME_PREFIX_SIZE / sizeof(WCHAR)], pRootName, cbRootName);
     627            if (cbInfoBuffer >= cbToCopy + cbString)
     628            {
     629                RtlCopyMemory(&pInfo->VolumeLabel[0],
     630                              VBOX_VOLNAME_PREFIX,
     631                              VBOX_VOLNAME_PREFIX_SIZE);
     632                RtlCopyMemory(&pInfo->VolumeLabel[VBOX_VOLNAME_PREFIX_SIZE / sizeof(WCHAR)],
     633                              pRootName,
     634                              cbRootName);
     635                pInfo->VolumeLabel[cbString / sizeof(WCHAR) -  1] = 0;
     636            }
     637            else
     638            {
     639                cbString = cbInfoBuffer - cbToCopy;
     640
     641                RtlCopyMemory(&pInfo->VolumeLabel[0],
     642                              VBOX_VOLNAME_PREFIX,
     643                              RT_MIN(cbString, VBOX_VOLNAME_PREFIX_SIZE));
     644                if (cbString > VBOX_VOLNAME_PREFIX_SIZE)
     645                {
     646                    RtlCopyMemory(&pInfo->VolumeLabel[VBOX_VOLNAME_PREFIX_SIZE / sizeof(WCHAR)],
     647                                  pRootName,
     648                                  cbString - VBOX_VOLNAME_PREFIX_SIZE);
     649                }
     650            }
     651
     652            pInfo->VolumeLabelLength = cbString;
     653
     654            cbToCopy += cbString;
     655
    624656            Log(("VBOXSF: MrxQueryVolumeInfo: FileFsVolumeInformation: VolumeLabelLength %d\n",
    625657                 pInfo->VolumeLabelLength));
     
    646678            pRootName++; /* Remove the leading backslash. */
    647679
    648             Log(("VBOXSF: MrxQueryVolumeInfo: FileFsLabelInformation: Root name = %.*ls\n",
    649                  cbRootName / sizeof(WCHAR), pRootName));
    650 
    651             cbToCopy = sizeof(FILE_FS_LABEL_INFORMATION);
    652             cbToCopy += VBOX_VOLNAME_PREFIX_SIZE;
    653             cbToCopy += cbRootName;
     680            Log(("VBOXSF: MrxQueryVolumeInfo: FileFsLabelInformation: Root name = %.*ls, %d bytes\n",
     681                 cbRootName / sizeof(WCHAR), pRootName, cbRootName));
     682
     683            cbToCopy = FIELD_OFFSET(FILE_FS_LABEL_INFORMATION, VolumeLabel);
     684
     685            cbString  = VBOX_VOLNAME_PREFIX_SIZE;
     686            cbString += cbRootName;
     687            cbString += sizeof(WCHAR);
    654688
    655689            if (cbInfoBuffer < cbToCopy)
     
    659693            }
    660694
    661             RtlZeroMemory(pInfo, sizeof(FILE_FS_LABEL_INFORMATION));
    662 
    663             pInfo->VolumeLabelLength = VBOX_VOLNAME_PREFIX_SIZE + cbRootName;
    664 
    665             RtlCopyMemory(&pInfo->VolumeLabel[0], VBOX_VOLNAME_PREFIX, VBOX_VOLNAME_PREFIX_SIZE);
    666             RtlCopyMemory(&pInfo->VolumeLabel[VBOX_VOLNAME_PREFIX_SIZE / sizeof(WCHAR)], pRootName, cbRootName);
     695            RtlZeroMemory(pInfo, cbToCopy);
     696
     697            if (cbInfoBuffer >= cbToCopy + cbString)
     698            {
     699                RtlCopyMemory(&pInfo->VolumeLabel[0],
     700                              VBOX_VOLNAME_PREFIX,
     701                              VBOX_VOLNAME_PREFIX_SIZE);
     702                RtlCopyMemory(&pInfo->VolumeLabel[VBOX_VOLNAME_PREFIX_SIZE / sizeof(WCHAR)],
     703                              pRootName,
     704                              cbRootName);
     705                pInfo->VolumeLabel[cbString / sizeof(WCHAR) -  1] = 0;
     706            }
     707            else
     708            {
     709                cbString = cbInfoBuffer - cbToCopy;
     710
     711                RtlCopyMemory(&pInfo->VolumeLabel[0],
     712                              VBOX_VOLNAME_PREFIX,
     713                              RT_MIN(cbString, VBOX_VOLNAME_PREFIX_SIZE));
     714                if (cbString > VBOX_VOLNAME_PREFIX_SIZE)
     715                {
     716                    RtlCopyMemory(&pInfo->VolumeLabel[VBOX_VOLNAME_PREFIX_SIZE / sizeof(WCHAR)],
     717                                  pRootName,
     718                                  cbString - VBOX_VOLNAME_PREFIX_SIZE);
     719                }
     720            }
     721
     722            pInfo->VolumeLabelLength = cbString;
     723
     724            cbToCopy += cbString;
     725
     726            Log(("VBOXSF: MrxQueryVolumeInfo: FileFsLabelInformation: VolumeLabelLength %d\n",
     727                 pInfo->VolumeLabelLength));
    667728
    668729            Status = STATUS_SUCCESS;
     
    789850        case FileFsAttributeInformation:
    790851        {
    791             PFILE_FS_ATTRIBUTE_INFORMATION pAttribInfo = (PFILE_FS_ATTRIBUTE_INFORMATION)pInfoBuffer;
     852            PFILE_FS_ATTRIBUTE_INFORMATION pInfo = (PFILE_FS_ATTRIBUTE_INFORMATION)pInfoBuffer;
    792853
    793854            Log(("VBOXSF: MrxQueryVolumeInfo: FileFsAttributeInformation\n"));
    794855
    795             cbToCopy = sizeof(FILE_FS_ATTRIBUTE_INFORMATION);
    796             cbToCopy += sizeof(MRX_VBOX_FILESYS_NAME_U) - sizeof(WCHAR);
     856            cbToCopy = FIELD_OFFSET(FILE_FS_ATTRIBUTE_INFORMATION, FileSystemName);
     857
     858            cbString = sizeof(MRX_VBOX_FILESYS_NAME_U);
    797859
    798860            if (cbInfoBuffer < cbToCopy)
     
    802864            }
    803865
    804             pAttribInfo->FileSystemAttributes = 0; /** @todo set unicode, case sensitive etc? */
    805             pAttribInfo->MaximumComponentNameLength = 255; /** @todo should query from the host */
    806             pAttribInfo->FileSystemNameLength = sizeof(MRX_VBOX_FILESYS_NAME_U);
    807             RtlCopyMemory(pAttribInfo->FileSystemName, MRX_VBOX_FILESYS_NAME_U, sizeof(MRX_VBOX_FILESYS_NAME_U));
     866            pInfo->FileSystemAttributes = 0; /** @todo set unicode, case sensitive etc? */
     867            pInfo->MaximumComponentNameLength = 255; /** @todo should query from the host */
     868
     869            if (cbInfoBuffer >= cbToCopy + cbString)
     870            {
     871                RtlCopyMemory(pInfo->FileSystemName,
     872                              MRX_VBOX_FILESYS_NAME_U,
     873                              sizeof(MRX_VBOX_FILESYS_NAME_U));
     874            }
     875            else
     876            {
     877                cbString = cbInfoBuffer - cbToCopy;
     878
     879                RtlCopyMemory(pInfo->FileSystemName,
     880                              MRX_VBOX_FILESYS_NAME_U,
     881                              RT_MIN(cbString, sizeof(MRX_VBOX_FILESYS_NAME_U)));
     882            }
     883
     884            pInfo->FileSystemNameLength = cbString;
     885
     886            cbToCopy += cbString;
     887
     888            Log(("VBOXSF: MrxQueryVolumeInfo: FileFsAttributeInformation: FileSystemNameLength %d\n",
     889                 pInfo->FileSystemNameLength));
    808890
    809891            Status = STATUS_SUCCESS;
Note: See TracChangeset for help on using the changeset viewer.

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