From 3dc6982b247fb635490ceef7eeef20db2a2d981d Mon Sep 17 00:00:00 2001 From: arjanmels Date: Wed, 16 Feb 2011 22:33:21 +0000 Subject: [PATCH] Addition by Arjan Mels on 16 Feb 2011: I modified the build script and code slightly to allow a x64 driver to compile. I have tested this and it works, there are some issues however: 1) x64 drivers for Vista & Windows 7 need to be signed with a special type of code signing certificate (kernel mode driver code signing certificate) otherwise they will not operate. Workaround in a administrative command prompt enter: "bcdedit /set testsigning on" Now all drivers will be accepted: THIS IS A SECURITY RISK I will try to get a version signed by the people of ReactOS (http://reactos.org/wiki/Driver_Signing) 2) Mass Storage USB devices do not work for me under Window 7 x64 (It is not clear to me yet if it is due to x64 or Windows 7). Other USB devices do work. --- userspace/MAKEFILE.INC | 1 + userspace/README | 19 +++++ userspace/USAGE | 16 ++++- userspace/USBIPEnum.inf | 80 +++++++++++++++++++++ userspace/USBIP_TestCert.cer | Bin 0 -> 540 bytes userspace/USBIP_TestCert.pfx | Bin 0 -> 1750 bytes userspace/USBIP_TestCert.pvk | Bin 0 -> 620 bytes userspace/Wmi.c | 26 ------- userspace/b.bat | 29 ++++++-- userspace/busenum.c | 110 ++++++++++++----------------- userspace/busenum.h | 36 +++------- userspace/busenum.rc | 10 ++- userspace/buspdo.c | 28 +------- userspace/createcert.bat | 7 ++ userspace/driver.h | 25 ------- userspace/i.bat | 10 ++- userspace/output/USBIPEnum.inf | 80 +++++++++++++++++++++ userspace/output/USBIPEnum_x64.sys | Bin 0 -> 48824 bytes userspace/output/USBIPEnum_x86.sys | Bin 0 -> 39736 bytes userspace/output/usbipenum.cat | Bin 0 -> 4911 bytes userspace/pnp.c | 50 +++---------- userspace/power.c | 33 --------- userspace/r.bat | 4 +- userspace/sources | 6 +- 24 files changed, 315 insertions(+), 255 deletions(-) create mode 100644 userspace/USBIPEnum.inf create mode 100644 userspace/USBIP_TestCert.cer create mode 100644 userspace/USBIP_TestCert.pfx create mode 100644 userspace/USBIP_TestCert.pvk create mode 100644 userspace/createcert.bat create mode 100644 userspace/output/USBIPEnum.inf create mode 100644 userspace/output/USBIPEnum_x64.sys create mode 100644 userspace/output/USBIPEnum_x86.sys create mode 100644 userspace/output/usbipenum.cat diff --git a/userspace/MAKEFILE.INC b/userspace/MAKEFILE.INC index be0609b1..bf5a2af7 100755 --- a/userspace/MAKEFILE.INC +++ b/userspace/MAKEFILE.INC @@ -4,3 +4,4 @@ $(OBJ_PATH)\$(O)\busenum.bmf : busenum.mof + diff --git a/userspace/README b/userspace/README index 858336c8..cda9da3e 100644 --- a/userspace/README +++ b/userspace/README @@ -1,3 +1,22 @@ +Addition by Arjan Mels on 16 Feb 2011: + +I modified the build script and code slightly to allow a x64 driver to compile. +I have tested this and it works, there are some issues however: + +1) x64 drivers for Vista & Windows 7 need to be signed with a special type of + code signing certificate (kernel mode driver code signing certificate) + otherwise they will not operate. + Workaround in a administrative command prompt enter: "bcdedit /set testsigning on" + Now all drivers will be accepted: THIS IS A SECURITY RISK + I will try to get a version signed by the people of ReactOS + (http://reactos.org/wiki/Driver_Signing) + +2) Mass Storage USB devices do not work for me under Window 7 x64 (It is not clear to + me yet if it is due to x64 or Windows 7). Other USB devices do work. + + +Original by Lepton Wu: + Because I haven't implemented all the interfaces that a windows usb bus driver should provided, and perhaps some bug in my code, so some devices won't work now. diff --git a/userspace/USAGE b/userspace/USAGE index df4f0879..8b10bbcf 100755 --- a/userspace/USAGE +++ b/userspace/USAGE @@ -8,10 +8,24 @@ To install the virtual usb bus driver on Windows XP: 6. Select 'Install the hardware that I manually select from a list(Advanced)', and then click next. 7. Select 'System Devices', then click Next. 8. Click 'Have Disk', click 'Browse', choose the uncompressed directory, and click OK. -9. Click on the 'Virtual USB Bus Enumerator', and then click Next. +9. Click on the 'USB/IP Enumerator', and then click Next. 10. At 'The wizard is ready to install your hardware', click Next. 11. Click Finish at 'Completing the Add/Remove Hardware Wizard.' +For Window 7 : +1. For x64 allow unsigned drivers: Enter "bcdedit /set testsigning on" in an administrative cmd window +2. Uncompress the downloaded binary package to a directory. +3. Start a the Device Manager +4. Click Any hardware node +5. Choose "Add Legacy Hardware" from the "Action" menu +6. At the 'Welcome to the Add Hardware Wizard', click 'Next'. +7. Select 'Install the hardware that I manually select from the list' +8. click 'Next' +9. Click 'Have Disk', click 'Browse', choose the uncompressed directory, and click OK. +10. Click on the 'USB/IP Enumerator', and then click Next. +11. At 'The wizard is ready to install your hardware', click Next. +12. Click Finish at 'Completing the Add/Remove Hardware Wizard.' + To use it: 1. open a command prompt window, cd to the uncompressed directory. diff --git a/userspace/USBIPEnum.inf b/userspace/USBIPEnum.inf new file mode 100644 index 00000000..ba56ce89 --- /dev/null +++ b/userspace/USBIPEnum.inf @@ -0,0 +1,80 @@ +;/*++ +; +; INF file for installing USB/IP bus enumerator driver +; +;--*/ +[Version] +Signature="$WINDOWS NT$" +Class=System +ClassGuid={4D36E97D-E325-11CE-BFC1-08002BE10318} +Provider=%OpenSource% +DriverVer=02/13/2011,0.1.0.0 +CatalogFile=USBIPEnum.cat + +[Manufacturer] +%StdMfg%=Standard +%StdMfg%=Standard,NTamd64 + +[Standard] +%DeviceDesc%=USBIP_Device, root\USBIPEnum + +[Standard.NTamd64] +%DeviceDesc%=USBIP_Device, root\USBIPEnum + +[DestinationDirs] +DefaultDestDir = 12 + +[SourceDisksNames] +1 = %DiskId1%,,,"" + +[SourceDisksFiles] +USBIPEnum_x86.sys = 1,, +USBIPEnum_x64.sys = 1,, + +[Drivers_Dir_x86] +USBIPEnum.sys,USBIPEnum_x86.sys + +[Drivers_Dir_x64] +USBIPEnum.sys,USBIPEnum_x64.sys + +[USBIP_Device] +CopyFiles=Drivers_Dir_x86 + +[USBIP_Device.NTamd64] +CopyFiles=Drivers_Dir_x64 + +[USBIP_Device.NT.HW] +AddReg=USBIP_Device_AddReg + +[USBIP_Device.NTamd64.HW] +AddReg=USBIP_Device_AddReg + +[USBIP_Device_AddReg] +HKR,,DeviceCharacteristics,0x10001,0x0100 ; Use same security checks on relative opens +HKR,,Security,,"D:P(A;;GA;;;BA)(A;;GA;;;SY)" ; Allow generic-all access to Built-in administrators and Local system + +;-------------- Service installation +[USBIP_Device.Services] +AddService = USBIPEnum,%SPSVCINST_ASSOCSERVICE%, USBIP_Service_Inst + +[USBIP_Device.NTamd64.Services] +AddService = USBIPEnum,%SPSVCINST_ASSOCSERVICE%, USBIP_Service_Inst + +; -------------- busenum driver install sections +[USBIP_Service_Inst] +DisplayName = %ServiceDesc% +ServiceType = 1 ; SERVICE_KERNEL_DRIVER +StartType = 3 ; SERVICE_DEMAND_START +ErrorControl = 1 ; SERVICE_ERROR_NORMAL +ServiceBinary = %12%\USBIPEnum.sys +LoadOrderGroup = Extended Base + + +[Strings] +SPSVCINST_ASSOCSERVICE= 0x00000002 +OpenSource = "Open Source" +StdMfg = "(Standard system devices)" +DiskId1 = "USB/IP Enumerator Disk" +DeviceDesc = "USB/IP Enumerator" +ServiceDesc = "USB/IP Enumerator Service" + diff --git a/userspace/USBIP_TestCert.cer b/userspace/USBIP_TestCert.cer new file mode 100644 index 0000000000000000000000000000000000000000..aa59a71a5c448a7d09f717cceb52f46b3915e8f6 GIT binary patch literal 540 zcmXqLVv;auVr*T&%*4pVBp??qSd}`_XNQ|ttKMpXzTF0#Y^>UR%uKSZ3;AP{~YV&CO&dbQi$jZRn*vnwh*vZt`$guq29@{@pPpO<2v)-jW z<>^AVY5}!Sj_6fv%%_*jhwfVFqwdJJ-u16Q^{NA#hQS{_U- zFq*tjg&2=E;R|hMpl3t;vj4E}^?0N5?E(9vJ|LoWN~u!&K)rHVe4Mz% z(zlP-|0r4c_MeTL@ZJzTr5;|1k84*{-OOF^X!YzfZ12A{axI?yc-J1QmOGW#)w5kU yWpv7XlM2b7m%YIE+WA86XZFfEJpt)bmw)fLy!_WynTyekf~^l&bo1r@XaN8!$ized literal 0 HcmV?d00001 diff --git a/userspace/USBIP_TestCert.pfx b/userspace/USBIP_TestCert.pfx new file mode 100644 index 0000000000000000000000000000000000000000..65a178a17dcdc6425596e6726774cc22ab99e6df GIT binary patch literal 1750 zcmY*Yc{tQ*9DnC9vqPq)9aqj)SfpkU-bXB0bmheoF^ z=5JH(dsbmD1?C7ly~FfFR#II0yf!On3Qoc#-Zr|d)of(W_lmz(1lAP2?9^f9H@0bd z>@=y{VLwX(GwL;!8E$>7IKO_bK2)pWZJg&P31{O&ZA;1za(m+{N(wCR_+iQq^+ue2 zC8&Lz_-@0nPPJHS3e~KYQ;t%qVmvfG@%-h9!=jT-=vrG@qr7~{#pZC0fU?f+fWTkg zJaSKw8C}2T!iaawUxO1+Nkz^%RZAmm+d-8VG3T4jTXi+o;tHK4_|9O;p*7maFD}IrjXC4 za&!acHmnS`uRGN!O5Y!B(A9sJ^deiNPYS~YNouIfhOSNB@JL+d$qH!|?lo5#G@#|R z$2JkWOg}i;ced@Ghu=-v!A_WG1VVlN{IY6D5JxOmQCDRsxy6~~yr#~LV&la`xX79#& z?jv)Qer*Jun8)9z`drObotxnsHb)g<&NEA+J1<_Zlw8fI1H&4O-+C(Y8fI|fZMov% zRjFeuH3c?uV12jtWLRVWZ+1y{V#53iw$zceua+d+KVF~M9Bw~Yw}v7Q=q)l~Qjhj) z+_ftSMIQdsTAp&B#dr|gArYoT!1qO1py!iM1xpp2Z1=C0^Ff< zhlv8gQ1uOj6TumXi-zhL;1A)D&s{3O^|LP?ssaHG#1Lrz&BPOrD;@F351ZaREq!6JM0A-T< z?;tb^iYW)8Zoy#yy7K;0VE+p)YA3jF-WO9cY_R;D;HJ^xA({fVdh)^Wy9HmuWtwjF z&uJUmQ>^FDX|*Ep7abK|XP;QKj5s> z{=?JR8Y>)a?%Tbt16BRqOOzzRPph))1Gn`o3f&Oa{_nQk#M~BE+||$8PRAA7R56y0 zKFGW6D`Er{=`G4{opzT`Tjok*+(yG$hCdV<851apv_Ex_Wfm{;7t=eIez9k0W<|6q zJkiNOjhhLDa^J*G5z?c^PFbdJ1#ng9*#7UjJfEHGSoO)$94#1bJjo+Yp3Tz!IOG!F zTa6Lvl$DcAo`zMHZ>zb!gSY1gy;3@E%b}(&Gc%8v8w{EI*FQ}%id=Af&LxbITxeg( z3GA;p*c=$Ox}osH_tchh_1NEgF znn`w?l*tm$ZiC$%;jS8g8~L@xZdf$cxUz&bWzGI$I^XLU!x z9)$4~4>L0>g3ovr%{<}<5s!_&xtCns;oXCGhwaJ=G_R6vVR^evTF~VLDSG_5X9Exyrab1sfUC9fFgqfu;<6EoiC`XHOoI`tuBU=e31Z4smC8mudn9 q3bCJf?=K8*v=v|mkoa!3SGtSyFS9N*Oq(dB4L{Lq3O=>-Q2zoB4Wn~sL<9cE%{ zJIF*Fp~ixiB!V~@&a+urAeX;i%L4|g zTL@Jq5PL?U<&-PBI~LC*%H{k$yuqj42^0X}8Va8p@M`&BoC8JtL={(WJA!qpwQTI=KArdqX}hq3DEf} zGVaMC&E62YnVojZ`s0BKKvDvWYG5#f4H0-PWXnn==?)B$ z&ycU2o2Wp2IrJF?0@N5Qrkex~gEBCH_7;H|9+wt6G`Z;j%y$lVhK2048v^U}+c!F|{KI9) zWX}~7L?+4I(d;{ORE?|*s%jW-?VeO>C)eX^jzAu diff --git a/userspace/b.bat b/userspace/b.bat index 2b427bc3..2db2a5f3 100755 --- a/userspace/b.bat +++ b/userspace/b.bat @@ -1,4 +1,25 @@ -devcon remove "root\busenum" -build -if exist objchk_wxp_x86\i386\busenum.sys copy objchk_wxp_x86\i386\busenum.sys . -if exist objchk_wxp_x86\i386\busenum.sys devcon install bus.inf "root\busenum" +rem batch file to build complete drivers: output will be put in output directory + +rem build 32-bit version in XP environment +rem build 64-bit version in Windows Server 2003 environment + +set OCD=%CD% + +cmd /C "set DDKBUILDENV=&& %NTMAKEENV%/setenv %BASEDIR% fre WXP && cd /d %OCD% && build" +cmd /C "set DDKBUILDENV=&& %NTMAKEENV%/setenv %BASEDIR% fre x64 WNET && cd /d %OCD% && build" + +rem copy files to output folder +del /Q output +mkdir output +copy USBIPEnum.inf output +copy objfre_wxp_x86\i386\USBIPEnum.sys output\USBIPEnum_x86.sys +copy objfre_wnet_amd64\amd64\USBIPEnum.sys output\USBIPEnum_x64.sys + +rem sign files and create catalog file +signtool sign /f USBIP_TestCert.pfx /t http://timestamp.verisign.com/scripts/timestamp.dll output\USBIPEnum_x86.sys +signtool sign /f USBIP_TestCert.pfx /t http://timestamp.verisign.com/scripts/timestamp.dll output\USBIPEnum_x64.sys + +inf2cat /driver:output /os:XP_x86,XP_x64,Server2003_X86,Server2003_X64,Vista_X86,Vista_X64,Server2008_X86,Server2008_X64,7_X86,7_X64,Server2008R2_X64 + +signtool sign /f USBIP_TestCert.pfx /t http://timestamp.verisign.com/scripts/timestamp.dll output\USBIPEnum.cat + diff --git a/userspace/busenum.c b/userspace/busenum.c index da37fbbd..aa365518 100755 --- a/userspace/busenum.c +++ b/userspace/busenum.c @@ -1,31 +1,3 @@ -/*++ - -Copyright (c) 1990-2000 Microsoft Corporation All Rights Reserved - -Module Name: - - BUSENUM.C - -Abstract: - - This module contains the entry points for a toaster bus driver. - -Author: - - -Environment: - - kernel mode only - -Revision History: - - Cleaned up sample 05/05/99 - Fixed the create_close and ioctl handler to fail the request - sent on the child stack - 3/15/04 - - ---*/ - #include "busenum.h" @@ -307,11 +279,11 @@ int post_select_interface(PPDO_DEVICE_DATA pdodata, struct _URB_SELECT_INTERFACE * req); -static void copy_iso_data(char *dest, int dest_len, - char *src, int src_len, struct _URB_ISOCH_TRANSFER *urb) +static void copy_iso_data(char *dest, ULONG dest_len, + char *src, ULONG src_len, struct _URB_ISOCH_TRANSFER *urb) { - int i; - int offset; + ULONG i; + ULONG offset; offset=0; for(i=0;iNumberOfPackets;i++){ if(!urb->IsoPacket[i].Length) @@ -345,14 +317,16 @@ int process_write_irp(PPDO_DEVICE_DATA pdodata, PIRP irp) struct usbip_header *h; PIRP ioctl_irp=NULL; char *buf; - int in, type, i; + int in, type; + ULONG i; /* This is a quick hack, in windows, the offsets of all types of * TansferFlags and TransferBuffer and TransferBufferLength are the same, * so we just use _URB_ISOCH_TRANSFER */ struct _URB_ISOCH_TRANSFER *urb; struct usbip_iso_packet_descriptor * ip_desc; NTSTATUS ioctl_status = STATUS_INVALID_PARAMETER; - int found=0, iso_len=0, in_len=0, send; + int found=0, iso_len=0, send; + ULONG in_len=0; struct urb_req * urb_r; irpstack = IoGetCurrentIrpStackLocation (irp); @@ -435,7 +409,7 @@ int process_write_irp(PPDO_DEVICE_DATA pdodata, PIRP irp) case URB_FUNCTION_SELECT_INTERFACE: in=0; type=USB_ENDPOINT_TYPE_CONTROL; - if(post_select_interface(pdodata, urb)!=STATUS_SUCCESS) + if(post_select_interface(pdodata, (struct _URB_SELECT_INTERFACE *)urb)!=STATUS_SUCCESS) goto end; break; default: @@ -443,7 +417,7 @@ int process_write_irp(PPDO_DEVICE_DATA pdodata, PIRP irp) urb->Hdr.Function)); goto end; } - if(h->u.ret_submit.actual_length > urb->TransferBufferLength){ + if((ULONG)h->u.ret_submit.actual_length > urb->TransferBufferLength){ KdPrint(("Warning, ret too big %d %d!\n", h->u.ret_submit.actual_length, urb->TransferBufferLength)); @@ -508,11 +482,11 @@ int process_write_irp(PPDO_DEVICE_DATA pdodata, PIRP irp) goto end; } if(iso_len && in_len != urb->TransferBufferLength) - copy_iso_data(buf, urb->TransferBufferLength, h+1, in_len, urb); + copy_iso_data(buf, urb->TransferBufferLength, (char*)(h+1), in_len, urb); else RtlCopyMemory(buf, h+1, in_len); if(NULL==pdodata->dev_config) - try_save_config(pdodata, urb, in_len); + try_save_config(pdodata, (struct _URB_CONTROL_DESCRIPTOR_REQUEST *)urb, in_len); } urb->Hdr.Status = tran_usb_status(h->u.ret_submit.status, in, type); KdPrint(("Sucess Finish URB FUNC:%d %s %s len:%d ret:%d\n", urb->Hdr.Function, @@ -651,7 +625,7 @@ if (len < sizeof(*h) || NULL == buf) \ return STATUS_BUFFER_TOO_SMALL; \ -int prepare_reset_dev(char *buf, int len, int *copied, unsigned long seqnum, +int prepare_reset_dev(char *buf, int len, ULONG_PTR *copied, unsigned long seqnum, unsigned int devid) { struct usbip_header * h = (struct usbip_header * ) buf; @@ -665,11 +639,11 @@ int prepare_reset_dev(char *buf, int len, int *copied, unsigned long seqnum, } int prepare_select_config_urb(struct _URB_SELECT_CONFIGURATION *req, - char *buf, int len, int *copied, unsigned long seqnum, + char *buf, int len, ULONG_PTR *copied, unsigned long seqnum, unsigned int devid) { struct usbip_header * h = (struct usbip_header * ) buf; - struct usb_ctrl_setup * setup=h->u.cmd_submit.setup; + struct usb_ctrl_setup * setup=(struct usb_ctrl_setup *)h->u.cmd_submit.setup; int in=0; *copied = 0; @@ -691,11 +665,11 @@ int prepare_select_config_urb(struct _URB_SELECT_CONFIGURATION *req, } int prepare_select_interface_urb(struct _URB_SELECT_INTERFACE *req, - char *buf, int len, int *copied, unsigned long seqnum, + char *buf, int len, ULONG_PTR *copied, unsigned long seqnum, unsigned int devid) { struct usbip_header * h = (struct usbip_header * ) buf; - struct usb_ctrl_setup * setup=h->u.cmd_submit.setup; + struct usb_ctrl_setup * setup=(struct usb_ctrl_setup * )h->u.cmd_submit.setup; int in=0; *copied = 0; @@ -717,12 +691,12 @@ int prepare_select_interface_urb(struct _URB_SELECT_INTERFACE *req, } int prepare_class_vendor_urb(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST *req, - char *buf, int len, int *copied, unsigned long seqnum, + char *buf, size_t len, ULONG_PTR *copied, unsigned long seqnum, unsigned int devid) { struct usbip_header * h = (struct usbip_header * ) buf; - struct usb_ctrl_setup * setup=h->u.cmd_submit.setup; - int in=req->TransferFlags & USBD_TRANSFER_DIRECTION_IN, type, recip; + struct usb_ctrl_setup * setup=(struct usb_ctrl_setup *)h->u.cmd_submit.setup; + char in=req->TransferFlags & USBD_TRANSFER_DIRECTION_IN, type, recip; *copied = 0; KdPrint(("flag:%d pbuf:%p len:%d RequestTypeReservedBits:%02x" @@ -777,7 +751,7 @@ int prepare_class_vendor_urb(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST *req, in, type, recip, req->Request); //FIXME what is the usage of RequestTypeReservedBits? - setup->wLength = req->TransferBufferLength; + setup->wLength = (unsigned short)req->TransferBufferLength; setup->wValue = req->Value; setup->wIndex = req->Index; @@ -791,11 +765,11 @@ int prepare_class_vendor_urb(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST *req, } int prepare_get_intf_descriptor_urb(struct _URB_CONTROL_DESCRIPTOR_REQUEST * req, - char *buf, int len, int *copied, unsigned long seqnum, + char *buf, int len, ULONG_PTR *copied, unsigned long seqnum, unsigned int devid) { struct usbip_header * h = (struct usbip_header * ) buf; - struct usb_ctrl_setup * setup=h->u.cmd_submit.setup; + struct usb_ctrl_setup * setup=(struct usb_ctrl_setup *)h->u.cmd_submit.setup; *copied = 0; CHECK_SIZE_READ @@ -808,7 +782,7 @@ int prepare_get_intf_descriptor_urb(struct _URB_CONTROL_DESCRIPTOR_REQUEST * req USBIP_DIR_IN, BMREQUEST_STANDARD, BMREQUEST_TO_INTERFACE, USB_REQUEST_GET_DESCRIPTOR); - setup->wLength = req->TransferBufferLength; + setup->wLength = (unsigned short)req->TransferBufferLength; setup->wValue = (req->DescriptorType<<8)|req->Index; KdPrint(("pbuf:%p len:%d Index:%02x" @@ -824,11 +798,11 @@ int prepare_get_intf_descriptor_urb(struct _URB_CONTROL_DESCRIPTOR_REQUEST * req } int prepare_get_dev_descriptor_urb( struct _URB_CONTROL_DESCRIPTOR_REQUEST * req, - char *buf, int len, int *copied, unsigned long seqnum, + char *buf, int len, ULONG_PTR *copied, unsigned long seqnum, unsigned int devid) { struct usbip_header * h = (struct usbip_header * ) buf; - struct usb_ctrl_setup * setup=h->u.cmd_submit.setup; + struct usb_ctrl_setup * setup=(struct usb_ctrl_setup *)h->u.cmd_submit.setup; *copied = 0; CHECK_SIZE_READ @@ -841,7 +815,7 @@ int prepare_get_dev_descriptor_urb( struct _URB_CONTROL_DESCRIPTOR_REQUEST * req USBIP_DIR_IN, BMREQUEST_STANDARD, BMREQUEST_TO_DEVICE, USB_REQUEST_GET_DESCRIPTOR); - setup->wLength = req->TransferBufferLength; + setup->wLength = (unsigned short)req->TransferBufferLength; setup->wValue = (req->DescriptorType<<8) |req->Index<<8; switch(req->DescriptorType){ @@ -860,14 +834,15 @@ int prepare_get_dev_descriptor_urb( struct _URB_CONTROL_DESCRIPTOR_REQUEST * req } int prepare_iso_urb(struct _URB_ISOCH_TRANSFER * req, - char *buf, int len, int *copied, unsigned long seqnum, + char *buf, size_t len, ULONG_PTR *copied, unsigned long seqnum, unsigned int devid) { struct usbip_header * h = (struct usbip_header * ) buf; struct usbip_iso_packet_descriptor * ip_desc; int in = pipe2direct(req->PipeHandle); int type = pipe2type(req->PipeHandle); - int i, offset, last_len; + ULONG i, offset; + int last_len; char *p; *copied = 0; @@ -941,7 +916,7 @@ int prepare_iso_urb(struct _URB_ISOCH_TRANSFER * req, } int prepare_bulk_urb(struct _URB_BULK_OR_INTERRUPT_TRANSFER * req, - char *buf, int len, int *copied, unsigned long seqnum, + char *buf, size_t len, ULONG_PTR *copied, unsigned long seqnum, unsigned int devid) { struct usbip_header * h = (struct usbip_header * ) buf; @@ -1309,7 +1284,7 @@ static void * seek_to_next_desc(PUSB_CONFIGURATION_DESCRIPTOR config, unsigned i do { if(o + sizeof(*desc) > config->wTotalLength) return NULL; - desc=(char *)config + o; + desc=(PUSB_COMMON_DESCRIPTOR)((char *)config + o); if(desc->bLength + o > config->wTotalLength) return NULL; o+=desc->bLength; @@ -1365,7 +1340,7 @@ void set_pipe(PUSBD_PIPE_INFORMATION pipe, PUSB_ENDPOINT_DESCRIPTOR ep_desc, unsigned char speed) { - int mult; + USHORT mult; pipe->MaximumPacketSize = ep_desc->wMaxPacketSize; pipe->EndpointAddress = ep_desc->bEndpointAddress; pipe->Interval = ep_desc->bInterval; @@ -1423,7 +1398,7 @@ int post_select_interface(PPDO_DEVICE_DATA pdodata, intf->NumberOfPipes = i; intf_desc = seek_to_one_intf_desc( - pdodata->dev_config, + (PUSB_CONFIGURATION_DESCRIPTOR)pdodata->dev_config, &offset, intf->InterfaceNumber, intf->AlternateSetting); /* FIXME if alternatesetting, we sound send out a ctrl urb ? */ @@ -1442,7 +1417,7 @@ int post_select_interface(PPDO_DEVICE_DATA pdodata, if(intf->Pipes[i].MaximumTransferSize > 65536) return STATUS_INVALID_PARAMETER; ep_desc = seek_to_next_desc( - pdodata->dev_config, + (PUSB_CONFIGURATION_DESCRIPTOR)pdodata->dev_config, &offset, USB_ENDPOINT_DESCRIPTOR_TYPE); if(NULL==ep_desc){ KdPrint(("Warning, no ep desc\n")); @@ -1503,7 +1478,7 @@ int proc_select_config(PPDO_DEVICE_DATA pdodata, return STATUS_SUCCESS; } intf_desc = seek_to_one_intf_desc( - pdodata->dev_config, + (PUSB_CONFIGURATION_DESCRIPTOR)pdodata->dev_config, &offset, intf->InterfaceNumber, intf->AlternateSetting); if(NULL==intf_desc){ @@ -1539,7 +1514,7 @@ int proc_select_config(PPDO_DEVICE_DATA pdodata, show_pipe(j, &intf->Pipes[j]); ep_desc = seek_to_next_desc( - pdodata->dev_config, + (PUSB_CONFIGURATION_DESCRIPTOR)pdodata->dev_config, &offset, USB_ENDPOINT_DESCRIPTOR_TYPE); if(NULL==ep_desc){ @@ -1550,8 +1525,8 @@ int proc_select_config(PPDO_DEVICE_DATA pdodata, set_pipe(&intf->Pipes[j], ep_desc, pdodata->speed); show_pipe(j, &intf->Pipes[j]); } - intf=(char *)intf + sizeof(*intf) + (intf->NumberOfPipes - 1)* - sizeof(intf->Pipes[0]); + intf=(USBD_INTERFACE_INFORMATION *)((char *)intf + sizeof(*intf) + (intf->NumberOfPipes - 1)* + sizeof(intf->Pipes[0])); } /* it seems we must return now */ return STATUS_SUCCESS; @@ -1559,7 +1534,7 @@ int proc_select_config(PPDO_DEVICE_DATA pdodata, void show_iso_urb(struct _URB_ISOCH_TRANSFER * iso) { - int i; + ULONG i; KdPrint(("iso_num:%d len:%d", iso->NumberOfPackets, iso->TransferBufferLength)); @@ -1612,6 +1587,8 @@ int proc_urb(PPDO_DEVICE_DATA pdodata, void *arg) return STATUS_INVALID_PARAMETER; } +DRIVER_CANCEL cancel_irp; + void cancel_irp(PDEVICE_OBJECT pdo, PIRP Irp) { PLIST_ENTRY le = NULL; @@ -1621,7 +1598,7 @@ void cancel_irp(PDEVICE_OBJECT pdo, PIRP Irp) KIRQL oldirql = Irp->CancelIrql; pdodata = (PPDO_DEVICE_DATA) pdo->DeviceExtension; - IoReleaseCancelSpinLock(DISPATCH_LEVEL); +// IoReleaseCancelSpinLock(DISPATCH_LEVEL); KdPrint(("Cancle Irp %p called", Irp)); KeAcquireSpinLockAtDpcLevel(&pdodata->q_lock); for (le = pdodata->ioctl_q.Flink; @@ -1642,6 +1619,7 @@ void cancel_irp(PDEVICE_OBJECT pdo, PIRP Irp) } Irp->IoStatus.Status = STATUS_CANCELLED; IoCompleteRequest(Irp, IO_NO_INCREMENT); + IoReleaseCancelSpinLock(Irp->CancelIrql); } int try_addq(PPDO_DEVICE_DATA pdodata, PIRP Irp) diff --git a/userspace/busenum.h b/userspace/busenum.h index 22915cb5..9eaf898a 100755 --- a/userspace/busenum.h +++ b/userspace/busenum.h @@ -1,29 +1,3 @@ -/*++ - -Copyright (c) 1990-2000 Microsoft Corporation All Rights Reserved - -Module Name: - - BUSENUM.H - -Abstract: - - This module contains the common private declarations - for the Toaster Bus enumerator. - -Author: - -Environment: - - kernel mode only - -Notes: - - -Revision History: - - ---*/ #include #include // required for WMILIB_CONTEXT #include // required for GUID definitions @@ -438,6 +412,8 @@ DRIVER_DISPATCH Bus_SendIrpSynchronously; __drv_dispatchType(IRP_MJ_PNP) DRIVER_DISPATCH Bus_PnP; +IO_COMPLETION_ROUTINE Bus_CompletionRoutine; + NTSTATUS Bus_CompletionRoutine( __in PDEVICE_OBJECT DeviceObject, @@ -633,6 +609,8 @@ Bus_WmiDeRegistration ( __drv_dispatchType(IRP_MJ_SYSTEM_CONTROL) DRIVER_DISPATCH Bus_SystemControl; +WMI_SET_DATAITEM_CALLBACK Bus_SetWmiDataItem; + NTSTATUS Bus_SetWmiDataItem( __in PDEVICE_OBJECT DeviceObject, @@ -644,6 +622,8 @@ Bus_SetWmiDataItem( __in_bcount(BufferSize) PUCHAR Buffer ); +WMI_SET_DATABLOCK_CALLBACK Bus_SetWmiDataBlock; + NTSTATUS Bus_SetWmiDataBlock( __in PDEVICE_OBJECT DeviceObject, @@ -654,6 +634,8 @@ Bus_SetWmiDataBlock( __in_bcount(BufferSize) PUCHAR Buffer ); +WMI_QUERY_DATABLOCK_CALLBACK Bus_QueryWmiDataBlock; + NTSTATUS Bus_QueryWmiDataBlock( __in PDEVICE_OBJECT DeviceObject, @@ -666,6 +648,8 @@ Bus_QueryWmiDataBlock( __out_bcount(BufferAvail) PUCHAR Buffer ); +WMI_QUERY_REGINFO_CALLBACK Bus_QueryWmiRegInfo; + NTSTATUS Bus_QueryWmiRegInfo( __in PDEVICE_OBJECT DeviceObject, diff --git a/userspace/busenum.rc b/userspace/busenum.rc index 6ebfee95..e4698312 100755 --- a/userspace/busenum.rc +++ b/userspace/busenum.rc @@ -4,9 +4,13 @@ #define VER_FILETYPE VFT_DLL #define VER_FILESUBTYPE VFT2_UNKNOWN -#define VER_FILEDESCRIPTION_STR "Virtual USB Bus Enumerator" -#define VER_INTERNALNAME_STR "busenum.sys" -#define VER_ORIGINALFILENAME_STR "busenum.sys" +#define VER_FILEDESCRIPTION_STR "USB/IP Enumerator" +#define VER_INTERNALNAME_STR "USBIPEnum.sys" +#define VER_ORIGINALFILENAME_STR "USBIPEnum.sys" +#define VER_PRODUCTVERSION 0.1.0.0 +#define VER_PRODUCTVERSION_STR "0.1.0.0" +#define VER_LEGALCOPYRIGHT_STR "Open Source Software" +#define VER_PRODUCTNAME_STR "USB/IP" #include "common.ver" diff --git a/userspace/buspdo.c b/userspace/buspdo.c index 969a05f5..eefcabfd 100755 --- a/userspace/buspdo.c +++ b/userspace/buspdo.c @@ -1,29 +1,3 @@ -/*++ - -Copyright (c) 1990-2000 Microsoft Corporation All Rights Reserved - -Module Name: - - BusPdo.c - -Abstract: - - This module handles plug & play calls for the child PDO. - -Author: - -Environment: - - kernel mode only - -Notes: - - -Revision History: - - ---*/ - #include "busenum.h" #include #include @@ -1249,7 +1223,7 @@ Bus_PDO_QueryInterface( bus_intf = (USB_BUS_INTERFACE_USBDI_V1 *) irpStack->Parameters.QueryInterface.Interface; - bus_intf->Size = valid_size[version]; + bus_intf->Size = (USHORT)valid_size[version]; switch(version){ case USB_BUSIF_USBDI_VERSION_1: bus_intf->IsDeviceHighSpeed = IsDeviceHighSpeed; diff --git a/userspace/createcert.bat b/userspace/createcert.bat new file mode 100644 index 00000000..ca6f1f45 --- /dev/null +++ b/userspace/createcert.bat @@ -0,0 +1,7 @@ + +makecert -r -pe -n "CN=USB/IP Test Certificate" -ss CA -sr CurrentUser -a sha1 -sky signature -sv USBIP_TestCert.pvk USBIP_TestCert.cer +pvk2pfx -pvk USBIP_TestCert.pvk -spc USBIP_TestCert.cer -pfx USBIP_TestCert.pfx + +rem certutil -user -addstore Root USBIP_TestCert.cer + +rem Bcdedit.exe /set TESTSIGNING ON diff --git a/userspace/driver.h b/userspace/driver.h index 5c152419..a7c17ccf 100755 --- a/userspace/driver.h +++ b/userspace/driver.h @@ -1,28 +1,3 @@ -/*++ -Copyright (c) 1990-2000 Microsoft Corporation All Rights Reserved - -Module Name: - - driver.h - -Abstract: - - This module contains the common declarations for the - bus, function and filter drivers. - -Author: -Environment: - - kernel mode only - -Notes: - - -Revision History: - - ---*/ - // // This guid is used in IoCreateDeviceSecure call to create PDOs. The idea is to // allow the administrators to control access to the child device, in case the diff --git a/userspace/i.bat b/userspace/i.bat index e51a5e6e..f8f62df5 100755 --- a/userspace/i.bat +++ b/userspace/i.bat @@ -1 +1,9 @@ -devcon install bus.inf "root\busenum" + +rem bcdedit /set testsigning on + +certutil -enterprise -addstore Root USBIP_TestCert.cer +certutil -enterprise -addstore TrustedPublisher USBIP_TestCert.cer + +cd output + +devcon install USBIPEnum.inf "root\USPIPEnum" diff --git a/userspace/output/USBIPEnum.inf b/userspace/output/USBIPEnum.inf new file mode 100644 index 00000000..ba56ce89 --- /dev/null +++ b/userspace/output/USBIPEnum.inf @@ -0,0 +1,80 @@ +;/*++ +; +; INF file for installing USB/IP bus enumerator driver +; +;--*/ +[Version] +Signature="$WINDOWS NT$" +Class=System +ClassGuid={4D36E97D-E325-11CE-BFC1-08002BE10318} +Provider=%OpenSource% +DriverVer=02/13/2011,0.1.0.0 +CatalogFile=USBIPEnum.cat + +[Manufacturer] +%StdMfg%=Standard +%StdMfg%=Standard,NTamd64 + +[Standard] +%DeviceDesc%=USBIP_Device, root\USBIPEnum + +[Standard.NTamd64] +%DeviceDesc%=USBIP_Device, root\USBIPEnum + +[DestinationDirs] +DefaultDestDir = 12 + +[SourceDisksNames] +1 = %DiskId1%,,,"" + +[SourceDisksFiles] +USBIPEnum_x86.sys = 1,, +USBIPEnum_x64.sys = 1,, + +[Drivers_Dir_x86] +USBIPEnum.sys,USBIPEnum_x86.sys + +[Drivers_Dir_x64] +USBIPEnum.sys,USBIPEnum_x64.sys + +[USBIP_Device] +CopyFiles=Drivers_Dir_x86 + +[USBIP_Device.NTamd64] +CopyFiles=Drivers_Dir_x64 + +[USBIP_Device.NT.HW] +AddReg=USBIP_Device_AddReg + +[USBIP_Device.NTamd64.HW] +AddReg=USBIP_Device_AddReg + +[USBIP_Device_AddReg] +HKR,,DeviceCharacteristics,0x10001,0x0100 ; Use same security checks on relative opens +HKR,,Security,,"D:P(A;;GA;;;BA)(A;;GA;;;SY)" ; Allow generic-all access to Built-in administrators and Local system + +;-------------- Service installation +[USBIP_Device.Services] +AddService = USBIPEnum,%SPSVCINST_ASSOCSERVICE%, USBIP_Service_Inst + +[USBIP_Device.NTamd64.Services] +AddService = USBIPEnum,%SPSVCINST_ASSOCSERVICE%, USBIP_Service_Inst + +; -------------- busenum driver install sections +[USBIP_Service_Inst] +DisplayName = %ServiceDesc% +ServiceType = 1 ; SERVICE_KERNEL_DRIVER +StartType = 3 ; SERVICE_DEMAND_START +ErrorControl = 1 ; SERVICE_ERROR_NORMAL +ServiceBinary = %12%\USBIPEnum.sys +LoadOrderGroup = Extended Base + + +[Strings] +SPSVCINST_ASSOCSERVICE= 0x00000002 +OpenSource = "Open Source" +StdMfg = "(Standard system devices)" +DiskId1 = "USB/IP Enumerator Disk" +DeviceDesc = "USB/IP Enumerator" +ServiceDesc = "USB/IP Enumerator Service" + diff --git a/userspace/output/USBIPEnum_x64.sys b/userspace/output/USBIPEnum_x64.sys new file mode 100644 index 0000000000000000000000000000000000000000..373ef5ead5f4e258a938d6d544d4ee0234a7c4ee GIT binary patch literal 48824 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 aYKO+Wl;Emg1RJP=l`?8?|1q;M?7smzslIyv literal 0 HcmV?d00001 diff --git a/userspace/output/USBIPEnum_x86.sys b/userspace/output/USBIPEnum_x86.sys new file mode 100644 index 0000000000000000000000000000000000000000..17ec4eb1c39a20382f7b09f41638267483dc2eb4 GIT binary patch literal 39736 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 literal 0 HcmV?d00001 diff --git a/userspace/output/usbipenum.cat b/userspace/output/usbipenum.cat new file mode 100644 index 0000000000000000000000000000000000000000..cbbe6387ff8861d83c24c900d4673c27b8a64cf9 GIT binary patch literal 4911 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 OReH-7h6^XDKKeHc(^5tN literal 0 HcmV?d00001 diff --git a/userspace/pnp.c b/userspace/pnp.c index 742e045a..9c3af705 100755 --- a/userspace/pnp.c +++ b/userspace/pnp.c @@ -1,35 +1,3 @@ -/*++ - -Copyright (c) Microsoft Corporation. All rights reserved. - - THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY - KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR - PURPOSE. - -Module Name: - - PNP.C - -Abstract: - - This module handles plug & play calls for the toaster bus controller FDO. - -Author: - - -Environment: - - kernel mode only - -Notes: - - -Revision History: - - ---*/ - #include "busenum.h" #include // for IoCreateDeviceSecure @@ -1030,6 +998,7 @@ void complete_pending_irp(PPDO_DEVICE_DATA pdodata) PLIST_ENTRY le; KIRQL oldirql; int count=0; + LARGE_INTEGER interval; //FIXME KdPrint(("finish pending irp")); @@ -1052,7 +1021,8 @@ void complete_pending_irp(PPDO_DEVICE_DATA pdodata) if(count>2){ KeReleaseSpinLock(&pdodata->q_lock, oldirql); KdPrint(("sleep 50ms, let pnp manager send irp")); - KeDelayExecutionThread(KernelMode, FALSE, -500000); + interval.QuadPart=-500000; + KeDelayExecutionThread(KernelMode, FALSE, &interval); KeRaiseIrql(DISPATCH_LEVEL, &oldirql); } else { KeReleaseSpinLock(&pdodata->q_lock, DISPATCH_LEVEL); @@ -1067,7 +1037,7 @@ void complete_pending_irp(PPDO_DEVICE_DATA pdodata) NTSTATUS Bus_DestroyPdo ( PDEVICE_OBJECT Device, - PPDO_DEVICE_DATA PdoData + __in PPDO_DEVICE_DATA PdoData ) /*++ Routine Description: @@ -1120,7 +1090,7 @@ Routine Description: void bus_init_pdo ( - PDEVICE_OBJECT pdo, + __out PDEVICE_OBJECT pdo, PFDO_DEVICE_DATA fdodata ) { @@ -1266,12 +1236,14 @@ NTSTATUS bus_plugin_dev(ioctl_usbvbus_plugin * plugin, PFDO_DEVICE_DATA fdodata len = sizeof(COMPATIBLE_IDS_TPL); pdodata->compatible_ids = ExAllocatePoolWithTag (NonPagedPool, len, BUSENUM_POOL_TAG); - RtlZeroMemory(pdodata->compatible_ids, len); - if (NULL == pdodata->compatible_ids) { - ExFreePool(pdodata->HardwareIDs); + + if (NULL == pdodata->compatible_ids) { + ExFreePool(pdodata->HardwareIDs); IoDeleteDevice(pdo); return STATUS_INSUFFICIENT_RESOURCES; } + RtlZeroMemory(pdodata->compatible_ids, len); + pdodata->compatible_ids_len = len; RtlStringCchPrintfW(pdodata->compatible_ids, len/sizeof(wchar_t), (plugin->inum>1)?COMPATIBLE_COMPOSITE_IDS_TPL:COMPATIBLE_IDS_TPL, @@ -1282,7 +1254,7 @@ NTSTATUS bus_plugin_dev(ioctl_usbvbus_plugin * plugin, PFDO_DEVICE_DATA fdodata if('Z'==pdodata->compatible_ids[i]) pdodata->compatible_ids[i]=0; } - old_pdodata = (PPDO_DEVICE_DATA) InterlockedCompareExchange(&((LONG)fo->FsContext), (LONG) pdodata, 0); + old_pdodata = (PPDO_DEVICE_DATA) InterlockedCompareExchangePointer(&(fo->FsContext), pdodata, 0); if(old_pdodata){ KdPrint(("you can't plugin again")); ExFreePool(pdodata->HardwareIDs); diff --git a/userspace/power.c b/userspace/power.c index d10f0c74..84be24c8 100755 --- a/userspace/power.c +++ b/userspace/power.c @@ -1,36 +1,3 @@ -/*++ - -Copyright (c) Microsoft Corporation. All rights reserved. - - THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY - KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR - PURPOSE. - -Module Name: - - POWER.C - -Abstract: - - This module handles Power management calls for both FDO and - child PDOs. - -Author: - - -Environment: - - Kernel mode only - -Notes: - - -Revision History: - - ---*/ - #include "busenum.h" diff --git a/userspace/r.bat b/userspace/r.bat index 738582b6..54d09c7b 100755 --- a/userspace/r.bat +++ b/userspace/r.bat @@ -1 +1,3 @@ -devcon remove "root\busenum" +devcon remove "root\USBIPEnum" + + diff --git a/userspace/sources b/userspace/sources index a6c77367..17ea368e 100755 --- a/userspace/sources +++ b/userspace/sources @@ -1,4 +1,4 @@ -TARGETNAME=BusEnum +TARGETNAME=USBIPEnum TARGETTYPE=DRIVER INCLUDES = ..\inc @@ -12,8 +12,8 @@ TARGETLIBS= $(DDK_LIB_PATH)\wdmsec.lib \ SOURCES= busenum.rc \ busenum.c \ pnp.c \ - power.c \ + power.c \ buspdo.c \ - wmi.c + wmi.c _NT_TARGET_VERSION=$(_NT_TARGET_VERSION_WINXP)