summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--network/netadaptercx/netvadapter/README.md113
-rw-r--r--network/netadaptercx/netvadapter/build.cmd25
-rw-r--r--network/netadaptercx/netvadapter/drivercode/device.cpp126
-rw-r--r--network/netadaptercx/netvadapter/drivercode/device.h50
-rw-r--r--network/netadaptercx/netvadapter/drivercode/driver.cpp98
-rw-r--r--network/netadaptercx/netvadapter/drivercode/memorymanagement.cpp89
-rw-r--r--network/netadaptercx/netvadapter/drivercode/pch.hpp14
-rw-r--r--network/netadaptercx/netvadapter/drivercode/power.cpp73
-rw-r--r--network/netadaptercx/netvadapter/drivercode/power.h10
-rw-r--r--network/netadaptercx/netvadapter/km/netvadapter.infbin0 -> 21214 bytes
-rw-r--r--network/netadaptercx/netvadapter/km/netvadapterkm.vcxproj217
-rw-r--r--network/netadaptercx/netvadapter/km/netvadapterkm.vcxproj.filters51
-rw-r--r--network/netadaptercx/netvadapter/netvadapter.sln82
-rw-r--r--network/netadaptercx/netvadapter/um/netvadapterum.infbin0 -> 24594 bytes
-rw-r--r--network/netadaptercx/netvadapter/um/netvadapterum.vcxproj197
-rw-r--r--network/netadaptercx/netvadapter/um/netvadapterum.vcxproj.filters51
16 files changed, 1196 insertions, 0 deletions
diff --git a/network/netadaptercx/netvadapter/README.md b/network/netadaptercx/netvadapter/README.md
new file mode 100644
index 00000000..894f5e40
--- /dev/null
+++ b/network/netadaptercx/netvadapter/README.md
@@ -0,0 +1,113 @@
+---
+page_type: sample
+description: "A virtual NIC (NetAdapterCx) miniport driver built on top of netvadapterlibrary, in both KMDF and UMDF flavors."
+languages:
+- cpp
+products:
+- windows
+- windows-wdk
+---
+
+# netvadapter — Virtual NIC Sample
+
+`netvadapter` is a **virtual Ethernet NIC** driver that uses **NetAdapterCx** for its data
+path. It links against the shared **netvadapterlibrary** static library (the same library used
+by the WIFICX sample) and ships in both **KMDF** and **UMDF** flavors.
+
+Two `netvadapter` instances can be paired together through the library's **Emulated Network
+Link (ENL)**: packets sent on one adapter are delivered to the other and vice‑versa, so you can
+run connectivity tests (ping, throughput) entirely in software with no physical hardware.
+
+---
+
+## Layout
+
+| Path | Description |
+| --- | --- |
+| `netvadapter.sln` | Solution containing both drivers + the library project references. |
+| `build.cmd` | Build wrapper (see **Building** — pins UMDF to 2.33). |
+| `km\netvadapterkm.vcxproj` | KMDF driver → `netvadapter.sys` (INF: `km\netvadapter.inf`). |
+| `um\netvadapterum.vcxproj` | UMDF driver → `netvadapterum.dll` (INF: `um\netvadapterum.inf`). |
+| `drivercode\` | Shared driver source (see below). |
+
+## Building
+
+The UMDF driver targets **UMDF 2.33** (to match `netvadapterum.inf`'s
+`UmdfLibraryVersion = 2.33.0`), while the shared `netvadapterlibrary` is checked in at **UMDF
+2.35** (so the WIFICX sample is unaffected). Because the WDF version must match within a single
+binary, **build through `build.cmd`**, which forces the library and driver to 2.33 for this
+solution only:
+
+```cmd
+build.cmd :: Debug x64 (defaults)
+build.cmd Release x64
+```
+
+> A plain `msbuild netvadapter.sln` or a Visual Studio IDE build will fail to link with an
+> unresolved `WdfFunctions_02035` symbol, because it does not apply the 2.33 override.
+
+### Signing the package (test signing)
+
+The build signs the binaries but does **not** produce a catalog. To create and test‑sign the
+catalogs (required to install while in test‑signing mode):
+
+```cmd
+:: From an EWDK environment, for each package folder under x64\<Config>\:
+Inf2Cat /driver:.\netvadapterkm /os:10_X64,Server10_X64
+Inf2Cat /driver:.\netvadapterum /os:10_X64,Server10_X64
+
+signtool sign /fd SHA256 /sha1 <WDKTestCertThumbprint> /tr http://timestamp.digicert.com /td SHA256 .\netvadapterkm\netvadapter.cat
+signtool sign /fd SHA256 /sha1 <WDKTestCertThumbprint> /tr http://timestamp.digicert.com /td SHA256 .\netvadapterum\netvadapterum.cat
+```
+
+---
+
+## Installing
+
+Enable test signing once (elevated, then reboot), and install the test certificate into the
+**Root** and **TrustedPublisher** stores on the target machine. Then install the driver with
+`devcon`:
+
+```cmd
+.\devcon.exe install .\netvadapterum.inf root\netvadapterum
+```
+
+If the command fails, inspect the device‑install log at:
+
+```
+C:\Windows\INF\setupapi.dev.log
+```
+
+### Pairing two adapters
+
+A working link requires **two** `netvadapter` instances. Create both by running the install
+command **twice**:
+
+```cmd
+.\devcon.exe install .\netvadapterum.inf root\netvadapterum
+.\devcon.exe install .\netvadapterum.inf root\netvadapterum
+```
+
+Then set the **`MACLastByte`** advanced keyword to 1 and 2 on both adapters via Device Manager → adapter → **Advanced**, or the network adapter
+property pages.
+
+> ⚠️ `MACLastByte` defaults to **0**. If an adapter is left at the default, the device fails
+> to start and shows a **yellow bang** (error) in Device Manager. Assign distinct values such as
+> `1` and `2` for the pair to link correctly.
+
+---
+
+## Managing the driver
+
+List installed `net`‑class drivers (to find the `oemNN.inf` published name):
+
+```cmd
+pnputil /enum-drivers /class net
+```
+
+Remove the driver and prepare for a clean reinstall (substitute the `oemNN.inf` from the command
+above):
+
+```cmd
+pnputil /delete-driver oem2.inf /uninstall /force
+```
diff --git a/network/netadaptercx/netvadapter/build.cmd b/network/netadaptercx/netvadapter/build.cmd
new file mode 100644
index 00000000..3f7c8e5d
--- /dev/null
+++ b/network/netadaptercx/netvadapter/build.cmd
@@ -0,0 +1,25 @@
+@echo off
+REM ============================================================================
+REM Build wrapper for netvadapter.sln
+REM
+REM The netvadapter UM driver targets UMDF 2.33 (matching netvadapterum.inf's
+REM UmdfLibraryVersion = 2.33.0). It links the shared netvadapterlibrary, whose
+REM checked-in project targets UMDF 2.35 (so the wificx sample is unaffected).
+REM
+REM WDF version must match within a single binary, so this script forces the
+REM library + driver to 2.33 *for this solution's build only* via a global
+REM MSBuild property. A plain "msbuild netvadapter.sln" (without these props)
+REM will fail to link with an unresolved WdfFunctions_02035 symbol.
+REM
+REM Usage: build.cmd [Configuration] [Platform] (defaults: Debug x64)
+REM Example: build.cmd Release x64
+REM ============================================================================
+
+setlocal
+set CONFIG=%~1
+set PLAT=%~2
+if "%CONFIG%"=="" set CONFIG=Debug
+if "%PLAT%"=="" set PLAT=x64
+
+msbuild "%~dp0netvadapter.sln" /t:Build /p:Configuration=%CONFIG% /p:Platform=%PLAT% /p:UMDF_VERSION_MINOR=33 /p:UMDF_MINIMUM_VERSION_REQUIRED=33 /m
+endlocal
diff --git a/network/netadaptercx/netvadapter/drivercode/device.cpp b/network/netadaptercx/netvadapter/drivercode/device.cpp
new file mode 100644
index 00000000..6cbad327
--- /dev/null
+++ b/network/netadaptercx/netvadapter/drivercode/device.cpp
@@ -0,0 +1,126 @@
+// Copyright (c) Microsoft Corporation. All rights reserved
+
+#include "pch.hpp"
+
+#include <wil/resource.h>
+
+#include "netvadapter.h"
+#include "device.h"
+#include "trace.h"
+#include "device.tmh"
+#include "power.h"
+
+static
+EVT_NET_ADAPTER_CREATE_TXQUEUE
+ EvtAdapterCreateTxQueue;
+
+static
+EVT_NET_ADAPTER_CREATE_RXQUEUE
+ EvtAdapterCreateRxQueue;
+
+NetvDevice::NetvDevice(
+ WDFDEVICE Handle
+)
+ : m_triage(WdfGetTriageInfo())
+ , m_handle(Handle)
+{
+}
+
+_Use_decl_annotations_
+NTSTATUS
+NetvDevice::Initialize(
+ void
+)
+{
+ using unique_adapterinit = wil::unique_any<NETADAPTER_INIT*,
+ decltype(&::NetAdapterInitFree),
+ ::NetAdapterInitFree>;
+
+ unique_adapterinit adapterInit{NetAdapterInitAllocate(m_handle)};
+ RETURN_NTSTATUS_IF(
+ STATUS_INSUFFICIENT_RESOURCES,
+ ! adapterInit);
+
+ NET_ADAPTER_DATAPATH_CALLBACKS datapathCallbacks;
+ NET_ADAPTER_DATAPATH_CALLBACKS_INIT(
+ &datapathCallbacks,
+ EvtAdapterCreateTxQueue,
+ EvtAdapterCreateRxQueue);
+
+ NetAdapterInitSetDatapathCallbacks(
+ adapterInit.get(),
+ &datapathCallbacks);
+
+ WDF_OBJECT_ATTRIBUTES adapterAttributes;
+ WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&adapterAttributes, NetvAdapter);
+ adapterAttributes.EvtDestroyCallback = [](WDFOBJECT Handle) {
+ NetvAdapterGetContext(static_cast<NETADAPTER>(Handle))->Destroy();
+ };
+
+ NETADAPTER netAdapter;
+ RETURN_IF_NOT_STATUS_SUCCESS(
+ NetAdapterCreate(adapterInit.get(), &adapterAttributes, &netAdapter));
+
+ m_adapter = new (NetvAdapterGetContext(netAdapter)) NetvAdapter(netAdapter, m_handle);
+
+ RETURN_IF_NOT_STATUS_SUCCESS(
+ m_adapter->Initialize());
+
+ RETURN_STATUS_SUCCESS();
+}
+
+NTSTATUS
+NetvDevice::PrepareHardware(
+ WDFCMRESLIST ResourcesRaw,
+ WDFCMRESLIST ResourcesTranslated
+)
+{
+ UNREFERENCED_PARAMETER(ResourcesRaw);
+ UNREFERENCED_PARAMETER(ResourcesTranslated);
+
+ NetvDeviceInitializePowerManagement(this);
+
+ RETURN_IF_NOT_STATUS_SUCCESS(
+ m_adapter->ConfigureDataCapabilities());
+
+ RETURN_IF_NOT_STATUS_SUCCESS(
+ NetAdapterStart(m_adapter->m_handle));
+
+ RETURN_STATUS_SUCCESS();
+}
+
+_Use_decl_annotations_
+NTSTATUS
+EvtDevicePrepareHardware(
+ WDFDEVICE Device,
+ WDFCMRESLIST ResourcesRaw,
+ WDFCMRESLIST ResourcesTranslated
+ )
+{
+ return NetvDeviceGetContext(Device)->PrepareHardware(ResourcesRaw, ResourcesTranslated);
+}
+
+_Use_decl_annotations_
+NTSTATUS
+EvtAdapterCreateTxQueue(
+ NETADAPTER Adapter,
+ NETTXQUEUE_INIT * Init
+)
+{
+ return NetvAdapterGetContext(Adapter)->CreateTxQueue(Init);
+}
+
+_Use_decl_annotations_
+NTSTATUS
+EvtAdapterCreateRxQueue(
+ NETADAPTER Adapter,
+ NETRXQUEUE_INIT * Init
+)
+{
+ return NetvAdapterGetContext(Adapter)->CreateRxQueue(Init);
+}
+
+NetvAdapter* NetvAdapterGetContextFromWDFObject(NETADAPTER netAdapter)
+{
+ return NetvAdapterGetContext(netAdapter);
+}
diff --git a/network/netadaptercx/netvadapter/drivercode/device.h b/network/netadaptercx/netvadapter/drivercode/device.h
new file mode 100644
index 00000000..3b8e5d2d
--- /dev/null
+++ b/network/netadaptercx/netvadapter/drivercode/device.h
@@ -0,0 +1,50 @@
+// Copyright (c) Microsoft Corporation. All rights reserved
+
+#pragma once
+
+#include "netvadapter.h"
+
+class NetvDevice
+{
+
+public:
+
+ //
+ // Do not add variable before WdfTriageInfoPtr.
+ // NetAdapterCx carving code requires the first field of
+ // WDF context to be a pointer to WDF_TRIAGE_INFO.
+ //
+ void *
+ m_triage = nullptr;
+
+ NetvDevice(
+ WDFDEVICE Handle
+ );
+
+ NTSTATUS
+ Initialize(
+ void
+ );
+
+ NTSTATUS
+ PrepareHardware(
+ WDFCMRESLIST ResourcesRaw,
+ WDFCMRESLIST ResourcesTranslated
+ );
+
+public: // private:
+
+ WDFDEVICE
+ m_handle = WDF_NO_HANDLE;
+
+ NetvAdapter *
+ m_adapter = nullptr;
+
+};
+static_assert(FIELD_OFFSET(NetvDevice, m_triage) == 0u);
+
+WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(NetvDevice, NetvDeviceGetContext);
+WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(NetvAdapter, NetvAdapterGetContext);
+
+EVT_WDF_DEVICE_PREPARE_HARDWARE
+ EvtDevicePrepareHardware;
diff --git a/network/netadaptercx/netvadapter/drivercode/driver.cpp b/network/netadaptercx/netvadapter/drivercode/driver.cpp
new file mode 100644
index 00000000..393292c1
--- /dev/null
+++ b/network/netadaptercx/netvadapter/drivercode/driver.cpp
@@ -0,0 +1,98 @@
+// Copyright (c) Microsoft Corporation. All rights reserved
+
+#include "pch.hpp"
+
+#include <wil/resource.h>
+
+#include "netvadapter.h"
+#include "trace.h"
+#include "driver.tmh"
+#include "device.h"
+#include "power.h"
+
+GLOBAL_CONTEXT NetvGlobalContext;
+
+EXTERN_C
+DRIVER_INITIALIZE
+ DriverEntry;
+
+EVT_WDF_DRIVER_DEVICE_ADD EvtDriverDeviceAdd;
+EVT_WDF_DRIVER_UNLOAD EvtDriverUnload;
+
+_Use_decl_annotations_
+NTSTATUS
+DriverEntry(
+ PDRIVER_OBJECT DriverObject,
+ PUNICODE_STRING RegistryPath
+ )
+{
+ WPP_INIT_TRACING(DriverObject, RegistryPath);
+
+ WDF_DRIVER_CONFIG config;
+ WDF_DRIVER_CONFIG_INIT(&config, EvtDriverDeviceAdd);
+ config.EvtDriverUnload = EvtDriverUnload;
+
+ NTSTATUS status = WdfDriverCreate(DriverObject,
+ RegistryPath,
+ WDF_NO_OBJECT_ATTRIBUTES,
+ &config,
+ NULL);
+
+ if (!NT_SUCCESS(status))
+ {
+ LogError(FLAG_DRIVER, "%!STATUS! WdfDriverCreate", status);
+ WPP_CLEANUP(DriverObject);
+
+ return status;
+ }
+
+ RETURN_STATUS_SUCCESS();
+}
+
+_Use_decl_annotations_
+NTSTATUS
+EvtDriverDeviceAdd(
+ WDFDRIVER Driver,
+ PWDFDEVICE_INIT DeviceInit
+ )
+{
+ UNREFERENCED_PARAMETER(Driver);
+
+ RETURN_IF_NOT_STATUS_SUCCESS(
+ NetDeviceInitConfig(DeviceInit));
+
+ WDF_PNPPOWER_EVENT_CALLBACKS pnpPowerCallbacks;
+ WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);
+ pnpPowerCallbacks.EvtDevicePrepareHardware = EvtDevicePrepareHardware;
+ WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpPowerCallbacks);
+
+ WDF_POWER_POLICY_EVENT_CALLBACKS powerPolicyCallbacks;
+ WDF_POWER_POLICY_EVENT_CALLBACKS_INIT(&powerPolicyCallbacks);
+ powerPolicyCallbacks.EvtDeviceArmWakeFromS0 = EvtDeviceArmWakeFromS0;
+ powerPolicyCallbacks.EvtDeviceDisarmWakeFromS0 = EvtDeviceDisarmWakeFromS0;
+ WdfDeviceInitSetPowerPolicyEventCallbacks(DeviceInit, &powerPolicyCallbacks);
+
+ WDF_OBJECT_ATTRIBUTES deviceAttributes;
+ WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&deviceAttributes, NetvDevice);
+
+ WDFDEVICE wdfDevice;
+ RETURN_IF_NOT_STATUS_SUCCESS(
+ WdfDeviceCreate(&DeviceInit, &deviceAttributes, &wdfDevice));
+
+ auto device = new (NetvDeviceGetContext(wdfDevice)) NetvDevice(wdfDevice);
+
+ RETURN_IF_NOT_STATUS_SUCCESS(
+ device->Initialize());
+
+ RETURN_STATUS_SUCCESS();
+}
+
+_Use_decl_annotations_
+VOID
+EvtDriverUnload(
+ WDFDRIVER Driver
+)
+{
+ UNREFERENCED_PARAMETER(Driver);
+ WPP_CLEANUP(WdfDriverWdmGetDriverObject(Driver));
+}
diff --git a/network/netadaptercx/netvadapter/drivercode/memorymanagement.cpp b/network/netadaptercx/netvadapter/drivercode/memorymanagement.cpp
new file mode 100644
index 00000000..29a2006a
--- /dev/null
+++ b/network/netadaptercx/netvadapter/drivercode/memorymanagement.cpp
@@ -0,0 +1,89 @@
+// Copyright (c) Microsoft Corporation. All rights reserved
+//
+// Global operator new / delete for the driver.
+//
+// The shared netvadapterlibrary routes its allocations through the global
+// operator new (see memory.cpp in the library, which provides the nothrow
+// variant that forwards to operator new(size_t)). The client driver is
+// responsible for providing the backing implementation. We use WDF managed
+// memory so that the same implementation works for both KMDF and UMDF, the
+// same approach used by the WIFICX sample.
+
+#include "pch.hpp"
+
+#define NETV_POOL_TAG 'vteN'
+
+struct NETV_MEMORY_HEADER
+{
+ size_t HeaderSize;
+ WDFMEMORY WdfMemoryHandle;
+};
+
+static void* AllocateBuffer(size_t Size)
+{
+ const size_t totalSize = Size + sizeof(NETV_MEMORY_HEADER);
+
+ WDF_OBJECT_ATTRIBUTES attributes;
+ WDF_OBJECT_ATTRIBUTES_INIT(&attributes);
+
+ WDFMEMORY wdfMemory = WDF_NO_HANDLE;
+ void* buffer = nullptr;
+
+ if (!NT_SUCCESS(WdfMemoryCreate(&attributes, NonPagedPoolNx, NETV_POOL_TAG, totalSize, &wdfMemory, &buffer)))
+ {
+ return nullptr;
+ }
+
+ RtlZeroMemory(buffer, totalSize);
+
+ auto header = static_cast<NETV_MEMORY_HEADER*>(buffer);
+ header->HeaderSize = sizeof(NETV_MEMORY_HEADER);
+ header->WdfMemoryHandle = wdfMemory;
+
+ return reinterpret_cast<void*>(reinterpret_cast<ULONG_PTR>(buffer) + sizeof(NETV_MEMORY_HEADER));
+}
+
+static void FreeBuffer(void* Buffer)
+{
+ if (Buffer == nullptr)
+ {
+ return;
+ }
+
+ auto header = reinterpret_cast<NETV_MEMORY_HEADER*>(
+ reinterpret_cast<ULONG_PTR>(Buffer) - sizeof(NETV_MEMORY_HEADER));
+
+ NT_ASSERT(header->HeaderSize == sizeof(NETV_MEMORY_HEADER));
+
+ WdfObjectDelete(header->WdfMemoryHandle);
+}
+
+void* __cdecl operator new(size_t Size)
+{
+ return AllocateBuffer(Size);
+}
+
+void* __cdecl operator new[](size_t Size)
+{
+ return AllocateBuffer(Size);
+}
+
+void __cdecl operator delete(void* Buffer) noexcept
+{
+ FreeBuffer(Buffer);
+}
+
+void __cdecl operator delete[](void* Buffer) noexcept
+{
+ FreeBuffer(Buffer);
+}
+
+void __cdecl operator delete(void* Buffer, size_t) noexcept
+{
+ FreeBuffer(Buffer);
+}
+
+void __cdecl operator delete[](void* Buffer, size_t) noexcept
+{
+ FreeBuffer(Buffer);
+}
diff --git a/network/netadaptercx/netvadapter/drivercode/pch.hpp b/network/netadaptercx/netvadapter/drivercode/pch.hpp
new file mode 100644
index 00000000..b0e017ef
--- /dev/null
+++ b/network/netadaptercx/netvadapter/drivercode/pch.hpp
@@ -0,0 +1,14 @@
+// Copyright (c) Microsoft Corporation. All rights reserved
+#pragma once
+
+#include <initguid.h>
+
+#ifdef _KERNEL_MODE
+#include <ntddk.h>
+#else
+#include <windows.h>
+#include <new>
+#endif
+
+#include <wdf.h>
+#include <netadaptercx.h>
diff --git a/network/netadaptercx/netvadapter/drivercode/power.cpp b/network/netadaptercx/netvadapter/drivercode/power.cpp
new file mode 100644
index 00000000..68b057ff
--- /dev/null
+++ b/network/netadaptercx/netvadapter/drivercode/power.cpp
@@ -0,0 +1,73 @@
+// Copyright (c) Microsoft Corporation. All rights reserved
+
+#include "pch.hpp"
+#include "netvadapter.h"
+#include "device.h"
+#include "trace.h"
+#include "power.h"
+#include "power.tmh"
+
+void
+NetvDeviceInitializePowerManagement(
+ _In_ NetvDevice * Device
+)
+{
+#ifdef _KERNEL_MODE
+ WDFDEVICE wdfDevice = Device->m_handle;
+ NetvAdapter * adapter = Device->m_adapter;
+
+ if (!adapter->S0Idle)
+ {
+ return;
+ }
+
+ WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS idleSettings;
+ WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS_INIT(
+ &idleSettings,
+ IdleCanWakeFromS0);
+
+ idleSettings.IdleTimeout = 3000;
+ idleSettings.IdleTimeoutType = SystemManagedIdleTimeoutWithHint;
+
+ NTSTATUS ntStatus = WdfDeviceAssignS0IdleSettings(
+ wdfDevice,
+ &idleSettings);
+
+ if (ntStatus != STATUS_SUCCESS)
+ {
+ // MSDN says we should ignore error codes from assign S0 idle settings, do that
+ return;
+ }
+
+ // Now tell NetAdapterCx we support wake on packet filter match
+ NET_ADAPTER_WAKE_PACKET_FILTER_CAPABILITIES wakeOnPacketFilterMatch;
+ NET_ADAPTER_WAKE_PACKET_FILTER_CAPABILITIES_INIT(&wakeOnPacketFilterMatch);
+ wakeOnPacketFilterMatch.PacketFilterMatch = TRUE;
+
+ NetAdapterWakeSetPacketFilterCapabilities(adapter->m_handle, &wakeOnPacketFilterMatch);
+#else
+ UNREFERENCED_PARAMETER(Device);
+#endif
+}
+
+_Use_decl_annotations_
+NTSTATUS
+EvtDeviceArmWakeFromS0(
+ WDFDEVICE Device
+)
+{
+ auto adapter = NetvDeviceGetContext(Device)->m_adapter;
+ adapter->ArmWakeFromS0();
+
+ return STATUS_SUCCESS;
+}
+
+_Use_decl_annotations_
+void
+EvtDeviceDisarmWakeFromS0(
+ WDFDEVICE Device
+)
+{
+ auto adapter = NetvDeviceGetContext(Device)->m_adapter;
+ adapter->DisarmWakeFromS0();
+}
diff --git a/network/netadaptercx/netvadapter/drivercode/power.h b/network/netadaptercx/netvadapter/drivercode/power.h
new file mode 100644
index 00000000..6a5e2399
--- /dev/null
+++ b/network/netadaptercx/netvadapter/drivercode/power.h
@@ -0,0 +1,10 @@
+// Copyright (c) Microsoft Corporation. All rights reserved
+#pragma once
+
+EVT_WDF_DEVICE_ARM_WAKE_FROM_S0 EvtDeviceArmWakeFromS0;
+EVT_WDF_DEVICE_DISARM_WAKE_FROM_S0 EvtDeviceDisarmWakeFromS0;
+
+void
+NetvDeviceInitializePowerManagement(
+ _In_ NetvDevice * Device
+);
diff --git a/network/netadaptercx/netvadapter/km/netvadapter.inf b/network/netadaptercx/netvadapter/km/netvadapter.inf
new file mode 100644
index 00000000..a5565a86
--- /dev/null
+++ b/network/netadaptercx/netvadapter/km/netvadapter.inf
Binary files differ
diff --git a/network/netadaptercx/netvadapter/km/netvadapterkm.vcxproj b/network/netadaptercx/netvadapter/km/netvadapterkm.vcxproj
new file mode 100644
index 00000000..c5381da8
--- /dev/null
+++ b/network/netadaptercx/netvadapter/km/netvadapterkm.vcxproj
@@ -0,0 +1,217 @@
+<?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|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</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>{B4044984-19DD-456F-9D47-565F59A47F5E}</ProjectGuid>
+ <TemplateGuid>{1bc93793-694f-48fe-9372-81e2b05556fd}</TemplateGuid>
+ <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+ <MinimumVisualStudioVersion>12.0</MinimumVisualStudioVersion>
+ <Configuration>Debug</Configuration>
+ <Platform Condition="'$(Platform)' == ''">x64</Platform>
+ <RootNamespace>netvadapterkm</RootNamespace>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <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>Windows Driver</DriverTargetPlatform>
+ <KMDF_VERSION_MAJOR>1</KMDF_VERSION_MAJOR>
+ <KMDF_VERSION_MINOR>33</KMDF_VERSION_MINOR>
+ <KMDF_MINIMUM_VERSION_REQUIRED>33</KMDF_MINIMUM_VERSION_REQUIRED>
+ <NetAdapterDriver>true</NetAdapterDriver>
+ <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR>
+ <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR>
+ <NETADAPTER_MINIMUM_VERSION_REQUIRED>4</NETADAPTER_MINIMUM_VERSION_REQUIRED>
+ <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>Windows Driver</DriverTargetPlatform>
+ <KMDF_VERSION_MAJOR>1</KMDF_VERSION_MAJOR>
+ <KMDF_VERSION_MINOR>33</KMDF_VERSION_MINOR>
+ <KMDF_MINIMUM_VERSION_REQUIRED>33</KMDF_MINIMUM_VERSION_REQUIRED>
+ <NetAdapterDriver>true</NetAdapterDriver>
+ <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR>
+ <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR>
+ <NETADAPTER_MINIMUM_VERSION_REQUIRED>4</NETADAPTER_MINIMUM_VERSION_REQUIRED>
+ <SupportsPackaging>true</SupportsPackaging>
+ </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>Windows Driver</DriverTargetPlatform>
+ <KMDF_VERSION_MAJOR>1</KMDF_VERSION_MAJOR>
+ <KMDF_VERSION_MINOR>33</KMDF_VERSION_MINOR>
+ <KMDF_MINIMUM_VERSION_REQUIRED>33</KMDF_MINIMUM_VERSION_REQUIRED>
+ <NetAdapterDriver>true</NetAdapterDriver>
+ <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR>
+ <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR>
+ <NETADAPTER_MINIMUM_VERSION_REQUIRED>4</NETADAPTER_MINIMUM_VERSION_REQUIRED>
+ <SupportsPackaging>true</SupportsPackaging>
+ </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>Windows Driver</DriverTargetPlatform>
+ <KMDF_VERSION_MAJOR>1</KMDF_VERSION_MAJOR>
+ <KMDF_VERSION_MINOR>33</KMDF_VERSION_MINOR>
+ <KMDF_MINIMUM_VERSION_REQUIRED>33</KMDF_MINIMUM_VERSION_REQUIRED>
+ <NetAdapterDriver>true</NetAdapterDriver>
+ <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR>
+ <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR>
+ <NETADAPTER_MINIMUM_VERSION_REQUIRED>4</NETADAPTER_MINIMUM_VERSION_REQUIRED>
+ <SupportsPackaging>true</SupportsPackaging>
+ </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>
+ <SkipPackageVerification>true</SkipPackageVerification>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
+ <RunCodeAnalysis>false</RunCodeAnalysis>
+ <EnableInf2cat>false</EnableInf2cat>
+ <TargetName>netvadapter</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
+ <RunCodeAnalysis>false</RunCodeAnalysis>
+ <EnableInf2cat>false</EnableInf2cat>
+ <TargetName>netvadapter</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
+ <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
+ <RunCodeAnalysis>false</RunCodeAnalysis>
+ <EnableInf2cat>false</EnableInf2cat>
+ <TargetName>netvadapter</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
+ <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
+ <RunCodeAnalysis>false</RunCodeAnalysis>
+ <EnableInf2cat>false</EnableInf2cat>
+ <TargetName>netvadapter</TargetName>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <DriverSign>
+ <FileDigestAlgorithm>sha256</FileDigestAlgorithm>
+ </DriverSign>
+ <ClCompile>
+ <WppEnabled>true</WppEnabled>
+ <AdditionalIncludeDirectories>..\..\netvadapterlibrary\Interface;..\..\netvadapterlibrary\code;..\..\..\..\wil\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <WppRecorderEnabled>true</WppRecorderEnabled>
+ <WppScanConfigurationData>..\..\netvadapterlibrary\code\trace.h</WppScanConfigurationData>
+ <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking>
+ <PreprocessorDefinitions>_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Inf>
+ <TimeStamp>1.0</TimeStamp>
+ </Inf>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <DriverSign>
+ <FileDigestAlgorithm>sha256</FileDigestAlgorithm>
+ </DriverSign>
+ <ClCompile>
+ <WppEnabled>true</WppEnabled>
+ <AdditionalIncludeDirectories>..\..\netvadapterlibrary\Interface;..\..\netvadapterlibrary\code;..\..\..\..\wil\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <WppRecorderEnabled>true</WppRecorderEnabled>
+ <WppScanConfigurationData>..\..\netvadapterlibrary\code\trace.h</WppScanConfigurationData>
+ <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking>
+ <PreprocessorDefinitions>_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Inf>
+ <TimeStamp>1.0</TimeStamp>
+ </Inf>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
+ <DriverSign>
+ <FileDigestAlgorithm>sha256</FileDigestAlgorithm>
+ </DriverSign>
+ <ClCompile>
+ <WppEnabled>true</WppEnabled>
+ <AdditionalIncludeDirectories>..\..\netvadapterlibrary\Interface;..\..\netvadapterlibrary\code;..\..\..\..\wil\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <WppRecorderEnabled>true</WppRecorderEnabled>
+ <WppScanConfigurationData>..\..\netvadapterlibrary\code\trace.h</WppScanConfigurationData>
+ <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking>
+ <PreprocessorDefinitions>_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Inf>
+ <TimeStamp>1.0</TimeStamp>
+ </Inf>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
+ <DriverSign>
+ <FileDigestAlgorithm>sha256</FileDigestAlgorithm>
+ </DriverSign>
+ <ClCompile>
+ <WppEnabled>true</WppEnabled>
+ <AdditionalIncludeDirectories>..\..\netvadapterlibrary\Interface;..\..\netvadapterlibrary\code;..\..\..\..\wil\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <WppRecorderEnabled>true</WppRecorderEnabled>
+ <WppScanConfigurationData>..\..\netvadapterlibrary\code\trace.h</WppScanConfigurationData>
+ <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking>
+ <PreprocessorDefinitions>_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Inf>
+ <TimeStamp>1.0</TimeStamp>
+ </Inf>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <Inf Include="netvadapter.inf" />
+ </ItemGroup>
+ <ItemGroup>
+ <FilesToPackage Include="$(TargetPath)" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\drivercode\driver.cpp" />
+ <ClCompile Include="..\drivercode\device.cpp" />
+ <ClCompile Include="..\drivercode\power.cpp" />
+ <ClCompile Include="..\drivercode\memorymanagement.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\drivercode\pch.hpp" />
+ <ClInclude Include="..\drivercode\device.h" />
+ <ClInclude Include="..\drivercode\power.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\..\netvadapterlibrary\km\netvadapterlibrarykm.vcxproj">
+ <Project>{e2a65efd-25cc-4af0-b180-0cd56ee277a9}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>
diff --git a/network/netadaptercx/netvadapter/km/netvadapterkm.vcxproj.filters b/network/netadaptercx/netvadapter/km/netvadapterkm.vcxproj.filters
new file mode 100644
index 00000000..3d80c128
--- /dev/null
+++ b/network/netadaptercx/netvadapter/km/netvadapterkm.vcxproj.filters
@@ -0,0 +1,51 @@
+<?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="netvadapter.inf">
+ <Filter>Driver Files</Filter>
+ </Inf>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\drivercode\driver.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\drivercode\device.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\drivercode\power.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\drivercode\memorymanagement.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\drivercode\pch.hpp">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\drivercode\device.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\drivercode\power.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+</Project>
diff --git a/network/netadaptercx/netvadapter/netvadapter.sln b/network/netadaptercx/netvadapter/netvadapter.sln
new file mode 100644
index 00000000..866a8ac2
--- /dev/null
+++ b/network/netadaptercx/netvadapter/netvadapter.sln
@@ -0,0 +1,82 @@
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.7.34221.43
+MinimumVisualStudioVersion = 12.0
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "netvadapterkm", "km\netvadapterkm.vcxproj", "{B4044984-19DD-456F-9D47-565F59A47F5E}"
+ ProjectSection(ProjectDependencies) = postProject
+ {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9} = {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "netvadapterum", "um\netvadapterum.vcxproj", "{1CDC2CE3-19F3-4200-87C7-C343FB2D8ED3}"
+ ProjectSection(ProjectDependencies) = postProject
+ {612F33AD-430C-4FE7-8000-35E15A5EB757} = {612F33AD-430C-4FE7-8000-35E15A5EB757}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "netvadapterlibrarykm", "..\netvadapterlibrary\km\netvadapterlibrarykm.vcxproj", "{E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "netvadapterlibraryum", "..\netvadapterlibrary\um\netvadapterlibraryum.vcxproj", "{612F33AD-430C-4FE7-8000-35E15A5EB757}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|ARM64 = Debug|ARM64
+ Debug|x64 = Debug|x64
+ Release|ARM64 = Release|ARM64
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {B4044984-19DD-456F-9D47-565F59A47F5E}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {B4044984-19DD-456F-9D47-565F59A47F5E}.Debug|ARM64.Build.0 = Debug|ARM64
+ {B4044984-19DD-456F-9D47-565F59A47F5E}.Debug|ARM64.Deploy.0 = Debug|ARM64
+ {B4044984-19DD-456F-9D47-565F59A47F5E}.Debug|x64.ActiveCfg = Debug|x64
+ {B4044984-19DD-456F-9D47-565F59A47F5E}.Debug|x64.Build.0 = Debug|x64
+ {B4044984-19DD-456F-9D47-565F59A47F5E}.Debug|x64.Deploy.0 = Debug|x64
+ {B4044984-19DD-456F-9D47-565F59A47F5E}.Release|ARM64.ActiveCfg = Release|ARM64
+ {B4044984-19DD-456F-9D47-565F59A47F5E}.Release|ARM64.Build.0 = Release|ARM64
+ {B4044984-19DD-456F-9D47-565F59A47F5E}.Release|ARM64.Deploy.0 = Release|ARM64
+ {B4044984-19DD-456F-9D47-565F59A47F5E}.Release|x64.ActiveCfg = Release|x64
+ {B4044984-19DD-456F-9D47-565F59A47F5E}.Release|x64.Build.0 = Release|x64
+ {B4044984-19DD-456F-9D47-565F59A47F5E}.Release|x64.Deploy.0 = Release|x64
+ {1CDC2CE3-19F3-4200-87C7-C343FB2D8ED3}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {1CDC2CE3-19F3-4200-87C7-C343FB2D8ED3}.Debug|ARM64.Build.0 = Debug|ARM64
+ {1CDC2CE3-19F3-4200-87C7-C343FB2D8ED3}.Debug|ARM64.Deploy.0 = Debug|ARM64
+ {1CDC2CE3-19F3-4200-87C7-C343FB2D8ED3}.Debug|x64.ActiveCfg = Debug|x64
+ {1CDC2CE3-19F3-4200-87C7-C343FB2D8ED3}.Debug|x64.Build.0 = Debug|x64
+ {1CDC2CE3-19F3-4200-87C7-C343FB2D8ED3}.Debug|x64.Deploy.0 = Debug|x64
+ {1CDC2CE3-19F3-4200-87C7-C343FB2D8ED3}.Release|ARM64.ActiveCfg = Release|ARM64
+ {1CDC2CE3-19F3-4200-87C7-C343FB2D8ED3}.Release|ARM64.Build.0 = Release|ARM64
+ {1CDC2CE3-19F3-4200-87C7-C343FB2D8ED3}.Release|ARM64.Deploy.0 = Release|ARM64
+ {1CDC2CE3-19F3-4200-87C7-C343FB2D8ED3}.Release|x64.ActiveCfg = Release|x64
+ {1CDC2CE3-19F3-4200-87C7-C343FB2D8ED3}.Release|x64.Build.0 = Release|x64
+ {1CDC2CE3-19F3-4200-87C7-C343FB2D8ED3}.Release|x64.Deploy.0 = Release|x64
+ {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Debug|ARM64.Build.0 = Debug|ARM64
+ {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Debug|ARM64.Deploy.0 = Debug|ARM64
+ {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Debug|x64.ActiveCfg = Debug|x64
+ {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Debug|x64.Build.0 = Debug|x64
+ {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Debug|x64.Deploy.0 = Debug|x64
+ {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Release|ARM64.ActiveCfg = Release|ARM64
+ {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Release|ARM64.Build.0 = Release|ARM64
+ {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Release|ARM64.Deploy.0 = Release|ARM64
+ {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Release|x64.ActiveCfg = Release|x64
+ {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Release|x64.Build.0 = Release|x64
+ {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Release|x64.Deploy.0 = Release|x64
+ {612F33AD-430C-4FE7-8000-35E15A5EB757}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {612F33AD-430C-4FE7-8000-35E15A5EB757}.Debug|ARM64.Build.0 = Debug|ARM64
+ {612F33AD-430C-4FE7-8000-35E15A5EB757}.Debug|ARM64.Deploy.0 = Debug|ARM64
+ {612F33AD-430C-4FE7-8000-35E15A5EB757}.Debug|x64.ActiveCfg = Debug|x64
+ {612F33AD-430C-4FE7-8000-35E15A5EB757}.Debug|x64.Build.0 = Debug|x64
+ {612F33AD-430C-4FE7-8000-35E15A5EB757}.Debug|x64.Deploy.0 = Debug|x64
+ {612F33AD-430C-4FE7-8000-35E15A5EB757}.Release|ARM64.ActiveCfg = Release|ARM64
+ {612F33AD-430C-4FE7-8000-35E15A5EB757}.Release|ARM64.Build.0 = Release|ARM64
+ {612F33AD-430C-4FE7-8000-35E15A5EB757}.Release|ARM64.Deploy.0 = Release|ARM64
+ {612F33AD-430C-4FE7-8000-35E15A5EB757}.Release|x64.ActiveCfg = Release|x64
+ {612F33AD-430C-4FE7-8000-35E15A5EB757}.Release|x64.Build.0 = Release|x64
+ {612F33AD-430C-4FE7-8000-35E15A5EB757}.Release|x64.Deploy.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {B869660E-4622-49A7-A458-819E1C98599D}
+ EndGlobalSection
+EndGlobal
diff --git a/network/netadaptercx/netvadapter/um/netvadapterum.inf b/network/netadaptercx/netvadapter/um/netvadapterum.inf
new file mode 100644
index 00000000..4b55d229
--- /dev/null
+++ b/network/netadaptercx/netvadapter/um/netvadapterum.inf
Binary files differ
diff --git a/network/netadaptercx/netvadapter/um/netvadapterum.vcxproj b/network/netadaptercx/netvadapter/um/netvadapterum.vcxproj
new file mode 100644
index 00000000..0dfc43d3
--- /dev/null
+++ b/network/netadaptercx/netvadapter/um/netvadapterum.vcxproj
@@ -0,0 +1,197 @@
+<?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|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|ARM64">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM64">
+ <Configuration>Release</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <ItemGroup>
+ <Inf Include="netvadapterum.inf" />
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{1CDC2CE3-19F3-4200-87C7-C343FB2D8ED3}</ProjectGuid>
+ <TemplateGuid>{2177f19c-eb4c-4687-9e7f-f9eec1f12cf1}</TemplateGuid>
+ <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+ <MinimumVisualStudioVersion>12.0</MinimumVisualStudioVersion>
+ <Configuration>Debug</Configuration>
+ <Platform Condition="'$(Platform)' == ''">x64</Platform>
+ <RootNamespace>netvadapterum</RootNamespace>
+ </PropertyGroup>
+ <PropertyGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset>
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ </PropertyGroup>
+ <PropertyGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset>
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ </PropertyGroup>
+ <PropertyGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
+ <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset>
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ </PropertyGroup>
+ <PropertyGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
+ <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset>
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <UMDF_VERSION_MAJOR>2</UMDF_VERSION_MAJOR>
+ <UMDF_VERSION_MINOR>33</UMDF_VERSION_MINOR>
+ <UMDF_MINIMUM_VERSION_REQUIRED>33</UMDF_MINIMUM_VERSION_REQUIRED>
+ <NetAdapterDriver>true</NetAdapterDriver>
+ <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR>
+ <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <UMDF_VERSION_MAJOR>2</UMDF_VERSION_MAJOR>
+ <UMDF_VERSION_MINOR>33</UMDF_VERSION_MINOR>
+ <UMDF_MINIMUM_VERSION_REQUIRED>33</UMDF_MINIMUM_VERSION_REQUIRED>
+ <NetAdapterDriver>true</NetAdapterDriver>
+ <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR>
+ <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <UMDF_VERSION_MAJOR>2</UMDF_VERSION_MAJOR>
+ <UMDF_VERSION_MINOR>33</UMDF_VERSION_MINOR>
+ <UMDF_MINIMUM_VERSION_REQUIRED>33</UMDF_MINIMUM_VERSION_REQUIRED>
+ <NetAdapterDriver>true</NetAdapterDriver>
+ <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR>
+ <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <UMDF_VERSION_MAJOR>2</UMDF_VERSION_MAJOR>
+ <UMDF_VERSION_MINOR>33</UMDF_VERSION_MINOR>
+ <UMDF_MINIMUM_VERSION_REQUIRED>33</UMDF_MINIMUM_VERSION_REQUIRED>
+ <NetAdapterDriver>true</NetAdapterDriver>
+ <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR>
+ <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR>
+ </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>
+ <SkipPackageVerification>true</SkipPackageVerification>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor>
+ <EnableInf2cat>false</EnableInf2cat>
+ <TargetName>netvadapterum</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor>
+ <EnableInf2cat>false</EnableInf2cat>
+ <TargetName>netvadapterum</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
+ <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor>
+ <EnableInf2cat>false</EnableInf2cat>
+ <TargetName>netvadapterum</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
+ <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor>
+ <EnableInf2cat>false</EnableInf2cat>
+ <TargetName>netvadapterum</TargetName>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <DriverSign>
+ <FileDigestAlgorithm>sha256</FileDigestAlgorithm>
+ </DriverSign>
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\netvadapterlibrary\Interface;..\..\netvadapterlibrary\code;..\..\..\..\wil\include;$(KIT_SHARED_INC_PATH_WDK);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <WppEnabled>true</WppEnabled>
+ <WppScanConfigurationData>..\..\netvadapterlibrary\code\trace.h</WppScanConfigurationData>
+ <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking>
+ <PreprocessToFile>false</PreprocessToFile>
+ <WppRecorderEnabled>true</WppRecorderEnabled>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <DriverSign>
+ <FileDigestAlgorithm>sha256</FileDigestAlgorithm>
+ </DriverSign>
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\netvadapterlibrary\Interface;..\..\netvadapterlibrary\code;..\..\..\..\wil\include;$(KIT_SHARED_INC_PATH_WDK);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <WppEnabled>true</WppEnabled>
+ <WppScanConfigurationData>..\..\netvadapterlibrary\code\trace.h</WppScanConfigurationData>
+ <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking>
+ <PreprocessToFile>false</PreprocessToFile>
+ <WppRecorderEnabled>true</WppRecorderEnabled>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
+ <DriverSign>
+ <FileDigestAlgorithm>sha256</FileDigestAlgorithm>
+ </DriverSign>
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\netvadapterlibrary\Interface;..\..\netvadapterlibrary\code;..\..\..\..\wil\include;$(KIT_SHARED_INC_PATH_WDK);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <WppEnabled>true</WppEnabled>
+ <WppScanConfigurationData>..\..\netvadapterlibrary\code\trace.h</WppScanConfigurationData>
+ <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking>
+ <PreprocessToFile>false</PreprocessToFile>
+ <WppRecorderEnabled>true</WppRecorderEnabled>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
+ <DriverSign>
+ <FileDigestAlgorithm>sha256</FileDigestAlgorithm>
+ </DriverSign>
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\netvadapterlibrary\Interface;..\..\netvadapterlibrary\code;..\..\..\..\wil\include;$(KIT_SHARED_INC_PATH_WDK);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <WppEnabled>true</WppEnabled>
+ <WppScanConfigurationData>..\..\netvadapterlibrary\code\trace.h</WppScanConfigurationData>
+ <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking>
+ <PreprocessToFile>false</PreprocessToFile>
+ <WppRecorderEnabled>true</WppRecorderEnabled>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <FilesToPackage Include="$(TargetPath)" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\drivercode\pch.hpp" />
+ <ClInclude Include="..\drivercode\device.h" />
+ <ClInclude Include="..\drivercode\power.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\drivercode\driver.cpp" />
+ <ClCompile Include="..\drivercode\device.cpp" />
+ <ClCompile Include="..\drivercode\power.cpp" />
+ <ClCompile Include="..\drivercode\memorymanagement.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\..\netvadapterlibrary\um\netvadapterlibraryum.vcxproj">
+ <Project>{612f33ad-430c-4fe7-8000-35e15a5eb757}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>
diff --git a/network/netadaptercx/netvadapter/um/netvadapterum.vcxproj.filters b/network/netadaptercx/netvadapter/um/netvadapterum.vcxproj.filters
new file mode 100644
index 00000000..b43c1b22
--- /dev/null
+++ b/network/netadaptercx/netvadapter/um/netvadapterum.vcxproj.filters
@@ -0,0 +1,51 @@
+<?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="netvadapterum.inf">
+ <Filter>Driver Files</Filter>
+ </Inf>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\drivercode\driver.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\drivercode\device.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\drivercode\power.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\drivercode\memorymanagement.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\drivercode\pch.hpp">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\drivercode\device.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\drivercode\power.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+</Project>