private static extern bool DeviceIoControl( SafeFileHandle hDevice, uint dwIoControlCode, ref STORAGE_PROPERTY_QUERY lpInBuffer, uint nInBufferSize, ref DEVICE_SEEK_PENALTY_DESCRIPTOR lpOutBuffer, uint nOutBufferSize, out uint lpBytesReturned, IntPtr lpOverlapped);
//method for no seek penalty private static RavenDriveType HasNoSeekPenalty(string sDrive) { var hDrive = CreateFileW(sDrive, 0, // No access to drive FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero); DEVICE_SEEK_PENALTY_DESCRIPTOR querySeekPenaltyDesc; bool querySeekPenaltyResult; try { if (hDrive == INVALID_HANDLE_VALUE) { var message = GetErrorMessage(Marshal.GetLastWin32Error()); if (Log.IsInfoEnabled) { Log.Info("CreateFile failed. " + message); } return(RavenDriveType.Unknown); } var IOCTL_STORAGE_QUERY_PROPERTY = CTL_CODE(IOCTL_STORAGE_BASE, 0x500, METHOD_BUFFERED, FILE_ANY_ACCESS); // From winioctl.h var query_seek_penalty = new STORAGE_PROPERTY_QUERY { PropertyId = StorageDeviceSeekPenaltyProperty, QueryType = PropertyStandardQuery }; querySeekPenaltyDesc = new DEVICE_SEEK_PENALTY_DESCRIPTOR(); uint returnedQuerySeekPenaltySize; querySeekPenaltyResult = DeviceIoControl(hDrive, IOCTL_STORAGE_QUERY_PROPERTY, ref query_seek_penalty, (uint)Marshal.SizeOf(query_seek_penalty), ref querySeekPenaltyDesc, (uint)Marshal.SizeOf(querySeekPenaltyDesc), out returnedQuerySeekPenaltySize, IntPtr.Zero); } finally { Win32ThreadsMethods.CloseHandle(hDrive); } if (querySeekPenaltyResult == false) { var message = GetErrorMessage(Marshal.GetLastWin32Error()); if (Log.IsInfoEnabled) { Log.Info("DeviceIoControl failed. " + message); } return(RavenDriveType.Unknown); } return(querySeekPenaltyDesc.IncursSeekPenalty == false ? RavenDriveType.SSD : RavenDriveType.HDD); }
//method for no seek penalty private static DriveType HasNoSeekPenalty(string sDrive) { var hDrive = CreateFileW(sDrive, 0, // No access to drive FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero); if (hDrive == null || hDrive.IsInvalid) { var message = GetErrorMessage(Marshal.GetLastWin32Error()); if (log.IsDebugEnabled) { log.Debug("CreateFile failed. " + message); } return(DriveType.Unknown); } var IOCTL_STORAGE_QUERY_PROPERTY = CTL_CODE(IOCTL_STORAGE_BASE, 0x500, METHOD_BUFFERED, FILE_ANY_ACCESS); // From winioctl.h var query_seek_penalty = new STORAGE_PROPERTY_QUERY { PropertyId = StorageDeviceSeekPenaltyProperty, QueryType = PropertyStandardQuery }; var querySeekPenaltyDesc = new DEVICE_SEEK_PENALTY_DESCRIPTOR(); uint returnedQuerySeekPenaltySize; var querySeekPenaltyResult = DeviceIoControl(hDrive, IOCTL_STORAGE_QUERY_PROPERTY, ref query_seek_penalty, (uint)Marshal.SizeOf(query_seek_penalty), ref querySeekPenaltyDesc, (uint)Marshal.SizeOf(querySeekPenaltyDesc), out returnedQuerySeekPenaltySize, IntPtr.Zero); hDrive.Close(); if (querySeekPenaltyResult == false) { var message = GetErrorMessage(Marshal.GetLastWin32Error()); if (log.IsDebugEnabled) { log.Debug("DeviceIoControl failed. " + message); } return(DriveType.Unknown); } return(querySeekPenaltyDesc.IncursSeekPenalty == false ? DriveType.SSD : DriveType.HDD); }
/// <summary> /// Method for no seek penalty /// </summary> /// <param name="sDrive"></param> /// <returns></returns> public static DriveType HasNoSeekPenalty(string sDrive) { SafeFileHandle hDrive = CreateFileW( sDrive, 0, // No access to drive FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero); if (hDrive == null || hDrive.IsInvalid) { string message = GetErrorMessage(Marshal.GetLastWin32Error()); //Console.WriteLine("CreateFile failed. " + message); return(DriveType.Unknown); } uint IOCTL_STORAGE_QUERY_PROPERTY = CTL_CODE( IOCTL_STORAGE_BASE, 0x500, METHOD_BUFFERED, FILE_ANY_ACCESS); // From winioctl.h STORAGE_PROPERTY_QUERY query_seek_penalty = new STORAGE_PROPERTY_QUERY(); query_seek_penalty.PropertyId = StorageDeviceSeekPenaltyProperty; query_seek_penalty.QueryType = PropertyStandardQuery; DEVICE_SEEK_PENALTY_DESCRIPTOR query_seek_penalty_desc = new DEVICE_SEEK_PENALTY_DESCRIPTOR(); uint returned_query_seek_penalty_size; bool query_seek_penalty_result = DeviceIoControl( hDrive, IOCTL_STORAGE_QUERY_PROPERTY, ref query_seek_penalty, (uint)Marshal.SizeOf(query_seek_penalty), ref query_seek_penalty_desc, (uint)Marshal.SizeOf(query_seek_penalty_desc), out returned_query_seek_penalty_size, IntPtr.Zero); if (query_seek_penalty_result == false) { string message = GetErrorMessage(Marshal.GetLastWin32Error()); //Console.WriteLine("DeviceIoControl failed. " + message); } hDrive.Close(); if (query_seek_penalty_result == false) { return(DriveType.Unknown); } if (query_seek_penalty_desc.IncursSeekPenalty == false) { //Console.WriteLine("This drive has NO SEEK penalty."); return(DriveType.SSD); } else { //Console.WriteLine("This drive has SEEK penalty."); return(DriveType.Rotational); } }
public static extern bool DeviceIoControl(SafeFileHandle hDevice, uint dwIoControlCode, ref STORAGE_PROPERTY_QUERY lpInBuffer, uint nInBufferSize, ref DEVICE_SEEK_PENALTY_DESCRIPTOR lpOutBuffer, uint nOutBufferSize, ref uint lpBytesReturned, IntPtr lpOverlapped);