summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnon Gilboa <agilboa@redhat.com>2012-04-24 10:39:32 +0300
committerArnon Gilboa <agilboa@redhat.com>2012-04-24 10:39:32 +0300
commit6c7b02a07022188b94b3f77e8c73106f1461e16d (patch)
treea745d9bbc97c16c3bb35abf1a6f5579d14345049
parentd690f13c581d28dd867ad9fd869cfc696d39fbb1 (diff)
usbclerk: define protocol
-rw-r--r--usbclerk.cpp34
-rw-r--r--usbclerktest.cpp20
-rw-r--r--usbcommon.h31
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