diff options
author | Arnon Gilboa <agilboa@redhat.com> | 2012-04-24 10:39:32 +0300 |
---|---|---|
committer | Arnon Gilboa <agilboa@redhat.com> | 2012-04-24 10:39:32 +0300 |
commit | 6c7b02a07022188b94b3f77e8c73106f1461e16d (patch) | |
tree | a745d9bbc97c16c3bb35abf1a6f5579d14345049 | |
parent | d690f13c581d28dd867ad9fd869cfc696d39fbb1 (diff) |
usbclerk: define protocol
-rw-r--r-- | usbclerk.cpp | 34 | ||||
-rw-r--r-- | usbclerktest.cpp | 20 | ||||
-rw-r--r-- | usbcommon.h | 31 |
3 files changed, 61 insertions, 24 deletions
diff --git a/usbclerk.cpp b/usbclerk.cpp index 68ee009..ec2d70d 100644 --- a/usbclerk.cpp +++ b/usbclerk.cpp @@ -14,7 +14,7 @@ #define USB_CLERK_LOAD_ORDER_GROUP TEXT("") #define USB_CLERK_LOG_PATH TEXT("%susbclerk.log") #define USB_CLERK_PIPE_TIMEOUT 10000 -#define USB_CLERK_PIPE_BUF_SIZE 1024
+#define USB_CLERK_PIPE_BUF_SIZE 1024 #define USB_DRIVER_PATH "%Swdi_usb_driver" #define USB_DRIVER_INFNAME_LEN 64 #define USB_DRIVER_INSTALL_RETRIES 3 @@ -202,7 +202,7 @@ VOID WINAPI USBClerk::main(DWORD argc, TCHAR* argv[]) TCHAR temp_path[MAX_PATH]; if (GetTempPath(MAX_PATH, temp_path)) { - sprintf_s(s->_wdi_path, MAX_PATH, USB_DRIVER_PATH, temp_path); + sprintf_s(s->_wdi_path, MAX_PATH, USB_DRIVER_PATH, temp_path); swprintf_s(log_path, MAX_PATH, USB_CLERK_LOG_PATH, temp_path); s->_log = VDLog::get(log_path); } @@ -253,9 +253,10 @@ bool USBClerk::execute() { SECURITY_ATTRIBUTES sec_attr; SECURITY_DESCRIPTOR* sec_desr; - USBDevInfo dev; + USBClerkDevInfo dev; + USBClerkAck ack = {{USB_CLERK_MAGIC, USB_CLERK_VERSION, + USB_CLERK_ACK, sizeof(USBClerkAck)}}; DWORD bytes; - DWORD ack; #if 0 /* Hack for wdi logging */ @@ -278,28 +279,35 @@ bool USBClerk::execute() return false; } while (_running) { - if (!ConnectNamedPipe(_pipe, NULL) && GetLastError() != ERROR_PIPE_CONNECTED) {
+ if (!ConnectNamedPipe(_pipe, NULL) && GetLastError() != ERROR_PIPE_CONNECTED) { printf("ConnectNamedPipe() failed: %u", GetLastError()); break; }
- if (!ReadFile(_pipe, &dev, sizeof(dev), &bytes, NULL)) {
+ if (!ReadFile(_pipe, &dev, sizeof(dev), &bytes, NULL)) { vd_printf("ReadFile() failed: %d\n", GetLastError()); - break; - }
+ goto disconnect; + } + if (dev.hdr.magic != USB_CLERK_MAGIC || dev.hdr.type != USB_CLERK_DEV_INFO || + dev.hdr.size != sizeof(USBClerkDevInfo)) { + vd_printf("Unknown message received, magic %u type %u size %u", + dev.hdr.magic, dev.hdr.type, dev.hdr.size); + goto disconnect; + } vd_printf("Installing winusb driver for %04x:%04x", dev.vid, dev.pid); - if (ack = install_winusb_driver(dev.vid, dev.pid)) { + if (ack.ack = install_winusb_driver(dev.vid, dev.pid)) { vd_printf("winusb driver install succeed"); } else { vd_printf("winusb driver install failed"); } if (!WriteFile(_pipe, &ack, sizeof(ack), &bytes, NULL)) { vd_printf("WriteFile() failed: %d\n", GetLastError()); - break; + goto disconnect; } FlushFileBuffers(_pipe); +disconnect: DisconnectNamedPipe(_pipe); } - CloseHandle(_pipe);
+ CloseHandle(_pipe); return true; } @@ -333,7 +341,7 @@ bool USBClerk::install_winusb_driver(int vid, int pid) vd_printf("Device %04x:%04x was not found", vid, pid); goto cleanup; } - + vd_printf("Device %04x:%04x found", vid, pid); /* if the driver is already installed -- nothing to do */ @@ -356,7 +364,7 @@ bool USBClerk::install_winusb_driver(int vid, int pid) vd_printf("Installing driver for USB device: \"%s\" (%04x:%04x) inf: %s", wdidev->desc, vid, pid, infname); memset(&wdi_prep_opts, 0, sizeof(wdi_prep_opts)); - wdi_prep_opts.driver_type = WDI_WINUSB; + wdi_prep_opts.driver_type = WDI_WINUSB; r = wdi_prepare_driver(wdidev, _wdi_path, infname, &wdi_prep_opts); if (r != WDI_SUCCESS) { vd_printf("Device %04x:%04x driver prepare failed -- %s (%d)", diff --git a/usbclerktest.cpp b/usbclerktest.cpp index d16a70c..cdff143 100644 --- a/usbclerktest.cpp +++ b/usbclerktest.cpp @@ -1,13 +1,15 @@ #include <stdio.h> #include <tchar.h> #include "usbcommon.h" -
+ int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { HANDLE pipe; - USBDevInfo dev; + USBClerkDevInfo dev = {{USB_CLERK_MAGIC, USB_CLERK_VERSION, + USB_CLERK_DEV_INFO, sizeof(USBClerkDevInfo)}}; + USBClerkAck ack; DWORD pipe_mode; - DWORD bytes, ack = 0; + DWORD bytes = 0; if (argc < 3 || !swscanf_s(argv[1], L"%hx", &dev.vid) || !swscanf_s(argv[2], L"%hx", &dev.pid)) { @@ -18,12 +20,12 @@ int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) 0, NULL, OPEN_EXISTING, 0, NULL); if (pipe == INVALID_HANDLE_VALUE) { printf("Cannot open pipe %S: %d\n", USB_CLERK_PIPE_NAME, GetLastError()); - return 1;
+ return 1; } pipe_mode = PIPE_READMODE_MESSAGE | PIPE_WAIT; if (!SetNamedPipeHandleState(pipe, &pipe_mode, NULL, NULL)) { printf("SetNamedPipeHandleState() failed: %d\n", GetLastError()); - return 1;
+ return 1; } printf("Signing & installing %04x:%04x\n", dev.vid, dev.pid); if (!TransactNamedPipe(pipe, &dev, sizeof(dev), &ack, sizeof(ack), &bytes, NULL)) { @@ -32,7 +34,13 @@ int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) return 1; } CloseHandle(pipe); - if (ack) { + if (ack.hdr.magic != USB_CLERK_MAGIC || ack.hdr.type != USB_CLERK_ACK || + ack.hdr.size != sizeof(USBClerkAck)) { + printf("Unknown message received, magic 0x%x type %u size %u", + ack.hdr.magic, ack.hdr.type, ack.hdr.size); + return 1; + } + if (ack.ack) { printf("winusb driver install succeed"); } else { printf("winusb driver install failed"); diff --git a/usbcommon.h b/usbcommon.h index aabbb1a..7ef6377 100644 --- a/usbcommon.h +++ b/usbcommon.h @@ -3,11 +3,32 @@ #include <windows.h> -#define USB_CLERK_PIPE_NAME TEXT("\\\\.\\pipe\\usbclerkpipe") +#define USB_CLERK_PIPE_NAME TEXT("\\\\.\\pipe\\usbclerkpipe") +#define USB_CLERK_MAGIC 0xDADA +#define USB_CLERK_VERSION 0x0001 -typedef struct USBDevInfo { - WORD vid; - WORD pid; -} USBDevInfo; +typedef struct USBClerkHeader { + UINT16 magic; + UINT16 version; + UINT16 type; + UINT16 size; +} USBClerkHeader; + +enum { + USB_CLERK_DEV_INFO = 1, + USB_CLERK_ACK, + USB_CLERK_END_MESSAGE, +}; + +typedef struct USBClerkDevInfo { + USBClerkHeader hdr; + UINT16 vid; + UINT16 pid; +} USBClerkDevInfo; + +typedef struct USBClerkAck { + USBClerkHeader hdr; + UINT16 ack; +} USBClerkAck; #endif |