Example #1
1
 /// <summary>Create instance of disc IO control commands class</summary>
 /// <param name="device">Device</param>
 internal Disc(DeviceIoControl device)
 {
     this._device = device;
 }
Example #2
0
        /// <summary>
        /// Gets the serial number of the specified physical driver.
        /// </summary>
        /// <param name="DriveName">Name of the disk drive.</param>
        public static unsafe string Example_QueryDiskSerial(string DriveName = "PhysicalDrive0")
        {
            var SerialNumber = (string)null;

            //
            // Open the symbolic link created by the disk driver.
            //

            var DiskDevice = new DeviceIoControl("\\\\.\\" + DriveName);

            DiskDevice.Connect();

            //
            // Prepare a request to send to the disk driver.
            //

            var Desc  = new STORAGE_DESCRIPTOR_HEADER();
            var Query = new STORAGE_PROPERTY_QUERY
            {
                PropertyId = STORAGE_PROPERTY_ID.StorageDeviceProperty,
                QueryType  = STORAGE_QUERY_TYPE.PropertyStandardQuery
            };

            //
            // Call the disk driver's IRP handler.
            //

            if (DiskDevice.TryIoControl(IOCTL_STORAGE_QUERY_PROPERTY, &Query, Marshal.SizeOf(Query), &Desc, Marshal.SizeOf(Desc)))
            {
                var Allocation = Marshal.AllocHGlobal(Desc.Size);

                if (DiskDevice.TryIoControl(IOCTL_STORAGE_QUERY_PROPERTY, &Query, Marshal.SizeOf(Query), Allocation.ToPointer(), Desc.Size))
                {
                    var DeviceDesc = Marshal.PtrToStructure <STORAGE_DEVICE_DESCRIPTOR>(Allocation);

                    if (DeviceDesc.SerialNumberOffset != 0)
                    {
                        SerialNumber = Marshal.PtrToStringAnsi(IntPtr.Add(Allocation, DeviceDesc.SerialNumberOffset), Desc.Size - DeviceDesc.SerialNumberOffset);
                        SerialNumber = SerialNumber.Trim('\0');
                    }
                }
                else
                {
                    Console.WriteLine("[*] Failed to query for the storage descriptor.");
                }

                Marshal.FreeHGlobal(Allocation);
            }
            else
            {
                Console.WriteLine("[*] Failed to query for the storage descriptor size.");
            }

            DiskDevice.Close();

            Console.WriteLine($"[*] Disk Serial: {SerialNumber}");
            return(SerialNumber);
        }
Example #3
0
        /// <summary>
        /// Function will query device for unique device number and set it on <see cref="SystemDevice"/> object
        /// </summary>
        /// <param name="device">The device.</param>
        /// <param name="token">The token.</param>
        protected void SetDeviceNumber(SystemDevice device, CancellationToken token)
        {
            STORAGE_DEVICE_NUMBER devNumber;

            if (DeviceIoControl <int> .IsAccessible(device) == false)
            {
                // Device is not ready
                return;
            }

            token.ThrowIfCancellationRequested();

            devNumber = base.GetDeviceNumber(device);

            token.ThrowIfCancellationRequested();

            device.DeviceNumber = devNumber.DeviceNumber;
        }
Example #4
0
        /// <summary>
        /// Sets the size of disk the device.
        /// </summary>
        /// <param name="device">The device to query</param>
        /// <param name="token">The cancellation token.</param>
        protected void SetDeviceSize(SystemDevice device, CancellationToken token)
        {
            DISK_GEOMETRY_EX diskGeometry;

            if (DeviceIoControl <int> .IsAccessible(device) == false)
            {
                // Device is not ready
                return;
            }

            token.ThrowIfCancellationRequested();

            diskGeometry = base.GetDriveGeometry(device);

            token.ThrowIfCancellationRequested();

            device.DiskSize       = diskGeometry.DiskSize;
            device.BytesPerSector = diskGeometry.Geometry.BytesPerSector;
            device.SectorsCount   = diskGeometry.Geometry.SectorsCount;
        }
Example #5
0
 /// <summary>Create instance of deviceperfomance counters</summary>
 /// <param name="device">device</param>
 internal Performance(DeviceIoControl device)
 {
     this._device = device;
 }
Example #6
0
 /// <summary>Create instance of Volume IO control commands</summary>
 /// <param name="device">Device</param>
 internal Volume(DeviceIoControl device)
 {
     this._device = device;
 }
Example #7
0
        static void Main(String[] args)
        {
            try
            {
                using(DeviceIoControl device = new DeviceIoControl("c:\\"))
                {
                    var info = device.FileSystem.GetStatistics();
                    Boolean isWritable = device.Disc.IsWritable;
                    Boolean checkVerify = device.Storage.CheckVerify;
                    Boolean checkVerify2 = device.Storage.CheckVerify2;
                    Boolean isOn = device.IsDeviceOn;
                    Console.WriteLine(String.Format("Device is {0}", isOn ? "on" : "off"));
                    if(device.Disc.Version.HasValue)
                    {
                        String capabilities = "Capabilities: ";
                        if(device.Disc.Version.Value.CommandAta)
                            capabilities += "ATA,";
                        if(device.Disc.Version.Value.CommandAtapi)
                            capabilities += "ATAPI,";
                        if(device.Disc.Version.Value.CommandSmart)
                            capabilities += "SCSI";
                        Console.WriteLine(capabilities);
                    }

                    Console.WriteLine("===PROPERTIES===");
                    if(device.Storage.Properties.Device.HasValue)
                        Console.WriteLine(String.Format("Device: {0}", device.Storage.Properties.Device.Value.Size));
                    if(device.Storage.Properties.Adapter.HasValue)
                        Console.WriteLine(String.Format("Adapter: {0}", device.Storage.Properties.Adapter.Value.Size));
                    if(device.Storage.Properties.ID.HasValue)
                        Console.WriteLine(String.Format("ID: {0:n0}", device.Storage.Properties.ID.Value.Size));
                    if(device.Storage.Properties.WriteCache.HasValue)
                        Console.WriteLine(String.Format("WriteCache: {0}", device.Storage.Properties.WriteCache.Value.Size));
                    if(device.Storage.Properties.Miniport.HasValue)
                        Console.WriteLine(String.Format("Miniport: {0}", device.Storage.Properties.Miniport.Value.Size));
                    if(device.Storage.Properties.AccessAlignment.HasValue)
                        Console.WriteLine(String.Format("AccessAlignment: {0}", device.Storage.Properties.AccessAlignment.Value.Size));
                    if(device.Storage.Properties.SeekPenalty.HasValue)
                        Console.WriteLine(String.Format("SeekPenalty: {0}", device.Storage.Properties.SeekPenalty.Value.Size));
                    if(device.Storage.Properties.Trim.HasValue)
                        Console.WriteLine(String.Format("Trim: {0}", device.Storage.Properties.Trim.Value.Size));
                    if(device.Storage.Properties.WriteAggregation.HasValue)
                        Console.WriteLine(String.Format("WriteAggregation: {0}", device.Storage.Properties.WriteAggregation.Value.Size));
                    if(device.Storage.Properties.Power.HasValue)
                        Console.WriteLine(String.Format("Power: {0}", device.Storage.Properties.Power.Value.Size));
                    if(device.Storage.Properties.CopyOffload.HasValue)
                        Console.WriteLine(String.Format("CopyOffload: {0}", device.Storage.Properties.CopyOffload.Value.Size));
                    if(device.Storage.Properties.Resilency.HasValue)
                        Console.WriteLine(String.Format("Resilency: {0}", device.Storage.Properties.Resilency.Value.Size));

                    UInt64 totalSize = 0;
                    foreach(var bitmap in device.FileSystem.GetVolumeBitmap())
                        totalSize += bitmap.BitmapSize;

                    if(device.Disc.Smart != null)
                    {
                        Console.WriteLine("===INFO===");
                        //Info
                        String deviceInfo = String.Format(@"Type: {0}
            Serial number: {1}\
            Firmware version: {2}
            Model number: {3}
            Capabilities: 0x{4:X}
            User addressable space {5:n0} sectors (LBA mode only)",
                            device.Disc.Smart.SystemParams.Type,
                            device.Disc.Smart.SystemParams.SerialNumber,
                            device.Disc.Smart.SystemParams.FirmwareRev,
                            device.Disc.Smart.SystemParams.ModelNumber,
                            device.Disc.Smart.SystemParams.wCapabilities,
                            device.Disc.Smart.SystemParams.ulTotalAddressableSectors);
                        Console.WriteLine(deviceInfo);
                        //Info

                        //Params
                        String deviceParams = String.Format(@"Number of cylinders: {0:n0}
            Number of heads: {1:n0}
            Current number of cylinders: {2:n0}
            Current number of heads: {3:n0}
            Current Sectors per track: {4:n0}
            Current Sector capacity: {5:n0}",
                            device.Disc.Smart.SystemParams.wNumCyls,
                            device.Disc.Smart.SystemParams.wNumHeads,
                            device.Disc.Smart.SystemParams.wNumCurrentCyls,
                            device.Disc.Smart.SystemParams.wNumCurrentHeads,
                            device.Disc.Smart.SystemParams.wNumCurrentSectorsPerTrack,
                            device.Disc.Smart.SystemParams.ulCurrentSectorCapacity);
                        Console.WriteLine(deviceParams);
                        //Params

                        //SMART
                        StringBuilder smartAttributes = new StringBuilder();
                        foreach(var attr in device.Disc.Smart)
                            smartAttributes.AppendFormat(@"{0:X} {1} Value: {2} Worst: {3} Threshold: {4} RawValue: {5:n0}
            ",
                                attr.Attribute.bAttrID,
                                attr.Attribute.AttrName,
                                attr.Attribute.bAttrValue,
                                attr.Attribute.bWorstValue,
                                attr.Threshold.bWarrantyThreshold,
                                attr.Attribute.RawValue);
                        Console.WriteLine(smartAttributes);
                        //SMART
                    }

                    /*using(DiscPerformance perf = device.GetDiscPerfomance())
                    {
                        WinNT.DISK_PERFORMANCE perf1 = perf.QueryPerfomanceInfo();
                        System.Threading.Thread.Sleep(1000);
                        WinNT.DISK_PERFORMANCE perf2 = perf.QueryPerfomanceInfo();
                    }*/
                }
            } catch(Win32Exception exc)
            {
                Console.WriteLine("{0} ({1:X})", exc.Message, exc.NativeErrorCode);
                Console.WriteLine("===================================");
                Console.WriteLine(exc.StackTrace);
                Console.ReadKey();
            }
        }
Example #8
0
 /// <summary>
 /// Function will calculate/read 'Disk geometry' for provided <see cref="SystemVolume"/>
 /// </summary>
 /// <param name="device"><see cref="SystemVolume"/> to query</param>
 /// <returns>Disk geometry information</returns>
 internal virtual DISK_GEOMETRY_EX GetDriveGeometry(DeviceHandle device)
 {
     DeviceIoControl<DISK_GEOMETRY_EX> deviceControl = new DeviceIoControl<DISK_GEOMETRY_EX>();
     return deviceControl.GetDiskGeometryEx(device);
 }
Example #9
0
 /// <summary>
 /// Function will all physical disk that 'volume' is extended/spanned on it
 /// </summary>
 /// <remarks>MSDN: http://msdn.microsoft.com/en-us/library/aa365194(v=vs.85).aspx </remarks>
 /// <param name="device"><see cref="SystemVolume"/> to query</param>
 /// <returns><see cref="VOLUME_DISK_EXTENTS"/> structure that volume extends on</returns>
 internal virtual Nullable<VOLUME_DISK_EXTENTS> GetDiskExtendsForVolume(SystemVolume device)
 {
     DeviceIoControl<VOLUME_DISK_EXTENTS> deviceControl = new DeviceIoControl<VOLUME_DISK_EXTENTS>();
     return deviceControl.GetDataForDevice(device, IoControlCode.IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS);
 }
Example #10
0
 /// <summary>
 /// Retrieves the device type, device number, and, for a partitionable device, the partition number of a device.
 /// </summary>
 /// <param name="device"><see cref="SystemVolume"/> to query</param>
 /// <returns><see cref="STORAGE_DEVICE_NUMBER"/> structure</returns>
 internal virtual STORAGE_DEVICE_NUMBER GetDeviceNumber(DeviceHandle device)
 {
     DeviceIoControl<STORAGE_DEVICE_NUMBER> deviceControl = new DeviceIoControl<STORAGE_DEVICE_NUMBER>();
     return deviceControl.GetDataForDevice(device, IoControlCode.IOCTL_STORAGE_GET_DEVICE_NUMBER);
 }
Example #11
0
 /// <summary>
 /// Function will calculate/read 'Layout information' for provided <see cref="SystemVolume"/>
 /// </summary>
 /// <param name="device"><see cref="SystemVolume"/> to query</param>
 /// <returns>Tuple of <see cref="DRIVE_LAYOUT_INFORMATION_EX"/> and array of <see cref="PARTITION_INFORMATION_EX"/></returns>
 /// <remarks>MSDN: http://msdn.microsoft.com/en-us/library/aa365174(v=vs.85).aspx </remarks>
 internal virtual Tuple<DRIVE_LAYOUT_INFORMATION_EX, PARTITION_INFORMATION_EX[]> GetDriveLayout(SystemVolume device)
 {
     DeviceIoControl<DRIVE_LAYOUT_INFORMATION_EX> deviceControl = new DeviceIoControl<DRIVE_LAYOUT_INFORMATION_EX>();
     return deviceControl.GetDriveLayout(device);
 }
Example #12
0
        static void Main(String[] args)
        {
            try
            {
                using (DeviceIoControl device = new DeviceIoControl("c:\\"))
                {
                    var     info         = device.FileSystem.GetStatistics();
                    Boolean isWritable   = device.Disc.IsWritable;
                    Boolean checkVerify  = device.Storage.CheckVerify;
                    Boolean checkVerify2 = device.Storage.CheckVerify2;
                    Boolean isOn         = device.IsDeviceOn;
                    Console.WriteLine(String.Format("Device is {0}", isOn ? "on" : "off"));
                    if (device.Disc.Version.HasValue)
                    {
                        String capabilities = "Capabilities: ";
                        if (device.Disc.Version.Value.CommandAta)
                        {
                            capabilities += "ATA,";
                        }
                        if (device.Disc.Version.Value.CommandAtapi)
                        {
                            capabilities += "ATAPI,";
                        }
                        if (device.Disc.Version.Value.CommandSmart)
                        {
                            capabilities += "SCSI";
                        }
                        Console.WriteLine(capabilities);
                    }

                    Console.WriteLine("===PROPERTIES===");
                    if (device.Storage.Properties.Device.HasValue)
                    {
                        Console.WriteLine(String.Format("Device: {0}", device.Storage.Properties.Device.Value.Size));
                    }
                    if (device.Storage.Properties.Adapter.HasValue)
                    {
                        Console.WriteLine(String.Format("Adapter: {0}", device.Storage.Properties.Adapter.Value.Size));
                    }
                    if (device.Storage.Properties.ID.HasValue)
                    {
                        Console.WriteLine(String.Format("ID: {0:n0}", device.Storage.Properties.ID.Value.Size));
                    }
                    if (device.Storage.Properties.WriteCache.HasValue)
                    {
                        Console.WriteLine(String.Format("WriteCache: {0}", device.Storage.Properties.WriteCache.Value.Size));
                    }
                    if (device.Storage.Properties.Miniport.HasValue)
                    {
                        Console.WriteLine(String.Format("Miniport: {0}", device.Storage.Properties.Miniport.Value.Size));
                    }
                    if (device.Storage.Properties.AccessAlignment.HasValue)
                    {
                        Console.WriteLine(String.Format("AccessAlignment: {0}", device.Storage.Properties.AccessAlignment.Value.Size));
                    }
                    if (device.Storage.Properties.SeekPenalty.HasValue)
                    {
                        Console.WriteLine(String.Format("SeekPenalty: {0}", device.Storage.Properties.SeekPenalty.Value.Size));
                    }
                    if (device.Storage.Properties.Trim.HasValue)
                    {
                        Console.WriteLine(String.Format("Trim: {0}", device.Storage.Properties.Trim.Value.Size));
                    }
                    if (device.Storage.Properties.WriteAggregation.HasValue)
                    {
                        Console.WriteLine(String.Format("WriteAggregation: {0}", device.Storage.Properties.WriteAggregation.Value.Size));
                    }
                    if (device.Storage.Properties.Power.HasValue)
                    {
                        Console.WriteLine(String.Format("Power: {0}", device.Storage.Properties.Power.Value.Size));
                    }
                    if (device.Storage.Properties.CopyOffload.HasValue)
                    {
                        Console.WriteLine(String.Format("CopyOffload: {0}", device.Storage.Properties.CopyOffload.Value.Size));
                    }
                    if (device.Storage.Properties.Resilency.HasValue)
                    {
                        Console.WriteLine(String.Format("Resilency: {0}", device.Storage.Properties.Resilency.Value.Size));
                    }

                    UInt64 totalSize = 0;
                    foreach (var bitmap in device.FileSystem.GetVolumeBitmap())
                    {
                        totalSize += bitmap.BitmapSize;
                    }

                    if (device.Disc.Smart != null)
                    {
                        Console.WriteLine("===INFO===");
                        //Info
                        String deviceInfo = String.Format(@"Type: {0}
Serial number: {1}\
Firmware version: {2}
Model number: {3}
Capabilities: 0x{4:X}
User addressable space {5:n0} sectors (LBA mode only)",
                                                          device.Disc.Smart.SystemParams.Type,
                                                          device.Disc.Smart.SystemParams.SerialNumber,
                                                          device.Disc.Smart.SystemParams.FirmwareRev,
                                                          device.Disc.Smart.SystemParams.ModelNumber,
                                                          device.Disc.Smart.SystemParams.wCapabilities,
                                                          device.Disc.Smart.SystemParams.ulTotalAddressableSectors);
                        Console.WriteLine(deviceInfo);
                        //Info

                        //Params
                        String deviceParams = String.Format(@"Number of cylinders: {0:n0}
Number of heads: {1:n0}
Current number of cylinders: {2:n0}
Current number of heads: {3:n0}
Current Sectors per track: {4:n0}
Current Sector capacity: {5:n0}",
                                                            device.Disc.Smart.SystemParams.wNumCyls,
                                                            device.Disc.Smart.SystemParams.wNumHeads,
                                                            device.Disc.Smart.SystemParams.wNumCurrentCyls,
                                                            device.Disc.Smart.SystemParams.wNumCurrentHeads,
                                                            device.Disc.Smart.SystemParams.wNumCurrentSectorsPerTrack,
                                                            device.Disc.Smart.SystemParams.ulCurrentSectorCapacity);
                        Console.WriteLine(deviceParams);
                        //Params

                        //SMART
                        StringBuilder smartAttributes = new StringBuilder();
                        foreach (var attr in device.Disc.Smart)
                        {
                            smartAttributes.AppendFormat(@"{0:X} {1} Value: {2} Worst: {3} Threshold: {4} RawValue: {5:n0}
",
                                                         attr.Attribute.bAttrID,
                                                         attr.Attribute.AttrName,
                                                         attr.Attribute.bAttrValue,
                                                         attr.Attribute.bWorstValue,
                                                         attr.Threshold.bWarrantyThreshold,
                                                         attr.Attribute.RawValue);
                        }
                        Console.WriteLine(smartAttributes);
                        //SMART
                    }

                    /*using(DiscPerformance perf = device.GetDiscPerfomance())
                     * {
                     *      WinNT.DISK_PERFORMANCE perf1 = perf.QueryPerfomanceInfo();
                     *      System.Threading.Thread.Sleep(1000);
                     *      WinNT.DISK_PERFORMANCE perf2 = perf.QueryPerfomanceInfo();
                     * }*/
                }
            } catch (Win32Exception exc)
            {
                Console.WriteLine("{0} ({1:X})", exc.Message, exc.NativeErrorCode);
                Console.WriteLine("===================================");
                Console.WriteLine(exc.StackTrace);
                Console.ReadKey();
            }
        }
Example #13
0
 /// <summary>Create instance of file system IO commands class</summary>
 /// <param name="device">Device</param>
 public FileSystem(DeviceIoControl device)
 {
     this._device = device;
 }
Example #14
0
 /// <summary>Create instance of storage IO commands class</summary>
 /// <param name="device">Device</param>
 internal Storage(DeviceIoControl device)
 {
     this._device = device;
 }