]> sigrok.org Git - libserialport.git/blobdiff - windows.c
windows: Fix compile issues with multiply or not defined GUIDs.
[libserialport.git] / windows.c
index 730870a4c1671200e0dbb4b88062b57375eb34ca..38ea0cedef7349260c5af7623a268393fea2f914 100644 (file)
--- a/windows.c
+++ b/windows.c
 /* USB path is a string of at most 8 decimal numbers < 128 separated by dots */
 #define MAX_USB_PATH  (8*3 + 7*1 + 1)
 
-/* The stuff below is not yet available in MinGW apparently. Define it here. */
-
-#ifndef USB_NODE_CONNECTION_INFORMATION_EX
-typedef struct _USB_NODE_CONNECTION_INFORMATION_EX {
-       ULONG ConnectionIndex;
-       USB_DEVICE_DESCRIPTOR DeviceDescriptor;
-       UCHAR CurrentConfigurationValue;
-       UCHAR Speed;
-       BOOLEAN DeviceIsHub;
-       USHORT DeviceAddress;
-       ULONG NumberOfOpenPipes;
-       USB_CONNECTION_STATUS ConnectionStatus;
-       USB_PIPE_INFO PipeList[];
-} USB_NODE_CONNECTION_INFORMATION_EX, *PUSB_NODE_CONNECTION_INFORMATION_EX;
-#endif
-
-#ifndef USB_GET_NODE_CONNECTION_INFORMATION_EX
-#define USB_GET_NODE_CONNECTION_INFORMATION_EX 274
-#endif
-
-#ifndef IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX
-#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX \
-       CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION_EX, \
-       METHOD_BUFFERED, FILE_ANY_ACCESS)
-#endif
-
-#ifndef CM_DRP_COMPATIBLEIDS
-#define CM_DRP_COMPATIBLEIDS 0x03
-#endif
-#ifndef CM_DRP_CLASS
-#define CM_DRP_CLASS 0x08
-#endif
-#ifndef CM_DRP_FRIENDLYNAME
-#define CM_DRP_FRIENDLYNAME 0x0d
-#endif
-#ifndef CM_DRP_ADDRESS
-#define CM_DRP_ADDRESS 0x1d
-#endif
-
-#ifndef CM_Get_DevNode_Registry_PropertyA
-CMAPI CONFIGRET WINAPI CM_Get_DevNode_Registry_PropertyA(DEVINST dnDevInst, \
-       ULONG ulProperty, PULONG pulRegDataType, PVOID Buffer, \
-       PULONG pulLength, ULONG ulFlags);
-#endif
-
 static void enumerate_hub(struct sp_port *port, char *hub_name,
                           char *parent_path);
 
@@ -404,8 +359,10 @@ SP_PRIV enum sp_return get_port_details(struct sp_port *port)
                        continue;
                size = sizeof(value);
                if (RegQueryValueExA(device_key, "PortName", NULL, &type, (LPBYTE)value,
-                                    &size) != ERROR_SUCCESS || type != REG_SZ)
+                                    &size) != ERROR_SUCCESS || type != REG_SZ) {
+                       RegCloseKey(device_key);
                        continue;
+               }
                RegCloseKey(device_key);
                value[sizeof(value)-1] = 0;
                if (strcmp(value, port->name))
@@ -497,6 +454,8 @@ SP_PRIV enum sp_return get_port_details(struct sp_port *port)
                break;
        }
 
+       SetupDiDestroyDeviceInfoList(device_info);
+
        RETURN_OK();
 }
 
@@ -539,28 +498,30 @@ SP_PRIV enum sp_return list_ports(struct sp_port ***list)
                RegEnumValue(key, index, value, &value_len,
                        NULL, &type, (LPBYTE)data, &data_size) == ERROR_SUCCESS)
        {
-               data_len = data_size / sizeof(TCHAR);
-               data[data_len] = '\0';
+               if (type == REG_SZ) {
+                       data_len = data_size / sizeof(TCHAR);
+                       data[data_len] = '\0';
 #ifdef UNICODE
-               name_len = WideCharToMultiByte(CP_ACP, 0, data, -1, NULL, 0, NULL, NULL);
+                       name_len = WideCharToMultiByte(CP_ACP, 0, data, -1, NULL, 0, NULL, NULL);
 #else
-               name_len = data_len + 1;
+                       name_len = data_len + 1;
 #endif
-               if (!(name = malloc(name_len))) {
-                       SET_ERROR(ret, SP_ERR_MEM, "registry port name malloc failed");
-                       goto out;
-               }
+                       if (!(name = malloc(name_len))) {
+                               SET_ERROR(ret, SP_ERR_MEM, "registry port name malloc failed");
+                               goto out;
+                       }
 #ifdef UNICODE
-               WideCharToMultiByte(CP_ACP, 0, data, -1, name, name_len, NULL, NULL);
+                       WideCharToMultiByte(CP_ACP, 0, data, -1, name, name_len, NULL, NULL);
 #else
-               strcpy(name, data);
+                       strcpy(name, data);
 #endif
-               if (type == REG_SZ) {
-                       DEBUG("Found port %s", name);
+                       DEBUG_FMT("Found port %s", name);
                        if (!(*list = list_append(*list, name))) {
                                SET_ERROR(ret, SP_ERR_MEM, "list append failed");
+                               free(name);
                                goto out;
                        }
+                       free(name);
                }
                index++;
        }