]> sigrok.org Git - libserialport.git/blobdiff - serialport.c
On Windows, prefix port names with '\\.\' to work with ports above COM9.
[libserialport.git] / serialport.c
index b47ddd931b50692e0d5e6470e0509d870d6b3583..c891006ea19a622bc27d1794f8207ea142bd5c75 100644 (file)
@@ -43,7 +43,7 @@
 #include "linux/serial.h"
 #endif
 
-#include "serialport.h"
+#include "libserialport.h"
 
 int sp_get_port_by_name(const char *portname, struct sp_port **port_ptr)
 {
@@ -144,7 +144,7 @@ int sp_list_ports(struct sp_port ***list_ptr)
                goto out_free_value;
        }
        while (
-               value_len = max_value_len,
+               value_len = max_value_len + 1,
                data_size = max_data_size,
                RegEnumValue(key, index, value, &value_len,
                        NULL, &type, (LPBYTE)data, &data_size) == ERROR_SUCCESS)
@@ -205,7 +205,7 @@ out_done:
        CFDictionarySetValue(classes,
                        CFSTR(kIOSerialBSDTypeKey), CFSTR(kIOSerialBSDAllTypes));
 
-       if (!(IOServiceGetMatchingServices(master, classes, &iter)))
+       if (IOServiceGetMatchingServices(master, classes, &iter) != KERN_SUCCESS)
        {
                ret = SP_ERR_FAIL;
                goto out_done;
@@ -343,6 +343,13 @@ int sp_open(struct sp_port *port, int flags)
 
 #ifdef _WIN32
        DWORD desired_access = 0, flags_and_attributes = 0;
+       char *escaped_port_name;
+
+       /* Prefix port name with '\\.\' to work with ports above COM9. */
+       if (!(escaped_port_name = malloc(strlen(port->name + 5))))
+               return SP_ERR_MEM;
+       sprintf(escaped_port_name, "\\\\.\\%s", port->name);
+
        /* Map 'flags' to the OS-specific settings. */
        desired_access |= GENERIC_READ;
        flags_and_attributes = FILE_ATTRIBUTE_NORMAL;
@@ -351,8 +358,11 @@ int sp_open(struct sp_port *port, int flags)
        if (flags & SP_MODE_NONBLOCK)
                flags_and_attributes |= FILE_FLAG_OVERLAPPED;
 
-       port->hdl = CreateFile(port->name, desired_access, 0, 0,
+       port->hdl = CreateFile(escaped_port_name, desired_access, 0, 0,
                         OPEN_EXISTING, flags_and_attributes, 0);
+
+       free(escaped_port_name);
+
        if (port->hdl == INVALID_HANDLE_VALUE)
                return SP_ERR_FAIL;
 #else