summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNabil Fates <[email protected]>2017-06-06 12:57:25 -0700
committerNabil Fates <[email protected]>2017-06-06 12:57:25 -0700
commit77b0c8dd72a319af4c34a92b71d80985377e99c2 (patch)
tree6e99109b3c5e411cb163111bf3581464809f0cf7
parented1df9a8b80b154b71b79635e40af75f4f19001c (diff)
Adding DCHU sample to the WDK sample repo.
-rw-r--r--general/DCHU/README.txt43
-rw-r--r--general/DCHU/osrfx2_DCHU_base/deviceMetadata/B4D697F5-1C56-4807-ACCD-B28C09D37FF0.devicemetadata-msbin0 -> 105893 bytes
-rw-r--r--general/DCHU/osrfx2_DCHU_base/inc/prototypes.h14
-rw-r--r--general/DCHU/osrfx2_DCHU_base/inc/public.h173
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base.sln102
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/Interrupt.c206
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/bulkrwr.c476
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/device.c1014
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/driver.c281
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/ioctl.c1151
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/osrfx2_DCHU_base.Filters302
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/osrfx2_DCHU_base.inxbin0 -> 7490 bytes
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/osrfx2_DCHU_base.vcxproj269
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/osrusbfx2.h312
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/osrusbfx2.man309
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/osrusbfx2.rc13
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/trace.h115
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_filter/filter.c421
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_filter/filter.h85
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_filter/filter.rc12
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_filter/osrfx2_DCHU_filter.Filters31
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_filter/osrfx2_DCHU_filter.vcxproj186
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_testapp/dump.c444
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_testapp/osrfx2_DCHU_testapp.Filters30
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_testapp/osrfx2_DCHU_testapp.vcxproj193
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_testapp/osrusbfx2.vcxproj194
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_testapp/test.cmd6
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_testapp/testapp.c1214
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_testapp/testapp.rc12
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/CppWindowsService.cpp74
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/Main.cpp320
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/Main.h261
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/SampleService.cpp254
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/SampleService.h174
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/ServiceBase.cpp794
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/ServiceBase.h423
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/ThreadPool.h80
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/Utils.cpp156
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/Utils.h111
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/osrfx2_DCHU_usersvc.filters54
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/osrfx2_DCHU_usersvc.inxbin0 -> 3172 bytes
-rw-r--r--general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/osrfx2_DCHU_usersvc.vcxproj206
-rw-r--r--general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_component.sln73
-rw-r--r--general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_component/osrfx2_DCHU_component.filters14
-rw-r--r--general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_component/osrfx2_DCHU_component.inx64
-rw-r--r--general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_component/osrfx2_DCHU_component.vcxproj272
-rw-r--r--general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_componentsoftware/osrfx2_DCHU_componentsoftware.cpp489
-rw-r--r--general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_componentsoftware/osrfx2_DCHU_componentsoftware.filters33
-rw-r--r--general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_componentsoftware/osrfx2_DCHU_componentsoftware.vcxproj168
-rw-r--r--general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_componentsoftware/stdafx.cpp8
-rw-r--r--general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_componentsoftware/stdafx.h18
-rw-r--r--general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_componentsoftware/targetver.h8
-rw-r--r--general/DCHU/osrfx2_DCHU_extension/osrfx2_DCHU_extension.sln48
-rw-r--r--general/DCHU/osrfx2_DCHU_extension/osrfx2_DCHU_extension/osrfx2_DCHU_extension.filters14
-rw-r--r--general/DCHU/osrfx2_DCHU_extension/osrfx2_DCHU_extension/osrfx2_DCHU_extension.inx48
-rw-r--r--general/DCHU/osrfx2_DCHU_extension/osrfx2_DCHU_extension/osrfx2_DCHU_extension.vcxproj262
56 files changed, 12034 insertions, 0 deletions
diff --git a/general/DCHU/README.txt b/general/DCHU/README.txt
new file mode 100644
index 00000000..a63bed27
--- /dev/null
+++ b/general/DCHU/README.txt
@@ -0,0 +1,43 @@
+Driver package installation toolkit for universal drivers
+
+Directions:
+
+Each portion of the sample is separated by driver package:
+
+osrfx2_DCHU_base : The driver for the Osr Fx2 Learning Kit. This includes the device driver,
+ an upper filter driver for the device (a no-op), a Win32 User Service that
+ controls lights on the device, and a console app that can control the device.
+
+osrfx2_DCHU_extension: An extension driver for the Osr Fx2 device. This extension modifies
+ some registry settings laid down by the base driver (osrfx2_DCHU_base).
+
+osrfx2_DCHU_component: A Software Component that installs on a device that the base driver
+ package's INF (osrfx2_DCHU_base.inf) creates using AddComponent.
+ This Software Component executes a legacy .exe to install a file
+ in the C:\Program Files\... directory that reads the Osr Fx2 device's
+ registry settings applied in the base driver package's INF (osrfx2_DCHU_base.inf)
+
+Each of these solutions can be built with the latest WDK on Visual Studio 2015. Additionally,
+an HSA that can also control the Osr Fx2 Learning Kit's device is available here:
+
+https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/CustomCapability
+
+The HSA and the contents of this sample can coexist, but currently the HSA can only be built
+with Visual Studio 2017 on a machine *WITHOUT* the WDK. This limitation is reportedly fixed
+in RS3.
+
+To install these driver packages, make sure that the target machine is in Test Mode, using:
+
+ bcdedit /set testsigning on
+
+And then use pnputil /i /a <PATHTOINF> to install each of the three driver packages. They should
+be installed in this order:
+
+ osrfx2_DCHU_base
+ osrfx2_DCHU_extension
+ osrfx2_DCHU_component
+
+Technically the order of osrfx2_DCHU_extension and ...component doesn't matter, but the software
+within osrfx2_DCHU_component will read the regisry set by the extension to show that an extension
+INF's settings are applied *after* the base INF's.
+ \ No newline at end of file
diff --git a/general/DCHU/osrfx2_DCHU_base/deviceMetadata/B4D697F5-1C56-4807-ACCD-B28C09D37FF0.devicemetadata-ms b/general/DCHU/osrfx2_DCHU_base/deviceMetadata/B4D697F5-1C56-4807-ACCD-B28C09D37FF0.devicemetadata-ms
new file mode 100644
index 00000000..5f8e82ee
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/deviceMetadata/B4D697F5-1C56-4807-ACCD-B28C09D37FF0.devicemetadata-ms
Binary files differ
diff --git a/general/DCHU/osrfx2_DCHU_base/inc/prototypes.h b/general/DCHU/osrfx2_DCHU_base/inc/prototypes.h
new file mode 100644
index 00000000..cc99cdfe
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/inc/prototypes.h
@@ -0,0 +1,14 @@
+DRIVER_INITIALIZE DriverEntry;
+
+EVT_WDF_DRIVER_DEVICE_ADD EvtDeviceAdd;
+
+EVT_WDF_DEVICE_CONTEXT_CLEANUP EvtDriverContextCleanup;
+EVT_WDF_DEVICE_PREPARE_HARDWARE EvtDevicePrepareHardware;
+
+EVT_WDF_IO_QUEUE_IO_READ EvtIoRead;
+EVT_WDF_IO_QUEUE_IO_WRITE EvtIoWrite;
+EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL EvtIoDeviceControl;
+
+EVT_WDF_REQUEST_COMPLETION_ROUTINE EvtRequestReadCompletionRoutine;
+EVT_WDF_REQUEST_COMPLETION_ROUTINE EvtRequestWriteCompletionRoutine;
+
diff --git a/general/DCHU/osrfx2_DCHU_base/inc/public.h b/general/DCHU/osrfx2_DCHU_base/inc/public.h
new file mode 100644
index 00000000..f1fc6be3
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/inc/public.h
@@ -0,0 +1,173 @@
+/*++
+
+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:
+
+ public.h
+
+Abstract:
+
+Environment:
+
+ User & Kernel mode
+
+--*/
+
+#ifndef _PUBLIC_H
+#define _PUBLIC_H
+
+#include <initguid.h>
+
+// {573E8C73-0CB4-4471-A1BF-FAB26C31D384}
+DEFINE_GUID(GUID_DEVINTERFACE_OSRUSBFX2,
+ 0x573e8c73, 0xcb4, 0x4471, 0xa1, 0xbf, 0xfa, 0xb2, 0x6c, 0x31, 0xd3, 0x84);
+
+#pragma warning(push)
+#pragma warning(disable:4201) // nameless struct/union
+#pragma warning(disable:4214) // bit field types other than int
+
+//
+// Define the structures that will be used by the IOCTL
+// interface to the driver
+//
+
+//
+// BAR_GRAPH_STATE
+//
+// BAR_GRAPH_STATE is a bit field structure with each
+// bit corresponding to one of the bar graph on the
+// OSRFX2 Development Board
+//
+#include <pshpack1.h>
+typedef struct _BAR_GRAPH_STATE {
+
+ union {
+
+ struct {
+ //
+ // Individual bars starting from the
+ // top of the stack of bars
+ //
+ // NOTE: There are actually 10 bars,
+ // but the very top two do not light
+ // and are not counted here
+ //
+ UCHAR Bar1 : 1;
+ UCHAR Bar2 : 1;
+ UCHAR Bar3 : 1;
+ UCHAR Bar4 : 1;
+ UCHAR Bar5 : 1;
+ UCHAR Bar6 : 1;
+ UCHAR Bar7 : 1;
+ UCHAR Bar8 : 1;
+ };
+
+ //
+ // The state of all the bar graph as a single
+ // UCHAR
+ //
+ UCHAR BarsAsUChar;
+
+ };
+
+}BAR_GRAPH_STATE, *PBAR_GRAPH_STATE;
+
+//
+// SWITCH_STATE
+//
+// SWITCH_STATE is a bit field structure with each
+// bit corresponding to one of the switches on the
+// OSRFX2 Development Board
+//
+typedef struct _SWITCH_STATE {
+
+ union {
+ struct {
+ //
+ // Individual switches starting from the
+ // left of the set of switches
+ //
+ UCHAR Switch1 : 1;
+ UCHAR Switch2 : 1;
+ UCHAR Switch3 : 1;
+ UCHAR Switch4 : 1;
+ UCHAR Switch5 : 1;
+ UCHAR Switch6 : 1;
+ UCHAR Switch7 : 1;
+ UCHAR Switch8 : 1;
+ };
+
+ //
+ // The state of all the switches as a single
+ // UCHAR
+ //
+ UCHAR SwitchesAsUChar;
+
+ };
+
+
+}SWITCH_STATE, *PSWITCH_STATE;
+
+#include <poppack.h>
+
+#pragma warning(pop)
+
+#define IOCTL_INDEX 0x800
+#define FILE_DEVICE_OSRUSBFX2 65500U
+
+#define IOCTL_OSRUSBFX2_GET_CONFIG_DESCRIPTOR CTL_CODE(FILE_DEVICE_OSRUSBFX2, \
+ IOCTL_INDEX, \
+ METHOD_BUFFERED, \
+ FILE_READ_ACCESS)
+
+#define IOCTL_OSRUSBFX2_RESET_DEVICE CTL_CODE(FILE_DEVICE_OSRUSBFX2, \
+ IOCTL_INDEX + 1, \
+ METHOD_BUFFERED, \
+ FILE_WRITE_ACCESS)
+
+#define IOCTL_OSRUSBFX2_REENUMERATE_DEVICE CTL_CODE(FILE_DEVICE_OSRUSBFX2, \
+ IOCTL_INDEX + 3, \
+ METHOD_BUFFERED, \
+ FILE_WRITE_ACCESS)
+
+#define IOCTL_OSRUSBFX2_GET_BAR_GRAPH_DISPLAY CTL_CODE(FILE_DEVICE_OSRUSBFX2,\
+ IOCTL_INDEX + 4, \
+ METHOD_BUFFERED, \
+ FILE_READ_ACCESS)
+
+
+#define IOCTL_OSRUSBFX2_SET_BAR_GRAPH_DISPLAY CTL_CODE(FILE_DEVICE_OSRUSBFX2,\
+ IOCTL_INDEX + 5, \
+ METHOD_BUFFERED, \
+ FILE_WRITE_ACCESS)
+
+
+#define IOCTL_OSRUSBFX2_READ_SWITCHES CTL_CODE(FILE_DEVICE_OSRUSBFX2, \
+ IOCTL_INDEX + 6, \
+ METHOD_BUFFERED, \
+ FILE_READ_ACCESS)
+
+
+#define IOCTL_OSRUSBFX2_GET_7_SEGMENT_DISPLAY CTL_CODE(FILE_DEVICE_OSRUSBFX2, \
+ IOCTL_INDEX + 7, \
+ METHOD_BUFFERED, \
+ FILE_READ_ACCESS)
+
+
+#define IOCTL_OSRUSBFX2_SET_7_SEGMENT_DISPLAY CTL_CODE(FILE_DEVICE_OSRUSBFX2, \
+ IOCTL_INDEX + 8, \
+ METHOD_BUFFERED, \
+ FILE_WRITE_ACCESS)
+
+#define IOCTL_OSRUSBFX2_GET_INTERRUPT_MESSAGE CTL_CODE(FILE_DEVICE_OSRUSBFX2,\
+ IOCTL_INDEX + 9, \
+ METHOD_OUT_DIRECT, \
+ FILE_READ_ACCESS)
+
+#endif
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base.sln b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base.sln
new file mode 100644
index 00000000..bcb87f32
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base.sln
@@ -0,0 +1,102 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 14
+VisualStudioVersion = 14.0.25420.1
+MinimumVisualStudioVersion = 12.0
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "osrfx2_DCHU_base", "osrfx2_DCHU_base", "{3B268182-F450-4AB8-B350-A2CF6495F756}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "osrfx2_DCHU_testapp", "osrfx2_DCHU_testapp", "{52ABC41E-9AAA-4DA8-8986-F6298E32C8A3}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "osrfx2_DCHU_base", "osrfx2_DCHU_base\osrfx2_DCHU_base.vcxproj", "{5B711254-3F53-4E1D-A1AD-CC81E34588B7}"
+ ProjectSection(ProjectDependencies) = postProject
+ {3CC42473-D121-41F4-AE26-1F2F0AC65E82} = {3CC42473-D121-41F4-AE26-1F2F0AC65E82}
+ {DE70E2D1-6A4D-4984-BD82-CE750889F0D3} = {DE70E2D1-6A4D-4984-BD82-CE750889F0D3}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "osrfx2_DCHU_testapp", "osrfx2_DCHU_testapp\osrusbfx2.vcxproj", "{6EED5CDD-5526-40DC-97F9-582857E10187}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "osrfx2_DCHU_filter", "osrfx2_DCHU_filter", "{1665ED66-7966-4FE2-9BA5-B5843511E325}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "osrfx2_DCHU_usersvc", "osrfx2_DCHU_usersvc", "{97E38EBE-CA24-4E71-9EB1-E2792ABBF622}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "osrfx2_DCHU_usersvc", "osrfx2_DCHU_usersvc\osrfx2_DCHU_usersvc.vcxproj", "{DE70E2D1-6A4D-4984-BD82-CE750889F0D3}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "osrfx2_DCHU_filter", "osrfx2_DCHU_filter\osrfx2_DCHU_filter.vcxproj", "{3CC42473-D121-41F4-AE26-1F2F0AC65E82}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|ARM = Debug|ARM
+ Debug|ARM64 = Debug|ARM64
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release|ARM = Release|ARM
+ Release|ARM64 = Release|ARM64
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {5B711254-3F53-4E1D-A1AD-CC81E34588B7}.Debug|ARM.ActiveCfg = Debug|Win32
+ {5B711254-3F53-4E1D-A1AD-CC81E34588B7}.Debug|ARM64.ActiveCfg = Debug|Win32
+ {5B711254-3F53-4E1D-A1AD-CC81E34588B7}.Debug|Win32.ActiveCfg = Debug|Win32
+ {5B711254-3F53-4E1D-A1AD-CC81E34588B7}.Debug|Win32.Build.0 = Debug|Win32
+ {5B711254-3F53-4E1D-A1AD-CC81E34588B7}.Debug|Win32.Deploy.0 = Debug|Win32
+ {5B711254-3F53-4E1D-A1AD-CC81E34588B7}.Debug|x64.ActiveCfg = Debug|x64
+ {5B711254-3F53-4E1D-A1AD-CC81E34588B7}.Debug|x64.Build.0 = Debug|x64
+ {5B711254-3F53-4E1D-A1AD-CC81E34588B7}.Debug|x64.Deploy.0 = Debug|x64
+ {5B711254-3F53-4E1D-A1AD-CC81E34588B7}.Release|ARM.ActiveCfg = Release|Win32
+ {5B711254-3F53-4E1D-A1AD-CC81E34588B7}.Release|ARM64.ActiveCfg = Release|Win32
+ {5B711254-3F53-4E1D-A1AD-CC81E34588B7}.Release|Win32.ActiveCfg = Release|Win32
+ {5B711254-3F53-4E1D-A1AD-CC81E34588B7}.Release|Win32.Build.0 = Release|Win32
+ {5B711254-3F53-4E1D-A1AD-CC81E34588B7}.Release|x64.ActiveCfg = Release|x64
+ {5B711254-3F53-4E1D-A1AD-CC81E34588B7}.Release|x64.Build.0 = Release|x64
+ {6EED5CDD-5526-40DC-97F9-582857E10187}.Debug|ARM.ActiveCfg = Debug|Win32
+ {6EED5CDD-5526-40DC-97F9-582857E10187}.Debug|ARM64.ActiveCfg = Debug|Win32
+ {6EED5CDD-5526-40DC-97F9-582857E10187}.Debug|Win32.ActiveCfg = Debug|Win32
+ {6EED5CDD-5526-40DC-97F9-582857E10187}.Debug|Win32.Build.0 = Debug|Win32
+ {6EED5CDD-5526-40DC-97F9-582857E10187}.Debug|x64.ActiveCfg = Debug|x64
+ {6EED5CDD-5526-40DC-97F9-582857E10187}.Debug|x64.Build.0 = Debug|x64
+ {6EED5CDD-5526-40DC-97F9-582857E10187}.Release|ARM.ActiveCfg = Release|Win32
+ {6EED5CDD-5526-40DC-97F9-582857E10187}.Release|ARM64.ActiveCfg = Release|Win32
+ {6EED5CDD-5526-40DC-97F9-582857E10187}.Release|Win32.ActiveCfg = Release|Win32
+ {6EED5CDD-5526-40DC-97F9-582857E10187}.Release|Win32.Build.0 = Release|Win32
+ {6EED5CDD-5526-40DC-97F9-582857E10187}.Release|x64.ActiveCfg = Release|x64
+ {6EED5CDD-5526-40DC-97F9-582857E10187}.Release|x64.Build.0 = Release|x64
+ {DE70E2D1-6A4D-4984-BD82-CE750889F0D3}.Debug|ARM.ActiveCfg = Debug|Win32
+ {DE70E2D1-6A4D-4984-BD82-CE750889F0D3}.Debug|ARM64.ActiveCfg = Debug|Win32
+ {DE70E2D1-6A4D-4984-BD82-CE750889F0D3}.Debug|Win32.ActiveCfg = Debug|Win32
+ {DE70E2D1-6A4D-4984-BD82-CE750889F0D3}.Debug|Win32.Build.0 = Debug|Win32
+ {DE70E2D1-6A4D-4984-BD82-CE750889F0D3}.Debug|x64.ActiveCfg = Debug|x64
+ {DE70E2D1-6A4D-4984-BD82-CE750889F0D3}.Debug|x64.Build.0 = Debug|x64
+ {DE70E2D1-6A4D-4984-BD82-CE750889F0D3}.Release|ARM.ActiveCfg = Release|Win32
+ {DE70E2D1-6A4D-4984-BD82-CE750889F0D3}.Release|ARM64.ActiveCfg = Release|Win32
+ {DE70E2D1-6A4D-4984-BD82-CE750889F0D3}.Release|Win32.ActiveCfg = Release|Win32
+ {DE70E2D1-6A4D-4984-BD82-CE750889F0D3}.Release|Win32.Build.0 = Release|Win32
+ {DE70E2D1-6A4D-4984-BD82-CE750889F0D3}.Release|x64.ActiveCfg = Release|x64
+ {DE70E2D1-6A4D-4984-BD82-CE750889F0D3}.Release|x64.Build.0 = Release|x64
+ {3CC42473-D121-41F4-AE26-1F2F0AC65E82}.Debug|ARM.ActiveCfg = Debug|Win32
+ {3CC42473-D121-41F4-AE26-1F2F0AC65E82}.Debug|ARM64.ActiveCfg = Debug|Win32
+ {3CC42473-D121-41F4-AE26-1F2F0AC65E82}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3CC42473-D121-41F4-AE26-1F2F0AC65E82}.Debug|Win32.Build.0 = Debug|Win32
+ {3CC42473-D121-41F4-AE26-1F2F0AC65E82}.Debug|Win32.Deploy.0 = Debug|Win32
+ {3CC42473-D121-41F4-AE26-1F2F0AC65E82}.Debug|x64.ActiveCfg = Debug|x64
+ {3CC42473-D121-41F4-AE26-1F2F0AC65E82}.Debug|x64.Build.0 = Debug|x64
+ {3CC42473-D121-41F4-AE26-1F2F0AC65E82}.Debug|x64.Deploy.0 = Debug|x64
+ {3CC42473-D121-41F4-AE26-1F2F0AC65E82}.Release|ARM.ActiveCfg = Release|Win32
+ {3CC42473-D121-41F4-AE26-1F2F0AC65E82}.Release|ARM64.ActiveCfg = Release|Win32
+ {3CC42473-D121-41F4-AE26-1F2F0AC65E82}.Release|Win32.ActiveCfg = Release|Win32
+ {3CC42473-D121-41F4-AE26-1F2F0AC65E82}.Release|Win32.Build.0 = Release|Win32
+ {3CC42473-D121-41F4-AE26-1F2F0AC65E82}.Release|Win32.Deploy.0 = Release|Win32
+ {3CC42473-D121-41F4-AE26-1F2F0AC65E82}.Release|x64.ActiveCfg = Release|x64
+ {3CC42473-D121-41F4-AE26-1F2F0AC65E82}.Release|x64.Build.0 = Release|x64
+ {3CC42473-D121-41F4-AE26-1F2F0AC65E82}.Release|x64.Deploy.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {5B711254-3F53-4E1D-A1AD-CC81E34588B7} = {3B268182-F450-4AB8-B350-A2CF6495F756}
+ {6EED5CDD-5526-40DC-97F9-582857E10187} = {52ABC41E-9AAA-4DA8-8986-F6298E32C8A3}
+ {DE70E2D1-6A4D-4984-BD82-CE750889F0D3} = {97E38EBE-CA24-4E71-9EB1-E2792ABBF622}
+ {3CC42473-D121-41F4-AE26-1F2F0AC65E82} = {1665ED66-7966-4FE2-9BA5-B5843511E325}
+ EndGlobalSection
+EndGlobal
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/Interrupt.c b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/Interrupt.c
new file mode 100644
index 00000000..5573ef6e
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/Interrupt.c
@@ -0,0 +1,206 @@
+/*++
+
+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:
+
+ Interrupt.c
+
+Abstract:
+
+ This modules has routines configure a continuous reader on an
+ interrupt pipe to asynchronously read toggle switch states.
+
+Environment:
+
+ User mode
+
+--*/
+
+#include "osrusbfx2.h"
+
+#if defined(EVENT_TRACING)
+#include "interrupt.tmh"
+#endif
+
+
+/*++
+
+Routine Description:
+
+ This routine configures a continuous reader on the
+ interrupt endpoint. It's called from the PrepareHarware event.
+
+Arguments:
+
+ DeviceContext - The device context to use for configuration
+
+Return Value:
+
+ STATUS_SUCCESS if successful,
+ STATUS_UNSUCCESSFUL or another NTSTATUS error code otherwise.
+
+--*/
+_IRQL_requires_(PASSIVE_LEVEL)
+NTSTATUS
+OsrFxConfigContReaderForInterruptEndPoint(
+ _In_ PDEVICE_CONTEXT DeviceContext
+ )
+{
+ WDF_USB_CONTINUOUS_READER_CONFIG ReaderConfig;
+ NTSTATUS Status;
+
+ WDF_USB_CONTINUOUS_READER_CONFIG_INIT(&ReaderConfig,
+ OsrFxEvtUsbInterruptPipeReadComplete,
+ DeviceContext,
+ sizeof(UCHAR));
+
+ ReaderConfig.EvtUsbTargetPipeReadersFailed = OsrFxEvtUsbInterruptReadersFailed;
+
+ //
+ // Reader requests are not posted to the target automatically.
+ // The driver must explictly call WdfIoTargetStart to kick start the
+ // reader. In this sample, it's done in D0Entry.
+ // By defaut, framework queues two requests to the target
+ // endpoint. Driver can configure up to 10 requests with CONFIG macro.
+ //
+ Status = WdfUsbTargetPipeConfigContinuousReader(DeviceContext->InterruptPipe,
+ &ReaderConfig);
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
+ "OsrFxConfigContReaderForInterruptEndPoint failed %x\n",
+ Status);
+ return Status;
+ }
+
+ return Status;
+}
+
+
+/*++
+
+Routine Description:
+
+ This is the completion routine of the continuous reader. This can be called
+ concurrently on a multiprocessor system if there are multiple readers
+ configured, so make sure to protect access to global resources.
+
+Arguments:
+
+ Buffer - This buffer is freed when this call returns.
+ If the driver wants to delay processing of the buffer, it
+ can take an additional referrence
+
+ Context - Provided in the WDF_USB_CONTINUOUS_READER_CONFIG_INIT macro
+
+Return Value:
+
+ STATUS_SUCCESS if successful,
+ STATUS_UNSUCCESSFUL or another NTSTATUS error code otherwise.
+
+--*/
+VOID
+OsrFxEvtUsbInterruptPipeReadComplete(
+ _In_ WDFUSBPIPE Pipe,
+ _In_ WDFMEMORY Buffer,
+ _In_ size_t NumBytesTransferred,
+ _In_ WDFCONTEXT Context
+ )
+{
+ PUCHAR SwitchState = NULL;
+ WDFDEVICE Device;
+ PDEVICE_CONTEXT DeviceContext = Context;
+
+ UNREFERENCED_PARAMETER(Pipe);
+
+ Device = WdfObjectContextGetObject(DeviceContext);
+
+ //
+ // Make sure that there is data in the read packet. Depending on the device
+ // specification, it is possible for it to return a 0 length read in
+ // certain conditions.
+ //
+ if (NumBytesTransferred == 0)
+ {
+ TraceEvents(TRACE_LEVEL_WARNING, DBG_INIT,
+ "OsrFxEvtUsbInterruptPipeReadComplete Zero length read "
+ "occured on the Interrupt Pipe's Continuous Reader\n");
+ return;
+ }
+
+ assert(NumBytesTransferred == sizeof(UCHAR));
+
+ SwitchState = WdfMemoryGetBuffer(Buffer, NULL);
+
+ TraceEvents(TRACE_LEVEL_INFORMATION, DBG_INIT,
+ "OsrFxEvtUsbInterruptPipeReadComplete SwitchState %x\n",
+ *SwitchState);
+
+ DeviceContext->CurrentSwitchState = *SwitchState;
+
+ //
+ // Handle any pending Interrupt Message IOCTLs. Note that the OSR USB device
+ // will generate an interrupt message when the the device resumes from a low
+ // power state. So if the Interrupt Message IOCTL was sent after the device
+ // has gone to a low power state, the pending Interrupt Message IOCTL will
+ // get completed in the function call below, before the user twiddles the
+ // dip switches on the OSR USB device. If this is not the desired behavior
+ // for your driver, then you could handle this condition by maintaining a
+ // state variable on D0Entry to track interrupt messages caused by power up.
+ //
+ OsrUsbIoctlGetInterruptMessage(Device, STATUS_SUCCESS);
+
+}
+
+
+/*++
+
+Routine Description:
+
+ This the failure routine of the continous reader.
+
+Arguments:
+
+ Pipe - The pipe that failed creation
+
+ Status - The failure NTSTATUS
+
+ UsbdStatus - A USB specific error code
+
+Return Value:
+
+ TRUE
+
+--*/
+BOOLEAN
+OsrFxEvtUsbInterruptReadersFailed(
+ _In_ WDFUSBPIPE Pipe,
+ _In_ NTSTATUS Status,
+ _In_ USBD_STATUS UsbdStatus
+ )
+{
+ WDFDEVICE Device = WdfIoTargetGetDevice(WdfUsbTargetPipeGetIoTarget(Pipe));
+ PDEVICE_CONTEXT DeviceContext = GetDeviceContext(Device);
+
+ UNREFERENCED_PARAMETER(UsbdStatus);
+
+ //
+ // Clear the current switch state.
+ //
+ DeviceContext->CurrentSwitchState = 0;
+
+ //
+ // Service the pending interrupt switch change request
+ //
+ OsrUsbIoctlGetInterruptMessage(Device, Status);
+
+ return TRUE;
+}
+
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/bulkrwr.c b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/bulkrwr.c
new file mode 100644
index 00000000..d29dea0b
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/bulkrwr.c
@@ -0,0 +1,476 @@
+/*++
+
+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:
+
+ bulkrwr.c
+
+Abstract:
+
+ This file has routines to perform reads and writes.
+ The read and writes are targeted bulk to endpoints.
+
+Environment:
+
+ User mode
+
+--*/
+
+#include "osrusbfx2.h"
+
+
+#if defined(EVENT_TRACING)
+#include "bulkrwr.tmh"
+#endif
+
+#pragma warning(disable:4267)
+
+
+/*++
+
+Routine Description:
+
+ Called by the framework when it receives Read or Write requests.
+
+Arguments:
+
+ Queue - Default queue handle
+
+ Request - Handle to the read/write request
+
+ Length - Length of the data buffer associated with the request.
+ The default property of the queue is to not dispatch
+ zero lenght read & write requests to the driver and
+ complete is with status success. So we will never get
+ a zero length request
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+OsrFxEvtIoRead(
+ _In_ WDFQUEUE Queue,
+ _In_ WDFREQUEST Request,
+ _In_ size_t Length
+ )
+{
+ WDFUSBPIPE Pipe;
+ NTSTATUS Status;
+ WDFMEMORY RequiredMemory;
+ PDEVICE_CONTEXT DeviceContext;
+
+ UNREFERENCED_PARAMETER(Queue);
+
+ //
+ // Log read start event, using IRP activity ID if available or request
+ // handle otherwise.
+ //
+ EventWriteReadStart(WdfIoQueueGetDevice(Queue), (ULONG)Length);
+
+ TraceEvents(TRACE_LEVEL_VERBOSE, DBG_READ, "-->OsrFxEvtIoRead\n");
+
+ //
+ // First validate input parameters.
+ //
+ if (Length > TEST_BOARD_TRANSFER_BUFFER_SIZE) {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_READ, "Transfer exceeds %d\n",
+ TEST_BOARD_TRANSFER_BUFFER_SIZE);
+ Status = STATUS_INVALID_PARAMETER;
+ goto Exit;
+ }
+
+ DeviceContext = GetDeviceContext(WdfIoQueueGetDevice(Queue));
+
+ Pipe = DeviceContext->BulkReadPipe;
+
+ Status = WdfRequestRetrieveOutputMemory(Request, &RequiredMemory);
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_READ,
+ "WdfRequestRetrieveOutputMemory failed %!STATUS!\n", Status);
+ goto Exit;
+ }
+
+ //
+ // The format call validates to make sure that you are reading or
+ // writing to the right Pipe type, sets the appropriate transfer flags,
+ // creates an URB and initializes the request.
+ //
+ Status = WdfUsbTargetPipeFormatRequestForRead(Pipe,
+ Request,
+ RequiredMemory,
+ NULL // Offsets
+ );
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_READ,
+ "WdfUsbTargetPipeFormatRequestForRead failed 0x%x\n", Status);
+ goto Exit;
+ }
+
+ WdfRequestSetCompletionRoutine(Request,
+ EvtRequestReadCompletionRoutine,
+ Pipe);
+ //
+ // Send the request asynchronously.
+ //
+ if (WdfRequestSend(Request,
+ WdfUsbTargetPipeGetIoTarget(Pipe),
+ WDF_NO_SEND_OPTIONS) == FALSE)
+ {
+ //
+ // Framework couldn't send the request for some reason.
+ //
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_READ, "WdfRequestSend failed\n");
+ Status = WdfRequestGetStatus(Request);
+ goto Exit;
+ }
+
+Exit:
+
+ if (!NT_SUCCESS(Status))
+ {
+ //
+ // Log event read failed.
+ //
+ EventWriteReadFail(WdfIoQueueGetDevice(Queue), Status);
+ WdfRequestCompleteWithInformation(Request, Status, 0);
+ }
+
+ TraceEvents(TRACE_LEVEL_INFORMATION, DBG_READ, "<-- OsrFxEvtIoRead\n");
+
+ return;
+}
+
+
+/*++
+
+Routine Description:
+
+ This is the completion routine for reads
+ If the irp completes with success, we check if we
+ need to recirculate this irp for another stage of
+ transfer.
+
+Arguments:
+
+ Context - Driver supplied context
+
+ Device - Device handle
+
+ Request - Request handle
+
+ Params - request completion params
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+EvtRequestReadCompletionRoutine(
+ _In_ WDFREQUEST Request,
+ _In_ WDFIOTARGET Target,
+ _In_ PWDF_REQUEST_COMPLETION_PARAMS CompletionParams,
+ _In_ WDFCONTEXT Context
+ )
+{
+ NTSTATUS Status;
+ size_t BytesRead = 0;
+ PWDF_USB_REQUEST_COMPLETION_PARAMS UsbCompletionParams;
+
+ UNREFERENCED_PARAMETER(Target);
+ UNREFERENCED_PARAMETER(Context);
+
+ Status = CompletionParams->IoStatus.Status;
+
+ UsbCompletionParams = CompletionParams->Parameters.Usb.Completion;
+
+ BytesRead = UsbCompletionParams->Parameters.PipeRead.Length;
+
+ if (NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_INFORMATION, DBG_READ,
+ "Number of bytes read: %I64d\n", (INT64)BytesRead);
+ }
+ else
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_READ,
+ "Read failed - request status 0x%x UsbdStatus 0x%x\n",
+ Status, UsbCompletionParams->UsbdStatus);
+
+ }
+
+ //
+ // Log read stop event, using IRP activity ID if available or request
+ // handle otherwise.
+ //
+ EventWriteReadStop(WdfIoQueueGetDevice(WdfRequestGetIoQueue(Request)),
+ BytesRead,
+ Status,
+ UsbCompletionParams->UsbdStatus);
+
+ WdfRequestCompleteWithInformation(Request, Status, BytesRead);
+
+ return;
+}
+
+
+/*++
+
+Routine Description:
+
+ Called by the framework when it receives Read or Write requests.
+
+Arguments:
+
+ Queue - Default queue handle
+
+ Request - Handle to the read/write request
+
+ Lenght - Length of the data buffer associated with the request.
+ The default property of the queue is to not dispatch
+ zero lenght read & write requests to the driver and
+ complete is with status success. So we will never get
+ a zero length request
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+OsrFxEvtIoWrite(
+ _In_ WDFQUEUE Queue,
+ _In_ WDFREQUEST Request,
+ _In_ size_t Length
+ )
+{
+ NTSTATUS Status;
+ WDFUSBPIPE Pipe;
+ WDFMEMORY RequiredMemory;
+ PDEVICE_CONTEXT DeviceContext;
+
+ UNREFERENCED_PARAMETER(Queue);
+
+
+ //
+ // Log write start event, using IRP activity ID if available or request
+ // handle otherwise.
+ //
+ EventWriteWriteStart(WdfIoQueueGetDevice(Queue), (ULONG)Length);
+
+ TraceEvents(TRACE_LEVEL_VERBOSE, DBG_WRITE, "-->OsrFxEvtIoWrite\n");
+
+ //
+ // First validate input parameters.
+ //
+ if (Length > TEST_BOARD_TRANSFER_BUFFER_SIZE)
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_READ,
+ "Transfer exceeds %d\n",
+ TEST_BOARD_TRANSFER_BUFFER_SIZE);
+ Status = STATUS_INVALID_PARAMETER;
+ goto Exit;
+ }
+
+ DeviceContext = GetDeviceContext(WdfIoQueueGetDevice(Queue));
+
+ Pipe = DeviceContext->BulkWritePipe;
+
+ Status = WdfRequestRetrieveInputMemory(Request, &RequiredMemory);
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_WRITE,
+ "WdfRequestRetrieveInputBuffer failed\n");
+ goto Exit;
+ }
+
+ Status = WdfUsbTargetPipeFormatRequestForWrite(Pipe,
+ Request,
+ RequiredMemory,
+ NULL // Offset
+ );
+
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_WRITE,
+ "WdfUsbTargetPipeFormatRequestForWrite failed 0x%x\n", Status);
+ goto Exit;
+ }
+
+ WdfRequestSetCompletionRoutine(Request,
+ EvtRequestWriteCompletionRoutine,
+ Pipe);
+
+ //
+ // Send the request asynchronously.
+ //
+ if (WdfRequestSend(Request,
+ WdfUsbTargetPipeGetIoTarget(Pipe),
+ WDF_NO_SEND_OPTIONS) == FALSE)
+ {
+ //
+ // Framework couldn't send the request for some reason.
+ //
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_WRITE, "WdfRequestSend failed\n");
+ Status = WdfRequestGetStatus(Request);
+ goto Exit;
+ }
+
+Exit:
+
+ if (!NT_SUCCESS(Status))
+ {
+ //
+ // log event write failed.
+ //
+ EventWriteWriteFail(WdfIoQueueGetDevice(Queue), Status);
+ WdfRequestCompleteWithInformation(Request, Status, 0);
+ }
+
+ TraceEvents(TRACE_LEVEL_VERBOSE, DBG_WRITE, "<-- OsrFxEvtIoWrite\n");
+
+ return;
+}
+
+
+/*++
+
+Routine Description:
+
+ This is the completion routine for writes
+ If the irp completes with success, we check if we
+ need to recirculate this irp for another stage of
+ transfer.
+
+Arguments:
+
+ Context - Driver supplied context
+
+ Device - Device handle
+
+ Request - Request handle
+
+ Params - request completion params
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+EvtRequestWriteCompletionRoutine(
+ _In_ WDFREQUEST Request,
+ _In_ WDFIOTARGET Target,
+ _In_ PWDF_REQUEST_COMPLETION_PARAMS CompletionParams,
+ _In_ WDFCONTEXT Context
+ )
+{
+ NTSTATUS Status;
+ size_t BytesWritten = 0;
+ PWDF_USB_REQUEST_COMPLETION_PARAMS UsbCompletionParams;
+
+ UNREFERENCED_PARAMETER(Target);
+ UNREFERENCED_PARAMETER(Context);
+
+ Status = CompletionParams->IoStatus.Status;
+
+ //
+ // For usb devices, we should look at the Usb.Completion param.
+ //
+ UsbCompletionParams = CompletionParams->Parameters.Usb.Completion;
+
+ BytesWritten = UsbCompletionParams->Parameters.PipeWrite.Length;
+
+ if (NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_INFORMATION, DBG_WRITE,
+ "Number of bytes written: %I64d\n",
+ (INT64)BytesWritten);
+ }
+ else
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_WRITE,
+ "Write failed: request status 0x%x UsbdStatus 0x%x\n",
+ Status,
+ UsbCompletionParams->UsbdStatus);
+ }
+
+ //
+ // Log write stop event, using IRP activtiy ID if available or request
+ // handle otherwise.
+ //
+ EventWriteWriteStop(WdfIoQueueGetDevice(WdfRequestGetIoQueue(Request)),
+ BytesWritten,
+ Status,
+ UsbCompletionParams->UsbdStatus);
+
+ WdfRequestCompleteWithInformation(Request, Status, BytesWritten);
+
+ return;
+}
+
+
+/*++
+
+Routine Description:
+
+ This callback is invoked on every inflight request when the device
+ is suspended or removed. Since our inflight read and write requests
+ are actually pending in the target device, we will just acknowledge
+ its presence. Until we acknowledge, complete, or requeue the requests
+ framework will wait before allowing the device suspend or remove to
+ proceeed. When the underlying USB stack gets the request to suspend or
+ remove, it will fail all the pending requests.
+
+Arguments:
+
+ Queue - Handle to queue object that is associated with the I/O request
+
+ Request - Handle to a request object
+
+ ActionFlags - Bitwise OR of one or more WDF_REQUEST_STOP_ACTION_FLAGS flags
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+OsrFxEvtIoStop(
+ _In_ WDFQUEUE Queue,
+ _In_ WDFREQUEST Request,
+ _In_ ULONG ActionFlags
+ )
+{
+ UNREFERENCED_PARAMETER(Queue);
+ UNREFERENCED_PARAMETER(ActionFlags);
+
+ if (ActionFlags & WdfRequestStopActionSuspend)
+ {
+ //
+ // Don't requeue.
+ //
+ WdfRequestStopAcknowledge(Request, FALSE);
+ }
+ else if(ActionFlags & WdfRequestStopActionPurge)
+ {
+ WdfRequestCancelSentRequest(Request);
+ }
+ return;
+}
+
+
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/device.c b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/device.c
new file mode 100644
index 00000000..a32ab79e
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/device.c
@@ -0,0 +1,1014 @@
+/*++
+
+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:
+
+ Device.c
+
+Abstract:
+
+ USB device driver for OSR USB-FX2 Learning Kit
+
+Environment:
+
+ User mode only
+
+--*/
+
+#include "osrusbfx2.h"
+#include <devpkey.h>
+
+#if defined(EVENT_TRACING)
+#include "Device.tmh"
+#endif
+
+#ifdef ALLOC_PRAGMA
+#pragma alloc_text(PAGE, OsrFxEvtDeviceAdd)
+#pragma alloc_text(PAGE, OsrFxEvtDevicePrepareHardware)
+#pragma alloc_text(PAGE, OsrFxEvtDeviceD0Exit)
+#pragma alloc_text(PAGE, SelectInterfaces)
+#pragma alloc_text(PAGE, OsrFxSetPowerPolicy)
+#pragma alloc_text(PAGE, OsrFxReadFdoRegistryKeyValue)
+#pragma alloc_text(PAGE, GetDeviceEventLoggingNames)
+#endif
+
+
+/*++
+Routine Description:
+
+ EvtDeviceAdd is called by the framework in response to AddDevice
+ call from the PnP manager. We create and initialize a Device object to
+ represent a new instance of the device. All the software resources
+ should be allocated in this callback.
+
+Arguments:
+
+ Driver - Handle to a framework driver object created in DriverEntry
+
+ DeviceInit - Pointer to a framework-allocated WDFDEVICE_INIT structure
+
+Return Value:
+
+ STATUS_SUCCESS if successful,
+ STATUS_UNSUCCESSFUL or another NTSTATUS error code otherwise.
+
+--*/
+NTSTATUS
+OsrFxEvtDeviceAdd(
+ _In_ WDFDRIVER Driver,
+ _In_ PWDFDEVICE_INIT DeviceInit
+ )
+{
+ WDF_PNPPOWER_EVENT_CALLBACKS PnpPowerCallbacks;
+ WDF_OBJECT_ATTRIBUTES Attributes;
+ NTSTATUS Status;
+ WDFDEVICE Device;
+ WDF_DEVICE_PNP_CAPABILITIES PnpCaps;
+ WDF_IO_QUEUE_CONFIG IoQueueConfig;
+ PDEVICE_CONTEXT DeviceContext;
+ WDFQUEUE Queue;
+ GUID Activity;
+
+ UNREFERENCED_PARAMETER(Driver);
+
+ PAGED_CODE();
+
+ TraceEvents(TRACE_LEVEL_INFORMATION, DBG_PNP,"--> OsrFxEvtDeviceAdd routine\n");
+
+ //
+ // Initialize the PnpPowerCallbacks structure. Callback events for PNP
+ // and Power are specified here. If you don't supply any callbacks,
+ // the Framework will take appropriate default actions based on whether
+ // DeviceInit is initialized to be an FDO, a PDO or a filter device
+ // object.
+ //
+ WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&PnpPowerCallbacks);
+
+ //
+ // For usb Devices, PrepareHardware callback is the to place select the
+ // interface and configure the device.
+ //
+ PnpPowerCallbacks.EvtDevicePrepareHardware = OsrFxEvtDevicePrepareHardware;
+
+ //
+ // These two callbacks start and stop the wdfusb pipe continuous reader
+ // as we go in and out of the D0-working state.
+ //
+ PnpPowerCallbacks.EvtDeviceD0Entry = OsrFxEvtDeviceD0Entry;
+ PnpPowerCallbacks.EvtDeviceD0Exit = OsrFxEvtDeviceD0Exit;
+ PnpPowerCallbacks.EvtDeviceSelfManagedIoFlush = OsrFxEvtDeviceSelfManagedIoFlush;
+
+ WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &PnpPowerCallbacks);
+
+ WdfDeviceInitSetIoType(DeviceInit, WdfDeviceIoBuffered);
+
+ //
+ // Now specify the size of the device extension where we track per-device
+ // context. DeviceInit is completely initialized. So, call the framework
+ // to create the device and attach it to the lower stack.
+ //
+ WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&Attributes, DEVICE_CONTEXT);
+
+ Status = WdfDeviceCreate(&DeviceInit, &Attributes, &Device);
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
+ "WdfDeviceCreate failed with Status code %!STATUS!\n", Status);
+ return Status;
+ }
+
+ //
+ // Setup the Activity ID so that we can log events using it.
+ //
+ Activity = DeviceToActivityId(Device);
+
+ //
+ // Get the DeviceObject context by using accessor function specified in
+ // the WDF_DECLARE_CONTEXT_TYPE_WITH_NAME macro for DEVICE_CONTEXT.
+ //
+ DeviceContext = GetDeviceContext(Device);
+
+ //
+ // Get the device's friendly name and location so that we can use it in
+ // error logging. If this fails then it will setup dummy strings.
+ //
+ GetDeviceEventLoggingNames(Device);
+
+ //
+ // Tell the framework to set the SurpriseRemovalOK in the DeviceCaps so
+ // that you don't get the popup in user-mode when you surprise remove the device.
+ //
+ WDF_DEVICE_PNP_CAPABILITIES_INIT(&PnpCaps);
+ PnpCaps.SurpriseRemovalOK = WdfTrue;
+
+ WdfDeviceSetPnpCapabilities(Device, &PnpCaps);
+
+ //
+ // Create a parallel default queue and register an event callback to
+ // receive ioctl requests. We will create separate Queues for
+ // handling read and write requests. All other requests will be
+ // completed with error Status automatically by the framework.
+ //
+ WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&IoQueueConfig,
+ WdfIoQueueDispatchParallel);
+
+ IoQueueConfig.EvtIoDeviceControl = OsrFxEvtIoDeviceControl;
+
+ //
+ // By default, Static Driver Verifier (SDV) displays a warning if it
+ // doesn't find the EvtIoStop callback on a power-managed queue.
+ // The 'assume' below causes SDV to suppress this warning. If the driver
+ // has not explicitly set PowerManaged to WdfFalse, the framework creates
+ // power-managed queues when the device is not a filter driver. Normally
+ // the EvtIoStop is required for power-managed queues, but for this driver
+ // it is not needed b/c the driver doesn't hold on to the requests for a
+ // long time or forward them to other drivers.
+ //
+ // If the EvtIoStop callback is not implemented, the framework waits for
+ // all driver-owned requests to be done before moving into the Dx/sleep
+ // states or before removing the device, which is the correct behavior
+ // for this type of driver. If the requests were taking an indeterminate
+ // amount of time to complete, or if the driver forwarded the requests
+ // to a lower driver/another stack, the queue should have an
+ // EvtIoStop/EvtIoResume.
+ //
+ __analysis_assume(IoQueueConfig.EvtIoStop != 0);
+
+ Status = WdfIoQueueCreate(Device,
+ &IoQueueConfig,
+ WDF_NO_OBJECT_ATTRIBUTES,
+ &Queue);
+
+ __analysis_assume(IoQueueConfig.EvtIoStop == 0);
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
+ "WdfIoQueueCreate failed %!STATUS!\n", Status);
+ goto Error;
+ }
+
+ //
+ // We will create a separate sequential queue and configure it
+ // to receive read requests. We also need to register a EvtIoStop
+ // handler so that we can acknowledge requests that are pending
+ // at the target driver.
+ //
+ WDF_IO_QUEUE_CONFIG_INIT(&IoQueueConfig, WdfIoQueueDispatchSequential);
+
+ IoQueueConfig.EvtIoRead = OsrFxEvtIoRead;
+ IoQueueConfig.EvtIoStop = OsrFxEvtIoStop;
+
+ Status = WdfIoQueueCreate(Device,
+ &IoQueueConfig,
+ WDF_NO_OBJECT_ATTRIBUTES,
+ &Queue);
+
+ if (!NT_SUCCESS (Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
+ "WdfIoQueueCreate failed 0x%x\n", Status);
+ goto Error;
+ }
+
+ Status = WdfDeviceConfigureRequestDispatching(Device,
+ Queue,
+ WdfRequestTypeRead);
+
+ if (!NT_SUCCESS (Status))
+ {
+ assert(NT_SUCCESS(Status));
+
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
+ "WdfDeviceConfigureRequestDispatching failed 0x%x\n", Status);
+ goto Error;
+ }
+
+
+ //
+ // We will create another sequential queue and configure it
+ // to receive write requests.
+ //
+ WDF_IO_QUEUE_CONFIG_INIT(&IoQueueConfig, WdfIoQueueDispatchSequential);
+
+ IoQueueConfig.EvtIoWrite = OsrFxEvtIoWrite;
+ IoQueueConfig.EvtIoStop = OsrFxEvtIoStop;
+
+ Status = WdfIoQueueCreate(Device,
+ &IoQueueConfig,
+ WDF_NO_OBJECT_ATTRIBUTES,
+ &Queue);
+
+ if (!NT_SUCCESS (Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
+ "WdfIoQueueCreate failed 0x%x\n", Status);
+ goto Error;
+ }
+
+ Status = WdfDeviceConfigureRequestDispatching(Device,
+ Queue,
+ WdfRequestTypeWrite);
+
+ if (!NT_SUCCESS (Status))
+ {
+ assert(NT_SUCCESS(Status));
+
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
+ "WdfDeviceConfigureRequestDispatching failed 0x%x\n", Status);
+ goto Error;
+ }
+
+ //
+ // Register a manual I/O queue for handling Interrupt Message Read Requests.
+ // This queue will be used for storing requests that need to wait for an
+ // interrupt to occur before they can be completed.
+ //
+ WDF_IO_QUEUE_CONFIG_INIT(&IoQueueConfig, WdfIoQueueDispatchManual);
+
+ //
+ // This queue is used for requests that don't directly access the device. The
+ // requests in this queue are serviced only when the device is in a fully
+ // powered state and sends an interrupt. So we can use a non-power managed
+ // queue to park the requests since we dont care whether the device is idle
+ // or fully powered up.
+ //
+ IoQueueConfig.PowerManaged = WdfFalse;
+
+ Status = WdfIoQueueCreate(Device,
+ &IoQueueConfig,
+ WDF_NO_OBJECT_ATTRIBUTES,
+ &DeviceContext->InterruptMsgQueue);
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
+ "WdfIoQueueCreate failed 0x%x\n", Status);
+ goto Error;
+ }
+
+ //
+ // Register a device interface so that app can find our device and talk to it.
+ //
+ Status = WdfDeviceCreateDeviceInterface(Device,
+ (LPGUID) &GUID_DEVINTERFACE_OSRUSBFX2,
+ NULL // Reference string
+ );
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
+ "WdfDeviceCreateDeviceInterface failed %!STATUS!\n", Status);
+ goto Error;
+ }
+
+#if defined(NTDDI_WIN10_RS2) && (NTDDI_VERSION >= NTDDI_WIN10_RS2)
+ //
+ // Adding Custom Capability:
+ //
+ // Adds a custom capability to the device interface instance that allows a Windows
+ // Store device app to access this interface using Windows.Devices.Custom namespace.
+ // This capability can be defined either in the INF or here as shown below. In order
+ // to define it from the INF, uncomment the section "OsrUsb Interface installation"
+ // from the INF and then remove the block of code below.
+ //
+ WDF_DEVICE_INTERFACE_PROPERTY_DATA PropertyData = { 0 };
+ static const wchar_t customCapabilities[] = L"microsoft.hsaTestCustomCapability_q536wpkpf5cy2\0";
+
+ WDF_DEVICE_INTERFACE_PROPERTY_DATA_INIT(&PropertyData,
+ &GUID_DEVINTERFACE_OSRUSBFX2,
+ &DEVPKEY_DeviceInterface_UnrestrictedAppCapabilities);
+
+ Status = WdfDeviceAssignInterfaceProperty(Device,
+ &PropertyData,
+ DEVPROP_TYPE_STRING_LIST,
+ sizeof(customCapabilities),
+ (PVOID)customCapabilities);
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
+ "WdfDeviceAssignInterfaceProperty failed %!STATUS!\n", Status);
+ goto Error;
+ }
+#endif
+
+ //
+ // Create the lock that we use to serialize calls to ResetDevice(). As an
+ // alternative to using a WDFWAITLOCK to serialize the calls, a sequential
+ // WDFQUEUE can be created and reset IOCTLs would be forwarded to it.
+ //
+ WDF_OBJECT_ATTRIBUTES_INIT(&Attributes);
+ Attributes.ParentObject = Device;
+
+ Status = WdfWaitLockCreate(&Attributes, &DeviceContext->ResetDeviceWaitLock);
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
+ "WdfWaitLockCreate failed %!STATUS!\n", Status);
+ goto Error;
+ }
+
+ TraceEvents(TRACE_LEVEL_INFORMATION, DBG_PNP, "<-- OsrFxEvtDeviceAdd\n");
+
+ return Status;
+
+Error:
+
+ //
+ // Log failure to add the device.
+ //
+ EventWriteFailAddDevice(DeviceContext->DeviceName,
+ DeviceContext->Location,
+ Status);
+
+ return Status;
+}
+
+
+/*++
+
+Routine Description:
+
+ In this callback, the driver does whatever is necessary to make the
+ hardware ready to use. In the case of a USB device, this involves
+ reading and selecting descriptors.
+
+Arguments:
+
+ Device - Handle to the device
+
+ ResourceList - Handle to a resource-list object that identifies the
+ raw hardware resources that the PnP manager assigned
+ to the Device
+
+ ResourceListTranslated - Handle to a resource-list object that
+ identifies the translated hardware resources
+ that the PnP manager assigned to the device
+
+Return Value:
+
+ STATUS_SUCCESS if successful,
+ STATUS_UNSUCCESSFUL or another NTSTATUS error code otherwise.
+
+--*/
+NTSTATUS
+OsrFxEvtDevicePrepareHardware(
+ _In_ WDFDEVICE Device,
+ _In_ WDFCMRESLIST ResourceList,
+ _In_ WDFCMRESLIST ResourceListTranslated
+ )
+{
+ NTSTATUS Status;
+ PDEVICE_CONTEXT DeviceContext;
+ WDF_USB_DEVICE_INFORMATION DeviceInfo;
+ ULONG WaitWakeEnable;
+
+ UNREFERENCED_PARAMETER(ResourceList);
+ UNREFERENCED_PARAMETER(ResourceListTranslated);
+
+ WaitWakeEnable = FALSE;
+
+ PAGED_CODE();
+
+ TraceEvents(TRACE_LEVEL_INFORMATION, DBG_PNP,
+ "--> EvtDevicePrepareHardware\n");
+
+ DeviceContext = GetDeviceContext(Device);
+
+ //
+ // Create a USB device handle so that we can communicate with the
+ // underlying USB stack. The WDFUSBDEVICE handle is used to query,
+ // configure, and manage all aspects of the USB device.
+ // These aspects include device properties, bus properties,
+ // and I/O creation and synchronization. We only create the device the
+ // first time that PrepareHardware is called. If the device is restarted by
+ // PnP Manager to rebalance resources, we will use the same device handle
+ // but then select the interfaces again because the USB stack could
+ // reconfigure the device on restart.
+ //
+ if (DeviceContext->UsbDevice == NULL)
+ {
+ Status = WdfUsbTargetDeviceCreate(Device,
+ WDF_NO_OBJECT_ATTRIBUTES,
+ &DeviceContext->UsbDevice);
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
+ "WdfUsbTargetDeviceCreate failed with status code %!STATUS!\n", Status);
+ return Status;
+ }
+ }
+
+ //
+ // Retrieve USBD version information, port driver capabilites and device
+ // capabilites such as speed, power, etc.
+ //
+ WDF_USB_DEVICE_INFORMATION_INIT(&DeviceInfo);
+
+ Status = WdfUsbTargetDeviceRetrieveInformation(DeviceContext->UsbDevice,
+ &DeviceInfo);
+ if (NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_INFORMATION, DBG_PNP,
+ "IsDeviceHighSpeed: %s\n",
+ (DeviceInfo.Traits & WDF_USB_DEVICE_TRAIT_AT_HIGH_SPEED) ? "TRUE" :
+ "FALSE");
+
+ TraceEvents(TRACE_LEVEL_INFORMATION, DBG_PNP,
+ "IsDeviceSelfPowered: %s\n",
+ (DeviceInfo.Traits & WDF_USB_DEVICE_TRAIT_SELF_POWERED) ? "TRUE" :
+ "FALSE");
+
+ WaitWakeEnable = DeviceInfo.Traits &
+ WDF_USB_DEVICE_TRAIT_REMOTE_WAKE_CAPABLE;
+
+ TraceEvents(TRACE_LEVEL_INFORMATION, DBG_PNP,
+ "IsDeviceRemoteWakeable: %s\n",
+ WaitWakeEnable ? "TRUE" :
+ "FALSE");
+ //
+ // Save these for use later.
+ //
+ DeviceContext->UsbDeviceTraits = DeviceInfo.Traits;
+ }
+ else
+ {
+ DeviceContext->UsbDeviceTraits = 0;
+ }
+
+ Status = SelectInterfaces(Device);
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
+ "SelectInterfaces failed 0x%x\n", Status);
+
+ return Status;
+ }
+
+ //
+ // Enable wait-wake and idle timeout if the device supports it.
+ //
+ if (WaitWakeEnable)
+ {
+ Status = OsrFxSetPowerPolicy(Device);
+
+ if (!NT_SUCCESS (Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
+ "OsrFxSetPowerPolicy failed %!STATUS!\n", Status);
+ return Status;
+ }
+ }
+
+ Status = OsrFxConfigContReaderForInterruptEndPoint(DeviceContext);
+
+ TraceEvents(TRACE_LEVEL_INFORMATION, DBG_PNP, "<-- EvtDevicePrepareHardware\n");
+
+ return Status;
+}
+
+
+/*++
+
+Routine Description:
+
+ EvtDeviceD0Entry event callback must perform any operations that are
+ necessary before the specified device is used. It will be called every
+ time the hardware needs to be (re-)initialized.
+
+ This function is not marked pageable because this function is in the
+ device power-up path. When a function is marked pagable and the code
+ section is paged out, it will generate a page fault which could impact
+ the fast resume behavior because the client driver will have to wait
+ until the system drivers can service this page fault.
+
+ This function runs at PASSIVE_LEVEL, even though it is not paged. A
+ driver can optionally make this function pageable if DO_POWER_PAGABLE
+ is set. Even if DO_POWER_PAGABLE isn't set, this function still runs
+ at PASSIVE_LEVEL. In this case, though, the function absolutely must
+ not do anything that will cause a page fault.
+
+Arguments:
+
+ Device - Handle to a framework device object
+
+ PreviousState - Device power state which the device was in most recently.
+ If the device is being newly started, this will be
+ PowerDeviceUnspecified.
+
+Return Value:
+
+ STATUS_SUCCESS if successful,
+ STATUS_UNSUCCESSFUL or another NTSTATUS error code otherwise.
+
+--*/
+NTSTATUS
+OsrFxEvtDeviceD0Entry(
+ _In_ WDFDEVICE Device,
+ _In_ WDF_POWER_DEVICE_STATE PreviousState
+ )
+{
+ PDEVICE_CONTEXT DeviceContext;
+ NTSTATUS Status;
+ BOOLEAN IsTargetStarted;
+
+ DeviceContext = GetDeviceContext(Device);
+ IsTargetStarted = FALSE;
+
+ TraceEvents(TRACE_LEVEL_INFORMATION, DBG_POWER,
+ "-->OsrFxEvtEvtDeviceD0Entry - coming from %s\n",
+ DbgDevicePowerString(PreviousState));
+
+ //
+ // Since continuous reader is configured for this interrupt-pipe, we must explicitly start
+ // the I/O target to get the framework to post read requests.
+ //
+ Status = WdfIoTargetStart(WdfUsbTargetPipeGetIoTarget(DeviceContext->InterruptPipe));
+
+ if (!NT_SUCCESS(Status)) {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_POWER,
+ "Failed to start interrupt pipe %!STATUS!\n", Status);
+ goto End;
+ }
+
+ IsTargetStarted = TRUE;
+
+End:
+
+ if (!NT_SUCCESS(Status))
+ {
+ //
+ // Failure in D0Entry will lead to the device being removed. So stop
+ // sthe continuous reader in preparation for the ensuing remove.
+ //
+ if (IsTargetStarted)
+ {
+ WdfIoTargetStop(WdfUsbTargetPipeGetIoTarget(DeviceContext->InterruptPipe),
+ WdfIoTargetCancelSentIo);
+ }
+ }
+
+ TraceEvents(TRACE_LEVEL_INFORMATION, DBG_POWER, "<--OsrFxEvtEvtDeviceD0Entry\n");
+
+ return Status;
+}
+
+
+/*++
+
+Routine Description:
+
+ This routine undoes anything done in EvtDeviceD0Entry. It is called
+ whenever the device leaves the D0 state, which happens when the device is
+ stopped, when it is removed, and when it is powered off.
+
+ The device is still in D0 when this callback is invoked, which means that
+ the driver can still touch hardware in this routine.
+
+ EvtDeviceD0Exit event callback must perform any operations that are
+ necessary before the specified device is moved out of the D0 state. If the
+ driver needs to save hardware state before the device is powered down, then
+ that should be done here.
+
+ This function runs at PASSIVE_LEVEL, though it is generally not paged. A
+ driver can optionally make this function pageable if DO_POWER_PAGABLE is set.
+
+ Even if DO_POWER_PAGABLE isn't set, this function still runs at
+ PASSIVE_LEVEL. In this case, though, the function absolutely must not do
+ anything that will cause a page fault.
+
+Arguments:
+
+ Device - Handle to a framework device object
+
+ TargetState - Device power state which the device will be put in once this
+ callback is complete
+
+Return Value:
+
+ STATUS_SUCCESS if successful,
+ STATUS_UNSUCCESSFUL or another NTSTATUS error code otherwise.
+
+ If this function succeeds it implies that the device can be used.
+
+--*/
+NTSTATUS
+OsrFxEvtDeviceD0Exit(
+ _In_ WDFDEVICE Device,
+ _In_ WDF_POWER_DEVICE_STATE TargetState
+ )
+{
+ PDEVICE_CONTEXT DeviceContext;
+
+ PAGED_CODE();
+
+ TraceEvents(TRACE_LEVEL_INFORMATION, DBG_POWER,
+ "-->OsrFxEvtDeviceD0Exit - moving to %s\n",
+ DbgDevicePowerString(TargetState));
+
+ DeviceContext = GetDeviceContext(Device);
+
+ WdfIoTargetStop(WdfUsbTargetPipeGetIoTarget(DeviceContext->InterruptPipe), WdfIoTargetCancelSentIo);
+
+ TraceEvents(TRACE_LEVEL_INFORMATION, DBG_POWER,
+ "<--OsrFxEvtDeviceD0Exit\n");
+
+ return STATUS_SUCCESS;
+}
+
+
+/*++
+
+Routine Description:
+
+ This routine handles flush Activity for the device's
+ self-managed I/O operations.
+
+Arguments:
+
+ Device - Handle to a framework device object
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+OsrFxEvtDeviceSelfManagedIoFlush(
+ _In_ WDFDEVICE Device
+ )
+{
+ //
+ // Service the interrupt message queue to drain any outstanding
+ // requests
+ //
+ OsrUsbIoctlGetInterruptMessage(Device, STATUS_DEVICE_REMOVED);
+}
+
+
+/*++
+
+Routine Description:
+
+ This routine sets the power policy for the device.
+
+Arguments:
+
+ Device - Handle to a framework device object
+
+Return Value:
+
+ STATUS_SUCCESS if successful,
+ STATUS_UNSUCCESSFUL or another NTSTATUS error code otherwise.
+
+--*/
+_IRQL_requires_(PASSIVE_LEVEL)
+NTSTATUS
+OsrFxSetPowerPolicy(
+ _In_ WDFDEVICE Device
+ )
+{
+ WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS idleSettings;
+ WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS wakeSettings;
+ NTSTATUS Status = STATUS_SUCCESS;
+
+ PAGED_CODE();
+
+ //
+ // Init the idle policy structure.
+ //
+ WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS_INIT(&idleSettings, IdleUsbSelectiveSuspend);
+
+ idleSettings.IdleTimeout = 10000; // 10 seconds
+
+ Status = WdfDeviceAssignS0IdleSettings(Device, &idleSettings);
+
+ if ( !NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
+ "WdfDeviceSetPowerPolicyS0IdlePolicy failed %x\n", Status);
+ return Status;
+ }
+
+ //
+ // Init wait-wake policy structure.
+ //
+ WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS_INIT(&wakeSettings);
+
+ Status = WdfDeviceAssignSxWakeSettings(Device, &wakeSettings);
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
+ "WdfDeviceAssignSxWakeSettings failed %x\n", Status);
+ return Status;
+ }
+
+ return Status;
+}
+
+
+/*++
+
+Routine Description:
+
+ This helper routine selects the configuration, interface and
+ creates a context for every pipe (end point) in that interface.
+
+Arguments:
+
+ Device - Handle to a framework device object
+
+Return Value:
+
+ STATUS_SUCCESS if successful,
+ STATUS_UNSUCCESSFUL or another NTSTATUS error code otherwise.
+
+--*/
+_IRQL_requires_(PASSIVE_LEVEL)
+NTSTATUS
+SelectInterfaces(
+ _In_ WDFDEVICE Device
+ )
+{
+ WDF_USB_DEVICE_SELECT_CONFIG_PARAMS configParams;
+ NTSTATUS Status = STATUS_SUCCESS;
+ PDEVICE_CONTEXT DeviceContext;
+ WDFUSBPIPE Pipe;
+ WDF_USB_PIPE_INFORMATION PipeInfo;
+ UCHAR Index;
+ UCHAR NumberConfiguredPipes;
+ WDFUSBINTERFACE UsbInterface;
+
+ PAGED_CODE();
+
+ DeviceContext = GetDeviceContext(Device);
+
+ WDF_USB_DEVICE_SELECT_CONFIG_PARAMS_INIT_SINGLE_INTERFACE( &configParams);
+
+ UsbInterface = WdfUsbTargetDeviceGetInterface(DeviceContext->UsbDevice, 0);
+
+ if (NULL == UsbInterface)
+ {
+ Status = STATUS_UNSUCCESSFUL;
+
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
+ "WdfUsbTargetDeviceGetInterface 0 failed %!STATUS! \n",
+ Status);
+ return Status;
+ }
+
+ configParams.Types.SingleInterface.ConfiguredUsbInterface = UsbInterface;
+
+ configParams.Types.SingleInterface.NumberConfiguredPipes = WdfUsbInterfaceGetNumConfiguredPipes(UsbInterface);
+
+ DeviceContext->UsbInterface = configParams.Types.SingleInterface.ConfiguredUsbInterface;
+
+ NumberConfiguredPipes = configParams.Types.SingleInterface.NumberConfiguredPipes;
+
+ //
+ // Get pipe handles.
+ //
+ for (Index = 0; Index < NumberConfiguredPipes; Index++)
+ {
+ WDF_USB_PIPE_INFORMATION_INIT(&PipeInfo);
+
+ Pipe = WdfUsbInterfaceGetConfiguredPipe(DeviceContext->UsbInterface,
+ Index,
+ &PipeInfo);
+
+ //
+ // Tell the framework that it's okay to read less than
+ // MaximumPacketSize.
+ //
+ WdfUsbTargetPipeSetNoMaximumPacketSizeCheck(Pipe);
+
+ if (WdfUsbPipeTypeInterrupt == PipeInfo.PipeType)
+ {
+ TraceEvents(TRACE_LEVEL_INFORMATION, DBG_IOCTL,
+ "Interrupt Pipe is 0x%p\n", Pipe);
+ DeviceContext->InterruptPipe = Pipe;
+ }
+
+ if ((WdfUsbPipeTypeBulk == PipeInfo.PipeType) &&
+ (WdfUsbTargetPipeIsInEndpoint(Pipe)))
+ {
+ TraceEvents(TRACE_LEVEL_INFORMATION, DBG_IOCTL,
+ "BulkInput Pipe is 0x%p\n", Pipe);
+ DeviceContext->BulkReadPipe = Pipe;
+ }
+
+ if ((WdfUsbPipeTypeBulk == PipeInfo.PipeType) &&
+ (WdfUsbTargetPipeIsOutEndpoint(Pipe)))
+ {
+ TraceEvents(TRACE_LEVEL_INFORMATION, DBG_IOCTL,
+ "BulkOutput Pipe is 0x%p\n", Pipe);
+ DeviceContext->BulkWritePipe = Pipe;
+ }
+
+ }
+
+ //
+ // If we didn't find all 3 pipes, fail the start.
+ //
+ if (!((DeviceContext->BulkWritePipe) &&
+ ((DeviceContext->BulkReadPipe) &&
+ (DeviceContext->InterruptPipe))))
+ {
+ Status = STATUS_INVALID_DEVICE_STATE;
+
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
+ "Device is not configured properly %!STATUS!\n",
+ Status);
+
+ return Status;
+ }
+
+ return Status;
+}
+
+
+/*++
+
+Routine Description:
+
+ Retrieve the friendly name and the location string into WDFMEMORY objects
+ and store them in the device context.
+
+Arguments:
+
+ Device - Handle to a device framework object
+
+Return Value:
+
+ VOID
+
+--*/
+_IRQL_requires_(PASSIVE_LEVEL)
+VOID
+GetDeviceEventLoggingNames(
+ _In_ WDFDEVICE Device
+ )
+{
+ PDEVICE_CONTEXT DeviceContext = GetDeviceContext(Device);
+ WDF_OBJECT_ATTRIBUTES ObjectAttributes;
+ WDFMEMORY DeviceNameMemory = NULL;
+ WDFMEMORY LocationMemory = NULL;
+ NTSTATUS Status;
+
+ PAGED_CODE();
+
+ //
+ // We want both memory objects to be children of the device so that they
+ // will be deleted automatically when the device is removed.
+ //
+ WDF_OBJECT_ATTRIBUTES_INIT(&ObjectAttributes);
+ ObjectAttributes.ParentObject = Device;
+
+ //
+ // First get the length of the string. If the FriendlyName
+ // is not there then get the length of the device's description.
+ //
+ Status = WdfDeviceAllocAndQueryProperty(Device,
+ DevicePropertyFriendlyName,
+ NonPagedPoolNx,
+ &ObjectAttributes,
+ &DeviceNameMemory);
+
+ if (!NT_SUCCESS(Status))
+ {
+ Status = WdfDeviceAllocAndQueryProperty(Device,
+ DevicePropertyDeviceDescription,
+ NonPagedPoolNx,
+ &ObjectAttributes,
+ &DeviceNameMemory);
+ }
+
+ if (NT_SUCCESS(Status))
+ {
+ DeviceContext->DeviceNameMemory = DeviceNameMemory;
+ DeviceContext->DeviceName = WdfMemoryGetBuffer(DeviceNameMemory, NULL);
+ }
+ else
+ {
+ DeviceContext->DeviceNameMemory = NULL;
+ DeviceContext->DeviceName = L"(error retrieving name)";
+ }
+
+ //
+ // Retrieve the device location string.
+ //
+ Status = WdfDeviceAllocAndQueryProperty(Device,
+ DevicePropertyLocationInformation,
+ NonPagedPoolNx,
+ WDF_NO_OBJECT_ATTRIBUTES,
+ &LocationMemory);
+
+ if (NT_SUCCESS(Status))
+ {
+ DeviceContext->LocationMemory = LocationMemory;
+ DeviceContext->Location = WdfMemoryGetBuffer(LocationMemory, NULL);
+ }
+ else
+ {
+ DeviceContext->LocationMemory = NULL;
+ DeviceContext->Location = L"(error retrieving location)";
+ }
+}
+
+
+/*++
+
+Routine Description:
+
+ Retrieve the correct string for a given power device state.
+
+Arguments:
+
+ Type - The device power state to turn into a string
+
+Return Value:
+
+ The name that corresponds to the WDF_POWER_DEVICE_STATE given, or
+ "Unknown Device Power State" if none was found.
+
+--*/
+_IRQL_requires_(PASSIVE_LEVEL)
+PCHAR
+DbgDevicePowerString(
+ _In_ WDF_POWER_DEVICE_STATE Type
+ )
+{
+ switch (Type)
+ {
+ case WdfPowerDeviceInvalid:
+ return "WdfPowerDeviceInvalid";
+ case WdfPowerDeviceD0:
+ return "WdfPowerDeviceD0";
+ case WdfPowerDeviceD1:
+ return "WdfPowerDeviceD1";
+ case WdfPowerDeviceD2:
+ return "WdfPowerDeviceD2";
+ case WdfPowerDeviceD3:
+ return "WdfPowerDeviceD3";
+ case WdfPowerDeviceD3Final:
+ return "WdfPowerDeviceD3Final";
+ case WdfPowerDevicePrepareForHibernation:
+ return "WdfPowerDevicePrepareForHibernation";
+ case WdfPowerDeviceMaximum:
+ return "WdfPowerDeviceMaximum";
+ default:
+ return "Unknown Device Power State";
+ }
+} \ No newline at end of file
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/driver.c b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/driver.c
new file mode 100644
index 00000000..2be5d2ed
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/driver.c
@@ -0,0 +1,281 @@
+/*++
+
+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:
+
+ Driver.c
+
+Abstract:
+
+ Main module.
+
+ This driver is for the Open System Resources USB-FX2 Learning Kit designed
+ and built by OSR specifically for use in teaching software developers how to write
+ drivers for USB devices.
+
+ The board supports a single configuration. The board automatically
+ detects the speed of the host controller, and supplies either the
+ high or full speed configuration based on the host controller's speed.
+
+ The firmware supports 3 endpoints:
+
+ Endpoint number 1 is used to indicate the state of the 8-switch
+ switch-pack on the OSR USB-FX2 board. A single byte representing
+ the switch state is sent (a) when the board is first started,
+ (b) when the board resumes after selective-suspend,
+ (c) whenever the state of the switches is changed.
+
+ Endpoints 6 and 8 perform an internal loop-back function.
+ Data that is sent to the board at EP6 is returned to the host on EP8.
+
+ For further information on the endpoints, please refer to the spec
+ http://www.osronline.com/hardware/OSRFX2_32.pdf.
+
+ Vendor ID of the device is 0x4705 and Product ID is 0x210.
+
+Environment:
+
+ User mode only
+
+--*/
+
+#include "osrusbfx2.h"
+
+#if defined(EVENT_TRACING)
+//
+// The trace message header (.tmh) file must be included in a source file
+// before any WPP macro calls and after defining a WPP_CONTROL_GUIDS
+// macro (defined in trace.h). During the compilation, WPP scans the source
+// files for DoTraceMessage() calls and builds a .tmh file which stores a unique
+// data GUID for each message, the text resource string for each message,
+// and the data types of the variables passed in for each message. This file
+// is automatically generated and used during post-processing.
+//
+#include "driver.tmh"
+#else
+ULONG DebugLevel = TRACE_LEVEL_INFORMATION;
+ULONG DebugFlag = 0xff;
+#endif
+
+#ifdef ALLOC_PRAGMA
+#pragma alloc_text(INIT, DriverEntry)
+#pragma alloc_text(PAGE, OsrFxEvtDriverContextCleanup)
+#endif
+
+
+/*++
+
+Routine Description:
+
+ DriverEntry initializes the driver and is the first routine called by the
+ system after the driver is loaded.
+
+Parameters Description:
+
+ DriverObject - Represents the instance of the function driver that is loaded
+ into memory. DriverEntry must initialize members of
+ DriverObject before it returns to the caller. DriverObject
+ is allocated by the system before the driver is loaded, and
+ it is released by the system after the system unloads the
+ function driver from memory
+
+ RegistryPath - Represents the driver specific path in the registry.
+ The function driver can use the path to store driver related
+ data between reboots. The path does not store hardware
+ instance specific data
+
+Return Value:
+
+ STATUS_SUCCESS if successful,
+ STATUS_UNSUCCESSFUL or another NTSTATUS error code otherwise.
+
+--*/
+NTSTATUS
+DriverEntry(
+ _In_ PDRIVER_OBJECT DriverObject,
+ _In_ PUNICODE_STRING RegistryPath
+ )
+{
+ WDF_DRIVER_CONFIG Config;
+ NTSTATUS Status;
+ WDF_OBJECT_ATTRIBUTES Attributes;
+
+ //
+ // Initialize WPP Tracing.
+ //
+ WPP_INIT_TRACING(DriverObject, RegistryPath);
+
+ TraceEvents(TRACE_LEVEL_INFORMATION, DBG_INIT,
+ "OSRUSBFX2 Driver Sample - Driver Framework Edition.\n");
+
+ //
+ // Register with ETW (unified tracing).
+ //
+ EventRegisterOSRUSBFX2();
+
+ //
+ // Initiialize driver config to control the attributes that
+ // are global to the driver. Note that framework by default
+ // provides a driver unload routine. If you create any resources
+ // in the DriverEntry and want to be cleaned in driver unload,
+ // you can override that by manually setting the EvtDriverUnload in the
+ // config structure. In general xxx_CONFIG_INIT macros are provided to
+ // initialize most commonly used members.
+ //
+
+ WDF_DRIVER_CONFIG_INIT(&Config,
+ OsrFxEvtDeviceAdd);
+
+ //
+ // Register a cleanup callback so that we can call WPP_CLEANUP when
+ // the framework driver object is deleted during driver unload.
+ //
+ WDF_OBJECT_ATTRIBUTES_INIT(&Attributes);
+ Attributes.EvtCleanupCallback = OsrFxEvtDriverContextCleanup;
+
+ //
+ // Create a framework driver object to represent our driver.
+ //
+ Status = WdfDriverCreate(DriverObject,
+ RegistryPath,
+ &Attributes,
+ &Config,
+ WDF_NO_HANDLE);
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_INIT,
+ "WdfDriverCreate failed with Status 0x%x\n", Status);
+ //
+ // Cleanup tracing here because DriverContextCleanup will not be called
+ // as we have failed to create WDFDRIVER object itself.
+ // Please note that if your return failure from DriverEntry after the
+ // WDFDRIVER object is created successfully, you don't have to
+ // call WPP cleanup because in those cases DriverContextCleanup
+ // will be executed when the framework deletes the DriverObject.
+ //
+ WPP_CLEANUP(DriverObject);
+ EventUnregisterOSRUSBFX2();
+ }
+
+ return Status;
+}
+
+
+/*++
+Routine Description:
+
+ Free resources allocated in DriverEntry that are not automatically
+ cleaned up by the framework.
+
+Arguments:
+
+ Driver - Handle to a WDF driver object
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+OsrFxEvtDriverContextCleanup(
+ _In_ WDFOBJECT Driver
+ )
+{
+ PAGED_CODE ();
+
+ //
+ // For the case when WPP is not being used.
+ //
+ UNREFERENCED_PARAMETER(Driver);
+
+ TraceEvents(TRACE_LEVEL_INFORMATION, DBG_INIT,
+ "--> OsrFxEvtDriverContextCleanup\n");
+
+ WPP_CLEANUP(WdfDriverWdmGetDriverObject((WDFDRIVER) Driver));
+
+ EventUnregisterOSRUSBFX2();
+}
+
+
+#if !defined(EVENT_TRACING)
+/*++
+
+Routine Description:
+
+ Debug print for the sample driver.
+
+Arguments:
+
+ DebugPrintLevel - Print level between 0 and 3, with 3 the most verbose
+
+ DebugPrintFlag - Message mask
+
+ DebugMessage - Format string of the message to print
+
+ ... - Values used by the format string
+
+Return Value:
+
+ VOID
+
+ --*/
+VOID
+TraceEvents (
+ _In_ ULONG DebugPrintLevel,
+ _In_ ULONG DebugPrintFlag,
+ _Printf_format_string_ _In_ PCSTR DebugMessage,
+ ...
+ )
+{
+#if DBG
+#define TEMP_BUFFER_SIZE 1024
+ va_list List;
+ CHAR DebugMessageBuffer[TEMP_BUFFER_SIZE];
+ HRESULT hr;
+
+ va_start(List, DebugMessage);
+
+ if (DebugMessage)
+ {
+ //
+ // Using new safe string functions instead of _vsnprintf.
+ // This function takes care of NULL terminating if the message
+ // is longer than the buffer.
+ //
+ hr = StringCchVPrintfA(DebugMessageBuffer,
+ sizeof(DebugMessageBuffer),
+ DebugMessage,
+ List);
+
+ if(FAILED(hr))
+ {
+ DbgPrint(_DRIVER_NAME_": StringCchVPrintfA failed with HRESULT 0x%x\n", hr);
+ return;
+ }
+
+ if ((DebugPrintLevel <= TRACE_LEVEL_ERROR) ||
+ ((DebugPrintLevel <= DebugLevel) &&
+ ((DebugPrintFlag & DebugFlag) == DebugPrintFlag)))
+ {
+ DbgPrint("%s %s", _DRIVER_NAME_, DebugMessageBuffer);
+ }
+ }
+
+ va_end(List);
+
+ return;
+#else
+ UNREFERENCED_PARAMETER(DebugPrintLevel);
+ UNREFERENCED_PARAMETER(DebugPrintFlag);
+ UNREFERENCED_PARAMETER(DebugMessage);
+#endif
+}
+
+#endif \ No newline at end of file
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/ioctl.c b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/ioctl.c
new file mode 100644
index 00000000..2c6792a4
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/ioctl.c
@@ -0,0 +1,1151 @@
+/*++
+
+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:
+
+ Ioctl.c
+
+Abstract:
+
+ USB device driver for OSR USB-FX2 Learning Kit
+
+Environment:
+
+ User mode only
+
+--*/
+
+#include "osrusbfx2.h"
+
+#if defined(EVENT_TRACING)
+#include "ioctl.tmh"
+#endif
+
+#pragma alloc_text(PAGE, OsrFxEvtIoDeviceControl)
+#pragma alloc_text(PAGE, ResetPipe)
+#pragma alloc_text(PAGE, ResetDevice)
+#pragma alloc_text(PAGE, ReenumerateDevice)
+#pragma alloc_text(PAGE, GetBarGraphState)
+#pragma alloc_text(PAGE, SetBarGraphState)
+#pragma alloc_text(PAGE, GetSevenSegmentState)
+#pragma alloc_text(PAGE, SetSevenSegmentState)
+#pragma alloc_text(PAGE, GetSwitchState)
+
+
+/*++
+
+Routine Description:
+
+ This event is called when the framework receives IRP_MJ_DEVICE_CONTROL
+ requests from the system.
+
+Arguments:
+
+ Queue - Handle to the framework queue object that is
+ associated with the I/O request
+
+ Request - Handle to a framework request object
+
+ OutputBufferLength - Length of the request's output buffer, if an output
+ buffer is available
+
+ InputBufferLength - Length of the request's input buffer, if an input
+ buffer is available
+
+ IoControlCode - The driver-defined or system-defined I/O control code
+ (IOCTL) that is associated with the request
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+OsrFxEvtIoDeviceControl(
+ _In_ WDFQUEUE Queue,
+ _In_ WDFREQUEST Request,
+ _In_ size_t OutputBufferLength,
+ _In_ size_t InputBufferLength,
+ _In_ ULONG IoControlCode
+ )
+{
+ WDFDEVICE Device;
+ PDEVICE_CONTEXT DeviceContext;
+ size_t BytesReturned = 0;
+ PBAR_GRAPH_STATE BarGraphState = NULL;
+ PSWITCH_STATE SwitchState = NULL;
+ PUCHAR SevenSegment = NULL;
+ BOOLEAN RequestPending = FALSE;
+ NTSTATUS Status = STATUS_INVALID_DEVICE_REQUEST;
+
+ UNREFERENCED_PARAMETER(InputBufferLength);
+ UNREFERENCED_PARAMETER(OutputBufferLength);
+
+ PAGED_CODE();
+
+ TraceEvents(TRACE_LEVEL_INFORMATION, DBG_IOCTL,
+ "--> OsrFxEvtIoDeviceControl\n");
+
+ //
+ // Initialize variables.
+ //
+ Device = WdfIoQueueGetDevice(Queue);
+ DeviceContext = GetDeviceContext(Device);
+
+ switch(IoControlCode)
+ {
+
+ case IOCTL_OSRUSBFX2_GET_CONFIG_DESCRIPTOR:
+ {
+ PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor = NULL;
+ USHORT RequiredSize = 0;
+
+ //
+ // First get the size of the config descriptor.
+ //
+ Status = WdfUsbTargetDeviceRetrieveConfigDescriptor(DeviceContext->UsbDevice,
+ NULL,
+ &RequiredSize);
+
+ if (Status != STATUS_BUFFER_TOO_SMALL)
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_IOCTL,
+ "WdfUsbTargetDeviceRetrieveConfigDescriptor failed 0x%x\n",
+ Status);
+ break;
+ }
+
+ //
+ // Get the buffer - make sure the buffer is big enough.
+ //
+ Status = WdfRequestRetrieveOutputBuffer(Request,
+ (size_t)RequiredSize,
+ &ConfigurationDescriptor,
+ NULL);
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_IOCTL,
+ "WdfRequestRetrieveOutputBuffer failed 0x%x\n",
+ Status);
+ break;
+ }
+
+ Status = WdfUsbTargetDeviceRetrieveConfigDescriptor(DeviceContext->UsbDevice,
+ ConfigurationDescriptor,
+ &RequiredSize);
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_IOCTL,
+ "WdfUsbTargetDeviceRetrieveConfigDescriptor failed 0x%x\n",
+ Status);
+ break;
+ }
+
+ BytesReturned = RequiredSize;
+ }
+
+ break;
+
+ case IOCTL_OSRUSBFX2_RESET_DEVICE:
+
+ Status = ResetDevice(Device);
+ break;
+
+ case IOCTL_OSRUSBFX2_REENUMERATE_DEVICE:
+ //
+ // Otherwise, call our function to re-enumerate the device.
+ //
+ Status = ReenumerateDevice(DeviceContext);
+
+ BytesReturned = 0;
+ break;
+
+ case IOCTL_OSRUSBFX2_GET_BAR_GRAPH_DISPLAY:
+ //
+ // Make sure the caller's output buffer is large enough
+ // to hold the state of the bar graph.
+ //
+ Status = WdfRequestRetrieveOutputBuffer(Request,
+ sizeof(BAR_GRAPH_STATE),
+ &BarGraphState,
+ NULL);
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_IOCTL,
+ "User's output buffer is too small for this IOCTL, expecting a BAR_GRAPH_STATE\n");
+ break;
+ }
+
+ //
+ // Call our function to get the bar graph state.
+ //
+ Status = GetBarGraphState(DeviceContext, BarGraphState);
+
+ //
+ // Return the user their data.
+ //
+ if (NT_SUCCESS(Status))
+ {
+ BytesReturned = sizeof(BAR_GRAPH_STATE);
+ }
+ else
+ {
+ BytesReturned = 0;
+ }
+
+ break;
+
+ case IOCTL_OSRUSBFX2_SET_BAR_GRAPH_DISPLAY:
+ Status = WdfRequestRetrieveInputBuffer(Request,
+ sizeof(BAR_GRAPH_STATE),
+ &BarGraphState,
+ NULL);
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_IOCTL,
+ "User's input buffer is too small for this IOCTL, expecting a BAR_GRAPH_STATE\n");
+ break;
+ }
+
+ //
+ // Call our routine to set the bar graph state.
+ //
+ Status = SetBarGraphState(DeviceContext, BarGraphState);
+
+ //
+ // There's no data returned for this call.
+ //
+ BytesReturned = 0;
+ break;
+
+ case IOCTL_OSRUSBFX2_GET_7_SEGMENT_DISPLAY:
+ Status = WdfRequestRetrieveOutputBuffer(Request,
+ sizeof(UCHAR),
+ &SevenSegment,
+ NULL);
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_IOCTL,
+ "User's output buffer is too small for this IOCTL, expecting an UCHAR\n");
+ break;
+ }
+
+ //
+ // Call our function to get the 7 segment state.
+ //
+ Status = GetSevenSegmentState(DeviceContext, SevenSegment);
+
+ //
+ // If we succeeded return the user their data.
+ //
+ if (NT_SUCCESS(Status))
+ {
+ BytesReturned = sizeof(UCHAR);
+ }
+ else
+ {
+ BytesReturned = 0;
+ }
+
+ break;
+
+ case IOCTL_OSRUSBFX2_SET_7_SEGMENT_DISPLAY:
+ Status = WdfRequestRetrieveInputBuffer(Request,
+ sizeof(UCHAR),
+ &SevenSegment,
+ NULL);
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_IOCTL,
+ "User's input buffer is too small for this IOCTL, expecting an UCHAR\n");
+
+ BytesReturned = sizeof(UCHAR);
+ break;
+ }
+
+ //
+ // Call our routine to set the 7 segment state.
+ //
+ Status = SetSevenSegmentState(DeviceContext, SevenSegment);
+
+ //
+ // There's no data returned for this call.
+ //
+ BytesReturned = 0;
+ break;
+
+ case IOCTL_OSRUSBFX2_READ_SWITCHES:
+ Status = WdfRequestRetrieveOutputBuffer(Request,
+ sizeof(SWITCH_STATE),
+ &SwitchState,
+ NULL);
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_IOCTL,
+ "User's output buffer is too small for this IOCTL, expecting a SWITCH_STATE\n");
+
+ BytesReturned = sizeof(SWITCH_STATE);
+ break;
+ }
+
+ //
+ // Call our routine to get the state of the switches.
+ //
+ Status = GetSwitchState(DeviceContext, SwitchState);
+
+ //
+ // If successful, return the user their data.
+ //
+ if (NT_SUCCESS(Status))
+ {
+ BytesReturned = sizeof(SWITCH_STATE);
+ }
+ else
+ {
+ //
+ // Don't return any data.
+ //
+ BytesReturned = 0;
+ }
+
+ break;
+
+ case IOCTL_OSRUSBFX2_GET_INTERRUPT_MESSAGE:
+ //
+ // Forward the request to an interrupt message queue and dont complete
+ // the request until an interrupt from the USB Device occurs.
+ //
+ Status = WdfRequestForwardToIoQueue(Request,
+ DeviceContext->InterruptMsgQueue);
+
+ if (NT_SUCCESS(Status))
+ {
+ RequestPending = TRUE;
+ }
+
+ break;
+
+ default :
+ Status = STATUS_INVALID_DEVICE_REQUEST;
+ break;
+ }
+
+ if (RequestPending == FALSE)
+ {
+ WdfRequestCompleteWithInformation(Request, Status, BytesReturned);
+ }
+
+ TraceEvents(TRACE_LEVEL_INFORMATION, DBG_IOCTL,
+ "<-- OsrFxEvtIoDeviceControl\n");
+
+ return;
+}
+
+
+/*++
+
+Routine Description:
+
+ This routine resets the pipe.
+
+Arguments:
+
+ Pipe - framework pipe handle
+
+Return Value:
+
+ STATUS_SUCCESS if successful,
+ STATUS_UNSUCCESSFUL or another NTSTATUS error code otherwise.
+
+--*/
+_IRQL_requires_(PASSIVE_LEVEL)
+NTSTATUS
+ResetPipe(
+ _In_ WDFUSBPIPE Pipe
+ )
+{
+ NTSTATUS Status;
+
+ PAGED_CODE();
+
+ //
+ // This routine synchronously submits a URB_FUNCTION_RESET_PIPE
+ // request down the stack.
+ //
+ Status = WdfUsbTargetPipeResetSynchronously(Pipe,
+ WDF_NO_HANDLE,
+ NULL);
+
+ if (NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_INFORMATION, DBG_IOCTL,
+ "ResetPipe - success\n");
+
+ Status = STATUS_SUCCESS;
+ }
+ else
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_IOCTL,
+ "ResetPipe - failed\n");
+ }
+
+ return Status;
+}
+
+
+/*++
+
+Routine Description:
+
+ This routine stops all of the device's pipes.
+
+Arguments:
+
+ DeviceContext - The device context with the pipe information
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+StopAllPipes(
+ _In_ PDEVICE_CONTEXT DeviceContext
+ )
+{
+ WdfIoTargetStop(WdfUsbTargetPipeGetIoTarget(DeviceContext->InterruptPipe),
+ WdfIoTargetCancelSentIo);
+
+ WdfIoTargetStop(WdfUsbTargetPipeGetIoTarget(DeviceContext->BulkReadPipe),
+ WdfIoTargetCancelSentIo);
+
+ WdfIoTargetStop(WdfUsbTargetPipeGetIoTarget(DeviceContext->BulkWritePipe),
+ WdfIoTargetCancelSentIo);
+}
+
+
+/*++
+
+Routine Description:
+
+ This routine starts all of the device's pipes.
+
+Arguments:
+
+ DeviceContext - The device context with the pipe information
+
+Return Value:
+
+ STATUS_SUCCESS if successful,
+ STATUS_UNSUCCESSFUL or another NTSTATUS error code otherwise.
+
+--*/
+NTSTATUS
+StartAllPipes(
+ _In_ PDEVICE_CONTEXT DeviceContext
+ )
+{
+ NTSTATUS Status;
+
+ Status = WdfIoTargetStart(WdfUsbTargetPipeGetIoTarget(DeviceContext->InterruptPipe));
+
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+
+ Status = WdfIoTargetStart(WdfUsbTargetPipeGetIoTarget(DeviceContext->BulkReadPipe));
+
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+
+ Status = WdfIoTargetStart(WdfUsbTargetPipeGetIoTarget(DeviceContext->BulkWritePipe));
+
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+
+ return Status;
+}
+
+
+/*++
+
+Routine Description:
+
+ This routine calls WdfUsbTargetDeviceResetPortSynchronously to reset the
+ device if it's still connected.
+
+Arguments:
+
+ Device - Handle to a framework device object
+
+Return Value:
+
+ STATUS_SUCCESS if successful,
+ STATUS_UNSUCCESSFUL or another NTSTATUS error code otherwise.
+
+--*/
+_IRQL_requires_(PASSIVE_LEVEL)
+NTSTATUS
+ResetDevice(
+ _In_ WDFDEVICE Device
+ )
+{
+ PDEVICE_CONTEXT DeviceContext;
+ NTSTATUS Status;
+
+ PAGED_CODE();
+
+ TraceEvents(TRACE_LEVEL_INFORMATION, DBG_IOCTL,
+ "--> ResetDevice\n");
+
+ DeviceContext = GetDeviceContext(Device);
+
+ //
+ // A NULL timeout indicates an infinite wake.
+ //
+ Status = WdfWaitLockAcquire(DeviceContext->ResetDeviceWaitLock, NULL);
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_IOCTL,
+ "ResetDevice - could not acquire lock\n");
+
+ return Status;
+ }
+
+ StopAllPipes(DeviceContext);
+
+ Status = WdfUsbTargetDeviceResetPortSynchronously(DeviceContext->UsbDevice);
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_IOCTL,
+ "ResetDevice failed - 0x%x\n",
+ Status);
+ }
+
+ Status = StartAllPipes(DeviceContext);
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_IOCTL,
+ "Failed to start all pipes - 0x%x\n",
+ Status);
+ }
+
+ WdfWaitLockRelease(DeviceContext->ResetDeviceWaitLock);
+
+ TraceEvents(TRACE_LEVEL_INFORMATION, DBG_IOCTL,
+ "<-- ResetDevice\n");
+
+ return Status;
+}
+
+
+/*++
+
+Routine Description
+
+ This routine re-enumerates the USB device.
+
+Arguments:
+
+ DeviceContext - One of our device extensions
+
+Return Value:
+
+ STATUS_SUCCESS if successful,
+ STATUS_UNSUCCESSFUL or another NTSTATUS error code otherwise.
+
+--*/
+_IRQL_requires_(PASSIVE_LEVEL)
+NTSTATUS
+ReenumerateDevice(
+ _In_ PDEVICE_CONTEXT DeviceContext
+ )
+{
+ NTSTATUS Status;
+ WDF_USB_CONTROL_SETUP_PACKET ControlSetupPacket;
+ WDF_REQUEST_SEND_OPTIONS SendOptions;
+ GUID Activity;
+
+ PAGED_CODE();
+
+ TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL,
+ "--> ReenumerateDevice\n");
+
+ WDF_REQUEST_SEND_OPTIONS_INIT(&SendOptions,
+ WDF_REQUEST_SEND_OPTION_TIMEOUT);
+
+ WDF_REQUEST_SEND_OPTIONS_SET_TIMEOUT(&SendOptions,
+ DEFAULT_CONTROL_TRANSFER_TIMEOUT);
+
+ WDF_USB_CONTROL_SETUP_PACKET_INIT_VENDOR(&ControlSetupPacket,
+ BmRequestHostToDevice,
+ BmRequestToDevice,
+ USBFX2LK_REENUMERATE,
+ 0,
+ 0);
+
+
+ Status = WdfUsbTargetDeviceSendControlTransferSynchronously(DeviceContext->UsbDevice,
+ WDF_NO_HANDLE,
+ &SendOptions,
+ &ControlSetupPacket,
+ NULL,
+ NULL);
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_IOCTL,
+ "ReenumerateDevice: Failed to Reenumerate - 0x%x \n",
+ Status);
+ }
+
+ TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL,
+ "<-- ReenumerateDevice\n");
+
+ //
+ // Send event to the event log.
+ //
+ Activity = DeviceToActivityId(WdfObjectContextGetObject(DeviceContext));
+
+ EventWriteDeviceReenumerated(DeviceContext->DeviceName,
+ DeviceContext->Location,
+ Status);
+
+ return Status;
+
+}
+
+
+/*++
+
+Routine Description
+
+ This routine gets the state of the bar graph on the board.
+
+Arguments:
+
+ DeviceContext - One of our device extensions
+
+ BarGraphState - Struct that receives the bar graph's state
+
+Return Value:
+
+ STATUS_SUCCESS if successful,
+ STATUS_UNSUCCESSFUL or another NTSTATUS error code otherwise.
+
+--*/
+_IRQL_requires_(PASSIVE_LEVEL)
+NTSTATUS
+GetBarGraphState(
+ _In_ PDEVICE_CONTEXT DeviceContext,
+ _Out_ PBAR_GRAPH_STATE BarGraphState
+ )
+{
+ NTSTATUS Status;
+ WDF_USB_CONTROL_SETUP_PACKET ControlSetupPacket;
+ WDF_REQUEST_SEND_OPTIONS SendOptions;
+ WDF_MEMORY_DESCRIPTOR MemoryDescriptor;
+ ULONG BytesTransferred;
+
+ PAGED_CODE();
+
+ TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL,
+ "--> GetBarGraphState\n");
+
+ WDF_REQUEST_SEND_OPTIONS_INIT(&SendOptions,
+ WDF_REQUEST_SEND_OPTION_TIMEOUT);
+
+ WDF_REQUEST_SEND_OPTIONS_SET_TIMEOUT(&SendOptions,
+ DEFAULT_CONTROL_TRANSFER_TIMEOUT);
+
+ WDF_USB_CONTROL_SETUP_PACKET_INIT_VENDOR(&ControlSetupPacket,
+ BmRequestDeviceToHost,
+ BmRequestToDevice,
+ USBFX2LK_READ_BARGRAPH_DISPLAY,
+ 0,
+ 0);
+
+ //
+ // Set the buffer to 0, the board will OR in everything that is set.
+ //
+ BarGraphState->BarsAsUChar = 0;
+
+
+ WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(&MemoryDescriptor,
+ BarGraphState,
+ sizeof(BAR_GRAPH_STATE));
+
+ Status = WdfUsbTargetDeviceSendControlTransferSynchronously(DeviceContext->UsbDevice,
+ WDF_NO_HANDLE,
+ &SendOptions,
+ &ControlSetupPacket,
+ &MemoryDescriptor,
+ &BytesTransferred);
+
+ if(!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_IOCTL,
+ "GetBarGraphState: Failed to GetBarGraphState - 0x%x \n",
+ Status);
+ }
+ else
+ {
+ TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL,
+ "GetBarGraphState: LED mask is 0x%x\n",
+ BarGraphState->BarsAsUChar);
+ }
+
+ TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL,
+ "<-- GetBarGraphState\n");
+
+ return Status;
+
+}
+
+
+/*++
+
+Routine Description
+
+ This routine sets the state of the bar graph on the board.
+
+Arguments:
+
+ DeviceContext - One of our device extensions
+
+ BarGraphState - Struct that describes the bar graph's desired state
+
+Return Value:
+
+ STATUS_SUCCESS if successful,
+ STATUS_UNSUCCESSFUL or another NTSTATUS error code otherwise.
+
+--*/
+_IRQL_requires_(PASSIVE_LEVEL)
+NTSTATUS
+SetBarGraphState(
+ _In_ PDEVICE_CONTEXT DeviceContext,
+ _In_ PBAR_GRAPH_STATE BarGraphState
+ )
+{
+ NTSTATUS Status;
+ WDF_USB_CONTROL_SETUP_PACKET ControlSetupPacket;
+ WDF_REQUEST_SEND_OPTIONS SendOptions;
+ WDF_MEMORY_DESCRIPTOR MemoryDescriptor;
+ ULONG BytesTransferred;
+
+ PAGED_CODE();
+
+ TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL,
+ "--> SetBarGraphState\n");
+
+ WDF_REQUEST_SEND_OPTIONS_INIT(&SendOptions,
+ WDF_REQUEST_SEND_OPTION_TIMEOUT);
+
+ WDF_REQUEST_SEND_OPTIONS_SET_TIMEOUT(&SendOptions,
+ DEFAULT_CONTROL_TRANSFER_TIMEOUT);
+
+ WDF_USB_CONTROL_SETUP_PACKET_INIT_VENDOR(&ControlSetupPacket,
+ BmRequestHostToDevice,
+ BmRequestToDevice,
+ USBFX2LK_SET_BARGRAPH_DISPLAY,
+ 0,
+ 0);
+
+ WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(&MemoryDescriptor,
+ BarGraphState,
+ sizeof(BAR_GRAPH_STATE));
+
+ Status = WdfUsbTargetDeviceSendControlTransferSynchronously(DeviceContext->UsbDevice,
+ NULL,
+ &SendOptions,
+ &ControlSetupPacket,
+ &MemoryDescriptor,
+ &BytesTransferred);
+
+ if(!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_IOCTL,
+ "SetBarGraphState: Failed - 0x%x \n",
+ Status);
+ }
+ else
+ {
+ TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL,
+ "SetBarGraphState: LED mask is 0x%x\n",
+ BarGraphState->BarsAsUChar);
+ }
+
+ TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL,
+ "<-- SetBarGraphState\n");
+
+ return Status;
+}
+
+
+/*++
+
+Routine Description
+
+ This routine gets the state of the 7 segment display on the board
+ by sending a synchronous control command.
+
+ NOTE: It's not good practice to send a synchronous request in the
+ context of the user thread because if the transfer takes a long
+ time to complete, you end up holding the user thread.
+
+ I'm choosing to do synchronous transfer because a) I know this one
+ completes immediately and b) for demonstration.
+
+Arguments:
+
+ DeviceContext - One of our device extensions
+
+ SevenSegment - Receives the state of the 7 segment display
+
+Return Value:
+
+ STATUS_SUCCESS if successful,
+ STATUS_UNSUCCESSFUL or another NTSTATUS error code otherwise.
+
+--*/
+_IRQL_requires_(PASSIVE_LEVEL)
+NTSTATUS
+GetSevenSegmentState(
+ _In_ PDEVICE_CONTEXT DeviceContext,
+ _Out_ PUCHAR SevenSegment
+ )
+{
+ NTSTATUS Status;
+ WDF_USB_CONTROL_SETUP_PACKET ControlSetupPacket;
+ WDF_REQUEST_SEND_OPTIONS SendOptions;
+ WDF_MEMORY_DESCRIPTOR MemoryDescriptor;
+ ULONG BytesTransferred;
+
+ TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL,
+ "GetSetSevenSegmentState: Enter\n");
+
+ PAGED_CODE();
+
+ WDF_REQUEST_SEND_OPTIONS_INIT(&SendOptions,
+ WDF_REQUEST_SEND_OPTION_TIMEOUT);
+
+ WDF_REQUEST_SEND_OPTIONS_SET_TIMEOUT(&SendOptions,
+ DEFAULT_CONTROL_TRANSFER_TIMEOUT);
+
+ WDF_USB_CONTROL_SETUP_PACKET_INIT_VENDOR(&ControlSetupPacket,
+ BmRequestDeviceToHost,
+ BmRequestToDevice,
+ USBFX2LK_READ_7SEGMENT_DISPLAY,
+ 0,
+ 0);
+
+ //
+ // Set the buffer to 0, the board will OR in everything that is set.
+ //
+ *SevenSegment = 0;
+
+ WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(&MemoryDescriptor,
+ SevenSegment,
+ sizeof(UCHAR));
+
+ Status = WdfUsbTargetDeviceSendControlTransferSynchronously(DeviceContext->UsbDevice,
+ NULL,
+ &SendOptions,
+ &ControlSetupPacket,
+ &MemoryDescriptor,
+ &BytesTransferred);
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_IOCTL,
+ "GetSevenSegmentState: Failed to get 7 Segment state - 0x%x \n",
+ Status);
+ }
+ else
+ {
+ TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL,
+ "GetSevenSegmentState: 7 Segment mask is 0x%x\n",
+ *SevenSegment);
+ }
+
+ TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL,
+ "GetSetSevenSegmentState: Exit\n");
+
+ return Status;
+}
+
+
+/*++
+
+Routine Description
+
+ This routine sets the state of the 7 segment display on the board.
+
+Arguments:
+
+ DeviceContext - One of our device extensions
+
+ SevenSegment - Desired state of the 7 segment display
+
+Return Value:
+
+ STATUS_SUCCESS if successful,
+ STATUS_UNSUCCESSFUL or another NTSTATUS error code otherwise.
+
+--*/
+_IRQL_requires_(PASSIVE_LEVEL)
+NTSTATUS
+SetSevenSegmentState(
+ _In_ PDEVICE_CONTEXT DeviceContext,
+ _In_ PUCHAR SevenSegment
+ )
+{
+ NTSTATUS Status;
+ WDF_USB_CONTROL_SETUP_PACKET ControlSetupPacket;
+ WDF_REQUEST_SEND_OPTIONS SendOptions;
+ WDF_MEMORY_DESCRIPTOR MemoryDescriptor;
+ ULONG BytesTransferred;
+
+ PAGED_CODE();
+
+ TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL,
+ "--> SetSevenSegmentState\n");
+
+ WDF_REQUEST_SEND_OPTIONS_INIT(&SendOptions,
+ WDF_REQUEST_SEND_OPTION_TIMEOUT);
+
+ WDF_REQUEST_SEND_OPTIONS_SET_TIMEOUT(&SendOptions,
+ DEFAULT_CONTROL_TRANSFER_TIMEOUT);
+
+ WDF_USB_CONTROL_SETUP_PACKET_INIT_VENDOR(&ControlSetupPacket,
+ BmRequestHostToDevice,
+ BmRequestToDevice,
+ USBFX2LK_SET_7SEGMENT_DISPLAY,
+ 0,
+ 0);
+
+ WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(&MemoryDescriptor,
+ SevenSegment,
+ sizeof(UCHAR));
+
+ Status = WdfUsbTargetDeviceSendControlTransferSynchronously(DeviceContext->UsbDevice,
+ NULL,
+ &SendOptions,
+ &ControlSetupPacket,
+ &MemoryDescriptor,
+ &BytesTransferred);
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_IOCTL,
+ "SetSevenSegmentState: Failed to set 7 Segment state - 0x%x \n",
+ Status);
+ }
+ else
+ {
+ TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL,
+ "SetSevenSegmentState: 7 Segment mask is 0x%x\n",
+ *SevenSegment);
+ }
+
+ TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL,
+ "<-- SetSevenSegmentState\n");
+
+ return Status;
+
+}
+
+
+/*++
+
+Routine Description
+
+ This routine gets the state of the switches on the board.
+
+Arguments:
+
+ DeviceContext - One of our device extensions
+
+Return Value:
+
+ STATUS_SUCCESS if successful,
+ STATUS_UNSUCCESSFUL or another NTSTATUS error code otherwise.
+
+--*/
+_IRQL_requires_(PASSIVE_LEVEL)
+NTSTATUS
+GetSwitchState(
+ _In_ PDEVICE_CONTEXT DeviceContext,
+ _In_ PSWITCH_STATE SwitchState
+ )
+{
+ NTSTATUS Status;
+ WDF_USB_CONTROL_SETUP_PACKET ControlSetupPacket;
+ WDF_REQUEST_SEND_OPTIONS SendOptions;
+ WDF_MEMORY_DESCRIPTOR MemoryDescriptor;
+ ULONG BytesTransferred;
+
+ TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL,
+ "--> GetSwitchState\n");
+
+ PAGED_CODE();
+
+ WDF_REQUEST_SEND_OPTIONS_INIT(&SendOptions,
+ WDF_REQUEST_SEND_OPTION_TIMEOUT);
+
+ WDF_REQUEST_SEND_OPTIONS_SET_TIMEOUT(&SendOptions,
+ DEFAULT_CONTROL_TRANSFER_TIMEOUT);
+
+ WDF_USB_CONTROL_SETUP_PACKET_INIT_VENDOR(&ControlSetupPacket,
+ BmRequestDeviceToHost,
+ BmRequestToDevice,
+ USBFX2LK_READ_SWITCHES,
+ 0,
+ 0);
+
+ SwitchState->SwitchesAsUChar = 0;
+
+ WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(&MemoryDescriptor,
+ SwitchState,
+ sizeof(SWITCH_STATE));
+
+ Status = WdfUsbTargetDeviceSendControlTransferSynchronously(DeviceContext->UsbDevice,
+ NULL,
+ &SendOptions,
+ &ControlSetupPacket,
+ &MemoryDescriptor,
+ &BytesTransferred);
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_IOCTL,
+ "GetSwitchState: Failed to get switches - 0x%x \n",
+ Status);
+ }
+ else
+ {
+ TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL,
+ "GetSwitchState: Switch mask is 0x%x\n",
+ SwitchState->SwitchesAsUChar);
+ }
+
+ TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL,
+ "<-- GetSwitchState\n");
+
+ return Status;
+}
+
+
+/*++
+
+Routine Description
+
+ This method handles the completion of the pending request for the IOCTL
+ IOCTL_OSRUSBFX2_GET_INTERRUPT_MESSAGE.
+
+Arguments:
+
+ Device - Handle to a framework device object
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+OsrUsbIoctlGetInterruptMessage(
+ _In_ WDFDEVICE Device,
+ _In_ NTSTATUS ReaderStatus
+ )
+{
+ NTSTATUS Status;
+ WDFREQUEST Request;
+ PDEVICE_CONTEXT DeviceContext;
+ size_t BytesReturned = 0;
+ PSWITCH_STATE SwitchState = NULL;
+
+ DeviceContext = GetDeviceContext(Device);
+
+ do
+ {
+ //
+ // Check if there are any pending requests in the Interrupt Message Queue.
+ // If a request is found then complete the pending request.
+ //
+ Status = WdfIoQueueRetrieveNextRequest(DeviceContext->InterruptMsgQueue,
+ &Request);
+
+ if (NT_SUCCESS(Status))
+ {
+ Status = WdfRequestRetrieveOutputBuffer(Request,
+ sizeof(SWITCH_STATE),
+ &SwitchState,
+ NULL);
+
+ if (!NT_SUCCESS(Status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_IOCTL,
+ "User's output buffer is too small for this IOCTL, expecting a SWITCH_STATE\n");
+
+ BytesReturned = sizeof(SWITCH_STATE);
+ }
+ else
+ {
+ //
+ // Copy the state information saved by the continuous reader.
+ //
+ if (NT_SUCCESS(ReaderStatus))
+ {
+ SwitchState->SwitchesAsUChar = DeviceContext->CurrentSwitchState;
+ BytesReturned = sizeof(SWITCH_STATE);
+ }
+ else
+ {
+ BytesReturned = 0;
+ }
+ }
+
+ //
+ // Complete the request. If we failed to get the output buffer then
+ // complete with that status. Otherwise complete with the Status from the reader.
+ //
+ WdfRequestCompleteWithInformation(Request,
+ NT_SUCCESS(Status) ? ReaderStatus :
+ Status,
+ BytesReturned);
+
+ Status = STATUS_SUCCESS;
+ }
+ else if (Status != STATUS_NO_MORE_ENTRIES)
+ {
+ KdPrint(("WdfIoQueueRetrieveNextRequest Status %08x\n", Status));
+ }
+
+ Request = NULL;
+
+ } while (Status == STATUS_SUCCESS);
+}
+
+
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/osrfx2_DCHU_base.Filters b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/osrfx2_DCHU_base.Filters
new file mode 100644
index 00000000..26fecf1e
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/osrfx2_DCHU_base.Filters
@@ -0,0 +1,302 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx;*</Extensions>
+ <UniqueIdentifier>{F15AAD6B-59E8-4958-90A3-552BD48EAFE2}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Header Files">
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ <UniqueIdentifier>{4DD84A7D-DF53-4EE0-A484-1352320A6750}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Resource Files">
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms;man;xml</Extensions>
+ <UniqueIdentifier>{EF018331-C5CB-4F90-8D54-2EF10F370E8A}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Driver Files">
+ <Extensions>inf;inv;inx;mof;mc;</Extensions>
+ <UniqueIdentifier>{9A3958FE-0B1F-4C9F-9827-83322770EC8A}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ <ClCompile Include="driver.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="device.c" />
+ <ClCompile Include="ioctl.c" />
+ <ClCompile Include="bulkrwr.c" />
+ <ClCompile Include="Interrupt.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <MessageCompile Include="osrusbfx2.man">
+ <Filter>Resource Files</Filter>
+ </MessageCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="osrusbfx2.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="trace.h" />
+ <ClInclude Include="osrusbfx2.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="trace.h" />
+ <ClInclude Include="osrusbfx2.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="trace.h" />
+ <ClInclude Include="osrusbfx2.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="trace.h" />
+ <ClInclude Include="osrusbfx2.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="trace.h" />
+ <ClInclude Include="osrusbfx2.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="trace.h" />
+ <ClInclude Include="osrusbfx2.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="trace.h" />
+ <ClInclude Include="osrusbfx2.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="trace.h" />
+ <ClInclude Include="osrusbfx2.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="trace.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <Inf Include="osrfx2_DCHU_base.inx">
+ <Filter>Driver Files</Filter>
+ </Inf>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/osrfx2_DCHU_base.inx b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/osrfx2_DCHU_base.inx
new file mode 100644
index 00000000..807337f8
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/osrfx2_DCHU_base.inx
Binary files differ
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/osrfx2_DCHU_base.vcxproj b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/osrfx2_DCHU_base.vcxproj
new file mode 100644
index 00000000..838add16
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/osrfx2_DCHU_base.vcxproj
@@ -0,0 +1,269 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{5B711254-3F53-4E1D-A1AD-CC81E34588B7}</ProjectGuid>
+ <RootNamespace>$(MSBuildProjectName)</RootNamespace>
+ <UMDF_VERSION_MAJOR>2</UMDF_VERSION_MAJOR>
+ <Configuration Condition="'$(Configuration)' == ''">Debug</Configuration>
+ <Platform Condition="'$(Platform)' == ''">Win32</Platform>
+ <SampleGuid>{F915ED95-7BE9-4CDB-B09A-0D3F4C9657FE}</SampleGuid>
+ <ProjectName>osrfx2_DCHU_base</ProjectName>
+ <WindowsTargetPlatformVersion>$(LatestTargetPlatformVersion)</WindowsTargetPlatformVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>False</UseDebugLibraries>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ <DriverType>UMDF</DriverType>
+ <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset>
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ </PropertyGroup>
+ <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>True</UseDebugLibraries>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ <DriverType>UMDF</DriverType>
+ <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset>
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ </PropertyGroup>
+ <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>False</UseDebugLibraries>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ <DriverType>UMDF</DriverType>
+ <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset>
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ </PropertyGroup>
+ <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>True</UseDebugLibraries>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ <DriverType>UMDF</DriverType>
+ <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset>
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <PropertyGroup>
+ <OutDir>$(IntDir)</OutDir>
+ </PropertyGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
+ </ImportGroup>
+ <ItemGroup Label="WrappedTaskItems">
+ <ClCompile Include="driver.c; device.c; ioctl.c; bulkrwr.c; Interrupt.c">
+ <WppEnabled>true</WppEnabled>
+ <WppDllMacro>true</WppDllMacro>
+ <WppTraceFunction>TraceEvents(LEVEL,FLAGS,MSG,...)</WppTraceFunction>
+ <WppGenerateUsingTemplateFile>{um-default.tpl}*.tmh</WppGenerateUsingTemplateFile>
+ <WppPreprocessorDefinitions>ENABLE_WPP_RECORDER=1;WPP_MACRO_USE_KM_VERSION_FOR_UM=1</WppPreprocessorDefinitions>
+ </ClCompile>
+ <MessageCompile Include="osrusbfx2.man">
+ <GenerateUserModeLoggingMacros>true</GenerateUserModeLoggingMacros>
+ <GenerateMofFile>true</GenerateMofFile>
+ <HeaderFilePath>.\$(IntDir)</HeaderFilePath>
+ <GeneratedHeaderPath>true</GeneratedHeaderPath>
+ <RCFilePath>.\$(IntDir)</RCFilePath>
+ <GeneratedRCAndMessagesPath>true</GeneratedRCAndMessagesPath>
+ <GeneratedFilesBaseName>fx2Events</GeneratedFilesBaseName>
+ <UseBaseNameOfInput>true</UseBaseNameOfInput>
+ <SubType>Designer</SubType>
+ </MessageCompile>
+ </ItemGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <TargetName>osrfx2_DCHU_base</TargetName>
+ <ALLOW_DATE_TIME>1</ALLOW_DATE_TIME>
+ <ApiValidator_Enable>false</ApiValidator_Enable>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <TargetName>osrfx2_DCHU_base</TargetName>
+ <ALLOW_DATE_TIME>1</ALLOW_DATE_TIME>
+ <ApiValidator_Enable>false</ApiValidator_Enable>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <TargetName>osrfx2_DCHU_base</TargetName>
+ <ALLOW_DATE_TIME>1</ALLOW_DATE_TIME>
+ <ApiValidator_Enable>false</ApiValidator_Enable>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <TargetName>osrfx2_DCHU_base</TargetName>
+ <ALLOW_DATE_TIME>1</ALLOW_DATE_TIME>
+ <ApiValidator_Enable>false</ApiValidator_Enable>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <WarningLevel>Level4</WarningLevel>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);EVENT_TRACING;UNICODE;_UNICODE</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <WppEnabled>true</WppEnabled>
+ </ClCompile>
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);EVENT_TRACING;UNICODE;_UNICODE</PreprocessorDefinitions>
+ </ResourceCompile>
+ <Midl>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);EVENT_TRACING;UNICODE;_UNICODE</PreprocessorDefinitions>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies);$(SDK_LIB_PATH)\onecore.lib;$(SDK_LIB_PATH)\WppRecorderUM.lib</AdditionalDependencies>
+ </Link>
+ <Inf>
+ <TimeStamp>1.0.0.0</TimeStamp>
+ </Inf>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <WarningLevel>Level4</WarningLevel>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);EVENT_TRACING;UNICODE;_UNICODE</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <WppEnabled>true</WppEnabled>
+ </ClCompile>
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);EVENT_TRACING;UNICODE;_UNICODE</PreprocessorDefinitions>
+ </ResourceCompile>
+ <Midl>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);EVENT_TRACING;UNICODE;_UNICODE</PreprocessorDefinitions>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies);$(SDK_LIB_PATH)\onecore.lib;$(SDK_LIB_PATH)\WppRecorderUM.lib</AdditionalDependencies>
+ </Link>
+ <Inf>
+ <TimeStamp>1.0.0.0</TimeStamp>
+ </Inf>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <WarningLevel>Level4</WarningLevel>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);EVENT_TRACING;UNICODE;_UNICODE</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <WppEnabled>true</WppEnabled>
+ </ClCompile>
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);EVENT_TRACING;UNICODE;_UNICODE</PreprocessorDefinitions>
+ </ResourceCompile>
+ <Midl>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);EVENT_TRACING;UNICODE;_UNICODE</PreprocessorDefinitions>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies);$(SDK_LIB_PATH)\onecore.lib;$(SDK_LIB_PATH)\WppRecorderUM.lib</AdditionalDependencies>
+ </Link>
+ <Inf>
+ <TimeStamp>1.0.0.0</TimeStamp>
+ </Inf>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <WarningLevel>Level4</WarningLevel>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);EVENT_TRACING;UNICODE;_UNICODE</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <WppEnabled>true</WppEnabled>
+ </ClCompile>
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);EVENT_TRACING;UNICODE;_UNICODE</PreprocessorDefinitions>
+ </ResourceCompile>
+ <Midl>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);EVENT_TRACING;UNICODE;_UNICODE</PreprocessorDefinitions>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies);$(SDK_LIB_PATH)\onecore.lib;$(SDK_LIB_PATH)\WppRecorderUM.lib</AdditionalDependencies>
+ </Link>
+ <Inf>
+ <TimeStamp>1.0.0.0</TimeStamp>
+ </Inf>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <FilesToPackage Include="$(SolutionDir)$(Platform)\$(ConfigurationName)\osrfx2_DCHU_filter.dll" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <PackageRelativeDirectory>
+ </PackageRelativeDirectory>
+ </FilesToPackage>
+ <FilesToPackage Include="$(SolutionDir)$(Platform)\$(ConfigurationName)\osrfx2_DCHU_filter.dll" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <PackageRelativeDirectory>
+ </PackageRelativeDirectory>
+ </FilesToPackage>
+ <FilesToPackage Include="$(SolutionDir)$(Platform)\$(ConfigurationName)\osrfx2_DCHU_filter.dll" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <PackageRelativeDirectory>
+ </PackageRelativeDirectory>
+ </FilesToPackage>
+ <FilesToPackage Include="$(SolutionDir)$(Platform)\$(ConfigurationName)\osrfx2_DCHU_filter.dll" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <PackageRelativeDirectory>
+ </PackageRelativeDirectory>
+ </FilesToPackage>
+ <FilesToPackage Include="$(SolutionDir)$(Platform)\$(ConfigurationName)\osrfx2_DCHU_usersvc.exe" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <PackageRelativeDirectory>
+ </PackageRelativeDirectory>
+ </FilesToPackage>
+ <FilesToPackage Include="$(SolutionDir)$(Platform)\$(ConfigurationName)\osrfx2_DCHU_usersvc.exe" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <PackageRelativeDirectory>
+ </PackageRelativeDirectory>
+ </FilesToPackage>
+ <FilesToPackage Include="$(SolutionDir)$(Platform)\$(ConfigurationName)\osrfx2_DCHU_usersvc.exe" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <PackageRelativeDirectory>
+ </PackageRelativeDirectory>
+ </FilesToPackage>
+ <FilesToPackage Include="$(SolutionDir)$(Platform)\$(ConfigurationName)\osrfx2_DCHU_usersvc.exe" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <PackageRelativeDirectory>
+ </PackageRelativeDirectory>
+ </FilesToPackage>
+ <Inf Include="..\osrfx2_DCHU_usersvc\osrfx2_DCHU_usersvc.inx" />
+ <Inf Include="osrfx2_DCHU_base.inx" />
+ <FilesToPackage Include="$(TargetPath)" Condition="'$(ConfigurationType)'=='Driver' or '$(ConfigurationType)'=='DynamicLibrary'">
+ <PackageRelativeDirectory>
+ </PackageRelativeDirectory>
+ </FilesToPackage>
+ </ItemGroup>
+ <ItemGroup>
+ <None Exclude="@(None)" Include="*.txt;*.htm;*.html" />
+ <None Exclude="@(None)" Include="*.ico;*.cur;*.bmp;*.dlg;*.rct;*.gif;*.jpg;*.jpeg;*.wav;*.jpe;*.tiff;*.tif;*.png;*.rc2" />
+ <None Exclude="@(None)" Include="*.def;*.bat;*.hpj;*.asmx" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Exclude="@(ClInclude)" Include="*.h;*.hpp;*.hxx;*.hm;*.inl;*.xsd" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project> \ No newline at end of file
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/osrusbfx2.h b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/osrusbfx2.h
new file mode 100644
index 00000000..1452aebf
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/osrusbfx2.h
@@ -0,0 +1,312 @@
+/*++
+
+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:
+
+ osrusbfx2.h
+
+Abstract:
+
+ Contains structure definitions and function prototypes private to
+ the driver.
+
+Environment:
+
+ User mode
+
+--*/
+
+#include <windows.h>
+#include <winioctl.h>
+#pragma warning( disable: 4201 ) // nonstandard extension used : nameless struct/union
+#include <ntstatus.h>
+#include <assert.h>
+#include <strsafe.h>
+#include <devpropdef.h>
+#include <wudfwdm.h>
+typedef struct _IO_STACK_LOCATION *PIO_STACK_LOCATION;
+#include <usbdi.h>
+#include <wdf.h>
+#include <wdfusb.h>
+#include <prototypes.h>
+#include <initguid.h>
+#include <driverspecs.h>
+#include <trace.h>
+
+#include "public.h"
+
+//
+// Include auto-generated ETW event functions (created by MC.EXE from
+// osrusbfx2.man)
+//
+#include <evntprov.h>
+#include "fx2Events.h"
+
+#ifndef _PRIVATE_H
+#define _PRIVATE_H
+
+#define POOL_TAG (ULONG) 'FRSO'
+#define _DRIVER_NAME_ "OSRUSBFX2"
+
+#define TEST_BOARD_TRANSFER_BUFFER_SIZE (64*1024)
+#define DEVICE_DESC_LENGTH 256
+
+extern const __declspec(selectany) LONGLONG DEFAULT_CONTROL_TRANSFER_TIMEOUT = 5 * -1 * WDF_TIMEOUT_TO_SEC;
+
+//
+// Define the vendor commands supported by our device
+//
+#define USBFX2LK_READ_7SEGMENT_DISPLAY 0xD4
+#define USBFX2LK_READ_SWITCHES 0xD6
+#define USBFX2LK_READ_BARGRAPH_DISPLAY 0xD7
+#define USBFX2LK_SET_BARGRAPH_DISPLAY 0xD8
+#define USBFX2LK_IS_HIGH_SPEED 0xD9
+#define USBFX2LK_REENUMERATE 0xDA
+#define USBFX2LK_SET_7SEGMENT_DISPLAY 0xDB
+
+//
+// Define the features that we can clear
+// and set on our device
+//
+#define USBFX2LK_FEATURE_EPSTALL 0x00
+#define USBFX2LK_FEATURE_WAKE 0x01
+
+//
+// Order of endpoints in the interface descriptor
+//
+#define INTERRUPT_IN_ENDPOINT_INDEX 0
+#define BULK_OUT_ENDPOINT_INDEX 1
+#define BULK_IN_ENDPOINT_INDEX 2
+
+//
+// A structure representing the instance information associated with
+// this particular device.
+//
+
+typedef struct _DEVICE_CONTEXT {
+
+ WDFUSBDEVICE UsbDevice;
+
+ WDFUSBINTERFACE UsbInterface;
+
+ WDFUSBPIPE BulkReadPipe;
+
+ WDFUSBPIPE BulkWritePipe;
+
+ WDFUSBPIPE InterruptPipe;
+
+ WDFWAITLOCK ResetDeviceWaitLock;
+
+ UCHAR CurrentSwitchState;
+
+ WDFQUEUE InterruptMsgQueue;
+
+ ULONG UsbDeviceTraits;
+
+ //
+ // The following fields are used during event logging to
+ // report the events relative to this specific instance
+ // of the device.
+ //
+
+ WDFMEMORY DeviceNameMemory;
+ PCWSTR DeviceName;
+
+ WDFMEMORY LocationMemory;
+ PCWSTR Location;
+
+} DEVICE_CONTEXT, *PDEVICE_CONTEXT;
+
+WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(DEVICE_CONTEXT, GetDeviceContext)
+
+extern ULONG DebugLevel;
+
+typedef
+NTSTATUS
+(*PFN_IO_GET_ACTIVITY_ID_IRP) (
+ _In_ PIRP Irp,
+ _Out_ LPGUID Guid
+ );
+
+typedef
+NTSTATUS
+(*PFN_IO_SET_DEVICE_INTERFACE_PROPERTY_DATA) (
+ _In_ PUNICODE_STRING SymbolicLinkName,
+ _In_ CONST DEVPROPKEY *PropertyKey,
+ _In_ LCID Lcid,
+ _In_ ULONG Flags,
+ _In_ DEVPROPTYPE Type,
+ _In_ ULONG Size,
+ _In_opt_ PVOID Data
+ );
+
+DRIVER_INITIALIZE DriverEntry;
+
+EVT_WDF_OBJECT_CONTEXT_CLEANUP OsrFxEvtDriverContextCleanup;
+
+EVT_WDF_DRIVER_DEVICE_ADD OsrFxEvtDeviceAdd;
+
+EVT_WDF_DEVICE_PREPARE_HARDWARE OsrFxEvtDevicePrepareHardware;
+
+EVT_WDF_IO_QUEUE_IO_READ OsrFxEvtIoRead;
+
+EVT_WDF_IO_QUEUE_IO_WRITE OsrFxEvtIoWrite;
+
+EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL OsrFxEvtIoDeviceControl;
+
+EVT_WDF_REQUEST_COMPLETION_ROUTINE EvtRequestReadCompletionRoutine;
+
+EVT_WDF_REQUEST_COMPLETION_ROUTINE EvtRequestWriteCompletionRoutine;
+
+_IRQL_requires_(PASSIVE_LEVEL)
+NTSTATUS
+ResetPipe(
+ _In_ WDFUSBPIPE Pipe
+ );
+
+_IRQL_requires_(PASSIVE_LEVEL)
+NTSTATUS
+ResetDevice(
+ _In_ WDFDEVICE Device
+ );
+
+_IRQL_requires_(PASSIVE_LEVEL)
+NTSTATUS
+SelectInterfaces(
+ _In_ WDFDEVICE Device
+ );
+
+_IRQL_requires_(PASSIVE_LEVEL)
+NTSTATUS
+ReenumerateDevice(
+ _In_ PDEVICE_CONTEXT DevContext
+ );
+
+_IRQL_requires_(PASSIVE_LEVEL)
+NTSTATUS
+GetBarGraphState(
+ _In_ PDEVICE_CONTEXT DevContext,
+ _Out_ PBAR_GRAPH_STATE BarGraphState
+ );
+
+_IRQL_requires_(PASSIVE_LEVEL)
+NTSTATUS
+SetBarGraphState(
+ _In_ PDEVICE_CONTEXT DevContext,
+ _In_ PBAR_GRAPH_STATE BarGraphState
+ );
+
+_IRQL_requires_(PASSIVE_LEVEL)
+NTSTATUS
+GetSevenSegmentState(
+ _In_ PDEVICE_CONTEXT DevContext,
+ _Out_ PUCHAR SevenSegment
+ );
+
+_IRQL_requires_(PASSIVE_LEVEL)
+NTSTATUS
+SetSevenSegmentState(
+ _In_ PDEVICE_CONTEXT DevContext,
+ _In_ PUCHAR SevenSegment
+ );
+
+_IRQL_requires_(PASSIVE_LEVEL)
+NTSTATUS
+GetSwitchState(
+ _In_ PDEVICE_CONTEXT DevContext,
+ _In_ PSWITCH_STATE SwitchState
+ );
+
+VOID
+OsrUsbIoctlGetInterruptMessage(
+ _In_ WDFDEVICE Device,
+ _In_ NTSTATUS ReaderStatus
+ );
+
+_IRQL_requires_(PASSIVE_LEVEL)
+NTSTATUS
+OsrFxSetPowerPolicy(
+ _In_ WDFDEVICE Device
+ );
+
+_IRQL_requires_(PASSIVE_LEVEL)
+NTSTATUS
+OsrFxConfigContReaderForInterruptEndPoint(
+ _In_ PDEVICE_CONTEXT DeviceContext
+ );
+
+EVT_WDF_USB_READER_COMPLETION_ROUTINE OsrFxEvtUsbInterruptPipeReadComplete;
+
+EVT_WDF_USB_READERS_FAILED OsrFxEvtUsbInterruptReadersFailed;
+
+EVT_WDF_IO_QUEUE_IO_STOP OsrFxEvtIoStop;
+
+EVT_WDF_DEVICE_D0_ENTRY OsrFxEvtDeviceD0Entry;
+
+EVT_WDF_DEVICE_D0_EXIT OsrFxEvtDeviceD0Exit;
+
+EVT_WDF_DEVICE_SELF_MANAGED_IO_FLUSH OsrFxEvtDeviceSelfManagedIoFlush;
+
+_IRQL_requires_(PASSIVE_LEVEL)
+BOOLEAN
+OsrFxReadFdoRegistryKeyValue(
+ _In_ PWDFDEVICE_INIT DeviceInit,
+ _In_ PWCHAR Name,
+ _Out_ PULONG Value
+ );
+
+_IRQL_requires_max_(DISPATCH_LEVEL)
+VOID
+OsrFxEnumerateChildren(
+ _In_ WDFDEVICE Device
+ );
+
+_IRQL_requires_(PASSIVE_LEVEL)
+VOID
+GetDeviceEventLoggingNames(
+ _In_ WDFDEVICE Device
+ );
+
+_IRQL_requires_(PASSIVE_LEVEL)
+PCHAR
+DbgDevicePowerString(
+ _In_ WDF_POWER_DEVICE_STATE Type
+ );
+
+FORCEINLINE
+GUID
+RequestToActivityId(
+ _In_ WDFREQUEST Request
+ )
+{
+ GUID activity = {0};
+
+ //
+ // Use the WDFREQUEST handle as the activity ID
+ //
+ RtlCopyMemory(&activity, &Request, sizeof(WDFREQUEST));
+
+ return activity;
+}
+
+FORCEINLINE
+GUID
+DeviceToActivityId(
+ _In_ WDFDEVICE Device
+ )
+{
+ GUID activity = {0};
+ RtlCopyMemory(&activity, &Device, sizeof(WDFDEVICE));
+ return activity;
+}
+
+
+#endif
+
+
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/osrusbfx2.man b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/osrusbfx2.man
new file mode 100644
index 00000000..19f363d5
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/osrusbfx2.man
@@ -0,0 +1,309 @@
+<?xml version='1.0' encoding='utf-8' standalone='yes'?>
+<instrumentationManifest
+ xmlns="http://schemas.microsoft.com/win/2004/08/events"
+ xmlns:win="http://manifests.microsoft.com/win/2004/08/windows/events"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://schemas.microsoft.com/win/2004/08/events eventman.xsd"
+ >
+ <instrumentation>
+ <events>
+ <provider
+ guid="{69cd60e3-430f-4da4-b1b3-e3bdaf945875}"
+ messageFileName="%Systemroot%\System32\drivers\umdf\osrusbfx2um.dll"
+ name="OSRUSBFX2"
+ resourceFileName="%SystemRoot%\System32\drivers\umdf\osrusbfx2um.dll"
+ symbol="OSRUSBFX2_PROVIDER"
+ >
+ <channels>
+ <channel
+ chid="Analytic"
+ enabled="false"
+ name="OsrUsbfx2/Analytic"
+ symbol="OSRUSBFX2_ANALYTIC"
+ type="Analytic"
+ />
+ <channel
+ chid="operational"
+ enabled="true"
+ isolation="System"
+ message="$(string.OSRUSBFX2_OPERATIONAL.Name)"
+ name="OsrUsbFx2/Operational"
+ symbol="OSRUSBFX2_OPERATIONAL"
+ type="Operational"
+ />
+ </channels>
+ <keywords>
+ <keyword
+ mask="0x0000000000000010"
+ message="$(string.OSRUSBFX2_DEVICE_INFO_KEYWORD.message)"
+ name="deviceinfo"
+ symbol="OSRUSBFX2_DEVICE_INFO_KEYWORD"
+ />
+ <keyword
+ mask="0x0000000000000040"
+ message="$(string.OSRUSBFX2_READ_WRITE_KEYWORD.message)"
+ name="readwrite"
+ symbol="OSRUSBFX2_READ_WRITE_KEYWORD"
+ />
+ </keywords>
+ <opcodes>
+ <!-- Defining our own custom opcode instead of using standard opcodes defined by winmeta.xml -->
+ <opcode
+ name="add"
+ symbol="OSRUSBFX2_DEVICE_ADD"
+ value="10"
+ />
+ <opcode
+ name="fail"
+ symbol="OSRUSBFX2_FAIL"
+ value="11"
+ />
+ </opcodes>
+ <tasks>
+ <!-- Support for XP and W2K3 : MC.exe will create a MOF file -->
+ <!-- Requires an associated eventGUID attribute for each task that is defined -->
+ <!-- For the MOF file : -->
+ <!-- Semantically, the event GUID represents a set of logical events that are logged by the provider. -->
+ <task
+ eventGUID="{872c3c43-6899-4f1d-89b8-51a82f6db657}"
+ name="deviceInit"
+ symbol="OSRUSBFX2_DEVICE_INIT"
+ value="1"
+ />
+ <task
+ eventGUID="{872c3c45-6899-4f1d-89b8-51a82f6db657}"
+ name="read"
+ symbol="OSRUSBFX2_READ"
+ value="2"
+ />
+ <task
+ eventGUID="{872c3c46-6899-4f1d-89b8-51a82f6db657}"
+ name="write"
+ symbol="OSRUSBFX2_WRITE"
+ value="3"
+ />
+ </tasks>
+ <templates>
+ <template tid="tid_DeviceStatus">
+ <data
+ inType="win:UnicodeString"
+ name="FriendlyName"
+ outType="xs:string"
+ />
+ <data
+ inType="win:UnicodeString"
+ name="Location"
+ outType="xs:string"
+ />
+ <data
+ inType="win:UInt32"
+ name="NTStatus"
+ outType="xs:HexInt32"
+ />
+ </template>
+ <template tid="tid_ReadWrite">
+ <data
+ inType="win:Pointer"
+ name="Device"
+ outType="win:HexInt64"
+ />
+ <data
+ inType="win:UInt32"
+ name="Length"
+ outType="xs:unsignedInt"
+ />
+ </template>
+ <template tid="tid_ReadWriteFail">
+ <data
+ inType="win:Pointer"
+ name="Device"
+ outType="win:HexInt64"
+ />
+ <data
+ inType="win:UInt32"
+ name="NTStatus"
+ outType="xs:HexInt32"
+ />
+ </template>
+ <template tid="tid_ReadWriteCompletion">
+ <data
+ inType="win:Pointer"
+ name="Device"
+ outType="win:HexInt64"
+ />
+ <data
+ inType="win:UInt32"
+ name="Length"
+ outType="xs:unsignedInt"
+ />
+ <data
+ inType="win:UInt32"
+ name="NTStatus"
+ outType="xs:HexInt32"
+ />
+ <data
+ inType="win:UInt32"
+ name="UsbdStatus"
+ outType="xs:unsignedInt"
+ />
+ </template>
+ </templates>
+ <events>
+ <event
+ channel="Analytic"
+ keywords="readwrite"
+ message="$(string.ReadStart.EventMessage)"
+ level="win:Informational"
+ opcode="win:Start"
+ symbol="ReadStart"
+ task="read"
+ template="tid_ReadWrite"
+ value="1"
+ />
+ <event
+ channel="Analytic"
+ keywords="readwrite"
+ message="$(string.ReadStop.EventMessage)"
+ level="win:Informational"
+ opcode="win:Stop"
+ symbol="ReadStop"
+ task="read"
+ template="tid_ReadWriteCompletion"
+ value="2"
+ />
+ <event
+ channel="Analytic"
+ keywords="readwrite"
+ message="$(string.ReadFail.EventMessage)"
+ level="win:Error"
+ opcode="fail"
+ symbol="ReadFail"
+ task="read"
+ template="tid_ReadWriteFail"
+ value="3"
+ />
+ <event
+ channel="Analytic"
+ keywords="readwrite"
+ message="$(string.WriteStart.EventMessage)"
+ level="win:Informational"
+ opcode="win:Start"
+ symbol="WriteStart"
+ task="write"
+ template="tid_ReadWrite"
+ value="4"
+ />
+ <event
+ channel="Analytic"
+ keywords="readwrite"
+ message="$(string.WriteStop.EventMessage)"
+ level="win:Informational"
+ opcode="win:Stop"
+ symbol="WriteStop"
+ task="write"
+ template="tid_ReadWriteCompletion"
+ value="5"
+ />
+ <event
+ channel="Analytic"
+ keywords="readwrite"
+ message="$(string.WriteFail.EventMessage)"
+ level="win:Error"
+ opcode="fail"
+ symbol="WriteFail"
+ task="write"
+ template="tid_ReadWriteFail"
+ value="6"
+ />
+ <event
+ channel="operational"
+ keywords="deviceinfo"
+ level="win:Error"
+ message="$(string.DeviceFailAdd.EventMessage)"
+ opcode="add"
+ symbol="FailAddDevice"
+ task="deviceInit"
+ template="tid_DeviceStatus"
+ value="100"
+ />
+ <event
+ channel="operational"
+ keywords="deviceinfo"
+ message="$(string.DeviceReenumerated.EventMessage)"
+ opcode="win:Start"
+ symbol="DeviceReenumerated"
+ task="deviceInit"
+ template="tid_DeviceStatus"
+ value="101"
+ />
+ <event
+ channel="operational"
+ keywords="deviceinfo"
+ level="win:Error"
+ message="$(string.SelectConfigFailure.Message)"
+ opcode="fail"
+ symbol="SelectConfigFailure"
+ task="deviceInit"
+ template="tid_DeviceStatus"
+ value="102"
+ />
+ </events>
+ </provider>
+ </events>
+ </instrumentation>
+ <localization xmlns="http://schemas.microsoft.com/win/2004/08/events">
+ <resources culture="en-US">
+ <stringTable>
+ <string
+ id="OSRUSBFX2_DEVICE_INFO_KEYWORD.message"
+ value="Device events: fail to load, reenumerate"
+ />
+ <string
+ id="OSRUSBFX2_READ_WRITE_KEYWORD.message"
+ value="Read, Write events"
+ />
+ <string
+ id="OSRUSBFX2_OPERATIONAL.Name"
+ value="Operational channel eventlog"
+ />
+ <string
+ id="ReadStart.EventMessage"
+ value="Read. Device = %1, Length = %2"
+ />
+ <string
+ id="ReadStop.EventMessage"
+ value="Read complete. Device = %1, Length = %2, Status = %3, UsbStatus = %4"
+ />
+ <string
+ id="ReadFail.EventMessage"
+ value="Read error. Device = %1, Status = %2"
+ />
+ <string
+ id="WriteStart.EventMessage"
+ value="Write. Device = %1, Length = %2"
+ />
+ <string
+ id="WriteStop.EventMessage"
+ value="Write complete. Device = %1, Length = %2, Status = %3, UsbStatus = %4"
+ />
+ <string
+ id="WriteFail.EventMessage"
+ value="Write error. Device = %1, Status = %2"
+ />
+ <string
+ id="DeviceReenumerated.EventMessage"
+ value="Device %1 (location %2) was reenumerated"
+ />
+ <string
+ id="DeviceFailAdd.EventMessage"
+ value="Fail to add device %1 (location %2), status %3"
+ />
+ <string
+ id="SelectConfigFailure.Message"
+ value="This error occurs when an OSR USB Fx2 board is attached to a USB 1.1 port on a machine running Windows Vista. This error occurs because the OSR USB Fx2 board's Interrupt end-point descriptor does not conform to the USB specification. Windows Vista detects this and returns an error. You should plug the device into a USB 2.0 (or higher) port."
+ />
+ </stringTable>
+ </resources>
+ </localization>
+</instrumentationManifest>
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/osrusbfx2.rc b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/osrusbfx2.rc
new file mode 100644
index 00000000..84f89a6c
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/osrusbfx2.rc
@@ -0,0 +1,13 @@
+#include <windows.h>
+
+#include <ntverp.h>
+
+#define VER_FILETYPE VFT_DLL
+#define VER_FILESUBTYPE VFT_UNKNOWN
+#define VER_FILEDESCRIPTION_STR "WDF Sample Driver for OSR USB-FX2 Learning Kit"
+#define VER_INTERNALNAME_STR "osrusbfx2um.dll"
+#define VER_ORIGINALFILENAME_STR "osrusbfx2um.dll"
+
+#include "common.ver"
+
+#include "fx2Events.rc"
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/trace.h b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/trace.h
new file mode 100644
index 00000000..5a72dcaf
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_base/trace.h
@@ -0,0 +1,115 @@
+/*++
+
+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:
+
+ TRACE.h
+
+Abstract:
+
+ Header file for the debug tracing related function defintions and macros.
+
+Environment:
+
+ Kernel mode
+
+--*/
+
+#include <evntrace.h> // For TRACE_LEVEL definitions
+
+#if !defined(EVENT_TRACING)
+
+//
+// TODO: These defines are missing in evntrace.h
+// in some DDK build environments (XP).
+//
+#if !defined(TRACE_LEVEL_NONE)
+ #define TRACE_LEVEL_NONE 0
+ #define TRACE_LEVEL_CRITICAL 1
+ #define TRACE_LEVEL_FATAL 1
+ #define TRACE_LEVEL_ERROR 2
+ #define TRACE_LEVEL_WARNING 3
+ #define TRACE_LEVEL_INFORMATION 4
+ #define TRACE_LEVEL_VERBOSE 5
+ #define TRACE_LEVEL_RESERVED6 6
+ #define TRACE_LEVEL_RESERVED7 7
+ #define TRACE_LEVEL_RESERVED8 8
+ #define TRACE_LEVEL_RESERVED9 9
+#endif
+
+
+//
+// Define Debug Flags
+//
+#define DBG_INIT 0x00000001
+#define DBG_PNP 0x00000002
+#define DBG_POWER 0x00000004
+#define DBG_WMI 0x00000008
+#define DBG_CREATE_CLOSE 0x00000010
+#define DBG_IOCTL 0x00000020
+#define DBG_WRITE 0x00000040
+#define DBG_READ 0x00000080
+
+
+VOID
+TraceEvents (
+ _In_ ULONG DebugPrintLevel,
+ _In_ ULONG DebugPrintFlag,
+ _Printf_format_string_
+ _In_ PCSTR DebugMessage,
+ ...
+ );
+
+#define WPP_INIT_TRACING(RegistryPath)
+#define WPP_CLEANUP()
+
+#else
+//
+// If software tracing is defined in the sources file..
+// WPP_DEFINE_CONTROL_GUID specifies the GUID used for this driver.
+// *** REPLACE THE GUID WITH YOUR OWN UNIQUE ID ***
+// WPP_DEFINE_BIT allows setting debug bit masks to selectively print.
+// The names defined in the WPP_DEFINE_BIT call define the actual names
+// that are used to control the level of tracing for the control guid
+// specified.
+//
+// NOTE: If you are adopting this sample for your driver, please generate
+// a new guid, using tools\other\i386\guidgen.exe present in the
+// DDK.
+//
+// Name of the logger is OSRUSBFX2 and the guid is
+// {D23A0C5A-D307-4f0e-AE8E-E2A355AD5DAB}
+// (0xd23a0c5a, 0xd307, 0x4f0e, 0xae, 0x8e, 0xe2, 0xa3, 0x55, 0xad, 0x5d, 0xab);
+//
+
+#define WPP_CHECK_FOR_NULL_STRING //to prevent exceptions due to NULL strings
+
+#define WPP_CONTROL_GUIDS \
+ WPP_DEFINE_CONTROL_GUID(OsrUsbFxTraceGuid,(d23a0c5a,d307,4f0e,ae8e,E2A355AD5DAB), \
+ WPP_DEFINE_BIT(DBG_INIT) /* bit 0 = 0x00000001 */ \
+ WPP_DEFINE_BIT(DBG_PNP) /* bit 1 = 0x00000002 */ \
+ WPP_DEFINE_BIT(DBG_POWER) /* bit 2 = 0x00000004 */ \
+ WPP_DEFINE_BIT(DBG_WMI) /* bit 3 = 0x00000008 */ \
+ WPP_DEFINE_BIT(DBG_CREATE_CLOSE) /* bit 4 = 0x00000010 */ \
+ WPP_DEFINE_BIT(DBG_IOCTL) /* bit 5 = 0x00000020 */ \
+ WPP_DEFINE_BIT(DBG_WRITE) /* bit 6 = 0x00000040 */ \
+ WPP_DEFINE_BIT(DBG_READ) /* bit 7 = 0x00000080 */ \
+ /* You can have up to 32 defines. If you want more than that,\
+ you have to provide another trace control GUID */\
+ )
+
+
+#define WPP_LEVEL_FLAGS_LOGGER(lvl,flags) WPP_LEVEL_LOGGER(flags)
+#define WPP_LEVEL_FLAGS_ENABLED(lvl, flags) (WPP_LEVEL_ENABLED(flags) && WPP_CONTROL(WPP_BIT_ ## flags).Level >= lvl)
+
+
+#endif
+
+
+
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_filter/filter.c b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_filter/filter.c
new file mode 100644
index 00000000..3e41778e
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_filter/filter.c
@@ -0,0 +1,421 @@
+/*++
+
+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:
+
+ filter.c
+
+Abstract:
+
+ This module shows how to a write a generic filter driver. The driver demonstrates how
+ to support device I/O control requests through queues. All I/O requests are passed on to
+ the lower driver. This filter driver shows how to handle IRP postprocessing by forwarding
+ the requests with and without a completion routine. To forward with a completion routine
+ set the define FORWARD_REQUEST_WITH_COMPLETION to 1.
+
+Environment:
+
+ User mode
+
+--*/
+
+#include "filter.h"
+
+
+#ifdef ALLOC_PRAGMA
+#pragma alloc_text (INIT, DriverEntry)
+#pragma alloc_text (PAGE, FilterEvtDeviceAdd)
+#endif
+
+
+/*++
+
+Routine Description:
+
+ Installable driver initialization entry point.
+ This entry point is called directly by the I/O system.
+
+Arguments:
+
+ DriverObject - Pointer to the driver object
+
+ RegistryPath - Pointer to a unicode string representing the path
+ to the driver-specific key in the registry.
+
+Return Value:
+
+ STATUS_SUCCESS if successful,
+ STATUS_UNSUCCESSFUL otherwise.
+
+--*/
+NTSTATUS
+DriverEntry(
+ IN PDRIVER_OBJECT DriverObject,
+ IN PUNICODE_STRING RegistryPath
+ )
+{
+ WDF_DRIVER_CONFIG Config;
+ NTSTATUS Status;
+ WDFDRIVER hDriver;
+
+ KdPrint(("Generic Upper Filter Driver Sample - Driver Framework Edition.\n"));
+
+ //
+ // Initialize driver config to control the attributes that
+ // are global to the driver. Note that the framework by default
+ // provides a driver unload routine. If you created any resources
+ // in DriverEntry and want them to be cleaned up when the driver unloads,
+ // you can override that by manually setting the EvtDriverUnload in the
+ // config structure. In general xxx_CONFIG_INIT macros are provided to
+ // initialize most commonly used members.
+ //
+
+ WDF_DRIVER_CONFIG_INIT(&Config,
+ FilterEvtDeviceAdd);
+
+ //
+ // Create a framework driver object to represent our driver.
+ //
+ Status = WdfDriverCreate(DriverObject,
+ RegistryPath,
+ WDF_NO_OBJECT_ATTRIBUTES,
+ &Config,
+ &hDriver);
+
+ if (!NT_SUCCESS(Status))
+ {
+ KdPrint(("WdfDriverCreate failed with status 0x%x\n", Status));
+ }
+
+ return Status;
+}
+
+
+/*++
+Routine Description:
+
+ EvtDeviceAdd is called by the framework in response to the AddDevice
+ call from the PnP manager. Here you can query the device properties
+ using WdfFdoInitWdmGetPhysicalDevice/IoGetDeviceProperty and based
+ on that, decide to create a filter device object and attach it to the
+ function stack. If you are not interested in filtering this particular
+ instance of the device, you can just return STATUS_SUCCESS without creating
+ a framework device.
+
+Arguments:
+
+ Driver - Handle to a framework driver object created in DriverEntry
+
+ DeviceInit - Pointer to a framework-allocated WDFDEVICE_INIT structure.
+
+Return Value:
+
+ NTSTATUS
+
+--*/
+NTSTATUS
+FilterEvtDeviceAdd(
+ IN WDFDRIVER Driver,
+ IN PWDFDEVICE_INIT DeviceInit
+ )
+{
+ WDF_OBJECT_ATTRIBUTES DeviceAttributes;
+ PFILTER_EXTENSION FilterExt;
+ NTSTATUS Status;
+ WDFDEVICE Device;
+ WDF_IO_QUEUE_CONFIG IoQueueConfig;
+
+ PAGED_CODE ();
+
+ UNREFERENCED_PARAMETER(Driver);
+
+ //
+ // Tell the framework that you are a filter driver. The framework
+ // takes care of inherting all the device flags & characteristics
+ // from the higher device that you are attaching to.
+ //
+ WdfFdoInitSetFilter(DeviceInit);
+
+ //
+ // Specify the size of the device extension where we track per device
+ // context.
+ //
+
+ WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&DeviceAttributes, FILTER_EXTENSION);
+
+ //
+ // Create a framework device object. This call will in turn create
+ // a WDM device object, attach it to the lower stack, and set the
+ // appropriate flags and attributes.
+ //
+ Status = WdfDeviceCreate(&DeviceInit, &DeviceAttributes, &Device);
+
+ if (!NT_SUCCESS(Status))
+ {
+ KdPrint(("WdfDeviceCreate failed with status code 0x%x\n", Status));
+ return Status;
+ }
+
+ FilterExt = FilterGetData(Device);
+
+ //
+ // Configure the default queue to be Parallel.
+ //
+ WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&IoQueueConfig,
+ WdfIoQueueDispatchParallel);
+
+ //
+ // The framework by default creates non-power managed queues for
+ // filter drivers.
+ //
+ IoQueueConfig.EvtIoDeviceControl = FilterEvtIoDeviceControl;
+
+ Status = WdfIoQueueCreate(Device,
+ &IoQueueConfig,
+ WDF_NO_OBJECT_ATTRIBUTES,
+ WDF_NO_HANDLE // Pointer to default queue
+ );
+
+ if (!NT_SUCCESS(Status))
+ {
+ KdPrint(("WdfIoQueueCreate failed 0x%x\n", Status));
+ return Status;
+ }
+
+ return Status;
+}
+
+
+/*++
+
+Routine Description:
+
+ This routine is the dispatch routine for internal device control requests.
+
+Arguments:
+
+ Queue - Handle to the framework queue object that is associated
+ with the I/O request
+
+ Request - Handle to a framework request object
+
+ OutputBufferLength - Length of the request's output buffer,
+ if an output buffer is available
+
+ InputBufferLength - Length of the request's input buffer,
+ if an input buffer is available
+
+ IoControlCode - The driver-defined or system-defined I/O control code
+ (IOCTL) that is associated with the request
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+FilterEvtIoDeviceControl(
+ IN WDFQUEUE Queue,
+ IN WDFREQUEST Request,
+ IN size_t OutputBufferLength,
+ IN size_t InputBufferLength,
+ IN ULONG IoControlCode
+ )
+{
+ PFILTER_EXTENSION FilterExt;
+ NTSTATUS Status = STATUS_SUCCESS;
+ WDFDEVICE Device;
+
+ UNREFERENCED_PARAMETER(OutputBufferLength);
+ UNREFERENCED_PARAMETER(InputBufferLength);
+
+ KdPrint(("Entered FilterEvtIoDeviceControl\n"));
+
+ Device = WdfIoQueueGetDevice(Queue);
+
+ FilterExt = FilterGetData(Device);
+
+ switch (IoControlCode)
+ {
+
+ //
+ // Put your cases for handling IOCTLs here
+ //
+
+ default:
+ Status = STATUS_SUCCESS;
+ }
+
+ if (!NT_SUCCESS(Status))
+ {
+ WdfRequestComplete(Request, Status);
+ return;
+ }
+
+ //
+ // Forward the request down. WdfDeviceGetIoTarget returns
+ // the default target, which represents the device attached to us below in
+ // the stack.
+ //
+#if FORWARD_REQUEST_WITH_COMPLETION
+ //
+ // Use this routine to forward a request if you are interested in post
+ // processing the IRP.
+ //
+ FilterForwardRequestWithCompletionRoutine(Request,
+ WdfDeviceGetIoTarget(Device));
+#else
+ FilterForwardRequest(Request, WdfDeviceGetIoTarget(Device));
+#endif
+
+ return;
+}
+
+
+/*++
+Routine Description:
+
+ Passes a request on to the lower driver.
+
+Arguments:
+
+ Request - The request to pass on to the lower driver
+
+ Target - The lower driver to pass the request to
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+FilterForwardRequest(
+ IN WDFREQUEST Request,
+ IN WDFIOTARGET Target
+ )
+{
+ WDF_REQUEST_SEND_OPTIONS Options;
+ BOOLEAN RequestSent;
+ NTSTATUS Status;
+
+ //
+ // We are not interested in post processing the IRP so
+ // fire and forget.
+ //
+ WDF_REQUEST_SEND_OPTIONS_INIT(&Options,
+ WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET);
+
+ RequestSent = WdfRequestSend(Request, Target, &Options);
+
+ if (RequestSent == FALSE) {
+ Status = WdfRequestGetStatus(Request);
+ KdPrint(("WdfRequestSend failed: 0x%x\n", Status));
+ WdfRequestComplete(Request, Status);
+ }
+
+ return;
+}
+
+#if FORWARD_REQUEST_WITH_COMPLETION
+
+VOID
+FilterForwardRequestWithCompletionRoutine(
+ IN WDFREQUEST Request,
+ IN WDFIOTARGET Target
+ )
+/*++
+Routine Description:
+
+ This routine forwards the request to a lower driver with
+ a completion so that when the request is completed by the
+ lower driver, it can regain control of the request and look
+ at the result.
+
+Arguments:
+
+ Request - The request to pass on to the lower driver
+
+ Target - The lower driver to pass the request to
+
+Return Value:
+
+ VOID
+
+--*/
+{
+ BOOLEAN RequestSent;
+ NTSTATUS Status;
+
+ //
+ // The following function essentially copies the content of the
+ // current stack location of the underlying IRP to the next one.
+ //
+ WdfRequestFormatRequestUsingCurrentType(Request);
+
+ WdfRequestSetCompletionRoutine(Request,
+ FilterRequestCompletionRoutine,
+ WDF_NO_CONTEXT);
+
+ RequestSent = WdfRequestSend(Request,
+ Target,
+ WDF_NO_SEND_OPTIONS);
+
+ if (RequestSent == FALSE)
+ {
+ Status = WdfRequestGetStatus(Request);
+ KdPrint(("WdfRequestSend failed: 0x%x\n", Status));
+ WdfRequestComplete(Request, Status);
+ }
+
+ return;
+}
+
+
+/*++
+
+Routine Description:
+
+ Completion Routine.
+
+Arguments:
+
+ Target - Target handle
+
+ Request - Request handle
+
+ Params - Request completion params
+
+ Context - Driver supplied context
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+FilterRequestCompletionRoutine(
+ IN WDFREQUEST Request,
+ IN WDFIOTARGET Target,
+ PWDF_REQUEST_COMPLETION_PARAMS CompletionParams,
+ IN WDFCONTEXT Context
+ )
+{
+ UNREFERENCED_PARAMETER(Target);
+ UNREFERENCED_PARAMETER(Context);
+
+ WdfRequestComplete(Request, CompletionParams->IoStatus.Status);
+
+ return;
+}
+
+#endif //FORWARD_REQUEST_WITH_COMPLETION
+
+
+
+
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_filter/filter.h b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_filter/filter.h
new file mode 100644
index 00000000..e9042c29
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_filter/filter.h
@@ -0,0 +1,85 @@
+/*++
+
+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:
+
+ filter.h
+
+Abstract:
+
+ Contains structure definitions and function prototypes for a generic filter driver.
+
+Environment:
+
+ User mode
+
+--*/
+
+#include <windows.h>
+#include <winioctl.h>
+#pragma warning( disable: 4201 ) // nonstandard extension used : nameless struct/union
+#include <ntstatus.h>
+#include <devpropdef.h>
+#include <wudfwdm.h>
+#include <wdf.h>
+
+#if !defined(_FILTER_H_)
+#define _FILTER_H_
+
+
+#define DRIVERNAME "Generic.sys: "
+
+//
+// Change the following define to 1 if you want to forward
+// the request with a completion routine.
+//
+#define FORWARD_REQUEST_WITH_COMPLETION 0
+
+
+typedef struct _FILTER_EXTENSION
+{
+ WDFDEVICE WdfDevice;
+ // More context data here
+
+}FILTER_EXTENSION, *PFILTER_EXTENSION;
+
+
+WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(FILTER_EXTENSION,
+ FilterGetData)
+
+DRIVER_INITIALIZE DriverEntry;
+EVT_WDF_DRIVER_DEVICE_ADD FilterEvtDeviceAdd;
+EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL FilterEvtIoDeviceControl;
+
+VOID
+FilterForwardRequest(
+ IN WDFREQUEST Request,
+ IN WDFIOTARGET Target
+ );
+
+#if FORWARD_REQUEST_WITH_COMPLETION
+
+VOID
+FilterForwardRequestWithCompletionRoutine(
+ IN WDFREQUEST Request,
+ IN WDFIOTARGET Target
+ );
+
+VOID
+FilterRequestCompletionRoutine(
+ IN WDFREQUEST Request,
+ IN WDFIOTARGET Target,
+ PWDF_REQUEST_COMPLETION_PARAMS CompletionParams,
+ IN WDFCONTEXT Context
+ );
+
+#endif //FORWARD_REQUEST_WITH_COMPLETION
+
+#endif
+
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_filter/filter.rc b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_filter/filter.rc
new file mode 100644
index 00000000..0c108f44
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_filter/filter.rc
@@ -0,0 +1,12 @@
+#include <windows.h>
+#include <filter.h>
+#include <ntverp.h>
+
+#define VER_FILETYPE VFT_DLL
+#define VER_FILESUBTYPE VFT_UNKNOWN
+#define VER_FILEDESCRIPTION_STR "UMDF 2.0 Filter Driver for the Toaster Stack"
+#define VER_INTERNALNAME_STR DRIVERNAME
+#define VER_ORIGINALFILENAME_STR DRIVERNAME
+
+#include "common.ver"
+
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_filter/osrfx2_DCHU_filter.Filters b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_filter/osrfx2_DCHU_filter.Filters
new file mode 100644
index 00000000..2e7de4fc
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_filter/osrfx2_DCHU_filter.Filters
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx;*</Extensions>
+ <UniqueIdentifier>{B98D4FD9-00A8-4964-AE34-6AF1F833564B}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Header Files">
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ <UniqueIdentifier>{30413FCB-C550-4E4B-85F0-F39789145A19}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Resource Files">
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms;man;xml</Extensions>
+ <UniqueIdentifier>{D54A0D65-9B62-45F4-8B43-F92BC9FF355C}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Driver Files">
+ <Extensions>inf;inv;inx;mof;mc;</Extensions>
+ <UniqueIdentifier>{71F51C61-8117-4556-90E5-DE06697F59D6}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="filter.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="*.h;*.hpp;*.hxx;*.hm;*.inl;*.xsd">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_filter/osrfx2_DCHU_filter.vcxproj b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_filter/osrfx2_DCHU_filter.vcxproj
new file mode 100644
index 00000000..0ef42141
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_filter/osrfx2_DCHU_filter.vcxproj
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{3CC42473-D121-41F4-AE26-1F2F0AC65E82}</ProjectGuid>
+ <RootNamespace>$(MSBuildProjectName)</RootNamespace>
+ <UMDF_VERSION_MAJOR>2</UMDF_VERSION_MAJOR>
+ <SupportsPackaging>false</SupportsPackaging>
+ <RequiresPackageProject>true</RequiresPackageProject>
+ <Configuration Condition="'$(Configuration)' == ''">Debug</Configuration>
+ <Platform Condition="'$(Platform)' == ''">Win32</Platform>
+ <SampleGuid>{1A4A32BA-1596-4F52-BC48-B85A6D8D5D12}</SampleGuid>
+ <WindowsTargetPlatformVersion>$(LatestTargetPlatformVersion)</WindowsTargetPlatformVersion>
+ <ProjectName>osrfx2_DCHU_filter</ProjectName>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>False</UseDebugLibraries>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ <DriverType>UMDF</DriverType>
+ <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset>
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ </PropertyGroup>
+ <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>True</UseDebugLibraries>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ <DriverType>UMDF</DriverType>
+ <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset>
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ </PropertyGroup>
+ <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>False</UseDebugLibraries>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ <DriverType>UMDF</DriverType>
+ <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset>
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ </PropertyGroup>
+ <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>True</UseDebugLibraries>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ <DriverType>UMDF</DriverType>
+ <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset>
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <PropertyGroup>
+ <OutDir>$(SolutionDir)$(Platform)\$(ConfigurationName)\</OutDir>
+ </PropertyGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
+ </ImportGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <TargetName>$(ProjectName)</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <TargetName>$(ProjectName)</TargetName>
+ <TargetExt>.dll</TargetExt>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <TargetName>$(ProjectName)</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <TargetName>$(ProjectName)</TargetName>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <WarningLevel>Level4</WarningLevel>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies);$(SDK_LIB_PATH)\onecore.lib</AdditionalDependencies>
+ </Link>
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <Midl>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ </Midl>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <WarningLevel>Level4</WarningLevel>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies);$(SDK_LIB_PATH)onecore.lib</AdditionalDependencies>
+ </Link>
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <Midl>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ </Midl>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <WarningLevel>Level4</WarningLevel>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies);$(SDK_LIB_PATH)\onecore.lib</AdditionalDependencies>
+ </Link>
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <Midl>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ </Midl>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <WarningLevel>Level4</WarningLevel>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies);$(SDK_LIB_PATH)onecore.lib</AdditionalDependencies>
+ </Link>
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <Midl>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ </Midl>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="filter.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <Inf Exclude="@(Inf)" Include="*.inf" />
+ <FilesToPackage Include="$(TargetPath)" Condition="'$(ConfigurationType)'=='Driver' or '$(ConfigurationType)'=='DynamicLibrary'">
+ <PackageRelativeDirectory>
+ </PackageRelativeDirectory>
+ </FilesToPackage>
+ </ItemGroup>
+ <ItemGroup>
+ <None Exclude="@(None)" Include="*.txt;*.htm;*.html" />
+ <None Exclude="@(None)" Include="*.ico;*.cur;*.bmp;*.dlg;*.rct;*.gif;*.jpg;*.jpeg;*.wav;*.jpe;*.tiff;*.tif;*.png;*.rc2" />
+ <None Exclude="@(None)" Include="*.def;*.bat;*.hpj;*.asmx" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Exclude="@(ClInclude)" Include="*.h;*.hpp;*.hxx;*.hm;*.inl;*.xsd" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project> \ No newline at end of file
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_testapp/dump.c b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_testapp/dump.c
new file mode 100644
index 00000000..69074bf1
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_testapp/dump.c
@@ -0,0 +1,444 @@
+/*++
+
+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:
+
+ DUMP.C
+
+Abstract:
+
+ Routines to dump the descriptors information in a human readable form.
+
+Environment:
+
+ user mode only
+
+--*/
+
+#include <windows.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "devioctl.h"
+
+#pragma warning(disable:4200) //
+#pragma warning(disable:4201) // nameless struct/union
+#pragma warning(disable:4214) // bit field types other than int
+
+#include <basetyps.h>
+#include "usbdi.h"
+#include "public.h"
+
+#pragma warning(default:4200)
+#pragma warning(default:4201)
+#pragma warning(default:4214)
+
+HANDLE
+OpenDevice(
+ _In_ BOOL Synchronous
+ );
+
+
+char*
+usbDescriptorTypeString(UCHAR bDescriptorType )
+/*++
+Routine Description:
+
+ Called to get ascii string of USB descriptor
+
+Arguments:
+
+ PUSB_ENDPOINT_DESCRIPTOR->bDescriptorType or
+ PUSB_DEVICE_DESCRIPTOR->bDescriptorType or
+ PUSB_INTERFACE_DESCRIPTOR->bDescriptorType or
+ PUSB_STRING_DESCRIPTOR->bDescriptorType or
+ PUSB_POWER_DESCRIPTOR->bDescriptorType or
+ PUSB_CONFIGURATION_DESCRIPTOR->bDescriptorType
+
+Return Value:
+
+ ptr to string
+
+--*/
+{
+
+ switch(bDescriptorType) {
+
+ case USB_DEVICE_DESCRIPTOR_TYPE:
+ return "USB_DEVICE_DESCRIPTOR_TYPE";
+
+ case USB_CONFIGURATION_DESCRIPTOR_TYPE:
+ return "USB_CONFIGURATION_DESCRIPTOR_TYPE";
+
+
+ case USB_STRING_DESCRIPTOR_TYPE:
+ return "USB_STRING_DESCRIPTOR_TYPE";
+
+
+ case USB_INTERFACE_DESCRIPTOR_TYPE:
+ return "USB_INTERFACE_DESCRIPTOR_TYPE";
+
+
+ case USB_ENDPOINT_DESCRIPTOR_TYPE:
+ return "USB_ENDPOINT_DESCRIPTOR_TYPE";
+
+
+#ifdef USB_POWER_DESCRIPTOR_TYPE // this is the older definintion which is actually obsolete
+ // workaround for temporary bug in 98ddk, older USB100.h file
+ case USB_POWER_DESCRIPTOR_TYPE:
+ return "USB_POWER_DESCRIPTOR_TYPE";
+#endif
+
+#ifdef USB_RESERVED_DESCRIPTOR_TYPE // this is the current version of USB100.h as in NT5DDK
+
+ case USB_RESERVED_DESCRIPTOR_TYPE:
+ return "USB_RESERVED_DESCRIPTOR_TYPE";
+
+ case USB_CONFIG_POWER_DESCRIPTOR_TYPE:
+ return "USB_CONFIG_POWER_DESCRIPTOR_TYPE";
+
+ case USB_INTERFACE_POWER_DESCRIPTOR_TYPE:
+ return "USB_INTERFACE_POWER_DESCRIPTOR_TYPE";
+#endif // for current nt5ddk version of USB100.h
+
+ default:
+ return "??? UNKNOWN!!";
+ }
+}
+
+
+char *
+usbEndPointTypeString(UCHAR bmAttributes)
+/*++
+Routine Description:
+
+ Called to get ascii string of endpt descriptor type
+
+Arguments:
+
+ PUSB_ENDPOINT_DESCRIPTOR->bmAttributes
+
+Return Value:
+
+ ptr to string
+
+--*/
+{
+ UINT typ = bmAttributes & USB_ENDPOINT_TYPE_MASK;
+
+
+ switch( typ) {
+ case USB_ENDPOINT_TYPE_INTERRUPT:
+ return "USB_ENDPOINT_TYPE_INTERRUPT";
+
+ case USB_ENDPOINT_TYPE_BULK:
+ return "USB_ENDPOINT_TYPE_BULK";
+
+ case USB_ENDPOINT_TYPE_ISOCHRONOUS:
+ return "USB_ENDPOINT_TYPE_ISOCHRONOUS";
+
+ case USB_ENDPOINT_TYPE_CONTROL:
+ return "USB_ENDPOINT_TYPE_CONTROL";
+
+ default:
+ return "??? UNKNOWN!!";
+ }
+}
+
+
+char *
+usbConfigAttributesString(UCHAR bmAttributes)
+/*++
+Routine Description:
+
+ Called to get ascii string of USB_CONFIGURATION_DESCRIPTOR attributes
+
+Arguments:
+
+ PUSB_CONFIGURATION_DESCRIPTOR->bmAttributes
+
+Return Value:
+
+ ptr to string
+
+--*/
+{
+ UINT typ = bmAttributes & USB_CONFIG_POWERED_MASK;
+
+
+ switch( typ) {
+
+ case USB_CONFIG_BUS_POWERED:
+ return "USB_CONFIG_BUS_POWERED";
+
+ case USB_CONFIG_SELF_POWERED:
+ return "USB_CONFIG_SELF_POWERED";
+
+ case USB_CONFIG_REMOTE_WAKEUP:
+ return "USB_CONFIG_REMOTE_WAKEUP";
+
+
+ default:
+ return "??? UNKNOWN!!";
+ }
+}
+
+
+void
+print_USB_CONFIGURATION_DESCRIPTOR(PUSB_CONFIGURATION_DESCRIPTOR cd)
+/*++
+Routine Description:
+
+ Called to do formatted ascii dump to console of a USB config descriptor
+
+Arguments:
+
+ ptr to USB configuration descriptor
+
+Return Value:
+
+ none
+
+--*/
+{
+ printf("\n===================\nUSB_CONFIGURATION_DESCRIPTOR\n");
+
+ printf(
+ "bLength = 0x%x, decimal %d\n", cd->bLength, cd->bLength
+ );
+
+ printf(
+ "bDescriptorType = 0x%x ( %s )\n", cd->bDescriptorType,
+ usbDescriptorTypeString( cd->bDescriptorType )
+ );
+
+ printf(
+ "wTotalLength = 0x%x, decimal %d\n", cd->wTotalLength, cd->wTotalLength
+ );
+
+ printf(
+ "bNumInterfaces = 0x%x, decimal %d\n", cd->bNumInterfaces, cd->bNumInterfaces
+ );
+
+ printf(
+ "bConfigurationValue = 0x%x, decimal %d\n",
+ cd->bConfigurationValue, cd->bConfigurationValue
+ );
+
+ printf(
+ "iConfiguration = 0x%x, decimal %d\n", cd->iConfiguration, cd->iConfiguration
+ );
+
+ printf(
+ "bmAttributes = 0x%x ( %s )\n", cd->bmAttributes,
+ usbConfigAttributesString( cd->bmAttributes )
+ );
+
+ printf(
+ "MaxPower = 0x%x, decimal %d\n", cd->MaxPower, cd->MaxPower
+ );
+}
+
+
+void
+print_USB_INTERFACE_DESCRIPTOR(PUSB_INTERFACE_DESCRIPTOR id, UINT ix)
+/*++
+Routine Description:
+
+ Called to do formatted ascii dump to console of a USB interface descriptor
+
+Arguments:
+
+ ptr to USB interface descriptor
+
+Return Value:
+
+ none
+
+--*/
+{
+ printf("\n-----------------------------\nUSB_INTERFACE_DESCRIPTOR #%d\n", ix);
+
+
+ printf(
+ "bLength = 0x%x\n", id->bLength
+ );
+
+
+ printf(
+ "bDescriptorType = 0x%x ( %s )\n", id->bDescriptorType,
+ usbDescriptorTypeString( id->bDescriptorType )
+ );
+
+
+ printf(
+ "bInterfaceNumber = 0x%x\n", id->bInterfaceNumber
+ );
+ printf(
+ "bAlternateSetting = 0x%x\n", id->bAlternateSetting
+ );
+ printf(
+ "bNumEndpoints = 0x%x\n", id->bNumEndpoints
+ );
+ printf(
+ "bInterfaceClass = 0x%x\n", id->bInterfaceClass
+ );
+ printf(
+ "bInterfaceSubClass = 0x%x\n", id->bInterfaceSubClass
+ );
+ printf(
+ "bInterfaceProtocol = 0x%x\n", id->bInterfaceProtocol
+ );
+ printf(
+ "bInterface = 0x%x\n", id->iInterface
+ );
+}
+
+
+void
+print_USB_ENDPOINT_DESCRIPTOR(PUSB_ENDPOINT_DESCRIPTOR ed, int i)
+/*++
+Routine Description:
+
+ Called to do formatted ascii dump to console of a USB endpoint descriptor
+
+Arguments:
+
+ ptr to USB endpoint descriptor,
+ index of this endpt in interface desc
+
+Return Value:
+
+ none
+
+--*/
+{
+ printf(
+ "------------------------------\nUSB_ENDPOINT_DESCRIPTOR for Pipe%02d\n", i
+ );
+
+ printf(
+ "bLength = 0x%x\n", ed->bLength
+ );
+
+ printf(
+ "bDescriptorType = 0x%x ( %s )\n", ed->bDescriptorType,
+ usbDescriptorTypeString( ed->bDescriptorType )
+ );
+
+ if ( USB_ENDPOINT_DIRECTION_IN( ed->bEndpointAddress ) ) {
+ printf(
+ "bEndpointAddress= 0x%x ( INPUT )\n", ed->bEndpointAddress
+ );
+ } else {
+ printf(
+ "bEndpointAddress= 0x%x ( OUTPUT )\n", ed->bEndpointAddress
+ );
+ }
+
+ printf(
+ "bmAttributes= 0x%x ( %s )\n", ed->bmAttributes,
+ usbEndPointTypeString ( ed->bmAttributes )
+ );
+
+ printf(
+ "wMaxPacketSize= 0x%x, decimal %d\n", ed->wMaxPacketSize,
+ ed->wMaxPacketSize
+ );
+
+ printf(
+ "bInterval = 0x%x, decimal %d\n", ed->bInterval, ed->bInterval
+ );
+}
+
+
+BOOL
+DumpUsbConfig()
+/*++
+Routine Description:
+
+ Called to do formatted ascii dump to console of USB
+ configuration, interface, and endpoint descriptors.
+
+Arguments:
+
+ none
+
+Return Value:
+
+ TRUE or FALSE
+
+--*/
+{
+ HANDLE hDev;
+ UINT success;
+ int siz, nBytes;
+ char buf[256] = {'\0'};
+
+ hDev = OpenDevice(TRUE);
+ if(hDev == INVALID_HANDLE_VALUE)
+ {
+ return FALSE;
+ }
+
+ siz = sizeof(buf);
+
+ success = DeviceIoControl(hDev,
+ IOCTL_OSRUSBFX2_GET_CONFIG_DESCRIPTOR,
+ buf,
+ siz,
+ buf,
+ siz,
+ (PULONG) &nBytes,
+ NULL);
+
+ if(success == FALSE) {
+ printf("Ioct - GetConfigDesc failed %d\n", GetLastError());
+ } else {
+
+ ULONG i;
+ UINT j, n;
+ char *pch;
+ PUSB_CONFIGURATION_DESCRIPTOR cd;
+ PUSB_INTERFACE_DESCRIPTOR id;
+ PUSB_ENDPOINT_DESCRIPTOR ed;
+
+ pch = buf;
+ n = 0;
+
+ cd = (PUSB_CONFIGURATION_DESCRIPTOR) pch;
+
+ print_USB_CONFIGURATION_DESCRIPTOR( cd );
+
+ pch += cd->bLength;
+
+ do {
+ id = (PUSB_INTERFACE_DESCRIPTOR) pch;
+
+ print_USB_INTERFACE_DESCRIPTOR(id, n++);
+
+ pch += id->bLength;
+ for (j=0; j<id->bNumEndpoints; j++) {
+
+ ed = (PUSB_ENDPOINT_DESCRIPTOR) pch;
+
+ print_USB_ENDPOINT_DESCRIPTOR(ed,j);
+
+ pch += ed->bLength;
+ }
+ i = (ULONG)(pch - buf);
+
+ } while (i<cd->wTotalLength);
+ }
+
+ CloseHandle(hDev);
+
+ return success;
+
+}
+
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_testapp/osrfx2_DCHU_testapp.Filters b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_testapp/osrfx2_DCHU_testapp.Filters
new file mode 100644
index 00000000..f9efc3e3
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_testapp/osrfx2_DCHU_testapp.Filters
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx;*</Extensions>
+ <UniqueIdentifier>{D5BFAD22-1AD2-44F8-AC33-05C04A9C26D9}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Header Files">
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ <UniqueIdentifier>{14E678C7-EAC3-42F6-9F4B-2CDD17427D73}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Resource Files">
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms;man;xml</Extensions>
+ <UniqueIdentifier>{CEE0A75C-90B6-472A-8FC1-9375F1EAD2C9}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="dump.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="testapp.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="testapp.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_testapp/osrfx2_DCHU_testapp.vcxproj b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_testapp/osrfx2_DCHU_testapp.vcxproj
new file mode 100644
index 00000000..49932df1
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_testapp/osrfx2_DCHU_testapp.vcxproj
@@ -0,0 +1,193 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{6EED5CDD-5526-40DC-97F9-582857E10187}</ProjectGuid>
+ <RootNamespace>$(MSBuildProjectName)</RootNamespace>
+ <Configuration Condition="'$(Configuration)' == ''">Debug</Configuration>
+ <Platform Condition="'$(Platform)' == ''">Win32</Platform>
+ <SampleGuid>{F19E45AF-8B05-4204-A66B-9BDBFE333233}</SampleGuid>
+ <ProjectName>osrfx2_DCHU_testapp</ProjectName>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>False</UseDebugLibraries>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ <DriverType />
+ <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset>
+ <ConfigurationType>Application</ConfigurationType>
+ </PropertyGroup>
+ <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>True</UseDebugLibraries>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ <DriverType />
+ <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset>
+ <ConfigurationType>Application</ConfigurationType>
+ </PropertyGroup>
+ <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>False</UseDebugLibraries>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ <DriverType />
+ <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset>
+ <ConfigurationType>Application</ConfigurationType>
+ </PropertyGroup>
+ <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>True</UseDebugLibraries>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ <DriverType />
+ <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset>
+ <ConfigurationType>Application</ConfigurationType>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <PropertyGroup>
+ <OutDir>$(IntDir)</OutDir>
+ </PropertyGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
+ </ImportGroup>
+ <ItemGroup Label="WrappedTaskItems" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <TargetName>osrusbfx2</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <TargetName>osrusbfx2</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <TargetName>osrusbfx2</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <TargetName>osrusbfx2</TargetName>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <WarningLevel>Level4</WarningLevel>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\inc;..\sys\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);UNICODE;_UNICODE</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ </ClCompile>
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\inc;..\sys\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);UNICODE;_UNICODE</PreprocessorDefinitions>
+ </ResourceCompile>
+ <Midl>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\inc;..\sys\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);UNICODE;_UNICODE</PreprocessorDefinitions>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies);onecore.lib</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <WarningLevel>Level4</WarningLevel>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\inc;..\sys\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);UNICODE;_UNICODE</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ </ClCompile>
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\inc;..\sys\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);UNICODE;_UNICODE</PreprocessorDefinitions>
+ </ResourceCompile>
+ <Midl>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\inc;..\sys\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);UNICODE;_UNICODE</PreprocessorDefinitions>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies);onecore.lib</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <WarningLevel>Level4</WarningLevel>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\inc;..\sys\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);UNICODE;_UNICODE</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ </ClCompile>
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\inc;..\sys\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);UNICODE;_UNICODE</PreprocessorDefinitions>
+ </ResourceCompile>
+ <Midl>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\inc;..\sys\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);UNICODE;_UNICODE</PreprocessorDefinitions>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies);onecore.lib</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <WarningLevel>Level4</WarningLevel>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\inc;..\sys\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);UNICODE;_UNICODE</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ </ClCompile>
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\inc;..\sys\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);UNICODE;_UNICODE</PreprocessorDefinitions>
+ </ResourceCompile>
+ <Midl>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\inc;..\sys\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);UNICODE;_UNICODE</PreprocessorDefinitions>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies);onecore.lib</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="dump.c" />
+ <ClCompile Include="testapp.c" />
+ <ResourceCompile Include="testapp.rc" />
+ </ItemGroup>
+ <ItemGroup>
+ <Inf Exclude="@(Inf)" Include="*.inf" />
+ <FilesToPackage Include="$(TargetPath)" Condition="'$(ConfigurationType)'=='Driver' or '$(ConfigurationType)'=='DynamicLibrary'" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Exclude="@(None)" Include="*.txt;*.htm;*.html" />
+ <None Exclude="@(None)" Include="*.ico;*.cur;*.bmp;*.dlg;*.rct;*.gif;*.jpg;*.jpeg;*.wav;*.jpe;*.tiff;*.tif;*.png;*.rc2" />
+ <None Exclude="@(None)" Include="*.def;*.bat;*.hpj;*.asmx" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Exclude="@(ClInclude)" Include="*.h;*.hpp;*.hxx;*.hm;*.inl;*.xsd" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project> \ No newline at end of file
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_testapp/osrusbfx2.vcxproj b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_testapp/osrusbfx2.vcxproj
new file mode 100644
index 00000000..e1450faf
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_testapp/osrusbfx2.vcxproj
@@ -0,0 +1,194 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{6EED5CDD-5526-40DC-97F9-582857E10187}</ProjectGuid>
+ <RootNamespace>$(MSBuildProjectName)</RootNamespace>
+ <Configuration Condition="'$(Configuration)' == ''">Debug</Configuration>
+ <Platform Condition="'$(Platform)' == ''">Win32</Platform>
+ <SampleGuid>{F19E45AF-8B05-4204-A66B-9BDBFE333233}</SampleGuid>
+ <ProjectName>osrfx2_DCHU_testapp</ProjectName>
+ <WindowsTargetPlatformVersion>$(LatestTargetPlatformVersion)</WindowsTargetPlatformVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>False</UseDebugLibraries>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ <DriverType />
+ <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset>
+ <ConfigurationType>Application</ConfigurationType>
+ </PropertyGroup>
+ <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>True</UseDebugLibraries>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ <DriverType />
+ <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset>
+ <ConfigurationType>Application</ConfigurationType>
+ </PropertyGroup>
+ <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>False</UseDebugLibraries>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ <DriverType />
+ <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset>
+ <ConfigurationType>Application</ConfigurationType>
+ </PropertyGroup>
+ <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>True</UseDebugLibraries>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ <DriverType />
+ <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset>
+ <ConfigurationType>Application</ConfigurationType>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <PropertyGroup>
+ <OutDir>$(IntDir)</OutDir>
+ </PropertyGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
+ </ImportGroup>
+ <ItemGroup Label="WrappedTaskItems" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <TargetName>osrfx2_DCHU_testapp</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <TargetName>osrfx2_DCHU_testapp</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <TargetName>osrfx2_DCHU_testapp</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <TargetName>osrfx2_DCHU_testapp</TargetName>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <WarningLevel>Level4</WarningLevel>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\inc;..\sys\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);UNICODE;_UNICODE</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ </ClCompile>
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\inc;..\sys\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);UNICODE;_UNICODE</PreprocessorDefinitions>
+ </ResourceCompile>
+ <Midl>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\inc;..\sys\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);UNICODE;_UNICODE</PreprocessorDefinitions>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies);onecore.lib</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <WarningLevel>Level4</WarningLevel>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\inc;..\sys\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);UNICODE;_UNICODE</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ </ClCompile>
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\inc;..\sys\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);UNICODE;_UNICODE</PreprocessorDefinitions>
+ </ResourceCompile>
+ <Midl>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\inc;..\sys\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);UNICODE;_UNICODE</PreprocessorDefinitions>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies);onecore.lib</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <WarningLevel>Level4</WarningLevel>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\inc;..\sys\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);UNICODE;_UNICODE</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ </ClCompile>
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\inc;..\sys\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);UNICODE;_UNICODE</PreprocessorDefinitions>
+ </ResourceCompile>
+ <Midl>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\inc;..\sys\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);UNICODE;_UNICODE</PreprocessorDefinitions>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies);onecore.lib</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <WarningLevel>Level4</WarningLevel>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\inc;..\sys\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);UNICODE;_UNICODE</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ </ClCompile>
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\inc;..\sys\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);UNICODE;_UNICODE</PreprocessorDefinitions>
+ </ResourceCompile>
+ <Midl>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\inc;..\sys\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);UNICODE;_UNICODE</PreprocessorDefinitions>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies);onecore.lib</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="dump.c" />
+ <ClCompile Include="testapp.c" />
+ <ResourceCompile Include="testapp.rc" />
+ </ItemGroup>
+ <ItemGroup>
+ <Inf Exclude="@(Inf)" Include="*.inf" />
+ <FilesToPackage Include="$(TargetPath)" Condition="'$(ConfigurationType)'=='Driver' or '$(ConfigurationType)'=='DynamicLibrary'" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Exclude="@(None)" Include="*.txt;*.htm;*.html" />
+ <None Exclude="@(None)" Include="*.ico;*.cur;*.bmp;*.dlg;*.rct;*.gif;*.jpg;*.jpeg;*.wav;*.jpe;*.tiff;*.tif;*.png;*.rc2" />
+ <None Exclude="@(None)" Include="*.def;*.bat;*.hpj;*.asmx" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Exclude="@(ClInclude)" Include="*.h;*.hpp;*.hxx;*.hm;*.inl;*.xsd" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project> \ No newline at end of file
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_testapp/test.cmd b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_testapp/test.cmd
new file mode 100644
index 00000000..30b18b85
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_testapp/test.cmd
@@ -0,0 +1,6 @@
+FOR /L %%i IN (0,1,100000) do (
+
+ osrusbfx2.exe -r 512 -w 512 -c 1000000 -v
+
+)
+
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_testapp/testapp.c b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_testapp/testapp.c
new file mode 100644
index 00000000..455c2bbe
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_testapp/testapp.c
@@ -0,0 +1,1214 @@
+/*++
+
+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:
+
+ testapp.c
+
+Abstract:
+
+ Console test app for Osr Fx2 Learning Kit.
+
+Environment:
+
+ user mode only
+
+--*/
+
+
+#include <DriverSpecs.h>
+_Analysis_mode_(_Analysis_code_type_user_code_)
+
+#include <windows.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+
+#include "devioctl.h"
+#include "strsafe.h"
+
+#pragma warning(disable:4200) //
+#pragma warning(disable:4201) // nameless struct/union
+#pragma warning(disable:4214) // bit field types other than int
+
+#include <cfgmgr32.h>
+#include <basetyps.h>
+#include "usbdi.h"
+#include "public.h"
+
+#pragma warning(default:4200)
+#pragma warning(default:4201)
+#pragma warning(default:4214)
+
+#define WHILE(a) \
+while(__pragma(warning(disable:4127)) a __pragma(warning(disable:4127)))
+
+#define MAX_DEVPATH_LENGTH 256
+#define NUM_ASYNCH_IO 100
+#define BUFFER_SIZE 1024
+#define READER_TYPE 1
+#define WRITER_TYPE 2
+
+BOOL G_fDumpUsbConfig = FALSE; // flags set in response to console command line switches
+BOOL G_fDumpReadData = FALSE;
+BOOL G_fRead = FALSE;
+BOOL G_fWrite = FALSE;
+BOOL G_fPlayWithDevice = FALSE;
+BOOL G_fPerformAsyncIo = FALSE;
+ULONG G_IterationCount = 1; //count of iterations of the test we are to perform
+ULONG G_WriteLen = 512; // #bytes to write
+ULONG G_ReadLen = 512; // #bytes to read
+
+BOOL
+DumpUsbConfig( // defined in dump.c
+ );
+
+typedef enum _INPUT_FUNCTION {
+ LIGHT_ONE_BAR = 1,
+ CLEAR_ONE_BAR,
+ LIGHT_ALL_BARS,
+ CLEAR_ALL_BARS,
+ GET_BAR_GRAPH_LIGHT_STATE,
+ GET_SWITCH_STATE,
+ GET_SWITCH_STATE_AS_INTERRUPT_MESSAGE,
+ GET_7_SEGEMENT_STATE,
+ SET_7_SEGEMENT_STATE,
+ RESET_DEVICE,
+ REENUMERATE_DEVICE,
+} INPUT_FUNCTION;
+
+_Success_(return)
+BOOL
+GetDevicePath(
+ _In_ LPGUID InterfaceGuid,
+ _Out_writes_z_(BufLen) PWCHAR DevicePath,
+ _In_ size_t BufLen
+ )
+{
+ CONFIGRET cr = CR_SUCCESS;
+ PWSTR deviceInterfaceList = NULL;
+ ULONG deviceInterfaceListLength = 0;
+ PWSTR nextInterface;
+ HRESULT hr = E_FAIL;
+ BOOL bRet = TRUE;
+
+ cr = CM_Get_Device_Interface_List_Size(
+ &deviceInterfaceListLength,
+ InterfaceGuid,
+ NULL,
+ CM_GET_DEVICE_INTERFACE_LIST_PRESENT);
+ if (cr != CR_SUCCESS) {
+ printf("Error 0x%x retrieving device interface list size.\n", cr);
+ goto clean0;
+ }
+
+ if (deviceInterfaceListLength <= 1) {
+ bRet = FALSE;
+ printf("Error: No active device interfaces found.\n"
+ " Is the sample driver loaded?");
+ goto clean0;
+ }
+
+ deviceInterfaceList = (PWSTR)malloc(deviceInterfaceListLength * sizeof(WCHAR));
+ if (deviceInterfaceList == NULL) {
+ bRet = FALSE;
+ printf("Error allocating memory for device interface list.\n");
+ goto clean0;
+ }
+ ZeroMemory(deviceInterfaceList, deviceInterfaceListLength * sizeof(WCHAR));
+
+ cr = CM_Get_Device_Interface_List(
+ InterfaceGuid,
+ NULL,
+ deviceInterfaceList,
+ deviceInterfaceListLength,
+ CM_GET_DEVICE_INTERFACE_LIST_PRESENT);
+ if (cr != CR_SUCCESS) {
+ printf("Error 0x%x retrieving device interface list.\n", cr);
+ goto clean0;
+ }
+
+ nextInterface = deviceInterfaceList + wcslen(deviceInterfaceList) + 1;
+ if (*nextInterface != UNICODE_NULL) {
+ printf("Warning: More than one device interface instance found. \n"
+ "Selecting first matching device.\n\n");
+ }
+
+ hr = StringCchCopy(DevicePath, BufLen, deviceInterfaceList);
+ if (FAILED(hr)) {
+ bRet = FALSE;
+ printf("Error: StringCchCopy failed with HRESULT 0x%x", hr);
+ goto clean0;
+ }
+
+clean0:
+ if (deviceInterfaceList != NULL) {
+ free(deviceInterfaceList);
+ }
+ if (CR_SUCCESS != cr) {
+ bRet = FALSE;
+ }
+
+ return bRet;
+}
+
+_Check_return_
+_Ret_notnull_
+_Success_(return != INVALID_HANDLE_VALUE)
+HANDLE
+OpenDevice(
+ _In_ BOOL Synchronous
+ )
+
+/*++
+Routine Description:
+
+ Called by main() to open an instance of our device after obtaining its name
+
+Arguments:
+
+ Synchronous - TRUE, if Device is to be opened for synchronous access.
+ FALSE, otherwise.
+
+Return Value:
+
+ Device handle on success else INVALID_HANDLE_VALUE
+
+--*/
+
+{
+ HANDLE hDev;
+ WCHAR completeDeviceName[MAX_DEVPATH_LENGTH];
+
+ if ( !GetDevicePath(
+ (LPGUID) &GUID_DEVINTERFACE_OSRUSBFX2,
+ completeDeviceName,
+ sizeof(completeDeviceName)/sizeof(completeDeviceName[0])) )
+ {
+ return INVALID_HANDLE_VALUE;
+ }
+
+ printf("DeviceName = (%S)\n", completeDeviceName);
+
+ if(Synchronous) {
+ hDev = CreateFile(completeDeviceName,
+ GENERIC_WRITE | GENERIC_READ,
+ FILE_SHARE_WRITE | FILE_SHARE_READ,
+ NULL, // default security
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL,
+ NULL);
+ } else {
+
+ hDev = CreateFile(completeDeviceName,
+ GENERIC_WRITE | GENERIC_READ,
+ FILE_SHARE_WRITE | FILE_SHARE_READ,
+ NULL, // default security
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
+ NULL);
+ }
+
+ if (hDev == INVALID_HANDLE_VALUE) {
+ printf("Failed to open the device, error - %d", GetLastError());
+ } else {
+ printf("Opened the device successfully.\n");
+ }
+
+ return hDev;
+}
+
+
+
+VOID
+Usage()
+
+/*++
+Routine Description:
+
+ Called by main() to dump usage info to the console when
+ the app is called with no parms or with an invalid parm
+
+Arguments:
+
+ None
+
+Return Value:
+
+ None
+
+--*/
+
+{
+ printf("Usage for osrusbfx2 testapp:\n");
+ printf("-r [n] where n is number of bytes to read\n");
+ printf("-w [n] where n is number of bytes to write\n");
+ printf("-c [n] where n is number of iterations (default = 1)\n");
+ printf("-v verbose -- dumps read data\n");
+ printf("-p to control bar LEDs, seven segment, and dip switch\n");
+ printf("-a to perform asynchronous I/O\n");
+ printf("-u to dump USB configuration and pipe info \n");
+
+ return;
+}
+
+
+void
+Parse(
+ _In_ int argc,
+ _In_reads_(argc) LPSTR *argv
+ )
+
+/*++
+Routine Description:
+
+ Called by main() to parse command line parms
+
+Arguments:
+
+ argc and argv that was passed to main()
+
+Return Value:
+
+ Sets global flags as per user function request
+
+--*/
+
+{
+ int i;
+
+ if ( argc < 2 ) // give usage if invoked with no parms
+ Usage();
+
+ for (i=0; i<argc; i++) {
+ if (argv[i][0] == '-' ||
+ argv[i][0] == '/') {
+ switch(argv[i][1]) {
+ case 'r':
+ case 'R':
+ if (i+1 >= argc) {
+ Usage();
+ exit(1);
+ }
+ else {
+#pragma warning(suppress: 6385)
+ G_ReadLen = atoi(&argv[i+1][0]);
+ G_fRead = TRUE;
+ }
+ i++;
+ break;
+ case 'w':
+ case 'W':
+ if (i+1 >= argc) {
+ Usage();
+ exit(1);
+ }
+ else {
+ G_WriteLen = atoi(&argv[i+1][0]);
+ G_fWrite = TRUE;
+ }
+ i++;
+ break;
+ case 'c':
+ case 'C':
+ if (i+1 >= argc) {
+ Usage();
+ exit(1);
+ }
+ else {
+ G_IterationCount = atoi(&argv[i+1][0]);
+ }
+ i++;
+ break;
+ case 'u':
+ case 'U':
+ G_fDumpUsbConfig = TRUE;
+ break;
+ case 'p':
+ case 'P':
+ G_fPlayWithDevice = TRUE;
+ break;
+ case 'a':
+ case 'A':
+ G_fPerformAsyncIo = TRUE;
+ break;
+ case 'v':
+ case 'V':
+ G_fDumpReadData = TRUE;
+ break;
+ default:
+ Usage();
+ }
+ }
+ }
+}
+
+BOOL
+Compare_Buffs(
+ _In_reads_bytes_(buff1length) char *buff1,
+ _In_ ULONG buff1length,
+ _In_reads_bytes_(buff2length) char *buff2,
+ _In_ ULONG buff2length
+ )
+/*++
+Routine Description:
+
+ Called to verify read and write buffers match for loopback test
+
+Arguments:
+
+ buffers to compare and length
+
+Return Value:
+
+ TRUE if buffers match, else FALSE
+
+--*/
+{
+ int ok = 1;
+
+ if (buff1length != buff2length || memcmp(buff1, buff2, buff1length )) {
+ // Edi, and Esi point to the mismatching char and ecx indicates the
+ // remaining length.
+ ok = 0;
+ }
+
+ return ok;
+}
+
+#define NPERLN 8
+
+VOID
+Dump(
+ UCHAR *b,
+ int len
+)
+
+/*++
+Routine Description:
+
+ Called to do formatted ascii dump to console of the io buffer
+
+Arguments:
+
+ buffer and length
+
+Return Value:
+
+ none
+
+--*/
+
+{
+ ULONG i;
+ ULONG longLen = (ULONG)len / sizeof( ULONG );
+ PULONG pBuf = (PULONG) b;
+
+ // dump an ordinal ULONG for each sizeof(ULONG)'th byte
+ printf("\n****** BEGIN DUMP LEN decimal %d, 0x%x\n", len,len);
+ for (i=0; i<longLen; i++) {
+ printf("%04X ", *pBuf++);
+ if (i % NPERLN == (NPERLN - 1)) {
+ printf("\n");
+ }
+ }
+ if (i % NPERLN != 0) {
+ printf("\n");
+ }
+ printf("\n****** END DUMP LEN decimal %d, 0x%x\n", len,len);
+}
+
+
+BOOL
+PlayWithDevice()
+{
+ HANDLE deviceHandle;
+ DWORD code;
+ ULONG index;
+ INPUT_FUNCTION function;
+ BAR_GRAPH_STATE barGraphState;
+ ULONG bar;
+ SWITCH_STATE switchState;
+ UCHAR sevenSegment = 0;
+ UCHAR i;
+ BOOL result = FALSE;
+
+ deviceHandle = OpenDevice(FALSE);
+
+ if (deviceHandle == INVALID_HANDLE_VALUE) {
+
+ printf("Unable to find any OSR FX2 devices!\n");
+
+ return FALSE;
+
+ }
+
+ //
+ // Infinitely print out the list of choices, ask for input, process
+ // the request
+ //
+ WHILE(TRUE) {
+
+ printf ("\nUSBFX TEST -- Functions:\n\n");
+ printf ("\t1. Light Bar\n");
+ printf ("\t2. Clear Bar\n");
+ printf ("\t3. Light entire Bar graph\n");
+ printf ("\t4. Clear entire Bar graph\n");
+ printf ("\t5. Get bar graph state\n");
+ printf ("\t6. Get Switch state\n");
+ printf ("\t7. Get Switch Interrupt Message\n");
+ printf ("\t8. Get 7 segment state\n");
+ printf ("\t9. Set 7 segment state\n");
+ printf ("\t10. Reset the device\n");
+ printf ("\t11. Reenumerate the device\n");
+ printf ("\n\t0. Exit\n");
+ printf ("\n\tSelection: ");
+
+ if (scanf_s ("%d", &function) <= 0) {
+
+ printf("Error reading input!\n");
+ goto Error;
+
+ }
+
+ switch(function) {
+
+ case LIGHT_ONE_BAR:
+
+ printf("Which Bar (input number 1 thru 8)?\n");
+ if (scanf_s ("%d", &bar) <= 0) {
+
+ printf("Error reading input!\n");
+ goto Error;
+
+ }
+
+ if(bar == 0 || bar > 8){
+ printf("Invalid bar number!\n");
+ goto Error;
+ }
+
+ bar--; // normalize to 0 to 7
+
+ barGraphState.BarsAsUChar = 1 << (UCHAR)bar;
+
+ if (!DeviceIoControl(deviceHandle,
+ IOCTL_OSRUSBFX2_SET_BAR_GRAPH_DISPLAY,
+ &barGraphState, // Ptr to InBuffer
+ sizeof(BAR_GRAPH_STATE), // Length of InBuffer
+ NULL, // Ptr to OutBuffer
+ 0, // Length of OutBuffer
+ &index, // BytesReturned
+ 0)) { // Ptr to Overlapped structure
+
+ code = GetLastError();
+
+ printf("DeviceIoControl failed with error 0x%x\n", code);
+
+ goto Error;
+ }
+
+ break;
+
+ case CLEAR_ONE_BAR:
+
+
+ printf("Which Bar (input number 1 thru 8)?\n");
+ if (scanf_s ("%d", &bar) <= 0) {
+
+ printf("Error reading input!\n");
+ goto Error;
+
+ }
+
+ if(bar == 0 || bar > 8){
+ printf("Invalid bar number!\n");
+ goto Error;
+ }
+
+ bar--;
+
+ //
+ // Read the current state
+ //
+ if (!DeviceIoControl(deviceHandle,
+ IOCTL_OSRUSBFX2_GET_BAR_GRAPH_DISPLAY,
+ NULL, // Ptr to InBuffer
+ 0, // Length of InBuffer
+ &barGraphState, // Ptr to OutBuffer
+ sizeof(BAR_GRAPH_STATE), // Length of OutBuffer
+ &index, // BytesReturned
+ 0)) { // Ptr to Overlapped structure
+
+ code = GetLastError();
+
+ printf("DeviceIoControl failed with error 0x%x\n", code);
+
+ goto Error;
+ }
+
+ if (barGraphState.BarsAsUChar & (1 << bar)) {
+
+ printf("Bar is set...Clearing it\n");
+ barGraphState.BarsAsUChar &= ~(1 << bar);
+
+ if (!DeviceIoControl(deviceHandle,
+ IOCTL_OSRUSBFX2_SET_BAR_GRAPH_DISPLAY,
+ &barGraphState, // Ptr to InBuffer
+ sizeof(BAR_GRAPH_STATE), // Length of InBuffer
+ NULL, // Ptr to OutBuffer
+ 0, // Length of OutBuffer
+ &index, // BytesReturned
+ 0)) { // Ptr to Overlapped structure
+
+ code = GetLastError();
+
+ printf("DeviceIoControl failed with error 0x%x\n", code);
+
+ goto Error;
+
+ }
+
+ } else {
+
+ printf("Bar not set.\n");
+
+ }
+
+ break;
+
+ case LIGHT_ALL_BARS:
+
+ barGraphState.BarsAsUChar = 0xFF;
+
+ if (!DeviceIoControl(deviceHandle,
+ IOCTL_OSRUSBFX2_SET_BAR_GRAPH_DISPLAY,
+ &barGraphState, // Ptr to InBuffer
+ sizeof(BAR_GRAPH_STATE), // Length of InBuffer
+ NULL, // Ptr to OutBuffer
+ 0, // Length of OutBuffer
+ &index, // BytesReturned
+ 0)) { // Ptr to Overlapped structure
+
+ code = GetLastError();
+
+ printf("DeviceIoControl failed with error 0x%x\n", code);
+
+ goto Error;
+ }
+
+ break;
+
+ case CLEAR_ALL_BARS:
+
+ barGraphState.BarsAsUChar = 0;
+
+ if (!DeviceIoControl(deviceHandle,
+ IOCTL_OSRUSBFX2_SET_BAR_GRAPH_DISPLAY,
+ &barGraphState, // Ptr to InBuffer
+ sizeof(BAR_GRAPH_STATE), // Length of InBuffer
+ NULL, // Ptr to OutBuffer
+ 0, // Length of OutBuffer
+ &index, // BytesReturned
+ 0)) { // Ptr to Overlapped structure
+
+ code = GetLastError();
+
+ printf("DeviceIoControl failed with error 0x%x\n", code);
+
+ goto Error;
+ }
+
+ break;
+
+
+ case GET_BAR_GRAPH_LIGHT_STATE:
+
+ barGraphState.BarsAsUChar = 0;
+
+ if (!DeviceIoControl(deviceHandle,
+ IOCTL_OSRUSBFX2_GET_BAR_GRAPH_DISPLAY,
+ NULL, // Ptr to InBuffer
+ 0, // Length of InBuffer
+ &barGraphState, // Ptr to OutBuffer
+ sizeof(BAR_GRAPH_STATE), // Length of OutBuffer
+ &index, // BytesReturned
+ 0)) { // Ptr to Overlapped structure
+
+ code = GetLastError();
+
+ printf("DeviceIoControl failed with error 0x%x\n", code);
+
+ goto Error;
+ }
+
+ printf("Bar Graph: \n");
+ printf(" Bar8 is %s\n", barGraphState.Bar8 ? "ON" : "OFF");
+ printf(" Bar7 is %s\n", barGraphState.Bar7 ? "ON" : "OFF");
+ printf(" Bar6 is %s\n", barGraphState.Bar6 ? "ON" : "OFF");
+ printf(" Bar5 is %s\n", barGraphState.Bar5 ? "ON" : "OFF");
+ printf(" Bar4 is %s\n", barGraphState.Bar4 ? "ON" : "OFF");
+ printf(" Bar3 is %s\n", barGraphState.Bar3 ? "ON" : "OFF");
+ printf(" Bar2 is %s\n", barGraphState.Bar2 ? "ON" : "OFF");
+ printf(" Bar1 is %s\n", barGraphState.Bar1 ? "ON" : "OFF");
+
+ break;
+
+ case GET_SWITCH_STATE:
+
+ switchState.SwitchesAsUChar = 0;
+
+ if (!DeviceIoControl(deviceHandle,
+ IOCTL_OSRUSBFX2_READ_SWITCHES,
+ NULL, // Ptr to InBuffer
+ 0, // Length of InBuffer
+ &switchState, // Ptr to OutBuffer
+ sizeof(SWITCH_STATE), // Length of OutBuffer
+ &index, // BytesReturned
+ 0)) { // Ptr to Overlapped structure
+
+ code = GetLastError();
+
+ printf("DeviceIoControl failed with error 0x%x\n", code);
+
+ goto Error;
+ }
+
+ printf("Switches: \n");
+ printf(" Switch8 is %s\n", switchState.Switch8 ? "ON" : "OFF");
+ printf(" Switch7 is %s\n", switchState.Switch7 ? "ON" : "OFF");
+ printf(" Switch6 is %s\n", switchState.Switch6 ? "ON" : "OFF");
+ printf(" Switch5 is %s\n", switchState.Switch5 ? "ON" : "OFF");
+ printf(" Switch4 is %s\n", switchState.Switch4 ? "ON" : "OFF");
+ printf(" Switch3 is %s\n", switchState.Switch3 ? "ON" : "OFF");
+ printf(" Switch2 is %s\n", switchState.Switch2 ? "ON" : "OFF");
+ printf(" Switch1 is %s\n", switchState.Switch1 ? "ON" : "OFF");
+
+ break;
+
+ case GET_SWITCH_STATE_AS_INTERRUPT_MESSAGE:
+
+ switchState.SwitchesAsUChar = 0;
+
+ if (!DeviceIoControl(deviceHandle,
+ IOCTL_OSRUSBFX2_GET_INTERRUPT_MESSAGE,
+ NULL, // Ptr to InBuffer
+ 0, // Length of InBuffer
+ &switchState, // Ptr to OutBuffer
+ sizeof(switchState), // Length of OutBuffer
+ &index, // BytesReturned
+ 0)) { // Ptr to Overlapped structure
+
+ code = GetLastError();
+
+ printf("DeviceIoControl failed with error 0x%x\n", code);
+
+ goto Error;
+ }
+
+ printf("Switches: %d\n",index);
+ printf(" Switch8 is %s\n", switchState.Switch8 ? "ON" : "OFF");
+ printf(" Switch7 is %s\n", switchState.Switch7 ? "ON" : "OFF");
+ printf(" Switch6 is %s\n", switchState.Switch6 ? "ON" : "OFF");
+ printf(" Switch5 is %s\n", switchState.Switch5 ? "ON" : "OFF");
+ printf(" Switch4 is %s\n", switchState.Switch4 ? "ON" : "OFF");
+ printf(" Switch3 is %s\n", switchState.Switch3 ? "ON" : "OFF");
+ printf(" Switch2 is %s\n", switchState.Switch2 ? "ON" : "OFF");
+ printf(" Switch1 is %s\n", switchState.Switch1 ? "ON" : "OFF");
+
+ break;
+
+ case GET_7_SEGEMENT_STATE:
+
+ sevenSegment = 0;
+
+ if (!DeviceIoControl(deviceHandle,
+ IOCTL_OSRUSBFX2_GET_7_SEGMENT_DISPLAY,
+ NULL, // Ptr to InBuffer
+ 0, // Length of InBuffer
+ &sevenSegment, // Ptr to OutBuffer
+ sizeof(UCHAR), // Length of OutBuffer
+ &index, // BytesReturned
+ 0)) { // Ptr to Overlapped structure
+
+ code = GetLastError();
+
+ printf("DeviceIoControl failed with error 0x%x\n", code);
+
+ goto Error;
+ }
+
+ printf("7 Segment mask: 0x%x\n", sevenSegment);
+ break;
+
+ case SET_7_SEGEMENT_STATE:
+
+ for (i = 0; i < 8; i++) {
+
+ sevenSegment = 1 << i;
+
+ if (!DeviceIoControl(deviceHandle,
+ IOCTL_OSRUSBFX2_SET_7_SEGMENT_DISPLAY,
+ &sevenSegment, // Ptr to InBuffer
+ sizeof(UCHAR), // Length of InBuffer
+ NULL, // Ptr to OutBuffer
+ 0, // Length of OutBuffer
+ &index, // BytesReturned
+ 0)) { // Ptr to Overlapped structure
+
+ code = GetLastError();
+
+ printf("DeviceIoControl failed with error 0x%x\n", code);
+
+ goto Error;
+ }
+
+ printf("This is %d\n", i);
+ Sleep(500);
+
+ }
+
+ printf("7 Segment mask: 0x%x\n", sevenSegment);
+ break;
+
+ case RESET_DEVICE:
+
+ printf("Reset the device\n");
+
+ if (!DeviceIoControl(deviceHandle,
+ IOCTL_OSRUSBFX2_RESET_DEVICE,
+ NULL, // Ptr to InBuffer
+ 0, // Length of InBuffer
+ NULL, // Ptr to OutBuffer
+ 0, // Length of OutBuffer
+ &index, // BytesReturned
+ NULL)) { // Ptr to Overlapped structure
+
+ code = GetLastError();
+
+ printf("DeviceIoControl failed with error 0x%x\n", code);
+
+ goto Error;
+ }
+
+ break;
+
+ case REENUMERATE_DEVICE:
+
+ printf("Re-enumerate the device\n");
+
+ if (!DeviceIoControl(deviceHandle,
+ IOCTL_OSRUSBFX2_REENUMERATE_DEVICE,
+ NULL, // Ptr to InBuffer
+ 0, // Length of InBuffer
+ NULL, // Ptr to OutBuffer
+ 0, // Length of OutBuffer
+ &index, // BytesReturned
+ NULL)) { // Ptr to Overlapped structure
+
+ code = GetLastError();
+
+ printf("DeviceIoControl failed with error 0x%x\n", code);
+
+ goto Error;
+ }
+
+ //
+ // Close the handle to the device and exit out so that
+ // the driver can unload when the device is surprise-removed
+ // and reenumerated.
+ //
+ default:
+
+ result = TRUE;
+ goto Error;
+
+ }
+
+ } // end of while loop
+
+Error:
+
+ CloseHandle(deviceHandle);
+ return result;
+
+}
+
+
+ULONG
+AsyncIo(
+ PVOID ThreadParameter
+ )
+{
+ HANDLE hDevice = INVALID_HANDLE_VALUE;
+ HANDLE hCompletionPort = NULL;
+ OVERLAPPED *pOvList = NULL;
+ PUCHAR buf = NULL;
+ ULONG_PTR i;
+ ULONG ioType = (ULONG)(ULONG_PTR)ThreadParameter;
+ ULONG error;
+
+ hDevice = OpenDevice(FALSE);
+
+ if (hDevice == INVALID_HANDLE_VALUE) {
+ printf("Cannot open device %d\n", GetLastError());
+ goto Error;
+ }
+
+ hCompletionPort = CreateIoCompletionPort(hDevice, NULL, 1, 0);
+
+ if (hCompletionPort == NULL) {
+ printf("Cannot open completion port %d \n",GetLastError());
+ goto Error;
+ }
+
+ pOvList = (OVERLAPPED *)malloc(NUM_ASYNCH_IO * sizeof(OVERLAPPED));
+
+ if (pOvList == NULL) {
+ printf("Cannot allocate overlapped array \n");
+ goto Error;
+ }
+
+ buf = (PUCHAR)malloc(NUM_ASYNCH_IO * BUFFER_SIZE);
+
+ if (buf == NULL) {
+ printf("Cannot allocate buffer \n");
+ goto Error;
+ }
+
+ ZeroMemory(pOvList, NUM_ASYNCH_IO * sizeof(OVERLAPPED));
+ ZeroMemory(buf, NUM_ASYNCH_IO * BUFFER_SIZE);
+
+ //
+ // Issue asynch I/O
+ //
+
+ for (i = 0; i < NUM_ASYNCH_IO; i++) {
+ if (ioType == READER_TYPE) {
+ if ( ReadFile( hDevice,
+ buf + (i* BUFFER_SIZE),
+ BUFFER_SIZE,
+ NULL,
+ &pOvList[i]) == 0) {
+
+ error = GetLastError();
+ if (error != ERROR_IO_PENDING) {
+ printf(" %Iu th read failed %d \n",i, GetLastError());
+ goto Error;
+ }
+ }
+
+ } else {
+ if ( WriteFile( hDevice,
+ buf + (i* BUFFER_SIZE),
+ BUFFER_SIZE,
+ NULL,
+ &pOvList[i]) == 0) {
+ error = GetLastError();
+ if (error != ERROR_IO_PENDING) {
+ printf(" %Iu th write failed %d \n",i, GetLastError());
+ goto Error;
+ }
+ }
+ }
+ }
+
+ //
+ // Wait for the I/Os to complete. If one completes then reissue the I/O
+ //
+
+ WHILE (1) {
+ OVERLAPPED *completedOv;
+ ULONG_PTR key;
+ ULONG numberOfBytesTransferred;
+
+ if ( GetQueuedCompletionStatus(hCompletionPort, &numberOfBytesTransferred,
+ &key, &completedOv, INFINITE) == 0) {
+ printf("GetQueuedCompletionStatus failed %d\n", GetLastError());
+ goto Error;
+ }
+
+ //
+ // Read successfully completed. Issue another one.
+ //
+
+ if (ioType == READER_TYPE) {
+
+ i = completedOv - pOvList;
+
+ printf("Number of bytes read by request number %Iu is %d\n",
+ i, numberOfBytesTransferred);
+
+ if ( ReadFile( hDevice,
+ buf + (i * BUFFER_SIZE),
+ BUFFER_SIZE,
+ NULL,
+ completedOv) == 0) {
+ error = GetLastError();
+ if (error != ERROR_IO_PENDING) {
+ printf("%Iu th Read failed %d \n", i, GetLastError());
+ goto Error;
+ }
+ }
+ } else {
+
+ i = completedOv - pOvList;
+
+ printf("Number of bytes written by request number %Iu is %d\n",
+ i, numberOfBytesTransferred);
+
+ if ( WriteFile( hDevice,
+ buf + (i * BUFFER_SIZE),
+ BUFFER_SIZE,
+ NULL,
+ completedOv) == 0) {
+ error = GetLastError();
+ if (error != ERROR_IO_PENDING) {
+ printf("%Iu th write failed %d \n", i, GetLastError());
+ goto Error;
+ }
+ }
+ }
+ }
+
+Error:
+ if (hDevice != INVALID_HANDLE_VALUE) {
+ CloseHandle(hDevice);
+ }
+
+ if (hCompletionPort) {
+ CloseHandle(hCompletionPort);
+ }
+
+ if (pOvList) {
+ free(pOvList);
+ }
+ if (buf) {
+ free(buf);
+ }
+
+ return 1;
+
+}
+
+
+int
+_cdecl
+main(
+ _In_ int argc,
+ _In_reads_(argc) LPSTR *argv
+ )
+/*++
+Routine Description:
+
+ Entry point to rwbulk.exe
+ Parses cmdline, performs user-requested tests
+
+Arguments:
+
+ argc, argv standard console 'c' app arguments
+
+Return Value:
+
+ Zero
+
+--*/
+
+{
+ char * pinBuf = NULL;
+ char * poutBuf = NULL;
+ ULONG nBytesRead;
+ ULONG nBytesWrite = 0;
+ int ok;
+ int retValue = 0;
+ UINT success;
+ HANDLE hRead = INVALID_HANDLE_VALUE;
+ HANDLE hWrite = INVALID_HANDLE_VALUE;
+ ULONG fail = 0L;
+ ULONG i;
+
+
+ Parse(argc, argv );
+
+ //
+ // dump USB configuation and pipe info
+ //
+ if (G_fDumpUsbConfig) {
+ DumpUsbConfig();
+ }
+
+ if (G_fPlayWithDevice) {
+ PlayWithDevice();
+ goto exit;
+ }
+
+ if (G_fPerformAsyncIo) {
+ HANDLE th1;
+
+ //
+ // Create a reader thread
+ //
+ th1 = CreateThread( NULL, // Default Security Attrib.
+ 0, // Initial Stack Size,
+ AsyncIo, // Thread Func
+ (LPVOID)READER_TYPE,
+ 0, // Creation Flags
+ NULL ); // Don't need the Thread Id.
+
+ if (th1 == NULL) {
+ printf("Couldn't create reader thread - error %d\n", GetLastError());
+ retValue = 1;
+ goto exit;
+ }
+
+ //
+ // Use this thread for peforming write.
+ //
+ AsyncIo((PVOID)WRITER_TYPE);
+
+ goto exit;
+ }
+
+ //
+ // doing a read, write, or both test
+ //
+ if ((G_fRead) || (G_fWrite)) {
+
+ if (G_fRead) {
+ if ( G_fDumpReadData ) { // round size to sizeof ULONG for readable dumping
+ while( G_ReadLen % sizeof( ULONG ) ) {
+ G_ReadLen++;
+ }
+ }
+
+ //
+ // open the output file
+ //
+ hRead = OpenDevice(TRUE);
+ if(hRead == INVALID_HANDLE_VALUE) {
+ retValue = 1;
+ goto exit;
+ }
+
+ pinBuf = malloc(G_ReadLen);
+ }
+
+ if (G_fWrite) {
+ if ( G_fDumpReadData ) { // round size to sizeof ULONG for readable dumping
+ while( G_WriteLen % sizeof( ULONG ) ) {
+ G_WriteLen++;
+ }
+ }
+
+ //
+ // open the output file
+ //
+ hWrite = OpenDevice(TRUE);
+ if(hWrite == INVALID_HANDLE_VALUE) {
+ retValue = 1;
+ goto exit;
+ }
+
+ poutBuf = malloc(G_WriteLen);
+ }
+
+ for (i = 0; i < G_IterationCount; i++) {
+ ULONG j;
+
+ if (G_fWrite && poutBuf && hWrite != INVALID_HANDLE_VALUE) {
+
+ PULONG pOut = (PULONG) poutBuf;
+ ULONG numLongs = G_WriteLen / sizeof( ULONG );
+
+ //
+ // put some data in the output buffer
+ //
+ for (j=0; j<numLongs; j++) {
+ *(pOut+j) = j;
+ }
+
+ //
+ // send the write
+ //
+ success = WriteFile(hWrite, poutBuf, G_WriteLen, &nBytesWrite, NULL);
+ if(success == 0) {
+ printf("WriteFile failed - error %d\n", GetLastError());
+ retValue = 1;
+ goto exit;
+ }
+ printf("Write (%04.4u) : request %06.6u bytes -- %06.6u bytes written\n",
+ i, G_WriteLen, nBytesWrite);
+
+ assert(nBytesWrite == G_WriteLen);
+ }
+
+ if (G_fRead && pinBuf) {
+
+ success = ReadFile(hRead, pinBuf, G_ReadLen, &nBytesRead, NULL);
+ if(success == 0) {
+ printf("ReadFile failed - error %d\n", GetLastError());
+ retValue = 1;
+ goto exit;
+ }
+
+ printf("Read (%04.4u) : request %06.6u bytes -- %06.6u bytes read\n",
+ i, G_ReadLen, nBytesRead);
+
+ if (G_fWrite && poutBuf) {
+
+ //
+ // validate the input buffer against what
+ // we sent to the 82930 (loopback test)
+ //
+ ok = Compare_Buffs(pinBuf, nBytesRead, poutBuf, nBytesWrite);
+
+ if( G_fDumpReadData ) {
+ printf("Dumping read buffer\n");
+ Dump( (PUCHAR) pinBuf, nBytesRead );
+ printf("Dumping write buffer\n");
+ Dump( (PUCHAR) poutBuf, nBytesRead );
+ }
+ assert(ok);
+
+ if(ok != 1) {
+ fail++;
+ }
+
+ assert(G_ReadLen == G_WriteLen);
+ assert(nBytesRead == G_ReadLen);
+ }
+ }
+ }
+
+ }
+
+exit:
+
+ if (pinBuf) {
+ free(pinBuf);
+ }
+
+ if (poutBuf) {
+ free(poutBuf);
+ }
+
+ // close devices if needed
+ if (hRead != INVALID_HANDLE_VALUE) {
+ CloseHandle(hRead);
+ }
+
+ if (hWrite != INVALID_HANDLE_VALUE) {
+ _Analysis_assume_(hWrite != NULL);
+ CloseHandle(hWrite);
+ }
+
+ return retValue;
+}
+
+
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_testapp/testapp.rc b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_testapp/testapp.rc
new file mode 100644
index 00000000..3947204a
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_testapp/testapp.rc
@@ -0,0 +1,12 @@
+#include <windows.h>
+
+#include <ntverp.h>
+
+#define VER_FILETYPE VFT_DLL
+#define VER_FILESUBTYPE VFT2_UNKNOWN
+#define VER_FILEDESCRIPTION_STR "OSRUSBFX2 Bulk & Isoch Read and Write test App"
+#define VER_INTERNALNAME_STR "osrusbfx2.exe"
+#define VER_ORIGINALFILENAME_STR "osrusbfx2.exe"
+
+#include <common.ver>
+
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/CppWindowsService.cpp b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/CppWindowsService.cpp
new file mode 100644
index 00000000..98a3975c
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/CppWindowsService.cpp
@@ -0,0 +1,74 @@
+/*++
+
+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:
+
+ CppWindowsService.cpp
+
+Abstract:
+
+ The file defines the entry point of the application. According to the
+ arguments in the command line, the function installs or uninstalls or
+ starts the service by calling into different routines.
+
+Environment:
+
+ User mode
+
+--*/
+
+#pragma region Includes
+#include <stdio.h>
+#include <windows.h>
+#include "ServiceBase.h"
+#include "SampleService.h"
+#pragma endregion
+
+//
+// Settings of the service
+//
+
+//
+// Internal name of the service
+//
+#define SERVICE_NAME L"OsrUsbFx2UmUserSvc"
+
+
+/*++
+
+Routine Description:
+
+ Entry point for the service.
+
+Arguments:
+
+ Argc - The number of command line arguments
+
+ Argv - The array of command line arguments
+
+Return Value:
+
+ VOID
+
+--*/
+INT
+wmain(
+ INT Argc,
+ WCHAR *Argv[]
+ )
+{
+ CSampleService service(SERVICE_NAME);
+
+ if (!CServiceBase::Run(service))
+ {
+ wprintf(L"Service failed to run w/err 0x%08lx\n", GetLastError());
+ }
+
+ return 0;
+} \ No newline at end of file
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/Main.cpp b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/Main.cpp
new file mode 100644
index 00000000..157a6cb9
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/Main.cpp
@@ -0,0 +1,320 @@
+/*++
+
+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:
+
+ Main.cpp
+
+Abstract:
+
+ Implements the functions to control the OSR USB FX2 device.
+
+Environment:
+
+ User mode
+
+--*/
+
+#include "Main.h"
+#include "Utils.h"
+
+INT CurrentBar;
+BAR_GRAPH_STATE BarGraphState;
+
+/*++
+
+Routine Description:
+
+ Sets the variables in this service to their default values.
+
+Arguments:
+
+ VOID
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+SetVariables()
+{
+ CurrentBar = 0;
+}
+
+
+/*++
+
+Routine Description:
+
+ Retrieves the device path of a given interface.
+
+Arguments:
+
+ InterfaceGuid - The GUID of the interface to search for
+
+ DevicePath - The resulting device path
+
+ DevicePathLength - The length of DevicePath
+
+Return Value:
+
+ TRUE if the function succeeded and FALSE otherwise. Errors
+ are logged in the Application event log.
+
+--*/
+_Success_(return)
+BOOL
+GetDevicePath(
+ _In_ LPGUID InterfaceGuid,
+ _Out_writes_z_(DevicePathLength) PWCHAR DevicePath,
+ _In_ size_t DevicePathLength
+ )
+{
+ HRESULT hr = E_FAIL;
+ BOOL Return = FALSE;
+ CONFIGRET Status = CR_SUCCESS;
+ PWSTR DeviceInterfaceList = NULL;
+ ULONG DeviceInterfaceListLength = 0;
+ PWSTR NextInterface;
+
+ Status = CM_Get_Device_Interface_List_Size(&DeviceInterfaceListLength,
+ InterfaceGuid,
+ NULL,
+ CM_GET_DEVICE_INTERFACE_LIST_PRESENT);
+
+ if (Status != CR_SUCCESS)
+ {
+ WriteToErrorLog(L"CM_Get_DeviceInterface_List_Size",
+ CM_MapCrToWin32Err(Status, ERROR_FILE_NOT_FOUND));
+ goto clean0;
+ }
+
+ if (DeviceInterfaceListLength < 1)
+ {
+ WriteToErrorLog(L"CM_Get_DeviceInterface_List_Size",
+ CM_MapCrToWin32Err(Status, ERROR_EMPTY));
+ goto clean0;
+ }
+
+ DeviceInterfaceList = (PWSTR)malloc(DeviceInterfaceListLength * sizeof(WCHAR));
+
+ if (DeviceInterfaceList == NULL)
+ {
+ WriteToEventLog(L"Failed to allocate memory for the device interface list",
+ TRACE_LEVEL_ERROR);
+ goto clean0;
+ }
+
+ ZeroMemory(DeviceInterfaceList, DeviceInterfaceListLength * sizeof(WCHAR));
+
+ Status = CM_Get_Device_Interface_List(InterfaceGuid,
+ NULL,
+ DeviceInterfaceList,
+ DeviceInterfaceListLength,
+ CM_GET_DEVICE_INTERFACE_LIST_PRESENT);
+
+ if (Status != CR_SUCCESS)
+ {
+ WriteToErrorLog(L"CM_Get_Device_Interface_List",
+ CM_MapCrToWin32Err(Status, ERROR_FILE_NOT_FOUND));
+ goto clean0;
+ }
+
+ if (*DeviceInterfaceList == UNICODE_NULL)
+ {
+ WriteToEventLog(L"CM_Get_Device_Interface_List returned an empty list",
+ TRACE_LEVEL_ERROR);
+ }
+
+ NextInterface = DeviceInterfaceList + wcslen(DeviceInterfaceList) + 1;
+
+ if (*NextInterface != UNICODE_NULL)
+ {
+ WriteToEventLog(L"More than one device interface instance found. "
+ "Selecting first matching device.",
+ TRACE_LEVEL_WARNING);
+ }
+
+ hr = StringCchCopy(DevicePath, DevicePathLength, DeviceInterfaceList);
+
+ if (FAILED(hr))
+ {
+ WriteToErrorLog(L"StringCchCopy", HRESULT_CODE(hr));
+ goto clean0;
+ }
+
+clean0:
+
+ if (DeviceInterfaceList != NULL)
+ {
+ free(DeviceInterfaceList);
+ }
+
+ if (Status == CR_SUCCESS)
+ {
+ Return = TRUE;
+ }
+
+ return Return;
+}
+
+
+/*++
+
+Routine Description:
+
+ Opens up the OSR USB FX2 device handle.
+
+Arguments:
+
+ Synchronous - Whether or not this device should be
+ opened for synchronous access
+
+Return Value:
+
+ The handle to the OSR USB FX2 device.
+
+--*/
+_Check_return_
+_Ret_notnull_
+_Success_(return != INVALID_HANDLE_VALUE)
+HANDLE
+OpenDevice(
+ _In_ BOOL Synchronous
+ )
+{
+ HANDLE DeviceHandle;
+ WCHAR DeviceName[MAX_DEVPATH_LENGTH];
+
+ if (!GetDevicePath((LPGUID)&GUID_DEVINTERFACE_OSRUSBFX2,
+ DeviceName,
+ sizeof(DeviceName) / sizeof(DeviceName[0])))
+ {
+ return INVALID_HANDLE_VALUE;
+ }
+
+ if (Synchronous)
+ {
+ DeviceHandle = CreateFile(DeviceName,
+ GENERIC_WRITE | GENERIC_READ,
+ FILE_SHARE_WRITE | FILE_SHARE_READ,
+ NULL, // default security
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL,
+ NULL);
+ }
+ else
+ {
+ DeviceHandle = CreateFile(DeviceName,
+ GENERIC_WRITE | GENERIC_READ,
+ FILE_SHARE_WRITE | FILE_SHARE_READ,
+ NULL, // default security
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
+ NULL);
+ }
+
+ if (DeviceHandle == INVALID_HANDLE_VALUE)
+ {
+ WriteToErrorLog(L"CreateFile", GetLastError());
+ }
+ else
+ {
+ WriteToEventLog(L"Opened Device Successfully", TRACE_LEVEL_INFORMATION);
+ }
+
+ return DeviceHandle;
+}
+
+
+/*++
+
+Routine Description:
+
+ Turns off all of the bar graph lights on the OSR USB FX2 device.
+
+Arguments:
+
+ DeviceHandle - The handle to the OSR USB FX2 device
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+ClearAllBars(
+ _In_ HANDLE DeviceHandle
+ )
+{
+ ULONG BytesReturned;
+
+ BarGraphState.BarsAsUChar = 0;
+
+ if (!DeviceIoControl(DeviceHandle,
+ IOCTL_OSRUSBFX2_SET_BAR_GRAPH_DISPLAY,
+ &BarGraphState, // Pointer to InBuffer
+ sizeof(BAR_GRAPH_STATE), // Length of InBuffer
+ NULL, // Pointer to OutBuffer
+ 0, // Length of OutBuffer
+ &BytesReturned, // BytesReturned
+ 0)) // Pointer to Overlapped structure
+ {
+ WriteToErrorLog(L"DeviceIOControl", GetLastError());
+ }
+}
+
+
+/*++
+
+Routine Description:
+
+ Lights the next bar on the OSR USB FX2 device.
+
+Arguments:
+
+ DeviceHandle - The handle to the OSR USB FX2 device
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+LightNextBar(
+ _In_ HANDLE DeviceHandle
+ )
+{
+ ULONG BytesReturned;
+
+ //
+ // Normalize to 0-7
+ //
+ CurrentBar += 1;
+
+ if (CurrentBar > 7)
+ {
+ CurrentBar = 0;
+ }
+
+ BarGraphState.BarsAsUChar = 1 << (UCHAR)CurrentBar;
+
+ if (!DeviceIoControl(DeviceHandle,
+ IOCTL_OSRUSBFX2_SET_BAR_GRAPH_DISPLAY,
+ &BarGraphState, // Pointer to InBuffer
+ sizeof(BAR_GRAPH_STATE), // Length of InBuffer
+ NULL, // Pointer to OutBuffer
+ 0, // Length of OutBuffer
+ &BytesReturned, // BytesReturned
+ 0)) // Pointer to Overlapped structure
+ {
+ WriteToErrorLog(L"DeviceIOControl", GetLastError());
+ }
+} \ No newline at end of file
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/Main.h b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/Main.h
new file mode 100644
index 00000000..dcbd950e
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/Main.h
@@ -0,0 +1,261 @@
+/*++
+
+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:
+
+ Main.h
+
+Abstract:
+
+ Implements the functions to control the OSR USB FX2 device.
+
+Environment:
+
+ User mode
+
+--*/
+
+#pragma once
+
+#include <Windows.h>
+#include <devioctl.h>
+#include <cfgmgr32.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <strsafe.h>
+#include <driverspecs.h>
+#include <basetyps.h>
+
+#include <initguid.h>
+
+// {573E8C73-0CB4-4471-A1BF-FAB26C31D384}
+DEFINE_GUID(GUID_DEVINTERFACE_OSRUSBFX2,
+ 0x573e8c73, 0xcb4, 0x4471, 0xa1, 0xbf, 0xfa, 0xb2, 0x6c, 0x31, 0xd3, 0x84);
+
+//
+// Most device interface paths will fit into a buffer of this size.
+// However, some could be longer, and a larger buffer or dynamically
+// allocated buffer may be needed for robust code.
+//
+#define MAX_DEVPATH_LENGTH 1024
+
+#pragma warning(push)
+#pragma warning(disable:4201) // nameless struct/union
+#pragma warning(disable:4214) // bit field types other than int
+
+//
+// Define the structures that will be used by the IOCTL
+// interface to the driver
+//
+
+//
+// BAR_GRAPH_STATE
+//
+// BAR_GRAPH_STATE is a bit field structure with each
+// bit corresponding to one of the bar graph on the
+// OSRFX2 Development Board
+//
+#include <pshpack1.h>
+typedef struct _BAR_GRAPH_STATE {
+
+ union {
+
+ struct {
+ //
+ // Individual bars starting from the
+ // top of the stack of bars
+ //
+ // NOTE: There are actually 10 bars,
+ // but the very top two do not light
+ // and are not counted here
+ //
+ UCHAR Bar1 : 1;
+ UCHAR Bar2 : 1;
+ UCHAR Bar3 : 1;
+ UCHAR Bar4 : 1;
+ UCHAR Bar5 : 1;
+ UCHAR Bar6 : 1;
+ UCHAR Bar7 : 1;
+ UCHAR Bar8 : 1;
+ };
+
+ //
+ // The state of all the bar graph as a single
+ // UCHAR
+ //
+ UCHAR BarsAsUChar;
+
+ };
+
+}BAR_GRAPH_STATE, *PBAR_GRAPH_STATE;
+
+//
+// SWITCH_STATE
+//
+// SWITCH_STATE is a bit field structure with each
+// bit corresponding to one of the switches on the
+// OSRFX2 Development Board
+//
+typedef struct _SWITCH_STATE {
+
+ union {
+ struct {
+ //
+ // Individual switches starting from the
+ // left of the set of switches
+ //
+ UCHAR Switch1 : 1;
+ UCHAR Switch2 : 1;
+ UCHAR Switch3 : 1;
+ UCHAR Switch4 : 1;
+ UCHAR Switch5 : 1;
+ UCHAR Switch6 : 1;
+ UCHAR Switch7 : 1;
+ UCHAR Switch8 : 1;
+ };
+
+ //
+ // The state of all the switches as a single
+ // UCHAR
+ //
+ UCHAR SwitchesAsUChar;
+
+ };
+
+
+}SWITCH_STATE, *PSWITCH_STATE;
+
+#include <poppack.h>
+
+#pragma warning(pop)
+
+#define IOCTL_INDEX 0x800
+#define FILE_DEVICE_OSRUSBFX2 65500U
+
+#define IOCTL_OSRUSBFX2_GET_CONFIG_DESCRIPTOR CTL_CODE(FILE_DEVICE_OSRUSBFX2, \
+ IOCTL_INDEX, \
+ METHOD_BUFFERED, \
+ FILE_READ_ACCESS)
+
+#define IOCTL_OSRUSBFX2_RESET_DEVICE CTL_CODE(FILE_DEVICE_OSRUSBFX2, \
+ IOCTL_INDEX + 1, \
+ METHOD_BUFFERED, \
+ FILE_WRITE_ACCESS)
+
+#define IOCTL_OSRUSBFX2_REENUMERATE_DEVICE CTL_CODE(FILE_DEVICE_OSRUSBFX2, \
+ IOCTL_INDEX + 3, \
+ METHOD_BUFFERED, \
+ FILE_WRITE_ACCESS)
+
+#define IOCTL_OSRUSBFX2_GET_BAR_GRAPH_DISPLAY CTL_CODE(FILE_DEVICE_OSRUSBFX2, \
+ IOCTL_INDEX + 4, \
+ METHOD_BUFFERED, \
+ FILE_READ_ACCESS)
+
+
+#define IOCTL_OSRUSBFX2_SET_BAR_GRAPH_DISPLAY CTL_CODE(FILE_DEVICE_OSRUSBFX2, \
+ IOCTL_INDEX + 5, \
+ METHOD_BUFFERED, \
+ FILE_WRITE_ACCESS)
+
+
+#define IOCTL_OSRUSBFX2_READ_SWITCHES CTL_CODE(FILE_DEVICE_OSRUSBFX2, \
+ IOCTL_INDEX + 6, \
+ METHOD_BUFFERED, \
+ FILE_READ_ACCESS)
+
+
+#define IOCTL_OSRUSBFX2_GET_7_SEGMENT_DISPLAY CTL_CODE(FILE_DEVICE_OSRUSBFX2, \
+ IOCTL_INDEX + 7, \
+ METHOD_BUFFERED, \
+ FILE_READ_ACCESS)
+
+
+#define IOCTL_OSRUSBFX2_SET_7_SEGMENT_DISPLAY CTL_CODE(FILE_DEVICE_OSRUSBFX2, \
+ IOCTL_INDEX + 8, \
+ METHOD_BUFFERED, \
+ FILE_WRITE_ACCESS)
+
+#define IOCTL_OSRUSBFX2_GET_INTERRUPT_MESSAGE CTL_CODE(FILE_DEVICE_OSRUSBFX2,\
+ IOCTL_INDEX + 9, \
+ METHOD_OUT_DIRECT, \
+ FILE_READ_ACCESS)
+
+/*++
+
+Routine Description:
+
+ Sets the variables in this service to their default values.
+
+Arguments:
+
+ VOID
+
+Return Value:
+
+ VOID
+
+--*/
+VOID SetVariables();
+
+
+/*++
+
+Routine Description:
+
+ Opens up the OSR USB FX2 device handle.
+
+Arguments:
+
+ Synchronous - Whether or not this device should be
+ opened for synchronous access
+
+Return Value:
+
+ The handle to the OSR USB FX2 device.
+
+--*/
+HANDLE OpenDevice(_In_ BOOL Synchronous);
+
+
+/*++
+
+Routine Description:
+
+ Turns off all of the bar graph lights on the OSR USB FX2 device.
+
+Arguments:
+
+ DeviceHandle - The handle to the OSR USB FX2 device.
+
+Return Value:
+
+ VOID
+
+--*/
+VOID ClearAllBars(HANDLE deviceHandle);
+
+
+/*++
+
+Routine Description:
+
+ Lights the next bar on the OSR USB FX2 device.
+
+Arguments:
+
+ DeviceHandle - The handle to the OSR USB FX2 device.
+
+Return Value:
+
+VOID
+
+--*/
+VOID LightNextBar(HANDLE deviceHandle); \ No newline at end of file
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/SampleService.cpp b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/SampleService.cpp
new file mode 100644
index 00000000..c39e4838
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/SampleService.cpp
@@ -0,0 +1,254 @@
+/*++
+
+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:
+
+ SampleService.cpp
+
+Abstract:
+
+ Provides a sample service class that derives from the service base class -
+ CServiceBase. The sample service logs the service start and stop
+ information to the Application event log, and shows how to run the main
+ function of the service in a thread pool worker thread.
+
+Environment:
+
+ User mode
+
+--*/
+
+#pragma region Includes
+#include "SampleService.h"
+#include "ThreadPool.h"
+#pragma endregion
+
+HANDLE DeviceHandle;
+
+/*++
+
+Routine Description:
+
+ The constructor of CSampleService. It initializes a new instance
+ of the CSampleService class. The optional parameters (CanStop,
+ CanShutdown and CanPauseContinue) allow you to specify whether the
+ service can be stopped, paused and continued, or be notified when system
+ shutdown occurs. Inherits properties from the class CServiceBase.
+
+Arguments:
+
+ ServiceName - The name of the service
+
+ CanStop - The service can be stopped
+
+ CanShutdown - The service is notified when system shutdown occurs
+
+ CanPauseContinue - The service can be paused and continued
+
+Return Value:
+
+ VOID
+
+--*/
+CSampleService::CSampleService(
+ PWSTR ServiceName,
+ BOOL CanStop,
+ BOOL CanShutdown,
+ BOOL CanPauseContinue
+ )
+: CServiceBase(ServiceName, CanStop, CanShutdown, CanPauseContinue)
+{
+ m_fStopping = FALSE;
+
+ //
+ // Create a manual-reset event that is not signaled at first to indicate
+ // the stopped signal of the service.
+ //
+ m_hStoppedEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+
+ if (m_hStoppedEvent == NULL)
+ {
+ throw GetLastError();
+ }
+}
+
+
+/*++
+
+Routine Description:
+
+ The virtual destructor of CSampleService.
+
+Arguments:
+
+ VOID
+
+Return Value:
+
+ VOID
+
+--*/
+CSampleService::~CSampleService()
+{
+ if (m_hStoppedEvent)
+ {
+ CloseHandle(m_hStoppedEvent);
+ m_hStoppedEvent = NULL;
+ }
+}
+
+
+/*++
+
+Routine Description:
+
+ This function is executed when a Start command is sent to the
+ service by the SCM or when the operating system starts (for a service
+ that starts automatically). It specifies actions to take when the
+ service starts. In this code sample, OnStart logs a service-start
+ message to the Application log, and queues the main service function for
+ execution in a thread pool worker thread.
+
+ NOTE: A service application is designed to be long running. Therefore,
+ it usually polls or monitors something in the system. The monitoring is
+ set up in the OnStart method. However, OnStart does not actually do the
+ monitoring. The OnStart method must return to the operating system after
+ the service's operation has begun. It must not loop forever or block. To
+ set up a simple monitoring mechanism, one general solution is to create
+ a timer in OnStart. The timer would then raise events in your code
+ periodically, at which time your service could do its monitoring. The
+ other solution is to spawn a new thread to perform the main service
+ functions, which is demonstrated in this code sample.
+
+Arguments:
+
+ Argc - The number of command line arguments
+
+ Argv - The array of command line arguments
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+CSampleService::OnStart(
+ DWORD Argc,
+ PWSTR *Argv
+ )
+{
+ //
+ // Log a service start message to the Application log.
+ //
+ WriteToEventLog(L"SampleService in OnStart",
+ EVENTLOG_INFORMATION_TYPE);
+
+ //
+ // Set variables in the base class
+ //
+
+ //
+ // Open the device
+ //
+ DeviceHandle = OpenDevice(FALSE);
+
+ if (DeviceHandle == INVALID_HANDLE_VALUE)
+ {
+ return;
+ }
+
+ //
+ // Queue the main service function for execution in a worker thread.
+ //
+ CThreadPool::QueueUserWorkItem(&CSampleService::ServiceWorkerThread, this);
+}
+
+
+/*++
+
+Routine Description:
+
+ This method performs the main function of the service. It runs
+ on a thread pool worker thread.
+
+Arguments:
+
+ VOID
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+CSampleService::ServiceWorkerThread()
+{
+ //
+ // Periodically check if the service is stopping.
+ //
+ while (!m_fStopping)
+ {
+ //
+ // Perform main service function here...
+ //
+
+ ClearAllBars(DeviceHandle);
+ LightNextBar(DeviceHandle);
+
+ ::Sleep(2000); // Simulate some lengthy operations.
+ }
+
+ //
+ // Signal the stopped event.
+ //
+ SetEvent(m_hStoppedEvent);
+}
+
+
+/*++
+
+Routine Description:
+
+ This function is executed when a Stop command is sent to the service by SCM.
+ It specifies actions to take when a service stops running. In this code
+ sample, OnStop logs a service-stop message to the Application log, and
+ waits for the finish of the main service function.
+
+ Be sure to periodically call ReportServiceStatus() with
+ SERVICE_STOP_PENDING if the procedure is going to take a long time.
+
+Arguments:
+
+ VOID
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+CSampleService::OnStop()
+{
+ //
+ // Log a service stop message to the Application log.
+ //
+ WriteToEventLog(L"SampleService in OnStop",
+ EVENTLOG_INFORMATION_TYPE);
+
+ //
+ // Indicate that the service is stopping and wait for the finish of the
+ // main service function (ServiceWorkerThread).
+ //
+ m_fStopping = TRUE;
+
+ if (WaitForSingleObject(m_hStoppedEvent, INFINITE) != WAIT_OBJECT_0)
+ {
+ throw GetLastError();
+ }
+} \ No newline at end of file
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/SampleService.h b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/SampleService.h
new file mode 100644
index 00000000..eee8a609
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/SampleService.h
@@ -0,0 +1,174 @@
+/*++
+
+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:
+
+ SampleService.h
+
+Abstract:
+
+ Provides a sample service class that derives from the service base class -
+ CServiceBase. The sample service logs the service start and stop
+ information to the Application event log, and shows how to run the main
+ function of the service in a thread pool worker thread.
+
+Environment:
+
+ User mode
+
+--*/
+
+#pragma once
+
+#include "ServiceBase.h"
+#include "Main.h"
+
+class CSampleService : public CServiceBase
+{
+public:
+
+ /*++
+
+ Routine Description:
+
+ The constructor of CSampleService. It initializes a new instance
+ of the CSampleService class. The optional parameters (CanStop,
+ CanShutdown and CanPauseContinue) allow you to specify whether the
+ service can be stopped, paused and continued, or be notified when system
+ shutdown occurs. Inherits properties from the class CServiceBase.
+
+ Arguments:
+
+ ServiceName - The name of the service
+
+ CanStop - The service can be stopped
+
+ CanShutdown - The service is notified when system shutdown occurs
+
+ CanPauseContinue - The service can be paused and continued
+
+ Return Value:
+
+ VOID
+
+ --*/
+ CSampleService(PWSTR ServiceName,
+ BOOL CanStop = TRUE,
+ BOOL CanShutdown = TRUE,
+ BOOL CanPauseContinue = FALSE);
+
+ /*++
+
+ Routine Description:
+
+ The virtual destructor of CSampleService.
+
+ Arguments:
+
+ VOID
+
+ Return Value:
+
+ VOID
+
+ --*/
+ virtual ~CSampleService();
+
+protected:
+
+ /*++
+
+ Routine Description:
+
+ This function is executed when a Start command is sent to the
+ service by the SCM or when the operating system starts (for a service
+ that starts automatically). It specifies actions to take when the
+ service starts. In this code sample, OnStart logs a service-start
+ message to the Application log, and queues the main service function for
+ execution in a thread pool worker thread.
+
+ NOTE: A service application is designed to be long running. Therefore,
+ it usually polls or monitors something in the system. The monitoring is
+ set up in the OnStart method. However, OnStart does not actually do the
+ monitoring. The OnStart method must return to the operating system after
+ the service's operation has begun. It must not loop forever or block. To
+ set up a simple monitoring mechanism, one general solution is to create
+ a timer in OnStart. The timer would then raise events in your code
+ periodically, at which time your service could do its monitoring. The
+ other solution is to spawn a new thread to perform the main service
+ functions, which is demonstrated in this code sample.
+
+ Arguments:
+
+ Argc - The number of command line arguments
+
+ Argv - The array of command line arguments
+
+ Return Value:
+
+ VOID
+
+ --*/
+ virtual VOID OnStart(DWORD Argc, PWSTR *Argv);
+
+
+ /*++
+
+ Routine Description:
+
+ This function is executed when a Stop command is sent to the service by SCM.
+ It specifies actions to take when a service stops running. In this code
+ sample, OnStop logs a service-stop message to the Application log, and
+ waits for the finish of the main service function.
+
+ Be sure to periodically call ReportServiceStatus() with
+ SERVICE_STOP_PENDING if the procedure is going to take a long time.
+
+ Arguments:
+
+ VOID
+
+ Return Value:
+
+ VOID
+
+ --*/
+ virtual VOID OnStop();
+
+
+ /*++
+
+ Routine Description:
+
+ This method performs the main function of the service. It runs
+ on a thread pool worker thread.
+
+ Arguments:
+
+ VOID
+
+ Return Value:
+
+ VOID
+
+ --*/
+ VOID ServiceWorkerThread();
+
+private:
+
+ //
+ // Determines if the service is currently stopping.
+ //
+ BOOL m_fStopping;
+
+ //
+ // The handle to wait for a stop event.
+ //
+ HANDLE m_hStoppedEvent;
+}; \ No newline at end of file
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/ServiceBase.cpp b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/ServiceBase.cpp
new file mode 100644
index 00000000..4c20af2e
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/ServiceBase.cpp
@@ -0,0 +1,794 @@
+/*++
+
+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:
+
+ ServiceBase.cpp
+
+Abstract:
+
+ Provides a base class for a service that will exist as part of a service
+ application. CServiceBase must be derived from when creating a new service
+ class.
+
+Environment:
+
+ User mode
+
+--*/
+
+#pragma region Includes
+#include "ServiceBase.h"
+#include "Main.h"
+#include "Utils.h"
+#include <assert.h>
+#include <strsafe.h>
+#pragma endregion
+
+
+#pragma region Static Members
+
+//
+// Initialize the singleton service instance.
+//
+CServiceBase *CServiceBase::s_service = NULL;
+
+
+/*++
+
+Routine Description:
+
+ Register the executable for a service with the Service Control
+ Manager (SCM). After you call Run(ServiceBase), the SCM issues a Start
+ command, which results in a call to the OnStart method in the service.
+ This method blocks until the service has stopped.
+
+Arguments:
+
+ Service - The reference to a CServiceBase object. It will become the
+ singleton service instance of this service application.
+
+Return Value:
+
+ If the function succeeds, the return value is TRUE. If the function
+ fails, the return value is FALSE. To get extended error information,
+ call GetLastError.
+
+--*/
+BOOL
+CServiceBase::Run(
+ CServiceBase &Service
+ )
+{
+ s_service = &Service;
+
+ SERVICE_TABLE_ENTRY serviceTable[] =
+ {
+ { Service.m_name, ServiceMain },
+ { NULL, NULL }
+ };
+
+ //
+ // Connects the main thread of a service process to the service control
+ // manager, which causes the thread to be the service control dispatcher
+ // thread for the calling process. This call returns when the service has
+ // stopped. The process should simply terminate when the call returns.
+ //
+ return StartServiceCtrlDispatcher(serviceTable);
+}
+
+
+/*++
+
+Routine Description:
+
+ The entry point for the service. It registers the handler function
+ for the service and starts the service.
+
+Arguments:
+
+ Argc - The number of command line arguments
+
+ Argv - The array of command line arguments
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+WINAPI
+CServiceBase::ServiceMain(
+ DWORD Argc,
+ PWSTR *Argv
+ )
+{
+ assert(s_service != NULL);
+
+ //
+ // Register the handler function for the service.
+ //
+ s_service->m_statusHandle = RegisterServiceCtrlHandler(s_service->m_name,
+ ServiceCtrlHandler);
+
+ if (s_service->m_statusHandle == NULL)
+ {
+ throw GetLastError();
+ }
+
+ //
+ // Start the service.
+ //
+ s_service->Start(Argc, Argv);
+}
+
+
+/*++
+
+Routine Description:
+
+ Called by the SCM whenever a control code is sent to the service.
+
+Arguments:
+
+ CtrlCode - The control code. This parameter can be one of
+ the following values:
+
+ SERVICE_CONTROL_CONTINUE
+ SERVICE_CONTROL_INTERROGATE
+ SERVICE_CONTROL_NETBINDADD
+ SERVICE_CONTROL_NETBINDDISABLE
+ SERVICE_CONTROL_NETBINDREMOVE
+ SERVICE_CONTROL_PARAMCHANGE
+ SERVICE_CONTROL_PAUSE
+ SERVICE_CONTROL_SHUTDOWN
+ SERVICE_CONTROL_STOP
+
+ This parameter can also be a user-defined control
+ code ranging from 128 to 255.
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+WINAPI
+CServiceBase::ServiceCtrlHandler(
+ DWORD Ctrl
+ )
+{
+ switch (Ctrl)
+ {
+ case SERVICE_CONTROL_STOP:
+ s_service->Stop();
+ break;
+ case SERVICE_CONTROL_PAUSE:
+ s_service->Pause();
+ break;
+ case SERVICE_CONTROL_CONTINUE:
+ s_service->Continue();
+ break;
+ case SERVICE_CONTROL_SHUTDOWN:
+ s_service->Shutdown();
+ break;
+ case SERVICE_CONTROL_INTERROGATE:
+ break;
+ default:
+ break;
+ }
+}
+
+#pragma endregion
+
+
+#pragma region Service Constructor and Destructor
+
+/*++
+
+Routine Description:
+
+ The constructor of CServiceBase. It initializes a new instance
+ of the CServiceBase class. The optional parameters (CanStop,
+ CanShutdown and CanPauseContinue) allow you to specify whether the
+ service can be stopped, paused and continued, or be notified when system
+ shutdown occurs.
+
+Arguments:
+
+ ServiceName - The name of the service
+
+ CanStop - The service can be stopped
+
+ CanShutdown - The service is notified when system shutdown occurs
+
+ CanPauseContinue - The service can be paused and continued
+
+Return Value:
+
+ VOID
+
+--*/
+CServiceBase::CServiceBase(
+ PWSTR ServiceName,
+ BOOL CanStop,
+ BOOL CanShutdown,
+ BOOL CanPauseContinue
+ )
+{
+ //
+ // Service name must be a valid string and cannot be NULL.
+ //
+ m_name = (ServiceName == NULL) ? L"" : ServiceName;
+
+ m_statusHandle = NULL;
+
+ //
+ // The service runs in its own process.
+ //
+ m_status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
+
+ //
+ // The service is starting.
+ //
+ m_status.dwCurrentState = SERVICE_START_PENDING;
+
+ //
+ // The accepted commands of the service.
+ //
+ DWORD dwControlsAccepted = 0;
+
+ if (CanStop)
+ {
+ dwControlsAccepted |= SERVICE_ACCEPT_STOP;
+ }
+
+ if (CanShutdown)
+ {
+ dwControlsAccepted |= SERVICE_ACCEPT_SHUTDOWN;
+ }
+
+ if (CanPauseContinue)
+ {
+ dwControlsAccepted |= SERVICE_ACCEPT_PAUSE_CONTINUE;
+ }
+
+ m_status.dwControlsAccepted = dwControlsAccepted;
+
+ m_status.dwWin32ExitCode = NO_ERROR;
+ m_status.dwServiceSpecificExitCode = 0;
+ m_status.dwCheckPoint = 0;
+ m_status.dwWaitHint = 0;
+
+ SetupEvents();
+}
+
+
+/*++
+
+Routine Description:
+
+ The virtual destructor of CServiceBase.
+
+Arguments:
+
+ VOID
+
+Return Value:
+
+ VOID
+
+--*/
+CServiceBase::~CServiceBase()
+{
+ DestroyEvents();
+}
+
+#pragma endregion
+
+
+#pragma region Service Start, Stop, Pause, Continue, and Shutdown
+
+/*++
+
+Routine Description:
+
+ This function starts the service. It calls the OnStart virtual function
+ in which you can specify the actions to take when the service starts. If
+ an error occurs during the startup, the error will be logged in the
+ Application event log, and the service will be stopped.
+
+Arguments:
+
+ Argc - The number of command line arguments
+
+ Argv - The array of command line arguments
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+CServiceBase::Start(
+ DWORD Argc,
+ PWSTR *Argv
+)
+{
+ try
+ {
+ //
+ // Tell SCM that the service is starting.
+ //
+ SetServiceStatus(SERVICE_START_PENDING);
+
+ //
+ // Perform service-specific initialization.
+ //
+ OnStart(Argc, Argv);
+
+ //
+ // Tell SCM that the service is started.
+ //
+ SetServiceStatus(SERVICE_RUNNING);
+ }
+ catch (DWORD Error)
+ {
+ //
+ // Log the error.
+ //
+ WriteToErrorLog(L"Service Start", Error);
+
+ //
+ // Set the service status to be stopped.
+ //
+ SetServiceStatus(SERVICE_STOPPED, Error);
+ }
+ catch (...)
+ {
+ //
+ // Log the error.
+ //
+ WriteToEventLog(L"Service failed to start.", EVENTLOG_ERROR_TYPE);
+
+ //
+ // Set the service status to be stopped.
+ //
+ SetServiceStatus(SERVICE_STOPPED);
+ }
+}
+
+
+/*++
+
+Routine Description:
+
+ When implemented in a derived class, executes when a Start
+ command is sent to the service by the SCM or when the operating system
+ starts (for a service that starts automatically). Specifies actions to
+ take when the service starts. Be sure to periodically call
+ CServiceBase::SetServiceStatus() with SERVICE_START_PENDING if the
+ procedure is going to take long time. You may also consider spawning a
+ new thread in OnStart to perform time-consuming initialization tasks.
+
+Arguments:
+
+ Argc - The number of command line arguments
+
+ Argv - The array of command line arguments
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+CServiceBase::OnStart(
+ DWORD Argc,
+ PWSTR *Argv
+)
+{
+ SetVariables();
+}
+
+
+/*++
+
+Routine Description:
+
+ This function stops the service. It calls the OnStop virtual
+ function in which you can specify the actions to take when the service
+ stops. If an error occurs, the error will be logged in the Application
+ event log, and the service will be restored to the original state.
+
+Arguments:
+
+ VOID
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+CServiceBase::Stop()
+{
+ DWORD OriginalState = m_status.dwCurrentState;
+
+ try
+ {
+ //
+ // Tell SCM that the service is stopping.
+ //
+ SetServiceStatus(SERVICE_STOP_PENDING);
+
+ //
+ // Perform service-specific stop operations.
+ //
+ OnStop();
+
+ //
+ // Tell SCM that the service is stopped.
+ //
+ SetServiceStatus(SERVICE_STOPPED);
+ }
+ catch (DWORD Error)
+ {
+ //
+ // Log the error.
+ //
+ WriteToErrorLog(L"Service Stop", Error);
+
+ //
+ // Set the orginal service status.
+ //
+ SetServiceStatus(OriginalState);
+ }
+ catch (...)
+ {
+ //
+ // Log the error.
+ //
+ WriteToEventLog(L"Service failed to stop.", EVENTLOG_ERROR_TYPE);
+
+ //
+ // Set the orginal service status.
+ //
+ SetServiceStatus(OriginalState);
+ }
+}
+
+
+/*++
+
+Routine Description:
+
+ When implemented in a derived class, executes when a Stop
+ command is sent to the service by the SCM. Specifies actions to take
+ when a service stops running. Be sure to periodically call
+ CServiceBase::SetServiceStatus() with SERVICE_STOP_PENDING if the
+ procedure is going to take long time.
+
+Arguments:
+
+ VOID
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+CServiceBase::OnStop()
+{
+}
+
+
+/*++
+
+Routine Description:
+
+ The function pauses the service if the service supports pause
+ and continue. It calls the OnPause virtual function in which you can
+ specify the actions to take when the service pauses. If an error occurs,
+ the error will be logged in the Application event log, and the service
+ will become running.
+
+Arguments:
+
+ VOID
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+CServiceBase::Pause()
+{
+ try
+ {
+ //
+ // Tell SCM that the service is pausing.
+ //
+ SetServiceStatus(SERVICE_PAUSE_PENDING);
+
+ //
+ // Perform service-specific pause operations.
+ //
+ OnPause();
+
+ //
+ // Tell SCM that the service is paused.
+ //
+ SetServiceStatus(SERVICE_PAUSED);
+ }
+ catch (DWORD Error)
+ {
+ //
+ // Log the error.
+ //
+ WriteToErrorLog(L"Service Pause", Error);
+
+ //
+ // Tell SCM that the service is still running.
+ //
+ SetServiceStatus(SERVICE_RUNNING);
+ }
+ catch (...)
+ {
+ //
+ // Log the error.
+ //
+ WriteToEventLog(L"Service failed to pause.", EVENTLOG_ERROR_TYPE);
+
+ //
+ // Tell SCM that the service is still running.
+ //
+ SetServiceStatus(SERVICE_RUNNING);
+ }
+}
+
+
+/*++
+
+Routine Description:
+
+ When implemented in a derived class, executes when a Pause
+ command is sent to the service by the SCM. Specifies actions to take
+ when a service pauses.
+
+Arguments:
+
+ VOID
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+CServiceBase::OnPause()
+{
+}
+
+
+/*++
+
+Routine Description:
+
+ The function resumes normal functioning after being paused if
+ the service supports pause and continue. It calls the OnContinue virtual
+ function in which you can specify the actions to take when the service
+ continues. If an error occurs, the error will be logged in the
+ Application event log, and the service will still be paused.
+
+Arguments:
+
+ VOID
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+CServiceBase::Continue()
+{
+ try
+ {
+ //
+ // Tell SCM that the service is resuming.
+ //
+ SetServiceStatus(SERVICE_CONTINUE_PENDING);
+
+ //
+ // Perform service-specific continue operations.
+ //
+ OnContinue();
+
+ //
+ // Tell SCM that the service is running.
+ //
+ SetServiceStatus(SERVICE_RUNNING);
+ }
+ catch (DWORD Error)
+ {
+ //
+ // Log the error.
+ //
+ WriteToErrorLog(L"Service Continue", Error);
+
+ //
+ // Tell SCM that the service is still paused.
+ //
+ SetServiceStatus(SERVICE_PAUSED);
+ }
+ catch (...)
+ {
+ //
+ // Log the error.
+ //
+ WriteToEventLog(L"Service failed to resume.", EVENTLOG_ERROR_TYPE);
+
+ //
+ // Tell SCM that the service is still paused.
+ //
+ SetServiceStatus(SERVICE_PAUSED);
+ }
+}
+
+
+/*++
+
+Routine Description:
+
+ When implemented in a derived class, OnContinue runs when a
+ Continue command is sent to the service by the SCM. Specifies actions to
+ take when a service resumes normal functioning after being paused.
+
+Arguments:
+
+ VOID
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+CServiceBase::OnContinue()
+{
+}
+
+
+/*++
+
+Routine Description:
+
+ The function executes when the system is shutting down. It
+ calls the OnShutdown virtual function in which you can specify what
+ should occur immediately prior to the system shutting down. If an error
+ occurs, the error will be logged in the Application event log.
+
+Arguments:
+
+ VOID
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+CServiceBase::Shutdown()
+{
+ try
+ {
+ //
+ // Perform service-specific shutdown operations.
+ //
+ OnShutdown();
+
+ //
+ // Tell SCM that the service is stopped.
+ //
+ SetServiceStatus(SERVICE_STOPPED);
+ }
+ catch (DWORD Error)
+ {
+ //
+ // Log the error.
+ //
+ WriteToErrorLog(L"Service Shutdown", Error);
+ }
+ catch (...)
+ {
+ //
+ // Log the error.
+ //
+ WriteToEventLog(L"Service failed to shut down.", EVENTLOG_ERROR_TYPE);
+ }
+}
+
+
+/*++
+
+Routine Description:
+
+ When implemented in a derived class, executes when the system
+ is shutting down. Specifies what should occur immediately prior to the
+ system shutting down.
+
+Arguments:
+
+ VOID
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+CServiceBase::OnShutdown()
+{
+}
+
+#pragma endregion
+
+
+#pragma region Helper Functions
+
+/*++
+
+Routine Description:
+
+ The function sets the service status and reports the status to the SCM.
+
+Arguments:
+
+ CurrentState - The current state of the service
+
+ Win32ExitCode - The error code to report
+
+ WaitHint - The estimated time for pending operation, in milliseconds
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+CServiceBase::SetServiceStatus(
+ DWORD CurrentState,
+ DWORD Win32ExitCode,
+ DWORD WaitHint
+ )
+{
+ static DWORD CheckPoint = 1;
+
+ //
+ // Fill in the SERVICE_STATUS structure of the service.
+ //
+
+ m_status.dwCurrentState = CurrentState;
+ m_status.dwWin32ExitCode = Win32ExitCode;
+ m_status.dwWaitHint = WaitHint;
+
+ m_status.dwCheckPoint = ((CurrentState == SERVICE_RUNNING) ||
+ (CurrentState == SERVICE_STOPPED)) ? 0 :
+ CheckPoint++;
+
+ //
+ // Report the status of the service to the SCM.
+ //
+ ::SetServiceStatus(m_statusHandle, &m_status);
+}
+
+#pragma endregion \ No newline at end of file
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/ServiceBase.h b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/ServiceBase.h
new file mode 100644
index 00000000..106597e1
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/ServiceBase.h
@@ -0,0 +1,423 @@
+/*++
+
+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:
+
+ ServiceBase.cpp
+
+Abstract:
+
+ Provides a base class for a service that will exist as part of a service
+ application. CServiceBase must be derived from when creating a new service
+ class.
+
+Environment:
+
+ User mode
+
+--*/
+
+#pragma once
+
+#include <windows.h>
+#include "Utils.h"
+
+class CServiceBase
+{
+public:
+
+ /*++
+
+ Routine Description:
+
+ Register the executable for a service with the Service Control
+ Manager (SCM). After you call Run(ServiceBase), the SCM issues a Start
+ command, which results in a call to the OnStart method in the service.
+ This method blocks until the service has stopped.
+
+ Arguments:
+
+ Service - The reference to a CServiceBase object. It will become the
+ singleton service instance of this service application.
+
+ Return Value:
+
+ If the function succeeds, the return value is TRUE. If the function
+ fails, the return value is FALSE. To get extended error information,
+ call GetLastError.
+
+ --*/
+ static BOOL Run(CServiceBase &service);
+
+
+ /*++
+
+ Routine Description:
+
+ The constructor of CServiceBase. It initializes a new instance
+ of the CServiceBase class. The optional parameters (CanStop,
+ CanShutdown and CanPauseContinue) allow you to specify whether the
+ service can be stopped, paused and continued, or be notified when system
+ shutdown occurs.
+
+ Arguments:
+
+ ServiceName - The name of the service
+
+ CanStop - The service can be stopped
+
+ CanShutdown - The service is notified when system shutdown occurs
+
+ CanPauseContinue - The service can be paused and continued
+
+ Return Value:
+
+ VOID
+
+ --*/
+ CServiceBase(PWSTR ServiceName,
+ BOOL CanStop = TRUE,
+ BOOL CanShutdown = TRUE,
+ BOOL CanPauseContinue = FALSE);
+
+
+ /*++
+
+ Routine Description:
+
+ The virtual destructor of CServiceBase.
+
+ Arguments:
+
+ VOID
+
+ Return Value:
+
+ VOID
+
+ --*/
+ virtual ~CServiceBase();
+
+
+ /*++
+
+ Routine Description:
+
+ This function stops the service. It calls the OnStop virtual
+ function in which you can specify the actions to take when the service
+ stops. If an error occurs, the error will be logged in the Application
+ event log, and the service will be restored to the original state.
+
+ Arguments:
+
+ VOID
+
+ Return Value:
+
+ VOID
+
+ --*/
+ VOID Stop();
+
+protected:
+
+ /*++
+
+ Routine Description:
+
+ When implemented in a derived class, executes when a Start
+ command is sent to the service by the SCM or when the operating system
+ starts (for a service that starts automatically). Specifies actions to
+ take when the service starts. Be sure to periodically call
+ CServiceBase::SetServiceStatus() with SERVICE_START_PENDING if the
+ procedure is going to take long time. You may also consider spawning a
+ new thread in OnStart to perform time-consuming initialization tasks.
+
+ Arguments:
+
+ Argc - The number of command line arguments
+
+ Argv - The array of command line arguments
+
+ Return Value:
+
+ VOID
+
+ --*/
+ virtual VOID OnStart(DWORD Argc, PWSTR *Argv);
+
+
+ /*++
+
+ Routine Description:
+
+ When implemented in a derived class, executes when a Stop
+ command is sent to the service by the SCM. Specifies actions to take
+ when a service stops running. Be sure to periodically call
+ CServiceBase::SetServiceStatus() with SERVICE_STOP_PENDING if the
+ procedure is going to take long time.
+
+ Arguments:
+
+ VOID
+
+ Return Value:
+
+ VOID
+
+ --*/
+ virtual VOID OnStop();
+
+
+ /*++
+
+ Routine Description:
+
+ When implemented in a derived class, executes when a Pause
+ command is sent to the service by the SCM. Specifies actions to take
+ when a service pauses.
+
+ Arguments:
+
+ VOID
+
+ Return Value:
+
+ VOID
+
+ --*/
+ virtual VOID OnPause();
+
+
+ /*++
+
+ Routine Description:
+
+ When implemented in a derived class, OnContinue runs when a
+ Continue command is sent to the service by the SCM. Specifies actions to
+ take when a service resumes normal functioning after being paused.
+
+ Arguments:
+
+ VOID
+
+ Return Value:
+
+ VOID
+
+ --*/
+ virtual VOID OnContinue();
+
+
+ /*++
+
+ Routine Description:
+
+ When implemented in a derived class, executes when the system
+ is shutting down. Specifies what should occur immediately prior to the
+ system shutting down.
+
+ Arguments:
+
+ VOID
+
+ Return Value:
+
+ VOID
+
+ --*/
+ virtual VOID OnShutdown();
+
+
+ /*++
+
+ Routine Description:
+
+ The function sets the service status and reports the status to the SCM.
+
+ Arguments:
+
+ CurrentState - The current state of the service
+
+ Win32ExitCode - The error code to report
+
+ WaitHint - The estimated time for pending operation, in milliseconds
+
+ Return Value:
+
+ VOID
+
+ --*/
+ VOID SetServiceStatus(DWORD CurrentState,
+ DWORD Win32ExitCode = NO_ERROR,
+ DWORD WaitHint = 0);
+
+private:
+
+ /*++
+
+ Routine Description:
+
+ The entry point for the service. It registers the handler function
+ for the service and starts the service.
+
+ Arguments:
+
+ Argc - The number of command line arguments
+
+ Argv - The array of command line arguments
+
+ Return Value:
+
+ VOID
+
+ --*/
+ static VOID WINAPI ServiceMain(DWORD Argc, PWSTR *Argv);
+
+
+ /*++
+
+ Routine Description:
+
+ Called by the SCM whenever a control code is sent to the service.
+
+ Arguments:
+
+ CtrlCode - The control code. This parameter can be one of
+ the following values:
+
+ SERVICE_CONTROL_CONTINUE
+ SERVICE_CONTROL_INTERROGATE
+ SERVICE_CONTROL_NETBINDADD
+ SERVICE_CONTROL_NETBINDDISABLE
+ SERVICE_CONTROL_NETBINDREMOVE
+ SERVICE_CONTROL_PARAMCHANGE
+ SERVICE_CONTROL_PAUSE
+ SERVICE_CONTROL_SHUTDOWN
+ SERVICE_CONTROL_STOP
+
+ This parameter can also be a user-defined control
+ code ranging from 128 to 255.
+
+ Return Value:
+
+ VOID
+
+ --*/
+ static VOID WINAPI ServiceCtrlHandler(DWORD Ctrl);
+
+
+ /*++
+
+ Routine Description:
+
+ This function starts the service. It calls the OnStart virtual function
+ in which you can specify the actions to take when the service starts. If
+ an error occurs during the startup, the error will be logged in the
+ Application event log, and the service will be stopped.
+
+ Arguments:
+
+ Argc - The number of command line arguments
+
+ Argv - The array of command line arguments
+
+ Return Value:
+
+ VOID
+
+ --*/
+ VOID Start(DWORD Argc, PWSTR *Argv);
+
+
+ /*++
+
+ Routine Description:
+
+ The function pauses the service if the service supports pause
+ and continue. It calls the OnPause virtual function in which you can
+ specify the actions to take when the service pauses. If an error occurs,
+ the error will be logged in the Application event log, and the service
+ will become running.
+
+ Arguments:
+
+ VOID
+
+ Return Value:
+
+ VOID
+
+ --*/
+ VOID Pause();
+
+
+ /*++
+
+ Routine Description:
+
+ The function resumes normal functioning after being paused if
+ the service supports pause and continue. It calls the OnContinue virtual
+ function in which you can specify the actions to take when the service
+ continues. If an error occurs, the error will be logged in the
+ Application event log, and the service will still be paused.
+
+ Arguments:
+
+ VOID
+
+ Return Value:
+
+ VOID
+
+ --*/
+ VOID Continue();
+
+
+ /*++
+
+ Routine Description:
+
+ The function executes when the system is shutting down. It
+ calls the OnShutdown virtual function in which you can specify what
+ should occur immediately prior to the system shutting down. If an error
+ occurs, the error will be logged in the Application event log.
+
+ Arguments:
+
+ VOID
+
+ Return Value:
+
+ VOID
+
+ --*/
+ VOID Shutdown();
+
+
+ //
+ // The singleton service instance.
+ //
+ static CServiceBase *s_service;
+
+ //
+ // The name of the service.
+ //
+ PWSTR m_name;
+
+ //
+ // The status of the service.
+ //
+ SERVICE_STATUS m_status;
+
+ //
+ // The service status handle.
+ //
+ SERVICE_STATUS_HANDLE m_statusHandle;
+}; \ No newline at end of file
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/ThreadPool.h b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/ThreadPool.h
new file mode 100644
index 00000000..3d851537
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/ThreadPool.h
@@ -0,0 +1,80 @@
+/****************************** Module Header ******************************\
+* Module Name: ThreadPool.h
+* Project: CppWindowsService
+* Copyright (c) Microsoft Corporation.
+*
+* The class was designed by Kenny Kerr. It provides the ability to queue
+* simple member functions of a class to the Windows thread pool.
+*
+* Using the thread pool is simple and feels natural in C++.
+*
+* class CSampleService
+* {
+* public:
+*
+* void AsyncRun()
+* {
+* CThreadPool::QueueUserWorkItem(&Service::Run, this);
+* }
+*
+* void Run()
+* {
+* // Some lengthy operation
+* }
+* };
+*
+* Kenny Kerr spends most of his time designing and building distributed
+* applications for the Microsoft Windows platform. He also has a particular
+* passion for C++ and security programming. Reach Kenny at
+* http://weblogs.asp.net/kennykerr/ or visit his Web site:
+* http://www.kennyandkarin.com/Kenny/.
+*
+* This source is subject to the Microsoft Public License.
+* See http://www.microsoft.com/en-us/openness/resources/licenses.aspx#MPL.
+* All other 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.
+\***************************************************************************/
+
+#pragma once
+
+#include <memory>
+
+
+class CThreadPool
+{
+public:
+
+ template <typename T>
+ static void QueueUserWorkItem(void (T::*function)(void),
+ T *object, ULONG flags = WT_EXECUTELONGFUNCTION)
+ {
+ typedef std::pair<void (T::*)(), T *> CallbackType;
+ std::auto_ptr<CallbackType> p(new CallbackType(function, object));
+
+ if (::QueueUserWorkItem(ThreadProc<T>, p.get(), flags))
+ {
+ // The ThreadProc now has the responsibility of deleting the pair.
+ p.release();
+ }
+ else
+ {
+ throw GetLastError();
+ }
+ }
+
+private:
+
+ template <typename T>
+ static DWORD WINAPI ThreadProc(PVOID context)
+ {
+ typedef std::pair<void (T::*)(), T *> CallbackType;
+
+ std::auto_ptr<CallbackType> p(static_cast<CallbackType *>(context));
+
+ (p->second->*p->first)();
+ return 0;
+ }
+}; \ No newline at end of file
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/Utils.cpp b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/Utils.cpp
new file mode 100644
index 00000000..e8fc87ee
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/Utils.cpp
@@ -0,0 +1,156 @@
+/*++
+
+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:
+
+ Utils.cpp
+
+Abstract:
+
+ Provides utility function to SampleApp.cpp.
+
+Environment:
+
+ User mode
+
+--*/
+
+#include "Utils.h"
+
+//
+// Service trace event provider
+// {54a25c42-cd91-4210-98cc-c3447b56e447}
+//
+EXTERN_C __declspec(selectany) const GUID SERVICE_PROVIDER_GUID = { 0x54a25c42, 0xcd91, 0x4210,{ 0x98, 0xcc, 0xc3, 0x44, 0x7b, 0x56, 0xe4, 0x47 } };
+
+REGHANDLE m_etwRegHandle;
+
+
+/*++
+
+Routine Description:
+
+ Sets up logging.
+
+Arguments:
+
+ VOID
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+SetupEvents()
+{
+ NTSTATUS status = EventRegister(&SERVICE_PROVIDER_GUID,
+ nullptr,
+ nullptr,
+ &m_etwRegHandle);
+
+ if (status != ERROR_SUCCESS)
+ {
+ wprintf(L"Provider not registered. EventRegister failed with error: 0x%08X\n", status);
+ }
+}
+
+
+/*++
+
+Routine Description:
+
+ Destroys logging.
+
+Arguments:
+
+ VOID
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+DestroyEvents()
+{
+ if (m_etwRegHandle != NULL)
+ {
+ EventUnregister(m_etwRegHandle);
+ }
+}
+
+
+/*++
+
+Routine Description:
+
+ Log a message.
+
+Arguments:
+
+ Message - The string message to be logged
+
+ Level - The type of event to be logged. This parameter can
+ be one of the following values:
+
+ TRACE_LEVEL_CRITICAL
+ TRACE_LEVEL_ERROR
+ TRACE_LEVEL_WARNING
+ TRACE_LEVEL_INFORMATION
+ TRACE_LEVEL_VERBOSE
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+WriteToEventLog(
+ PWSTR Message,
+ BYTE Level
+ )
+{
+ if (m_etwRegHandle != NULL)
+ {
+ EventWriteString(m_etwRegHandle, Level, 0, Message);
+ }
+}
+
+
+/*++
+
+Routine Description:
+
+ Log an error message.
+
+Arguments:
+
+ Function - The function that gives the error
+
+ Error - The error code
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+WriteToErrorLog(
+ PWSTR Function,
+ DWORD Error
+ )
+{
+ WCHAR Message[260];
+
+ StringCchPrintf(Message, ARRAYSIZE(Message),
+ L"%ws failed with error: 0x%08x", Function, Error);
+
+ WriteToEventLog(Message, TRACE_LEVEL_ERROR);
+} \ No newline at end of file
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/Utils.h b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/Utils.h
new file mode 100644
index 00000000..b619f461
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/Utils.h
@@ -0,0 +1,111 @@
+/*++
+
+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:
+
+ Utils.cpp
+
+Abstract:
+
+ Provides utility function to SampleApp.cpp.
+
+Environment:
+
+ User mode
+
+--*/
+
+#pragma once
+
+#include <Windows.h>
+#include <strsafe.h>
+#include <evntprov.h>
+#include <evntrace.h>
+
+/*++
+
+Routine Description:
+
+ Sets up logging.
+
+Arguments:
+
+ VOID
+
+Return Value:
+
+ VOID
+
+--*/
+VOID SetupEvents();
+
+
+/*++
+
+Routine Description:
+
+ Destroys logging.
+
+Arguments:
+
+ VOID
+
+Return Value:
+
+ VOID
+
+--*/
+VOID DestroyEvents();
+
+
+/*++
+
+Routine Description:
+
+ Log a message.
+
+Arguments:
+
+ Message - The string message to be logged
+
+ Level - The type of event to be logged. This parameter can
+ be one of the following values:
+
+ TRACE_LEVEL_CRITICAL
+ TRACE_LEVEL_ERROR
+ TRACE_LEVEL_WARNING
+ TRACE_LEVEL_INFORMATION
+ TRACE_LEVEL_VERBOSE
+
+Return Value:
+
+ VOID
+
+--*/
+VOID WriteToEventLog(PWSTR Message, BYTE Level);
+
+
+/*++
+
+Routine Description:
+
+ Log an error message.
+
+Arguments:
+
+ Function - The function that gives the error
+
+ Error - The error code
+
+Return Value:
+
+ VOID
+
+--*/
+VOID WriteToErrorLog(PWSTR Function, DWORD Error); \ No newline at end of file
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/osrfx2_DCHU_usersvc.filters b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/osrfx2_DCHU_usersvc.filters
new file mode 100644
index 00000000..7f12a302
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/osrfx2_DCHU_usersvc.filters
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="SampleService.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="ServiceBase.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="Utils.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="Main.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="CppWindowsService.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="SampleService.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="ServiceBase.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="ThreadPool.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="Utils.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="Main.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="Documentation\ReadMe.htm" />
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/osrfx2_DCHU_usersvc.inx b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/osrfx2_DCHU_usersvc.inx
new file mode 100644
index 00000000..68f1f4fd
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/osrfx2_DCHU_usersvc.inx
Binary files differ
diff --git a/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/osrfx2_DCHU_usersvc.vcxproj b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/osrfx2_DCHU_usersvc.vcxproj
new file mode 100644
index 00000000..eab4b251
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_base/osrfx2_DCHU_usersvc/osrfx2_DCHU_usersvc.vcxproj
@@ -0,0 +1,206 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{DE70E2D1-6A4D-4984-BD82-CE750889F0D3}</ProjectGuid>
+ <RootNamespace>osrfx2_DCHU_usersvc</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ <ProjectName>osrfx2_DCHU_usersvc</ProjectName>
+ <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ <AdditionalDependencies>onecoreuap.lib;%(AdditionalDependencies);</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX86</TargetMachine>
+ <AdditionalDependencies>onecoreuap.lib;%(AdditionalDependencies);</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX64</TargetMachine>
+ <AdditionalDependencies>onecoreuap.lib;%(AdditionalDependencies);</AdditionalDependencies>
+ <IgnoreAllDefaultLibraries>
+ </IgnoreAllDefaultLibraries>
+ <IgnoreSpecificDefaultLibraries>
+ </IgnoreSpecificDefaultLibraries>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX64</TargetMachine>
+ <AdditionalDependencies>onecoreuap.lib;%(AdditionalDependencies);</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="CppWindowsService.cpp" />
+ <ClCompile Include="SampleService.cpp" />
+ <ClCompile Include="ServiceBase.cpp" />
+ <ClCompile Include="Main.cpp" />
+ <ClCompile Include="Utils.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="SampleService.h" />
+ <ClInclude Include="ServiceBase.h" />
+ <ClInclude Include="Main.h" />
+ <ClInclude Include="ThreadPool.h" />
+ <ClInclude Include="Utils.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="Documentation\ReadMe.htm">
+ <DeploymentContent>true</DeploymentContent>
+ </None>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_component.sln b/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_component.sln
new file mode 100644
index 00000000..e09b5650
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_component.sln
@@ -0,0 +1,73 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 14
+VisualStudioVersion = 14.0.25420.1
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "osrfx2_DCHU_component", "osrfx2_DCHU_component", "{E498C537-BA1A-4E9D-8F1E-9DC7646D2E1A}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "osrfx2_DCHU_componentsoftware", "osrfx2_DCHU_componentsoftware", "{E50E958C-B5D0-43E0-9D81-87F484F11E9F}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "osrfx2_DCHU_component", "osrfx2_DCHU_component\osrfx2_DCHU_component.vcxproj", "{F90EFA96-B075-4531-B4E1-F406362D16BF}"
+ ProjectSection(ProjectDependencies) = postProject
+ {26D91630-B8FF-4102-A258-32F7D1C84E20} = {26D91630-B8FF-4102-A258-32F7D1C84E20}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "osrfx2_DCHU_componentsoftware", "osrfx2_DCHU_componentsoftware\osrfx2_DCHU_componentsoftware.vcxproj", "{26D91630-B8FF-4102-A258-32F7D1C84E20}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|ARM = Debug|ARM
+ Debug|ARM64 = Debug|ARM64
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|ARM = Release|ARM
+ Release|ARM64 = Release|ARM64
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {F90EFA96-B075-4531-B4E1-F406362D16BF}.Debug|ARM.ActiveCfg = Debug|ARM
+ {F90EFA96-B075-4531-B4E1-F406362D16BF}.Debug|ARM.Build.0 = Debug|ARM
+ {F90EFA96-B075-4531-B4E1-F406362D16BF}.Debug|ARM.Deploy.0 = Debug|ARM
+ {F90EFA96-B075-4531-B4E1-F406362D16BF}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {F90EFA96-B075-4531-B4E1-F406362D16BF}.Debug|ARM64.Build.0 = Debug|ARM64
+ {F90EFA96-B075-4531-B4E1-F406362D16BF}.Debug|ARM64.Deploy.0 = Debug|ARM64
+ {F90EFA96-B075-4531-B4E1-F406362D16BF}.Debug|x64.ActiveCfg = Debug|x64
+ {F90EFA96-B075-4531-B4E1-F406362D16BF}.Debug|x64.Build.0 = Debug|x64
+ {F90EFA96-B075-4531-B4E1-F406362D16BF}.Debug|x64.Deploy.0 = Debug|x64
+ {F90EFA96-B075-4531-B4E1-F406362D16BF}.Debug|x86.ActiveCfg = Debug|Win32
+ {F90EFA96-B075-4531-B4E1-F406362D16BF}.Debug|x86.Build.0 = Debug|Win32
+ {F90EFA96-B075-4531-B4E1-F406362D16BF}.Debug|x86.Deploy.0 = Debug|Win32
+ {F90EFA96-B075-4531-B4E1-F406362D16BF}.Release|ARM.ActiveCfg = Release|ARM
+ {F90EFA96-B075-4531-B4E1-F406362D16BF}.Release|ARM.Build.0 = Release|ARM
+ {F90EFA96-B075-4531-B4E1-F406362D16BF}.Release|ARM.Deploy.0 = Release|ARM
+ {F90EFA96-B075-4531-B4E1-F406362D16BF}.Release|ARM64.ActiveCfg = Release|ARM64
+ {F90EFA96-B075-4531-B4E1-F406362D16BF}.Release|ARM64.Build.0 = Release|ARM64
+ {F90EFA96-B075-4531-B4E1-F406362D16BF}.Release|ARM64.Deploy.0 = Release|ARM64
+ {F90EFA96-B075-4531-B4E1-F406362D16BF}.Release|x64.ActiveCfg = Release|x64
+ {F90EFA96-B075-4531-B4E1-F406362D16BF}.Release|x64.Build.0 = Release|x64
+ {F90EFA96-B075-4531-B4E1-F406362D16BF}.Release|x64.Deploy.0 = Release|x64
+ {F90EFA96-B075-4531-B4E1-F406362D16BF}.Release|x86.ActiveCfg = Release|Win32
+ {F90EFA96-B075-4531-B4E1-F406362D16BF}.Release|x86.Build.0 = Release|Win32
+ {F90EFA96-B075-4531-B4E1-F406362D16BF}.Release|x86.Deploy.0 = Release|Win32
+ {26D91630-B8FF-4102-A258-32F7D1C84E20}.Debug|ARM.ActiveCfg = Debug|Win32
+ {26D91630-B8FF-4102-A258-32F7D1C84E20}.Debug|ARM64.ActiveCfg = Debug|Win32
+ {26D91630-B8FF-4102-A258-32F7D1C84E20}.Debug|x64.ActiveCfg = Debug|x64
+ {26D91630-B8FF-4102-A258-32F7D1C84E20}.Debug|x64.Build.0 = Debug|x64
+ {26D91630-B8FF-4102-A258-32F7D1C84E20}.Debug|x86.ActiveCfg = Debug|Win32
+ {26D91630-B8FF-4102-A258-32F7D1C84E20}.Debug|x86.Build.0 = Debug|Win32
+ {26D91630-B8FF-4102-A258-32F7D1C84E20}.Release|ARM.ActiveCfg = Release|Win32
+ {26D91630-B8FF-4102-A258-32F7D1C84E20}.Release|ARM64.ActiveCfg = Release|Win32
+ {26D91630-B8FF-4102-A258-32F7D1C84E20}.Release|x64.ActiveCfg = Release|x64
+ {26D91630-B8FF-4102-A258-32F7D1C84E20}.Release|x64.Build.0 = Release|x64
+ {26D91630-B8FF-4102-A258-32F7D1C84E20}.Release|x86.ActiveCfg = Release|Win32
+ {26D91630-B8FF-4102-A258-32F7D1C84E20}.Release|x86.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {F90EFA96-B075-4531-B4E1-F406362D16BF} = {E498C537-BA1A-4E9D-8F1E-9DC7646D2E1A}
+ {26D91630-B8FF-4102-A258-32F7D1C84E20} = {E50E958C-B5D0-43E0-9D81-87F484F11E9F}
+ EndGlobalSection
+EndGlobal
diff --git a/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_component/osrfx2_DCHU_component.filters b/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_component/osrfx2_DCHU_component.filters
new file mode 100644
index 00000000..fa953f4c
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_component/osrfx2_DCHU_component.filters
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Driver Files">
+ <UniqueIdentifier>{8E41214B-6785-4CFE-B992-037D68949A14}</UniqueIdentifier>
+ <Extensions>inf;inv;inx;mof;mc;</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <Inf Include="osrfx2_DCHU_component.inx">
+ <Filter>Driver Files</Filter>
+ </Inf>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_component/osrfx2_DCHU_component.inx b/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_component/osrfx2_DCHU_component.inx
new file mode 100644
index 00000000..2d9bb813
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_component/osrfx2_DCHU_component.inx
@@ -0,0 +1,64 @@
+;/*++
+;
+;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:
+;
+; osrfx2_DCHU_component.INF
+;
+;Abstract:
+;
+; Installation inf for one of the OSR FX2 Learning Kit's
+; AddComponent directives
+;
+;--*/
+
+[Version]
+Signature = "$Windows NT$"
+Class = SoftwareComponent
+ClassGuid = {5c4c3332-344d-483c-8739-259e934c9cc8}
+Provider = %ManufacturerName%
+CatalogFile = osrfx2_DCHU_component.cat
+
+[Manufacturer]
+%ManufacturerName% = OsrFx2Component, NT$ARCH$
+
+[OsrFx2Component.NT$ARCH$]
+%DeviceName% = OsrFx2Component_Install, SWC\VID_045e&PID_94ab
+
+[SourceDisksFiles]
+osrfx2_DCHU_componentsoftware.exe = 1
+
+[SourceDisksNames]
+1 = %DiskName%
+
+[DestinationDirs]
+DefaultDestDir = 13 ; copy to driverstore
+
+[OsrFx2Component_Install.NT]
+CopyFiles = OsrFx2Component_CopyFiles
+
+[OsrFx2Component_Install.NT.Services]
+AddService = , 0x00000002
+
+[OsrFx2Component_Install.NT.Software]
+AddSoftware = osrfx2_DCHU_componentsoftware,, OsrFx2Component_SoftwareInstall
+
+[OsrFx2Component_SoftwareInstall]
+SoftwareType = 1
+SoftwareBinary = osrfx2_DCHU_componentsoftware.exe
+SoftwareArguments = <<DeviceInstanceId>>
+SoftwareVersion = 1.0.0.0
+
+[OsrFx2Component_CopyFiles]
+osrfx2_DCHU_componentsoftware.exe
+
+[Strings]
+ManufacturerName = "Contoso"
+DiskName = "OsrFx2 DCHU Component Installation Disk"
+DeviceName = "OsrFx2 DCHU Component Device" \ No newline at end of file
diff --git a/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_component/osrfx2_DCHU_component.vcxproj b/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_component/osrfx2_DCHU_component.vcxproj
new file mode 100644
index 00000000..fed7ddf4
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_component/osrfx2_DCHU_component.vcxproj
@@ -0,0 +1,272 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|ARM">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM">
+ <Configuration>Release</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|ARM64">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM64">
+ <Configuration>Release</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <ItemGroup>
+ <Inf Include="osrfx2_DCHU_component.inx" />
+ </ItemGroup>
+ <ItemGroup>
+ <FilesToPackage Include="$(SolutionDir)$(Platform)\$(Configuration)\osrfx2_DCHU_componentsoftware.exe" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <PackageRelativeDirectory>
+ </PackageRelativeDirectory>
+ </FilesToPackage>
+ <FilesToPackage Include="$(SolutionDir)$(Platform)\$(ConfigurationName)\osrfx2_DCHU_componentsoftware.exe" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <PackageRelativeDirectory>
+ </PackageRelativeDirectory>
+ </FilesToPackage>
+ <FilesToPackage Include="$(SolutionDir)\$(Configuration)\osrfx2_DCHU_componentsoftware.exe" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <PackageRelativeDirectory>
+ </PackageRelativeDirectory>
+ </FilesToPackage>
+ <FilesToPackage Include="$(SolutionDir)\$(ConfigurationName)\osrfx2_DCHU_componentsoftware.exe" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <PackageRelativeDirectory>
+ </PackageRelativeDirectory>
+ </FilesToPackage>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{F90EFA96-B075-4531-B4E1-F406362D16BF}</ProjectGuid>
+ <TemplateGuid>{4605da2c-74a5-4865-98e1-152ef136825f}</TemplateGuid>
+ <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+ <MinimumVisualStudioVersion>12.0</MinimumVisualStudioVersion>
+ <Configuration>Debug</Configuration>
+ <Platform Condition="'$(Platform)' == ''">Win32</Platform>
+ <RootNamespace>osrfx2_DCHU_component</RootNamespace>
+ <ProjectName>osrfx2_DCHU_component</ProjectName>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
+ <ConfigurationType>Utility</ConfigurationType>
+ <DriverType>Package</DriverType>
+ <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
+ <ConfigurationType>Utility</ConfigurationType>
+ <DriverType>Package</DriverType>
+ <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
+ <ConfigurationType>Utility</ConfigurationType>
+ <DriverType>Package</DriverType>
+ <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
+ <ConfigurationType>Utility</ConfigurationType>
+ <DriverType>Package</DriverType>
+ <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
+ <ConfigurationType>Utility</ConfigurationType>
+ <DriverType>Package</DriverType>
+ <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
+ <ConfigurationType>Utility</ConfigurationType>
+ <DriverType>Package</DriverType>
+ <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
+ <ConfigurationType>Utility</ConfigurationType>
+ <DriverType>Package</DriverType>
+ <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
+ <ConfigurationType>Utility</ConfigurationType>
+ <DriverType>Package</DriverType>
+ <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor>
+ <HardwareIdString />
+ <CommandLine />
+ <DeployFiles />
+ <EnableVerifier>False</EnableVerifier>
+ <AllDrivers>False</AllDrivers>
+ <VerifyProjectOutput>True</VerifyProjectOutput>
+ <VerifyDrivers />
+ <VerifyFlags>133563</VerifyFlags>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor>
+ <HardwareIdString />
+ <CommandLine />
+ <DeployFiles />
+ <EnableVerifier>False</EnableVerifier>
+ <AllDrivers>False</AllDrivers>
+ <VerifyProjectOutput>True</VerifyProjectOutput>
+ <VerifyDrivers />
+ <VerifyFlags>133563</VerifyFlags>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor>
+ <HardwareIdString />
+ <CommandLine />
+ <DeployFiles />
+ <EnableVerifier>False</EnableVerifier>
+ <AllDrivers>False</AllDrivers>
+ <VerifyProjectOutput>True</VerifyProjectOutput>
+ <VerifyDrivers />
+ <VerifyFlags>133563</VerifyFlags>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor>
+ <HardwareIdString />
+ <CommandLine />
+ <DeployFiles />
+ <EnableVerifier>False</EnableVerifier>
+ <AllDrivers>False</AllDrivers>
+ <VerifyProjectOutput>True</VerifyProjectOutput>
+ <VerifyDrivers />
+ <VerifyFlags>133563</VerifyFlags>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor>
+ <HardwareIdString />
+ <CommandLine />
+ <DeployFiles />
+ <EnableVerifier>False</EnableVerifier>
+ <AllDrivers>False</AllDrivers>
+ <VerifyProjectOutput>True</VerifyProjectOutput>
+ <VerifyDrivers />
+ <VerifyFlags>133563</VerifyFlags>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor>
+ <HardwareIdString />
+ <CommandLine />
+ <DeployFiles />
+ <EnableVerifier>False</EnableVerifier>
+ <AllDrivers>False</AllDrivers>
+ <VerifyProjectOutput>True</VerifyProjectOutput>
+ <VerifyDrivers />
+ <VerifyFlags>133563</VerifyFlags>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
+ <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor>
+ <HardwareIdString />
+ <CommandLine />
+ <DeployFiles />
+ <EnableVerifier>False</EnableVerifier>
+ <AllDrivers>False</AllDrivers>
+ <VerifyProjectOutput>True</VerifyProjectOutput>
+ <VerifyDrivers />
+ <VerifyFlags>133563</VerifyFlags>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
+ <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor>
+ <HardwareIdString />
+ <CommandLine />
+ <DeployFiles />
+ <EnableVerifier>False</EnableVerifier>
+ <AllDrivers>False</AllDrivers>
+ <VerifyProjectOutput>True</VerifyProjectOutput>
+ <VerifyDrivers />
+ <VerifyFlags>133563</VerifyFlags>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
+ <Inf>
+ <TimeStamp>1.0.0.0</TimeStamp>
+ </Inf>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
+ <Inf>
+ <TimeStamp>1.0.0.0</TimeStamp>
+ </Inf>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Inf>
+ <TimeStamp>1.0.0.0</TimeStamp>
+ </Inf>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Inf>
+ <TimeStamp>1.0.0.0</TimeStamp>
+ </Inf>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <Inf>
+ <TimeStamp>1.0.0.0</TimeStamp>
+ </Inf>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <Inf>
+ <TimeStamp>1.0.0.0</TimeStamp>
+ </Inf>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Inf>
+ <TimeStamp>1.0.0.0</TimeStamp>
+ </Inf>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Inf>
+ <TimeStamp>1.0.0.0</TimeStamp>
+ </Inf>
+ </ItemDefinitionGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_componentsoftware/osrfx2_DCHU_componentsoftware.cpp b/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_componentsoftware/osrfx2_DCHU_componentsoftware.cpp
new file mode 100644
index 00000000..c14e66d1
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_componentsoftware/osrfx2_DCHU_componentsoftware.cpp
@@ -0,0 +1,489 @@
+/*++
+
+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:
+
+ osrfx2_DCHU_componentsoftware.cpp
+
+Abstract:
+
+ An example .exe to run using the AddSoftware directive within an INF.
+ Contains an example on how to obtain a handle to the primary device using
+ SoftwareArguments within an AddSoftware directive's section.
+
+Environment:
+
+ User mode
+
+--*/
+
+#include "stdafx.h"
+
+#define BUFFER_SIZE (128 * sizeof(WCHAR))
+#define DEVICE_REG_SUBKEY L"OSR"
+#define DEVICE_VALUE_OP_MODE L"OperatingMode"
+#define DEVICE_VALUE_OP_PARAMS L"OperatingParams"
+#define DEVICE_VALUE_OP_EXCEPTIONS L"OperatingExceptions"
+#define CONTOSO_FILEPATH L"C:\\Program Files\\Contoso"
+#define OSRFX2_DCHU_FILEPATH L"C:\\Program Files\\Contoso\\OsrFx2_DCHU"
+#define FILEPATH L"C:\\Program Files\\Contoso\\OsrFx2_DCHU\\AddSoftwareInstallationFile.txt"
+#define FILE_CONTENT L"Operating Mode: %ws\r\nOperating Params: %ws\r\nOperating Exceptions: %ws"
+
+
+/*++
+
+Routine Description:
+
+Arguments:
+
+Return Value:
+
+
+--*/
+DWORD
+WriteToFile(
+ _In_ PWSTR MessageText,
+ _In_ DWORD MessageTextLength
+ )
+{
+ DWORD Err = ERROR_SUCCESS;
+ BOOL ErrorFlag = FALSE;
+ HANDLE hFile = INVALID_HANDLE_VALUE;
+ DWORD BytesToWrite;
+ DWORD BytesWritten;
+
+ if (!CreateDirectory(CONTOSO_FILEPATH, NULL))
+ {
+ Err = GetLastError();
+
+ if (Err == ERROR_ALREADY_EXISTS)
+ {
+ Err = ERROR_SUCCESS;
+ }
+ else
+ {
+ goto cleanup;
+ }
+ }
+
+ if (!CreateDirectory(OSRFX2_DCHU_FILEPATH, NULL))
+ {
+ Err = GetLastError();
+
+ if (Err == ERROR_ALREADY_EXISTS)
+ {
+ Err = ERROR_SUCCESS;
+ }
+ else
+ {
+ goto cleanup;
+ }
+ }
+
+ hFile = CreateFile(FILEPATH,
+ GENERIC_WRITE,
+ 0,
+ NULL,
+ OPEN_ALWAYS,
+ FILE_ATTRIBUTE_NORMAL,
+ NULL);
+
+ if (hFile == INVALID_HANDLE_VALUE)
+ {
+ Err = ERROR_INVALID_PARAMETER;
+ goto cleanup;
+ }
+
+ BytesToWrite = MessageTextLength * sizeof(WCHAR);
+
+ ErrorFlag = WriteFile(hFile,
+ MessageText,
+ BytesToWrite,
+ &BytesWritten,
+ NULL);
+
+ if ((!ErrorFlag) ||
+ (BytesToWrite != BytesWritten))
+ {
+ Err = GetLastError();
+ goto cleanup;
+ }
+
+cleanup:
+
+ if (hFile != INVALID_HANDLE_VALUE)
+ {
+ CloseHandle(hFile);
+ }
+
+ return Err;
+}
+
+
+/*++
+
+Routine Description:
+
+ Obtains the handle to the device that used a separate Software Component
+ INF to install software.
+
+Arguments:
+
+ Argc - The number of command line arguments
+
+ Argv - The array of command line arguments
+
+Return Value:
+
+ VOID
+
+--*/
+VOID
+__cdecl
+_tmain(
+ INT Argc,
+ TCHAR *Argv[])
+{
+ DWORD Err = ERROR_SUCCESS;
+ HRESULT hr = S_OK;
+ BOOL ErrorFlag = FALSE;
+ DWORD BytesToWrite = 0;
+ DWORD BytesWritten = 0;
+ PTSTR DeviceInstanceId;
+ HDEVINFO DevInfoList = INVALID_HANDLE_VALUE;
+ SP_DEVINFO_DATA DevInfoData;
+ WCHAR ParentDeviceInstanceId[MAX_DEVICE_ID_LEN];
+ DWORD RequiredSize;
+ DEVPROPTYPE DevPropType;
+ SP_DEVINFO_DATA ParentDevInfoData;
+ HKEY DevRegKey = NULL;
+ PWSTR OperatingMode = NULL;
+ PWSTR OperatingParams = NULL;
+ PWSTR OperatingExceptions = NULL;
+ DWORD ValueType;
+ DWORD ValueSize = BUFFER_SIZE;
+ HKEY DevOsrRegKey = NULL;
+ PWSTR FileText = NULL;
+ DWORD FileTextLength;
+
+ //
+ // Validate arguments.
+ //
+ if (Argc != 2)
+ {
+ Err = ERROR_INVALID_PARAMETER;
+ goto cleanup;
+ }
+
+ OperatingMode = (PWSTR)malloc(BUFFER_SIZE * sizeof(WCHAR));
+
+ if (OperatingMode == NULL)
+ {
+ Err = ERROR_OUTOFMEMORY;
+ goto cleanup;
+ }
+
+ OperatingParams = (PWSTR)malloc(BUFFER_SIZE * sizeof(WCHAR));
+
+ if (OperatingParams == NULL)
+ {
+ Err = ERROR_OUTOFMEMORY;
+ goto cleanup;
+ }
+
+ OperatingExceptions = (PWSTR)malloc(BUFFER_SIZE * sizeof(WCHAR));
+
+ if (OperatingExceptions == NULL)
+ {
+ Err = ERROR_OUTOFMEMORY;
+ goto cleanup;
+ }
+
+ //
+ // Argv[1] should be the device instance ID.
+ //
+ DeviceInstanceId = Argv[1];
+
+ //
+ // Create a device info list to store queried device handles.
+ //
+ DevInfoList = SetupDiCreateDeviceInfoList(NULL, NULL);
+
+ if (DevInfoList == INVALID_HANDLE_VALUE)
+ {
+ Err = ERROR_OUTOFMEMORY;
+ goto cleanup;
+ }
+
+ DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
+
+ //
+ // Add the Software Component device that called AddSoftware to the
+ // device info list, which will be used to find the primary device that
+ // called AddComponent in the first place.
+ //
+ if (!SetupDiOpenDeviceInfo(DevInfoList,
+ DeviceInstanceId,
+ NULL,
+ 0,
+ &DevInfoData))
+ {
+ Err = GetLastError();
+ goto cleanup;
+ }
+
+ //
+ // Get the device instance id of the opened device's parent.
+ //
+ if (!SetupDiGetDeviceProperty(DevInfoList,
+ &DevInfoData,
+ &DEVPKEY_Device_Parent,
+ &DevPropType,
+ (PBYTE)ParentDeviceInstanceId,
+ sizeof(ParentDeviceInstanceId),
+ &RequiredSize,
+ 0))
+ {
+ Err = GetLastError();
+ goto cleanup;
+ }
+
+ if ((DevPropType != DEVPROP_TYPE_STRING) ||
+ (RequiredSize < sizeof(WCHAR)))
+ {
+ Err = ERROR_INVALID_PARAMETER;
+ goto cleanup;
+ }
+
+ ParentDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
+
+ //
+ // Get the parent of the device we retrieved first, which is the device
+ // that called AddComponent in its INF.
+ //
+ if (!SetupDiOpenDeviceInfoW(DevInfoList,
+ ParentDeviceInstanceId,
+ NULL,
+ 0,
+ &ParentDevInfoData))
+ {
+ Err = GetLastError();
+ goto cleanup;
+ }
+
+ //
+ // Open up the HW registry keys of the primary device.
+ //
+ DevRegKey = SetupDiOpenDevRegKey(DevInfoList,
+ &ParentDevInfoData,
+ DICS_FLAG_GLOBAL,
+ 0,
+ DIREG_DEV,
+ KEY_READ);
+
+ if (DevRegKey == INVALID_HANDLE_VALUE)
+ {
+ Err = GetLastError();
+ DevRegKey = NULL;
+ goto cleanup;
+ }
+
+ Err = RegOpenKeyEx(DevRegKey,
+ DEVICE_REG_SUBKEY,
+ 0,
+ KEY_QUERY_VALUE,
+ &DevOsrRegKey);
+
+ if (Err != ERROR_SUCCESS)
+ {
+ goto cleanup;
+ }
+
+ //
+ // Retrieve the registry values defined in the primary device's INF.
+ // Note that if the extension INF was applied, the extension INF would
+ // overwrite OperatingParams and create OperatingExceptions.
+ //
+ Err = RegQueryValueEx(DevOsrRegKey,
+ DEVICE_VALUE_OP_MODE,
+ NULL,
+ &ValueType,
+ (LPBYTE)OperatingMode,
+ &ValueSize);
+
+ while (Err == ERROR_MORE_DATA)
+ {
+ //
+ // Create a larger buffer.
+ //
+ OperatingMode = (PTSTR)realloc(OperatingMode, ValueSize);
+
+ Err = RegQueryValueEx(DevOsrRegKey,
+ DEVICE_VALUE_OP_MODE,
+ NULL,
+ &ValueType,
+ (LPBYTE)OperatingMode,
+ &ValueSize);
+ }
+
+ if (Err != ERROR_SUCCESS)
+ {
+ OperatingMode[0] = TEXT('\0');
+ }
+ else if ((ValueType != REG_SZ) ||
+ (ValueSize < sizeof(TCHAR)))
+ {
+ Err = ERROR_REGISTRY_CORRUPT;
+ OperatingMode[0] = TEXT('\0');
+ }
+
+ ValueSize = BUFFER_SIZE;
+
+ Err = RegQueryValueEx(DevOsrRegKey,
+ DEVICE_VALUE_OP_PARAMS,
+ NULL,
+ &ValueType,
+ (LPBYTE)OperatingParams,
+ &ValueSize);
+
+ while (Err == ERROR_MORE_DATA)
+ {
+ //
+ // Create a larger buffer.
+ //
+ OperatingParams = (PTSTR)realloc(OperatingParams, ValueSize);
+
+ Err = RegQueryValueEx(DevOsrRegKey,
+ DEVICE_VALUE_OP_MODE,
+ NULL,
+ &ValueType,
+ (LPBYTE)OperatingParams,
+ &ValueSize);
+ }
+
+ if (Err != ERROR_SUCCESS)
+ {
+ OperatingParams[0] = TEXT('\0');
+ }
+ else if ((ValueType != REG_SZ) ||
+ (ValueSize < sizeof(TCHAR)))
+ {
+ Err = ERROR_REGISTRY_CORRUPT;
+ OperatingParams[0] = TEXT('\0');
+ }
+
+ ValueSize = BUFFER_SIZE;
+
+ Err = RegQueryValueEx(DevOsrRegKey,
+ DEVICE_VALUE_OP_EXCEPTIONS,
+ NULL,
+ &ValueType,
+ (LPBYTE)OperatingExceptions,
+ &ValueSize);
+
+ while (Err == ERROR_MORE_DATA)
+ {
+ //
+ // Create a larger buffer.
+ //
+ OperatingExceptions = (PTSTR)realloc(OperatingExceptions, ValueSize);
+
+ Err = RegQueryValueEx(DevOsrRegKey,
+ DEVICE_VALUE_OP_EXCEPTIONS,
+ NULL,
+ &ValueType,
+ (LPBYTE)OperatingExceptions,
+ &ValueSize);
+ }
+
+ if (Err != ERROR_SUCCESS)
+ {
+ OperatingExceptions[0] = TEXT('\0');
+ }
+ else if ((ValueType != REG_SZ) ||
+ (ValueSize < sizeof(TCHAR)))
+ {
+ Err = ERROR_REGISTRY_CORRUPT;
+ OperatingExceptions[0] = TEXT('\0');
+ }
+
+ FileTextLength = (DWORD)wcslen(OperatingMode) +
+ (DWORD)wcslen(OperatingParams) +
+ (DWORD)wcslen(OperatingExceptions) +
+ (DWORD)wcslen(FILE_CONTENT) -
+ 9; // Subtract the 3 %ws
+
+ FileText = (PWSTR)malloc((FileTextLength + 1) * sizeof(WCHAR));
+
+ if (FileText == NULL)
+ {
+ Err = ERROR_OUTOFMEMORY;
+ goto cleanup;
+ }
+
+ hr = StringCchPrintf(FileText,
+ FileTextLength + 1,
+ FILE_CONTENT,
+ OperatingMode,
+ OperatingParams,
+ OperatingExceptions);
+
+ if (FAILED(hr))
+ {
+ Err = HRESULT_CODE(hr);
+ goto cleanup;
+ }
+
+ Err = WriteToFile(FileText, FileTextLength);
+
+ if (Err != ERROR_SUCCESS)
+ {
+ goto cleanup;
+ }
+
+cleanup:
+
+ if (FileText != NULL)
+ {
+ free(FileText);
+ }
+
+ if (OperatingExceptions != NULL)
+ {
+ free(OperatingExceptions);
+ }
+
+ if (OperatingParams != NULL)
+ {
+ free(OperatingParams);
+ }
+
+ if (OperatingMode != NULL)
+ {
+ free(OperatingMode);
+ }
+
+ if (DevOsrRegKey != NULL)
+ {
+ RegCloseKey(DevOsrRegKey);
+ }
+
+ if (DevRegKey != NULL)
+ {
+ RegCloseKey(DevRegKey);
+ }
+
+ if (DevInfoList != INVALID_HANDLE_VALUE)
+ {
+ SetupDiDestroyDeviceInfoList(DevInfoList);
+ }
+
+ return;
+}
+
diff --git a/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_componentsoftware/osrfx2_DCHU_componentsoftware.filters b/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_componentsoftware/osrfx2_DCHU_componentsoftware.filters
new file mode 100644
index 00000000..395438fa
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_componentsoftware/osrfx2_DCHU_componentsoftware.filters
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+ <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <Text Include="ReadMe.txt" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="stdafx.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="stdafx.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="osrfx2_DCHU_componentsoftware.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_componentsoftware/osrfx2_DCHU_componentsoftware.vcxproj b/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_componentsoftware/osrfx2_DCHU_componentsoftware.vcxproj
new file mode 100644
index 00000000..c9f4e88b
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_componentsoftware/osrfx2_DCHU_componentsoftware.vcxproj
@@ -0,0 +1,168 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{26D91630-B8FF-4102-A258-32F7D1C84E20}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ <RootNamespace>osrfx2_DCHU_componentsoftware</RootNamespace>
+ <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
+ <ProjectName>osrfx2_DCHU_componentsoftware</ProjectName>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v140</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>v140</PlatformToolset>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v140</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>v140</PlatformToolset>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="Shared">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <LinkIncremental>true</LinkIncremental>
+ <TargetName>$(ProjectName)</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <LinkIncremental>false</LinkIncremental>
+ <TargetName>$(ProjectName)</TargetName>
+ <TargetExt>.exe</TargetExt>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>onecoreuap.lib;setupapi.lib;</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>onecoreuap.lib;setupapi.lib;</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>onecoreuap.lib;setupapi.lib;</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>onecoreuap.lib;setupapi.lib;</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <Text Include="ReadMe.txt" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="stdafx.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="osrfx2_DCHU_componentsoftware.cpp" />
+ <ClCompile Include="stdafx.cpp">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
+ </ClCompile>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_componentsoftware/stdafx.cpp b/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_componentsoftware/stdafx.cpp
new file mode 100644
index 00000000..79325e21
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_componentsoftware/stdafx.cpp
@@ -0,0 +1,8 @@
+// stdafx.cpp : source file that includes just the standard includes
+// osrusbfx2umsoftware.pch will be the pre-compiled header
+// stdafx.obj will contain the pre-compiled type information
+
+#include "stdafx.h"
+
+// TODO: reference any additional headers you need in STDAFX.H
+// and not in this file
diff --git a/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_componentsoftware/stdafx.h b/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_componentsoftware/stdafx.h
new file mode 100644
index 00000000..edb61924
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_componentsoftware/stdafx.h
@@ -0,0 +1,18 @@
+// stdafx.h : include file for standard system include files,
+// or project specific include files that are used frequently, but
+// are changed infrequently
+//
+
+#pragma once
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <tchar.h>
+#include <Windows.h>
+#include <initguid.h>
+#include <Devpkey.h>
+#include <SetupAPI.h>
+#include <strsafe.h>
+#include <cfgmgr32.h>
+
+// TODO: reference additional headers your program requires here
diff --git a/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_componentsoftware/targetver.h b/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_componentsoftware/targetver.h
new file mode 100644
index 00000000..87c0086d
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_component/osrfx2_DCHU_componentsoftware/targetver.h
@@ -0,0 +1,8 @@
+#pragma once
+
+// Including SDKDDKVer.h defines the highest available Windows platform.
+
+// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
+// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.
+
+#include <SDKDDKVer.h>
diff --git a/general/DCHU/osrfx2_DCHU_extension/osrfx2_DCHU_extension.sln b/general/DCHU/osrfx2_DCHU_extension/osrfx2_DCHU_extension.sln
new file mode 100644
index 00000000..517da9dd
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_extension/osrfx2_DCHU_extension.sln
@@ -0,0 +1,48 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 14
+VisualStudioVersion = 14.0.25420.1
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "osrfx2_DCHU_extension", "osrfx2_DCHU_extension\osrfx2_DCHU_extension.vcxproj", "{0588DF70-3923-42E6-8DC9-13C2C0186F20}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|ARM = Debug|ARM
+ Debug|ARM64 = Debug|ARM64
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|ARM = Release|ARM
+ Release|ARM64 = Release|ARM64
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {0588DF70-3923-42E6-8DC9-13C2C0186F20}.Debug|ARM.ActiveCfg = Debug|ARM
+ {0588DF70-3923-42E6-8DC9-13C2C0186F20}.Debug|ARM.Build.0 = Debug|ARM
+ {0588DF70-3923-42E6-8DC9-13C2C0186F20}.Debug|ARM.Deploy.0 = Debug|ARM
+ {0588DF70-3923-42E6-8DC9-13C2C0186F20}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {0588DF70-3923-42E6-8DC9-13C2C0186F20}.Debug|ARM64.Build.0 = Debug|ARM64
+ {0588DF70-3923-42E6-8DC9-13C2C0186F20}.Debug|ARM64.Deploy.0 = Debug|ARM64
+ {0588DF70-3923-42E6-8DC9-13C2C0186F20}.Debug|x64.ActiveCfg = Debug|x64
+ {0588DF70-3923-42E6-8DC9-13C2C0186F20}.Debug|x64.Build.0 = Debug|x64
+ {0588DF70-3923-42E6-8DC9-13C2C0186F20}.Debug|x64.Deploy.0 = Debug|x64
+ {0588DF70-3923-42E6-8DC9-13C2C0186F20}.Debug|x86.ActiveCfg = Debug|Win32
+ {0588DF70-3923-42E6-8DC9-13C2C0186F20}.Debug|x86.Build.0 = Debug|Win32
+ {0588DF70-3923-42E6-8DC9-13C2C0186F20}.Debug|x86.Deploy.0 = Debug|Win32
+ {0588DF70-3923-42E6-8DC9-13C2C0186F20}.Release|ARM.ActiveCfg = Release|ARM
+ {0588DF70-3923-42E6-8DC9-13C2C0186F20}.Release|ARM.Build.0 = Release|ARM
+ {0588DF70-3923-42E6-8DC9-13C2C0186F20}.Release|ARM.Deploy.0 = Release|ARM
+ {0588DF70-3923-42E6-8DC9-13C2C0186F20}.Release|ARM64.ActiveCfg = Release|ARM64
+ {0588DF70-3923-42E6-8DC9-13C2C0186F20}.Release|ARM64.Build.0 = Release|ARM64
+ {0588DF70-3923-42E6-8DC9-13C2C0186F20}.Release|ARM64.Deploy.0 = Release|ARM64
+ {0588DF70-3923-42E6-8DC9-13C2C0186F20}.Release|x64.ActiveCfg = Release|x64
+ {0588DF70-3923-42E6-8DC9-13C2C0186F20}.Release|x64.Build.0 = Release|x64
+ {0588DF70-3923-42E6-8DC9-13C2C0186F20}.Release|x64.Deploy.0 = Release|x64
+ {0588DF70-3923-42E6-8DC9-13C2C0186F20}.Release|x86.ActiveCfg = Release|Win32
+ {0588DF70-3923-42E6-8DC9-13C2C0186F20}.Release|x86.Build.0 = Release|Win32
+ {0588DF70-3923-42E6-8DC9-13C2C0186F20}.Release|x86.Deploy.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/general/DCHU/osrfx2_DCHU_extension/osrfx2_DCHU_extension/osrfx2_DCHU_extension.filters b/general/DCHU/osrfx2_DCHU_extension/osrfx2_DCHU_extension/osrfx2_DCHU_extension.filters
new file mode 100644
index 00000000..0ba1a59c
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_extension/osrfx2_DCHU_extension/osrfx2_DCHU_extension.filters
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Driver Files">
+ <UniqueIdentifier>{8E41214B-6785-4CFE-B992-037D68949A14}</UniqueIdentifier>
+ <Extensions>inf;inv;inx;mof;mc;</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <Inf Include="osrfx2_DCHU_extension.inx">
+ <Filter>Driver Files</Filter>
+ </Inf>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/general/DCHU/osrfx2_DCHU_extension/osrfx2_DCHU_extension/osrfx2_DCHU_extension.inx b/general/DCHU/osrfx2_DCHU_extension/osrfx2_DCHU_extension/osrfx2_DCHU_extension.inx
new file mode 100644
index 00000000..bc81fc7f
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_extension/osrfx2_DCHU_extension/osrfx2_DCHU_extension.inx
@@ -0,0 +1,48 @@
+;/*++
+;
+;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:
+;
+; osrfx2_DCHU_extension.INF
+;
+;Abstract:
+;
+; Extension inf for the OSR FX2 Learning Kit
+;
+;--*/
+
+[Version]
+Signature = "$WINDOWS NT$"
+Class = Extension
+ClassGuid = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
+Provider = %ManufacturerName%
+ExtensionId = {3846ad8c-dd27-433d-ab89-453654cd542a}
+CatalogFile = osrfx2_DCHU_extension.cat
+DriverVer = 05/16/2017,15.14.36.721
+
+[Manufacturer]
+%ManufacturerName% = OsrFx2Extension, NT$ARCH$
+
+[OsrFx2Extension.NT$ARCH$]
+%OsrFx2.ExtensionDesc% = OsrFx2Extension_Install, USB\Vid_045e&Pid_94aa&mi_00
+%OsrFx2.ExtensionDesc% = OsrFx2Extension_Install, USB\Vid_0547&PID_1002
+
+[OsrFx2Extension_Install.NT]
+; empty
+
+[OsrFx2Extension_Install.NT.HW]
+AddReg = OsrFx2Extension_AddReg
+
+[OsrFx2Extension_AddReg]
+HKR, OSR, "OperatingParams",, "-Extended"
+HKR, OSR, "OperatingExceptions",, "x86"
+
+[Strings]
+ManufacturerName = "Contoso"
+OsrFx2.ExtensionDesc = "OsrFx2 DCHU Device Extension" \ No newline at end of file
diff --git a/general/DCHU/osrfx2_DCHU_extension/osrfx2_DCHU_extension/osrfx2_DCHU_extension.vcxproj b/general/DCHU/osrfx2_DCHU_extension/osrfx2_DCHU_extension/osrfx2_DCHU_extension.vcxproj
new file mode 100644
index 00000000..84cc35c5
--- /dev/null
+++ b/general/DCHU/osrfx2_DCHU_extension/osrfx2_DCHU_extension/osrfx2_DCHU_extension.vcxproj
@@ -0,0 +1,262 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|ARM">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM">
+ <Configuration>Release</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|ARM64">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM64">
+ <Configuration>Release</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <ItemGroup>
+ <Inf Include="osrfx2_DCHU_extension.inx" />
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{0588DF70-3923-42E6-8DC9-13C2C0186F20}</ProjectGuid>
+ <TemplateGuid>{4605da2c-74a5-4865-98e1-152ef136825f}</TemplateGuid>
+ <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+ <MinimumVisualStudioVersion>12.0</MinimumVisualStudioVersion>
+ <Configuration>Debug</Configuration>
+ <Platform Condition="'$(Platform)' == ''">Win32</Platform>
+ <RootNamespace>osrfx2_DCHU_extension</RootNamespace>
+ <ProjectName>osrfx2_DCHU_extension</ProjectName>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
+ <ConfigurationType>Utility</ConfigurationType>
+ <DriverType>Package</DriverType>
+ <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
+ <ConfigurationType>Utility</ConfigurationType>
+ <DriverType>Package</DriverType>
+ <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
+ <ConfigurationType>Utility</ConfigurationType>
+ <DriverType>Package</DriverType>
+ <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
+ <ConfigurationType>Utility</ConfigurationType>
+ <DriverType>Package</DriverType>
+ <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
+ <ConfigurationType>Utility</ConfigurationType>
+ <DriverType>Package</DriverType>
+ <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
+ <ConfigurationType>Utility</ConfigurationType>
+ <DriverType>Package</DriverType>
+ <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
+ <ConfigurationType>Utility</ConfigurationType>
+ <DriverType>Package</DriverType>
+ <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
+ <ConfigurationType>Utility</ConfigurationType>
+ <DriverType>Package</DriverType>
+ <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor>
+ <HardwareIdString />
+ <CommandLine />
+ <DeployFiles />
+ <EnableVerifier>False</EnableVerifier>
+ <AllDrivers>False</AllDrivers>
+ <VerifyProjectOutput>True</VerifyProjectOutput>
+ <VerifyDrivers />
+ <VerifyFlags>133563</VerifyFlags>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor>
+ <HardwareIdString />
+ <CommandLine />
+ <DeployFiles />
+ <EnableVerifier>False</EnableVerifier>
+ <AllDrivers>False</AllDrivers>
+ <VerifyProjectOutput>True</VerifyProjectOutput>
+ <VerifyDrivers />
+ <VerifyFlags>133563</VerifyFlags>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor>
+ <HardwareIdString />
+ <CommandLine />
+ <DeployFiles />
+ <EnableVerifier>False</EnableVerifier>
+ <AllDrivers>False</AllDrivers>
+ <VerifyProjectOutput>True</VerifyProjectOutput>
+ <VerifyDrivers />
+ <VerifyFlags>133563</VerifyFlags>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor>
+ <HardwareIdString />
+ <CommandLine />
+ <DeployFiles />
+ <EnableVerifier>False</EnableVerifier>
+ <AllDrivers>False</AllDrivers>
+ <VerifyProjectOutput>True</VerifyProjectOutput>
+ <VerifyDrivers />
+ <VerifyFlags>133563</VerifyFlags>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor>
+ <HardwareIdString />
+ <CommandLine />
+ <DeployFiles />
+ <EnableVerifier>False</EnableVerifier>
+ <AllDrivers>False</AllDrivers>
+ <VerifyProjectOutput>True</VerifyProjectOutput>
+ <VerifyDrivers />
+ <VerifyFlags>133563</VerifyFlags>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor>
+ <HardwareIdString />
+ <CommandLine />
+ <DeployFiles />
+ <EnableVerifier>False</EnableVerifier>
+ <AllDrivers>False</AllDrivers>
+ <VerifyProjectOutput>True</VerifyProjectOutput>
+ <VerifyDrivers />
+ <VerifyFlags>133563</VerifyFlags>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
+ <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor>
+ <HardwareIdString />
+ <CommandLine />
+ <DeployFiles />
+ <EnableVerifier>False</EnableVerifier>
+ <AllDrivers>False</AllDrivers>
+ <VerifyProjectOutput>True</VerifyProjectOutput>
+ <VerifyDrivers />
+ <VerifyFlags>133563</VerifyFlags>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
+ <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor>
+ <HardwareIdString />
+ <CommandLine />
+ <DeployFiles />
+ <EnableVerifier>False</EnableVerifier>
+ <AllDrivers>False</AllDrivers>
+ <VerifyProjectOutput>True</VerifyProjectOutput>
+ <VerifyDrivers />
+ <VerifyFlags>133563</VerifyFlags>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
+ <Inf>
+ <Architecture>$(InfArch)</Architecture>
+ <TimeStamp>1.0.0.0</TimeStamp>
+ </Inf>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
+ <Inf>
+ <Architecture>$(InfArch)</Architecture>
+ <TimeStamp>1.0.0.0</TimeStamp>
+ </Inf>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Inf>
+ <Architecture>$(InfArch)</Architecture>
+ <TimeStamp>1.0.0.0</TimeStamp>
+ </Inf>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Inf>
+ <Architecture>$(InfArch)</Architecture>
+ <TimeStamp>1.0.0.0</TimeStamp>
+ </Inf>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <Inf>
+ <Architecture>$(InfArch)</Architecture>
+ <TimeStamp>1.0.0.0</TimeStamp>
+ </Inf>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <Inf>
+ <Architecture>$(InfArch)</Architecture>
+ <TimeStamp>1.0.0.0</TimeStamp>
+ </Inf>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Inf>
+ <Architecture>$(InfArch)</Architecture>
+ <TimeStamp>1.0.0.0</TimeStamp>
+ </Inf>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Inf>
+ <Architecture>$(InfArch)</Architecture>
+ <TimeStamp>1.0.0.0</TimeStamp>
+ </Inf>
+ </ItemDefinitionGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file