//StorageCheckVerify
        //StorageCheckVerify2
        //StorageMediaRemoval

        public STORAGE_DEVICE_DESCRIPTOR_PARSED StorageGetDeviceProperty()
        {
            STORAGE_PROPERTY_QUERY query = new STORAGE_PROPERTY_QUERY();

            query.QueryType  = STORAGE_QUERY_TYPE.PropertyStandardQuery;
            query.PropertyId = STORAGE_PROPERTY_ID.StorageDeviceProperty;

            byte[] res = DeviceIoControlHelper.InvokeIoControlUnknownSize(Handle, IOControlCode.StorageQueryProperty, query);
            STORAGE_DEVICE_DESCRIPTOR descriptor = Utils.ByteArrayToStruct <STORAGE_DEVICE_DESCRIPTOR>(res, 0);

            STORAGE_DEVICE_DESCRIPTOR_PARSED returnValue = new STORAGE_DEVICE_DESCRIPTOR_PARSED();

            returnValue.Version               = descriptor.Version;
            returnValue.Size                  = descriptor.Size;
            returnValue.DeviceType            = descriptor.DeviceType;
            returnValue.DeviceTypeModifier    = descriptor.DeviceTypeModifier;
            returnValue.RemovableMedia        = descriptor.RemovableMedia;
            returnValue.CommandQueueing       = descriptor.CommandQueueing;
            returnValue.VendorIdOffset        = descriptor.VendorIdOffset;
            returnValue.ProductIdOffset       = descriptor.ProductIdOffset;
            returnValue.ProductRevisionOffset = descriptor.ProductRevisionOffset;
            returnValue.SerialNumberOffset    = descriptor.SerialNumberOffset;
            returnValue.BusType               = descriptor.BusType;
            returnValue.RawPropertiesLength   = descriptor.RawPropertiesLength;
            returnValue.RawDeviceProperties   = descriptor.RawDeviceProperties;
            returnValue.SerialNumber          = Utils.ReadNullTerminatedAsciiString(res, (int)descriptor.SerialNumberOffset);

            return(returnValue);
        }
        /// <summary>
        /// pDeviceName : Device name.
        /// Returns : True if the STORAGE_DEVICE_DESCRIPTOR structure has been loaded successfully.
        /// </summary>
        public bool Load(string pDeviceName)
        {
            var succeeded = false;

            var hDevice = NativeMethods.CreateFile(pDeviceName, 0, NativeConstants.FILE_SHARE_READ | NativeConstants.FILE_SHARE_WRITE, IntPtr.Zero, NativeConstants.OPEN_EXISTING, 0, IntPtr.Zero);

            if (hDevice != NativeConstants.INVALID_HANDLE_VALUE)
            {
                Unload();

                var spq = new STORAGE_PROPERTY_QUERY {
                    PropertyId = STORAGE_PROPERTY_ID.StorageDeviceProperty, QueryType = STORAGE_QUERY_TYPE.PropertyStandardQuery
                };

                if (NativeMethods.DeviceIoControl(hDevice, NativeConstants.IOCTL_STORAGE_QUERY_PROPERTY, ref spq, Marshal.SizeOf(spq), out var sdh, Marshal.SizeOf(typeof(STORAGE_DESCRIPTOR_HEADER)), out _, IntPtr.Zero))
                {
                    _pDescriptor = Marshal.AllocHGlobal(sdh.Size);

                    succeeded = NativeMethods.DeviceIoControl(hDevice, NativeConstants.IOCTL_STORAGE_QUERY_PROPERTY, ref spq, Marshal.SizeOf(spq), _pDescriptor, sdh.Size, out _, IntPtr.Zero);
                }

                NativeMethods.CloseHandle(hDevice);
            }

            if (succeeded)
            {
                _descriptor = Marshal.PtrToStructure <STORAGE_DEVICE_DESCRIPTOR>(_pDescriptor);
            }
            else
            {
                Unload();
            }

            return(succeeded);
        }
Ejemplo n.º 3
0
 public static extern bool DeviceIoControl(
     SafeFileHandle hDevice,
     uint dwIoControlCode,
     ref STORAGE_PROPERTY_QUERY lpInBuffer,             // To get disk information.
     uint nInBufferSize,
     out STORAGE_DEVICE_DESCRIPTOR lpOutBuffer,         // To get disk information.
     uint nOutBufferSize,
     out uint lpBytesReturned,
     IntPtr lpOverlapped);
        public STORAGE_DEVICE_DESCRIPTOR_PARSED_EX StorageGetDeviceProperty()
        {
            STORAGE_PROPERTY_QUERY query = new STORAGE_PROPERTY_QUERY
            {
                QueryType  = STORAGE_QUERY_TYPE.PropertyStandardQuery,
                PropertyId = STORAGE_PROPERTY_ID.StorageDeviceProperty
            };

            byte[] res = DeviceIoControlHelper.InvokeIoControlUnknownSize(Handle, IOControlCode.StorageQueryProperty, query);
            STORAGE_DEVICE_DESCRIPTOR descriptor = /*Utils.*/ ByteArrayToStruct <STORAGE_DEVICE_DESCRIPTOR>(res, 0);

            STORAGE_DEVICE_DESCRIPTOR_PARSED_EX returnValue = new STORAGE_DEVICE_DESCRIPTOR_PARSED_EX
            {
                Version               = descriptor.Version,
                Size                  = descriptor.Size,
                DeviceType            = descriptor.DeviceType,
                DeviceTypeModifier    = descriptor.DeviceTypeModifier,
                RemovableMedia        = descriptor.RemovableMedia,
                CommandQueueing       = descriptor.CommandQueueing,
                VendorIdOffset        = descriptor.VendorIdOffset,
                ProductIdOffset       = descriptor.ProductIdOffset,
                ProductRevisionOffset = descriptor.ProductRevisionOffset,
                SerialNumberOffset    = descriptor.SerialNumberOffset,
                BusType               = descriptor.BusType,
                RawPropertiesLength   = descriptor.RawPropertiesLength,
                RawDeviceProperties   = descriptor.RawDeviceProperties
            };

            if (returnValue.SerialNumberOffset != 0)
            {
                returnValue.SerialNumber = ReadNullTerminatedAsciiString(res, (int)returnValue.SerialNumberOffset);
            }
            if (returnValue.VendorIdOffset != 0)
            {
                returnValue.VendorId = ReadNullTerminatedAsciiString(res, (int)returnValue.VendorIdOffset);
            }
            if (returnValue.ProductIdOffset != 0)
            {
                returnValue.ProductId = ReadNullTerminatedAsciiString(res, (int)returnValue.ProductIdOffset);
            }
            if (returnValue.ProductRevisionOffset != 0)
            {
                returnValue.ProductRevision = ReadNullTerminatedAsciiString(res, (int)returnValue.ProductRevisionOffset);
            }


            return(returnValue);
        }
Ejemplo n.º 5
0
        public List <deviceModle> getDevices()
        {
            List <deviceModle> devices = new List <deviceModle> ();

            foreach (var device in new ManagementObjectSearcher(@"SELECT * FROM Win32_DiskDrive").Get())
            {
                deviceModle thisdevices = new deviceModle();

                thisdevices.modleName = device["Model"]?.ToString().Trim();

                string diskname = device["DeviceID"].ToString();
                thisdevices.PhysicalDriveNumber = int.Parse(diskname.Substring(diskname.Length - 1, 1));

                System.IntPtr hDevice = Kernel.CreateFile(diskname,
                                                          Kernel.GENERIC_READ | Kernel.GENERIC_WRITE,
                                                          Kernel.FILE_SHARE_READ | Kernel.FILE_SHARE_WRITE,
                                                          0,
                                                          Kernel.OPEN_EXISTING,
                                                          0,
                                                          0);

                STORAGE_PROPERTY_QUERY    Query   = new STORAGE_PROPERTY_QUERY();
                STORAGE_DEVICE_DESCRIPTOR DevDesc = new STORAGE_DEVICE_DESCRIPTOR();
                string bustype       = "";
                uint   bytesReturned = 0;
                Query.PropertyId = 0;
                Query.QueryType  = 0;

                if (0 != Kernel.DeviceIoControl(hDevice,                             // device handle
                                                Kernel.IOCTL_STORAGE_QUERY_PROPERTY, // info of device property
                                                ref Query,
                                                (uint)Marshal.SizeOf(Query),         // input data buffer
                                                ref DevDesc,
                                                (uint)Marshal.SizeOf(DevDesc),       // output data buffer
                                                ref bytesReturned,                   // out's length
                                                IntPtr.Zero))
                {
                    switch (DevDesc.BusType)
                    {
                    case STORAGE_BUS_TYPE.BusTypeUnknown:
                        bustype = Kernel.DISK_TYPE_UNKNOWN_TEXT;
                        break;

                    case STORAGE_BUS_TYPE.BusTypeScsi:
                        bustype = Kernel.DISKTYPE_SCSI;
                        break;

                    case STORAGE_BUS_TYPE.BusTypeAtapi:
                        bustype = Kernel.DISKTYPE_ATAPI;
                        break;

                    case STORAGE_BUS_TYPE.BusTypeAta:
                        bustype = Kernel.DISKTYPE_ATA;
                        break;

                    case STORAGE_BUS_TYPE.BusType1394:
                        bustype = Kernel.DISKTYPE_1394;
                        break;

                    case STORAGE_BUS_TYPE.BusTypeSsa:
                        bustype = Kernel.DISKTYPE_SSA;
                        break;

                    case STORAGE_BUS_TYPE.BusTypeFibre:
                        bustype = Kernel.DISKTYPE_FIBRE;
                        break;

                    case STORAGE_BUS_TYPE.BusTypeUsb:
                        bustype = Kernel.DISKTYPE_USB;
                        break;

                    case STORAGE_BUS_TYPE.BusTypeRAID:
                        bustype = Kernel.DISKTYPE_RAID;
                        break;

                    case STORAGE_BUS_TYPE.BusTypeSata:
                        bustype = Kernel.DISKTYPE_SATA;
                        break;

                    case STORAGE_BUS_TYPE.BusTypeMax:
                        bustype = Kernel.DISKTYPE_MAX;
                        break;

                    case STORAGE_BUS_TYPE.BusTypeNvme:
                        bustype = Kernel.DISKTYPE_MAX;
                        break;

                    default:
                        break;
                    }
                }

                thisdevices.busType = bustype;
                devices.Add(thisdevices);
                Kernel.CloseHandle(hDevice);
            }
            return(devices);
        }
Ejemplo n.º 6
0
        public VolumeDeviceQuery GetStorageDeviceProperty(SafeHandle hDevice)
        {
            VolumeDeviceQuery volumeDeviceQuery = new VolumeDeviceQuery();

            SafeAllocHandle <STORAGE_PROPERTY_QUERY>    storagePropertyQueryPtr    = null;
            SafeAllocHandle <STORAGE_DESCRIPTOR_HEADER> storageDescriptorHeaderPtr = null;
            SafeAllocHandle <STORAGE_DEVICE_DESCRIPTOR> storageDeviceDescriptorPtr = null;

            try {
                STORAGE_PROPERTY_QUERY storagePropertyQuery = new STORAGE_PROPERTY_QUERY {
                    PropertyId = (uint)STORAGE_PROPERTY_ID.StorageDeviceProperty,
                    QueryType  = (uint)STORAGE_QUERY_TYPE.PropertyStandardQuery
                };
                storagePropertyQueryPtr = new SafeAllocHandle <STORAGE_PROPERTY_QUERY>(storagePropertyQuery);

                // Get the necessary output buffer size
                STORAGE_DESCRIPTOR_HEADER storageDescriptorHeader = new STORAGE_DESCRIPTOR_HEADER {
                    Version = 0,
                    Size    = 0
                };
                storageDescriptorHeaderPtr = new SafeAllocHandle <STORAGE_DESCRIPTOR_HEADER>(storageDescriptorHeader);

                bool success = DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY,
                                               storagePropertyQueryPtr, storagePropertyQueryPtr.SizeOf,
                                               storageDescriptorHeaderPtr, storageDescriptorHeaderPtr.SizeOf,
                                               out uint bytesReturns, IntPtr.Zero);
                if (!success || bytesReturns == 0)
                {
                    m_Win32Error = Marshal.GetLastWin32Error();
                    return(null);
                }

                STORAGE_DESCRIPTOR_HEADER storageDescriptorHeaderResult = storageDescriptorHeaderPtr.ToStructure();

                storageDeviceDescriptorPtr = new SafeAllocHandle <STORAGE_DEVICE_DESCRIPTOR>((int)storageDescriptorHeaderResult.Size);
                success = DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY,
                                          storagePropertyQueryPtr, storagePropertyQueryPtr.SizeOf,
                                          storageDeviceDescriptorPtr, storageDeviceDescriptorPtr.SizeOf,
                                          out bytesReturns, IntPtr.Zero);
                if (!success || bytesReturns == 0)
                {
                    m_Win32Error = Marshal.GetLastWin32Error();
                    return(null);
                }

                STORAGE_DEVICE_DESCRIPTOR storageDeviceDescriptor = storageDeviceDescriptorPtr.ToStructure();
                if (storageDeviceDescriptor.VendorIdOffset != 0)
                {
                    volumeDeviceQuery.VendorId = storageDeviceDescriptorPtr.ToStringAnsi((int)storageDeviceDescriptor.VendorIdOffset);
                }
                if (storageDeviceDescriptor.SerialNumberOffset != 0)
                {
                    volumeDeviceQuery.DeviceSerialNumber = storageDeviceDescriptorPtr.ToStringAnsi((int)storageDeviceDescriptor.SerialNumberOffset);
                }
                if (storageDeviceDescriptor.ProductIdOffset != 0)
                {
                    volumeDeviceQuery.ProductId = storageDeviceDescriptorPtr.ToStringAnsi((int)storageDeviceDescriptor.ProductIdOffset);
                }
                if (storageDeviceDescriptor.ProductRevisionOffset != 0)
                {
                    volumeDeviceQuery.ProductRevision = storageDeviceDescriptorPtr.ToStringAnsi((int)storageDeviceDescriptor.ProductRevisionOffset);
                }
                volumeDeviceQuery.RemovableMedia     = storageDeviceDescriptor.RemovableMedia;
                volumeDeviceQuery.CommandQueueing    = storageDeviceDescriptor.CommandQueueing;
                volumeDeviceQuery.ScsiDeviceType     = (ScsiDeviceType)storageDeviceDescriptor.DeviceType;
                volumeDeviceQuery.ScsiDeviceModifier = storageDeviceDescriptor.DeviceTypeModifier;
                volumeDeviceQuery.BusType            = (BusType)storageDeviceDescriptor.BusType;
            } finally {
                if (storagePropertyQueryPtr != null)
                {
                    storagePropertyQueryPtr.Close();
                }
                if (storageDescriptorHeaderPtr != null)
                {
                    storageDescriptorHeaderPtr.Close();
                }
                if (storageDeviceDescriptorPtr != null)
                {
                    storageDeviceDescriptorPtr.Close();
                }
            }

            return(volumeDeviceQuery);
        }