SCSI_ADAPTER_BUS_INFO.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Runtime.InteropServices;
  4. using Utilities;
  5. namespace SCSI.Win32
  6. {
  7. [StructLayout(LayoutKind.Sequential)]
  8. public class SCSI_ADAPTER_BUS_INFO
  9. {
  10. public byte NumberOfBuses;
  11. public SCSI_BUS_DATA[] BusData;
  12. public SCSI_ADAPTER_BUS_INFO()
  13. {
  14. }
  15. public static SCSI_ADAPTER_BUS_INFO FromIntPtr(IntPtr ptr)
  16. {
  17. SCSI_ADAPTER_BUS_INFO busInfo = new SCSI_ADAPTER_BUS_INFO();
  18. byte numberOfBuses = Marshal.ReadByte(ptr);
  19. ptr = new IntPtr(ptr.ToInt64() + 4);
  20. busInfo.NumberOfBuses = numberOfBuses;
  21. busInfo.BusData = new SCSI_BUS_DATA[numberOfBuses];
  22. for (int index = 0; index < numberOfBuses; index++)
  23. {
  24. busInfo.BusData[index] = (SCSI_BUS_DATA)Marshal.PtrToStructure(ptr, typeof(SCSI_BUS_DATA));
  25. ptr = new IntPtr(ptr.ToInt64() + Marshal.SizeOf(typeof(SCSI_BUS_DATA)));
  26. }
  27. return busInfo;
  28. }
  29. public static List<SCSI_INQUIRY_DATA> GetInquiryDataForAllDevices(IntPtr busInfoPtr)
  30. {
  31. SCSI_ADAPTER_BUS_INFO busInfo = FromIntPtr(busInfoPtr);
  32. List<SCSI_INQUIRY_DATA> devices = new List<SCSI_INQUIRY_DATA>();
  33. foreach (SCSI_BUS_DATA busData in busInfo.BusData)
  34. {
  35. byte numberOfLuns = busData.NumberOfLogicalUnits;
  36. uint inquiryDataOffset = busData.InquiryDataOffset;
  37. for (int lunIndex = 0; lunIndex < numberOfLuns; lunIndex++)
  38. {
  39. IntPtr inquiryDataPtr = new IntPtr(busInfoPtr.ToInt64() + inquiryDataOffset);
  40. SCSI_INQUIRY_DATA inquiryData = SCSI_INQUIRY_DATA.FromIntPtr(inquiryDataPtr);
  41. devices.Add(inquiryData);
  42. inquiryDataOffset = inquiryData.NextInquiryDataOffset;
  43. }
  44. }
  45. return devices;
  46. }
  47. }
  48. }