Changeset 1733


Ignore:
Timestamp:
1/30/2010 6:35:16 AM (5 years ago)
Author:
lowjoel
Message:

Forward port from Eraser 6.0: Change the behaviour to GetVolumeInformation?: if it returns zero it is not exactly an error condition that we should throw an exception. MSDN states that some information may be returned so we should try to get that information. But, the drive is definitely not in a ready state.

Location:
trunk/eraser6
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/eraser6

  • trunk/eraser6/Eraser.Util/VolumeInfo.cs

    r1731 r1733  
    5858            StringBuilder fileSystemName = new StringBuilder(KernelApi.NativeMethods.MaxPath); 
    5959            uint serialNumber, maxComponentLength, filesystemFlags; 
    60             if (!KernelApi.NativeMethods.GetVolumeInformation(volumeId, volumeName, 
     60            if (KernelApi.NativeMethods.GetVolumeInformation(volumeId, volumeName, 
    6161                KernelApi.NativeMethods.MaxPath, out serialNumber, out maxComponentLength, 
    6262                out filesystemFlags, fileSystemName, KernelApi.NativeMethods.MaxPath)) 
    6363            { 
    64                 int lastError = Marshal.GetLastWin32Error(); 
    65                 switch (lastError) 
    66                 { 
    67                     case 0:     //ERROR_NO_ERROR 
    68                     case 21:    //ERROR_NOT_READY 
    69                     case 87:    //ERROR_INVALID_PARAMETER: when the volume given is not mounted. 
    70                     case 1005:  //ERROR_UNRECOGNIZED_VOLUME 
    71                     case 1392:  //ERROR_FILE_CORRUPT 
    72                         break; 
    73  
    74                     default: 
    75                         throw Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error()); 
    76                 } 
    77             } 
    78             else 
    79             { 
    8064                IsReady = true; 
    81                 VolumeLabel = volumeName.ToString(); 
    82                 VolumeFormat = fileSystemName.ToString(); 
    83  
    84                 //Determine whether it is FAT12 or FAT16 
    85                 if (VolumeFormat == "FAT") 
    86                 { 
    87                     uint clusterSize, sectorSize, freeClusters, totalClusters; 
    88                     if (KernelApi.NativeMethods.GetDiskFreeSpace(VolumeId, out clusterSize, 
    89                         out sectorSize, out freeClusters, out totalClusters)) 
    90                     { 
    91                         if (totalClusters <= 0xFF0) 
    92                             VolumeFormat += "12"; 
    93                         else 
    94                             VolumeFormat += "16"; 
    95                     } 
     65            } 
     66 
     67            //If GetVolumeInformation returns zero some of the information may 
     68            //have been stored, so we just try to extract it. 
     69            VolumeLabel = volumeName.Length == 0 ? null : volumeName.ToString(); 
     70            VolumeFormat = fileSystemName.Length == 0 ? null : fileSystemName.ToString(); 
     71 
     72            //Determine whether it is FAT12 or FAT16 
     73            if (VolumeFormat == "FAT") 
     74            { 
     75                uint clusterSize, sectorSize, freeClusters, totalClusters; 
     76                if (KernelApi.NativeMethods.GetDiskFreeSpace(VolumeId, out clusterSize, 
     77                    out sectorSize, out freeClusters, out totalClusters)) 
     78                { 
     79                    if (totalClusters <= 0xFF0) 
     80                        VolumeFormat += "12"; 
     81                    else 
     82                        VolumeFormat += "16"; 
    9683                } 
    9784            } 
Note: See TracChangeset for help on using the changeset viewer.