Exemple #1
0
        private static uint GetDiskExtents(char cDrive)
        {
            if (new DriveInfo(cDrive.ToString((IFormatProvider)CultureInfo.InvariantCulture)).DriveType != DriveType.Fixed)
            {
                Logger.Info(string.Format("The drive {0} is not fixed drive.", (object)cDrive));
            }
            string         lpFileName = "\\\\.\\" + cDrive.ToString((IFormatProvider)CultureInfo.InvariantCulture) + ":";
            SafeFileHandle fileW      = SSDCheck.CreateFileW(lpFileName, 0U, 3U, IntPtr.Zero, 3U, 128U, IntPtr.Zero);

            if (fileW == null || fileW.IsInvalid)
            {
                string errorMessage = SSDCheck.GetErrorMessage(Marshal.GetLastWin32Error());
                Logger.Error("CreateFile failed for " + lpFileName + ".  " + errorMessage);
                throw new Exception("check the error message above");
            }
            uint dwIoControlCode = SSDCheck.CTL_CODE(86U, 0U, 0U, 0U);

            SSDCheck.VOLUME_DISK_EXTENTS lpOutBuffer = new SSDCheck.VOLUME_DISK_EXTENTS();
            int num = SSDCheck.DeviceIoControl(fileW, dwIoControlCode, IntPtr.Zero, 0U, ref lpOutBuffer, (uint)Marshal.SizeOf((object)lpOutBuffer), out uint _, IntPtr.Zero) ? 1 : 0;

            fileW?.Close();
            if (num == 0 || lpOutBuffer.Extents.Length != 1)
            {
                Logger.Error("DeviceIoControl failed to query disk extension. " + SSDCheck.GetErrorMessage(Marshal.GetLastWin32Error()));
                throw new Exception("check the error message above");
            }
            uint diskNumber = lpOutBuffer.Extents[0].DiskNumber;

            Logger.Info(string.Format("The physical drive number is: {0}", (object)diskNumber));
            return(diskNumber);
        }
Exemple #2
0
        private static string GetErrorMessage(int code)
        {
            StringBuilder lpBuffer = new StringBuilder((int)byte.MaxValue);
            int           num      = (int)SSDCheck.FormatMessage(4096U, IntPtr.Zero, (uint)code, 0U, lpBuffer, (uint)lpBuffer.Capacity, IntPtr.Zero);

            return(lpBuffer.ToString());
        }
Exemple #3
0
        private static bool HasTrimEnabled(string drive)
        {
            Logger.Info("Checking trim enabled for drive: " + drive);
            SafeFileHandle fileW = SSDCheck.CreateFileW(drive, 0U, 3U, IntPtr.Zero, 3U, 128U, IntPtr.Zero);

            if (fileW == null || fileW.IsInvalid)
            {
                Logger.Error("CreateFile failed with message: " + SSDCheck.GetErrorMessage(Marshal.GetLastWin32Error()));
                throw new Exception("check the error message above");
            }
            uint dwIoControlCode = SSDCheck.CTL_CODE(45U, 1280U, 0U, 0U);

            SSDCheck.STORAGE_PROPERTY_QUERY lpInBuffer = new SSDCheck.STORAGE_PROPERTY_QUERY()
            {
                PropertyId = 8,
                QueryType  = 0
            };
            SSDCheck.DEVICE_TRIM_DESCRIPTOR lpOutBuffer = new SSDCheck.DEVICE_TRIM_DESCRIPTOR();
            int num = SSDCheck.DeviceIoControl(fileW, dwIoControlCode, ref lpInBuffer, (uint)Marshal.SizeOf((object)lpInBuffer), ref lpOutBuffer, (uint)Marshal.SizeOf((object)lpOutBuffer), out uint _, IntPtr.Zero) ? 1 : 0;

            fileW?.Close();
            if (num == 0)
            {
                Logger.Error("DeviceIoControl failed to query trim enabled. " + SSDCheck.GetErrorMessage(Marshal.GetLastWin32Error()));
                throw new Exception("check the error message above");
            }
            bool trimEnabled = lpOutBuffer.TrimEnabled;

            Logger.Info(string.Format("Is Trim Enabled: {0}", (object)trimEnabled));
            return(trimEnabled);
        }
Exemple #4
0
 public static bool IsMediaTypeSSD(string path)
 {
     try
     {
         string pathRoot = Path.GetPathRoot(path);
         Logger.Info("Checking if media type ssd for drive: " + pathRoot);
         string str = pathRoot.TrimEnd('\\').TrimEnd(':');
         if (str.Length <= 1)
         {
             return(SSDCheck.HasTrimEnabled("\\\\.\\PhysicalDrive" + SSDCheck.GetDiskExtents(str.ToCharArray()[0]).ToString()));
         }
         Logger.Info("Invalid drive letter " + str + ". returning!!");
         return(false);
     }
     catch (Exception ex)
     {
         Logger.Error("Failed to find if media is ssd. Ex : " + ex.ToString());
     }
     return(false);
 }