VirtualBox

Changeset 39025 in vbox for trunk/src/VBox/Runtime/r3/win


Ignore:
Timestamp:
Oct 19, 2011 9:19:42 AM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
74438
Message:

fileio-win.cpp: hacking in progress...

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/r3/win/fileio-win.cpp

    r37598 r39025  
    629629RTR3DECL(int)  RTFileGetSize(RTFILE hFile, uint64_t *pcbSize)
    630630{
     631    /*
     632     * GetFileSize works for most handles.
     633     */
     634    int             rc;
    631635    ULARGE_INTEGER  Size;
    632636    Size.LowPart = GetFileSize((HANDLE)RTFileToNative(hFile), &Size.HighPart);
     
    634638    {
    635639        *pcbSize = Size.QuadPart;
    636         return VINF_SUCCESS;
    637     }
    638 
    639     /* error exit */
    640     return RTErrConvertFromWin32(GetLastError());
     640        if (Size.QuadPart)
     641            return VINF_SUCCESS;
     642        rc = VINF_SUCCESS;
     643        /** @todo Check what GetFileSize returns on disks and volume
     644         *        handles! */
     645    }
     646    else
     647        rc = RTErrConvertFromWin32(GetLastError());
     648#if 0
     649    /*
     650     * Could it be a volume?
     651     */
     652    DISK_GEOMETRY   DriveGeo;
     653    DWORD           cbDriveGeo;
     654    if (DeviceIoControl((HANDLE)RTFileToNative(hFile),
     655                        IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0,
     656                        &DriveGeo, sizeof(DriveGeo), &cbDriveGeo, NULL))
     657    {
     658        if (   DriveGeo.MediaType == FixedMedia
     659            || DriveGeo.MediaType == RemovableMedia)
     660        {
     661            *pcbSize = DriveGeo.Cylinders.QuadPart
     662                     * DriveGeo.TracksPerCylinder
     663                     * DriveGeo.SectorsPerTrack
     664                     * DriveGeo.BytesPerSector;
     665
     666            GET_LENGTH_INFORMATION  DiskLenInfo;
     667            DWORD                   Ignored;
     668            if (DeviceIoControl((HANDLE)RTFileToNative(hFile),
     669                                IOCTL_DISK_GET_LENGTH_INFO, NULL, 0,
     670                                &DiskLenInfo, sizeof(DiskLenInfo), &Ignored, (LPOVERLAPPED)NULL))
     671            {
     672                /* IOCTL_DISK_GET_LENGTH_INFO is supported -- override cbSize. */
     673                *pcbSize = DiskLenInfo.Length.QuadPart;
     674            }
     675            return VINF_SUCCESS;
     676        }
     677    }
     678#endif
     679
     680    /*
     681     * Return the GetFileSize result if not a volume/disk.
     682     */
     683    return rc;
    641684}
    642685
     
    645688{
    646689    /** @todo r=bird:
    647      * We might have to make this code OS specific...
    648      * In the worse case, we'll have to try GetVolumeInformationByHandle on vista and fall
    649      * back on NtQueryVolumeInformationFile(,,,, FileFsAttributeInformation) else where, and
    650      * check for known file system names. (For LAN shares we'll have to figure out the remote
    651      * file system.) */
     690     * We might have to make this code OS version specific... In the worse
     691     * case, we'll have to try GetVolumeInformationByHandle on vista and fall
     692     * back on NtQueryVolumeInformationFile(,,,, FileFsAttributeInformation)
     693     * else where, and check for known file system names. (For LAN shares we'll
     694     * have to figure out the remote file system.) */
    652695    return VERR_NOT_IMPLEMENTED;
    653696}
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