//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); }
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); }
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); }
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); }