Advertisement
Guest User

Untitled

a guest
Jul 27th, 2017
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.26 KB | None | 0 0
  1. private static void Foo()
  2. {
  3. Guid DisplayGUID = new Guid(Bar.GUID_DEVINTERFACE_MONITOR);
  4.  
  5. IntPtr DisplaysHandle = Bar.SetupDiGetClassDevs(ref DisplayGUID, null, IntPtr.Zero, (uint)(Win32.DIGCF_PRESENT | Win32.DIGCF_DEVICEINTERFACE));
  6.  
  7. Bar.SP_DEVICE_INTERFACE_DATA Data = new Bar.SP_DEVICE_INTERFACE_DATA();
  8. Data.cbSize = Marshal.SizeOf(Data);
  9.  
  10. for (uint id = 0; Bar.SetupDiEnumDeviceInterfaces(DisplaysHandle, IntPtr.Zero, ref DisplayGUID, id, ref Data); id++)
  11. {
  12. Bar.SP_DEVINFO_DATA SPDID = new Bar.SP_DEVINFO_DATA();
  13. SPDID.cbSize = (uint)Marshal.SizeOf(SPDID);
  14.  
  15. Bar.SP_DEVICE_INTERFACE_DETAIL_DATA NDIDD = new Bar.SP_DEVICE_INTERFACE_DETAIL_DATA();
  16.  
  17. if (IntPtr.Size == 8) //64 bit
  18. NDIDD.cbSize = 8;
  19. else //32 bit
  20. NDIDD.cbSize = 4 + Marshal.SystemDefaultCharSize;
  21.  
  22. uint requiredsize = 0;
  23. uint buffer = Bar.BUFFER_SIZE;
  24.  
  25. if (Bar.SetupDiGetDeviceInterfaceDetail(DisplaysHandle, ref Data, ref NDIDD, buffer, ref requiredsize, ref SPDID))
  26. {
  27. uint size = 0;
  28. Bar.CM_Get_Device_ID_Size(out size, SPDID.DevInst);
  29.  
  30. IntPtr ptrInstanceBuf = Marshal.AllocHGlobal((int)size);
  31.  
  32. Bar.CM_Get_Device_ID(SPDID.DevInst, ref ptrInstanceBuf, size);
  33.  
  34. string InstanceID = Marshal.PtrToStringAuto(ptrInstanceBuf);
  35.  
  36. Console.WriteLine("InstanceID: {0}", InstanceID);
  37.  
  38. Marshal.FreeHGlobal(ptrInstanceBuf);
  39.  
  40. Console.WriteLine("DevicePath: {0}n", NDIDD.DevicePath);
  41. }
  42. }
  43.  
  44. Bar.SetupDiDestroyDeviceInfoList(DisplaysHandle);
  45. }
  46.  
  47. private class Bar
  48. {
  49. [DllImport("setupapi.dll", CharSet = CharSet.Auto)]
  50. public static extern IntPtr SetupDiGetClassDevs(ref Guid ClassGuid, [MarshalAs(UnmanagedType.LPTStr)] string Enumerator, IntPtr hwndParent, uint Flags);
  51.  
  52. [DllImport("setupapi.dll", SetLastError = true)]
  53. public static extern bool SetupDiDestroyDeviceInfoList(IntPtr DeviceInfoSet);
  54.  
  55. [DllImport(@"setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
  56. public static extern Boolean SetupDiEnumDeviceInterfaces(IntPtr hDevInfo, IntPtr devInfo, ref Guid interfaceClassGuid, UInt32 memberIndex, ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData);
  57.  
  58. [DllImport(@"setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
  59. public static extern Boolean SetupDiGetDeviceInterfaceDetail(IntPtr hDevInfo, ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData, ref SP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData, UInt32 deviceInterfaceDetailDataSize, ref UInt32 requiredSize, ref SP_DEVINFO_DATA deviceInfoData);
  60.  
  61. [DllImport("setupapi.dll", SetLastError = true)]
  62. public static extern int CM_Get_Device_ID_Size(out uint pulLen, UInt32 dnDevInst, int flags = 0);
  63.  
  64. [DllImport("setupapi.dll", SetLastError = true)]
  65. public static extern int CM_Get_Device_ID(uint dnDevInst, ref IntPtr Buffer, uint BufferLen, int ulFlags = 0);
  66.  
  67. public const int BUFFER_SIZE = 168; //guess
  68.  
  69. public const string GUID_DEVINTERFACE_MONITOR = "{E6F07B5F-EE97-4a90-B076-33F57BF4EAA7}";
  70.  
  71. [Flags]
  72. public enum DiGetClassFlags : uint
  73. {
  74. DIGCF_DEFAULT = 0x00000001, // only valid with DIGCF_DEVICEINTERFACE
  75. DIGCF_PRESENT = 0x00000002,
  76. DIGCF_ALLCLASSES = 0x00000004,
  77. DIGCF_PROFILE = 0x00000008,
  78. DIGCF_DEVICEINTERFACE = 0x00000010,
  79. }
  80.  
  81. [StructLayout(LayoutKind.Sequential)]
  82. public struct SP_DEVICE_INTERFACE_DATA
  83. {
  84. public Int32 cbSize;
  85. public Guid interfaceClassGuid;
  86. public Int32 flags;
  87. private UIntPtr reserved;
  88. }
  89.  
  90. [StructLayout(LayoutKind.Sequential)]
  91. public struct SP_DEVINFO_DATA
  92. {
  93. public uint cbSize;
  94. public Guid classGuid;
  95. public uint DevInst;
  96. public IntPtr reserved;
  97. }
  98.  
  99. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
  100. public struct SP_DEVICE_INTERFACE_DETAIL_DATA
  101. {
  102. public int cbSize;
  103. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = BUFFER_SIZE)]
  104. public string DevicePath;
  105. }
  106. }
  107.  
  108. InstanceID: DISPLAYDELA00B5&786e6ca&0&UID1048832
  109. DevicePath: \?display#dela00b#5&786e6ca&0&uid1048832#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
  110.  
  111. InstanceID: l
  112. DevicePath: \?display#dela00b#5&786e6ca&0&uid1048832#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement