summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke <[email protected]>2017-11-21 17:53:48 -0800
committerGitHub <[email protected]>2017-11-21 17:53:48 -0800
commit2817004092cee784d4aaf36c045fdb5b0bc09f7e (patch)
tree793ff943b8b641f95d05401156badd42da4a0f12
parentd7a7b3cfa591204c4a447a6f7c6f40db26e16f81 (diff)
parent1a3e88d788fb533d8cbea006e6fb46ff3b16dcec (diff)
Merge pull request #179 from lukangel/WinHEC
Adding WinHEC Lab Content
-rw-r--r--general/WinHEC 2017 Lab/PlugInToaster/devcon.exebin0 -> 81920 bytes
-rw-r--r--general/WinHEC 2017 Lab/PlugInToaster/plug.exebin0 -> 12848 bytes
-rw-r--r--general/WinHEC 2017 Lab/PlugInToaster/unplug.bat2
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/Service/HsaService.cpp116
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/Service/Metering.cpp148
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/Service/Metering.h29
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/Service/RpcInterface.Idl51
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/Service/RpcInterface.acf17
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/Service/RpcInterface_c.c476
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/Service/RpcInterface_h.h103
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/Service/RpcInterface_s.c430
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/Service/RpcServer.cpp320
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/Service/RpcServer.h16
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/Service/RpcServer.vcxproj284
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/Service/RpcServer.vcxproj.filters76
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/Service/SampleService.cpp155
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/Service/SampleService.h46
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/Service/ServiceBase.cpp566
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/Service/ServiceBase.h121
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/Service/ServiceInstaller.cpp191
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/Service/ServiceInstaller.h57
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/Service/stdafx.cpp8
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/Service/stdafx.h15
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/Service/targetver.h8
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/toaster.sln40
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/toaster/driver.h80
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/toaster/public.h167
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/toaster/toaster.c418
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/toaster/toaster.h134
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/toaster/toaster.inx25
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/toaster/toaster.vcxproj229
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/toaster/toaster.vcxproj.filters45
-rw-r--r--general/WinHEC 2017 Lab/Toaster Driver/toaster/trace.h62
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/App.sln40
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/CustomCapability.SCCD11
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/CustomCapability.vcxproj287
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/CustomCapability.vcxproj.filters89
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/DeviceList.cpp244
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/Package.appxmanifest41
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/RpcClient.cpp177
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/RpcClient.h30
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/RpcInterface.c6
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/RpcInterface_c.c476
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/RpcInterface_h.h112
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/RpcInterface_s.c430
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/SampleConfiguration.cpp21
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/SampleConfiguration.h47
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/Scenario1_MeteringData.xaml68
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/Scenario1_MeteringData.xaml.cpp47
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/Scenario1_MeteringData.xaml.h31
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/ServiceViewModel.cpp282
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/ServiceViewModel.h77
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/pch.cpp60
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/pch.h27
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/SharedContent/cpp/App.xaml.cpp134
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/SharedContent/cpp/App.xaml.h33
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/SharedContent/cpp/DeviceHelpers.h67
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/SharedContent/cpp/MainPage.xaml80
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/SharedContent/cpp/MainPage.xaml.cpp154
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/SharedContent/cpp/MainPage.xaml.h46
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/Square310x310Logo.pngbin0 -> 6124 bytes
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/microsoft-sdk.pngbin0 -> 3405 bytes
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/placeholder-sdk.pngbin0 -> 8991 bytes
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/placeholder.pngbin0 -> 4568 bytes
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/smalltile-sdk.pngbin0 -> 670 bytes
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/splash-sdk.pngbin0 -> 9274 bytes
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/squaretile-sdk.pngbin0 -> 1137 bytes
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/storelogo-sdk.pngbin0 -> 442 bytes
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/tile-sdk.pngbin0 -> 4852 bytes
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/windows-sdk.pngbin0 -> 2997 bytes
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/SharedContent/xaml/App.xaml34
-rw-r--r--general/WinHEC 2017 Lab/Toaster Support App/SharedContent/xaml/Styles.xaml536
-rw-r--r--general/WinHEC 2017 Lab/WinHEC 2017 Lab.docxbin0 -> 1118785 bytes
-rw-r--r--general/WinHEC 2017 Lab/WinHEC 2017 Lab.zipbin0 -> 1125330 bytes
74 files changed, 8122 insertions, 0 deletions
diff --git a/general/WinHEC 2017 Lab/PlugInToaster/devcon.exe b/general/WinHEC 2017 Lab/PlugInToaster/devcon.exe
new file mode 100644
index 00000000..92f91505
--- /dev/null
+++ b/general/WinHEC 2017 Lab/PlugInToaster/devcon.exe
Binary files differ
diff --git a/general/WinHEC 2017 Lab/PlugInToaster/plug.exe b/general/WinHEC 2017 Lab/PlugInToaster/plug.exe
new file mode 100644
index 00000000..d84aa38b
--- /dev/null
+++ b/general/WinHEC 2017 Lab/PlugInToaster/plug.exe
Binary files differ
diff --git a/general/WinHEC 2017 Lab/PlugInToaster/unplug.bat b/general/WinHEC 2017 Lab/PlugInToaster/unplug.bat
new file mode 100644
index 00000000..324ae1cf
--- /dev/null
+++ b/general/WinHEC 2017 Lab/PlugInToaster/unplug.bat
@@ -0,0 +1,2 @@
+@sc delete hsa_usersrv
+@devcon remove TOASTER\BASIC_TOASTER \ No newline at end of file
diff --git a/general/WinHEC 2017 Lab/Toaster Driver/Service/HsaService.cpp b/general/WinHEC 2017 Lab/Toaster Driver/Service/HsaService.cpp
new file mode 100644
index 00000000..d3f70fdf
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/Service/HsaService.cpp
@@ -0,0 +1,116 @@
+//*********************************************************
+//
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the MIT License (MIT).
+// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
+// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
+// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
+//
+//*********************************************************
+
+#include "stdafx.h"
+
+#pragma region Includes
+#include <stdio.h>
+#include <windows.h>
+#include "ServiceInstaller.h"
+#include "ServiceBase.h"
+#include "SampleService.h"
+#pragma endregion
+
+//
+// Settings of the service
+//
+
+// Internal name of the service
+#define SERVICE_NAME L"HsaService"
+
+// Displayed name of the service
+#define SERVICE_DISPLAY_NAME L"Hsa Sample Service"
+
+// Service start options.
+#define SERVICE_START_TYPE SERVICE_DEMAND_START
+
+// List of service dependencies - "dep1\0dep2\0\0"
+#define SERVICE_DEPENDENCIES L""
+
+// The name of the account under which the service should run - NULL uses LocalSystem account.
+#define SERVICE_ACCOUNT NULL
+
+// The password to the service account name
+#define SERVICE_PASSWORD NULL
+
+
+//
+// FUNCTION: wmain(int, wchar_t *[])
+//
+// PURPOSE: entrypoint for the application.
+//
+// PARAMETERS:
+// argc - number of command line arguments
+// argv - array of command line arguments
+//
+// RETURN VALUE:
+// none
+//
+// COMMENTS:
+// wmain() either performs the command line task, or run the service.
+//
+int wmain(_In_ int argc, _In_ wchar_t *argv[])
+{
+ bool invalidArgs = false;
+
+ if ((argc > 1) && ((*argv[1] == L'-' || (*argv[1] == L'/'))))
+ {
+ if (_wcsicmp(L"install", argv[1] + 1) == 0)
+ {
+ // Install the service when the command is
+ // "-install" or "/install".
+ InstallService(
+ SERVICE_NAME, // Name of service
+ SERVICE_DISPLAY_NAME, // Name to display
+ SERVICE_START_TYPE, // Service start type
+ SERVICE_DEPENDENCIES, // Dependencies
+ SERVICE_ACCOUNT, // Service running account
+ SERVICE_PASSWORD // Password of the account
+ );
+ }
+ else if (_wcsicmp(L"remove", argv[1] + 1) == 0)
+ {
+ // Uninstall the service when the command is
+ // "-remove" or "/remove".
+ UninstallService(SERVICE_NAME);
+ }
+ else if (_wcsicmp(L"console", argv[1] + 1) == 0)
+ {
+ // Uninstall the service when the command is
+ // "-remove" or "/remove".
+ CSampleService service(SERVICE_NAME);
+ service.ConsoleRun();
+ }
+ else
+ {
+ invalidArgs = true;
+ }
+ }
+ else
+ {
+ invalidArgs = true;
+ CSampleService service(SERVICE_NAME);
+ if (!CServiceBase::Run(service))
+ {
+ wprintf(L"Service failed to run w/err 0x%08lx\n", GetLastError());
+ }
+ }
+
+ if (invalidArgs)
+ {
+ wprintf(L"Parameters:\n");
+ wprintf(L" -install to install the service.\n");
+ wprintf(L" -remove to remove the service.\n");
+ wprintf(L" -console to run in console mode.\n");
+ }
+
+ return 0;
+} \ No newline at end of file
diff --git a/general/WinHEC 2017 Lab/Toaster Driver/Service/Metering.cpp b/general/WinHEC 2017 Lab/Toaster Driver/Service/Metering.cpp
new file mode 100644
index 00000000..1766b37c
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/Service/Metering.cpp
@@ -0,0 +1,148 @@
+//*********************************************************
+//
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the MIT License (MIT).
+// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
+// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
+// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
+//
+//*********************************************************
+
+#include "stdafx.h"
+#include "Metering.h"
+#include <assert.h>
+#include "RpcInterface_h.h"
+
+using namespace RpcServer;
+
+//
+// Thread pool callback method for metering worker
+//
+void CALLBACK MeteringWorkerTpCallback(
+ _In_ PTP_CALLBACK_INSTANCE /*iTimerInstance*/,
+ _In_ PVOID pContext,
+ _In_ PTP_TIMER /*pTimer*/)
+{
+ Metering *metering = static_cast<Metering *>(pContext);
+
+ if (metering != nullptr)
+ {
+ // Run the metering worker for this instance of metering
+ metering->MeteringWorker();
+ }
+}
+
+//
+// ctor for Metering
+//
+Metering::Metering(
+ _In_ __int64 period)
+{
+ tpTimer = CreateThreadpoolTimer(::MeteringWorkerTpCallback, this, nullptr);
+ // TODO: Handle if CreateThreadpoolTimer fails i.e tpTimer == nullptr
+
+ samplePeriod = period;
+ event = CreateEvent(
+ nullptr, // default security attributes
+ FALSE, // auto-reset event object
+ FALSE, // initial state is nonsignaled
+ nullptr); // unnamed object
+}
+
+//
+// dtor for Metering
+//
+Metering::~Metering()
+{
+ if (tpTimer != nullptr)
+ {
+ // How to close threadpool timer when there are outstanding callbacks:
+ // https://msdn.microsoft.com/en-us/library/windows/desktop/ms682040(v=vs.85).aspx
+ SetThreadpoolTimer(tpTimer, nullptr, 0, 0);
+ WaitForThreadpoolTimerCallbacks(tpTimer, true);
+ CloseThreadpoolTimer(tpTimer);
+ tpTimer = nullptr;
+ }
+ CloseHandle(event);
+}
+
+//
+// Set the lowest sample period
+//
+void Metering::SetSamplePeriod(_In_ __int64 period)
+{
+ if (period < 1)
+ {
+ // Don't allow 0 (too fast) or negative numbers.
+ period = 1;
+ }
+ if (period > 1000)
+ {
+ // Don't let the period be too long, or we will be
+ // slow to shut down.
+ period = 1000;
+ }
+ samplePeriod = period;
+}
+
+//
+// Get last known metering data
+//
+__int64 Metering::GetMeteringData() const
+{
+ return _data;
+}
+
+//
+// Metering worker that updates metering data
+//
+void Metering::MeteringWorker()
+{
+ // Get the value from the imaginary driver and update the data
+ _data = GetTickCount();
+ SetEvent(event);
+}
+
+//
+// Set the thread poot timer and wait for metering data.
+//
+void Metering::WaitForMeteringData() const
+{
+ ULARGE_INTEGER ulDueTime;
+ FILETIME FileDueTime;
+ ulDueTime.QuadPart = static_cast<ULONGLONG>(-(1 * 10 * 1000 * samplePeriod));
+ FileDueTime.dwHighDateTime = ulDueTime.HighPart;
+ FileDueTime.dwLowDateTime = ulDueTime.LowPart;
+
+ SetThreadpoolTimer(tpTimer,
+ &FileDueTime,
+ 0,
+ 0);
+
+ WaitForSingleObject(event, INFINITE);
+}
+
+void Metering::StartMetering(
+ _In_ __int64 samplePeriod,
+ _In_ __int64 context)
+{
+ stopMeteringRequested = false;
+ SetSamplePeriod(samplePeriod);
+
+ while (true)
+ {
+ WaitForMeteringData();
+ if (stopMeteringRequested || ShutdownRequested)
+ {
+ break;
+ }
+ MeteringDataEvent(GetMeteringData(), context);
+ }
+}
+
+void Metering::StopMetering()
+{
+ stopMeteringRequested = true;
+}
+
diff --git a/general/WinHEC 2017 Lab/Toaster Driver/Service/Metering.h b/general/WinHEC 2017 Lab/Toaster Driver/Service/Metering.h
new file mode 100644
index 00000000..bfb48216
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/Service/Metering.h
@@ -0,0 +1,29 @@
+#include "stdafx.h"
+#include <windows.h>
+
+#include <iostream> // std::cout
+#include <thread> // std::thread
+#include <mutex>
+
+namespace RpcServer
+{
+ class Metering
+ {
+ public:
+ Metering(__int64 period);
+ void SetSamplePeriod(__int64 period);
+ __int64 GetMeteringData() const;
+ void MeteringWorker();
+ void WaitForMeteringData() const;
+ void StartMetering(__int64 samplePeriod, __int64 context);
+ void StopMetering();
+ ~Metering();
+
+ private:
+ volatile __int64 _data;
+ volatile __int64 samplePeriod;
+ PTP_TIMER tpTimer = nullptr;
+ HANDLE event;
+ volatile bool stopMeteringRequested = false;
+ };
+}
diff --git a/general/WinHEC 2017 Lab/Toaster Driver/Service/RpcInterface.Idl b/general/WinHEC 2017 Lab/Toaster Driver/Service/RpcInterface.Idl
new file mode 100644
index 00000000..1b4b74cc
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/Service/RpcInterface.Idl
@@ -0,0 +1,51 @@
+//*********************************************************
+//
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the MIT License (MIT).
+// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
+// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
+// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
+//
+//*********************************************************
+
+import "oaidl.idl";
+import "unknwn.idl";
+
+[uuid (906B0CE0-C70B-1067-B317-00DD010662DA),
+version(1.0),
+pointer_default(unique),
+]
+interface RpcInterface
+{
+
+ // context_handle_noserialize in acf for RPC to call rundown when the client goes away
+ typedef [context_handle] void* PCONTEXT_HANDLE_TYPE;
+ typedef [ref] PCONTEXT_HANDLE_TYPE * PPCONTEXT_HANDLE_TYPE;
+
+ //
+ // RPC methods to retrieve/clean client context
+ //
+ void RemoteOpen([in] handle_t hBinding,
+ [out] PPCONTEXT_HANDLE_TYPE pphContext);
+
+ void RemoteClose([in, out] PPCONTEXT_HANDLE_TYPE pphContext);
+
+ //
+ // Metering Interface
+ //
+ void StartMetering(
+ [in] PCONTEXT_HANDLE_TYPE phContext,
+ [in] __int64 samplePeriod,
+ [in, optional] __int64 context);
+
+ void SetSamplePeriod(
+ [in] PCONTEXT_HANDLE_TYPE phContext,
+ [in] __int64 samplePeriod);
+
+ void StopMetering([in] PCONTEXT_HANDLE_TYPE phContext);
+
+ [callback] void MeteringDataEvent(
+ [in] __int64 data,
+ [in, optional] __int64 context);
+}
diff --git a/general/WinHEC 2017 Lab/Toaster Driver/Service/RpcInterface.acf b/general/WinHEC 2017 Lab/Toaster Driver/Service/RpcInterface.acf
new file mode 100644
index 00000000..d00ed5af
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/Service/RpcInterface.acf
@@ -0,0 +1,17 @@
+//*********************************************************
+//
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the Microsoft Public License.
+// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
+// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
+// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
+//
+//*********************************************************
+
+
+interface RpcInterface
+{
+ // We need the RPC to call rundown when the client goes away
+ typedef [context_handle_noserialize] PCONTEXT_HANDLE_TYPE;
+}
diff --git a/general/WinHEC 2017 Lab/Toaster Driver/Service/RpcInterface_c.c b/general/WinHEC 2017 Lab/Toaster Driver/Service/RpcInterface_c.c
new file mode 100644
index 00000000..fbe0a799
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/Service/RpcInterface_c.c
@@ -0,0 +1,476 @@
+
+
+/* this ALWAYS GENERATED file contains the RPC client stubs */
+
+
+ /* File created by MIDL compiler version 8.01.0622 */
+/* at Mon Jan 18 19:14:07 2038
+ */
+/* Compiler settings for RpcInterface.Idl:
+ Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622
+ protocol : dce , ms_ext, c_ext, robust
+ error checks: allocation ref bounds_check enum stub_data
+ VC __declspec() decoration level:
+ __declspec(uuid()), __declspec(selectany), __declspec(novtable)
+ DECLSPEC_UUID(), MIDL_INTERFACE()
+*/
+/* @@MIDL_FILE_HEADING( ) */
+
+#if defined(_M_AMD64)
+
+
+#pragma warning( disable: 4049 ) /* more than 64k source lines */
+#if _MSC_VER >= 1200
+#pragma warning(push)
+#endif
+
+#pragma warning( disable: 4211 ) /* redefine extern to static */
+#pragma warning( disable: 4232 ) /* dllimport identity*/
+#pragma warning( disable: 4024 ) /* array to pointer mapping*/
+
+#include <string.h>
+
+#include "RpcInterface_h.h"
+
+#define TYPE_FORMAT_STRING_SIZE 23
+#define PROC_FORMAT_STRING_SIZE 245
+#define EXPR_FORMAT_STRING_SIZE 1
+#define TRANSMIT_AS_TABLE_SIZE 0
+#define WIRE_MARSHAL_TABLE_SIZE 0
+
+typedef struct _RpcInterface_MIDL_TYPE_FORMAT_STRING
+ {
+ short Pad;
+ unsigned char Format[ TYPE_FORMAT_STRING_SIZE ];
+ } RpcInterface_MIDL_TYPE_FORMAT_STRING;
+
+typedef struct _RpcInterface_MIDL_PROC_FORMAT_STRING
+ {
+ short Pad;
+ unsigned char Format[ PROC_FORMAT_STRING_SIZE ];
+ } RpcInterface_MIDL_PROC_FORMAT_STRING;
+
+typedef struct _RpcInterface_MIDL_EXPR_FORMAT_STRING
+ {
+ long Pad;
+ unsigned char Format[ EXPR_FORMAT_STRING_SIZE ];
+ } RpcInterface_MIDL_EXPR_FORMAT_STRING;
+
+
+static const RPC_SYNTAX_IDENTIFIER _RpcTransferSyntax =
+{{0x8A885D04,0x1CEB,0x11C9,{0x9F,0xE8,0x08,0x00,0x2B,0x10,0x48,0x60}},{2,0}};
+
+
+extern const RpcInterface_MIDL_TYPE_FORMAT_STRING RpcInterface__MIDL_TypeFormatString;
+extern const RpcInterface_MIDL_PROC_FORMAT_STRING RpcInterface__MIDL_ProcFormatString;
+extern const RpcInterface_MIDL_EXPR_FORMAT_STRING RpcInterface__MIDL_ExprFormatString;
+
+#define GENERIC_BINDING_TABLE_SIZE 0
+
+
+/* Standard interface: RpcInterface, ver. 1.0,
+ GUID={0x906B0CE0,0xC70B,0x1067,{0xB3,0x17,0x00,0xDD,0x01,0x06,0x62,0xDA}} */
+
+
+extern const MIDL_SERVER_INFO RpcInterface_ServerInfo;
+
+
+extern const RPC_DISPATCH_TABLE RpcInterface_v1_0_DispatchTable;
+
+static const RPC_CLIENT_INTERFACE RpcInterface___RpcClientInterface =
+ {
+ sizeof(RPC_CLIENT_INTERFACE),
+ {{0x906B0CE0,0xC70B,0x1067,{0xB3,0x17,0x00,0xDD,0x01,0x06,0x62,0xDA}},{1,0}},
+ {{0x8A885D04,0x1CEB,0x11C9,{0x9F,0xE8,0x08,0x00,0x2B,0x10,0x48,0x60}},{2,0}},
+ (RPC_DISPATCH_TABLE*)&RpcInterface_v1_0_DispatchTable,
+ 0,
+ 0,
+ 0,
+ &RpcInterface_ServerInfo,
+ 0x04000000
+ };
+RPC_IF_HANDLE RpcInterface_v1_0_c_ifspec = (RPC_IF_HANDLE)& RpcInterface___RpcClientInterface;
+
+extern const MIDL_STUB_DESC RpcInterface_StubDesc;
+
+static RPC_BINDING_HANDLE RpcInterface__MIDL_AutoBindHandle;
+
+
+void RemoteOpen(
+ /* [in] */ handle_t hBinding,
+ /* [out] */ PPCONTEXT_HANDLE_TYPE pphContext)
+{
+
+ NdrClientCall2(
+ ( PMIDL_STUB_DESC )&RpcInterface_StubDesc,
+ (PFORMAT_STRING) &RpcInterface__MIDL_ProcFormatString.Format[0],
+ hBinding,
+ pphContext);
+
+}
+
+
+void RemoteClose(
+ /* [out][in] */ PPCONTEXT_HANDLE_TYPE pphContext)
+{
+
+ NdrClientCall2(
+ ( PMIDL_STUB_DESC )&RpcInterface_StubDesc,
+ (PFORMAT_STRING) &RpcInterface__MIDL_ProcFormatString.Format[36],
+ pphContext);
+
+}
+
+
+void StartMetering(
+ /* [in] */ PCONTEXT_HANDLE_TYPE phContext,
+ /* [in] */ __int64 samplePeriod,
+ /* [optional][in] */ __int64 context)
+{
+
+ NdrClientCall2(
+ ( PMIDL_STUB_DESC )&RpcInterface_StubDesc,
+ (PFORMAT_STRING) &RpcInterface__MIDL_ProcFormatString.Format[74],
+ phContext,
+ samplePeriod,
+ context);
+
+}
+
+
+void SetSamplePeriod(
+ /* [in] */ PCONTEXT_HANDLE_TYPE phContext,
+ /* [in] */ __int64 samplePeriod)
+{
+
+ NdrClientCall2(
+ ( PMIDL_STUB_DESC )&RpcInterface_StubDesc,
+ (PFORMAT_STRING) &RpcInterface__MIDL_ProcFormatString.Format[124],
+ phContext,
+ samplePeriod);
+
+}
+
+
+void StopMetering(
+ /* [in] */ PCONTEXT_HANDLE_TYPE phContext)
+{
+
+ NdrClientCall2(
+ ( PMIDL_STUB_DESC )&RpcInterface_StubDesc,
+ (PFORMAT_STRING) &RpcInterface__MIDL_ProcFormatString.Format[168],
+ phContext);
+
+}
+
+
+#if !defined(__RPC_WIN64__)
+#error Invalid build platform for this stub.
+#endif
+
+static const RpcInterface_MIDL_PROC_FORMAT_STRING RpcInterface__MIDL_ProcFormatString =
+ {
+ 0,
+ {
+
+ /* Procedure RemoteOpen */
+
+ 0x0, /* 0 */
+ 0x48, /* Old Flags: */
+/* 2 */ NdrFcLong( 0x0 ), /* 0 */
+/* 6 */ NdrFcShort( 0x0 ), /* 0 */
+/* 8 */ NdrFcShort( 0x10 ), /* X64 Stack size/offset = 16 */
+/* 10 */ 0x32, /* FC_BIND_PRIMITIVE */
+ 0x0, /* 0 */
+/* 12 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 14 */ NdrFcShort( 0x0 ), /* 0 */
+/* 16 */ NdrFcShort( 0x38 ), /* 56 */
+/* 18 */ 0x40, /* Oi2 Flags: has ext, */
+ 0x1, /* 1 */
+/* 20 */ 0xa, /* 10 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 22 */ NdrFcShort( 0x0 ), /* 0 */
+/* 24 */ NdrFcShort( 0x0 ), /* 0 */
+/* 26 */ NdrFcShort( 0x0 ), /* 0 */
+/* 28 */ NdrFcShort( 0x0 ), /* 0 */
+
+ /* Parameter pphContext */
+
+/* 30 */ NdrFcShort( 0x110 ), /* Flags: out, simple ref, */
+/* 32 */ NdrFcShort( 0x8 ), /* X64 Stack size/offset = 8 */
+/* 34 */ NdrFcShort( 0x6 ), /* Type Offset=6 */
+
+ /* Procedure RemoteClose */
+
+/* 36 */ 0x0, /* 0 */
+ 0x48, /* Old Flags: */
+/* 38 */ NdrFcLong( 0x0 ), /* 0 */
+/* 42 */ NdrFcShort( 0x1 ), /* 1 */
+/* 44 */ NdrFcShort( 0x8 ), /* X64 Stack size/offset = 8 */
+/* 46 */ 0x30, /* FC_BIND_CONTEXT */
+ 0xe4, /* Ctxt flags: via ptr, in, out, no serialize, */
+/* 48 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 50 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+/* 52 */ NdrFcShort( 0x38 ), /* 56 */
+/* 54 */ NdrFcShort( 0x38 ), /* 56 */
+/* 56 */ 0x40, /* Oi2 Flags: has ext, */
+ 0x1, /* 1 */
+/* 58 */ 0xa, /* 10 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 60 */ NdrFcShort( 0x0 ), /* 0 */
+/* 62 */ NdrFcShort( 0x0 ), /* 0 */
+/* 64 */ NdrFcShort( 0x0 ), /* 0 */
+/* 66 */ NdrFcShort( 0x0 ), /* 0 */
+
+ /* Parameter pphContext */
+
+/* 68 */ NdrFcShort( 0x118 ), /* Flags: in, out, simple ref, */
+/* 70 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 72 */ NdrFcShort( 0xe ), /* Type Offset=14 */
+
+ /* Procedure StartMetering */
+
+/* 74 */ 0x0, /* 0 */
+ 0x48, /* Old Flags: */
+/* 76 */ NdrFcLong( 0x0 ), /* 0 */
+/* 80 */ NdrFcShort( 0x2 ), /* 2 */
+/* 82 */ NdrFcShort( 0x18 ), /* X64 Stack size/offset = 24 */
+/* 84 */ 0x30, /* FC_BIND_CONTEXT */
+ 0x44, /* Ctxt flags: in, no serialize, */
+/* 86 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 88 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+/* 90 */ NdrFcShort( 0x44 ), /* 68 */
+/* 92 */ NdrFcShort( 0x0 ), /* 0 */
+/* 94 */ 0x40, /* Oi2 Flags: has ext, */
+ 0x3, /* 3 */
+/* 96 */ 0xa, /* 10 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 98 */ NdrFcShort( 0x0 ), /* 0 */
+/* 100 */ NdrFcShort( 0x0 ), /* 0 */
+/* 102 */ NdrFcShort( 0x0 ), /* 0 */
+/* 104 */ NdrFcShort( 0x0 ), /* 0 */
+
+ /* Parameter phContext */
+
+/* 106 */ NdrFcShort( 0x8 ), /* Flags: in, */
+/* 108 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 110 */ NdrFcShort( 0x12 ), /* Type Offset=18 */
+
+ /* Parameter samplePeriod */
+
+/* 112 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 114 */ NdrFcShort( 0x8 ), /* X64 Stack size/offset = 8 */
+/* 116 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Parameter context */
+
+/* 118 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 120 */ NdrFcShort( 0x10 ), /* X64 Stack size/offset = 16 */
+/* 122 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Procedure SetSamplePeriod */
+
+/* 124 */ 0x0, /* 0 */
+ 0x48, /* Old Flags: */
+/* 126 */ NdrFcLong( 0x0 ), /* 0 */
+/* 130 */ NdrFcShort( 0x3 ), /* 3 */
+/* 132 */ NdrFcShort( 0x10 ), /* X64 Stack size/offset = 16 */
+/* 134 */ 0x30, /* FC_BIND_CONTEXT */
+ 0x44, /* Ctxt flags: in, no serialize, */
+/* 136 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 138 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+/* 140 */ NdrFcShort( 0x34 ), /* 52 */
+/* 142 */ NdrFcShort( 0x0 ), /* 0 */
+/* 144 */ 0x40, /* Oi2 Flags: has ext, */
+ 0x2, /* 2 */
+/* 146 */ 0xa, /* 10 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 148 */ NdrFcShort( 0x0 ), /* 0 */
+/* 150 */ NdrFcShort( 0x0 ), /* 0 */
+/* 152 */ NdrFcShort( 0x0 ), /* 0 */
+/* 154 */ NdrFcShort( 0x0 ), /* 0 */
+
+ /* Parameter phContext */
+
+/* 156 */ NdrFcShort( 0x8 ), /* Flags: in, */
+/* 158 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 160 */ NdrFcShort( 0x12 ), /* Type Offset=18 */
+
+ /* Parameter samplePeriod */
+
+/* 162 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 164 */ NdrFcShort( 0x8 ), /* X64 Stack size/offset = 8 */
+/* 166 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Procedure StopMetering */
+
+/* 168 */ 0x0, /* 0 */
+ 0x48, /* Old Flags: */
+/* 170 */ NdrFcLong( 0x0 ), /* 0 */
+/* 174 */ NdrFcShort( 0x4 ), /* 4 */
+/* 176 */ NdrFcShort( 0x8 ), /* X64 Stack size/offset = 8 */
+/* 178 */ 0x30, /* FC_BIND_CONTEXT */
+ 0x44, /* Ctxt flags: in, no serialize, */
+/* 180 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 182 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+/* 184 */ NdrFcShort( 0x24 ), /* 36 */
+/* 186 */ NdrFcShort( 0x0 ), /* 0 */
+/* 188 */ 0x40, /* Oi2 Flags: has ext, */
+ 0x1, /* 1 */
+/* 190 */ 0xa, /* 10 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 192 */ NdrFcShort( 0x0 ), /* 0 */
+/* 194 */ NdrFcShort( 0x0 ), /* 0 */
+/* 196 */ NdrFcShort( 0x0 ), /* 0 */
+/* 198 */ NdrFcShort( 0x0 ), /* 0 */
+
+ /* Parameter phContext */
+
+/* 200 */ NdrFcShort( 0x8 ), /* Flags: in, */
+/* 202 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 204 */ NdrFcShort( 0x12 ), /* Type Offset=18 */
+
+ /* Procedure MeteringDataEvent */
+
+/* 206 */ 0x34, /* FC_CALLBACK_HANDLE */
+ 0x48, /* Old Flags: */
+/* 208 */ NdrFcLong( 0x0 ), /* 0 */
+/* 212 */ NdrFcShort( 0x0 ), /* 0 */
+/* 214 */ NdrFcShort( 0x10 ), /* X64 Stack size/offset = 16 */
+/* 216 */ NdrFcShort( 0x20 ), /* 32 */
+/* 218 */ NdrFcShort( 0x0 ), /* 0 */
+/* 220 */ 0x40, /* Oi2 Flags: has ext, */
+ 0x2, /* 2 */
+/* 222 */ 0xa, /* 10 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 224 */ NdrFcShort( 0x0 ), /* 0 */
+/* 226 */ NdrFcShort( 0x0 ), /* 0 */
+/* 228 */ NdrFcShort( 0x0 ), /* 0 */
+/* 230 */ NdrFcShort( 0x0 ), /* 0 */
+
+ /* Parameter data */
+
+/* 232 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 234 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 236 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Parameter context */
+
+/* 238 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 240 */ NdrFcShort( 0x8 ), /* X64 Stack size/offset = 8 */
+/* 242 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ 0x0
+ }
+ };
+
+static const RpcInterface_MIDL_TYPE_FORMAT_STRING RpcInterface__MIDL_TypeFormatString =
+ {
+ 0,
+ {
+ NdrFcShort( 0x0 ), /* 0 */
+/* 2 */
+ 0x11, 0x4, /* FC_RP [alloced_on_stack] */
+/* 4 */ NdrFcShort( 0x2 ), /* Offset= 2 (6) */
+/* 6 */ 0x30, /* FC_BIND_CONTEXT */
+ 0xa4, /* Ctxt flags: via ptr, out, no serialize, */
+/* 8 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+/* 10 */
+ 0x11, 0x4, /* FC_RP [alloced_on_stack] */
+/* 12 */ NdrFcShort( 0x2 ), /* Offset= 2 (14) */
+/* 14 */ 0x30, /* FC_BIND_CONTEXT */
+ 0xe5, /* Ctxt flags: via ptr, in, out, no serialize, can't be null */
+/* 16 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+/* 18 */ 0x30, /* FC_BIND_CONTEXT */
+ 0x45, /* Ctxt flags: in, no serialize, can't be null */
+/* 20 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+
+ 0x0
+ }
+ };
+
+static const unsigned short RpcInterface_FormatStringOffsetTable[] =
+ {
+ 0,
+ 36,
+ 74,
+ 124,
+ 168,
+ };
+
+
+static const unsigned short _callbackRpcInterface_FormatStringOffsetTable[] =
+ {
+ 206
+ };
+
+
+static const MIDL_STUB_DESC RpcInterface_StubDesc =
+ {
+ (void *)& RpcInterface___RpcClientInterface,
+ MIDL_user_allocate,
+ MIDL_user_free,
+ &RpcInterface__MIDL_AutoBindHandle,
+ 0,
+ 0,
+ 0,
+ 0,
+ RpcInterface__MIDL_TypeFormatString.Format,
+ 1, /* -error bounds_check flag */
+ 0x50002, /* Ndr library version */
+ 0,
+ 0x801026e, /* MIDL Version 8.1.622 */
+ 0,
+ 0,
+ 0, /* notify & notify_flag routine table */
+ 0x1, /* MIDL flag */
+ 0, /* cs routines */
+ 0, /* proxy/server info */
+ 0
+ };
+
+static const RPC_DISPATCH_FUNCTION RpcInterface_table[] =
+ {
+ NdrServerCall2,
+ 0
+ };
+static const RPC_DISPATCH_TABLE RpcInterface_v1_0_DispatchTable =
+ {
+ 1,
+ (RPC_DISPATCH_FUNCTION*)RpcInterface_table
+ };
+
+static const SERVER_ROUTINE RpcInterface_ServerRoutineTable[] =
+ {
+ (SERVER_ROUTINE)MeteringDataEvent
+ };
+
+static const MIDL_SERVER_INFO RpcInterface_ServerInfo =
+ {
+ &RpcInterface_StubDesc,
+ RpcInterface_ServerRoutineTable,
+ RpcInterface__MIDL_ProcFormatString.Format,
+ _callbackRpcInterface_FormatStringOffsetTable,
+ 0,
+ 0,
+ 0,
+ 0};
+#if _MSC_VER >= 1200
+#pragma warning(pop)
+#endif
+
+
+#endif /* defined(_M_AMD64)*/
+
diff --git a/general/WinHEC 2017 Lab/Toaster Driver/Service/RpcInterface_h.h b/general/WinHEC 2017 Lab/Toaster Driver/Service/RpcInterface_h.h
new file mode 100644
index 00000000..98544da7
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/Service/RpcInterface_h.h
@@ -0,0 +1,103 @@
+
+
+/* this ALWAYS GENERATED file contains the definitions for the interfaces */
+
+
+ /* File created by MIDL compiler version 8.01.0622 */
+/* at Mon Jan 18 19:14:07 2038
+ */
+/* Compiler settings for RpcInterface.Idl:
+ Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622
+ protocol : dce , ms_ext, c_ext, robust
+ error checks: allocation ref bounds_check enum stub_data
+ VC __declspec() decoration level:
+ __declspec(uuid()), __declspec(selectany), __declspec(novtable)
+ DECLSPEC_UUID(), MIDL_INTERFACE()
+*/
+/* @@MIDL_FILE_HEADING( ) */
+
+#pragma warning( disable: 4049 ) /* more than 64k source lines */
+
+
+/* verify that the <rpcndr.h> version is high enough to compile this file*/
+#ifndef __REQUIRED_RPCNDR_H_VERSION__
+#define __REQUIRED_RPCNDR_H_VERSION__ 475
+#endif
+
+#include "rpc.h"
+#include "rpcndr.h"
+
+#ifndef __RPCNDR_H_VERSION__
+#error this stub requires an updated version of <rpcndr.h>
+#endif /* __RPCNDR_H_VERSION__ */
+
+
+#ifndef __RpcInterface_h_h__
+#define __RpcInterface_h_h__
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+#pragma once
+#endif
+
+/* Forward Declarations */
+
+/* header files for imported files */
+#include "oaidl.h"
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+
+#ifndef __RpcInterface_INTERFACE_DEFINED__
+#define __RpcInterface_INTERFACE_DEFINED__
+
+/* interface RpcInterface */
+/* [unique][version][uuid] */
+
+typedef /* [context_handle_noserialize][context_handle] */ void *PCONTEXT_HANDLE_TYPE;
+
+typedef /* [ref] */ PCONTEXT_HANDLE_TYPE *PPCONTEXT_HANDLE_TYPE;
+
+void RemoteOpen(
+ /* [in] */ handle_t hBinding,
+ /* [out] */ PPCONTEXT_HANDLE_TYPE pphContext);
+
+void RemoteClose(
+ /* [out][in] */ PPCONTEXT_HANDLE_TYPE pphContext);
+
+void StartMetering(
+ /* [in] */ PCONTEXT_HANDLE_TYPE phContext,
+ /* [in] */ __int64 samplePeriod,
+ /* [optional][in] */ __int64 context);
+
+void SetSamplePeriod(
+ /* [in] */ PCONTEXT_HANDLE_TYPE phContext,
+ /* [in] */ __int64 samplePeriod);
+
+void StopMetering(
+ /* [in] */ PCONTEXT_HANDLE_TYPE phContext);
+
+/* [callback] */ void MeteringDataEvent(
+ /* [in] */ __int64 data,
+ /* [optional][in] */ __int64 context);
+
+
+
+extern RPC_IF_HANDLE RpcInterface_v1_0_c_ifspec;
+extern RPC_IF_HANDLE RpcInterface_v1_0_s_ifspec;
+#endif /* __RpcInterface_INTERFACE_DEFINED__ */
+
+/* Additional Prototypes for ALL interfaces */
+
+void __RPC_USER PCONTEXT_HANDLE_TYPE_rundown( PCONTEXT_HANDLE_TYPE );
+
+/* end of Additional Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
diff --git a/general/WinHEC 2017 Lab/Toaster Driver/Service/RpcInterface_s.c b/general/WinHEC 2017 Lab/Toaster Driver/Service/RpcInterface_s.c
new file mode 100644
index 00000000..89aa59bf
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/Service/RpcInterface_s.c
@@ -0,0 +1,430 @@
+
+
+/* this ALWAYS GENERATED file contains the RPC server stubs */
+
+
+ /* File created by MIDL compiler version 8.01.0622 */
+/* at Mon Jan 18 19:14:07 2038
+ */
+/* Compiler settings for RpcInterface.Idl:
+ Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622
+ protocol : dce , ms_ext, c_ext, robust
+ error checks: allocation ref bounds_check enum stub_data
+ VC __declspec() decoration level:
+ __declspec(uuid()), __declspec(selectany), __declspec(novtable)
+ DECLSPEC_UUID(), MIDL_INTERFACE()
+*/
+/* @@MIDL_FILE_HEADING( ) */
+
+#if defined(_M_AMD64)
+
+
+#pragma warning( disable: 4049 ) /* more than 64k source lines */
+#if _MSC_VER >= 1200
+#pragma warning(push)
+#endif
+
+#pragma warning( disable: 4211 ) /* redefine extern to static */
+#pragma warning( disable: 4232 ) /* dllimport identity*/
+#pragma warning( disable: 4024 ) /* array to pointer mapping*/
+
+#include <string.h>
+#include "RpcInterface_h.h"
+
+#define TYPE_FORMAT_STRING_SIZE 23
+#define PROC_FORMAT_STRING_SIZE 245
+#define EXPR_FORMAT_STRING_SIZE 1
+#define TRANSMIT_AS_TABLE_SIZE 0
+#define WIRE_MARSHAL_TABLE_SIZE 0
+
+typedef struct _RpcInterface_MIDL_TYPE_FORMAT_STRING
+ {
+ short Pad;
+ unsigned char Format[ TYPE_FORMAT_STRING_SIZE ];
+ } RpcInterface_MIDL_TYPE_FORMAT_STRING;
+
+typedef struct _RpcInterface_MIDL_PROC_FORMAT_STRING
+ {
+ short Pad;
+ unsigned char Format[ PROC_FORMAT_STRING_SIZE ];
+ } RpcInterface_MIDL_PROC_FORMAT_STRING;
+
+typedef struct _RpcInterface_MIDL_EXPR_FORMAT_STRING
+ {
+ long Pad;
+ unsigned char Format[ EXPR_FORMAT_STRING_SIZE ];
+ } RpcInterface_MIDL_EXPR_FORMAT_STRING;
+
+
+static const RPC_SYNTAX_IDENTIFIER _RpcTransferSyntax =
+{{0x8A885D04,0x1CEB,0x11C9,{0x9F,0xE8,0x08,0x00,0x2B,0x10,0x48,0x60}},{2,0}};
+
+extern const RpcInterface_MIDL_TYPE_FORMAT_STRING RpcInterface__MIDL_TypeFormatString;
+extern const RpcInterface_MIDL_PROC_FORMAT_STRING RpcInterface__MIDL_ProcFormatString;
+extern const RpcInterface_MIDL_EXPR_FORMAT_STRING RpcInterface__MIDL_ExprFormatString;
+
+/* Standard interface: RpcInterface, ver. 1.0,
+ GUID={0x906B0CE0,0xC70B,0x1067,{0xB3,0x17,0x00,0xDD,0x01,0x06,0x62,0xDA}} */
+
+
+extern const MIDL_SERVER_INFO RpcInterface_ServerInfo;
+
+extern const RPC_DISPATCH_TABLE RpcInterface_v1_0_DispatchTable;
+
+static const RPC_SERVER_INTERFACE RpcInterface___RpcServerInterface =
+ {
+ sizeof(RPC_SERVER_INTERFACE),
+ {{0x906B0CE0,0xC70B,0x1067,{0xB3,0x17,0x00,0xDD,0x01,0x06,0x62,0xDA}},{1,0}},
+ {{0x8A885D04,0x1CEB,0x11C9,{0x9F,0xE8,0x08,0x00,0x2B,0x10,0x48,0x60}},{2,0}},
+ (RPC_DISPATCH_TABLE*)&RpcInterface_v1_0_DispatchTable,
+ 0,
+ 0,
+ 0,
+ &RpcInterface_ServerInfo,
+ 0x04000000
+ };
+RPC_IF_HANDLE RpcInterface_v1_0_s_ifspec = (RPC_IF_HANDLE)& RpcInterface___RpcServerInterface;
+
+extern const MIDL_STUB_DESC RpcInterface_StubDesc;
+
+ extern const MIDL_STUBLESS_PROXY_INFO RpcInterface_ProxyInfo;
+
+/* [callback] */ void MeteringDataEvent(
+ /* [in] */ __int64 data,
+ /* [optional][in] */ __int64 context)
+{
+
+ NdrClientCall2(
+ ( PMIDL_STUB_DESC )&RpcInterface_StubDesc,
+ (PFORMAT_STRING) &RpcInterface__MIDL_ProcFormatString.Format[206],
+ data,
+ context);
+
+}
+
+extern const NDR_RUNDOWN RundownRoutines[];
+
+#if !defined(__RPC_WIN64__)
+#error Invalid build platform for this stub.
+#endif
+
+static const RpcInterface_MIDL_PROC_FORMAT_STRING RpcInterface__MIDL_ProcFormatString =
+ {
+ 0,
+ {
+
+ /* Procedure RemoteOpen */
+
+ 0x0, /* 0 */
+ 0x48, /* Old Flags: */
+/* 2 */ NdrFcLong( 0x0 ), /* 0 */
+/* 6 */ NdrFcShort( 0x0 ), /* 0 */
+/* 8 */ NdrFcShort( 0x10 ), /* X64 Stack size/offset = 16 */
+/* 10 */ 0x32, /* FC_BIND_PRIMITIVE */
+ 0x0, /* 0 */
+/* 12 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 14 */ NdrFcShort( 0x0 ), /* 0 */
+/* 16 */ NdrFcShort( 0x38 ), /* 56 */
+/* 18 */ 0x40, /* Oi2 Flags: has ext, */
+ 0x1, /* 1 */
+/* 20 */ 0xa, /* 10 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 22 */ NdrFcShort( 0x0 ), /* 0 */
+/* 24 */ NdrFcShort( 0x0 ), /* 0 */
+/* 26 */ NdrFcShort( 0x0 ), /* 0 */
+/* 28 */ NdrFcShort( 0x0 ), /* 0 */
+
+ /* Parameter pphContext */
+
+/* 30 */ NdrFcShort( 0x110 ), /* Flags: out, simple ref, */
+/* 32 */ NdrFcShort( 0x8 ), /* X64 Stack size/offset = 8 */
+/* 34 */ NdrFcShort( 0x6 ), /* Type Offset=6 */
+
+ /* Procedure RemoteClose */
+
+/* 36 */ 0x0, /* 0 */
+ 0x48, /* Old Flags: */
+/* 38 */ NdrFcLong( 0x0 ), /* 0 */
+/* 42 */ NdrFcShort( 0x1 ), /* 1 */
+/* 44 */ NdrFcShort( 0x8 ), /* X64 Stack size/offset = 8 */
+/* 46 */ 0x30, /* FC_BIND_CONTEXT */
+ 0xe4, /* Ctxt flags: via ptr, in, out, no serialize, */
+/* 48 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 50 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+/* 52 */ NdrFcShort( 0x38 ), /* 56 */
+/* 54 */ NdrFcShort( 0x38 ), /* 56 */
+/* 56 */ 0x40, /* Oi2 Flags: has ext, */
+ 0x1, /* 1 */
+/* 58 */ 0xa, /* 10 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 60 */ NdrFcShort( 0x0 ), /* 0 */
+/* 62 */ NdrFcShort( 0x0 ), /* 0 */
+/* 64 */ NdrFcShort( 0x0 ), /* 0 */
+/* 66 */ NdrFcShort( 0x0 ), /* 0 */
+
+ /* Parameter pphContext */
+
+/* 68 */ NdrFcShort( 0x118 ), /* Flags: in, out, simple ref, */
+/* 70 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 72 */ NdrFcShort( 0xe ), /* Type Offset=14 */
+
+ /* Procedure StartMetering */
+
+/* 74 */ 0x0, /* 0 */
+ 0x48, /* Old Flags: */
+/* 76 */ NdrFcLong( 0x0 ), /* 0 */
+/* 80 */ NdrFcShort( 0x2 ), /* 2 */
+/* 82 */ NdrFcShort( 0x18 ), /* X64 Stack size/offset = 24 */
+/* 84 */ 0x30, /* FC_BIND_CONTEXT */
+ 0x44, /* Ctxt flags: in, no serialize, */
+/* 86 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 88 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+/* 90 */ NdrFcShort( 0x44 ), /* 68 */
+/* 92 */ NdrFcShort( 0x0 ), /* 0 */
+/* 94 */ 0x40, /* Oi2 Flags: has ext, */
+ 0x3, /* 3 */
+/* 96 */ 0xa, /* 10 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 98 */ NdrFcShort( 0x0 ), /* 0 */
+/* 100 */ NdrFcShort( 0x0 ), /* 0 */
+/* 102 */ NdrFcShort( 0x0 ), /* 0 */
+/* 104 */ NdrFcShort( 0x0 ), /* 0 */
+
+ /* Parameter phContext */
+
+/* 106 */ NdrFcShort( 0x8 ), /* Flags: in, */
+/* 108 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 110 */ NdrFcShort( 0x12 ), /* Type Offset=18 */
+
+ /* Parameter samplePeriod */
+
+/* 112 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 114 */ NdrFcShort( 0x8 ), /* X64 Stack size/offset = 8 */
+/* 116 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Parameter context */
+
+/* 118 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 120 */ NdrFcShort( 0x10 ), /* X64 Stack size/offset = 16 */
+/* 122 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Procedure SetSamplePeriod */
+
+/* 124 */ 0x0, /* 0 */
+ 0x48, /* Old Flags: */
+/* 126 */ NdrFcLong( 0x0 ), /* 0 */
+/* 130 */ NdrFcShort( 0x3 ), /* 3 */
+/* 132 */ NdrFcShort( 0x10 ), /* X64 Stack size/offset = 16 */
+/* 134 */ 0x30, /* FC_BIND_CONTEXT */
+ 0x44, /* Ctxt flags: in, no serialize, */
+/* 136 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 138 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+/* 140 */ NdrFcShort( 0x34 ), /* 52 */
+/* 142 */ NdrFcShort( 0x0 ), /* 0 */
+/* 144 */ 0x40, /* Oi2 Flags: has ext, */
+ 0x2, /* 2 */
+/* 146 */ 0xa, /* 10 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 148 */ NdrFcShort( 0x0 ), /* 0 */
+/* 150 */ NdrFcShort( 0x0 ), /* 0 */
+/* 152 */ NdrFcShort( 0x0 ), /* 0 */
+/* 154 */ NdrFcShort( 0x0 ), /* 0 */
+
+ /* Parameter phContext */
+
+/* 156 */ NdrFcShort( 0x8 ), /* Flags: in, */
+/* 158 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 160 */ NdrFcShort( 0x12 ), /* Type Offset=18 */
+
+ /* Parameter samplePeriod */
+
+/* 162 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 164 */ NdrFcShort( 0x8 ), /* X64 Stack size/offset = 8 */
+/* 166 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Procedure StopMetering */
+
+/* 168 */ 0x0, /* 0 */
+ 0x48, /* Old Flags: */
+/* 170 */ NdrFcLong( 0x0 ), /* 0 */
+/* 174 */ NdrFcShort( 0x4 ), /* 4 */
+/* 176 */ NdrFcShort( 0x8 ), /* X64 Stack size/offset = 8 */
+/* 178 */ 0x30, /* FC_BIND_CONTEXT */
+ 0x44, /* Ctxt flags: in, no serialize, */
+/* 180 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 182 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+/* 184 */ NdrFcShort( 0x24 ), /* 36 */
+/* 186 */ NdrFcShort( 0x0 ), /* 0 */
+/* 188 */ 0x40, /* Oi2 Flags: has ext, */
+ 0x1, /* 1 */
+/* 190 */ 0xa, /* 10 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 192 */ NdrFcShort( 0x0 ), /* 0 */
+/* 194 */ NdrFcShort( 0x0 ), /* 0 */
+/* 196 */ NdrFcShort( 0x0 ), /* 0 */
+/* 198 */ NdrFcShort( 0x0 ), /* 0 */
+
+ /* Parameter phContext */
+
+/* 200 */ NdrFcShort( 0x8 ), /* Flags: in, */
+/* 202 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 204 */ NdrFcShort( 0x12 ), /* Type Offset=18 */
+
+ /* Procedure MeteringDataEvent */
+
+/* 206 */ 0x34, /* FC_CALLBACK_HANDLE */
+ 0x48, /* Old Flags: */
+/* 208 */ NdrFcLong( 0x0 ), /* 0 */
+/* 212 */ NdrFcShort( 0x0 ), /* 0 */
+/* 214 */ NdrFcShort( 0x10 ), /* X64 Stack size/offset = 16 */
+/* 216 */ NdrFcShort( 0x20 ), /* 32 */
+/* 218 */ NdrFcShort( 0x0 ), /* 0 */
+/* 220 */ 0x40, /* Oi2 Flags: has ext, */
+ 0x2, /* 2 */
+/* 222 */ 0xa, /* 10 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 224 */ NdrFcShort( 0x0 ), /* 0 */
+/* 226 */ NdrFcShort( 0x0 ), /* 0 */
+/* 228 */ NdrFcShort( 0x0 ), /* 0 */
+/* 230 */ NdrFcShort( 0x0 ), /* 0 */
+
+ /* Parameter data */
+
+/* 232 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 234 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 236 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Parameter context */
+
+/* 238 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 240 */ NdrFcShort( 0x8 ), /* X64 Stack size/offset = 8 */
+/* 242 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ 0x0
+ }
+ };
+
+static const RpcInterface_MIDL_TYPE_FORMAT_STRING RpcInterface__MIDL_TypeFormatString =
+ {
+ 0,
+ {
+ NdrFcShort( 0x0 ), /* 0 */
+/* 2 */
+ 0x11, 0x4, /* FC_RP [alloced_on_stack] */
+/* 4 */ NdrFcShort( 0x2 ), /* Offset= 2 (6) */
+/* 6 */ 0x30, /* FC_BIND_CONTEXT */
+ 0xa4, /* Ctxt flags: via ptr, out, no serialize, */
+/* 8 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+/* 10 */
+ 0x11, 0x4, /* FC_RP [alloced_on_stack] */
+/* 12 */ NdrFcShort( 0x2 ), /* Offset= 2 (14) */
+/* 14 */ 0x30, /* FC_BIND_CONTEXT */
+ 0xe5, /* Ctxt flags: via ptr, in, out, no serialize, can't be null */
+/* 16 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+/* 18 */ 0x30, /* FC_BIND_CONTEXT */
+ 0x45, /* Ctxt flags: in, no serialize, can't be null */
+/* 20 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+
+ 0x0
+ }
+ };
+
+static const NDR_RUNDOWN RundownRoutines[] =
+ {
+ PCONTEXT_HANDLE_TYPE_rundown
+ };
+
+
+static const unsigned short RpcInterface_FormatStringOffsetTable[] =
+ {
+ 0,
+ 36,
+ 74,
+ 124,
+ 168,
+ };
+
+
+static const unsigned short _callbackRpcInterface_FormatStringOffsetTable[] =
+ {
+ 206
+ };
+
+
+static const MIDL_STUB_DESC RpcInterface_StubDesc =
+ {
+ (void *)& RpcInterface___RpcServerInterface,
+ MIDL_user_allocate,
+ MIDL_user_free,
+ 0,
+ RundownRoutines,
+ 0,
+ 0,
+ 0,
+ RpcInterface__MIDL_TypeFormatString.Format,
+ 1, /* -error bounds_check flag */
+ 0x50002, /* Ndr library version */
+ 0,
+ 0x801026e, /* MIDL Version 8.1.622 */
+ 0,
+ 0,
+ 0, /* notify & notify_flag routine table */
+ 0x1, /* MIDL flag */
+ 0, /* cs routines */
+ 0, /* proxy/server info */
+ 0
+ };
+
+static const RPC_DISPATCH_FUNCTION RpcInterface_table[] =
+ {
+ NdrServerCall2,
+ NdrServerCall2,
+ NdrServerCall2,
+ NdrServerCall2,
+ NdrServerCall2,
+ 0
+ };
+static const RPC_DISPATCH_TABLE RpcInterface_v1_0_DispatchTable =
+ {
+ 5,
+ (RPC_DISPATCH_FUNCTION*)RpcInterface_table
+ };
+
+static const SERVER_ROUTINE RpcInterface_ServerRoutineTable[] =
+ {
+ (SERVER_ROUTINE)RemoteOpen,
+ (SERVER_ROUTINE)RemoteClose,
+ (SERVER_ROUTINE)StartMetering,
+ (SERVER_ROUTINE)SetSamplePeriod,
+ (SERVER_ROUTINE)StopMetering,
+ };
+
+static const MIDL_SERVER_INFO RpcInterface_ServerInfo =
+ {
+ &RpcInterface_StubDesc,
+ RpcInterface_ServerRoutineTable,
+ RpcInterface__MIDL_ProcFormatString.Format,
+ RpcInterface_FormatStringOffsetTable,
+ 0,
+ 0,
+ 0,
+ 0};
+#if _MSC_VER >= 1200
+#pragma warning(pop)
+#endif
+
+
+#endif /* defined(_M_AMD64)*/
+
diff --git a/general/WinHEC 2017 Lab/Toaster Driver/Service/RpcServer.cpp b/general/WinHEC 2017 Lab/Toaster Driver/Service/RpcServer.cpp
new file mode 100644
index 00000000..0cad3578
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/Service/RpcServer.cpp
@@ -0,0 +1,320 @@
+//*********************************************************
+//
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the MIT License (MIT).
+// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
+// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
+// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
+//
+//*********************************************************
+
+#include "stdafx.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <iostream>
+#include "RpcInterface_h.h"
+#include <windows.h>
+
+#include <sddl.h>
+#include <securitybaseapi.h>
+#include <AclAPI.h>
+#include "RpcServer.h"
+
+using namespace RpcServer;
+
+#define DEFAULT_METERING_PERIOD 100
+
+bool ShutdownRequested;
+static RPC_BINDING_VECTOR* BindingVector = nullptr;
+
+void FreeSidArray(__inout_ecount(cSIDs) PSID* pSIDs, ULONG cSIDs)
+{
+ if (pSIDs != nullptr)
+ {
+ for (ULONG i = 0; i < cSIDs; i++)
+ {
+ LocalFree(pSIDs[i]);
+
+ pSIDs[i] = nullptr;
+ }
+
+ LocalFree(pSIDs);
+
+ pSIDs = nullptr;
+ cSIDs = 0;
+ }
+}
+
+//
+// Routine to create RPC server and listen to incoming RPC calls
+//
+DWORD RpcServerStart()
+{
+ DWORD hResult = S_OK;
+ WCHAR* protocolSequence = L"ncalrpc";
+ unsigned int minCalls = 1;
+ unsigned int dontWait = false;
+ ShutdownRequested = false;
+
+ SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
+ PSID everyoneSid = nullptr;
+ PSID* capabilitySids = nullptr;
+ DWORD capabilitySidCount = 0;
+ PSID* capabilityGroupSids = nullptr;
+ DWORD capabilityGroupSidCount = 0;
+ EXPLICIT_ACCESS ea[2] = {};
+ PACL acl = nullptr;
+ SECURITY_DESCRIPTOR rpcSecurityDescriptor = {};
+
+ // When creating the RPC endpoint we want it to allow connections from any UWA that contains
+ // the custom capability SID in its process token. When a UWA declares the custom capability
+ // in its app manifest, it will later contain the SID form of that custom capability in its
+ // process token at runtime. By default, RPC endpoints don't allow UWAs (AppContainer processes)
+ // to connect to them, so we need to set the security on the endpoint to allow access to UWAs with the
+ // custom capability.
+ //
+ // To do this we'll perform the following steps:
+ // 1) Convert the custom capability name to a SID
+ // 2) Create a security descriptor using that SID, as well as other needed SIDs. This sample shows how to allow
+ // all 'non UWAs' access as well as UWAs containing the custom capability SID.
+ // 3) Create the RPC endpoint using that security descriptor
+ //
+ // To create the security descriptor we're roughly following this MSDN sample:
+ // https://msdn.microsoft.com/en-us/library/windows/desktop/aa446595(v=vs.85).aspx
+
+ // Get the SID form of the custom capability. In this case we only expect one SID and
+ // we don't care about the capability group.
+ //INSERT DERIVE CAPABILTY SIDS FROM NAME HERE
+
+ // Get the SID that represents 'everyone' (this doesn't include AppContainers)
+ if (!AllocateAndInitializeSid(
+ &SIDAuthWorld, 1,
+ SECURITY_WORLD_RID,
+ 0, 0, 0, 0, 0, 0, 0,
+ &everyoneSid))
+ {
+ hResult = GetLastError();
+ goto end;
+ }
+
+ // Now create the Access Control List (ACL) for the Security descriptor
+
+ // Everyone GENERIC_ALL access
+ ea[0].grfAccessMode = SET_ACCESS;
+ ea[0].grfAccessPermissions = GENERIC_ALL;
+ ea[0].grfInheritance = NO_INHERITANCE;
+ ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID;
+ ea[0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
+ ea[0].Trustee.ptstrName = static_cast<LPWSTR>(everyoneSid);
+
+ // Custom capability GENERIC_ALL access
+ ea[1].grfAccessMode = SET_ACCESS;
+ ea[1].grfAccessPermissions = GENERIC_ALL;
+ ea[1].grfInheritance = NO_INHERITANCE;
+ ea[1].Trustee.TrusteeForm = TRUSTEE_IS_SID;
+ ea[1].Trustee.TrusteeType = TRUSTEE_IS_UNKNOWN;
+ ea[1].Trustee.ptstrName = static_cast<LPWSTR>(everyoneSid);
+
+ hResult = SetEntriesInAcl(ARRAYSIZE(ea), ea, nullptr, &acl);
+
+ if (hResult != ERROR_SUCCESS)
+ {
+ goto end;
+ }
+
+ // Initialize an empty security descriptor
+ if (!InitializeSecurityDescriptor(&rpcSecurityDescriptor, SECURITY_DESCRIPTOR_REVISION))
+ {
+ hResult = GetLastError();
+ goto end;
+ }
+
+ // Assign the ACL to the security descriptor
+ if (!SetSecurityDescriptorDacl(&rpcSecurityDescriptor, TRUE, acl, FALSE))
+ {
+ hResult = GetLastError();
+ goto end;
+ }
+
+ //
+ // Bind to LRPC using dynamic endpoints
+ //
+ hResult = RpcServerUseProtseqEp(
+ reinterpret_cast<RPC_WSTR>(protocolSequence),
+ RPC_C_PROTSEQ_MAX_REQS_DEFAULT,
+ reinterpret_cast<RPC_WSTR>(RPC_STATIC_ENDPOINT),
+ &rpcSecurityDescriptor);
+
+ if (hResult != S_OK)
+ {
+ goto end;
+ }
+
+ hResult = RpcServerRegisterIf3(
+ RpcInterface_v1_0_s_ifspec,
+ nullptr,
+ nullptr,
+ RPC_IF_AUTOLISTEN | RPC_IF_ALLOW_LOCAL_ONLY,
+ RPC_C_LISTEN_MAX_CALLS_DEFAULT,
+ 0,
+ nullptr,
+ &rpcSecurityDescriptor);
+
+ if (hResult != S_OK)
+ {
+ goto end;
+ }
+
+ hResult = RpcServerInqBindings(&BindingVector);
+
+ if (hResult != S_OK)
+ {
+ goto end;
+ }
+
+ hResult = RpcEpRegister(
+ RpcInterface_v1_0_s_ifspec,
+ BindingVector,
+ nullptr,
+ nullptr);
+
+ if (hResult != S_OK)
+ {
+ goto end;
+ }
+
+ hResult = RpcServerListen(
+ minCalls,
+ RPC_C_LISTEN_MAX_CALLS_DEFAULT,
+ dontWait);
+
+ if (hResult == RPC_S_ALREADY_LISTENING)
+ {
+ hResult = RPC_S_OK;
+ }
+
+end:
+
+ // Cleanup sids
+ FreeSidArray(capabilityGroupSids, capabilityGroupSidCount);
+ FreeSidArray(capabilitySids, capabilitySidCount);
+
+ if (everyoneSid != nullptr)
+ {
+ FreeSid(everyoneSid);
+ }
+
+ // cleanup acl
+ if (acl != nullptr)
+ {
+ LocalFree(acl);
+ }
+
+ return hResult;
+}
+
+//
+// Notify rpc server to stop listening to incoming rpc calls
+//
+void RpcServerDisconnect()
+{
+ DWORD hResult = S_OK;
+ ShutdownRequested = true;
+ hResult = RpcServerUnregisterIf(RpcInterface_v1_0_s_ifspec, nullptr, 0);
+
+ RpcEpUnregister(RpcInterface_v1_0_s_ifspec, BindingVector, nullptr);
+
+ if (BindingVector != nullptr)
+ {
+ RpcBindingVectorFree(&BindingVector);
+ BindingVector = nullptr;
+ }
+}
+
+//
+// Rpc method to retrieve client context handle
+//
+void RemoteOpen(
+ _In_ handle_t hBinding,
+ _Out_ PPCONTEXT_HANDLE_TYPE pphContext)
+{
+ *pphContext = static_cast<PCONTEXT_HANDLE_TYPE *>(midl_user_allocate(sizeof(METERING_CONTEXT)));
+ METERING_CONTEXT* meteringContext = static_cast<METERING_CONTEXT *>(*pphContext);
+ meteringContext->metering = new Metering(DEFAULT_METERING_PERIOD);
+}
+
+//
+// Rpc method to close the client context handle
+//
+void RemoteClose(_Inout_ PPCONTEXT_HANDLE_TYPE pphContext)
+{
+ if (*pphContext == nullptr)
+ {
+ //Log error, client tried to close a NULL handle.
+ return;
+ }
+
+ METERING_CONTEXT* meteringContext = static_cast<METERING_CONTEXT *>(*pphContext);
+ delete meteringContext->metering;
+ MIDL_user_free(meteringContext);
+
+ // This tells the run-time, when it is marshalling the out
+ // parameters, that the context handle has been closed normally.
+ *pphContext = nullptr;
+}
+
+//
+// Routine to cleanup client context when client has died with active
+// connection with server
+//
+void __RPC_USER PCONTEXT_HANDLE_TYPE_rundown(
+ _In_ PCONTEXT_HANDLE_TYPE phContext)
+{
+ StopMetering(phContext);
+ RemoteClose(&phContext);
+}
+
+#pragma region METERING_RPCROUTINES
+
+void StartMetering(
+ _In_ PCONTEXT_HANDLE_TYPE phContext,
+ _In_ __int64 period,
+ _In_ __int64 context)
+{
+ std::cout << "start metering" << std::endl;
+ METERING_CONTEXT* meteringContext = static_cast<METERING_CONTEXT *>(phContext);
+ meteringContext->metering->StartMetering(period, context);
+ std::cout << "done metering" << std::endl;
+}
+
+void SetSamplePeriod(
+ _In_ PCONTEXT_HANDLE_TYPE phContext,
+ _In_ __int64 period)
+{
+ METERING_CONTEXT* meteringContext = static_cast<METERING_CONTEXT *>(phContext);
+ meteringContext->metering->SetSamplePeriod(period);
+}
+
+
+void StopMetering(_In_ PCONTEXT_HANDLE_TYPE phContext)
+{
+ METERING_CONTEXT* meteringContext = static_cast<METERING_CONTEXT *>(phContext);
+ meteringContext->metering->StopMetering();
+}
+
+#pragma endregion METERING_RPCROUTINES
+
+/******************************************************/
+/* MIDL allocate and free */
+/******************************************************/
+
+void __RPC_FAR * __RPC_USER midl_user_allocate(_In_ size_t len)
+{
+ return(malloc(len));
+}
+
+void __RPC_USER midl_user_free(_In_ void __RPC_FAR* ptr)
+{
+ free(ptr);
+}
diff --git a/general/WinHEC 2017 Lab/Toaster Driver/Service/RpcServer.h b/general/WinHEC 2017 Lab/Toaster Driver/Service/RpcServer.h
new file mode 100644
index 00000000..bc7294db
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/Service/RpcServer.h
@@ -0,0 +1,16 @@
+#include "metering.h"
+
+#define RPC_STATIC_ENDPOINT L"HsaSampleRpcEndpoint"
+
+// Client context used for making rpc calls using context handle
+// https://msdn.microsoft.com/en-us/library/windows/desktop/aa378674(v=vs.85).aspx
+typedef struct
+{
+ RpcServer::Metering* metering;
+} METERING_CONTEXT;
+
+// Create a rpc server endpoint and listen to incoming rpc calls
+DWORD RpcServerStart();
+
+// Signal the rpc server to stop listening to incoming rpc calls
+void RpcServerDisconnect();
diff --git a/general/WinHEC 2017 Lab/Toaster Driver/Service/RpcServer.vcxproj b/general/WinHEC 2017 Lab/Toaster Driver/Service/RpcServer.vcxproj
new file mode 100644
index 00000000..b5c043dc
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/Service/RpcServer.vcxproj
@@ -0,0 +1,284 @@
+<?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|ARM">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM">
+ <Configuration>Release</Configuration>
+ <Platform>ARM</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>{ADFC4322-5F0E-5BFD-83DA-19B35EFD513B}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ <RootNamespace>RpcServer</RootNamespace>
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v141</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v141</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>v141</PlatformToolset>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>v141</PlatformToolset>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v141</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>v141</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 Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="PropertySheets">
+ <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 Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="PropertySheets">
+ <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>
+ <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>$(Platform)\$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <LinkIncremental>true</LinkIncremental>
+ <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <LinkIncremental>false</LinkIncremental>
+ <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>$(Platform)\$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <SDLCheck>true</SDLCheck>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(OutDir)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>onecoreuap.lib;%(AdditionalDependencies);rpcrt4.lib</AdditionalDependencies>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <IgnoreSpecificDefaultLibraries>%(IgnoreSpecificDefaultLibraries);kernel32.lib;user32.lib;shell32.lib;gdi32.lib</IgnoreSpecificDefaultLibraries>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <ClCompile>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <SDLCheck>true</SDLCheck>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(OutDir)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>onecoreuap.lib;%(AdditionalDependencies);rpcrt4.lib</AdditionalDependencies>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <IgnoreSpecificDefaultLibraries>%(IgnoreSpecificDefaultLibraries);kernel32.lib;user32.lib;shell32.lib;gdi32.lib</IgnoreSpecificDefaultLibraries>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <SDLCheck>true</SDLCheck>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(OutDir)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>onecoreuap.lib;%(AdditionalDependencies);rpcrt4.lib</AdditionalDependencies>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <IgnoreSpecificDefaultLibraries>%(IgnoreSpecificDefaultLibraries);kernel32.lib;user32.lib;shell32.lib;gdi32.lib</IgnoreSpecificDefaultLibraries>
+ </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>
+ <SDLCheck>true</SDLCheck>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(OutDir)</AdditionalIncludeDirectories>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>onecoreuap.lib;%(AdditionalDependencies);ucrt.lib;rpcrt4.lib;libcmt.lib;libvcruntime.lib</AdditionalDependencies>
+ <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
+ <IgnoreSpecificDefaultLibraries>%(IgnoreSpecificDefaultLibraries);kernel32.lib;user32.lib;shell32.lib;gdi32.lib</IgnoreSpecificDefaultLibraries>
+ <AdditionalOptions>/VERBOSE %(AdditionalOptions)</AdditionalOptions>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);</PreprocessorDefinitions>
+ <SDLCheck>true</SDLCheck>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(OutDir)</AdditionalIncludeDirectories>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>onecoreuap.lib;%(AdditionalDependencies);ucrt.lib;rpcrt4.lib;libcmt.lib;libvcruntime.lib</AdditionalDependencies>
+ <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
+ <IgnoreSpecificDefaultLibraries>%(IgnoreSpecificDefaultLibraries);kernel32.lib;user32.lib;shell32.lib;gdi32.lib</IgnoreSpecificDefaultLibraries>
+ <AdditionalOptions>/VERBOSE %(AdditionalOptions)</AdditionalOptions>
+ </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>
+ <SDLCheck>true</SDLCheck>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(OutDir)</AdditionalIncludeDirectories>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>onecoreuap.lib;%(AdditionalDependencies);ucrt.lib;rpcrt4.lib;libcmt.lib;libvcruntime.lib</AdditionalDependencies>
+ <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
+ <IgnoreSpecificDefaultLibraries>%(IgnoreSpecificDefaultLibraries);kernel32.lib;user32.lib;shell32.lib;gdi32.lib</IgnoreSpecificDefaultLibraries>
+ <AdditionalOptions>/VERBOSE %(AdditionalOptions)</AdditionalOptions>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClInclude Include="Metering.h" />
+ <ClInclude Include="RpcServer.h" />
+ <ClInclude Include="SampleService.h" />
+ <ClInclude Include="ServiceBase.h" />
+ <ClInclude Include="ServiceInstaller.h" />
+ <ClInclude Include="stdafx.h" />
+ <ClInclude Include="targetver.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="RpcInterface_s.c">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader>
+ </ClCompile>
+ <ClCompile Include="HsaService.cpp" />
+ <ClCompile Include="Metering.cpp" />
+ <ClCompile Include="RpcServer.cpp" />
+ <ClCompile Include="SampleService.cpp" />
+ <ClCompile Include="ServiceBase.cpp" />
+ <ClCompile Include="ServiceInstaller.cpp" />
+ <ClCompile Include="stdafx.cpp">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="RpcInterface.acf" />
+ </ItemGroup>
+ <ItemGroup>
+ <Midl Include="RpcInterface.Idl" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/general/WinHEC 2017 Lab/Toaster Driver/Service/RpcServer.vcxproj.filters b/general/WinHEC 2017 Lab/Toaster Driver/Service/RpcServer.vcxproj.filters
new file mode 100644
index 00000000..9644ad4e
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/Service/RpcServer.vcxproj.filters
@@ -0,0 +1,76 @@
+<?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>
+ <ClInclude Include="stdafx.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="targetver.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="Metering.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="RpcServer.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="SampleService.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="ServiceBase.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="ServiceInstaller.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="stdafx.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="HsaService.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="Metering.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="RpcServer.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="SampleService.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="ServiceBase.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="ServiceInstaller.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="RpcInterface_s.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="RpcInterface.acf">
+ <Filter>Source Files</Filter>
+ </None>
+ </ItemGroup>
+ <ItemGroup>
+ <Midl Include="RpcInterface.Idl">
+ <Filter>Source Files</Filter>
+ </Midl>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/general/WinHEC 2017 Lab/Toaster Driver/Service/SampleService.cpp b/general/WinHEC 2017 Lab/Toaster Driver/Service/SampleService.cpp
new file mode 100644
index 00000000..793a7009
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/Service/SampleService.cpp
@@ -0,0 +1,155 @@
+//*********************************************************
+//
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the MIT License (MIT).
+// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
+// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
+// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
+//
+//*********************************************************
+
+#include "stdafx.h"
+
+#pragma region Includes
+#include "SampleService.h"
+#include "RpcServer.h"
+#include <Evntrace.h>
+#pragma endregion
+
+CSampleService::CSampleService(
+ PWSTR pszServiceName,
+ BOOL fCanStop,
+ BOOL fCanShutdown,
+ BOOL fCanPauseContinue)
+ : CServiceBase(pszServiceName, fCanStop, fCanShutdown, fCanPauseContinue)
+{
+}
+
+void CSampleService::WriteEventLogEntry(PWSTR pszMessage, BYTE bLevel)
+{
+ if (IsConsoleRun())
+ {
+ wprintf(L"%d: %ls\n", bLevel, pszMessage);
+ }
+ __super::WriteEventLogEntry(pszMessage, bLevel);
+}
+
+CSampleService::~CSampleService(void)
+{
+}
+
+//
+// This is the thread pool work callback function.
+//
+VOID CALLBACK ServiceWorkerThread(
+ _In_ PTP_CALLBACK_INSTANCE /*Instance*/,
+ _In_ PVOID Parameter,
+ _In_ PTP_WORK /*Work*/)
+{
+ //
+ // Do something when the work callback is invoked.
+ //
+ {
+ _int64 status = RpcServerStart();
+ if (status)
+ {
+ CSampleService* sampleService = static_cast<CSampleService *>(Parameter);
+ sampleService->Stop();
+ }
+ }
+
+ return;
+}
+
+//
+// FUNCTION: CSampleService::OnStart(DWORD, LPWSTR *)
+//
+// PURPOSE: The 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.
+//
+// PARAMETERS:
+// * dwArgc - number of command line arguments
+// * lpszArgv - array of command line arguments
+//
+// 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.
+//
+void CSampleService::OnStart(
+ _In_ DWORD dwArgc,
+ _In_ LPWSTR *lpszArgv)
+{
+ // Log a service start message to the Application log.
+ WriteEventLogEntry(L"CppWindowsService in OnStart", TRACE_LEVEL_INFORMATION);
+
+ // Queue the main service function for execution in a worker thread.
+ PTP_WORK_CALLBACK workcallback = ServiceWorkerThread;
+ m_work = CreateThreadpoolWork(workcallback, this, nullptr);
+
+ if (NULL == m_work)
+ {
+ // TODO: Capture get last error
+ WriteEventLogEntry(L"CreateThreadpoolWork failed", TRACE_LEVEL_ERROR);
+ }
+
+ //
+ // Submit the work to the pool. Because this was a pre-allocated
+ // work item (using CreateThreadpoolWork), it is guaranteed to execute.
+ //
+ SubmitThreadpoolWork(m_work);
+}
+
+//
+// FUNCTION: CSampleService::ConsoleRun()
+//
+// PURPOSE: The function is executed to simulate OnStart in
+// console mode.
+//
+void CSampleService::ConsoleRun()
+{
+ m_runningInConsole = true;
+
+ WriteEventLogEntry(L"Starting Rpc Server..", TRACE_LEVEL_INFORMATION);
+ long status = RpcServerStart();
+
+ if (status)
+ {
+ printf_s("RpcServerConnect returned: 0x%x\n", status);
+ WriteEventLogEntry(L"Starting Rpc Server..", TRACE_LEVEL_INFORMATION);
+ exit(static_cast<int>(status));
+ }
+}
+
+//
+// FUNCTION: CSampleService::OnStop()
+//
+// PURPOSE: The 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.
+//
+// COMMENTS:
+// Be sure to periodically call ReportServiceStatus() with
+// SERVICE_STOP_PENDING if the procedure is going to take long time.
+//
+void CSampleService::OnStop()
+{
+ // Log a service stop message to the Application log.
+ WriteEventLogEntry(L"CppWindowsService in OnStop", TRACE_LEVEL_INFORMATION);
+
+ // Instruct server to stop listening to remote procedure calls and
+ // unregister rpc interface
+ RpcServerDisconnect();
+} \ No newline at end of file
diff --git a/general/WinHEC 2017 Lab/Toaster Driver/Service/SampleService.h b/general/WinHEC 2017 Lab/Toaster Driver/Service/SampleService.h
new file mode 100644
index 00000000..04621b3e
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/Service/SampleService.h
@@ -0,0 +1,46 @@
+//*********************************************************
+//
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the MIT License (MIT).
+// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
+// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
+// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
+//
+//*********************************************************
+
+// 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.
+
+#pragma once
+
+#include "ServiceBase.h"
+
+class CSampleService : public CServiceBase
+{
+public:
+
+ CSampleService(PWSTR pszServiceName,
+ BOOL fCanStop = TRUE,
+ BOOL fCanShutdown = TRUE,
+ BOOL fCanPauseContinue = FALSE);
+ void ConsoleRun();
+ bool IsConsoleRun()
+ {
+ return m_runningInConsole;
+ }
+ void WriteEventLogEntry(PWSTR pszMessage, BYTE bLevel) override;
+ virtual ~CSampleService(void);
+
+protected:
+
+ virtual void OnStart(DWORD dwArgc, PWSTR *pszArgv) override;
+ virtual void OnStop() override;
+
+
+private:
+ PTP_WORK m_work = nullptr;
+ bool m_runningInConsole = false;
+}; \ No newline at end of file
diff --git a/general/WinHEC 2017 Lab/Toaster Driver/Service/ServiceBase.cpp b/general/WinHEC 2017 Lab/Toaster Driver/Service/ServiceBase.cpp
new file mode 100644
index 00000000..117d740c
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/Service/ServiceBase.cpp
@@ -0,0 +1,566 @@
+//*********************************************************
+//
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the MIT License (MIT).
+// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
+// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
+// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
+//
+//*********************************************************
+
+#include "stdafx.h"
+#pragma region Includes
+
+#include "ServiceBase.h"
+#include <assert.h>
+#include <strsafe.h>
+#include <evntprov.h>
+#include <Evntrace.h>
+#pragma endregion
+
+//
+// HSA Service trace event provider
+// {BE2E880E-F79F-4C30-9C95-09F003A0A7EA}
+//
+EXTERN_C __declspec(selectany) const GUID HSA_SERVICE_PROVIDER_GUID = { 0xbe2e880e, 0xf79f, 0x4c30,{ 0x9c, 0x95, 0x9, 0xf0, 0x3, 0xa0, 0xa7, 0xea } };
+
+#pragma region Static Members
+
+// Initialize the singleton service instance.
+CServiceBase *CServiceBase::s_service = nullptr;
+
+
+//
+// FUNCTION: CServiceBase::Run(CServiceBase &)
+//
+// PURPOSE: 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.
+//
+// PARAMETERS:
+// * 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 },
+ { nullptr, nullptr }
+ };
+
+ // 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);
+}
+
+
+//
+// FUNCTION: CServiceBase::ServiceMain(DWORD, PWSTR *)
+//
+// PURPOSE: Entry point for the service. It registers the handler function
+// for the service and starts the service.
+//
+// PARAMETERS:
+// * dwArgc - number of command line arguments
+// * lpszArgv - array of command line arguments
+//
+void WINAPI CServiceBase::ServiceMain(DWORD dwArgc, PWSTR *pszArgv)
+{
+ 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(dwArgc, pszArgv);
+}
+
+
+//
+// FUNCTION: CServiceBase::ServiceCtrlHandler(DWORD)
+//
+// PURPOSE: The function is called by the SCM whenever a control code is
+// sent to the service.
+//
+// PARAMETERS:
+// * dwCtrlCode - 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 ranges from 128
+// to 255.
+//
+void WINAPI CServiceBase::ServiceCtrlHandler(DWORD dwCtrl)
+{
+ switch (dwCtrl)
+ {
+ 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
+
+//
+// FUNCTION: CServiceBase::CServiceBase(PWSTR, BOOL, BOOL, BOOL)
+//
+// PURPOSE: The constructor of CServiceBase. It initializes a new instance
+// of the CServiceBase class. The optional parameters (fCanStop,
+/// fCanShutdown and fCanPauseContinue) allow you to specify whether the
+// service can be stopped, paused and continued, or be notified when system
+// shutdown occurs.
+//
+// PARAMETERS:
+// * pszServiceName - the name of the service
+// * fCanStop - the service can be stopped
+// * fCanShutdown - the service is notified when system shutdown occurs
+// * fCanPauseContinue - the service can be paused and continued
+//
+CServiceBase::CServiceBase(
+ PWSTR pszServiceName,
+ BOOL fCanStop,
+ BOOL fCanShutdown,
+ BOOL fCanPauseContinue)
+{
+ // Service name must be a valid string and cannot be NULL.
+ m_name = (pszServiceName == nullptr) ? L"" : pszServiceName;
+
+ m_statusHandle = nullptr;
+
+ // 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 (fCanStop)
+ dwControlsAccepted |= SERVICE_ACCEPT_STOP;
+ if (fCanShutdown)
+ dwControlsAccepted |= SERVICE_ACCEPT_SHUTDOWN;
+ if (fCanPauseContinue)
+ 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;
+
+ NTSTATUS status = EventRegister(&HSA_SERVICE_PROVIDER_GUID,
+ nullptr,
+ nullptr,
+ &m_etwRegHandle);
+ if (ERROR_SUCCESS != status)
+ {
+ wprintf(L"Provider not registered. EventRegister failed with %d\n", status);
+ }
+}
+
+
+//
+// FUNCTION: CServiceBase::~CServiceBase()
+//
+// PURPOSE: The virtual destructor of CServiceBase.
+//
+CServiceBase::~CServiceBase(void)
+{
+ if (m_etwRegHandle != NULL)
+ {
+ EventUnregister(m_etwRegHandle);
+ }
+}
+
+#pragma endregion
+
+
+#pragma region Service Start, Stop, Pause, Continue, and Shutdown
+
+//
+// FUNCTION: CServiceBase::Start(DWORD, PWSTR *)
+//
+// PURPOSE: The 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.
+//
+// PARAMETERS:
+// * dwArgc - number of command line arguments
+// * lpszArgv - array of command line arguments
+//
+void CServiceBase::Start(DWORD dwArgc, PWSTR *pszArgv)
+{
+ WriteEventLogEntry(L"Service trying to start.", TRACE_LEVEL_ERROR);
+ try
+ {
+ // Tell SCM that the service is starting.
+ SetServiceStatus(SERVICE_START_PENDING);
+
+ // Perform service-specific initialization.
+ OnStart(dwArgc, pszArgv);
+
+ // Tell SCM that the service is started.
+ SetServiceStatus(SERVICE_RUNNING);
+ }
+ catch (DWORD dwError)
+ {
+ // Log the error.
+ WriteErrorLogEntry(L"Service Start", dwError);
+
+ // Set the service status to be stopped.
+ SetServiceStatus(SERVICE_STOPPED, dwError);
+ }
+ catch (...)
+ {
+ // Log the error.
+ WriteEventLogEntry(L"Service failed to start.", TRACE_LEVEL_ERROR);
+
+ // Set the service status to be stopped.
+ SetServiceStatus(SERVICE_STOPPED);
+ }
+}
+
+
+//
+// FUNCTION: CServiceBase::OnStart(DWORD, PWSTR *)
+//
+// PURPOSE: 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.
+//
+// PARAMETERS:
+// * dwArgc - number of command line arguments
+// * lpszArgv - array of command line arguments
+//
+void CServiceBase::OnStart(DWORD dwArgc, PWSTR *pszArgv)
+{
+}
+
+
+//
+// FUNCTION: CServiceBase::Stop()
+//
+// PURPOSE: The 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.
+//
+void CServiceBase::Stop()
+{
+ DWORD dwOriginalState = 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 dwError)
+ {
+ // Log the error.
+ WriteErrorLogEntry(L"Service Stop", dwError);
+
+ // Set the orginal service status.
+ SetServiceStatus(dwOriginalState);
+ }
+ catch (...)
+ {
+ // Log the error.
+ WriteEventLogEntry(L"Service failed to stop.", TRACE_LEVEL_ERROR);
+
+ // Set the orginal service status.
+ SetServiceStatus(dwOriginalState);
+ }
+}
+
+
+//
+// FUNCTION: CServiceBase::OnStop()
+//
+// PURPOSE: 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.
+//
+void CServiceBase::OnStop()
+{
+}
+
+
+//
+// FUNCTION: CServiceBase::Pause()
+//
+// PURPOSE: 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.
+//
+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 dwError)
+ {
+ // Log the error.
+ WriteErrorLogEntry(L"Service Pause", dwError);
+
+ // Tell SCM that the service is still running.
+ SetServiceStatus(SERVICE_RUNNING);
+ }
+ catch (...)
+ {
+ // Log the error.
+ WriteEventLogEntry(L"Service failed to pause.", TRACE_LEVEL_ERROR);
+
+ // Tell SCM that the service is still running.
+ SetServiceStatus(SERVICE_RUNNING);
+ }
+}
+
+
+//
+// FUNCTION: CServiceBase::OnPause()
+//
+// PURPOSE: 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.
+//
+void CServiceBase::OnPause()
+{
+}
+
+
+//
+// FUNCTION: CServiceBase::Continue()
+//
+// PURPOSE: 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.
+//
+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 dwError)
+ {
+ // Log the error.
+ WriteErrorLogEntry(L"Service Continue", dwError);
+
+ // Tell SCM that the service is still paused.
+ SetServiceStatus(SERVICE_PAUSED);
+ }
+ catch (...)
+ {
+ // Log the error.
+ WriteEventLogEntry(L"Service failed to resume.", TRACE_LEVEL_ERROR);
+
+ // Tell SCM that the service is still paused.
+ SetServiceStatus(SERVICE_PAUSED);
+ }
+}
+
+
+//
+// FUNCTION: CServiceBase::OnContinue()
+//
+// PURPOSE: 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.
+//
+void CServiceBase::OnContinue()
+{
+}
+
+
+//
+// FUNCTION: CServiceBase::Shutdown()
+//
+// PURPOSE: 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.
+//
+void CServiceBase::Shutdown()
+{
+ try
+ {
+ // Perform service-specific shutdown operations.
+ OnShutdown();
+
+ // Tell SCM that the service is stopped.
+ SetServiceStatus(SERVICE_STOPPED);
+ }
+ catch (DWORD dwError)
+ {
+ // Log the error.
+ WriteErrorLogEntry(L"Service Shutdown", dwError);
+ }
+ catch (...)
+ {
+ // Log the error.
+ WriteEventLogEntry(L"Service failed to shut down.", TRACE_LEVEL_ERROR);
+ }
+}
+
+
+//
+// FUNCTION: CServiceBase::OnShutdown()
+//
+// PURPOSE: When implemented in a derived class, executes when the system
+// is shutting down. Specifies what should occur immediately prior to the
+// system shutting down.
+//
+void CServiceBase::OnShutdown()
+{
+}
+
+#pragma endregion
+
+
+#pragma region Helper Functions
+
+//
+// FUNCTION: CServiceBase::SetServiceStatus(DWORD, DWORD, DWORD)
+//
+// PURPOSE: The function sets the service status and reports the status to
+// the SCM.
+//
+// PARAMETERS:
+// * dwCurrentState - the state of the service
+// * dwWin32ExitCode - error code to report
+// * dwWaitHint - estimated time for pending operation, in milliseconds
+//
+void CServiceBase::SetServiceStatus(
+ _In_ DWORD dwCurrentState,
+ _In_ DWORD dwWin32ExitCode,
+ _In_ DWORD dwWaitHint)
+{
+ static DWORD dwCheckPoint = 1;
+
+ // Fill in the SERVICE_STATUS structure of the service.
+
+ m_status.dwCurrentState = dwCurrentState;
+ m_status.dwWin32ExitCode = dwWin32ExitCode;
+ m_status.dwWaitHint = dwWaitHint;
+
+ m_status.dwCheckPoint =
+ ((dwCurrentState == SERVICE_RUNNING) ||
+ (dwCurrentState == SERVICE_STOPPED)) ?
+ 0 : dwCheckPoint++;
+
+ // Report the status of the service to the SCM.
+ ::SetServiceStatus(m_statusHandle, &m_status);
+}
+
+
+//
+// FUNCTION: CServiceBase::WriteEventLogEntry(PWSTR, WORD)
+//
+// PURPOSE: Log an event.
+//
+// PARAMETERS:
+// * pszMessage - string message to be logged.
+// * wType - the type of event to be logged. The parameter can be one of
+// the following values.
+//
+// EVENTLOG_SUCCESS
+// EVENTLOG_AUDIT_FAILURE
+// EVENTLOG_AUDIT_SUCCESS
+// EVENTLOG_ERROR_TYPE
+// EVENTLOG_INFORMATION_TYPE
+// EVENTLOG_WARNING_TYPE
+//
+void CServiceBase::WriteEventLogEntry(
+ _In_ PWSTR pszMessage,
+ _In_ BYTE bLevel)
+{
+ if (m_etwRegHandle != NULL)
+ {
+ EventWriteString(m_etwRegHandle, bLevel, 0, pszMessage);
+ }
+}
+
+//
+// FUNCTION: CServiceBase::WriteErrorLogEntry(PWSTR, DWORD)
+//
+// PURPOSE: Log an event.
+//
+// PARAMETERS:
+// * pszFunction - the function that gives the error
+// * dwError - the error code
+//
+void CServiceBase::WriteErrorLogEntry(
+ _In_ PWSTR pszFunction,
+ _In_ DWORD dwError)
+{
+ wchar_t szMessage[260];
+ StringCchPrintf(szMessage, ARRAYSIZE(szMessage),
+ L"%s failed w/err 0x%08lx", pszFunction, dwError);
+ WriteEventLogEntry(szMessage, TRACE_LEVEL_ERROR);
+}
+
+#pragma endregion \ No newline at end of file
diff --git a/general/WinHEC 2017 Lab/Toaster Driver/Service/ServiceBase.h b/general/WinHEC 2017 Lab/Toaster Driver/Service/ServiceBase.h
new file mode 100644
index 00000000..ebae808e
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/Service/ServiceBase.h
@@ -0,0 +1,121 @@
+//*********************************************************
+//
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the MIT License (MIT).
+// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
+// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
+// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
+//
+//*********************************************************
+
+// 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.
+
+#pragma once
+
+#include <windows.h>
+#include <evntprov.h>
+
+class CServiceBase
+{
+public:
+
+ // 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.
+ static BOOL Run(CServiceBase& service);
+
+ // Service object constructor. The optional parameters (fCanStop,
+ // fCanShutdown and fCanPauseContinue) allow you to specify whether the
+ // service can be stopped, paused and continued, or be notified when
+ // system shutdown occurs.
+ CServiceBase(PWSTR pszServiceName,
+ BOOL fCanStop = TRUE,
+ BOOL fCanShutdown = TRUE,
+ BOOL fCanPauseContinue = FALSE);
+
+ // Service object destructor.
+ virtual ~CServiceBase(void);
+
+ // Stop the service.
+ void Stop();
+
+protected:
+
+ // 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.
+ virtual void OnStart(DWORD dwArgc, PWSTR *pszArgv);
+
+ // 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.
+ virtual void OnStop();
+
+ // 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.
+ virtual void OnPause();
+
+ // 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.
+ virtual void OnContinue();
+
+ // When implemented in a derived class, executes when the system is
+ // shutting down. Specifies what should occur immediately prior to the
+ // system shutting down.
+ virtual void OnShutdown();
+
+ // Set the service status and report the status to the SCM.
+ void SetServiceStatus(DWORD dwCurrentState,
+ DWORD dwWin32ExitCode = NO_ERROR,
+ DWORD dwWaitHint = 0);
+
+ // Log an event.
+ virtual void WriteEventLogEntry(PWSTR pszMessage, BYTE bLevel);
+
+ // Log an event.
+ void WriteErrorLogEntry(PWSTR pszFunction,
+ DWORD dwError = GetLastError());
+
+private:
+
+ // Entry point for the service. It registers the handler function for the
+ // service and starts the service.
+ static void WINAPI ServiceMain(DWORD dwArgc, LPWSTR *lpszArgv);
+
+ // The function is called by the SCM whenever a control code is sent to
+ // the service.
+ static void WINAPI ServiceCtrlHandler(DWORD dwCtrl);
+
+ // Start the service.
+ void Start(DWORD dwArgc, PWSTR *pszArgv);
+
+ // Pause the service.
+ void Pause();
+
+ // Resume the service after being paused.
+ void Continue();
+
+ // Execute when the system is shutting down.
+ 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;
+
+ REGHANDLE m_etwRegHandle;
+}; \ No newline at end of file
diff --git a/general/WinHEC 2017 Lab/Toaster Driver/Service/ServiceInstaller.cpp b/general/WinHEC 2017 Lab/Toaster Driver/Service/ServiceInstaller.cpp
new file mode 100644
index 00000000..27b107a9
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/Service/ServiceInstaller.cpp
@@ -0,0 +1,191 @@
+//*********************************************************
+//
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the MIT License (MIT).
+// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
+// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
+// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
+//
+//*********************************************************
+
+#include "stdafx.h"
+#pragma region "Includes"
+
+#include <stdio.h>
+#include <windows.h>
+#include "ServiceInstaller.h"
+#pragma endregion
+
+
+//
+// FUNCTION: InstallService
+//
+// PURPOSE: Install the current application as a service to the local
+// service control manager database.
+//
+// PARAMETERS:
+// * pszServiceName - the name of the service to be installed
+// * pszDisplayName - the display name of the service
+// * dwStartType - the service start option. This parameter can be one of
+// the following values: SERVICE_AUTO_START, SERVICE_BOOT_START,
+// SERVICE_DEMAND_START, SERVICE_DISABLED, SERVICE_SYSTEM_START.
+// * pszDependencies - a pointer to a double null-terminated array of null-
+// separated names of services or load ordering groups that the system
+// must start before this service.
+// * pszAccount - the name of the account under which the service runs.
+// * pszPassword - the password to the account name.
+//
+// NOTE: If the function fails to install the service, it prints the error
+// in the standard output stream for users to diagnose the problem.
+//
+void InstallService(
+ _In_ PWSTR pszServiceName,
+ _In_ PWSTR pszDisplayName,
+ _In_ DWORD dwStartType,
+ _In_ PWSTR pszDependencies,
+ _In_ PWSTR pszAccount,
+ _In_ PWSTR pszPassword)
+{
+ wchar_t szPath[MAX_PATH];
+ SC_HANDLE schSCManager = nullptr;
+ SC_HANDLE schService = nullptr;
+
+ if (GetModuleFileName(nullptr, szPath, ARRAYSIZE(szPath)) == 0)
+ {
+ wprintf(L"GetModuleFileName failed w/err 0x%08lx\n", GetLastError());
+ goto Cleanup;
+ }
+
+ // Open the local default service control manager database
+ schSCManager = OpenSCManager(nullptr, nullptr, SC_MANAGER_CONNECT |
+ SC_MANAGER_CREATE_SERVICE);
+ if (schSCManager == nullptr)
+ {
+ wprintf(L"OpenSCManager failed w/err 0x%08lx\n", GetLastError());
+ goto Cleanup;
+ }
+
+ // Install the service into SCM by calling CreateService
+ schService = CreateService(
+ schSCManager, // SCManager database
+ pszServiceName, // Name of service
+ pszDisplayName, // Name to display
+ SERVICE_QUERY_STATUS, // Desired access
+ SERVICE_WIN32_OWN_PROCESS, // Service type
+ dwStartType, // Service start type
+ SERVICE_ERROR_NORMAL, // Error control type
+ szPath, // Service's binary
+ nullptr, // No load ordering group
+ nullptr, // No tag identifier
+ pszDependencies, // Dependencies
+ pszAccount, // Service running account
+ pszPassword // Password of the account
+ );
+
+ if (schService == nullptr)
+ {
+ wprintf(L"CreateService failed w/err 0x%08lx\n", GetLastError());
+ goto Cleanup;
+ }
+
+ wprintf(L"%s is installed.\n", pszServiceName);
+
+Cleanup:
+ // Centralized cleanup for all allocated resources.
+ if (schSCManager)
+ {
+ CloseServiceHandle(schSCManager);
+ schSCManager = nullptr;
+ }
+ if (schService)
+ {
+ CloseServiceHandle(schService);
+ schService = nullptr;
+ }
+}
+
+
+//
+// FUNCTION: UninstallService
+//
+// PURPOSE: Stop and remove the service from the local service control
+// manager database.
+//
+// PARAMETERS:
+// * pszServiceName - the name of the service to be removed.
+//
+// NOTE: If the function fails to uninstall the service, it prints the
+// error in the standard output stream for users to diagnose the problem.
+//
+void UninstallService(_In_ PWSTR pszServiceName)
+{
+ SC_HANDLE schSCManager = nullptr;
+ SC_HANDLE schService = nullptr;
+ SERVICE_STATUS ssSvcStatus = {};
+
+ // Open the local default service control manager database
+ schSCManager = OpenSCManager(nullptr, nullptr, SC_MANAGER_CONNECT);
+ if (schSCManager == nullptr)
+ {
+ wprintf(L"OpenSCManager failed w/err 0x%08lx\n", GetLastError());
+ goto Cleanup;
+ }
+
+ // Open the service with delete, stop, and query status permissions
+ schService = OpenService(schSCManager, pszServiceName, SERVICE_STOP |
+ SERVICE_QUERY_STATUS | DELETE);
+ if (schService == nullptr)
+ {
+ wprintf(L"OpenService failed w/err 0x%08lx\n", GetLastError());
+ goto Cleanup;
+ }
+
+ // Try to stop the service
+ if (ControlService(schService, SERVICE_CONTROL_STOP, &ssSvcStatus))
+ {
+ wprintf(L"Stopping %s.", pszServiceName);
+ Sleep(1000);
+
+ while (QueryServiceStatus(schService, &ssSvcStatus))
+ {
+ if (ssSvcStatus.dwCurrentState == SERVICE_STOP_PENDING)
+ {
+ wprintf(L".");
+ Sleep(1000);
+ }
+ else break;
+ }
+
+ if (ssSvcStatus.dwCurrentState == SERVICE_STOPPED)
+ {
+ wprintf(L"\n%s is stopped.\n", pszServiceName);
+ }
+ else
+ {
+ wprintf(L"\n%s failed to stop.\n", pszServiceName);
+ }
+ }
+
+ // Now remove the service by calling DeleteService.
+ if (!DeleteService(schService))
+ {
+ wprintf(L"DeleteService failed w/err 0x%08lx\n", GetLastError());
+ goto Cleanup;
+ }
+
+ wprintf(L"%s is removed.\n", pszServiceName);
+
+Cleanup:
+ // Centralized cleanup for all allocated resources.
+ if (schSCManager)
+ {
+ CloseServiceHandle(schSCManager);
+ schSCManager = nullptr;
+ }
+ if (schService)
+ {
+ CloseServiceHandle(schService);
+ schService = nullptr;
+ }
+} \ No newline at end of file
diff --git a/general/WinHEC 2017 Lab/Toaster Driver/Service/ServiceInstaller.h b/general/WinHEC 2017 Lab/Toaster Driver/Service/ServiceInstaller.h
new file mode 100644
index 00000000..af6507e6
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/Service/ServiceInstaller.h
@@ -0,0 +1,57 @@
+//*********************************************************
+//
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the MIT License (MIT).
+// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
+// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
+// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
+//
+//*********************************************************
+
+// The file declares functions that install and uninstall the service.
+
+#pragma once
+
+//
+// FUNCTION: InstallService
+//
+// PURPOSE: Install the current application as a service to the local
+// service control manager database.
+//
+// PARAMETERS:
+// * pszServiceName - the name of the service to be installed
+// * pszDisplayName - the display name of the service
+// * dwStartType - the service start option. This parameter can be one of
+// the following values: SERVICE_AUTO_START, SERVICE_BOOT_START,
+// SERVICE_DEMAND_START, SERVICE_DISABLED, SERVICE_SYSTEM_START.
+// * pszDependencies - a pointer to a double null-terminated array of null-
+// separated names of services or load ordering groups that the system
+// must start before this service.
+// * pszAccount - the name of the account under which the service runs.
+// * pszPassword - the password to the account name.
+//
+// NOTE: If the function fails to install the service, it prints the error
+// in the standard output stream for users to diagnose the problem.
+//
+void InstallService(PWSTR pszServiceName,
+ PWSTR pszDisplayName,
+ DWORD dwStartType,
+ PWSTR pszDependencies,
+ PWSTR pszAccount,
+ PWSTR pszPassword);
+
+
+//
+// FUNCTION: UninstallService
+//
+// PURPOSE: Stop and remove the service from the local service control
+// manager database.
+//
+// PARAMETERS:
+// * pszServiceName - the name of the service to be removed.
+//
+// NOTE: If the function fails to uninstall the service, it prints the
+// error in the standard output stream for users to diagnose the problem.
+//
+void UninstallService(PWSTR pszServiceName);
diff --git a/general/WinHEC 2017 Lab/Toaster Driver/Service/stdafx.cpp b/general/WinHEC 2017 Lab/Toaster Driver/Service/stdafx.cpp
new file mode 100644
index 00000000..ce19a949
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/Service/stdafx.cpp
@@ -0,0 +1,8 @@
+// stdafx.cpp : source file that includes just the standard includes
+// RpcServer.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/WinHEC 2017 Lab/Toaster Driver/Service/stdafx.h b/general/WinHEC 2017 Lab/Toaster Driver/Service/stdafx.h
new file mode 100644
index 00000000..306c4330
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/Service/stdafx.h
@@ -0,0 +1,15 @@
+// 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 "targetver.h"
+
+#include <stdio.h>
+#include <tchar.h>
+
+#define NOMINMAX // disable min and max macros in windows.h
+
+extern bool ShutdownRequested;
diff --git a/general/WinHEC 2017 Lab/Toaster Driver/Service/targetver.h b/general/WinHEC 2017 Lab/Toaster Driver/Service/targetver.h
new file mode 100644
index 00000000..87c0086d
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/Service/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/WinHEC 2017 Lab/Toaster Driver/toaster.sln b/general/WinHEC 2017 Lab/Toaster Driver/toaster.sln
new file mode 100644
index 00000000..35e5dcbc
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/toaster.sln
@@ -0,0 +1,40 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.26430.12
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "toaster", "toaster\toaster.vcxproj", "{2D4FC000-01E2-4FDD-B01A-4FD3C59D245D}"
+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
+ {2D4FC000-01E2-4FDD-B01A-4FD3C59D245D}.Debug|ARM.ActiveCfg = Debug|ARM
+ {2D4FC000-01E2-4FDD-B01A-4FD3C59D245D}.Debug|ARM.Build.0 = Debug|ARM
+ {2D4FC000-01E2-4FDD-B01A-4FD3C59D245D}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {2D4FC000-01E2-4FDD-B01A-4FD3C59D245D}.Debug|ARM64.Build.0 = Debug|ARM64
+ {2D4FC000-01E2-4FDD-B01A-4FD3C59D245D}.Debug|x64.ActiveCfg = Debug|x64
+ {2D4FC000-01E2-4FDD-B01A-4FD3C59D245D}.Debug|x64.Build.0 = Debug|x64
+ {2D4FC000-01E2-4FDD-B01A-4FD3C59D245D}.Debug|x86.ActiveCfg = Debug|Win32
+ {2D4FC000-01E2-4FDD-B01A-4FD3C59D245D}.Debug|x86.Build.0 = Debug|Win32
+ {2D4FC000-01E2-4FDD-B01A-4FD3C59D245D}.Release|ARM.ActiveCfg = Release|ARM
+ {2D4FC000-01E2-4FDD-B01A-4FD3C59D245D}.Release|ARM.Build.0 = Release|ARM
+ {2D4FC000-01E2-4FDD-B01A-4FD3C59D245D}.Release|ARM64.ActiveCfg = Release|ARM64
+ {2D4FC000-01E2-4FDD-B01A-4FD3C59D245D}.Release|ARM64.Build.0 = Release|ARM64
+ {2D4FC000-01E2-4FDD-B01A-4FD3C59D245D}.Release|x64.ActiveCfg = Release|x64
+ {2D4FC000-01E2-4FDD-B01A-4FD3C59D245D}.Release|x64.Build.0 = Release|x64
+ {2D4FC000-01E2-4FDD-B01A-4FD3C59D245D}.Release|x86.ActiveCfg = Release|Win32
+ {2D4FC000-01E2-4FDD-B01A-4FD3C59D245D}.Release|x86.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/general/WinHEC 2017 Lab/Toaster Driver/toaster/driver.h b/general/WinHEC 2017 Lab/Toaster Driver/toaster/driver.h
new file mode 100644
index 00000000..8e7ade01
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/toaster/driver.h
@@ -0,0 +1,80 @@
+/*++
+Copyright (c) 1990-2000 Microsoft Corporation All Rights Reserved
+
+Module Name:
+
+ driver.h
+
+Abstract:
+
+ This module contains the common declarations for the
+ bus, function and filter drivers.
+
+Environment:
+
+ kernel mode only
+
+--*/
+
+//#include "public.h"
+
+//
+// Define an Interface Guid to access the proprietary toaster interface.
+// This guid is used to identify a specific interface in IRP_MN_QUERY_INTERFACE
+// handler.
+//
+
+DEFINE_GUID(GUID_TOASTER_INTERFACE_STANDARD,
+ 0xe0b27630, 0x5434, 0x11d3, 0xb8, 0x90, 0x0, 0xc0, 0x4f, 0xad, 0x51, 0x71);
+// {E0B27630-5434-11d3-B890-00C04FAD5171}
+
+
+//
+// GUID definition are required to be outside of header inclusion pragma to avoid
+// error during precompiled headers.
+//
+
+#ifndef __DRIVER_H
+#define __DRIVER_H
+
+//
+// Define Interface reference/dereference routines for
+// Interfaces exported by IRP_MN_QUERY_INTERFACE
+//
+
+typedef VOID (*PINTERFACE_REFERENCE)(PVOID Context);
+typedef VOID (*PINTERFACE_DEREFERENCE)(PVOID Context);
+
+typedef
+BOOLEAN
+(*PTOASTER_GET_CRISPINESS_LEVEL)(
+ IN PVOID Context,
+ OUT PUCHAR Level
+ );
+
+typedef
+BOOLEAN
+(*PTOASTER_SET_CRISPINESS_LEVEL)(
+ IN PVOID Context,
+ OUT UCHAR Level
+ );
+
+typedef
+BOOLEAN
+(*PTOASTER_IS_CHILD_PROTECTED)(
+ IN PVOID Context
+ );
+
+//
+// Interface for getting and setting power level etc.,
+//
+typedef struct _TOASTER_INTERFACE_STANDARD {
+ INTERFACE InterfaceHeader;
+ PTOASTER_GET_CRISPINESS_LEVEL GetCrispinessLevel;
+ PTOASTER_SET_CRISPINESS_LEVEL SetCrispinessLevel;
+ PTOASTER_IS_CHILD_PROTECTED IsSafetyLockEnabled; //):
+} TOASTER_INTERFACE_STANDARD, *PTOASTER_INTERFACE_STANDARD;
+
+
+#endif
+
diff --git a/general/WinHEC 2017 Lab/Toaster Driver/toaster/public.h b/general/WinHEC 2017 Lab/Toaster Driver/toaster/public.h
new file mode 100644
index 00000000..0628f95f
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/toaster/public.h
@@ -0,0 +1,167 @@
+/*++
+Copyright (c) 1990-2000 Microsoft Corporation All Rights Reserved
+
+Module Name:
+
+ public.h
+
+Abstract:
+
+ This module contains the common declarations shared by driver
+ and user applications.
+
+Environment:
+
+ user and kernel
+
+--*/
+
+//
+// Define an Interface Guid for bus enumerator class.
+// This GUID is used to register (IoRegisterDeviceInterface)
+// an instance of an interface so that enumerator application
+// can send an ioctl to the bus driver.
+//
+
+DEFINE_GUID (GUID_DEVINTERFACE_BUSENUM_TOASTER,
+ 0xD35F7840, 0x6A0C, 0x11d2, 0xB8, 0x41, 0x00, 0xC0, 0x4F, 0xAD, 0x51, 0x71);
+// {D35F7840-6A0C-11d2-B841-00C04FAD5171}
+
+//
+// Define an Interface Guid for toaster device class.
+// This GUID is used to register (IoRegisterDeviceInterface)
+// an instance of an interface so that user application
+// can control the toaster device.
+//
+
+DEFINE_GUID (GUID_DEVINTERFACE_TOASTER,
+ 0x781EF630, 0x72B2, 0x11d2, 0xB8, 0x52, 0x00, 0xC0, 0x4F, 0xAD, 0x51, 0x71);
+//{781EF630-72B2-11d2-B852-00C04FAD5171}
+
+//
+// Define a Setup Class GUID for Toaster Class. This is same
+// as the TOASTSER CLASS guid in the INF files.
+//
+
+DEFINE_GUID (GUID_DEVCLASS_TOASTER,
+ 0xB85B7C50, 0x6A01, 0x11d2, 0xB8, 0x41, 0x00, 0xC0, 0x4F, 0xAD, 0x51, 0x71);
+//{B85B7C50-6A01-11d2-B841-00C04FAD5171}
+
+//
+// Define a WMI GUID to get busenum info.
+//
+
+DEFINE_GUID (TOASTER_BUS_WMI_STD_DATA_GUID,
+ 0x0006A660, 0x8F12, 0x11d2, 0xB8, 0x54, 0x00, 0xC0, 0x4F, 0xAD, 0x51, 0x71);
+//{0006A660-8F12-11d2-B854-00C04FAD5171}
+
+//
+// Define a WMI GUID to get toaster device info.
+//
+
+DEFINE_GUID (TOASTER_WMI_STD_DATA_GUID,
+ 0xBBA21300L, 0x6DD3, 0x11d2, 0xB8, 0x44, 0x00, 0xC0, 0x4F, 0xAD, 0x51, 0x71);
+
+//
+// Define a WMI GUID to represent device arrival notification WMIEvent class.
+//
+
+DEFINE_GUID (TOASTER_NOTIFY_DEVICE_ARRIVAL_EVENT,
+ 0x1cdaff1, 0xc901, 0x45b4, 0xb3, 0x59, 0xb5, 0x54, 0x27, 0x25, 0xe2, 0x9c);
+// {01CDAFF1-C901-45b4-B359-B5542725E29C}
+
+
+//
+// GUID definition are required to be outside of header inclusion pragma to avoid
+// error during precompiled headers.
+//
+
+#ifndef __PUBLIC_H
+#define __PUBLIC_H
+
+#define BUS_HARDWARE_IDS L"{B85B7C50-6A01-11d2-B841-00C04FAD5171}\\MsToaster\0"
+#define BUS_HARDWARE_IDS_LENGTH sizeof (BUS_HARDWARE_IDS)
+
+#define BUSENUM_COMPATIBLE_IDS L"{B85B7C50-6A01-11d2-B841-00C04FAD5171}\\MsCompatibleToaster\0"
+#define BUSENUM_COMPATIBLE_IDS_LENGTH sizeof(BUSENUM_COMPATIBLE_IDS)
+
+
+#define FILE_DEVICE_BUSENUM FILE_DEVICE_BUS_EXTENDER
+
+#define BUSENUM_IOCTL(_index_) \
+ CTL_CODE (FILE_DEVICE_BUSENUM, _index_, METHOD_BUFFERED, FILE_READ_DATA)
+
+#define IOCTL_BUSENUM_PLUGIN_HARDWARE BUSENUM_IOCTL (0x0)
+#define IOCTL_BUSENUM_UNPLUG_HARDWARE BUSENUM_IOCTL (0x1)
+#define IOCTL_BUSENUM_EJECT_HARDWARE BUSENUM_IOCTL (0x2)
+#define IOCTL_TOASTER_DONT_DISPLAY_IN_UI_DEVICE BUSENUM_IOCTL (0x3)
+
+//
+// Data structure used in PlugIn and UnPlug ioctls
+//
+
+typedef struct _BUSENUM_PLUGIN_HARDWARE
+{
+ //
+ // sizeof (struct _BUSENUM_HARDWARE)
+ //
+ IN ULONG Size;
+
+ //
+ // Unique serial number of the device to be enumerated.
+ // Enumeration will be failed if another device on the
+ // bus has the same serail number.
+ //
+
+ IN ULONG SerialNo;
+
+ //
+ // An array of (zero terminated wide character strings). The array itself
+ // also null terminated (ie, MULTI_SZ)
+ //
+ #pragma warning(disable:4200) // nonstandard extension used
+
+ IN WCHAR HardwareIDs[];
+
+ #pragma warning(default:4200)
+
+} BUSENUM_PLUGIN_HARDWARE, *PBUSENUM_PLUGIN_HARDWARE;
+
+typedef struct _BUSENUM_UNPLUG_HARDWARE
+{
+ //
+ // sizeof (struct _REMOVE_HARDWARE)
+ //
+
+ IN ULONG Size;
+
+ //
+ // Serial number of the device to be plugged out
+ //
+
+ ULONG SerialNo;
+
+ ULONG Reserved[2];
+
+} BUSENUM_UNPLUG_HARDWARE, *PBUSENUM_UNPLUG_HARDWARE;
+
+typedef struct _BUSENUM_EJECT_HARDWARE
+{
+ //
+ // sizeof (struct _EJECT_HARDWARE)
+ //
+
+ IN ULONG Size;
+
+ //
+ // Serial number of the device to be ejected
+ //
+
+ ULONG SerialNo;
+
+ ULONG Reserved[2];
+
+} BUSENUM_EJECT_HARDWARE, *PBUSENUM_EJECT_HARDWARE;
+
+#endif
+
diff --git a/general/WinHEC 2017 Lab/Toaster Driver/toaster/toaster.c b/general/WinHEC 2017 Lab/Toaster Driver/toaster/toaster.c
new file mode 100644
index 00000000..6ed215db
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/toaster/toaster.c
@@ -0,0 +1,418 @@
+/*++
+
+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:
+
+ Toaster.c
+
+Abstract:
+
+ This is a simple form of function driver for toaster device. The driver
+ doesn't handle any PnP and Power events because the framework provides
+ default behavior for those events. This driver has enough support to
+ allow an user application (toast/notify.exe) to open the device
+ interface registered by the driver and send read, write or ioctl requests.
+
+Environment:
+
+ Kernel mode
+
+--*/
+
+#include "toaster.h"
+
+#ifdef ALLOC_PRAGMA
+#pragma alloc_text (INIT, DriverEntry)
+#pragma alloc_text (PAGE, ToasterEvtDeviceAdd)
+#pragma alloc_text (PAGE, ToasterEvtIoRead)
+#pragma alloc_text (PAGE, ToasterEvtIoWrite)
+#pragma alloc_text (PAGE, ToasterEvtIoDeviceControl)
+#endif
+
+
+NTSTATUS
+DriverEntry(
+ IN PDRIVER_OBJECT DriverObject,
+ IN PUNICODE_STRING RegistryPath
+ )
+/*++
+
+Routine Description:
+ DriverEntry initializes the driver and is the first routine called by the
+ system after the driver is loaded. DriverEntry configures and creates a WDF driver
+ object.
+ .
+Parameters Description:
+
+ DriverObject - represents the instance of the function driver that is loaded
+ into memory. 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 otherwise.
+
+--*/
+{
+ NTSTATUS status = STATUS_SUCCESS;
+ WDF_DRIVER_CONFIG config;
+
+ KdPrint(("Toaster Function Driver Sample - Driver Framework Edition.\n"));
+
+ //
+ // Initiialize driver config to control the attributes that
+ // are global to the driver. Note that framework by default
+ // provides a driver unload routine. If DriverEntry creates any resources
+ // that require clean-up in driver unload,
+ // you can manually override the default by supplying a pointer to the EvtDriverUnload
+ // callback in the config structure. In general xxx_CONFIG_INIT macros are provided to
+ // initialize most commonly used members.
+ //
+
+ WDF_DRIVER_CONFIG_INIT(
+ &config,
+ ToasterEvtDeviceAdd
+ );
+
+
+ //
+ // Create a framework driver object to represent our driver.
+ //
+ status = WdfDriverCreate(
+ DriverObject,
+ RegistryPath,
+ WDF_NO_OBJECT_ATTRIBUTES, // Driver Attributes
+ &config, // Driver Config Info
+ WDF_NO_HANDLE
+ );
+
+ if (!NT_SUCCESS(status)) {
+ KdPrint( ("WdfDriverCreate failed with status 0x%x\n", status));
+ }
+
+ return status;
+}
+
+
+NTSTATUS
+ToasterEvtDeviceAdd(
+ IN WDFDRIVER Driver,
+ IN PWDFDEVICE_INIT DeviceInit
+ )
+/*++
+Routine Description:
+
+ ToasterEvtDeviceAdd is called by the framework in response to AddDevice
+ call from the PnP manager. We create and initialize a WDF device object to
+ represent a new instance of toaster 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 status = STATUS_SUCCESS;
+ PFDO_DATA fdoData;
+ WDF_IO_QUEUE_CONFIG queueConfig;
+ WDF_OBJECT_ATTRIBUTES fdoAttributes;
+ WDFDEVICE hDevice;
+ WDFQUEUE queue;
+
+ UNREFERENCED_PARAMETER(Driver);
+
+ PAGED_CODE();
+
+ KdPrint(("ToasterEvtDeviceAdd called\n"));
+
+ //
+ // Initialize attributes and a context area for the device object.
+ //
+ //
+ WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&fdoAttributes, FDO_DATA);
+
+ //
+ // Create a framework device object.This call will in turn create
+ // a WDM device object, attach to the lower stack, and set the
+ // appropriate flags and attributes.
+ //
+ status = WdfDeviceCreate(&DeviceInit, &fdoAttributes, &hDevice);
+ if (!NT_SUCCESS(status)) {
+ KdPrint( ("WdfDeviceCreate failed with status code 0x%x\n", status));
+ return status;
+ }
+
+ //
+ // Get the device context by using the accessor function specified in
+ // the WDF_DECLARE_CONTEXT_TYPE_WITH_NAME macro for FDO_DATA.
+ //
+ fdoData = ToasterFdoGetData(hDevice);
+
+ //
+ // Tell the Framework that this device will need an interface
+ //
+ status = WdfDeviceCreateDeviceInterface(
+ hDevice,
+ (LPGUID) &GUID_DEVINTERFACE_TOASTER,
+ NULL // ReferenceString
+ );
+
+ if (!NT_SUCCESS (status)) {
+ KdPrint( ("WdfDeviceCreateDeviceInterface failed 0x%x\n", status));
+ return status;
+ }
+
+ //
+ // Register I/O callbacks to tell the framework that you are interested
+ // in handling IRP_MJ_READ, IRP_MJ_WRITE, and IRP_MJ_DEVICE_CONTROL requests.
+ // If a specific callback function is not specified for one ofthese,
+ // the request will be dispatched to the EvtIoDefault handler, if any.
+ // If there is no EvtIoDefault handler, the request will be failed with
+ // STATUS_INVALID_DEVICE_REQUEST.
+ // WdfIoQueueDispatchParallel means that we are capable of handling
+ // all the I/O requests simultaneously and we are responsible for protecting
+ // data that could be accessed by these callbacks simultaneously.
+ // A default queue gets all the requests that are not
+ // configured for forwarding using WdfDeviceConfigureRequestDispatching.
+ //
+ WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&queueConfig, WdfIoQueueDispatchParallel);
+
+ queueConfig.EvtIoRead = ToasterEvtIoRead;
+ queueConfig.EvtIoWrite = ToasterEvtIoWrite;
+ queueConfig.EvtIoDeviceControl = ToasterEvtIoDeviceControl;
+
+ //
+ // 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 or
+ // forward them to other drivers. This driver completes the requests
+ // directly in the queue's handlers. If the EvtIoStop callback is not
+ // implemented, the framework waits for all driver-owned requests to be
+ // done before moving in 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(queueConfig.EvtIoStop != 0);
+ status = WdfIoQueueCreate(
+ hDevice,
+ &queueConfig,
+ WDF_NO_OBJECT_ATTRIBUTES,
+ &queue
+ );
+ __analysis_assume(queueConfig.EvtIoStop == 0);
+
+ if (!NT_SUCCESS (status)) {
+
+ KdPrint( ("WdfIoQueueCreate failed 0x%x\n", status));
+ return status;
+ }
+
+ return status;
+}
+
+VOID
+ToasterEvtIoRead (
+ WDFQUEUE Queue,
+ WDFREQUEST Request,
+ size_t Length
+ )
+/*++
+
+Routine Description:
+
+ Performs read from the toaster device. This event is called when the
+ framework receives IRP_MJ_READ requests.
+
+Arguments:
+
+ Queue - Handle to the framework queue object that is associated with the
+ I/O request.
+ Request - Handle to a framework request object.
+
+ Lenght - Length of the data buffer associated with the request.
+ By default, the queue does not dispatch
+ zero length read & write requests to the driver and instead to
+ complete such requests with status success. So we will never get
+ a zero length request.
+
+Return Value:
+
+ None.
+
+--*/
+{
+ NTSTATUS status;
+ ULONG_PTR bytesCopied =0;
+ WDFMEMORY memory;
+
+ UNREFERENCED_PARAMETER(Queue);
+ UNREFERENCED_PARAMETER(Length);
+
+ PAGED_CODE();
+
+ KdPrint(( "ToasterEvtIoRead: Request: 0x%p, Queue: 0x%p\n",
+ Request, Queue));
+
+ //
+ // Get the request memory and perform read operation here
+ //
+ status = WdfRequestRetrieveOutputMemory(Request, &memory);
+ if(NT_SUCCESS(status) ) {
+ //
+ // Copy data into the memory buffer using WdfMemoryCopyFromBuffer
+ //
+ }
+
+ WdfRequestCompleteWithInformation(Request, status, bytesCopied);
+}
+
+VOID
+ToasterEvtIoWrite (
+ WDFQUEUE Queue,
+ WDFREQUEST Request,
+ size_t Length
+ )
+/*++
+
+Routine Description:
+
+ Performs write to the toaster device. This event is called when the
+ framework receives IRP_MJ_WRITE requests.
+
+Arguments:
+
+ Queue - Handle to the framework queue object that is associated with the
+ I/O request.
+ Request - Handle to a framework request object.
+
+ 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:
+
+ None
+--*/
+
+{
+ NTSTATUS status;
+ ULONG_PTR bytesWritten =0;
+ WDFMEMORY memory;
+
+ UNREFERENCED_PARAMETER(Queue);
+ UNREFERENCED_PARAMETER(Length);
+
+ KdPrint(("ToasterEvtIoWrite. Request: 0x%p, Queue: 0x%p\n",
+ Request, Queue));
+
+ PAGED_CODE();
+
+ //
+ // Get the request buffer and perform write operation here
+ //
+ status = WdfRequestRetrieveInputMemory(Request, &memory);
+ if(NT_SUCCESS(status) ) {
+ //
+ // 1) Use WdfMemoryCopyToBuffer to copy data from the request
+ // to driver buffer.
+ // 2) Or get the buffer pointer from the request by calling
+ // WdfRequestRetrieveInputBuffer
+ // 3) Or you can get the buffer pointer from the memory handle
+ // by calling WdfMemoryGetBuffer.
+ //
+ bytesWritten = Length;
+ }
+
+ WdfRequestCompleteWithInformation(Request, status, bytesWritten);
+
+}
+
+
+VOID
+ToasterEvtIoDeviceControl(
+ IN WDFQUEUE Queue,
+ IN WDFREQUEST Request,
+ IN size_t OutputBufferLength,
+ IN size_t InputBufferLength,
+ IN ULONG IoControlCode
+ )
+/*++
+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
+
+--*/
+{
+ NTSTATUS status= STATUS_SUCCESS;
+
+ UNREFERENCED_PARAMETER(Queue);
+ UNREFERENCED_PARAMETER(OutputBufferLength);
+ UNREFERENCED_PARAMETER(InputBufferLength);
+
+ KdPrint(("ToasterEvtIoDeviceControl called\n"));
+
+ PAGED_CODE();
+
+ //
+ // Use WdfRequestRetrieveInputBuffer and WdfRequestRetrieveOutputBuffer
+ // to get the request buffers.
+ //
+
+ switch (IoControlCode) {
+
+ default:
+ status = STATUS_INVALID_DEVICE_REQUEST;
+ }
+
+ //
+ // Complete the Request.
+ //
+ WdfRequestCompleteWithInformation(Request, status, (ULONG_PTR) 0);
+}
+
+
diff --git a/general/WinHEC 2017 Lab/Toaster Driver/toaster/toaster.h b/general/WinHEC 2017 Lab/Toaster Driver/toaster/toaster.h
new file mode 100644
index 00000000..fc847d2d
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/toaster/toaster.h
@@ -0,0 +1,134 @@
+/*++
+
+Copyright (c) 1990-2000 Microsoft Corporation All Rights Reserved
+
+Module Name:
+
+ Toaster.h
+
+Abstract:
+
+ Header file for the toaster driver modules.
+
+Environment:
+
+ Kernel mode
+
+--*/
+
+
+#if !defined(_TOASTER_H_)
+#define _TOASTER_H_
+
+#include <ntddk.h>
+#include <wdf.h>
+
+#define NTSTRSAFE_LIB
+#include <ntstrsafe.h>
+
+#include "wmilib.h"
+#include <initguid.h>
+#include "driver.h"
+#include "public.h"
+
+// For Featured driver only
+#ifdef TOASTER_FUNC_FEATURED
+#include <wpprecorder.h>
+#endif // TOASTER_FUNC_FEATURED
+
+#define TOASTER_POOL_TAG (ULONG) 'saoT'
+
+#define MOFRESOURCENAME L"ToasterWMI"
+
+#define TOASTER_FUNC_DEVICE_LOG_ID "ToasterDevice"
+//
+// The device extension for the device object
+//
+typedef struct _FDO_DATA
+{
+
+ WDFWMIINSTANCE WmiDeviceArrivalEvent;
+
+ BOOLEAN WmiPowerDeviceEnableRegistered;
+
+ TOASTER_INTERFACE_STANDARD BusInterface;
+
+// For Featured driver only
+#ifdef TOASTER_FUNC_FEATURED
+ RECORDER_LOG WppRecorderLog;
+#endif // TOASTER_FUNC_FEATURED
+
+} FDO_DATA, *PFDO_DATA;
+
+WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(FDO_DATA, ToasterFdoGetData)
+
+
+//
+// Connector Types
+//
+
+#define TOASTER_WMI_STD_I8042 0
+#define TOASTER_WMI_STD_SERIAL 1
+#define TOASTER_WMI_STD_PARALEL 2
+#define TOASTER_WMI_STD_USB 3
+
+DRIVER_INITIALIZE DriverEntry;
+EVT_WDF_DRIVER_UNLOAD ToasterEvtDriverUnload;
+
+EVT_WDF_DRIVER_DEVICE_ADD ToasterEvtDeviceAdd;
+
+EVT_WDF_DEVICE_CONTEXT_CLEANUP ToasterEvtDeviceContextCleanup;
+EVT_WDF_DEVICE_D0_ENTRY ToasterEvtDeviceD0Entry;
+EVT_WDF_DEVICE_D0_EXIT ToasterEvtDeviceD0Exit;
+EVT_WDF_DEVICE_PREPARE_HARDWARE ToasterEvtDevicePrepareHardware;
+EVT_WDF_DEVICE_RELEASE_HARDWARE ToasterEvtDeviceReleaseHardware;
+
+EVT_WDF_DEVICE_SELF_MANAGED_IO_INIT ToasterEvtDeviceSelfManagedIoInit;
+
+//
+// Io events callbacks.
+//
+EVT_WDF_IO_QUEUE_IO_READ ToasterEvtIoRead;
+EVT_WDF_IO_QUEUE_IO_WRITE ToasterEvtIoWrite;
+EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL ToasterEvtIoDeviceControl;
+EVT_WDF_DEVICE_FILE_CREATE ToasterEvtDeviceFileCreate;
+EVT_WDF_FILE_CLOSE ToasterEvtFileClose;
+
+NTSTATUS
+ToasterWmiRegistration(
+ _In_ WDFDEVICE Device
+ );
+
+//
+// Power events callbacks
+//
+EVT_WDF_DEVICE_ARM_WAKE_FROM_S0 ToasterEvtDeviceArmWakeFromS0;
+EVT_WDF_DEVICE_ARM_WAKE_FROM_SX ToasterEvtDeviceArmWakeFromSx;
+EVT_WDF_DEVICE_DISARM_WAKE_FROM_S0 ToasterEvtDeviceDisarmWakeFromS0;
+EVT_WDF_DEVICE_DISARM_WAKE_FROM_SX ToasterEvtDeviceDisarmWakeFromSx;
+EVT_WDF_DEVICE_WAKE_FROM_S0_TRIGGERED ToasterEvtDeviceWakeFromS0Triggered;
+EVT_WDF_DEVICE_WAKE_FROM_SX_TRIGGERED ToasterEvtDeviceWakeFromSxTriggered;
+
+PCHAR
+DbgDevicePowerString(
+ IN WDF_POWER_DEVICE_STATE Type
+ );
+
+//
+// WMI event callbacks
+//
+EVT_WDF_WMI_INSTANCE_QUERY_INSTANCE EvtWmiInstanceStdDeviceDataQueryInstance;
+EVT_WDF_WMI_INSTANCE_QUERY_INSTANCE EvtWmiInstanceToasterControlQueryInstance;
+EVT_WDF_WMI_INSTANCE_SET_INSTANCE EvtWmiInstanceStdDeviceDataSetInstance;
+EVT_WDF_WMI_INSTANCE_SET_INSTANCE EvtWmiInstanceToasterControlSetInstance;
+EVT_WDF_WMI_INSTANCE_SET_ITEM EvtWmiInstanceToasterControlSetItem;
+EVT_WDF_WMI_INSTANCE_SET_ITEM EvtWmiInstanceStdDeviceDataSetItem;
+EVT_WDF_WMI_INSTANCE_EXECUTE_METHOD EvtWmiInstanceToasterControlExecuteMethod;
+
+NTSTATUS
+ToasterFireArrivalEvent(
+ _In_ WDFDEVICE Device
+ );
+
+#endif // _TOASTER_H_
+
diff --git a/general/WinHEC 2017 Lab/Toaster Driver/toaster/toaster.inx b/general/WinHEC 2017 Lab/Toaster Driver/toaster/toaster.inx
new file mode 100644
index 00000000..2217039d
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/toaster/toaster.inx
@@ -0,0 +1,25 @@
+;Copyright (c) Microsoft Corporation. All rights reserved.
+
+[Version]
+Signature = "$WINDOWS NT$"
+Class = System
+ClassGuid = {4D36E97D-E325-11CE-BFC1-08002BE10318}
+Provider = Contoso
+DriverVer = 06/16/1999, 5.00.2064
+CatalogFile = toaster.cat
+
+[Manufacturer]
+Contoso = Contoso, NT$ARCH$
+
+[Contoso.NT$ARCH$]
+"Basic Toaster" = Toaster_Device, TOASTER\BASIC_TOASTER
+
+[Toaster_Device.NT]
+CopyFiles = Toaster_Device.NT.Copy
+
+[Toaster_Device.NT.Copy]
+
+[SourceDisksNames]
+1 = "Toaster Device Installation Disk #1",,,""
+
+[SourceDisksFiles] \ No newline at end of file
diff --git a/general/WinHEC 2017 Lab/Toaster Driver/toaster/toaster.vcxproj b/general/WinHEC 2017 Lab/Toaster Driver/toaster/toaster.vcxproj
new file mode 100644
index 00000000..cfdfd574
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/toaster/toaster.vcxproj
@@ -0,0 +1,229 @@
+<?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>
+ <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>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{2D4FC000-01E2-4FDD-B01A-4FD3C59D245D}</ProjectGuid>
+ <TemplateGuid>{497e31cb-056b-4f31-abb8-447fd55ee5a5}</TemplateGuid>
+ <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+ <MinimumVisualStudioVersion>12.0</MinimumVisualStudioVersion>
+ <Configuration>Debug</Configuration>
+ <Platform Condition="'$(Platform)' == ''">Win32</Platform>
+ <RootNamespace>toaster</RootNamespace>
+ <WindowsTargetPlatformVersion>$(LatestTargetPlatformVersion)</WindowsTargetPlatformVersion>
+ </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>Driver</ConfigurationType>
+ <DriverType>KMDF</DriverType>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
+ <ConfigurationType>Driver</ConfigurationType>
+ <DriverType>KMDF</DriverType>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
+ <ConfigurationType>Driver</ConfigurationType>
+ <DriverType>KMDF</DriverType>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ <SupportsPackaging>true</SupportsPackaging>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
+ <ConfigurationType>Driver</ConfigurationType>
+ <DriverType>KMDF</DriverType>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
+ <ConfigurationType>Driver</ConfigurationType>
+ <DriverType>KMDF</DriverType>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
+ <ConfigurationType>Driver</ConfigurationType>
+ <DriverType>KMDF</DriverType>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
+ <ConfigurationType>Driver</ConfigurationType>
+ <DriverType>KMDF</DriverType>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
+ <ConfigurationType>Driver</ConfigurationType>
+ <DriverType>KMDF</DriverType>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ </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>DbgengKernelDebugger</DebuggerFlavor>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
+ <ApiValidator_Enable>true</ApiValidator_Enable>
+ <OutDir>$(SolutionDir)$(Platform)\$(ConfigurationName)\</OutDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
+ <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
+ <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <WppEnabled>true</WppEnabled>
+ <WppRecorderEnabled>true</WppRecorderEnabled>
+ <WppScanConfigurationData Condition="'%(ClCompile.ScanConfigurationData)' == ''">trace.h</WppScanConfigurationData>
+ <WppKernelMode>true</WppKernelMode>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WppEnabled>true</WppEnabled>
+ <WppRecorderEnabled>true</WppRecorderEnabled>
+ <WppScanConfigurationData Condition="'%(ClCompile.ScanConfigurationData)' == ''">trace.h</WppScanConfigurationData>
+ <WppKernelMode>true</WppKernelMode>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <WppEnabled>true</WppEnabled>
+ <WppRecorderEnabled>true</WppRecorderEnabled>
+ <WppScanConfigurationData Condition="'%(ClCompile.ScanConfigurationData)' == ''">trace.h</WppScanConfigurationData>
+ <WppKernelMode>true</WppKernelMode>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <WppEnabled>true</WppEnabled>
+ <WppRecorderEnabled>true</WppRecorderEnabled>
+ <WppScanConfigurationData Condition="'%(ClCompile.ScanConfigurationData)' == ''">trace.h</WppScanConfigurationData>
+ <WppKernelMode>true</WppKernelMode>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <ClCompile>
+ <WppEnabled>true</WppEnabled>
+ <WppRecorderEnabled>true</WppRecorderEnabled>
+ <WppScanConfigurationData Condition="'%(ClCompile.ScanConfigurationData)' == ''">trace.h</WppScanConfigurationData>
+ <WppKernelMode>true</WppKernelMode>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <ClCompile>
+ <WppEnabled>true</WppEnabled>
+ <WppRecorderEnabled>true</WppRecorderEnabled>
+ <WppScanConfigurationData Condition="'%(ClCompile.ScanConfigurationData)' == ''">trace.h</WppScanConfigurationData>
+ <WppKernelMode>true</WppKernelMode>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
+ <ClCompile>
+ <WppEnabled>true</WppEnabled>
+ <WppRecorderEnabled>true</WppRecorderEnabled>
+ <WppScanConfigurationData Condition="'%(ClCompile.ScanConfigurationData)' == ''">trace.h</WppScanConfigurationData>
+ <WppKernelMode>true</WppKernelMode>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
+ <ClCompile>
+ <WppEnabled>true</WppEnabled>
+ <WppRecorderEnabled>true</WppRecorderEnabled>
+ <WppScanConfigurationData Condition="'%(ClCompile.ScanConfigurationData)' == ''">trace.h</WppScanConfigurationData>
+ <WppKernelMode>true</WppKernelMode>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <FilesToPackage Include="$(TargetPath)" />
+ </ItemGroup>
+ <ItemGroup>
+ <Inf Include="toaster.inx" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="driver.h" />
+ <ClInclude Include="public.h" />
+ <ClInclude Include="toaster.h" />
+ <ClInclude Include="trace.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="toaster.c" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/general/WinHEC 2017 Lab/Toaster Driver/toaster/toaster.vcxproj.filters b/general/WinHEC 2017 Lab/Toaster Driver/toaster/toaster.vcxproj.filters
new file mode 100644
index 00000000..2edeb4fc
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/toaster/toaster.vcxproj.filters
@@ -0,0 +1,45 @@
+<?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;mfcribbon-ms</Extensions>
+ </Filter>
+ <Filter Include="Driver Files">
+ <UniqueIdentifier>{8E41214B-6785-4CFE-B992-037D68949A14}</UniqueIdentifier>
+ <Extensions>inf;inv;inx;mof;mc;</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <Inf Include="toaster.inx">
+ <Filter>Driver Files</Filter>
+ </Inf>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="driver.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="public.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="toaster.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="trace.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="toaster.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/general/WinHEC 2017 Lab/Toaster Driver/toaster/trace.h b/general/WinHEC 2017 Lab/Toaster Driver/toaster/trace.h
new file mode 100644
index 00000000..820df2ea
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Driver/toaster/trace.h
@@ -0,0 +1,62 @@
+/*++
+
+Module Name:
+
+ Trace.h
+
+Abstract:
+
+ Header file for the debug tracing related function defintions and macros.
+
+Environment:
+
+ Kernel mode
+
+--*/
+
+//
+// Define the tracing flags.
+//
+// Tracing GUID - f1f5e659-1217-48bd-9c69-6d9cb3a147d5
+//
+
+#define WPP_CONTROL_GUIDS \
+ WPP_DEFINE_CONTROL_GUID( \
+ KMDFDriver1TraceGuid, (f1f5e659,1217,48bd,9c69,6d9cb3a147d5), \
+ \
+ WPP_DEFINE_BIT(MYDRIVER_ALL_INFO) \
+ WPP_DEFINE_BIT(TRACE_DRIVER) \
+ WPP_DEFINE_BIT(TRACE_DEVICE) \
+ WPP_DEFINE_BIT(TRACE_QUEUE) \
+ )
+
+#define WPP_FLAG_LEVEL_LOGGER(flag, level) \
+ WPP_LEVEL_LOGGER(flag)
+
+#define WPP_FLAG_LEVEL_ENABLED(flag, level) \
+ (WPP_LEVEL_ENABLED(flag) && \
+ WPP_CONTROL(WPP_BIT_ ## flag).Level >= level)
+
+#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)
+
+//
+// WPP orders static parameters before dynamic parameters. To support the Trace function
+// defined below which sets FLAGS=MYDRIVER_ALL_INFO, a custom macro must be defined to
+// reorder the arguments to what the .tpl configuration file expects.
+//
+#define WPP_RECORDER_FLAGS_LEVEL_ARGS(flags, lvl) WPP_RECORDER_LEVEL_FLAGS_ARGS(lvl, flags)
+#define WPP_RECORDER_FLAGS_LEVEL_FILTER(flags, lvl) WPP_RECORDER_LEVEL_FLAGS_FILTER(lvl, flags)
+
+//
+// This comment block is scanned by the trace preprocessor to define our
+// Trace function.
+//
+// begin_wpp config
+// FUNC Trace{FLAGS=MYDRIVER_ALL_INFO}(LEVEL, MSG, ...);
+// FUNC TraceEvents(LEVEL, FLAGS, MSG, ...);
+// end_wpp
+//
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/App.sln b/general/WinHEC 2017 Lab/Toaster Support App/App.sln
new file mode 100644
index 00000000..8d28827e
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/App.sln
@@ -0,0 +1,40 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.26430.12
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CustomCapability", "App\CustomCapability\cpp\CustomCapability.vcxproj", "{0213712B-62E6-5546-8D25-79B90244FFA9}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|ARM = Debug|ARM
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|ARM = Release|ARM
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {0213712B-62E6-5546-8D25-79B90244FFA9}.Debug|ARM.ActiveCfg = Debug|ARM
+ {0213712B-62E6-5546-8D25-79B90244FFA9}.Debug|ARM.Build.0 = Debug|ARM
+ {0213712B-62E6-5546-8D25-79B90244FFA9}.Debug|ARM.Deploy.0 = Debug|ARM
+ {0213712B-62E6-5546-8D25-79B90244FFA9}.Debug|x64.ActiveCfg = Debug|x64
+ {0213712B-62E6-5546-8D25-79B90244FFA9}.Debug|x64.Build.0 = Debug|x64
+ {0213712B-62E6-5546-8D25-79B90244FFA9}.Debug|x64.Deploy.0 = Debug|x64
+ {0213712B-62E6-5546-8D25-79B90244FFA9}.Debug|x86.ActiveCfg = Debug|Win32
+ {0213712B-62E6-5546-8D25-79B90244FFA9}.Debug|x86.Build.0 = Debug|Win32
+ {0213712B-62E6-5546-8D25-79B90244FFA9}.Debug|x86.Deploy.0 = Debug|Win32
+ {0213712B-62E6-5546-8D25-79B90244FFA9}.Release|ARM.ActiveCfg = Release|ARM
+ {0213712B-62E6-5546-8D25-79B90244FFA9}.Release|ARM.Build.0 = Release|ARM
+ {0213712B-62E6-5546-8D25-79B90244FFA9}.Release|ARM.Deploy.0 = Release|ARM
+ {0213712B-62E6-5546-8D25-79B90244FFA9}.Release|x64.ActiveCfg = Release|x64
+ {0213712B-62E6-5546-8D25-79B90244FFA9}.Release|x64.Build.0 = Release|x64
+ {0213712B-62E6-5546-8D25-79B90244FFA9}.Release|x64.Deploy.0 = Release|x64
+ {0213712B-62E6-5546-8D25-79B90244FFA9}.Release|x86.ActiveCfg = Release|Win32
+ {0213712B-62E6-5546-8D25-79B90244FFA9}.Release|x86.Build.0 = Release|Win32
+ {0213712B-62E6-5546-8D25-79B90244FFA9}.Release|x86.Deploy.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/CustomCapability.SCCD b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/CustomCapability.SCCD
new file mode 100644
index 00000000..cad58db2
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/CustomCapability.SCCD
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<CustomCapabilityDescriptor xmlns="http://schemas.microsoft.com/appx/2016/sccd" xmlns:s="http://schemas.microsoft.com/appx/2016/sccd">
+ <CustomCapabilities>
+ <CustomCapability Name="microsoft.hsaTestCustomCapability_q536wpkpf5cy2"></CustomCapability>
+ </CustomCapabilities>
+ <AuthorizedEntities>
+ <AuthorizedEntity AppPackageFamilyName="Microsoft.SDKSamples.CustomCapability.CPP_8wekyb3d8bbwe" CertificateSignatureHash="ca9fc964db7e0c2938778f4559946833e7a8cfde0f3eaa07650766d4764e86c4"></AuthorizedEntity>
+ <AuthorizedEntity AppPackageFamilyName="Microsoft.SDKSamples.CustomCapability.CPP_8wekyb3d8bbwe" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity>
+ </AuthorizedEntities>
+ <Catalog>xxxx</Catalog>
+</CustomCapabilityDescriptor>
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/CustomCapability.vcxproj b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/CustomCapability.vcxproj
new file mode 100644
index 00000000..8efaa78d
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/CustomCapability.vcxproj
@@ -0,0 +1,287 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{0213712b-62e6-5546-8d25-79b90244ffa9}</ProjectGuid>
+ <RootNamespace>SDKTemplate</RootNamespace>
+ <DefaultLanguage>en-US</DefaultLanguage>
+ <MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion>
+ <AppContainerApplication>true</AppContainerApplication>
+ <ApplicationType>Windows Store</ApplicationType>
+ <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
+ <WindowsTargetPlatformMinVersion>10.0.15063.0</WindowsTargetPlatformMinVersion>
+ <ApplicationTypeRevision>10.0</ApplicationTypeRevision>
+ <ProjectName>CustomCapability</ProjectName>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|ARM">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <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|ARM">
+ <Configuration>Release</Configuration>
+ <Platform>ARM</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 Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v141</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v141</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v141</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v141</PlatformToolset>
+ <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v141</PlatformToolset>
+ <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v141</PlatformToolset>
+ <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </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" />
+ <Import Project="$([Microsoft.Build.Utilities.ToolLocationHelper]::GetPlatformExtensionSDKLocation(`WindowsDesktop, Version=10.0.15063.0`, $(TargetPlatformIdentifier), $(TargetPlatformVersion), $(SDKReferenceDirectoryRoot), $(SDKExtensionDirectoryRoot), $(SDKReferenceRegistryRoot)))\DesignTime\CommonConfiguration\Neutral\WindowsDesktop.props" Condition="exists('$([Microsoft.Build.Utilities.ToolLocationHelper]::GetPlatformExtensionSDKLocation(`WindowsDesktop, Version=10.0.15063.0`, $(TargetPlatformIdentifier), $(TargetPlatformVersion), $(SDKReferenceDirectoryRoot), $(SDKExtensionDirectoryRoot), $(SDKReferenceRegistryRoot)))\DesignTime\CommonConfiguration\Neutral\WindowsDesktop.props')" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$([Microsoft.Build.Utilities.ToolLocationHelper]::GetPlatformExtensionSDKLocation(`WindowsDesktop, Version=10.0.15063.0`, $(TargetPlatformIdentifier), $(TargetPlatformVersion), $(SDKReferenceDirectoryRoot), $(SDKExtensionDirectoryRoot), $(SDKReferenceRegistryRoot)))\DesignTime\CommonConfiguration\Neutral\WindowsDesktop.props" Condition="exists('$([Microsoft.Build.Utilities.ToolLocationHelper]::GetPlatformExtensionSDKLocation(`WindowsDesktop, Version=10.0.15063.0`, $(TargetPlatformIdentifier), $(TargetPlatformVersion), $(SDKReferenceDirectoryRoot), $(SDKExtensionDirectoryRoot), $(SDKReferenceRegistryRoot)))\DesignTime\CommonConfiguration\Neutral\WindowsDesktop.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')" Label="LocalAppDataPlatform" />
+ <Import Project="$([Microsoft.Build.Utilities.ToolLocationHelper]::GetPlatformExtensionSDKLocation(`WindowsDesktop, Version=10.0.15063.0`, $(TargetPlatformIdentifier), $(TargetPlatformVersion), $(SDKReferenceDirectoryRoot), $(SDKExtensionDirectoryRoot), $(SDKReferenceRegistryRoot)))\DesignTime\CommonConfiguration\Neutral\WindowsDesktop.props" Condition="exists('$([Microsoft.Build.Utilities.ToolLocationHelper]::GetPlatformExtensionSDKLocation(`WindowsDesktop, Version=10.0.15063.0`, $(TargetPlatformIdentifier), $(TargetPlatformVersion), $(SDKReferenceDirectoryRoot), $(SDKExtensionDirectoryRoot), $(SDKReferenceRegistryRoot)))\DesignTime\CommonConfiguration\Neutral\WindowsDesktop.props')" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$([Microsoft.Build.Utilities.ToolLocationHelper]::GetPlatformExtensionSDKLocation(`WindowsDesktop, Version=10.0.15063.0`, $(TargetPlatformIdentifier), $(TargetPlatformVersion), $(SDKReferenceDirectoryRoot), $(SDKExtensionDirectoryRoot), $(SDKReferenceRegistryRoot)))\DesignTime\CommonConfiguration\Neutral\WindowsDesktop.props" Condition="exists('$([Microsoft.Build.Utilities.ToolLocationHelper]::GetPlatformExtensionSDKLocation(`WindowsDesktop, Version=10.0.15063.0`, $(TargetPlatformIdentifier), $(TargetPlatformVersion), $(SDKReferenceDirectoryRoot), $(SDKExtensionDirectoryRoot), $(SDKReferenceRegistryRoot)))\DesignTime\CommonConfiguration\Neutral\WindowsDesktop.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')" Label="LocalAppDataPlatform" />
+ <Import Project="$([Microsoft.Build.Utilities.ToolLocationHelper]::GetPlatformExtensionSDKLocation(`WindowsDesktop, Version=10.0.15063.0`, $(TargetPlatformIdentifier), $(TargetPlatformVersion), $(SDKReferenceDirectoryRoot), $(SDKExtensionDirectoryRoot), $(SDKReferenceRegistryRoot)))\DesignTime\CommonConfiguration\Neutral\WindowsDesktop.props" Condition="exists('$([Microsoft.Build.Utilities.ToolLocationHelper]::GetPlatformExtensionSDKLocation(`WindowsDesktop, Version=10.0.15063.0`, $(TargetPlatformIdentifier), $(TargetPlatformVersion), $(SDKReferenceDirectoryRoot), $(SDKExtensionDirectoryRoot), $(SDKReferenceRegistryRoot)))\DesignTime\CommonConfiguration\Neutral\WindowsDesktop.props')" />
+ </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" />
+ <Import Project="$([Microsoft.Build.Utilities.ToolLocationHelper]::GetPlatformExtensionSDKLocation(`WindowsDesktop, Version=10.0.15063.0`, $(TargetPlatformIdentifier), $(TargetPlatformVersion), $(SDKReferenceDirectoryRoot), $(SDKExtensionDirectoryRoot), $(SDKReferenceRegistryRoot)))\DesignTime\CommonConfiguration\Neutral\WindowsDesktop.props" Condition="exists('$([Microsoft.Build.Utilities.ToolLocationHelper]::GetPlatformExtensionSDKLocation(`WindowsDesktop, Version=10.0.15063.0`, $(TargetPlatformIdentifier), $(TargetPlatformVersion), $(SDKReferenceDirectoryRoot), $(SDKExtensionDirectoryRoot), $(SDKReferenceRegistryRoot)))\DesignTime\CommonConfiguration\Neutral\WindowsDesktop.props')" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <IncludePath>$(IncludePath);..\..\..\SharedContent\cpp</IncludePath>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\$(MSBuildProjectName)\</OutDir>
+ <IntDir>$(Platform)\$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
+ <DisableSpecificWarnings>4453;28204</DisableSpecificWarnings>
+ <AdditionalIncludeDirectories>$(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories);$(OutDir)..</AdditionalIncludeDirectories>
+ <ShowIncludes>false</ShowIncludes>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>vccorlib.lib;WindowsApp.lib;%(AdditionalDependencies);rpcrt4.lib</AdditionalDependencies>
+ <OptimizeReferences>false</OptimizeReferences>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <ClCompile>
+ <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
+ <DisableSpecificWarnings>4453;28204</DisableSpecificWarnings>
+ <AdditionalIncludeDirectories>$(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories);$(OutDir)..</AdditionalIncludeDirectories>
+ <ShowIncludes>false</ShowIncludes>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>vccorlib.lib;WindowsApp.lib;%(AdditionalDependencies);rpcrt4.lib</AdditionalDependencies>
+ <OptimizeReferences>false</OptimizeReferences>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
+ <DisableSpecificWarnings>4453;28204</DisableSpecificWarnings>
+ <AdditionalIncludeDirectories>$(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories);$(OutDir)..</AdditionalIncludeDirectories>
+ <ShowIncludes>false</ShowIncludes>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>vccorlib.lib;WindowsApp.lib;%(AdditionalDependencies);rpcrt4.lib</AdditionalDependencies>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <ClCompile>
+ <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
+ <DisableSpecificWarnings>4453;28204</DisableSpecificWarnings>
+ <AdditionalIncludeDirectories>$(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories);$(OutDir)..</AdditionalIncludeDirectories>
+ <ShowIncludes>false</ShowIncludes>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>vccorlib.lib;WindowsApp.lib;%(AdditionalDependencies);rpcrt4.lib</AdditionalDependencies>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
+ <DisableSpecificWarnings>4453;28204</DisableSpecificWarnings>
+ <AdditionalIncludeDirectories>$(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories);$(OutDir)..</AdditionalIncludeDirectories>
+ <ShowIncludes>false</ShowIncludes>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>vccorlib.lib;WindowsApp.lib;%(AdditionalDependencies);rpcrt4.lib</AdditionalDependencies>
+ <OptimizeReferences>false</OptimizeReferences>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
+ <DisableSpecificWarnings>4453;28204</DisableSpecificWarnings>
+ <AdditionalIncludeDirectories>$(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories);$(OutDir)..</AdditionalIncludeDirectories>
+ <ShowIncludes>false</ShowIncludes>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>vccorlib.lib;WindowsApp.lib;%(AdditionalDependencies);rpcrt4.lib</AdditionalDependencies>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClInclude Include="ServiceViewModel.h" />
+ <ClInclude Include="pch.h" />
+ <ClInclude Include="..\..\..\SharedContent\cpp\App.xaml.h">
+ <DependentUpon>..\..\..\SharedContent\xaml\App.xaml</DependentUpon>
+ </ClInclude>
+ <ClInclude Include="..\..\..\SharedContent\cpp\MainPage.xaml.h">
+ <DependentUpon>..\..\..\SharedContent\cpp\MainPage.xaml</DependentUpon>
+ </ClInclude>
+ <ClInclude Include="Scenario1_MeteringData.xaml.h">
+ <DependentUpon>Scenario1_MeteringData.xaml</DependentUpon>
+ </ClInclude>
+ <ClInclude Include="RpcClient.h" />
+ <ClInclude Include="SampleConfiguration.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ApplicationDefinition Include="..\..\..\SharedContent\xaml\App.xaml">
+ <SubType>Designer</SubType>
+ </ApplicationDefinition>
+ <Page Include="..\..\..\SharedContent\xaml\Styles.xaml">
+ <Link>Styles\Styles.xaml</Link>
+ </Page>
+ <Page Include="..\..\..\SharedContent\cpp\MainPage.xaml">
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="Scenario1_MeteringData.xaml">
+ <SubType>Designer</SubType>
+ </Page>
+ </ItemGroup>
+ <ItemGroup>
+ <AppxManifest Include="Package.appxmanifest">
+ <SubType>Designer</SubType>
+ </AppxManifest>
+ </ItemGroup>
+ <ItemGroup>
+ <Image Include="..\..\..\SharedContent\media\microsoft-sdk.png">
+ <Link>Assets\microsoft-sdk.png</Link>
+ </Image>
+ <Image Include="..\..\..\SharedContent\media\smalltile-sdk.png">
+ <Link>Assets\smalltile-sdk.png</Link>
+ </Image>
+ <Image Include="..\..\..\SharedContent\media\splash-sdk.png">
+ <Link>Assets\splash-sdk.png</Link>
+ </Image>
+ <Image Include="..\..\..\SharedContent\media\squaretile-sdk.png">
+ <Link>Assets\squaretile-sdk.png</Link>
+ </Image>
+ <Image Include="..\..\..\SharedContent\media\storelogo-sdk.png">
+ <Link>Assets\storelogo-sdk.png</Link>
+ </Image>
+ <Image Include="..\..\..\SharedContent\media\tile-sdk.png">
+ <Link>Assets\tile-sdk.png</Link>
+ </Image>
+ <Image Include="..\..\..\SharedContent\media\windows-sdk.png">
+ <Link>Assets\windows-sdk.png</Link>
+ </Image>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="RpcInterface.c">
+ <CompileAsWinRT>false</CompileAsWinRT>
+ <PrecompiledHeader>NotUsing</PrecompiledHeader>
+ </ClCompile>
+ <ClCompile Include="..\..\..\SharedContent\cpp\App.xaml.cpp">
+ <DependentUpon>..\..\..\SharedContent\xaml\App.xaml</DependentUpon>
+ </ClCompile>
+ <ClCompile Include="..\..\..\SharedContent\cpp\MainPage.xaml.cpp">
+ <DependentUpon>..\..\..\SharedContent\cpp\MainPage.xaml</DependentUpon>
+ </ClCompile>
+ <ClCompile Include="ServiceViewModel.cpp" />
+ <ClCompile Include="Scenario1_MeteringData.xaml.cpp">
+ <DependentUpon>Scenario1_MeteringData.xaml</DependentUpon>
+ </ClCompile>
+ <ClCompile Include="SampleConfiguration.cpp" />
+ <ClCompile Include="pch.cpp">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
+ </ClCompile>
+ <ClCompile Include="RpcClient.cpp">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <SDKReference Include="WindowsDesktop, Version=10.0.15063.0" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\..\..\..\Toaster Driver\Service\RpcInterface.acf" />
+ </ItemGroup>
+ <ItemGroup>
+ <Midl Include="..\..\..\..\Toaster Driver\Service\RpcInterface.Idl" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/CustomCapability.vcxproj.filters b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/CustomCapability.vcxproj.filters
new file mode 100644
index 00000000..af84bc38
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/CustomCapability.vcxproj.filters
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Common">
+ <UniqueIdentifier>81d95eea-286c-4a5e-98f1-eef612020bf0</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Assets">
+ <UniqueIdentifier>85b464d3-9e56-4242-b58b-1f226dd034b4</UniqueIdentifier>
+ <Extensions>bmp;fbx;gif;jpg;jpeg;tga;tiff;tif;png</Extensions>
+ </Filter>
+ <Filter Include="ViewModel">
+ <UniqueIdentifier>{1c0f2943-52c2-4a54-93a2-971c14e7c8ec}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Model">
+ <UniqueIdentifier>{33085be2-4c37-4eab-8f6e-6add0cffe2d4}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ApplicationDefinition Include="..\..\..\SharedContent\xaml\App.xaml" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="pch.cpp" />
+ <ClCompile Include="RpcClient.cpp">
+ <Filter>Model</Filter>
+ </ClCompile>
+ <ClCompile Include="SampleConfiguration.cpp">
+ <Filter>Common</Filter>
+ </ClCompile>
+ <ClCompile Include="Scenario1_MeteringData.xaml.cpp" />
+ <ClCompile Include="..\..\..\SharedContent\cpp\App.xaml.cpp" />
+ <ClCompile Include="..\..\..\SharedContent\cpp\MainPage.xaml.cpp" />
+ <ClCompile Include="ServiceViewModel.cpp">
+ <Filter>ViewModel</Filter>
+ </ClCompile>
+ <ClCompile Include="RpcInterface.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="pch.h" />
+ <ClInclude Include="RpcClient.h">
+ <Filter>Model</Filter>
+ </ClInclude>
+ <ClInclude Include="SampleConfiguration.h">
+ <Filter>Common</Filter>
+ </ClInclude>
+ <ClInclude Include="Scenario1_MeteringData.xaml.h" />
+ <ClInclude Include="..\..\..\SharedContent\cpp\App.xaml.h" />
+ <ClInclude Include="..\..\..\SharedContent\cpp\MainPage.xaml.h" />
+ <ClInclude Include="ServiceViewModel.h">
+ <Filter>ViewModel</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <Image Include="..\..\..\SharedContent\media\microsoft-sdk.png">
+ <Filter>Assets</Filter>
+ </Image>
+ <Image Include="..\..\..\SharedContent\media\smalltile-sdk.png">
+ <Filter>Assets</Filter>
+ </Image>
+ <Image Include="..\..\..\SharedContent\media\splash-sdk.png">
+ <Filter>Assets</Filter>
+ </Image>
+ <Image Include="..\..\..\SharedContent\media\squaretile-sdk.png">
+ <Filter>Assets</Filter>
+ </Image>
+ <Image Include="..\..\..\SharedContent\media\storelogo-sdk.png">
+ <Filter>Assets</Filter>
+ </Image>
+ <Image Include="..\..\..\SharedContent\media\tile-sdk.png">
+ <Filter>Assets</Filter>
+ </Image>
+ <Image Include="..\..\..\SharedContent\media\windows-sdk.png">
+ <Filter>Assets</Filter>
+ </Image>
+ </ItemGroup>
+ <ItemGroup>
+ <AppxManifest Include="Package.appxmanifest" />
+ </ItemGroup>
+ <ItemGroup>
+ <Page Include="Scenario1_MeteringData.xaml" />
+ <Page Include="..\..\..\SharedContent\xaml\Styles.xaml" />
+ <Page Include="..\..\..\SharedContent\cpp\MainPage.xaml" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\..\..\..\Toaster Driver\Service\RpcInterface.acf" />
+ </ItemGroup>
+ <ItemGroup>
+ <Midl Include="..\..\..\..\Toaster Driver\Service\RpcInterface.Idl" />
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/DeviceList.cpp b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/DeviceList.cpp
new file mode 100644
index 00000000..cb3a7a8e
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/DeviceList.cpp
@@ -0,0 +1,244 @@
+#include "pch.h"
+#include "DeviceList.h"
+#include "MainPage.xaml.h"
+#include "App.xaml.h"
+
+using namespace SDKTemplate;
+
+using namespace Platform;
+using namespace Platform::Collections;
+using namespace Windows::ApplicationModel;
+using namespace Windows::Devices::Enumeration;
+using namespace Windows::Devices::Custom;
+using namespace Windows::Foundation;
+using namespace Windows::UI::Core;
+using namespace Windows::UI::Xaml;
+using namespace Windows::UI::Xaml::Documents;
+
+DeviceList^ DeviceList::_Current = nullptr;
+
+DeviceList^ DeviceList::Current::get()
+{
+ if (DeviceList::_Current == nullptr)
+ {
+ DeviceList::_Current = ref new DeviceList();
+ }
+ return DeviceList::_Current;
+}
+
+DeviceList::DeviceList() : m_WatcherStarted(false), m_WatcherSuspended(false)
+{
+ m_Fx2Watcher = nullptr;
+ m_List = ref new Vector<DeviceListEntry^>();
+ InitDeviceWatcher();
+
+ // Register for app suspend/resume handlers
+ App::Current->Suspending += ref new SuspendingEventHandler(this, &DeviceList::SuspendDeviceWatcher);
+ App::Current->Resuming += ref new EventHandler<Object^>(this, &DeviceList::ResumeDeviceWatcher);
+}
+
+void DeviceList::InitDeviceWatcher()
+{
+ // Define the selector to enumerate all of the fx2 device interface class instances.
+ // Use the DeviceInterfaceGuid provided by the driver (Fx2Driver, in this case).
+ auto selector = CustomDevice::GetDeviceSelector(Fx2Driver::DeviceInterfaceGuid);
+
+ // Set of properties to retrieve
+ auto properties = ref new Vector<String^>({ "System.Devices.DeviceInstanceId" });
+
+ // Create a device watcher to look for instances of the fx2 device interface.
+ m_Fx2Watcher = DeviceInformation::CreateWatcher(selector, properties);
+
+ m_Fx2Watcher->Added += ref new TypedEventHandler<DeviceWatcher^, DeviceInformation^>(this, &DeviceList::OnFx2Added);
+ m_Fx2Watcher->Removed += ref new TypedEventHandler<DeviceWatcher^, DeviceInformationUpdate^>(this, &DeviceList::OnFx2Removed);
+ m_Fx2Watcher->EnumerationCompleted += ref new TypedEventHandler<DeviceWatcher^, Object^>(this, &DeviceList::OnFx2EnumerationComplete);
+}
+
+void DeviceList::StartFx2Watcher()
+{
+ MainPage::Current->NotifyUser("starting device watcher", NotifyType::StatusMessage);
+
+ std::for_each(
+ begin(m_List),
+ end(m_List),
+ [](DeviceListEntry^ Entry) {
+ Entry->Matched = false;
+ });
+
+ WatcherStarted = true;
+ m_Fx2Watcher->Start();
+}
+
+void DeviceList::StopFx2Watcher()
+{
+ MainPage::Current->NotifyUser("stopping fx2 watcher", NotifyType::StatusMessage);
+ m_Fx2Watcher->Stop();
+ WatcherStarted = false;
+}
+
+void DeviceList::CreateBooleanTable(
+ InlineCollection^ Table,
+ const Platform::Array<bool>^ NewValues,
+ const Platform::Array<bool>^ OldValues,
+ String^ /* IndexTitle */,
+ String^ /* ValueTitle */,
+ String^ TrueValue,
+ String^ FalseValue)
+{
+ Table->Clear();
+
+ for (int i = 0; i < (int)NewValues->Length; i += 1)
+ {
+ auto line = ref new Span();
+ auto block = ref new Run();
+ block->Text = (i + 1).ToString();
+ line->Inlines->Append(block);
+
+ block = ref new Run();
+ block->Text = " ";
+ line->Inlines->Append(block);
+
+ block = ref new Run();
+ block->Text = NewValues[i] ? TrueValue : FalseValue;
+
+ if ((OldValues != nullptr) && (OldValues[i] != NewValues[i]))
+ {
+ auto bold = ref new Bold();
+ bold->Inlines->Append(block);
+ line->Inlines->Append(bold);
+ }
+ else
+ {
+ line->Inlines->Append(block);
+ }
+
+ line->Inlines->Append(ref new LineBreak());
+
+ Table->Append(line);
+ }
+}
+
+DeviceListEntry^ DeviceList::FindDevice(String^ Id)
+{
+ auto i = std::find_if(
+ begin(m_List),
+ end(m_List),
+ [Id](DeviceListEntry^ e) {return e->Id == Id; });
+
+ if (i == end(m_List))
+ {
+ return nullptr;
+ }
+ else
+ {
+ return *i;
+ }
+}
+
+void DeviceList::OnFx2Added(DeviceWatcher ^ /* Sender */, DeviceInformation^ DevInterface)
+{
+ MainPage::Current->Dispatcher->RunAsync(
+ CoreDispatcherPriority::Normal,
+ ref new DispatchedHandler(
+ [this, DevInterface]()->void
+ {
+ MainPage::Current->NotifyUser("OnFx2Added: " + DevInterface->Id, NotifyType::StatusMessage);
+
+ // search the device list for a device with a matching interface ID
+ auto match = FindDevice(DevInterface->Id);
+
+ // If we found a match then mark it as verified and return
+ if (match != nullptr)
+ {
+ match->Matched = true;
+ return;
+ }
+
+ // Create a new elemetn for this device interface, and queue up the query of its
+ // device information
+ match = ref new DeviceListEntry(DevInterface);
+
+ // Add the new element to the end of the list of devices
+ m_List->Append(match);
+ }));
+}
+
+void DeviceList::OnFx2Removed(DeviceWatcher ^ /* Sender */, DeviceInformationUpdate^ DevInterface)
+{
+ auto deviceId = DevInterface->Id;
+
+ MainPage::Current->Dispatcher->RunAsync(
+ CoreDispatcherPriority::Normal,
+ ref new DispatchedHandler(
+ [this, deviceId]()
+ {
+ MainPage::Current->NotifyUser("OnFx2Removed: " + deviceId, NotifyType::StatusMessage);
+
+ // Search the list of devices for one with a matching ID. Move the matched
+ // item to the end of the list.
+ auto i = std::remove_if(
+ begin(m_List),
+ end(m_List),
+ [deviceId](DeviceListEntry^ e) {return e->Id == deviceId; });
+
+ // if there's no match return.
+ if (i == end(m_List))
+ {
+ return;
+ }
+
+ // Remove the last item from the list.
+ MainPage::Current->NotifyUser("OnFx2Removed: " + deviceId + " removed", NotifyType::StatusMessage);
+ m_List->RemoveAtEnd();
+ }));
+}
+
+void DeviceList::OnFx2EnumerationComplete(DeviceWatcher ^ /* Sender */, Object ^ /* o */)
+{
+ MainPage::Current->Dispatcher->RunAsync(
+ CoreDispatcherPriority::Normal,
+ ref new DispatchedHandler(
+ [this]()
+ {
+ MainPage::Current->NotifyUser("OnFx2EnumerationComplete", NotifyType::StatusMessage);
+
+ DeviceList^ me = this;
+
+ // Move all the unmatched elements to the end of the list
+ auto i = std::remove_if(
+ begin(m_List),
+ end(m_List),
+ [](DeviceListEntry^ e) { return e->Matched == false; });
+
+ // Determine the number of unmatched entries
+ auto unmatchedCount = end(m_List) - i;
+
+ while (unmatchedCount > 0)
+ {
+ m_List->RemoveAtEnd();
+ unmatchedCount -= 1;
+ }
+ }));
+}
+
+void DeviceList::SuspendDeviceWatcher(Object^, SuspendingEventArgs^)
+{
+ if (WatcherStarted)
+ {
+ m_WatcherSuspended = true;
+ StopFx2Watcher();
+ }
+ else
+ {
+ m_WatcherSuspended = false;
+ }
+}
+
+void DeviceList::ResumeDeviceWatcher(Object^, Object^)
+{
+ if (m_WatcherSuspended)
+ {
+ m_WatcherSuspended = false;
+ StartFx2Watcher();
+ }
+}
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/Package.appxmanifest b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/Package.appxmanifest
new file mode 100644
index 00000000..0ec45a07
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/Package.appxmanifest
@@ -0,0 +1,41 @@
+<?xml version='1.0' encoding='utf-8'?>
+<Package
+ xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
+ xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
+ xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
+ xmlns:uap4="http://schemas.microsoft.com/appx/manifest/uap/windows10/4"
+ IgnorableNamespaces="uap mp uap4"
+ >
+ <Identity Name="Microsoft.SDKSamples.CustomCapability.CPP" Publisher="CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" Version="1.0.0.0" />
+ <mp:PhoneIdentity PhoneProductId="26388851-6c33-4124-b1e5-96e859da28bf" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>
+ <Properties>
+ <DisplayName>Custom Capability C++ Sample</DisplayName>
+ <PublisherDisplayName>Microsoft Corporation</PublisherDisplayName>
+ <Logo>Assets\StoreLogo-sdk.png</Logo>
+ </Properties>
+ <Dependencies>
+ <TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.15063.0" MaxVersionTested="10.0.15063.0"/>
+ </Dependencies>
+ <Resources>
+ <Resource Language="x-generate"/>
+ </Resources>
+ <Applications>
+ <Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="CustomCapability.App">
+ <uap:VisualElements
+ DisplayName="Custom Capability C++ sample"
+ Square150x150Logo="Assets\squareTile-sdk.png"
+ Square44x44Logo="Assets\smallTile-sdk.png"
+ Description="Hsa C++ sample"
+ BackgroundColor="#00B2F0"
+ >
+ <uap:SplashScreen Image="Assets\splash-sdk.png"/>
+ <uap:DefaultTile>
+ <uap:ShowNameOnTiles>
+ <uap:ShowOn Tile="square150x150Logo"/>
+ </uap:ShowNameOnTiles>
+ </uap:DefaultTile>
+ </uap:VisualElements>
+ </Application>
+ </Applications>
+
+</Package>
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/RpcClient.cpp b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/RpcClient.cpp
new file mode 100644
index 00000000..870d6306
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/RpcClient.cpp
@@ -0,0 +1,177 @@
+//*********************************************************
+//
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the MIT License (MIT).
+// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
+// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
+// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
+//
+//*********************************************************
+
+// There is an error in the system header files that incorrectly
+// places RpcStringBindingCompose in the app partition.
+// Work around it by changing the WINAPI_FAMILY to desktop temporarily.
+#pragma push_macro("WINAPI_FAMILY")
+#undef WINAPI_FAMILY
+#define WINAPI_FAMILY WINAPI_FAMILY_DESKTOP_APP
+#include "RpcClient.h"
+#pragma pop_macro("WINAPI_FAMILY")
+
+using namespace SDKTemplate;
+
+__int64 RpcClient::Initialize()
+{
+ RPC_STATUS status;
+ RPC_WSTR pszStringBinding = nullptr;
+
+ status = RpcStringBindingCompose(
+ NULL,
+ reinterpret_cast<RPC_WSTR>(L"ncalrpc"),
+ NULL,
+ reinterpret_cast<RPC_WSTR>(RPC_STATIC_ENDPOINT),
+ NULL,
+ &pszStringBinding);
+
+ if (status)
+ {
+ goto error_status;
+ }
+
+ status = RpcBindingFromStringBinding(
+ pszStringBinding,
+ &hRpcBinding);
+
+ if (status)
+ {
+ goto error_status;
+ }
+
+ status = RpcStringFree(&pszStringBinding);
+
+ if (status)
+ {
+ goto error_status;
+ }
+
+ RpcTryExcept
+ {
+ ::RemoteOpen(hRpcBinding, &phContext);
+ }
+ RpcExcept(1)
+ {
+ status = RpcExceptionCode();
+ }
+ RpcEndExcept
+
+error_status:
+
+ return status;
+}
+
+//
+// Make RPC call to start metering. This is a blocking call and
+// will return only after StopMetering is called.
+//
+__int64 RpcClient::StartMeteringAndWaitForStop(__int64 samplePeriod)
+{
+ __int64 ulCode = 0;
+ CallbackCount = 0;
+ MeteringData = 0;
+
+ RpcTryExcept
+ {
+ ::StartMetering(phContext, samplePeriod, (__int64)this);
+ }
+ RpcExcept(1)
+ {
+ ulCode = RpcExceptionCode();
+ }
+ RpcEndExcept
+
+ return ulCode;
+}
+
+
+//
+// Make rpc call SetSampleRate
+//
+__int64 RpcClient::SetSampleRate(int rate)
+{
+ __int64 ulCode = 0;
+ RpcTryExcept
+ {
+ ::SetSamplePeriod(phContext, rate);
+ }
+ RpcExcept(1)
+ {
+ ulCode = RpcExceptionCode();
+ }
+ RpcEndExcept
+ return ulCode;
+}
+
+//
+// Make rpc call StopMetering
+//
+__int64 RpcClient::StopMetering()
+{
+ __int64 ulCode = 0;
+ RpcTryExcept
+ {
+ ::StopMetering(phContext);
+ }
+ RpcExcept(1)
+ {
+ ulCode = RpcExceptionCode();
+ }
+ RpcEndExcept
+ return ulCode;
+}
+
+RpcClient::~RpcClient()
+{
+ RPC_STATUS status;
+
+ if (hRpcBinding != NULL)
+ {
+ RpcTryExcept
+ {
+ ::RemoteClose(&phContext);
+ }
+ RpcExcept(1)
+ {
+ // Ignoring the result of RemoteClose as nothing can be
+ // done on the client side with this return code
+ status = RpcExceptionCode();
+ }
+ RpcEndExcept
+
+ status = RpcBindingFree(&hRpcBinding);
+ hRpcBinding = NULL;
+ }
+}
+
+//
+// Metering rpc callback
+//
+void MeteringDataEvent(__int64 data, __int64 context)
+{
+ RpcClient* client = static_cast<RpcClient*>((PVOID)context);
+ client->MeteringData = data;
+ ++client->CallbackCount;
+}
+
+///******************************************************/
+///* MIDL allocate and free */
+///******************************************************/
+
+void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len)
+{
+ return(malloc(len));
+}
+
+void __RPC_USER midl_user_free(void __RPC_FAR * ptr)
+{
+ free(ptr);
+} \ No newline at end of file
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/RpcClient.h b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/RpcClient.h
new file mode 100644
index 00000000..0ee5ff78
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/RpcClient.h
@@ -0,0 +1,30 @@
+//
+// RpcClient.h
+//
+
+#pragma once
+
+#define RPC_STATIC_ENDPOINT L"HsaSampleRpcEndpoint"
+
+#include "RpcInterface_h.h"
+
+namespace SDKTemplate
+{
+ /// <summary>
+ /// Client side RPC implementation
+ /// </summary>
+ private class RpcClient sealed
+ {
+ public:
+ ~RpcClient();
+ __int64 Initialize();
+ __int64 StartMeteringAndWaitForStop(__int64 samplePeriod);
+ __int64 StopMetering();
+ __int64 SetSampleRate(int rate);
+ int CallbackCount;
+ __int64 MeteringData;
+ private:
+ handle_t hRpcBinding;
+ PCONTEXT_HANDLE_TYPE phContext;
+ };
+}
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/RpcInterface.c b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/RpcInterface.c
new file mode 100644
index 00000000..0f988533
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/RpcInterface.c
@@ -0,0 +1,6 @@
+// RpcInterface_c.c expects _ARM_ to be set when building for ARM.
+#ifdef _M_ARM
+#define _ARM_ 1
+#endif
+
+#include "RpcInterface_c.c"
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/RpcInterface_c.c b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/RpcInterface_c.c
new file mode 100644
index 00000000..8b05c1ea
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/RpcInterface_c.c
@@ -0,0 +1,476 @@
+
+
+/* this ALWAYS GENERATED file contains the RPC client stubs */
+
+
+ /* File created by MIDL compiler version 8.01.0622 */
+/* at Mon Jan 18 19:14:07 2038
+ */
+/* Compiler settings for C:\WinHEC 2017 Lab\Toaster Driver\Service\RpcInterface.Idl:
+ Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622
+ protocol : dce , ms_ext, c_ext, robust
+ error checks: allocation ref bounds_check enum stub_data
+ VC __declspec() decoration level:
+ __declspec(uuid()), __declspec(selectany), __declspec(novtable)
+ DECLSPEC_UUID(), MIDL_INTERFACE()
+*/
+/* @@MIDL_FILE_HEADING( ) */
+
+#if defined(_M_AMD64)
+
+
+#pragma warning( disable: 4049 ) /* more than 64k source lines */
+#if _MSC_VER >= 1200
+#pragma warning(push)
+#endif
+
+#pragma warning( disable: 4211 ) /* redefine extern to static */
+#pragma warning( disable: 4232 ) /* dllimport identity*/
+#pragma warning( disable: 4024 ) /* array to pointer mapping*/
+
+#include <string.h>
+
+#include "RpcInterface_h.h"
+
+#define TYPE_FORMAT_STRING_SIZE 23
+#define PROC_FORMAT_STRING_SIZE 245
+#define EXPR_FORMAT_STRING_SIZE 1
+#define TRANSMIT_AS_TABLE_SIZE 0
+#define WIRE_MARSHAL_TABLE_SIZE 0
+
+typedef struct _RpcInterface_MIDL_TYPE_FORMAT_STRING
+ {
+ short Pad;
+ unsigned char Format[ TYPE_FORMAT_STRING_SIZE ];
+ } RpcInterface_MIDL_TYPE_FORMAT_STRING;
+
+typedef struct _RpcInterface_MIDL_PROC_FORMAT_STRING
+ {
+ short Pad;
+ unsigned char Format[ PROC_FORMAT_STRING_SIZE ];
+ } RpcInterface_MIDL_PROC_FORMAT_STRING;
+
+typedef struct _RpcInterface_MIDL_EXPR_FORMAT_STRING
+ {
+ long Pad;
+ unsigned char Format[ EXPR_FORMAT_STRING_SIZE ];
+ } RpcInterface_MIDL_EXPR_FORMAT_STRING;
+
+
+static const RPC_SYNTAX_IDENTIFIER _RpcTransferSyntax =
+{{0x8A885D04,0x1CEB,0x11C9,{0x9F,0xE8,0x08,0x00,0x2B,0x10,0x48,0x60}},{2,0}};
+
+
+extern const RpcInterface_MIDL_TYPE_FORMAT_STRING RpcInterface__MIDL_TypeFormatString;
+extern const RpcInterface_MIDL_PROC_FORMAT_STRING RpcInterface__MIDL_ProcFormatString;
+extern const RpcInterface_MIDL_EXPR_FORMAT_STRING RpcInterface__MIDL_ExprFormatString;
+
+#define GENERIC_BINDING_TABLE_SIZE 0
+
+
+/* Standard interface: RpcInterface, ver. 1.0,
+ GUID={0x906B0CE0,0xC70B,0x1067,{0xB3,0x17,0x00,0xDD,0x01,0x06,0x62,0xDA}} */
+
+
+extern const MIDL_SERVER_INFO RpcInterface_ServerInfo;
+
+
+extern const RPC_DISPATCH_TABLE RpcInterface_v1_0_DispatchTable;
+
+static const RPC_CLIENT_INTERFACE RpcInterface___RpcClientInterface =
+ {
+ sizeof(RPC_CLIENT_INTERFACE),
+ {{0x906B0CE0,0xC70B,0x1067,{0xB3,0x17,0x00,0xDD,0x01,0x06,0x62,0xDA}},{1,0}},
+ {{0x8A885D04,0x1CEB,0x11C9,{0x9F,0xE8,0x08,0x00,0x2B,0x10,0x48,0x60}},{2,0}},
+ (RPC_DISPATCH_TABLE*)&RpcInterface_v1_0_DispatchTable,
+ 0,
+ 0,
+ 0,
+ &RpcInterface_ServerInfo,
+ 0x04000000
+ };
+RPC_IF_HANDLE RpcInterface_v1_0_c_ifspec = (RPC_IF_HANDLE)& RpcInterface___RpcClientInterface;
+
+extern const MIDL_STUB_DESC RpcInterface_StubDesc;
+
+static RPC_BINDING_HANDLE RpcInterface__MIDL_AutoBindHandle;
+
+
+void RemoteOpen(
+ /* [in] */ handle_t hBinding,
+ /* [out] */ PPCONTEXT_HANDLE_TYPE pphContext)
+{
+
+ NdrClientCall2(
+ ( PMIDL_STUB_DESC )&RpcInterface_StubDesc,
+ (PFORMAT_STRING) &RpcInterface__MIDL_ProcFormatString.Format[0],
+ hBinding,
+ pphContext);
+
+}
+
+
+void RemoteClose(
+ /* [out][in] */ PPCONTEXT_HANDLE_TYPE pphContext)
+{
+
+ NdrClientCall2(
+ ( PMIDL_STUB_DESC )&RpcInterface_StubDesc,
+ (PFORMAT_STRING) &RpcInterface__MIDL_ProcFormatString.Format[36],
+ pphContext);
+
+}
+
+
+void StartMetering(
+ /* [in] */ PCONTEXT_HANDLE_TYPE phContext,
+ /* [in] */ __int64 samplePeriod,
+ /* [optional][in] */ __int64 context)
+{
+
+ NdrClientCall2(
+ ( PMIDL_STUB_DESC )&RpcInterface_StubDesc,
+ (PFORMAT_STRING) &RpcInterface__MIDL_ProcFormatString.Format[74],
+ phContext,
+ samplePeriod,
+ context);
+
+}
+
+
+void SetSamplePeriod(
+ /* [in] */ PCONTEXT_HANDLE_TYPE phContext,
+ /* [in] */ __int64 samplePeriod)
+{
+
+ NdrClientCall2(
+ ( PMIDL_STUB_DESC )&RpcInterface_StubDesc,
+ (PFORMAT_STRING) &RpcInterface__MIDL_ProcFormatString.Format[124],
+ phContext,
+ samplePeriod);
+
+}
+
+
+void StopMetering(
+ /* [in] */ PCONTEXT_HANDLE_TYPE phContext)
+{
+
+ NdrClientCall2(
+ ( PMIDL_STUB_DESC )&RpcInterface_StubDesc,
+ (PFORMAT_STRING) &RpcInterface__MIDL_ProcFormatString.Format[168],
+ phContext);
+
+}
+
+
+#if !defined(__RPC_WIN64__)
+#error Invalid build platform for this stub.
+#endif
+
+static const RpcInterface_MIDL_PROC_FORMAT_STRING RpcInterface__MIDL_ProcFormatString =
+ {
+ 0,
+ {
+
+ /* Procedure RemoteOpen */
+
+ 0x0, /* 0 */
+ 0x48, /* Old Flags: */
+/* 2 */ NdrFcLong( 0x0 ), /* 0 */
+/* 6 */ NdrFcShort( 0x0 ), /* 0 */
+/* 8 */ NdrFcShort( 0x10 ), /* X64 Stack size/offset = 16 */
+/* 10 */ 0x32, /* FC_BIND_PRIMITIVE */
+ 0x0, /* 0 */
+/* 12 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 14 */ NdrFcShort( 0x0 ), /* 0 */
+/* 16 */ NdrFcShort( 0x38 ), /* 56 */
+/* 18 */ 0x40, /* Oi2 Flags: has ext, */
+ 0x1, /* 1 */
+/* 20 */ 0xa, /* 10 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 22 */ NdrFcShort( 0x0 ), /* 0 */
+/* 24 */ NdrFcShort( 0x0 ), /* 0 */
+/* 26 */ NdrFcShort( 0x0 ), /* 0 */
+/* 28 */ NdrFcShort( 0x0 ), /* 0 */
+
+ /* Parameter pphContext */
+
+/* 30 */ NdrFcShort( 0x110 ), /* Flags: out, simple ref, */
+/* 32 */ NdrFcShort( 0x8 ), /* X64 Stack size/offset = 8 */
+/* 34 */ NdrFcShort( 0x6 ), /* Type Offset=6 */
+
+ /* Procedure RemoteClose */
+
+/* 36 */ 0x0, /* 0 */
+ 0x48, /* Old Flags: */
+/* 38 */ NdrFcLong( 0x0 ), /* 0 */
+/* 42 */ NdrFcShort( 0x1 ), /* 1 */
+/* 44 */ NdrFcShort( 0x8 ), /* X64 Stack size/offset = 8 */
+/* 46 */ 0x30, /* FC_BIND_CONTEXT */
+ 0xe0, /* Ctxt flags: via ptr, in, out, */
+/* 48 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 50 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+/* 52 */ NdrFcShort( 0x38 ), /* 56 */
+/* 54 */ NdrFcShort( 0x38 ), /* 56 */
+/* 56 */ 0x40, /* Oi2 Flags: has ext, */
+ 0x1, /* 1 */
+/* 58 */ 0xa, /* 10 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 60 */ NdrFcShort( 0x0 ), /* 0 */
+/* 62 */ NdrFcShort( 0x0 ), /* 0 */
+/* 64 */ NdrFcShort( 0x0 ), /* 0 */
+/* 66 */ NdrFcShort( 0x0 ), /* 0 */
+
+ /* Parameter pphContext */
+
+/* 68 */ NdrFcShort( 0x118 ), /* Flags: in, out, simple ref, */
+/* 70 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 72 */ NdrFcShort( 0xe ), /* Type Offset=14 */
+
+ /* Procedure StartMetering */
+
+/* 74 */ 0x0, /* 0 */
+ 0x48, /* Old Flags: */
+/* 76 */ NdrFcLong( 0x0 ), /* 0 */
+/* 80 */ NdrFcShort( 0x2 ), /* 2 */
+/* 82 */ NdrFcShort( 0x18 ), /* X64 Stack size/offset = 24 */
+/* 84 */ 0x30, /* FC_BIND_CONTEXT */
+ 0x40, /* Ctxt flags: in, */
+/* 86 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 88 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+/* 90 */ NdrFcShort( 0x44 ), /* 68 */
+/* 92 */ NdrFcShort( 0x0 ), /* 0 */
+/* 94 */ 0x40, /* Oi2 Flags: has ext, */
+ 0x3, /* 3 */
+/* 96 */ 0xa, /* 10 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 98 */ NdrFcShort( 0x0 ), /* 0 */
+/* 100 */ NdrFcShort( 0x0 ), /* 0 */
+/* 102 */ NdrFcShort( 0x0 ), /* 0 */
+/* 104 */ NdrFcShort( 0x0 ), /* 0 */
+
+ /* Parameter phContext */
+
+/* 106 */ NdrFcShort( 0x8 ), /* Flags: in, */
+/* 108 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 110 */ NdrFcShort( 0x12 ), /* Type Offset=18 */
+
+ /* Parameter samplePeriod */
+
+/* 112 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 114 */ NdrFcShort( 0x8 ), /* X64 Stack size/offset = 8 */
+/* 116 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Parameter context */
+
+/* 118 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 120 */ NdrFcShort( 0x10 ), /* X64 Stack size/offset = 16 */
+/* 122 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Procedure SetSamplePeriod */
+
+/* 124 */ 0x0, /* 0 */
+ 0x48, /* Old Flags: */
+/* 126 */ NdrFcLong( 0x0 ), /* 0 */
+/* 130 */ NdrFcShort( 0x3 ), /* 3 */
+/* 132 */ NdrFcShort( 0x10 ), /* X64 Stack size/offset = 16 */
+/* 134 */ 0x30, /* FC_BIND_CONTEXT */
+ 0x40, /* Ctxt flags: in, */
+/* 136 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 138 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+/* 140 */ NdrFcShort( 0x34 ), /* 52 */
+/* 142 */ NdrFcShort( 0x0 ), /* 0 */
+/* 144 */ 0x40, /* Oi2 Flags: has ext, */
+ 0x2, /* 2 */
+/* 146 */ 0xa, /* 10 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 148 */ NdrFcShort( 0x0 ), /* 0 */
+/* 150 */ NdrFcShort( 0x0 ), /* 0 */
+/* 152 */ NdrFcShort( 0x0 ), /* 0 */
+/* 154 */ NdrFcShort( 0x0 ), /* 0 */
+
+ /* Parameter phContext */
+
+/* 156 */ NdrFcShort( 0x8 ), /* Flags: in, */
+/* 158 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 160 */ NdrFcShort( 0x12 ), /* Type Offset=18 */
+
+ /* Parameter samplePeriod */
+
+/* 162 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 164 */ NdrFcShort( 0x8 ), /* X64 Stack size/offset = 8 */
+/* 166 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Procedure StopMetering */
+
+/* 168 */ 0x0, /* 0 */
+ 0x48, /* Old Flags: */
+/* 170 */ NdrFcLong( 0x0 ), /* 0 */
+/* 174 */ NdrFcShort( 0x4 ), /* 4 */
+/* 176 */ NdrFcShort( 0x8 ), /* X64 Stack size/offset = 8 */
+/* 178 */ 0x30, /* FC_BIND_CONTEXT */
+ 0x40, /* Ctxt flags: in, */
+/* 180 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 182 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+/* 184 */ NdrFcShort( 0x24 ), /* 36 */
+/* 186 */ NdrFcShort( 0x0 ), /* 0 */
+/* 188 */ 0x40, /* Oi2 Flags: has ext, */
+ 0x1, /* 1 */
+/* 190 */ 0xa, /* 10 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 192 */ NdrFcShort( 0x0 ), /* 0 */
+/* 194 */ NdrFcShort( 0x0 ), /* 0 */
+/* 196 */ NdrFcShort( 0x0 ), /* 0 */
+/* 198 */ NdrFcShort( 0x0 ), /* 0 */
+
+ /* Parameter phContext */
+
+/* 200 */ NdrFcShort( 0x8 ), /* Flags: in, */
+/* 202 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 204 */ NdrFcShort( 0x12 ), /* Type Offset=18 */
+
+ /* Procedure MeteringDataEvent */
+
+/* 206 */ 0x34, /* FC_CALLBACK_HANDLE */
+ 0x48, /* Old Flags: */
+/* 208 */ NdrFcLong( 0x0 ), /* 0 */
+/* 212 */ NdrFcShort( 0x0 ), /* 0 */
+/* 214 */ NdrFcShort( 0x10 ), /* X64 Stack size/offset = 16 */
+/* 216 */ NdrFcShort( 0x20 ), /* 32 */
+/* 218 */ NdrFcShort( 0x0 ), /* 0 */
+/* 220 */ 0x40, /* Oi2 Flags: has ext, */
+ 0x2, /* 2 */
+/* 222 */ 0xa, /* 10 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 224 */ NdrFcShort( 0x0 ), /* 0 */
+/* 226 */ NdrFcShort( 0x0 ), /* 0 */
+/* 228 */ NdrFcShort( 0x0 ), /* 0 */
+/* 230 */ NdrFcShort( 0x0 ), /* 0 */
+
+ /* Parameter data */
+
+/* 232 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 234 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 236 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Parameter context */
+
+/* 238 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 240 */ NdrFcShort( 0x8 ), /* X64 Stack size/offset = 8 */
+/* 242 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ 0x0
+ }
+ };
+
+static const RpcInterface_MIDL_TYPE_FORMAT_STRING RpcInterface__MIDL_TypeFormatString =
+ {
+ 0,
+ {
+ NdrFcShort( 0x0 ), /* 0 */
+/* 2 */
+ 0x11, 0x4, /* FC_RP [alloced_on_stack] */
+/* 4 */ NdrFcShort( 0x2 ), /* Offset= 2 (6) */
+/* 6 */ 0x30, /* FC_BIND_CONTEXT */
+ 0xa0, /* Ctxt flags: via ptr, out, */
+/* 8 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+/* 10 */
+ 0x11, 0x4, /* FC_RP [alloced_on_stack] */
+/* 12 */ NdrFcShort( 0x2 ), /* Offset= 2 (14) */
+/* 14 */ 0x30, /* FC_BIND_CONTEXT */
+ 0xe1, /* Ctxt flags: via ptr, in, out, can't be null */
+/* 16 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+/* 18 */ 0x30, /* FC_BIND_CONTEXT */
+ 0x41, /* Ctxt flags: in, can't be null */
+/* 20 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+
+ 0x0
+ }
+ };
+
+static const unsigned short RpcInterface_FormatStringOffsetTable[] =
+ {
+ 0,
+ 36,
+ 74,
+ 124,
+ 168,
+ };
+
+
+static const unsigned short _callbackRpcInterface_FormatStringOffsetTable[] =
+ {
+ 206
+ };
+
+
+static const MIDL_STUB_DESC RpcInterface_StubDesc =
+ {
+ (void *)& RpcInterface___RpcClientInterface,
+ MIDL_user_allocate,
+ MIDL_user_free,
+ &RpcInterface__MIDL_AutoBindHandle,
+ 0,
+ 0,
+ 0,
+ 0,
+ RpcInterface__MIDL_TypeFormatString.Format,
+ 1, /* -error bounds_check flag */
+ 0x50002, /* Ndr library version */
+ 0,
+ 0x801026e, /* MIDL Version 8.1.622 */
+ 0,
+ 0,
+ 0, /* notify & notify_flag routine table */
+ 0x1, /* MIDL flag */
+ 0, /* cs routines */
+ 0, /* proxy/server info */
+ 0
+ };
+
+static const RPC_DISPATCH_FUNCTION RpcInterface_table[] =
+ {
+ NdrServerCall2,
+ 0
+ };
+static const RPC_DISPATCH_TABLE RpcInterface_v1_0_DispatchTable =
+ {
+ 1,
+ (RPC_DISPATCH_FUNCTION*)RpcInterface_table
+ };
+
+static const SERVER_ROUTINE RpcInterface_ServerRoutineTable[] =
+ {
+ (SERVER_ROUTINE)MeteringDataEvent
+ };
+
+static const MIDL_SERVER_INFO RpcInterface_ServerInfo =
+ {
+ &RpcInterface_StubDesc,
+ RpcInterface_ServerRoutineTable,
+ RpcInterface__MIDL_ProcFormatString.Format,
+ _callbackRpcInterface_FormatStringOffsetTable,
+ 0,
+ 0,
+ 0,
+ 0};
+#if _MSC_VER >= 1200
+#pragma warning(pop)
+#endif
+
+
+#endif /* defined(_M_AMD64)*/
+
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/RpcInterface_h.h b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/RpcInterface_h.h
new file mode 100644
index 00000000..a0e2dcac
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/RpcInterface_h.h
@@ -0,0 +1,112 @@
+
+
+/* this ALWAYS GENERATED file contains the definitions for the interfaces */
+
+
+ /* File created by MIDL compiler version 8.01.0622 */
+/* at Mon Jan 18 19:14:07 2038
+ */
+/* Compiler settings for C:\WinHEC 2017 Lab\Toaster Driver\Service\RpcInterface.Idl:
+ Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622
+ protocol : dce , ms_ext, c_ext, robust
+ error checks: allocation ref bounds_check enum stub_data
+ VC __declspec() decoration level:
+ __declspec(uuid()), __declspec(selectany), __declspec(novtable)
+ DECLSPEC_UUID(), MIDL_INTERFACE()
+*/
+/* @@MIDL_FILE_HEADING( ) */
+
+#pragma warning( disable: 4049 ) /* more than 64k source lines */
+
+
+/* verify that the <rpcndr.h> version is high enough to compile this file*/
+#ifndef __REQUIRED_RPCNDR_H_VERSION__
+#define __REQUIRED_RPCNDR_H_VERSION__ 475
+#endif
+
+#include "rpc.h"
+#include "rpcndr.h"
+
+#ifndef __RPCNDR_H_VERSION__
+#error this stub requires an updated version of <rpcndr.h>
+#endif /* __RPCNDR_H_VERSION__ */
+
+
+#ifndef __RpcInterface_h_h__
+#define __RpcInterface_h_h__
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+#pragma once
+#endif
+
+#if defined(__cplusplus)
+#if defined(__MIDL_USE_C_ENUM)
+#define MIDL_ENUM enum
+#else
+#define MIDL_ENUM enum class
+#endif
+#endif
+
+
+/* Forward Declarations */
+
+/* header files for imported files */
+#include "oaidl.h"
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+
+#ifndef __RpcInterface_INTERFACE_DEFINED__
+#define __RpcInterface_INTERFACE_DEFINED__
+
+/* interface RpcInterface */
+/* [unique][version][uuid] */
+
+typedef /* [context_handle] */ void *PCONTEXT_HANDLE_TYPE;
+
+typedef /* [ref] */ PCONTEXT_HANDLE_TYPE *PPCONTEXT_HANDLE_TYPE;
+
+void RemoteOpen(
+ /* [in] */ handle_t hBinding,
+ /* [out] */ PPCONTEXT_HANDLE_TYPE pphContext);
+
+void RemoteClose(
+ /* [out][in] */ PPCONTEXT_HANDLE_TYPE pphContext);
+
+void StartMetering(
+ /* [in] */ PCONTEXT_HANDLE_TYPE phContext,
+ /* [in] */ __int64 samplePeriod,
+ /* [optional][in] */ __int64 context);
+
+void SetSamplePeriod(
+ /* [in] */ PCONTEXT_HANDLE_TYPE phContext,
+ /* [in] */ __int64 samplePeriod);
+
+void StopMetering(
+ /* [in] */ PCONTEXT_HANDLE_TYPE phContext);
+
+/* [callback] */ void MeteringDataEvent(
+ /* [in] */ __int64 data,
+ /* [optional][in] */ __int64 context);
+
+
+
+extern RPC_IF_HANDLE RpcInterface_v1_0_c_ifspec;
+extern RPC_IF_HANDLE RpcInterface_v1_0_s_ifspec;
+#endif /* __RpcInterface_INTERFACE_DEFINED__ */
+
+/* Additional Prototypes for ALL interfaces */
+
+void __RPC_USER PCONTEXT_HANDLE_TYPE_rundown( PCONTEXT_HANDLE_TYPE );
+
+/* end of Additional Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/RpcInterface_s.c b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/RpcInterface_s.c
new file mode 100644
index 00000000..ec58170d
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/RpcInterface_s.c
@@ -0,0 +1,430 @@
+
+
+/* this ALWAYS GENERATED file contains the RPC server stubs */
+
+
+ /* File created by MIDL compiler version 8.01.0622 */
+/* at Mon Jan 18 19:14:07 2038
+ */
+/* Compiler settings for C:\WinHEC 2017 Lab\Toaster Driver\Service\RpcInterface.Idl:
+ Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622
+ protocol : dce , ms_ext, c_ext, robust
+ error checks: allocation ref bounds_check enum stub_data
+ VC __declspec() decoration level:
+ __declspec(uuid()), __declspec(selectany), __declspec(novtable)
+ DECLSPEC_UUID(), MIDL_INTERFACE()
+*/
+/* @@MIDL_FILE_HEADING( ) */
+
+#if defined(_M_AMD64)
+
+
+#pragma warning( disable: 4049 ) /* more than 64k source lines */
+#if _MSC_VER >= 1200
+#pragma warning(push)
+#endif
+
+#pragma warning( disable: 4211 ) /* redefine extern to static */
+#pragma warning( disable: 4232 ) /* dllimport identity*/
+#pragma warning( disable: 4024 ) /* array to pointer mapping*/
+
+#include <string.h>
+#include "RpcInterface_h.h"
+
+#define TYPE_FORMAT_STRING_SIZE 23
+#define PROC_FORMAT_STRING_SIZE 245
+#define EXPR_FORMAT_STRING_SIZE 1
+#define TRANSMIT_AS_TABLE_SIZE 0
+#define WIRE_MARSHAL_TABLE_SIZE 0
+
+typedef struct _RpcInterface_MIDL_TYPE_FORMAT_STRING
+ {
+ short Pad;
+ unsigned char Format[ TYPE_FORMAT_STRING_SIZE ];
+ } RpcInterface_MIDL_TYPE_FORMAT_STRING;
+
+typedef struct _RpcInterface_MIDL_PROC_FORMAT_STRING
+ {
+ short Pad;
+ unsigned char Format[ PROC_FORMAT_STRING_SIZE ];
+ } RpcInterface_MIDL_PROC_FORMAT_STRING;
+
+typedef struct _RpcInterface_MIDL_EXPR_FORMAT_STRING
+ {
+ long Pad;
+ unsigned char Format[ EXPR_FORMAT_STRING_SIZE ];
+ } RpcInterface_MIDL_EXPR_FORMAT_STRING;
+
+
+static const RPC_SYNTAX_IDENTIFIER _RpcTransferSyntax =
+{{0x8A885D04,0x1CEB,0x11C9,{0x9F,0xE8,0x08,0x00,0x2B,0x10,0x48,0x60}},{2,0}};
+
+extern const RpcInterface_MIDL_TYPE_FORMAT_STRING RpcInterface__MIDL_TypeFormatString;
+extern const RpcInterface_MIDL_PROC_FORMAT_STRING RpcInterface__MIDL_ProcFormatString;
+extern const RpcInterface_MIDL_EXPR_FORMAT_STRING RpcInterface__MIDL_ExprFormatString;
+
+/* Standard interface: RpcInterface, ver. 1.0,
+ GUID={0x906B0CE0,0xC70B,0x1067,{0xB3,0x17,0x00,0xDD,0x01,0x06,0x62,0xDA}} */
+
+
+extern const MIDL_SERVER_INFO RpcInterface_ServerInfo;
+
+extern const RPC_DISPATCH_TABLE RpcInterface_v1_0_DispatchTable;
+
+static const RPC_SERVER_INTERFACE RpcInterface___RpcServerInterface =
+ {
+ sizeof(RPC_SERVER_INTERFACE),
+ {{0x906B0CE0,0xC70B,0x1067,{0xB3,0x17,0x00,0xDD,0x01,0x06,0x62,0xDA}},{1,0}},
+ {{0x8A885D04,0x1CEB,0x11C9,{0x9F,0xE8,0x08,0x00,0x2B,0x10,0x48,0x60}},{2,0}},
+ (RPC_DISPATCH_TABLE*)&RpcInterface_v1_0_DispatchTable,
+ 0,
+ 0,
+ 0,
+ &RpcInterface_ServerInfo,
+ 0x04000000
+ };
+RPC_IF_HANDLE RpcInterface_v1_0_s_ifspec = (RPC_IF_HANDLE)& RpcInterface___RpcServerInterface;
+
+extern const MIDL_STUB_DESC RpcInterface_StubDesc;
+
+ extern const MIDL_STUBLESS_PROXY_INFO RpcInterface_ProxyInfo;
+
+/* [callback] */ void MeteringDataEvent(
+ /* [in] */ __int64 data,
+ /* [optional][in] */ __int64 context)
+{
+
+ NdrClientCall2(
+ ( PMIDL_STUB_DESC )&RpcInterface_StubDesc,
+ (PFORMAT_STRING) &RpcInterface__MIDL_ProcFormatString.Format[206],
+ data,
+ context);
+
+}
+
+extern const NDR_RUNDOWN RundownRoutines[];
+
+#if !defined(__RPC_WIN64__)
+#error Invalid build platform for this stub.
+#endif
+
+static const RpcInterface_MIDL_PROC_FORMAT_STRING RpcInterface__MIDL_ProcFormatString =
+ {
+ 0,
+ {
+
+ /* Procedure RemoteOpen */
+
+ 0x0, /* 0 */
+ 0x48, /* Old Flags: */
+/* 2 */ NdrFcLong( 0x0 ), /* 0 */
+/* 6 */ NdrFcShort( 0x0 ), /* 0 */
+/* 8 */ NdrFcShort( 0x10 ), /* X64 Stack size/offset = 16 */
+/* 10 */ 0x32, /* FC_BIND_PRIMITIVE */
+ 0x0, /* 0 */
+/* 12 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 14 */ NdrFcShort( 0x0 ), /* 0 */
+/* 16 */ NdrFcShort( 0x38 ), /* 56 */
+/* 18 */ 0x40, /* Oi2 Flags: has ext, */
+ 0x1, /* 1 */
+/* 20 */ 0xa, /* 10 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 22 */ NdrFcShort( 0x0 ), /* 0 */
+/* 24 */ NdrFcShort( 0x0 ), /* 0 */
+/* 26 */ NdrFcShort( 0x0 ), /* 0 */
+/* 28 */ NdrFcShort( 0x0 ), /* 0 */
+
+ /* Parameter pphContext */
+
+/* 30 */ NdrFcShort( 0x110 ), /* Flags: out, simple ref, */
+/* 32 */ NdrFcShort( 0x8 ), /* X64 Stack size/offset = 8 */
+/* 34 */ NdrFcShort( 0x6 ), /* Type Offset=6 */
+
+ /* Procedure RemoteClose */
+
+/* 36 */ 0x0, /* 0 */
+ 0x48, /* Old Flags: */
+/* 38 */ NdrFcLong( 0x0 ), /* 0 */
+/* 42 */ NdrFcShort( 0x1 ), /* 1 */
+/* 44 */ NdrFcShort( 0x8 ), /* X64 Stack size/offset = 8 */
+/* 46 */ 0x30, /* FC_BIND_CONTEXT */
+ 0xe0, /* Ctxt flags: via ptr, in, out, */
+/* 48 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 50 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+/* 52 */ NdrFcShort( 0x38 ), /* 56 */
+/* 54 */ NdrFcShort( 0x38 ), /* 56 */
+/* 56 */ 0x40, /* Oi2 Flags: has ext, */
+ 0x1, /* 1 */
+/* 58 */ 0xa, /* 10 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 60 */ NdrFcShort( 0x0 ), /* 0 */
+/* 62 */ NdrFcShort( 0x0 ), /* 0 */
+/* 64 */ NdrFcShort( 0x0 ), /* 0 */
+/* 66 */ NdrFcShort( 0x0 ), /* 0 */
+
+ /* Parameter pphContext */
+
+/* 68 */ NdrFcShort( 0x118 ), /* Flags: in, out, simple ref, */
+/* 70 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 72 */ NdrFcShort( 0xe ), /* Type Offset=14 */
+
+ /* Procedure StartMetering */
+
+/* 74 */ 0x0, /* 0 */
+ 0x48, /* Old Flags: */
+/* 76 */ NdrFcLong( 0x0 ), /* 0 */
+/* 80 */ NdrFcShort( 0x2 ), /* 2 */
+/* 82 */ NdrFcShort( 0x18 ), /* X64 Stack size/offset = 24 */
+/* 84 */ 0x30, /* FC_BIND_CONTEXT */
+ 0x40, /* Ctxt flags: in, */
+/* 86 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 88 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+/* 90 */ NdrFcShort( 0x44 ), /* 68 */
+/* 92 */ NdrFcShort( 0x0 ), /* 0 */
+/* 94 */ 0x40, /* Oi2 Flags: has ext, */
+ 0x3, /* 3 */
+/* 96 */ 0xa, /* 10 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 98 */ NdrFcShort( 0x0 ), /* 0 */
+/* 100 */ NdrFcShort( 0x0 ), /* 0 */
+/* 102 */ NdrFcShort( 0x0 ), /* 0 */
+/* 104 */ NdrFcShort( 0x0 ), /* 0 */
+
+ /* Parameter phContext */
+
+/* 106 */ NdrFcShort( 0x8 ), /* Flags: in, */
+/* 108 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 110 */ NdrFcShort( 0x12 ), /* Type Offset=18 */
+
+ /* Parameter samplePeriod */
+
+/* 112 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 114 */ NdrFcShort( 0x8 ), /* X64 Stack size/offset = 8 */
+/* 116 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Parameter context */
+
+/* 118 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 120 */ NdrFcShort( 0x10 ), /* X64 Stack size/offset = 16 */
+/* 122 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Procedure SetSamplePeriod */
+
+/* 124 */ 0x0, /* 0 */
+ 0x48, /* Old Flags: */
+/* 126 */ NdrFcLong( 0x0 ), /* 0 */
+/* 130 */ NdrFcShort( 0x3 ), /* 3 */
+/* 132 */ NdrFcShort( 0x10 ), /* X64 Stack size/offset = 16 */
+/* 134 */ 0x30, /* FC_BIND_CONTEXT */
+ 0x40, /* Ctxt flags: in, */
+/* 136 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 138 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+/* 140 */ NdrFcShort( 0x34 ), /* 52 */
+/* 142 */ NdrFcShort( 0x0 ), /* 0 */
+/* 144 */ 0x40, /* Oi2 Flags: has ext, */
+ 0x2, /* 2 */
+/* 146 */ 0xa, /* 10 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 148 */ NdrFcShort( 0x0 ), /* 0 */
+/* 150 */ NdrFcShort( 0x0 ), /* 0 */
+/* 152 */ NdrFcShort( 0x0 ), /* 0 */
+/* 154 */ NdrFcShort( 0x0 ), /* 0 */
+
+ /* Parameter phContext */
+
+/* 156 */ NdrFcShort( 0x8 ), /* Flags: in, */
+/* 158 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 160 */ NdrFcShort( 0x12 ), /* Type Offset=18 */
+
+ /* Parameter samplePeriod */
+
+/* 162 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 164 */ NdrFcShort( 0x8 ), /* X64 Stack size/offset = 8 */
+/* 166 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Procedure StopMetering */
+
+/* 168 */ 0x0, /* 0 */
+ 0x48, /* Old Flags: */
+/* 170 */ NdrFcLong( 0x0 ), /* 0 */
+/* 174 */ NdrFcShort( 0x4 ), /* 4 */
+/* 176 */ NdrFcShort( 0x8 ), /* X64 Stack size/offset = 8 */
+/* 178 */ 0x30, /* FC_BIND_CONTEXT */
+ 0x40, /* Ctxt flags: in, */
+/* 180 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 182 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+/* 184 */ NdrFcShort( 0x24 ), /* 36 */
+/* 186 */ NdrFcShort( 0x0 ), /* 0 */
+/* 188 */ 0x40, /* Oi2 Flags: has ext, */
+ 0x1, /* 1 */
+/* 190 */ 0xa, /* 10 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 192 */ NdrFcShort( 0x0 ), /* 0 */
+/* 194 */ NdrFcShort( 0x0 ), /* 0 */
+/* 196 */ NdrFcShort( 0x0 ), /* 0 */
+/* 198 */ NdrFcShort( 0x0 ), /* 0 */
+
+ /* Parameter phContext */
+
+/* 200 */ NdrFcShort( 0x8 ), /* Flags: in, */
+/* 202 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 204 */ NdrFcShort( 0x12 ), /* Type Offset=18 */
+
+ /* Procedure MeteringDataEvent */
+
+/* 206 */ 0x34, /* FC_CALLBACK_HANDLE */
+ 0x48, /* Old Flags: */
+/* 208 */ NdrFcLong( 0x0 ), /* 0 */
+/* 212 */ NdrFcShort( 0x0 ), /* 0 */
+/* 214 */ NdrFcShort( 0x10 ), /* X64 Stack size/offset = 16 */
+/* 216 */ NdrFcShort( 0x20 ), /* 32 */
+/* 218 */ NdrFcShort( 0x0 ), /* 0 */
+/* 220 */ 0x40, /* Oi2 Flags: has ext, */
+ 0x2, /* 2 */
+/* 222 */ 0xa, /* 10 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 224 */ NdrFcShort( 0x0 ), /* 0 */
+/* 226 */ NdrFcShort( 0x0 ), /* 0 */
+/* 228 */ NdrFcShort( 0x0 ), /* 0 */
+/* 230 */ NdrFcShort( 0x0 ), /* 0 */
+
+ /* Parameter data */
+
+/* 232 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 234 */ NdrFcShort( 0x0 ), /* X64 Stack size/offset = 0 */
+/* 236 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Parameter context */
+
+/* 238 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 240 */ NdrFcShort( 0x8 ), /* X64 Stack size/offset = 8 */
+/* 242 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ 0x0
+ }
+ };
+
+static const RpcInterface_MIDL_TYPE_FORMAT_STRING RpcInterface__MIDL_TypeFormatString =
+ {
+ 0,
+ {
+ NdrFcShort( 0x0 ), /* 0 */
+/* 2 */
+ 0x11, 0x4, /* FC_RP [alloced_on_stack] */
+/* 4 */ NdrFcShort( 0x2 ), /* Offset= 2 (6) */
+/* 6 */ 0x30, /* FC_BIND_CONTEXT */
+ 0xa0, /* Ctxt flags: via ptr, out, */
+/* 8 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+/* 10 */
+ 0x11, 0x4, /* FC_RP [alloced_on_stack] */
+/* 12 */ NdrFcShort( 0x2 ), /* Offset= 2 (14) */
+/* 14 */ 0x30, /* FC_BIND_CONTEXT */
+ 0xe1, /* Ctxt flags: via ptr, in, out, can't be null */
+/* 16 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+/* 18 */ 0x30, /* FC_BIND_CONTEXT */
+ 0x41, /* Ctxt flags: in, can't be null */
+/* 20 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+
+ 0x0
+ }
+ };
+
+static const NDR_RUNDOWN RundownRoutines[] =
+ {
+ PCONTEXT_HANDLE_TYPE_rundown
+ };
+
+
+static const unsigned short RpcInterface_FormatStringOffsetTable[] =
+ {
+ 0,
+ 36,
+ 74,
+ 124,
+ 168,
+ };
+
+
+static const unsigned short _callbackRpcInterface_FormatStringOffsetTable[] =
+ {
+ 206
+ };
+
+
+static const MIDL_STUB_DESC RpcInterface_StubDesc =
+ {
+ (void *)& RpcInterface___RpcServerInterface,
+ MIDL_user_allocate,
+ MIDL_user_free,
+ 0,
+ RundownRoutines,
+ 0,
+ 0,
+ 0,
+ RpcInterface__MIDL_TypeFormatString.Format,
+ 1, /* -error bounds_check flag */
+ 0x50002, /* Ndr library version */
+ 0,
+ 0x801026e, /* MIDL Version 8.1.622 */
+ 0,
+ 0,
+ 0, /* notify & notify_flag routine table */
+ 0x1, /* MIDL flag */
+ 0, /* cs routines */
+ 0, /* proxy/server info */
+ 0
+ };
+
+static const RPC_DISPATCH_FUNCTION RpcInterface_table[] =
+ {
+ NdrServerCall2,
+ NdrServerCall2,
+ NdrServerCall2,
+ NdrServerCall2,
+ NdrServerCall2,
+ 0
+ };
+static const RPC_DISPATCH_TABLE RpcInterface_v1_0_DispatchTable =
+ {
+ 5,
+ (RPC_DISPATCH_FUNCTION*)RpcInterface_table
+ };
+
+static const SERVER_ROUTINE RpcInterface_ServerRoutineTable[] =
+ {
+ (SERVER_ROUTINE)RemoteOpen,
+ (SERVER_ROUTINE)RemoteClose,
+ (SERVER_ROUTINE)StartMetering,
+ (SERVER_ROUTINE)SetSamplePeriod,
+ (SERVER_ROUTINE)StopMetering,
+ };
+
+static const MIDL_SERVER_INFO RpcInterface_ServerInfo =
+ {
+ &RpcInterface_StubDesc,
+ RpcInterface_ServerRoutineTable,
+ RpcInterface__MIDL_ProcFormatString.Format,
+ RpcInterface_FormatStringOffsetTable,
+ 0,
+ 0,
+ 0,
+ 0};
+#if _MSC_VER >= 1200
+#pragma warning(pop)
+#endif
+
+
+#endif /* defined(_M_AMD64)*/
+
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/SampleConfiguration.cpp b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/SampleConfiguration.cpp
new file mode 100644
index 00000000..a808cf83
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/SampleConfiguration.cpp
@@ -0,0 +1,21 @@
+//*********************************************************
+//
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the MIT License (MIT).
+// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
+// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
+// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
+//
+//*********************************************************
+
+#include "pch.h"
+#include "MainPage.xaml.h"
+#include "SampleConfiguration.h"
+
+using namespace SDKTemplate;
+
+Platform::Array<Scenario>^ MainPage::scenariosInner = ref new Platform::Array<Scenario>
+{
+ { "Connect to an NT Service", "SDKTemplate.MeteringData" },
+};
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/SampleConfiguration.h b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/SampleConfiguration.h
new file mode 100644
index 00000000..22581275
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/SampleConfiguration.h
@@ -0,0 +1,47 @@
+//*********************************************************
+//
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the MIT License (MIT).
+// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
+// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
+// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
+//
+//*********************************************************
+
+#pragma once
+#include "pch.h"
+
+namespace SDKTemplate
+{
+ value struct Scenario;
+
+ partial ref class MainPage
+ {
+ internal:
+ static property Platform::String^ FEATURE_NAME
+ {
+ Platform::String^ get()
+ {
+ return "Custom Capability C++ sample";
+ }
+ }
+
+ static property Platform::Array<Scenario>^ scenarios
+ {
+ Platform::Array<Scenario>^ get()
+ {
+ return scenariosInner;
+ }
+ }
+
+ private:
+ static Platform::Array<Scenario>^ scenariosInner;
+ };
+
+ public value struct Scenario
+ {
+ Platform::String^ Title;
+ Platform::String^ ClassName;
+ };
+}
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/Scenario1_MeteringData.xaml b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/Scenario1_MeteringData.xaml
new file mode 100644
index 00000000..0636f74d
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/Scenario1_MeteringData.xaml
@@ -0,0 +1,68 @@
+<!--
+//*********************************************************
+//
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the MIT License (MIT).
+// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
+// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
+// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
+//
+//*********************************************************
+-->
+<Page
+ x:Class="SDKTemplate.MeteringData"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ mc:Ignorable="d">
+
+ <ScrollViewer Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Padding="12,10,12,12">
+ <Grid>
+ <Grid.RowDefinitions>
+ <RowDefinition Height="Auto"/>
+ <RowDefinition Height="*"/>
+ </Grid.RowDefinitions>
+ <StackPanel Margin="0,0,0,10">
+ <TextBlock Text="Description:" Style="{StaticResource SampleHeaderTextStyle}"/>
+ <TextBlock Style="{StaticResource ScenarioDescriptionTextStyle}" TextWrapping="Wrap">
+ This scenario demonstrates RPC communication between an app and an NT service. For demonstration purposes, the service reads data from an imaginary device.
+ </TextBlock>
+ <StackPanel BorderThickness="2" BorderBrush="{ThemeResource ButtonBorderThemeBrush}" Margin="0,10,0,0" Padding="5">
+ <TextBlock TextWrapping="Wrap">
+ <Run FontWeight="Bold" Text="Step 1: Choose a period at which the samples will be pushed from the NT service"/>
+ </TextBlock>
+ <TextBlock TextWrapping="Wrap" Margin="0,10,5,0">
+ Sample Period (ms): <Run Text="{x:Bind SamplePeriodSlider.Value, Mode=OneWay}"/>
+ </TextBlock>
+ <Slider x:Name="SamplePeriodSlider" HorizontalAlignment="Left" Width="300" IsEnabled="{x:Bind ViewModel.SliderEnabled, Mode=OneWay}" VerticalAlignment="Top" Minimum="1" Maximum="1000" ValueChanged="slider_ValueChanged" FontSize="20" Value="{x:Bind ViewModel.SliderValue, Mode=OneWay}"/>
+ </StackPanel>
+ <StackPanel BorderThickness="2" BorderBrush="{ThemeResource ButtonBorderThemeBrush}" Margin="0,10,0,0" Padding="5">
+ <TextBlock TextWrapping="Wrap">
+ <Run FontWeight="Bold" Text="Step 2: Click start to receive samples from the NT service"/>
+ </TextBlock>
+ <StackPanel Orientation="Horizontal" Margin="0,10,0,0">
+ <Button IsEnabled="{x:Bind ViewModel.StartButtonEnabled, Mode=OneWay}" Content="Start" Click="button_Click_StartMetering"/>
+ <Button IsEnabled="{x:Bind ViewModel.StopButtonEnabled, Mode=OneWay}" Content="Stop" Click="button_Click_StopMetering" Margin="10,0,0,0"/>
+ </StackPanel>
+ </StackPanel>
+ <StackPanel BorderThickness="2" BorderBrush="{ThemeResource ButtonBorderThemeBrush}" Margin="0,10,0,0" Padding="5">
+ <TextBlock TextWrapping="Wrap">
+ <Run FontWeight="Bold" Text="Step 3: Observe the expected and actual incoming sample rate"/>
+ </TextBlock>
+ <TextBlock Margin="0,10,0,0">
+ Expected Sample Rate: <Run Text="{x:Bind ViewModel.ExpectedRpcCallbackRate, Mode=OneWay}"/>
+ </TextBlock>
+ <TextBlock Margin="0,10,0,0">
+ Actual Sample Rate: <Run Text="{x:Bind ViewModel.ActualRpcCallbackRate, Mode=OneWay}"/>
+ </TextBlock>
+ </StackPanel>
+ <TextBlock FontWeight="Bold" Margin="0,10,0,0" Text="Samples:"/>
+ </StackPanel>
+ <ScrollViewer Grid.Row="2" HorizontalAlignment="Stretch" Margin="0,10,0,0" VerticalAlignment="Stretch">
+ <TextBox Height="400" IsReadOnly="true" HorizontalAlignment="Stretch" Text="{x:Bind ViewModel.SampleMessage, Mode=OneWay}" BorderThickness="0"/>
+ </ScrollViewer>
+ </Grid>
+ </ScrollViewer>
+</Page>
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/Scenario1_MeteringData.xaml.cpp b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/Scenario1_MeteringData.xaml.cpp
new file mode 100644
index 00000000..3a9e1f48
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/Scenario1_MeteringData.xaml.cpp
@@ -0,0 +1,47 @@
+//*********************************************************
+//
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the MIT License (MIT).
+// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
+// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
+// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
+//
+//*********************************************************
+
+#include "pch.h"
+#include "Scenario1_MeteringData.xaml.h"
+
+using namespace SDKTemplate;
+
+using namespace Platform;
+using namespace Windows::Foundation;
+using namespace Windows::Foundation::Collections;
+using namespace Windows::UI::Xaml;
+using namespace Windows::UI::Xaml::Controls::Primitives;
+
+MeteringData::MeteringData()
+{
+ InitializeComponent();
+ ViewModel = ref new ServiceViewModel();
+}
+
+void SDKTemplate::MeteringData::button_Click_StartMetering(Object^ sender, RoutedEventArgs^ e)
+{
+ ViewModel->StartMetering((int)SamplePeriodSlider->Value);
+}
+
+void SDKTemplate::MeteringData::button_Click_StopMetering(Object^ sender, RoutedEventArgs^ e)
+{
+ ViewModel->StopMetering();
+}
+
+void SDKTemplate::MeteringData::slider_ValueChanged(Object^ sender, RangeBaseValueChangedEventArgs^ e)
+{
+ // Ignore slider value changes prior to ViewModel initialization.
+ if (ViewModel != nullptr)
+ {
+ // Update the sample period in response to slider change.
+ ViewModel->SetSamplePeriod((int)SamplePeriodSlider->Value);
+ }
+}
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/Scenario1_MeteringData.xaml.h b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/Scenario1_MeteringData.xaml.h
new file mode 100644
index 00000000..79faa4f3
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/Scenario1_MeteringData.xaml.h
@@ -0,0 +1,31 @@
+//*********************************************************
+//
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the MIT License (MIT).
+// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
+// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
+// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
+//
+//*********************************************************
+
+#pragma once
+
+#include "Scenario1_MeteringData.g.h"
+#include "ServiceViewModel.h"
+
+namespace SDKTemplate
+{
+ [Windows::Foundation::Metadata::WebHostHidden]
+ public ref class MeteringData sealed
+ {
+ public:
+ MeteringData();
+ property ServiceViewModel^ ViewModel;
+
+ private:
+ void button_Click_StartMetering(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);
+ void button_Click_StopMetering(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);
+ void slider_ValueChanged(Platform::Object^ sender, Windows::UI::Xaml::Controls::Primitives::RangeBaseValueChangedEventArgs^ e);
+ };
+}
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/ServiceViewModel.cpp b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/ServiceViewModel.cpp
new file mode 100644
index 00000000..9f9674c4
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/ServiceViewModel.cpp
@@ -0,0 +1,282 @@
+#include "pch.h"
+#include "ServiceViewModel.h"
+#include "MainPage.xaml.h"
+
+using namespace Concurrency;
+using namespace Platform;
+using namespace SDKTemplate;
+using namespace Windows::System::Threading;
+using namespace Windows::UI::Xaml::Data;
+
+ServiceViewModel::ServiceViewModel()
+{
+ // Set default rate
+ samplePeriod = 100;
+
+ // Initialize UI state
+ startButtonEnabled = true;
+ stopButtonEnabled = false;
+ sliderEnabled = true;
+ sliderValue = samplePeriod;
+ actualRpcCallbackRate = "0";
+ expectedRpcCallbackRate = "0";
+
+ meteringOn = false;
+
+ // Get the dispatcher for notifying property change
+ dispatcher = Windows::UI::Core::CoreWindow::GetForCurrentThread()->Dispatcher;
+
+ sampleArray = ref new Platform::Array<__int64>(1000);
+}
+
+//
+// if errCode represents an error, then display a message and return true.
+//
+inline bool ServiceViewModel::NotifyIfAnyError(__int64 errCode)
+{
+ if (errCode != 0)
+ {
+ meteringOn = false;
+ NotifyStatusMessage("Error occured while communicating with RPC server: " + errCode.ToString(), NotifyType::ErrorMessage);
+
+ // Reset button state
+ StartButtonEnabled = true;
+ StopButtonEnabled = false;
+ return true;
+ }
+ return false;
+}
+
+// Bindable properties
+#pragma region BindableProperties
+
+String^ ServiceViewModel::ExpectedRpcCallbackRate::get() { return expectedRpcCallbackRate; }
+void ServiceViewModel::ExpectedRpcCallbackRate::set(String^ value)
+{
+ if (expectedRpcCallbackRate != value)
+ {
+ expectedRpcCallbackRate = value;
+ NotifyPropertyChanged("ExpectedRpcCallbackRate");
+ }
+}
+
+String^ ServiceViewModel::ActualRpcCallbackRate::get() { return actualRpcCallbackRate; }
+void ServiceViewModel::ActualRpcCallbackRate::set(String^ value)
+{
+ if (actualRpcCallbackRate != value)
+ {
+ actualRpcCallbackRate = value;
+ NotifyPropertyChanged("ActualRpcCallbackRate");
+ }
+}
+
+String^ ServiceViewModel::SampleMessage::get() { return sampleMessage; }
+void ServiceViewModel::SampleMessage::set(String^ value)
+{
+ if (sampleMessage != value)
+ {
+ sampleMessage = value;
+ NotifyPropertyChanged("SampleMessage");
+ }
+}
+
+bool ServiceViewModel::StartButtonEnabled::get() { return startButtonEnabled; }
+void ServiceViewModel::StartButtonEnabled::set(bool value)
+{
+ if (startButtonEnabled != value)
+ {
+ startButtonEnabled = value;
+ NotifyPropertyChanged("StartButtonEnabled");
+ }
+}
+
+bool ServiceViewModel::StopButtonEnabled::get() { return stopButtonEnabled; }
+void ServiceViewModel::StopButtonEnabled::set(bool value)
+{
+ if (stopButtonEnabled != value)
+ {
+ stopButtonEnabled = value;
+ NotifyPropertyChanged("StopButtonEnabled");
+ }
+}
+
+bool ServiceViewModel::SliderEnabled::get() { return sliderEnabled; }
+void ServiceViewModel::SliderEnabled::set(bool value)
+{
+ if (sliderEnabled != value)
+ {
+ sliderEnabled = value;
+ NotifyPropertyChanged("SliderEnabled");
+ }
+}
+
+double ServiceViewModel::SliderValue::get() { return sliderValue; }
+void ServiceViewModel::SliderValue::set(double value)
+{
+ if (sliderValue != value)
+ {
+ sliderValue = value;
+ NotifyPropertyChanged("SliderValue");
+ }
+}
+#pragma endregion BindableProperties
+
+void SDKTemplate::ServiceViewModel::NotifyPropertyChanged(Platform::String^ prop)
+{
+ if (dispatcher != nullptr)
+ {
+ dispatcher->RunAsync(
+ Windows::UI::Core::CoreDispatcherPriority::Normal,
+ ref new Windows::UI::Core::DispatchedHandler([this, prop]()
+ {
+ PropertyChangedEventArgs^ args =
+ ref new PropertyChangedEventArgs(prop);
+ PropertyChanged(this, args);
+ }));
+ }
+ // else log error
+}
+
+//
+// Initializes rpcclient and metering
+//
+void ServiceViewModel::StartMetering(int sampleRate)
+{
+ create_task([this, sampleRate]
+ {
+ SampleMessage = "";
+ StartButtonEnabled = false;
+ StopButtonEnabled = true;
+ stopMeteringRequested = false;
+
+ rpcclient = std::make_unique<RpcClient>();
+ if (NotifyIfAnyError(rpcclient->Initialize())) return;
+
+ meteringOn = true;
+ sampleRefreshCount = 0;
+ sampleArray[0] = 0;
+
+ // Set the sample rate on server
+ this->samplePeriod = sampleRate;
+ __int64 retCode = rpcclient->SetSampleRate(sampleRate);
+
+ FILETIME initialSystemTime;
+ GetSystemTimeAsFileTime(&initialSystemTime);
+ lastUpdateTime.LowPart = initialSystemTime.dwLowDateTime;
+ lastUpdateTime.HighPart = initialSystemTime.dwHighDateTime;
+
+ if (!NotifyIfAnyError(retCode))
+ {
+ // Set up worker for UI update.
+ Windows::Foundation::TimeSpan span{ 100 * 10000 }; // 100ms refresh rate
+
+ auto timerHandler = ref new TimerElapsedHandler([this](ThreadPoolTimer^)
+ {
+ __int64 meteringData = rpcclient->MeteringData;
+
+ // If there is no new data, return
+ if (sampleArray[0] == meteringData)
+ {
+ return;
+ }
+
+ // Arithmetic subtraction of time
+ // https://msdn.microsoft.com/en-us/library/ms724950%28VS.85%29.aspx?f=255&MSPPError=-2147217396
+ FILETIME currentSystemTime;
+ ULARGE_INTEGER currentTimeUi;
+ GetSystemTimeAsFileTime(&currentSystemTime);
+ currentTimeUi.LowPart = currentSystemTime.dwLowDateTime;
+ currentTimeUi.HighPart = currentSystemTime.dwHighDateTime;
+
+ // Calculate number of samples received since last callback
+ __int64 now = rpcclient->CallbackCount;
+ __int64 diff = now - rpcDataCountOld;
+ rpcDataCountOld = now;
+
+ // Calculate incoming sample rate
+ double rate = (double)diff*1E7 / (currentTimeUi.QuadPart - lastUpdateTime.QuadPart);
+ ExpectedRpcCallbackRate = (1E3 / this->samplePeriod).ToString() + " /sec";
+ lastUpdateTime = currentTimeUi;
+
+ ActualRpcCallbackRate = rate.ToString() + " /sec";
+
+ // Construct the sample data string
+ String^ sampleMessage = meteringData + "\n";
+ unsigned int length = sampleArray->Length;
+ if (sampleRefreshCount < length)
+ {
+ ++sampleRefreshCount;
+ length = sampleRefreshCount;
+ }
+
+ // Insert the new data point at the top of the array.
+ // Old data falls off the end of the array.
+ for (unsigned int i = 1; i < length; ++i)
+ {
+ sampleArray[i] = sampleArray[i - 1];
+ sampleMessage += sampleArray[i] + "\n";
+ }
+ sampleArray[0] = meteringData;
+
+ SampleMessage = sampleMessage;
+ });
+
+ ThreadPoolTimer^ periodicTimer = ThreadPoolTimer::CreatePeriodicTimer(timerHandler, span);
+ NotifyStatusMessage("Metering start command sent successfully", NotifyType::StatusMessage);
+ retCode = this->rpcclient->StartMeteringAndWaitForStop(sampleRate);
+ meteringOn = false;
+ periodicTimer->Cancel();
+ if (!NotifyIfAnyError(retCode) && !stopMeteringRequested)
+ {
+ NotifyStatusMessage("Rpc server connection closed without stop metering being requested",
+ NotifyType::ErrorMessage);
+ StartButtonEnabled = true;
+ StopButtonEnabled = false;
+ }
+ }
+ });
+}
+
+//
+// Stop metering
+//
+void ServiceViewModel::StopMetering()
+{
+ create_task([this]
+ {
+ StopButtonEnabled = false;
+ SliderEnabled = false;
+ stopMeteringRequested = true;
+
+ __int64 retCode = this->rpcclient->StopMetering();
+ if (!NotifyIfAnyError(retCode))
+ {
+ NotifyStatusMessage("Metering stop command sent successfully",
+ NotifyType::StatusMessage);
+ }
+
+ SliderEnabled = true;
+ StartButtonEnabled = true;
+ });
+}
+
+//
+// Set sample period
+//
+void ServiceViewModel::SetSamplePeriod(int samplePeriod)
+{
+ create_task([this, samplePeriod]
+ {
+ this->samplePeriod = samplePeriod;
+ if (meteringOn)
+ {
+ _int64 retCode = rpcclient->SetSampleRate(samplePeriod);
+ if (!NotifyIfAnyError(retCode))
+ {
+ NotifyStatusMessage(
+ "Sample period set to: " + samplePeriod,
+ NotifyType::StatusMessage);
+ }
+ }
+ });
+} \ No newline at end of file
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/ServiceViewModel.h b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/ServiceViewModel.h
new file mode 100644
index 00000000..c2fcad0c
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/ServiceViewModel.h
@@ -0,0 +1,77 @@
+#pragma once
+
+#include "RpcClient.h"
+#include <memory>
+
+namespace SDKTemplate
+{
+ [Windows::UI::Xaml::Data::Bindable]
+ public ref class ServiceViewModel sealed : Windows::UI::Xaml::Data::INotifyPropertyChanged
+ {
+ public:
+ ServiceViewModel();
+ void StartMetering(int sampleRate);
+ void SetSamplePeriod(int rate);
+ void StopMetering();
+ property Platform::String^ ExpectedRpcCallbackRate
+ {
+ Platform::String^ get();
+ void set(Platform::String^ value);
+ }
+ property Platform::String^ ActualRpcCallbackRate
+ {
+ Platform::String^ get();
+ void set(Platform::String^ value);
+ }
+ property Platform::String^ SampleMessage
+ {
+ Platform::String^ get();
+ void set(Platform::String^ value);
+ }
+ property bool StartButtonEnabled
+ {
+ bool get();
+ void set(bool value);
+ }
+ property bool StopButtonEnabled
+ {
+ bool get();
+ void set(bool value);
+ }
+ property bool SliderEnabled
+ {
+ bool get();
+ void set(bool value);
+ }
+ property double SliderValue
+ {
+ double get();
+ void set(double value);
+ }
+ virtual event Windows::UI::Xaml::Data::PropertyChangedEventHandler^ PropertyChanged;
+
+ private:
+ volatile bool meteringOn;
+ Windows::UI::Core::ICoreDispatcher^ dispatcher;
+ int samplePeriod;
+ ULARGE_INTEGER lastUpdateTime;
+ __int64 rpcDataCountOld = 0;
+ unsigned int sampleRefreshCount = 0;
+ std::unique_ptr<RpcClient> rpcclient;
+ bool stopMeteringRequested;
+ bool NotifyIfAnyError(__int64 errCode);
+
+ // Variables backing UI bindings
+ Platform::String^ sampleMessage;
+ Platform::String^ expectedRpcCallbackRate;
+ Platform::String^ actualRpcCallbackRate;
+ bool startButtonEnabled;
+ bool stopButtonEnabled;
+ bool sliderEnabled;
+ double sliderValue;
+
+ void NotifyPropertyChanged(Platform::String^ prop);
+
+ Platform::Array<__int64>^ sampleArray;
+ };
+}
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/pch.cpp b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/pch.cpp
new file mode 100644
index 00000000..b300c4c0
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/pch.cpp
@@ -0,0 +1,60 @@
+//*********************************************************
+//
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the MIT License (MIT).
+// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
+// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
+// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
+//
+//*********************************************************
+
+//
+// pch.cpp
+// Include the standard header and generate the precompiled header.
+//
+
+#include "pch.h"
+#include "MainPage.xaml.h"
+
+#include <robuffer.h>
+#include <wrl\client.h>
+
+using namespace Microsoft::WRL;
+using namespace Windows::Storage::Streams;
+
+byte* GetArrayFromBuffer(Windows::Storage::Streams::IBuffer^ buffer)
+{
+ ComPtr<IInspectable> base = reinterpret_cast<IInspectable*>(buffer);
+ ComPtr<IBufferByteAccess> access;
+
+ auto hr = base.As(&access);
+
+ if (FAILED(hr))
+ {
+ throw Platform::Exception::CreateException(hr);
+ }
+
+ byte* data;
+
+ hr = access->Buffer(&data);
+
+ if (FAILED(hr))
+ {
+ throw Platform::Exception::CreateException(hr);
+ }
+
+ // The returned buffer is valid as long as the IBuffer passed in
+ // remains valid.
+ return data;
+}
+
+void NotifyStatusMessage(Platform::String^ message, SDKTemplate::NotifyType messageType)
+{
+ SDKTemplate::MainPage::Current->Dispatcher->RunAsync(
+ Windows::UI::Core::CoreDispatcherPriority::Normal,
+ ref new Windows::UI::Core::DispatchedHandler(
+ [message, messageType]() {
+ SDKTemplate::MainPage::Current->NotifyUser(message, messageType);
+ }));
+}
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/pch.h b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/pch.h
new file mode 100644
index 00000000..3cec6ca5
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/App/CustomCapability/cpp/pch.h
@@ -0,0 +1,27 @@
+//*********************************************************
+//
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the MIT License (MIT).
+// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
+// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
+// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
+//
+//*********************************************************
+
+//
+// pch.h
+// Header for standard system include files.
+//
+
+#pragma once
+
+#include <collection.h>
+#include <ppltasks.h>
+
+#include "App.xaml.h"
+#include "MainPage.xaml.h"
+
+byte* GetArrayFromBuffer(Windows::Storage::Streams::IBuffer^ buffer);
+
+void NotifyStatusMessage(Platform::String^ message, SDKTemplate::NotifyType messageType);
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/cpp/App.xaml.cpp b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/cpp/App.xaml.cpp
new file mode 100644
index 00000000..1abebcb3
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/cpp/App.xaml.cpp
@@ -0,0 +1,134 @@
+//*********************************************************
+//
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the MIT License (MIT).
+// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
+// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
+// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
+//
+//*********************************************************
+
+#include "pch.h"
+#include "MainPage.xaml.h"
+
+using namespace SDKTemplate;
+
+using namespace Platform;
+using namespace Windows::ApplicationModel;
+using namespace Windows::ApplicationModel::Activation;
+using namespace Windows::Foundation;
+using namespace Windows::Foundation::Collections;
+using namespace Windows::UI::Xaml;
+using namespace Windows::UI::Xaml::Controls;
+using namespace Windows::UI::Xaml::Controls::Primitives;
+using namespace Windows::UI::Xaml::Data;
+using namespace Windows::UI::Xaml::Input;
+using namespace Windows::UI::Xaml::Interop;
+using namespace Windows::UI::Xaml::Media;
+using namespace Windows::UI::Xaml::Navigation;
+
+// The Blank Application template is documented at http://go.microsoft.com/fwlink/?LinkId=402347&clcid=0x409
+
+// These placeholder functions are used if the sample does not
+// implement the corresponding methods. This allows us to simulate
+// C# partial methods in C++.
+
+static void Partial_Construct() { }
+
+/// <summary>
+/// Initializes the singleton application object. This is the first line of authored code
+/// executed, and as such is the logical equivalent of main() or WinMain().
+/// </summary>
+App::App()
+{
+ InitializeComponent();
+ Partial_Construct();
+ Suspending += ref new Windows::UI::Xaml::SuspendingEventHandler(this, &SDKTemplate::App::OnSuspending);
+}
+
+/// <summary>
+/// Invoked when the application is launched normally by the end user. Other entry points
+/// will be used such as when the application is launched to open a specific file.
+/// </summary>
+/// <param name="e">Details about the launch request and process.</param>
+void App::OnLaunched(Windows::ApplicationModel::Activation::LaunchActivatedEventArgs^ e)
+{
+#if _DEBUG
+ // Show graphics profiling information while debugging.
+ if (IsDebuggerPresent())
+ {
+ // Display the current frame rate counters
+ DebugSettings->EnableFrameRateCounter = false;
+ }
+#endif
+
+ auto rootFrame = dynamic_cast<Frame^>(Window::Current->Content);
+
+ // Do not repeat app initialization when the Window already has content,
+ // just ensure that the window is active
+ if (rootFrame == nullptr)
+ {
+ // Create a Frame to act as the navigation context and associate it with
+ // a SuspensionManager key
+ rootFrame = ref new Frame();
+
+ // Set the default language
+ rootFrame->Language = Windows::Globalization::ApplicationLanguages::Languages->GetAt(0);
+
+ rootFrame->NavigationFailed += ref new Windows::UI::Xaml::Navigation::NavigationFailedEventHandler(this, &App::OnNavigationFailed);
+
+ if (e->PreviousExecutionState == ApplicationExecutionState::Terminated)
+ {
+ // TODO: Restore the saved session state only when appropriate, scheduling the
+ // final launch steps after the restore is complete
+ }
+
+ if (rootFrame->Content == nullptr)
+ {
+ // When the navigation stack isn't restored navigate to the first page,
+ // configuring the new page by passing required information as a navigation
+ // parameter
+ rootFrame->Navigate(TypeName(MainPage::typeid), e->Arguments);
+ }
+ // Place the frame in the current Window
+ Window::Current->Content = rootFrame;
+ // Ensure the current window is active
+ Window::Current->Activate();
+ }
+ else
+ {
+ if (rootFrame->Content == nullptr)
+ {
+ // When the navigation stack isn't restored navigate to the first page,
+ // configuring the new page by passing required information as a navigation
+ // parameter
+ rootFrame->Navigate(TypeName(MainPage::typeid), e->Arguments);
+ }
+ // Ensure the current window is active
+ Window::Current->Activate();
+ }
+}
+
+/// <summary>
+/// Invoked when application execution is being suspended. Application state is saved
+/// without knowing whether the application will be terminated or resumed with the contents
+/// of memory still intact.
+/// </summary>
+/// <param name="sender">The source of the suspend request.</param>
+/// <param name="e">Details about the suspend request.</param>
+void App::OnSuspending(Object^ /* sender */, SuspendingEventArgs^ /* e */)
+{
+ //TODO: Save application state and stop any background activity
+}
+
+
+/// <summary>
+/// Invoked when Navigation to a certain page fails
+/// </summary>
+/// <param name="sender">The Frame which failed navigation</param>
+/// <param name="e">Details about the navigation failure</param>
+void App::OnNavigationFailed(Platform::Object ^sender, Windows::UI::Xaml::Navigation::NavigationFailedEventArgs ^e)
+{
+ throw ref new FailureException("Failed to load Page " + e->SourcePageType.Name);
+} \ No newline at end of file
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/cpp/App.xaml.h b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/cpp/App.xaml.h
new file mode 100644
index 00000000..e7bd715a
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/cpp/App.xaml.h
@@ -0,0 +1,33 @@
+//*********************************************************
+//
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the MIT License (MIT).
+// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
+// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
+// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
+//
+//*********************************************************
+
+#pragma once
+
+#include "App.g.h"
+
+namespace SDKTemplate
+{
+ /// <summary>
+ /// Provides application-specific behavior to supplement the default Application class.
+ /// </summary>
+ ref class App sealed
+ {
+ protected:
+ virtual void OnLaunched(Windows::ApplicationModel::Activation::LaunchActivatedEventArgs^ e) override;
+
+ internal:
+ App();
+
+ private:
+ void OnSuspending(Platform::Object^ sender, Windows::ApplicationModel::SuspendingEventArgs^ e);
+ void OnNavigationFailed(Platform::Object ^sender, Windows::UI::Xaml::Navigation::NavigationFailedEventArgs ^e);
+ };
+}
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/cpp/DeviceHelpers.h b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/cpp/DeviceHelpers.h
new file mode 100644
index 00000000..c2fa82b2
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/cpp/DeviceHelpers.h
@@ -0,0 +1,67 @@
+//*********************************************************
+//
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the MIT License (MIT).
+// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
+// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
+// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
+//
+//*********************************************************
+
+#pragma once
+
+namespace SDKTemplate
+{
+ namespace DeviceHelpers
+ {
+ // We use a DeviceWatcher instead of DeviceInformation.FindAllAsync because
+ // the DeviceWatcher will let us see the devices as they are discovered,
+ // whereas FindAllAsync returns results only after discovery is complete.
+ //
+ // The convertAsync functional is passed a device ID (Platform::String^) and returns a
+ // Concurrency::task<Something^>.
+ template<typename Converter>
+ auto GetFirstDeviceAsync(Platform::String^ selector, Converter convertAsync)
+ -> decltype(convertAsync(nullptr))
+ {
+ using T = typename decltype(convertAsync(nullptr))::result_type;
+ Concurrency::task_completion_event<T> completionEvent;
+ auto pendingTasks = std::make_shared<std::vector<Concurrency::task<void>>>();
+ Windows::Devices::Enumeration::DeviceWatcher^ watcher = Windows::Devices::Enumeration::DeviceInformation::CreateWatcher(selector);
+
+ watcher->Added += ref new Windows::Foundation::TypedEventHandler<Windows::Devices::Enumeration::DeviceWatcher^, Windows::Devices::Enumeration::DeviceInformation^>(
+ [completionEvent, pendingTasks, convertAsync](Windows::Devices::Enumeration::DeviceWatcher^ sender, Windows::Devices::Enumeration::DeviceInformation^ device)
+ {
+ auto task = convertAsync(device->Id).then([completionEvent](T t)
+ {
+ if (t != nullptr)
+ {
+ completionEvent.set(t);
+ }
+ });
+ pendingTasks->push_back(task);
+ });
+
+ watcher->EnumerationCompleted += ref new Windows::Foundation::TypedEventHandler<Windows::Devices::Enumeration::DeviceWatcher^, Platform::Object^>(
+ [completionEvent, pendingTasks](Windows::Devices::Enumeration::DeviceWatcher^ sender, Platform::Object^ args)
+ {
+ // Wait for completion of all the tasks we created in our "Added" event handler.
+ Concurrency::when_all(pendingTasks->begin(), pendingTasks->end()).then([completionEvent]()
+ {
+ // This sets the result to "nullptr" if no task was able to produce a device.
+ completionEvent.set(nullptr);
+ });
+ });
+
+ watcher->Start();
+
+ // Wait for enumeration to complete or for a device to be found, whichever comes first.
+ return Concurrency::create_task(completionEvent).then([watcher](T result)
+ {
+ watcher->Stop();
+ return result;
+ });
+ }
+ }
+}
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/cpp/MainPage.xaml b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/cpp/MainPage.xaml
new file mode 100644
index 00000000..5179f520
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/cpp/MainPage.xaml
@@ -0,0 +1,80 @@
+<!--
+//*********************************************************
+//
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the MIT License (MIT).
+// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
+// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
+// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
+//
+//*********************************************************
+-->
+
+<Page
+ x:Class="SDKTemplate.MainPage"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:local="using:SDKTemplate"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ mc:Ignorable="d">
+
+ <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="Auto"/>
+ <RowDefinition Height="*"/>
+ </Grid.RowDefinitions>
+ <SplitView x:Name="Splitter" IsPaneOpen="True" Grid.Row="1" DisplayMode="Inline">
+ <SplitView.Pane>
+ <RelativePanel Margin="10,0,0,0">
+ <TextBlock x:Name="SampleTitle" Text="Sample Title Here" Style="{StaticResource SampleHeaderTextStyle}" TextWrapping="Wrap" Margin="0,10,0,0"/>
+ <ListBox x:Name="ScenarioControl" SelectionChanged="ScenarioControl_SelectionChanged"
+ SelectionMode="Single" HorizontalAlignment="Left" Background="Transparent" BorderThickness="0"
+ VerticalAlignment="Top" RelativePanel.Below="SampleTitle" Margin="0,10,0,0" RelativePanel.Above="FooterPanel">
+ <ListBox.ItemTemplate>
+ <DataTemplate>
+ <TextBlock Text="{Binding Converter={StaticResource ScenarioConverter}}"/>
+ </DataTemplate>
+ </ListBox.ItemTemplate>
+ </ListBox>
+ <StackPanel x:Name="FooterPanel" Orientation="Vertical" RelativePanel.AlignBottomWithPanel="True">
+ <Image Source="Assets/microsoft-sdk.png" AutomationProperties.Name="Microsoft Logo" Stretch="None" HorizontalAlignment="Left" Margin="10,0,0,0"/>
+ <TextBlock x:Name="Copyright" Text="&#xA9; Microsoft Corporation. All rights reserved." Style="{StaticResource CopyrightTextStyle}"
+ RelativePanel.Above="LinksPanel" Margin="10,10,0,0"
+ TextWrapping="Wrap"/>
+ <StackPanel x:Name="LinksPanel" Orientation="Horizontal" Margin="10,10,0,10">
+ <HyperlinkButton Content="Trademarks" Tag="http://go.microsoft.com/fwlink/?LinkID=623755"
+ Click="Footer_Click" FontSize="12" Style="{StaticResource HyperlinkStyle}" />
+ <TextBlock Text="|" Style="{StaticResource SeparatorStyle}" VerticalAlignment="Center" />
+ <HyperlinkButton x:Name="PrivacyLink" Content="Privacy" Tag="http://privacy.microsoft.com" Click="Footer_Click" FontSize="12" Style="{StaticResource HyperlinkStyle}"/>
+ </StackPanel>
+ </StackPanel>
+ </RelativePanel>
+ </SplitView.Pane>
+ <RelativePanel>
+ <Frame x:Name="ScenarioFrame" Margin="0,5,0,0" RelativePanel.AlignTopWithPanel="True" RelativePanel.Above="StatusPanel" RelativePanel.AlignRightWithPanel="True" RelativePanel.AlignLeftWithPanel="True"/>
+ <StackPanel x:Name="StatusPanel" Orientation="Vertical" RelativePanel.AlignBottomWithPanel="True" RelativePanel.AlignRightWithPanel="True" RelativePanel.AlignLeftWithPanel="True">
+ <TextBlock x:Name="StatusLabel" Margin="0,0,0,10" TextWrapping="Wrap" Text="Status:" />
+ <Border x:Name="StatusBorder" Margin="0,0,0,0" Visibility="Visible" >
+ <ScrollViewer VerticalScrollMode="Auto" VerticalScrollBarVisibility="Auto" MaxHeight="200">
+ <TextBlock x:Name="StatusBlock" FontWeight="Bold"
+ MaxWidth="{Binding ElementName=Splitter, Path=ActualWidth}" Margin="10,10,10,20" TextWrapping="Wrap" />
+ </ScrollViewer>
+ </Border>
+ </StackPanel>
+ </RelativePanel>
+ </SplitView>
+ <StackPanel x:Name="HeaderPanel" Orientation="Horizontal">
+ <Border Background="{ThemeResource SystemControlBackgroundChromeMediumBrush}" Grid.Row="0">
+ <ToggleButton Style="{StaticResource SymbolButton}" Click="Button_Click" VerticalAlignment="Top" Foreground="{ThemeResource ApplicationForegroundThemeBrush}">
+ <ToggleButton.Content>
+ <FontIcon x:Name="Hamburger" FontFamily="Segoe MDL2 Assets" Glyph="&#xE700;" Margin="0,10,0,0"/>
+ </ToggleButton.Content>
+ </ToggleButton>
+ </Border>
+ <Image x:Name="WindowsLogo" Stretch="None" Source="Assets/windows-sdk.png" Margin="0,15,0,0" />
+ <TextBlock x:Name="Header" Text="Universal Windows Platform sample" Style="{StaticResource TagLineTextStyle}" Margin="0,15,0,0" />
+ </StackPanel>
+ </Grid>
+</Page>
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/cpp/MainPage.xaml.cpp b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/cpp/MainPage.xaml.cpp
new file mode 100644
index 00000000..24c12f68
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/cpp/MainPage.xaml.cpp
@@ -0,0 +1,154 @@
+//*********************************************************
+//
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the MIT License (MIT).
+// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
+// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
+// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
+//
+//*********************************************************
+
+#include "pch.h"
+#include "MainPage.xaml.h"
+
+using namespace SDKTemplate;
+using namespace Platform;
+using namespace Windows::Foundation;
+using namespace Windows::Foundation::Collections;
+using namespace Windows::UI::Core;
+using namespace Windows::UI::Xaml;
+using namespace Windows::UI::Xaml::Controls;
+using namespace Windows::UI::Xaml::Controls::Primitives;
+using namespace Windows::UI::Xaml::Data;
+using namespace Windows::UI::Xaml::Input;
+using namespace Windows::UI::Xaml::Media;
+using namespace Windows::UI::Xaml::Navigation;
+using namespace Windows::UI::Xaml::Interop;
+
+// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409
+
+MainPage^ MainPage::Current = nullptr;
+
+MainPage::MainPage()
+{
+ InitializeComponent();
+ SampleTitle->Text = FEATURE_NAME;
+
+ // This is a static public property that allows downstream pages to get a handle to the MainPage instance
+ // in order to call methods that are in this class.
+ MainPage::Current = this;
+}
+
+void MainPage::OnNavigatedTo(NavigationEventArgs^ e)
+{
+ // Populate the ListBox with the scenarios as defined in SampleConfiguration.cpp.
+ auto itemCollection = ref new Platform::Collections::Vector<Object^>();
+ int i = 1;
+ for (auto const& s : MainPage::Current->scenarios)
+ {
+ // Create a textBlock to hold the content and apply the ListItemTextStyle from Styles.xaml
+ TextBlock^ textBlock = ref new TextBlock();
+ ListBoxItem^ item = ref new ListBoxItem();
+ auto style = App::Current->Resources->Lookup("ListItemTextStyle");
+
+ textBlock->Text = (i++).ToString() + ") " + s.Title;
+ textBlock->Style = safe_cast<Windows::UI::Xaml::Style ^>(style);
+
+ item->Name = s.ClassName;
+ item->Content = textBlock;
+ itemCollection->Append(item);
+ }
+
+ // Set the newly created itemCollection as the ListBox ItemSource.
+ ScenarioControl->ItemsSource = itemCollection;
+ int startingScenarioIndex;
+
+ if (Window::Current->Bounds.Width < 640)
+ {
+ startingScenarioIndex = -1;
+ }
+ else
+ {
+ startingScenarioIndex = 0;
+ }
+
+ ScenarioControl->SelectedIndex = startingScenarioIndex;
+ ScenarioControl->ScrollIntoView(ScenarioControl->SelectedItem);
+}
+
+
+void MainPage::ScenarioControl_SelectionChanged(Object^ sender, SelectionChangedEventArgs^ e)
+{
+ ListBox^ scenarioListBox = safe_cast<ListBox^>(sender); //as ListBox;
+ ListBoxItem^ item = dynamic_cast<ListBoxItem^>(scenarioListBox->SelectedItem);
+ if (item != nullptr)
+ {
+ // Clear the status block when changing scenarios
+ NotifyUser("", NotifyType::StatusMessage);
+
+ // Navigate to the selected scenario.
+ TypeName scenarioType = { item->Name, TypeKind::Custom };
+ ScenarioFrame->Navigate(scenarioType, this);
+
+ if (Window::Current->Bounds.Width < 640)
+ {
+ Splitter->IsPaneOpen = false;
+ }
+ }
+}
+
+void MainPage::NotifyUser(String^ strMessage, NotifyType type)
+{
+ if (Dispatcher->HasThreadAccess)
+ {
+ UpdateStatus(strMessage, type);
+ }
+ else
+ {
+ Dispatcher->RunAsync(CoreDispatcherPriority::Normal, ref new DispatchedHandler([strMessage, type, this]()
+ {
+ UpdateStatus(strMessage, type);
+ }));
+ }
+}
+
+void MainPage::UpdateStatus(String^ strMessage, NotifyType type)
+{
+ switch (type)
+ {
+ case NotifyType::StatusMessage:
+ StatusBorder->Background = ref new SolidColorBrush(Windows::UI::Colors::Green);
+ break;
+ case NotifyType::ErrorMessage:
+ StatusBorder->Background = ref new SolidColorBrush(Windows::UI::Colors::Red);
+ break;
+ default:
+ break;
+ }
+
+ StatusBlock->Text = strMessage;
+
+ // Collapse the StatusBlock if it has no text to conserve real estate.
+ if (StatusBlock->Text != "")
+ {
+ StatusBorder->Visibility = Windows::UI::Xaml::Visibility::Visible;
+ StatusPanel->Visibility = Windows::UI::Xaml::Visibility::Visible;
+ }
+ else
+ {
+ StatusBorder->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
+ StatusPanel->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
+ }
+}
+
+void MainPage::Footer_Click(Object^ sender, RoutedEventArgs^ e)
+{
+ auto uri = ref new Uri((String^)((HyperlinkButton^)sender)->Tag);
+ Windows::System::Launcher::LaunchUriAsync(uri);
+}
+
+void MainPage::Button_Click(Object^ sender, RoutedEventArgs^ e)
+{
+ Splitter->IsPaneOpen = !Splitter->IsPaneOpen;
+} \ No newline at end of file
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/cpp/MainPage.xaml.h b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/cpp/MainPage.xaml.h
new file mode 100644
index 00000000..e87e24f0
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/cpp/MainPage.xaml.h
@@ -0,0 +1,46 @@
+//*********************************************************
+//
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the MIT License (MIT).
+// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
+// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
+// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
+//
+//*********************************************************
+
+#pragma once
+
+#include "MainPage.g.h"
+#include "SampleConfiguration.h"
+
+namespace SDKTemplate
+{
+ public enum class NotifyType
+ {
+ StatusMessage,
+ ErrorMessage
+ };
+
+ /// <summary>
+ /// An empty page that can be used on its own or navigated to within a Frame.
+ /// </summary>
+ public ref class MainPage sealed
+ {
+ public:
+ MainPage();
+
+ protected:
+ virtual void OnNavigatedTo(Windows::UI::Xaml::Navigation::NavigationEventArgs^ e) override;
+
+ private:
+ void ScenarioControl_SelectionChanged(Platform::Object^ sender, Windows::UI::Xaml::Controls::SelectionChangedEventArgs^ e);
+ void Footer_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);
+ void Button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);
+ void UpdateStatus(Platform::String^ strMessage, NotifyType type);
+
+ internal:
+ static MainPage^ Current;
+ void NotifyUser(Platform::String^ strMessage, NotifyType type);
+ };
+}
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/Square310x310Logo.png b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/Square310x310Logo.png
new file mode 100644
index 00000000..c96f294a
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/Square310x310Logo.png
Binary files differ
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/microsoft-sdk.png b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/microsoft-sdk.png
new file mode 100644
index 00000000..380a0102
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/microsoft-sdk.png
Binary files differ
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/placeholder-sdk.png b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/placeholder-sdk.png
new file mode 100644
index 00000000..01b3138c
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/placeholder-sdk.png
Binary files differ
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/placeholder.png b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/placeholder.png
new file mode 100644
index 00000000..e2d83818
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/placeholder.png
Binary files differ
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/smalltile-sdk.png b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/smalltile-sdk.png
new file mode 100644
index 00000000..ba9a0cde
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/smalltile-sdk.png
Binary files differ
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/splash-sdk.png b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/splash-sdk.png
new file mode 100644
index 00000000..e00df02c
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/splash-sdk.png
Binary files differ
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/squaretile-sdk.png b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/squaretile-sdk.png
new file mode 100644
index 00000000..f97c34a9
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/squaretile-sdk.png
Binary files differ
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/storelogo-sdk.png b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/storelogo-sdk.png
new file mode 100644
index 00000000..5c397dea
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/storelogo-sdk.png
Binary files differ
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/tile-sdk.png b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/tile-sdk.png
new file mode 100644
index 00000000..f72683f2
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/tile-sdk.png
Binary files differ
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/windows-sdk.png b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/windows-sdk.png
new file mode 100644
index 00000000..67268021
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/media/windows-sdk.png
Binary files differ
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/xaml/App.xaml b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/xaml/App.xaml
new file mode 100644
index 00000000..63e80b83
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/xaml/App.xaml
@@ -0,0 +1,34 @@
+<!--
+//*********************************************************
+//
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the MIT License (MIT).
+// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
+// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
+// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
+//
+//*********************************************************
+-->
+<Application
+ x:Class="SDKTemplate.App"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:local="using:SDKTemplate"
+ RequestedTheme="Dark">
+
+ <Application.Resources>
+ <!-- Application-specific resources -->
+ <ResourceDictionary>
+ <ResourceDictionary.MergedDictionaries>
+
+ <!--
+ Styles that define common aspects of the platform look and feel
+ Required by Visual Studio project and item templates
+ -->
+ <ResourceDictionary Source="/Styles/Styles.xaml"/>
+ </ResourceDictionary.MergedDictionaries>
+ </ResourceDictionary>
+ </Application.Resources>
+
+</Application>
diff --git a/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/xaml/Styles.xaml b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/xaml/Styles.xaml
new file mode 100644
index 00000000..50602ae5
--- /dev/null
+++ b/general/WinHEC 2017 Lab/Toaster Support App/SharedContent/xaml/Styles.xaml
@@ -0,0 +1,536 @@
+<!--
+//*********************************************************
+//
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the MIT License (MIT).
+// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
+// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
+// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
+//
+//*********************************************************
+-->
+<ResourceDictionary
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:local="using:SDKTemplate">
+
+ <Style x:Key="SymbolButton" TargetType="ToggleButton">
+ <Setter Property="FontSize" Value="16" />
+ <Setter Property="FontFamily" Value="{StaticResource SymbolThemeFontFamily}" />
+ <Setter Property="MinHeight" Value="48" />
+ <Setter Property="MinWidth" Value="48" />
+ <Setter Property="Margin" Value="0,4,0,0" />
+ <Setter Property="Padding" Value="0" />
+ <Setter Property="HorizontalAlignment" Value="Left" />
+ <Setter Property="VerticalAlignment" Value="Top" />
+ <Setter Property="HorizontalContentAlignment" Value="Center" />
+ <Setter Property="VerticalContentAlignment" Value="Center" />
+ <Setter Property="Background" Value="Transparent" />
+ <Setter Property="Foreground" Value="{ThemeResource SystemControlForegroundBaseHighBrush}" />
+ <Setter Property="Content" Value="&#xE700;" />
+ <Setter Property="AutomationProperties.Name" Value="Menu" />
+ <Setter Property="UseSystemFocusVisuals" Value="True" />
+ <Setter Property="Template">
+ <Setter.Value>
+ <ControlTemplate TargetType="ToggleButton">
+ <Grid x:Name="LayoutRoot"
+ Background="{TemplateBinding Background}">
+ <VisualStateManager.VisualStateGroups>
+ <VisualStateGroup x:Name="CommonStates">
+ <VisualState x:Name="Normal" />
+ <VisualState x:Name="PointerOver">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="LayoutRoot" Storyboard.TargetProperty="(Grid.Background)">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightListLowBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter" Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightAltBaseHighBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="Pressed">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="LayoutRoot" Storyboard.TargetProperty="(Grid.Background)">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightListMediumBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter" Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightAltBaseHighBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="Disabled">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter" Storyboard.TargetProperty="(TextBlock.Foreground)">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlDisabledBaseLowBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="Checked"/>
+ <VisualState x:Name="CheckedPointerOver">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="LayoutRoot" Storyboard.TargetProperty="(Grid.Background)">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightListLowBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter" Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightAltBaseHighBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="CheckedPressed">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="LayoutRoot" Storyboard.TargetProperty="(Grid.Background)">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightListMediumBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter" Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightAltBaseHighBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="CheckedDisabled">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter" Storyboard.TargetProperty="(TextBlock.Foreground)">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlDisabledBaseLowBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ </VisualStateGroup>
+ </VisualStateManager.VisualStateGroups>
+ <ContentPresenter x:Name="ContentPresenter"
+ Content="{TemplateBinding Content}"
+ Margin="{TemplateBinding Padding}"
+ HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
+ VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
+ AutomationProperties.AccessibilityView="Raw" />
+ </Grid>
+ </ControlTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style>
+
+ <Style x:Key="BasicTextStyle" TargetType="TextBlock" BasedOn="{StaticResource BodyTextBlockStyle}">
+ <Setter Property="Margin" Value="0,0,0,12"/>
+ </Style>
+
+ <Style x:Key="TagLineTextStyle" TargetType="TextBlock" BasedOn="{StaticResource BodyTextBlockStyle}">
+ </Style>
+
+ <Style x:Key="SampleHeaderTextStyle" TargetType="TextBlock" BasedOn="{StaticResource TitleTextBlockStyle}">
+ <Setter Property="FontSize" Value="28"/>
+ </Style>
+
+ <Style x:Key="ListItemTextStyle" TargetType="TextBlock" BasedOn="{StaticResource SubtitleTextBlockStyle}">
+ <Setter Property="FontSize" Value="18"/>
+ <Setter Property="Margin" Value="10,0,0,0"/>
+ <Setter Property="Foreground" Value="{StaticResource SystemControlForegroundBaseHighBrush}"/>
+ </Style>
+
+ <Style x:Key="CopyrightTextStyle" TargetType="TextBlock" BasedOn="{StaticResource BaseTextBlockStyle}">
+ <Setter Property="FontWeight" Value="Normal"/>
+ </Style>
+
+ <Style x:Key="ScenarioHeaderTextStyle" TargetType="TextBlock" BasedOn="{StaticResource TitleTextBlockStyle}">
+ </Style>
+
+ <Style x:Key="ScenarioDescriptionTextStyle" TargetType="TextBlock" BasedOn="{StaticResource BodyTextBlockStyle}">
+ </Style>
+
+ <Style x:Key="BaseMessageStyle" TargetType="TextBlock" BasedOn="{StaticResource BodyTextBlockStyle}">
+ <Setter Property="Margin" Value="0,0,0,5"/>
+ </Style>
+
+ <Style x:Key="SeparatorStyle" TargetType="TextBlock" BasedOn="{StaticResource BaseTextBlockStyle}">
+ <Setter Property="FontSize" Value="9"/>
+ <Setter Property="Foreground" Value="{ThemeResource SystemControlForegroundBaseMediumBrush}"/>
+ </Style>
+
+ <Style x:Key="HyperlinkStyle" TargetType="HyperlinkButton">
+ <Setter Property="Padding" Value="1"/>
+ <Setter Property="Foreground" Value="{ThemeResource SystemControlForegroundBaseMediumBrush}"/>
+ <Setter Property="FontSize" Value="12"/>
+ </Style>
+
+ <Style x:Key="NavMenuItemContainerStyle" TargetType="ListViewItem">
+ <Setter Property="MinWidth" Value="{StaticResource SplitViewCompactPaneThemeLength}"/>
+ <Setter Property="MinHeight" Value="48"/>
+ <Setter Property="Padding" Value="0"/>
+ <Setter Property="UseSystemFocusVisuals" Value="False" />
+ <Setter Property="Template">
+ <Setter.Value>
+ <ControlTemplate TargetType="ListViewItem">
+ <Grid x:Name="ContentBorder"
+ HorizontalAlignment="Stretch"
+ Control.IsTemplateFocusTarget="True"
+ Background="{TemplateBinding Background}"
+ BorderBrush="{TemplateBinding BorderBrush}"
+ BorderThickness="{TemplateBinding BorderThickness}"
+ RenderTransformOrigin="0.5,0.5">
+ <Grid.RenderTransform>
+ <ScaleTransform x:Name="ContentBorderScale" />
+ </Grid.RenderTransform>
+ <VisualStateManager.VisualStateGroups>
+ <VisualStateGroup x:Name="CommonStates">
+ <VisualState x:Name="Normal">
+ <Storyboard>
+ <PointerUpThemeAnimation Storyboard.TargetName="ContentPresenter" />
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="PointerOver">
+ <Storyboard>
+ <DoubleAnimation Storyboard.TargetName="BorderBackground"
+ Storyboard.TargetProperty="Opacity"
+ Duration="0"
+ To="1"/>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BorderBackground" Storyboard.TargetProperty="Fill">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightListLowBrush}" />
+ </ObjectAnimationUsingKeyFrames>
+ <PointerUpThemeAnimation Storyboard.TargetName="ContentPresenter" />
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="Pressed">
+ <Storyboard>
+ <DoubleAnimation Storyboard.TargetName="BorderBackground"
+ Storyboard.TargetProperty="Opacity"
+ Duration="0"
+ To="1"/>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BorderBackground" Storyboard.TargetProperty="Fill">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightListMediumBrush}" />
+ </ObjectAnimationUsingKeyFrames>
+ <PointerDownThemeAnimation TargetName="ContentPresenter" />
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="Selected">
+ <Storyboard>
+ <DoubleAnimation Storyboard.TargetName="BorderBackground"
+ Storyboard.TargetProperty="Opacity"
+ Duration="0"
+ To="1"/>
+ <DoubleAnimation Storyboard.TargetName="SelectedPipe"
+ Storyboard.TargetProperty="Opacity"
+ Duration="0"
+ To="1"/>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BorderBackground" Storyboard.TargetProperty="Fill">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="Transparent" />
+ </ObjectAnimationUsingKeyFrames>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter" Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlForegroundAccentBrush}" />
+ </ObjectAnimationUsingKeyFrames>
+ <PointerUpThemeAnimation Storyboard.TargetName="ContentPresenter" />
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="PointerOverSelected">
+ <Storyboard>
+ <DoubleAnimation Storyboard.TargetName="BorderBackground"
+ Storyboard.TargetProperty="Opacity"
+ Duration="0"
+ To="1"/>
+ <DoubleAnimation Storyboard.TargetName="SelectedPipe"
+ Storyboard.TargetProperty="Opacity"
+ Duration="0"
+ To="1"/>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BorderBackground" Storyboard.TargetProperty="Fill">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightListLowBrush}" />
+ </ObjectAnimationUsingKeyFrames>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter" Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlForegroundAccentBrush}" />
+ </ObjectAnimationUsingKeyFrames>
+ <PointerUpThemeAnimation Storyboard.TargetName="ContentPresenter" />
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="PressedSelected">
+ <Storyboard>
+ <DoubleAnimation Storyboard.TargetName="BorderBackground"
+ Storyboard.TargetProperty="Opacity"
+ Duration="0"
+ To="1"/>
+ <DoubleAnimation Storyboard.TargetName="SelectedPipe"
+ Storyboard.TargetProperty="Opacity"
+ Duration="0"
+ To="1"/>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BorderBackground" Storyboard.TargetProperty="Fill">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightListMediumBrush}" />
+ </ObjectAnimationUsingKeyFrames>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter" Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlForegroundAccentBrush}" />
+ </ObjectAnimationUsingKeyFrames>
+ <PointerDownThemeAnimation TargetName="ContentPresenter" />
+ </Storyboard>
+ </VisualState>
+ </VisualStateGroup>
+ <VisualStateGroup x:Name="DisabledStates">
+ <VisualState x:Name="Enabled"/>
+ <VisualState x:Name="Disabled">
+ <Storyboard>
+ <DoubleAnimation Storyboard.TargetName="ContentBorder"
+ Storyboard.TargetProperty="Opacity"
+ Duration="0"
+ To="{ThemeResource ListViewItemDisabledThemeOpacity}"/>
+ </Storyboard>
+ </VisualState>
+ </VisualStateGroup>
+ <VisualStateGroup x:Name="FocusStates">
+ <VisualState x:Name="Unfocused"/>
+ <VisualState x:Name="Focused">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="FocusBackground" Storyboard.TargetProperty="Fill">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightListLowBrush}" />
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ </VisualStateGroup>
+ </VisualStateManager.VisualStateGroups>
+ <Rectangle x:Name="BorderBackground"
+ IsHitTestVisible="False"
+ Fill="Transparent"
+ Opacity="1"
+ Control.IsTemplateFocusTarget="True" />
+ <Rectangle x:Name="FocusBackground"
+ IsHitTestVisible="False"
+ Fill="Transparent"
+ Opacity="1"
+ Control.IsTemplateFocusTarget="True"/>
+ <Rectangle x:Name="SelectedPipe"
+ Opacity="0"
+ Width="4"
+ Height="24"
+ Fill="{ThemeResource SystemControlForegroundAccentBrush}"
+ VerticalAlignment="Center"
+ HorizontalAlignment="Left"/>
+ <ContentPresenter x:Name="ContentPresenter"
+ ContentTransitions="{TemplateBinding ContentTransitions}"
+ ContentTemplate="{TemplateBinding ContentTemplate}"
+ Content="{TemplateBinding Content}"
+ HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
+ VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
+ Margin="16,0,0,0" />
+ </Grid>
+ </ControlTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style>
+
+ <!-- Default style for Windows.UI.Xaml.Controls.ListBoxItem -->
+ <Style x:Key="ListBoxItemStyle" TargetType="ListBoxItem">
+ <Setter Property="Background" Value="Transparent" />
+ <Setter Property="TabNavigation" Value="Local" />
+ <Setter Property="Padding" Value="8,10" />
+ <Setter Property="HorizontalContentAlignment" Value="Left" />
+ <Setter Property="Template">
+ <Setter.Value>
+ <ControlTemplate TargetType="ListBoxItem">
+ <Border x:Name="LayoutRoot"
+ Background="{TemplateBinding Background}"
+ BorderBrush="{TemplateBinding BorderBrush}"
+ BorderThickness="{TemplateBinding BorderThickness}">
+ <VisualStateManager.VisualStateGroups>
+ <VisualStateGroup x:Name="CommonStates">
+ <VisualState x:Name="Normal" />
+ <VisualState x:Name="PointerOver">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="LayoutRoot"
+ Storyboard.TargetProperty="Background">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ListBoxItemPointerOverBackgroundThemeBrush}" />
+ </ObjectAnimationUsingKeyFrames>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter"
+ Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ListBoxItemPointerOverForegroundThemeBrush}" />
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="Disabled">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="LayoutRoot"
+ Storyboard.TargetProperty="Background">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="Transparent" />
+ </ObjectAnimationUsingKeyFrames>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter"
+ Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ListBoxItemDisabledForegroundThemeBrush}" />
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="Pressed">
+ <Storyboard>
+ <DoubleAnimation Storyboard.TargetName="PressedBackground"
+ Storyboard.TargetProperty="Opacity"
+ To="1"
+ Duration="0" />
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter"
+ Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ListBoxItemPressedForegroundThemeBrush}" />
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ </VisualStateGroup>
+ <VisualStateGroup x:Name="SelectionStates">
+ <VisualState x:Name="Unselected" />
+ <VisualState x:Name="Selected">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="InnerGrid"
+ Storyboard.TargetProperty="Background">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ListBoxItemSelectedBackgroundThemeBrush}" />
+ </ObjectAnimationUsingKeyFrames>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter"
+ Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ListBoxItemSelectedForegroundThemeBrush}" />
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="SelectedUnfocused">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="InnerGrid"
+ Storyboard.TargetProperty="Background">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ListBoxItemSelectedBackgroundThemeBrush}" />
+ </ObjectAnimationUsingKeyFrames>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter"
+ Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ListBoxItemSelectedForegroundThemeBrush}" />
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="SelectedDisabled">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="InnerGrid"
+ Storyboard.TargetProperty="Background">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ListBoxItemSelectedDisabledBackgroundThemeBrush}" />
+ </ObjectAnimationUsingKeyFrames>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter"
+ Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ListBoxItemSelectedDisabledForegroundThemeBrush}" />
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="SelectedPointerOver">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="InnerGrid"
+ Storyboard.TargetProperty="Background">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ListBoxItemSelectedPointerOverBackgroundThemeBrush}" />
+ </ObjectAnimationUsingKeyFrames>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter"
+ Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ListBoxItemSelectedForegroundThemeBrush}" />
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="SelectedPressed">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="InnerGrid"
+ Storyboard.TargetProperty="Background">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ListBoxItemSelectedBackgroundThemeBrush}" />
+ </ObjectAnimationUsingKeyFrames>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter"
+ Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ListBoxItemSelectedForegroundThemeBrush}" />
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ </VisualStateGroup>
+ <VisualStateGroup x:Name="FocusStates">
+ <VisualState x:Name="Focused">
+ <Storyboard>
+ <DoubleAnimation Storyboard.TargetName="FocusVisualWhite"
+ Storyboard.TargetProperty="Opacity"
+ To="1"
+ Duration="0" />
+ <DoubleAnimation Storyboard.TargetName="FocusVisualBlack"
+ Storyboard.TargetProperty="Opacity"
+ To="1"
+ Duration="0" />
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="Unfocused" />
+ <VisualState x:Name="PointerFocused" />
+ </VisualStateGroup>
+ </VisualStateManager.VisualStateGroups>
+ <Grid x:Name="InnerGrid"
+ Background="Transparent">
+ <Rectangle x:Name="PressedBackground"
+ Fill="{ThemeResource ListBoxItemPressedBackgroundThemeBrush}"
+ Opacity="0" />
+ <ContentPresenter x:Name="ContentPresenter"
+ Content="{TemplateBinding Content}"
+ ContentTransitions="{TemplateBinding ContentTransitions}"
+ ContentTemplate="{TemplateBinding ContentTemplate}"
+ HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
+ VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
+ Margin="{TemplateBinding Padding}" />
+ <Rectangle x:Name="FocusVisualWhite"
+ Stroke="{ThemeResource FocusVisualWhiteStrokeThemeBrush}"
+ StrokeEndLineCap="Square"
+ StrokeDashArray="1,1"
+ Opacity="0"
+ StrokeDashOffset=".5" />
+ <Rectangle x:Name="FocusVisualBlack"
+ Stroke="{ThemeResource FocusVisualBlackStrokeThemeBrush}"
+ StrokeEndLineCap="Square"
+ StrokeDashArray="1,1"
+ Opacity="0"
+ StrokeDashOffset="1.5" />
+ </Grid>
+ </Border>
+ </ControlTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style>
+
+ <Style x:Key="ScenarioListBoxStyle" TargetType="ListBox">
+ <Setter Property="Foreground" Value="{ThemeResource ListBoxForegroundThemeBrush}"/>
+ <Setter Property="Background" Value="Transparent"/>
+ <Setter Property="BorderBrush" Value="Transparent"/>
+ <Setter Property="BorderThickness" Value="{ThemeResource ListBoxBorderThemeThickness}"/>
+ <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled"/>
+ <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
+ <Setter Property="ScrollViewer.HorizontalScrollMode" Value="Disabled"/>
+ <Setter Property="ScrollViewer.IsHorizontalRailEnabled" Value="True"/>
+ <Setter Property="ScrollViewer.VerticalScrollMode" Value="Enabled"/>
+ <Setter Property="ScrollViewer.IsVerticalRailEnabled" Value="True"/>
+ <Setter Property="ScrollViewer.ZoomMode" Value="Disabled"/>
+ <Setter Property="ScrollViewer.IsDeferredScrollingEnabled" Value="False"/>
+ <Setter Property="ScrollViewer.BringIntoViewOnFocusChange" Value="True"/>
+ <Setter Property="IsTabStop" Value="False"/>
+ <Setter Property="TabNavigation" Value="Once"/>
+ <Setter Property="FontFamily" Value="{ThemeResource ContentControlThemeFontFamily}"/>
+ <Setter Property="FontSize" Value="{ThemeResource ControlContentThemeFontSize}"/>
+ <Setter Property="ItemsPanel">
+ <Setter.Value>
+ <ItemsPanelTemplate>
+ <VirtualizingStackPanel Background="Transparent"/>
+ </ItemsPanelTemplate>
+ </Setter.Value>
+ </Setter>
+ <Setter Property="Template">
+ <Setter.Value>
+ <ControlTemplate TargetType="ListBox">
+ <Border x:Name="LayoutRoot" BorderBrush="Transparent" BorderThickness="{TemplateBinding BorderThickness}" Background="Transparent">
+ <VisualStateManager.VisualStateGroups>
+ <VisualStateGroup x:Name="CommonStates">
+ <VisualState x:Name="Normal"/>
+ <VisualState x:Name="Disabled">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="LayoutRoot">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="Transparent"/>
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ </VisualStateGroup>
+ <VisualStateGroup x:Name="FocusStates">
+ <VisualState x:Name="Focused">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="LayoutRoot">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="Transparent"/>
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="Unfocused"/>
+ </VisualStateGroup>
+ </VisualStateManager.VisualStateGroups>
+ <ScrollViewer x:Name="ScrollViewer" AutomationProperties.AccessibilityView="Raw" BringIntoViewOnFocusChange="{TemplateBinding ScrollViewer.BringIntoViewOnFocusChange}" HorizontalScrollMode="{TemplateBinding ScrollViewer.HorizontalScrollMode}" HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}" IsHorizontalRailEnabled="{TemplateBinding ScrollViewer.IsHorizontalRailEnabled}" IsVerticalRailEnabled="{TemplateBinding ScrollViewer.IsVerticalRailEnabled}" IsDeferredScrollingEnabled="{TemplateBinding ScrollViewer.IsDeferredScrollingEnabled}" Padding="{TemplateBinding Padding}" TabNavigation="{TemplateBinding TabNavigation}" VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}" VerticalScrollMode="{TemplateBinding ScrollViewer.VerticalScrollMode}" ZoomMode="{TemplateBinding ScrollViewer.ZoomMode}">
+ <ItemsPresenter/>
+ </ScrollViewer>
+ </Border>
+ </ControlTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style>
+
+</ResourceDictionary>
diff --git a/general/WinHEC 2017 Lab/WinHEC 2017 Lab.docx b/general/WinHEC 2017 Lab/WinHEC 2017 Lab.docx
new file mode 100644
index 00000000..62d0454f
--- /dev/null
+++ b/general/WinHEC 2017 Lab/WinHEC 2017 Lab.docx
Binary files differ
diff --git a/general/WinHEC 2017 Lab/WinHEC 2017 Lab.zip b/general/WinHEC 2017 Lab/WinHEC 2017 Lab.zip
new file mode 100644
index 00000000..b2fb8ae2
--- /dev/null
+++ b/general/WinHEC 2017 Lab/WinHEC 2017 Lab.zip
Binary files differ