diff options
author | Dmitry Fleytman <dfleytma@redhat.com> | 2016-06-29 16:12:40 +0300 |
---|---|---|
committer | Dmitry Fleytman <dfleytma@redhat.com> | 2016-06-29 17:31:55 +0300 |
commit | c80effc7dd3586c83580e644ccb7dd19258337b7 (patch) | |
tree | b814754e43067a835e41d0d1839e5424085abc0d | |
parent | b354d0ea35f5b13b2d502b6a5a7637d9e06a4067 (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.cpp | 127 | ||||
-rw-r--r-- | UsbDk/HiderStrategy.h | 34 | ||||
-rw-r--r-- | UsbDk/RedirectorStrategy.cpp | 105 | ||||
-rw-r--r-- | UsbDk/RedirectorStrategy.h | 7 | ||||
-rw-r--r-- | UsbDk/UsbDk.vcxproj | 19 | ||||
-rw-r--r-- | UsbDk/UsbDk.vcxproj.filters | 6 |
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"> |