summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Fleytman <dfleytma@redhat.com>2015-05-03 10:36:23 +0300
committerDmitry Fleytman <dfleytma@redhat.com>2015-05-03 10:36:23 +0300
commit29814251f4579876b290491697e7108346d6b628 (patch)
treebaca0af284bec49ca126aa1d23a03af635d32025
parentc0fd0b9692f5df8f679e8b7418a23b987f1f9424 (diff)
UsbDk: Introduce UsbDk_ResetPipe() user mode APIv1.00-4
Signed-off-by: Dmitry Fleytman <dfleytma@redhat.com>
-rw-r--r--UsbDk/Public.h2
-rw-r--r--UsbDk/RedirectorStrategy.cpp8
-rw-r--r--UsbDk/UsbTarget.cpp14
-rw-r--r--UsbDk/UsbTarget.h1
-rw-r--r--UsbDkHelper/RedirectorAccess.cpp5
-rw-r--r--UsbDkHelper/RedirectorAccess.h1
-rw-r--r--UsbDkHelper/UsbDkHelper.cpp15
-rw-r--r--UsbDkHelper/UsbDkHelper.h13
8 files changed, 59 insertions, 0 deletions
diff --git a/UsbDk/Public.h b/UsbDk/Public.h
index 488d57c..6729410 100644
--- a/UsbDk/Public.h
+++ b/UsbDk/Public.h
@@ -57,6 +57,8 @@
ULONG(CTL_CODE( USBDK_DEVICE_TYPE, 0x953, METHOD_BUFFERED, FILE_WRITE_ACCESS ))
#define IOCTL_USBDK_DEVICE_RESET_DEVICE \
ULONG(CTL_CODE( USBDK_DEVICE_TYPE, 0x954, METHOD_BUFFERED, FILE_WRITE_ACCESS ))
+#define IOCTL_USBDK_DEVICE_RESET_PIPE \
+ ULONG(CTL_CODE( USBDK_DEVICE_TYPE, 0x955, METHOD_BUFFERED, FILE_WRITE_ACCESS ))
typedef struct tag_USBDK_ALTSETTINGS_IDXS
{
diff --git a/UsbDk/RedirectorStrategy.cpp b/UsbDk/RedirectorStrategy.cpp
index a532cc0..57ab629 100644
--- a/UsbDk/RedirectorStrategy.cpp
+++ b/UsbDk/RedirectorStrategy.cpp
@@ -518,6 +518,14 @@ void CUsbDkRedirectorStrategy::IoDeviceControl(WDFREQUEST Request,
{return m_Target.AbortPipe(Request, *endpointAddress); });
return;
}
+ case IOCTL_USBDK_DEVICE_RESET_PIPE:
+ {
+ CWdfRequest WdfRequest(Request);
+ UsbDkHandleRequestWithInput<ULONG64>(WdfRequest,
+ [this, Request](ULONG64 *endpointAddress, size_t)
+ {return m_Target.ResetPipe(Request, *endpointAddress); });
+ return;
+ }
case IOCTL_USBDK_DEVICE_SET_ALTSETTING:
{
ASSERT(m_IncomingRWQueue);
diff --git a/UsbDk/UsbTarget.cpp b/UsbDk/UsbTarget.cpp
index 982219c..a2d291f 100644
--- a/UsbDk/UsbTarget.cpp
+++ b/UsbDk/UsbTarget.cpp
@@ -390,6 +390,20 @@ NTSTATUS CWdfUsbTarget::AbortPipe(WDFREQUEST Request, ULONG64 EndpointAddress)
}
}
+NTSTATUS CWdfUsbTarget::ResetPipe(WDFREQUEST Request, ULONG64 EndpointAddress)
+{
+ auto Pipe = FindPipeByEndpointAddress(EndpointAddress);
+ if (Pipe != nullptr)
+ {
+ return Pipe->Reset(Request);
+ }
+ else
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, TRACE_USBTARGET, "%!FUNC! Failed: Pipe not found");
+ return STATUS_NOT_FOUND;
+ }
+}
+
NTSTATUS CWdfUsbTarget::ResetDevice(WDFREQUEST Request)
{
NTSTATUS status = STATUS_SUCCESS;
diff --git a/UsbDk/UsbTarget.h b/UsbDk/UsbTarget.h
index d5c665c..f75a02e 100644
--- a/UsbDk/UsbTarget.h
+++ b/UsbDk/UsbTarget.h
@@ -125,6 +125,7 @@ public:
NTSTATUS ControlTransferAsync(CWdfRequest &WdfRequest, PWDF_USB_CONTROL_SETUP_PACKET SetupPacket, WDFMEMORY Data,
PWDFMEMORY_OFFSET TransferOffset, PFN_WDF_REQUEST_COMPLETION_ROUTINE Completion);
NTSTATUS AbortPipe(WDFREQUEST Request, ULONG64 EndpointAddress);
+ NTSTATUS ResetPipe(WDFREQUEST Request, ULONG64 EndpointAddress);
NTSTATUS ResetDevice(WDFREQUEST Request);
private:
diff --git a/UsbDkHelper/RedirectorAccess.cpp b/UsbDkHelper/RedirectorAccess.cpp
index e4dafee..0182255 100644
--- a/UsbDkHelper/RedirectorAccess.cpp
+++ b/UsbDkHelper/RedirectorAccess.cpp
@@ -30,6 +30,11 @@ void UsbDkRedirectorAccess::AbortPipe(ULONG64 PipeAddress)
IoctlSync(IOCTL_USBDK_DEVICE_ABORT_PIPE, false, &PipeAddress, sizeof(PipeAddress));
}
+void UsbDkRedirectorAccess::ResetPipe(ULONG64 PipeAddress)
+{
+ IoctlSync(IOCTL_USBDK_DEVICE_RESET_PIPE, false, &PipeAddress, sizeof(PipeAddress));
+}
+
void UsbDkRedirectorAccess::SetAltsetting(ULONG64 InterfaceIdx, ULONG64 AltSettingIdx)
{
USBDK_ALTSETTINGS_IDXS AltSetting;
diff --git a/UsbDkHelper/RedirectorAccess.h b/UsbDkHelper/RedirectorAccess.h
index 283ec6c..c8f1b2e 100644
--- a/UsbDkHelper/RedirectorAccess.h
+++ b/UsbDkHelper/RedirectorAccess.h
@@ -58,6 +58,7 @@ public:
}
void AbortPipe(ULONG64 PipeAddress);
+ void ResetPipe(ULONG64 PipeAddress);
void SetAltsetting(ULONG64 InterfaceIdx, ULONG64 AltSettingIdx);
void ResetDevice();
diff --git a/UsbDkHelper/UsbDkHelper.cpp b/UsbDkHelper/UsbDkHelper.cpp
index 41b1d00..d0eadbc 100644
--- a/UsbDkHelper/UsbDkHelper.cpp
+++ b/UsbDkHelper/UsbDkHelper.cpp
@@ -213,6 +213,21 @@ BOOL UsbDk_AbortPipe(HANDLE DeviceHandle, ULONG64 PipeAddress)
}
}
+BOOL UsbDk_ResetPipe(HANDLE DeviceHandle, ULONG64 PipeAddress)
+{
+ try
+ {
+ auto deviceHandle = reinterpret_cast<PREDIRECTED_DEVICE_HANDLE>(DeviceHandle);
+ deviceHandle->RedirectorAccess->ResetPipe(PipeAddress);
+ return TRUE;
+ }
+ catch (const exception &e)
+ {
+ printExceptionString(e.what());
+ return FALSE;
+ }
+}
+
BOOL UsbDk_SetAltsetting(HANDLE DeviceHandle, ULONG64 InterfaceIdx, ULONG64 AltSettingIdx)
{
try
diff --git a/UsbDkHelper/UsbDkHelper.h b/UsbDkHelper/UsbDkHelper.h
index 5a640ed..dd9ac54 100644
--- a/UsbDkHelper/UsbDkHelper.h
+++ b/UsbDkHelper/UsbDkHelper.h
@@ -198,6 +198,19 @@ extern "C" {
*/
DLL BOOL UsbDk_AbortPipe(HANDLE DeviceHandle, ULONG64 PipeAddress);
+ /* Issue an USB reset pipe request
+ *
+ * @params
+ * IN - DeviceHandle - handle of target USB device
+ * - PipeAddress - address of pipe to be reset
+ * OUT - None
+ *
+ * @return
+ * TRUE if function succeeds
+ *
+ */
+ DLL BOOL UsbDk_ResetPipe(HANDLE DeviceHandle, ULONG64 PipeAddress);
+
/* Set active alternative settings for USB device
*
* @params