diff --git a/avrdude/ChangeLog b/avrdude/ChangeLog index d0bcf4a7..285983e6 100644 --- a/avrdude/ChangeLog +++ b/avrdude/ChangeLog @@ -1,3 +1,9 @@ +2009-07-02 Joerg Wunsch + + bug #22234: WINDOWS version: HOWTO: Specify Serial Ports Larger than COM9 + * ser_win32.c (ser_open): prepend \\.\ to any COM port name, so it is + safe to be used for COM ports above 9. + 2009-07-02 Joerg Wunsch bug #26408: Crash in stk500v2_open() diff --git a/avrdude/ser_win32.c b/avrdude/ser_win32.c index aa4cc34c..ed8eb29d 100644 --- a/avrdude/ser_win32.c +++ b/avrdude/ser_win32.c @@ -110,6 +110,7 @@ static void ser_open(char * port, long baud, union filedescriptor *fdp) { LPVOID lpMsgBuf; HANDLE hComPort=INVALID_HANDLE_VALUE; + char *newname = 0; /* * If the port is of the form "net::", then @@ -125,10 +126,22 @@ static void ser_open(char * port, long baud, union filedescriptor *fdp) exit(1); } - /* if (hComPort!=INVALID_HANDLE_VALUE) - fprintf(stderr, "%s: ser_open(): \"%s\" is already open\n", - progname, port); - */ + if (strncasecmp(port, "com", strlen("com")) == 0) { + + // prepend "\\\\.\\" to name, required for port # >= 10 + newname = malloc(strlen("\\\\.\\") + strlen(port) + 1); + + if (newname == 0) { + fprintf(stderr, + "%s: ser_open(): out of memory\n", + progname); + exit(1); + } + strcpy(newname, "\\\\.\\"); + strcat(newname, port); + + port = newname; + } hComPort = CreateFile(port, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); @@ -174,6 +187,10 @@ static void ser_open(char * port, long baud, union filedescriptor *fdp) progname, port); exit(1); } + + if (newname != 0) { + free(newname); + } }