public static SCSI_INQUIRY_DATA FromIntPtr(IntPtr ptr) { SCSI_INQUIRY_DATA inquiryData = new SCSI_INQUIRY_DATA(); inquiryData.PathId = Marshal.ReadByte(ptr, 0); inquiryData.TargetId = Marshal.ReadByte(ptr, 1); inquiryData.Lun = Marshal.ReadByte(ptr, 2); inquiryData.DeviceClaimed = Convert.ToBoolean(Marshal.ReadByte(ptr, 3)); inquiryData.InquiryDataLength = (uint)Marshal.ReadInt32(ptr, 4); inquiryData.NextInquiryDataOffset = (uint)Marshal.ReadInt32(ptr, 8); inquiryData.InquiryData = new byte[inquiryData.InquiryDataLength]; int inquiryDataOffset = 12; IntPtr inquiryDataPtr = new IntPtr(ptr.ToInt64() + inquiryDataOffset); Marshal.Copy(inquiryDataPtr, inquiryData.InquiryData, 0, inquiryData.InquiryData.Length); return(inquiryData); }
public static List <SCSI_INQUIRY_DATA> GetInquiryDataForAllDevices(IntPtr busInfoPtr) { SCSI_ADAPTER_BUS_INFO busInfo = FromIntPtr(busInfoPtr); List <SCSI_INQUIRY_DATA> devices = new List <SCSI_INQUIRY_DATA>(); foreach (SCSI_BUS_DATA busData in busInfo.BusData) { byte numberOfLuns = busData.NumberOfLogicalUnits; uint inquiryDataOffset = busData.InquiryDataOffset; for (int lunIndex = 0; lunIndex < numberOfLuns; lunIndex++) { IntPtr inquiryDataPtr = new IntPtr(busInfoPtr.ToInt64() + inquiryDataOffset); SCSI_INQUIRY_DATA inquiryData = SCSI_INQUIRY_DATA.FromIntPtr(inquiryDataPtr); devices.Add(inquiryData); inquiryDataOffset = inquiryData.NextInquiryDataOffset; } } return(devices); }