getPortsWithFullMessages static method

List<PortInfo> getPortsWithFullMessages({
  1. String classGUIDStr = GUID_DEVINTERFACE_COMPORT,
})

Using getPortsWithFullMessages to get Serial Ports Info Parameter: {String classGUIDStr = GUID_DEVINTERFACE_COMPORT}, refer to https://learn.microsoft.com/en-us/windows-hardware/drivers/install/guid-devinterface-comport You can set classGUIDStr = GUID_DEVINTERFACE_USB_DEVICE return PortInfo({ required this.portName, required this.friendlyName, required this.hardwareID, });

Implementation

//     required this.manufactureName,
///   })];
static List<PortInfo> getPortsWithFullMessages(
    {String classGUIDStr = GUID_DEVINTERFACE_COMPORT}) {
  /// Storage port information
  var portInfoLists = <PortInfo>[];

  /// Set Class GUID
  final classGUID = calloc<GUID>();
  classGUID.ref.setGUID(classGUIDStr);

  /// Get Device info handle
  final hDeviceInfo = SetupDiGetClassDevs(
      classGUID, nullptr, 0, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);

  if (hDeviceInfo != INVALID_HANDLE_VALUE) {
    /// Init device info data
    final devInfoData = calloc<SP_DEVINFO_DATA>();
    devInfoData.ref.cbSize = sizeOf<SP_DEVINFO_DATA>();

    /// Enum device
    for (var i = 0;
        SetupDiEnumDeviceInfo(hDeviceInfo, i, devInfoData) == TRUE;
        i++) {
      /// Init [PortName] and [friendlyName] Pointer
      final portName = calloc<Uint8>(256);
      final pcbData = calloc<DWORD>()..value = 255;
      final friendlyName = calloc<BYTE>(256);
      final hardwareID = calloc<BYTE>(256);
      final manufactureName = calloc<BYTE>(256);

      /// [SP_DEVICE_INTERFACE_DATA] in dart
      // final deviceInterfaceData = calloc<SP_DEVICE_INTERFACE_DATA>();
      // deviceInterfaceData.ref.cbSize = sizeOf<SP_DEVICE_INTERFACE_DATA>();
      //
      // final deviceInterfaceDetailData =
      //     calloc<SP_DEVICE_INTERFACE_DETAIL_DATA_>(1024);
      // deviceInterfaceDetailData.ref.cbSize =
      //     sizeOf<SP_DEVICE_INTERFACE_DETAIL_DATA_>();

      try {
        var hDevKey = SetupDiOpenDevRegKey(hDeviceInfo, devInfoData,
            DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ);

        if (hDevKey != INVALID_HANDLE_VALUE) {
          RegQueryValueEx(
              hDevKey, TEXT("PortName"), nullptr, nullptr, portName, pcbData);
          RegCloseKey(hDevKey);
        }

        /// Get friendly name
        if (SetupDiGetDeviceRegistryProperty(
                hDeviceInfo,
                devInfoData,
                SPDRP.SPDRP_FRIENDLYNAME,
                nullptr,
                friendlyName,
                255,
                nullptr) !=
            TRUE) {
          continue;
        }

        /// Get Hardware ID
        if (SetupDiGetDeviceRegistryProperty(hDeviceInfo, devInfoData,
                SPDRP.SPDRP_HARDWAREID, nullptr, hardwareID, 255, nullptr) !=
            TRUE) {
          continue;
        }

        /// Get MFG
        if (SetupDiGetDeviceRegistryProperty(hDeviceInfo, devInfoData,
                SPDRP.SPDRP_MFG, nullptr, manufactureName, 255, nullptr) !=
            TRUE) {
          continue;
        }

        // if (SetupDiEnumDeviceInterfaces(hDeviceInfo, devInfoData, classGUID, i, deviceInterfaceData) != TRUE) {
        //   continue;
        // }
        //
        // if (SetupDiGetDeviceInterfaceDetail(hDeviceInfo, deviceInterfaceData, deviceInterfaceDetailData, 1023, nullptr, nullptr) != TRUE) {
        //   continue;
        // }

        /// Convert Wchar to String
        final String portNameStr = portName.cast<Utf16>().toDartString();
        final String friendlyNameStr =
            friendlyName.cast<Utf16>().toDartString();
        // final String interfaceDetailDataStr = deviceInterfaceDetailData.ref.DevicePath;
        // print(interfaceDetailDataStr);
        final String hardwareIDStr = hardwareID.cast<Utf16>().toDartString();
        final String manufactureNameStr =
            manufactureName.cast<Utf16>().toDartString();

        /// add to lists
        portInfoLists.add(PortInfo(
            portName: portNameStr,
            friendlyName: friendlyNameStr,
            hardwareID: hardwareIDStr,
            manufactureName: manufactureNameStr));
      } finally {
        free(portName);
        free(pcbData);
        free(friendlyName);
        free(hardwareID);
        free(manufactureName);
        // free(deviceInterfaceData);
        // free(deviceInterfaceDetailData);
      }
    }

    /// [Destroy Device Info List]
    SetupDiDestroyDeviceInfoList(hDeviceInfo);
  }
  return portInfoLists;
}