summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Fleytman <dfleytma@redhat.com>2016-06-29 16:12:40 +0300
committerDmitry Fleytman <dfleytma@redhat.com>2016-06-29 17:31:55 +0300
commitc80effc7dd3586c83580e644ccb7dd19258337b7 (patch)
treeb814754e43067a835e41d0d1839e5424085abc0d
parentb354d0ea35f5b13b2d502b6a5a7637d9e06a4067 (diff)
UsbDk: Introduce hider strategy class
This class will be used by following patches to implement hiding via patching device IDs. See commit messages of corresponfing patches for rationale. Signed-off-by: Dmitry Fleytman <dfleytma@redhat.com>
-rw-r--r--UsbDk/HiderStrategy.cpp127
-rw-r--r--UsbDk/HiderStrategy.h34
-rw-r--r--UsbDk/RedirectorStrategy.cpp105
-rw-r--r--UsbDk/RedirectorStrategy.h7
-rw-r--r--UsbDk/UsbDk.vcxproj19
-rw-r--r--UsbDk/UsbDk.vcxproj.filters6
6 files changed, 191 insertions, 107 deletions
diff --git a/UsbDk/HiderStrategy.cpp b/UsbDk/HiderStrategy.cpp
new file mode 100644
index 0000000..d5816ab
--- /dev/null
+++ b/UsbDk/HiderStrategy.cpp
@@ -0,0 +1,127 @@
+/**********************************************************************
+* Copyright (c) 2013-2014 Red Hat, Inc.
+*
+* Developed by Daynix Computing LTD.
+*
+* Authors:
+* Dmitry Fleytman <dmitry@daynix.com>
+* Pavel Gurvich <pavel@daynix.com>
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+**********************************************************************/
+
+#include "stdafx.h"
+
+#include "HiderStrategy.h"
+#include "trace.h"
+#include "HiderStrategy.tmh"
+#include "FilterDevice.h"
+#include "UsbDkNames.h"
+
+void CUsbDkHiderStrategy::PatchDeviceID(PIRP Irp)
+{
+ static const WCHAR RedirectorDeviceId[] = L"USB\\Vid_2B23&Pid_CAFE&Rev_0001";
+ static const WCHAR RedirectorHardwareIds[] = L"USB\\Vid_2B23&Pid_CAFE&Rev_0001\0USB\\Vid_2B23&Pid_CAFE\0";
+ static const WCHAR RedirectorCompatibleIds[] = L"USB\\Class_FF&SubClass_FF&Prot_FF\0USB\\Class_FF&SubClass_FF\0USB\\Class_FF\0";
+
+ static const size_t MAX_DEC_NUMBER_LEN = 11;
+ WCHAR SzInstanceID[ARRAY_SIZE(USBDK_DRIVER_NAME) + MAX_DEC_NUMBER_LEN + 1];
+
+ const WCHAR *Buffer;
+ SIZE_T Size = 0;
+
+ PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp);
+
+ switch (irpStack->Parameters.QueryId.IdType)
+ {
+ case BusQueryDeviceID:
+ Buffer = &RedirectorDeviceId[0];
+ Size = sizeof(RedirectorDeviceId);
+ break;
+
+ case BusQueryInstanceID:
+ {
+ CString InstanceID;
+ auto status = InstanceID.Create(USBDK_DRIVER_NAME, m_Owner->GetInstanceNumber());
+ if (!NT_SUCCESS(status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, TRACE_REDIRECTOR, "%!FUNC! Failed to create instance ID string %!STATUS!", status);
+ return;
+ }
+
+ Size = InstanceID.ToWSTR(SzInstanceID, sizeof(SzInstanceID));
+ Buffer = &SzInstanceID[0];
+ break;
+ }
+
+ case BusQueryHardwareIDs:
+ Buffer = &RedirectorHardwareIds[0];
+ Size = sizeof(RedirectorHardwareIds);
+ break;
+
+ case BusQueryCompatibleIDs:
+ Buffer = &RedirectorCompatibleIds[0];
+ Size = sizeof(RedirectorCompatibleIds);
+ break;
+
+ default:
+ Buffer = nullptr;
+ break;
+ }
+
+ if (Buffer != nullptr)
+ {
+ auto Result = DuplicateStaticBuffer(Buffer, Size);
+
+ if (Result == nullptr)
+ {
+ return;
+ }
+
+ if (Irp->IoStatus.Information)
+ {
+ ExFreePool(reinterpret_cast<PVOID>(Irp->IoStatus.Information));
+
+ }
+ Irp->IoStatus.Information = reinterpret_cast<ULONG_PTR>(Result);
+ }
+}
+
+NTSTATUS CUsbDkHiderStrategy::PNPPreProcess(PIRP Irp)
+{
+ PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp);
+ switch (irpStack->MinorFunction)
+ {
+ case IRP_MN_QUERY_ID:
+ return PostProcessOnSuccess(Irp,
+ [this](PIRP Irp)
+ {
+ PatchDeviceID(Irp);
+ });
+
+ case IRP_MN_QUERY_CAPABILITIES:
+ return PostProcessOnSuccess(Irp,
+ [](PIRP Irp)
+ {
+ auto irpStack = IoGetCurrentIrpStackLocation(Irp);
+ irpStack->Parameters.DeviceCapabilities.Capabilities->RawDeviceOK = 1;
+ irpStack->Parameters.DeviceCapabilities.Capabilities->NoDisplayInUI = 1;
+ irpStack->Parameters.DeviceCapabilities.Capabilities->Removable = 0;
+ irpStack->Parameters.DeviceCapabilities.Capabilities->EjectSupported = 0;
+ irpStack->Parameters.DeviceCapabilities.Capabilities->SilentInstall = 1;
+ });
+ default:
+ return CUsbDkNullFilterStrategy::PNPPreProcess(Irp);
+ }
+}
diff --git a/UsbDk/HiderStrategy.h b/UsbDk/HiderStrategy.h
new file mode 100644
index 0000000..ff88351
--- /dev/null
+++ b/UsbDk/HiderStrategy.h
@@ -0,0 +1,34 @@
+/**********************************************************************
+* Copyright (c) 2013-2014 Red Hat, Inc.
+*
+* Developed by Daynix Computing LTD.
+*
+* Authors:
+* Dmitry Fleytman <dmitry@daynix.com>
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+**********************************************************************/
+
+#pragma once
+
+#include "FilterStrategy.h"
+
+class CUsbDkHiderStrategy : public CUsbDkNullFilterStrategy
+{
+public:
+ virtual NTSTATUS PNPPreProcess(PIRP Irp) override;
+
+private:
+ void PatchDeviceID(PIRP Irp);
+};
diff --git a/UsbDk/RedirectorStrategy.cpp b/UsbDk/RedirectorStrategy.cpp
index 1cc8a45..f9f355c 100644
--- a/UsbDk/RedirectorStrategy.cpp
+++ b/UsbDk/RedirectorStrategy.cpp
@@ -33,8 +33,6 @@ enum UsbDkTransferDirection
#include "RedirectorStrategy.h"
#include "trace.h"
#include "RedirectorStrategy.tmh"
-#include "FilterDevice.h"
-#include "UsbDkNames.h"
#include "ControlDevice.h"
#include "WdfRequest.h"
@@ -58,7 +56,7 @@ NTSTATUS CUsbDkRedirectorStrategy::MakeAvailable()
NTSTATUS CUsbDkRedirectorStrategy::Create(CUsbDkFilterDevice *Owner)
{
- auto status = CUsbDkFilterStrategy::Create(Owner);
+ auto status = CUsbDkHiderStrategy::Create(Owner);
if (!NT_SUCCESS(status))
{
TraceEvents(TRACE_LEVEL_ERROR, TRACE_REDIRECTOR, "%!FUNC! Base class creation failed");
@@ -79,103 +77,6 @@ NTSTATUS CUsbDkRedirectorStrategy::Create(CUsbDkFilterDevice *Owner)
return status;
}
-void CUsbDkRedirectorStrategy::PatchDeviceID(PIRP Irp)
-{
- static const WCHAR RedirectorDeviceId[] = L"USB\\Vid_2B23&Pid_CAFE&Rev_0001";
- static const WCHAR RedirectorHardwareIds[] = L"USB\\Vid_2B23&Pid_CAFE&Rev_0001\0USB\\Vid_2B23&Pid_CAFE\0";
- static const WCHAR RedirectorCompatibleIds[] = L"USB\\Class_FF&SubClass_FF&Prot_FF\0USB\\Class_FF&SubClass_FF\0USB\\Class_FF\0";
-
- static const size_t MAX_DEC_NUMBER_LEN = 11;
- WCHAR SzInstanceID[ARRAY_SIZE(USBDK_DRIVER_NAME) + MAX_DEC_NUMBER_LEN + 1];
-
- const WCHAR *Buffer;
- SIZE_T Size = 0;
-
- PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp);
-
- switch (irpStack->Parameters.QueryId.IdType)
- {
- case BusQueryDeviceID:
- Buffer = &RedirectorDeviceId[0];
- Size = sizeof(RedirectorDeviceId);
- break;
-
- case BusQueryInstanceID:
- {
- CString InstanceID;
- auto status = InstanceID.Create(USBDK_DRIVER_NAME, m_Owner->GetInstanceNumber());
- if (!NT_SUCCESS(status))
- {
- TraceEvents(TRACE_LEVEL_ERROR, TRACE_REDIRECTOR, "%!FUNC! Failed to create instance ID string %!STATUS!", status);
- return;
- }
-
- Size = InstanceID.ToWSTR(SzInstanceID, sizeof(SzInstanceID));
- Buffer = &SzInstanceID[0];
- break;
- }
-
- case BusQueryHardwareIDs:
- Buffer = &RedirectorHardwareIds[0];
- Size = sizeof(RedirectorHardwareIds);
- break;
-
- case BusQueryCompatibleIDs:
- Buffer = &RedirectorCompatibleIds[0];
- Size = sizeof(RedirectorCompatibleIds);
- break;
-
- default:
- Buffer = nullptr;
- break;
- }
-
- if (Buffer != nullptr)
- {
- auto Result = DuplicateStaticBuffer(Buffer, Size);
-
- if (Result == nullptr)
- {
- return;
- }
-
- if (Irp->IoStatus.Information)
- {
- ExFreePool(reinterpret_cast<PVOID>(Irp->IoStatus.Information));
-
- }
- Irp->IoStatus.Information = reinterpret_cast<ULONG_PTR>(Result);
- }
-}
-
-NTSTATUS CUsbDkRedirectorStrategy::PNPPreProcess(PIRP Irp)
-{
- PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp);
- switch (irpStack->MinorFunction)
- {
- case IRP_MN_QUERY_ID:
- return PostProcessOnSuccess(Irp,
- [this](PIRP Irp)
- {
- PatchDeviceID(Irp);
- });
-
- case IRP_MN_QUERY_CAPABILITIES:
- return PostProcessOnSuccess(Irp,
- [](PIRP Irp)
- {
- auto irpStack = IoGetCurrentIrpStackLocation(Irp);
- irpStack->Parameters.DeviceCapabilities.Capabilities->RawDeviceOK = 1;
- irpStack->Parameters.DeviceCapabilities.Capabilities->NoDisplayInUI = 1;
- irpStack->Parameters.DeviceCapabilities.Capabilities->Removable = 0;
- irpStack->Parameters.DeviceCapabilities.Capabilities->EjectSupported = 0;
- irpStack->Parameters.DeviceCapabilities.Capabilities->SilentInstall = 1;
- });
- default:
- return CUsbDkFilterStrategy::PNPPreProcess(Irp);
- }
-}
-
using USBDK_REDIRECTOR_REQUEST_CONTEXT = struct : public USBDK_TARGET_REQUEST_CONTEXT
{
bool PreprocessingDone;
@@ -381,7 +282,7 @@ void CUsbDkRedirectorStrategy::IoInCallerContext(WDFDEVICE Device, WDFREQUEST Re
if (NT_SUCCESS(status))
{
- CUsbDkFilterStrategy::IoInCallerContext(Device, WdfRequest.Detach());
+ CUsbDkHiderStrategy::IoInCallerContext(Device, WdfRequest.Detach());
}
else
{
@@ -490,7 +391,7 @@ void CUsbDkRedirectorStrategy::IoDeviceControlConfig(WDFREQUEST Request,
{
default:
{
- CUsbDkFilterStrategy::IoDeviceControl(Request, OutputBufferLength, InputBufferLength, IoControlCode);
+ CUsbDkHiderStrategy::IoDeviceControl(Request, OutputBufferLength, InputBufferLength, IoControlCode);
return;
}
case IOCTL_USBDK_DEVICE_ABORT_PIPE:
diff --git a/UsbDk/RedirectorStrategy.h b/UsbDk/RedirectorStrategy.h
index 908dc40..31d07c0 100644
--- a/UsbDk/RedirectorStrategy.h
+++ b/UsbDk/RedirectorStrategy.h
@@ -23,7 +23,7 @@
#pragma once
-#include "FilterStrategy.h"
+#include "HiderStrategy.h"
#include "UsbTarget.h"
#include "WdfDevice.h"
#include "Public.h"
@@ -58,12 +58,11 @@ private:
class CRedirectorRequest;
-class CUsbDkRedirectorStrategy : public CUsbDkFilterStrategy
+class CUsbDkRedirectorStrategy : public CUsbDkHiderStrategy
{
public:
virtual NTSTATUS Create(CUsbDkFilterDevice *Owner) override;
virtual NTSTATUS MakeAvailable() override;
- virtual NTSTATUS PNPPreProcess(PIRP Irp) override;
virtual void IoInCallerContext(WDFDEVICE Device, WDFREQUEST Request) override;
virtual void IoDeviceControl(WDFREQUEST Request,
@@ -110,8 +109,6 @@ private:
static void IsoRWCompletion(WDFREQUEST Request, WDFIOTARGET Target, PWDF_REQUEST_COMPLETION_PARAMS Params, WDFCONTEXT Context);
- void PatchDeviceID(PIRP Irp);
-
static void TraceTransferError(const CRedirectorRequest &WdfRequest,
NTSTATUS Status,
USBD_STATUS UsbdStatus);
diff --git a/UsbDk/UsbDk.vcxproj b/UsbDk/UsbDk.vcxproj
index 03c6a1d..b381ca1 100644
--- a/UsbDk/UsbDk.vcxproj
+++ b/UsbDk/UsbDk.vcxproj
@@ -175,6 +175,24 @@
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'">Use</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'">Use</PrecompiledHeader>
</ClCompile>
+ <ClCompile Include="HiderStrategy.cpp">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'">Use</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'">Use</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'">Use</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='XP Release|Win32'">Use</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'">Use</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='XP Debug|Win32'">Use</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'">Use</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'">Use</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'">Use</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'">Use</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'">Use</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='XP Release|x64'">Use</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'">Use</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='XP Debug|x64'">Use</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'">Use</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'">Use</PrecompiledHeader>
+ </ClCompile>
<ClCompile Include="Irp.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'">Use</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'">Use</PrecompiledHeader>
@@ -418,6 +436,7 @@
<ClInclude Include="FilterDevice.h" />
<ClInclude Include="FilterStrategy.h" />
<ClInclude Include="HiderDevice.h" />
+ <ClInclude Include="HiderStrategy.h" />
<ClInclude Include="HideRulesRegPublic.h" />
<ClInclude Include="Irp.h" />
<ClInclude Include="MemoryBuffer.h" />
diff --git a/UsbDk/UsbDk.vcxproj.filters b/UsbDk/UsbDk.vcxproj.filters
index d37eef6..9dc7a39 100644
--- a/UsbDk/UsbDk.vcxproj.filters
+++ b/UsbDk/UsbDk.vcxproj.filters
@@ -100,6 +100,9 @@
<ClInclude Include="HideRulesRegPublic.h">
<Filter>Header Files</Filter>
</ClInclude>
+ <ClInclude Include="HiderStrategy.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="Driver.cpp">
@@ -159,6 +162,9 @@
<ClCompile Include="stdafx.cpp">
<Filter>Source Files</Filter>
</ClCompile>
+ <ClCompile Include="HiderStrategy.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="Resource.rc">