diff --git a/win-client/driver/bus.inf b/win-client/driver/bus.inf index 74263b8..a1715c4 100755 --- a/win-client/driver/bus.inf +++ b/win-client/driver/bus.inf @@ -9,7 +9,7 @@ Signature="$WINDOWS NT$" Class=USB ClassGuid={36FC9E60-C465-11CF-8056-444553540000} Provider=%INF-creator% -DriverVer=06/15/2012,1.0.0002.2 +DriverVer=06/18/2012,1.0.0002.3 CatalogFile.NT=synodriverx86.cat ;/* dirid 12: Drivers on WinNT platforms */ diff --git a/win-client/driver/busenum.c b/win-client/driver/busenum.c index 0069be1..293465a 100755 --- a/win-client/driver/busenum.c +++ b/win-client/driver/busenum.c @@ -374,15 +374,19 @@ unsigned int tran_usb_status(int linux_status,int in) case 0: return USBD_STATUS_SUCCESS; /* I guess it */ - case -EPIPE: + case -EPIPE: + KdPrint(("## return -EPIPE\n")); return USBD_STATUS_ENDPOINT_HALTED; - case -EOVERFLOW: + case -EOVERFLOW: + KdPrint(("## return -EOVERFLOW\n")); return USBD_STATUS_DATA_OVERRUN; - case -EREMOTEIO: + case -EREMOTEIO: + KdPrint(("## return -EREMOTEIO\n")); return USBD_STATUS_ERROR_SHORT_TRANSFER; #ifdef SYNO_DSM_BUG_15042 /* we repsonse some urb error accroding to direct connect result */ - case -ETIME: + case -ETIME: + KdPrint(("## return -ETIME\n")); return USBD_STATUS_DEV_NOT_RESPONDING ; #endif default: @@ -918,11 +922,11 @@ Ok: if(blTransferBuf) { urb->TransferBufferLength = h->u.ret_submit.actual_length; - KdPrint(("Finish URB FUNC,status=%u: %s %s len:%d ret:%d\n", urb->Hdr.Status, + KdPrint(("1.Finish URB FUNC,status=%u: %s %s len:%d ret:%d\n", urb->Hdr.Status, func2name(urb->Hdr.Function), in?"in":"out", urb->TransferBufferLength, h->u.ret_submit.actual_length)); } else { - KdPrint(("Finish URB FUNC,status=%u: %s %s ret:%d\n", urb->Hdr.Status, + KdPrint(("2.Finish URB FUNC,status=%u: %s %s ret:%d\n", urb->Hdr.Status, func2name(urb->Hdr.Function), in?"in":"out", h->u.ret_submit.actual_length)); } @@ -1317,7 +1321,7 @@ int process_write_irp(PPDO_DEVICE_DATA pdodata, PIRP irp) } urb->Hdr.Status = tran_usb_status(h->u.ret_submit.status, in, type); - KdPrint(("Finish URB FUNC,status=%u:%d %s %s len:%d ret:%d\n", urb->Hdr.Status, urb->Hdr.Function, + KdPrint(("3.Finish URB FUNC,status=%u:%d %s %s len:%d ret:%d\n", urb->Hdr.Status, urb->Hdr.Function, func2name(urb->Hdr.Function), in?"in":"out", urb->TransferBufferLength, h->u.ret_submit.actual_length)); @@ -1611,11 +1615,29 @@ int prepare_class_vendor_urb(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST *req, setup->wIndex = req->Index; *copied=sizeof(*h); - if(!in){ - RtlCopyMemory(h+1, req->TransferBuffer, - req->TransferBufferLength); - (*copied)+=req->TransferBufferLength; - } +#ifdef SYNO_REFINE_TRANSFER_BUFFER + if(!in && req->TransferBufferLength > 0) { + if(req->TransferBuffer) + bufTmp=req->TransferBuffer; + else if (req->TransferBufferMDL){ + bufTmp=MmGetSystemAddressForMdlSafe( + req->TransferBufferMDL, + LowPagePriority); + } + + if(NULL != bufTmp) { + KdPrint(("# %s, send buffer is not null!!\n", func2name(req->Hdr.Function))); + RtlCopyMemory(h+1, bufTmp, req->TransferBufferLength); + (*copied)+=req->TransferBufferLength; + } + } +#else + if(!in){ + RtlCopyMemory(h+1, req->TransferBuffer, + req->TransferBufferLength); + (*copied)+=req->TransferBufferLength; + } +#endif return STATUS_SUCCESS; } @@ -1652,6 +1674,8 @@ int prepare_get_intf_descriptor_urb(struct _URB_CONTROL_DESCRIPTOR_REQUEST * req KdPrint(("## 2. Request string descriptor, in index=%x\n", req->LanguageId)); } + /* USB_REQUEST_GET_DESCRIPTOR is device to host request, we should not copy request buffer to device */ + *copied=sizeof(*h); return STATUS_SUCCESS; } @@ -1691,6 +1715,9 @@ int prepare_get_dev_descriptor_urb( struct _URB_CONTROL_DESCRIPTOR_REQUEST * req return STATUS_INVALID_PARAMETER; } *copied=sizeof(*h); + + /* USB_REQUEST_GET_DESCRIPTOR is device to host request, we should not copy request buffer to device */ + return STATUS_SUCCESS; } diff --git a/win-client/driver/pnp.c b/win-client/driver/pnp.c index 6aa3442..2feef35 100755 --- a/win-client/driver/pnp.c +++ b/win-client/driver/pnp.c @@ -1564,7 +1564,7 @@ NTSTATUS syno_bus_plugin_dev(ioctl_usbvbus_plugin * plugin, PFDO_DEVICE_DATA fd pdodata->speed = plugin->speed; #ifdef SYNO_MS_DESCRIPTOR_PARSER pdodata->NumInterfaces = plugin->inum; - KdPrint(("## set interface number=%d", pdodata->NumInterfaces)); + KdPrint(("## set interface number=%d\n", pdodata->NumInterfaces)); #endif bus_init_pdo (pdo, fdodata); diff --git a/win-client/synodef.h b/win-client/synodef.h index 8bdca0a..fe0f003 100755 --- a/win-client/synodef.h +++ b/win-client/synodef.h @@ -286,6 +286,6 @@ #define SYNO_REFINE_PROCESS_WRITE_IRP /* Refine req->TransferBuffer and req->TransferBufferMDL usage */ -//#define SYNO_REFINE_TRANSFER_BUFFER +#define SYNO_REFINE_TRANSFER_BUFFER #endif //_SYNODEF_WIN_CLIENT_H