From 602ac4d7c541eff9bd228bd306886f0db93a363c Mon Sep 17 00:00:00 2001 From: "adam@algroup.co.uk" Date: Fri, 14 May 2010 11:04:28 +0000 Subject: [PATCH] multiple proxmark device support [Mohamed Elsabagh] --- client/proxusb.c | 40 +++++++++++++++++++++++++++++++++++++--- client/proxusb.h | 5 +++++ common/usb.c | 18 +++++++++++++++++- 3 files changed, 59 insertions(+), 4 deletions(-) diff --git a/client/proxusb.c b/client/proxusb.c index 55ce9d68..8eedd2e6 100644 --- a/client/proxusb.c +++ b/client/proxusb.c @@ -113,6 +113,8 @@ usb_dev_handle* findProxmark(int verbose, unsigned int *iface) { struct usb_bus *busses, *bus; usb_dev_handle *handle = NULL; + struct prox_unit units[50]; + int iUnit = 0; usb_find_busses(); usb_find_devices(); @@ -129,14 +131,46 @@ usb_dev_handle* findProxmark(int verbose, unsigned int *iface) handle = usb_open(dev); if (!handle) { if (verbose) - fprintf(stderr, "open failed: %s!\n", usb_strerror()); - return NULL; + fprintf(stderr, "open fabiled: %s!\n", usb_strerror()); + //return NULL; + continue; } *iface = dev->config[0].interface[0].altsetting[0].bInterfaceNumber; - return handle; + + struct prox_unit unit = {handle, {0}}; + usb_get_string_simple(handle, desc->iSerialNumber, unit.serial_number, sizeof(unit.serial_number)); + units[iUnit++] = unit; + + //return handle; } + } + } + + if (iUnit > 0) { + int iSelection = 0; + fprintf(stdout, "\nConnected units:\n"); + + for (int i = 0; i < iUnit; i++) + fprintf(stdout, "\t%d. SN: %s\n", i+1, units[i].serial_number); + + if (iUnit > 1) { + while (iSelection < 1 || iSelection > iUnit) { + fprintf(stdout, "Which unit do you want to connect to? "); + fscanf(stdin, "%d", &iSelection); + } + } + else + iSelection = 1; + iSelection --; + + for (int i = 0; i < iUnit; i++) { + if (iSelection == i) continue; + usb_close(units[i].handle); + units[i].handle = NULL; } + + return units[iSelection].handle; } return NULL; diff --git a/client/proxusb.h b/client/proxusb.h index 42e6c75d..5845888a 100644 --- a/client/proxusb.h +++ b/client/proxusb.h @@ -26,4 +26,9 @@ struct usb_dev_handle* FindProxmark(int verbose, unsigned int *iface); struct usb_dev_handle* OpenProxmark(int verbose); void CloseProxmark(void); +struct prox_unit { + usb_dev_handle *handle; + char serial_number[256]; +}; + #endif diff --git a/common/usb.c b/common/usb.c index 3de7d369..3f30d97f 100644 --- a/common/usb.c +++ b/common/usb.c @@ -95,7 +95,7 @@ static const uint8_t DeviceDescriptor[] = { 0x01,0x00, // Device release number (0001) 0x01, // Manufacturer string descriptor index 0x02, // Product string descriptor index - 0x00, // Serial Number string descriptor index (None) + 0x03, // Serial Number string descriptor index 0x01, // Number of possible configurations (1) }; @@ -201,10 +201,26 @@ static const uint8_t StringDescriptor2[] = { 't', 0x00, }; +// Serial Number +// TODO: Pick yours! Don't forget to modify the length, if needed. +static const uint8_t StringDescriptor3[] = { + 18, // Length + 0x03, // Type is string + 'C', 0x00, + 'h', 0x00, + 'a', 0x00, + 'n', 0x00, + 'g', 0x00, + 'e', 0x00, + 'M', 0x00, + 'e', 0x00, +}; + static const uint8_t * const StringDescriptors[] = { StringDescriptor0, StringDescriptor1, StringDescriptor2, + StringDescriptor3, }; -- 2.39.5