/// <summary> /// Get a list of device interfaces from an Interface GUID. /// </summary> /// <param name="interface_class_guid">The interface class GUID for the device.</param> /// <param name="device_id">Optional device ID.</param> /// <param name="all_devices">True to get all devices, otherwise just present devices.</param> /// <returns>List of device interfaces.</returns> public static IEnumerable <string> GetDeviceInterfaceList(Guid interface_class_guid, string device_id, bool all_devices) { CmGetDeviceInterfaceListFlags flags = all_devices ? CmGetDeviceInterfaceListFlags.AllDevices : CmGetDeviceInterfaceListFlags.Present; while (true) { var result = DeviceNativeMethods.CM_Get_Device_Interface_List_Size(out int length, ref interface_class_guid, device_id, flags); if (result != CrError.SUCCESS) { throw new ArgumentException($"Couldn't get device interface list size. Error: {result}"); } char[] buffer = new char[length]; result = DeviceNativeMethods.CM_Get_Device_Interface_List(ref interface_class_guid, device_id, buffer, buffer.Length, flags); if (result == CrError.SUCCESS) { return(new string(buffer).Split(new char[] { '\0' }, StringSplitOptions.RemoveEmptyEntries)); } if (result != CrError.BUFFER_SMALL) { throw new ArgumentException($"Couldn't get device interface list. Error: {result}"); } } }
internal static extern CrError CM_Get_Device_Interface_List_Size(out int pulLen, ref Guid InterfaceClassGuid, string pDeviceID, CmGetDeviceInterfaceListFlags ulFlags);
internal static extern CrError CM_Get_Device_Interface_List(ref Guid InterfaceClassGuid, string pDeviceID, [Out] char[] Buffer, int BufferLen, CmGetDeviceInterfaceListFlags ulFlags);