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);
示例#2
0
        //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);
        }
示例#3
0
        //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);
                }
            }
示例#5
0
 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);