diff --git a/Modules/Platform/WindowsKernelModeDriver-Initialize.cmake b/Modules/Platform/WindowsKernelModeDriver-Initialize.cmake
index 6f0ef331be..eb43935625 100644
--- a/Modules/Platform/WindowsKernelModeDriver-Initialize.cmake
+++ b/Modules/Platform/WindowsKernelModeDriver-Initialize.cmake
@@ -4,8 +4,4 @@ if(NOT _cmake_windows_kernel_mode_driver_enabled)
message(FATAL_ERROR "Windows kernel-mode driver experimental support is not enabled.")
endif()
-if(CMAKE_GENERATOR MATCHES "Visual Studio")
- message(FATAL_ERROR "Visual Studio generators do not yet support CMAKE_SYSTEM_NAME=WindowsKernelModeDriver.")
-endif()
-
set(_CMAKE_FEATURE_DETECTION_TARGET_TYPE STATIC_LIBRARY)
diff --git a/Source/cmExperimental.cxx b/Source/cmExperimental.cxx
index 913db87f5d..0cabd35b8b 100644
--- a/Source/cmExperimental.cxx
+++ b/Source/cmExperimental.cxx
@@ -30,7 +30,7 @@ cmExperimental::FeatureData LookupTable[] = {
false },
// WindowsKernelModeDriver
{ "WindowsKernelModeDriver",
- "fac18f65-504e-4dbb-b068-f356bb1f2ddb",
+ "9157bf90-2313-44d6-aefa-67cd83c8be7c",
"CMAKE_EXPERIMENTAL_WINDOWS_KERNEL_MODE_DRIVER",
"CMake's Windows kernel-mode driver support is experimental. It is meant "
"only for experimentation and feedback to CMake developers.",
diff --git a/Source/cmGlobalVisualStudio10Generator.cxx b/Source/cmGlobalVisualStudio10Generator.cxx
index 3d911bdee7..3e6ba4ee8b 100644
--- a/Source/cmGlobalVisualStudio10Generator.cxx
+++ b/Source/cmGlobalVisualStudio10Generator.cxx
@@ -20,6 +20,7 @@
#include "cmCryptoHash.h"
#include "cmDocumentationEntry.h"
+#include "cmExperimental.h"
#include "cmGeneratorTarget.h"
#include "cmGlobalGenerator.h"
#include "cmGlobalVisualStudio71Generator.h"
@@ -476,6 +477,13 @@ bool cmGlobalVisualStudio10Generator::InitializeSystem(cmMakefile* mf)
if (!this->InitializeWindowsStore(mf)) {
return false;
}
+ } else if (this->SystemName == "WindowsKernelModeDriver"_s &&
+ cmExperimental::HasSupportEnabled(
+ *mf, cmExperimental::Feature::WindowsKernelModeDriver)) {
+ this->SystemIsWindowsKernelModeDriver = true;
+ if (!this->InitializeWindowsKernelModeDriver(mf)) {
+ return false;
+ }
} else if (this->SystemName == "Android"_s) {
if (this->PlatformInGeneratorName) {
mf->IssueMessage(
@@ -536,6 +544,13 @@ bool cmGlobalVisualStudio10Generator::InitializeWindowsStore(cmMakefile* mf)
return false;
}
+bool cmGlobalVisualStudio10Generator::InitializeWindowsKernelModeDriver(
+ cmMakefile*)
+{
+ this->DefaultPlatformToolset = "WindowsKernelModeDriver10.0";
+ return true;
+}
+
bool cmGlobalVisualStudio10Generator::InitializeTegraAndroid(cmMakefile* mf)
{
std::string v =
diff --git a/Source/cmGlobalVisualStudio10Generator.h b/Source/cmGlobalVisualStudio10Generator.h
index a2b351cbe6..df9733d207 100644
--- a/Source/cmGlobalVisualStudio10Generator.h
+++ b/Source/cmGlobalVisualStudio10Generator.h
@@ -127,6 +127,12 @@ public:
/** Return true if building for WindowsStore */
bool TargetsWindowsStore() const { return this->SystemIsWindowsStore; }
+ /** Return true if building for WindowsKernelModeDriver */
+ bool TargetsWindowsKernelModeDriver() const
+ {
+ return this->SystemIsWindowsKernelModeDriver;
+ }
+
/** Return true if building for Android */
bool TargetsAndroid() const { return this->SystemIsAndroid; }
@@ -188,6 +194,7 @@ protected:
virtual bool InitializeWindowsCE(cmMakefile* mf);
virtual bool InitializeWindowsPhone(cmMakefile* mf);
virtual bool InitializeWindowsStore(cmMakefile* mf);
+ virtual bool InitializeWindowsKernelModeDriver(cmMakefile* mf);
virtual bool InitializeTegraAndroid(cmMakefile* mf);
virtual bool InitializeAndroid(cmMakefile* mf);
@@ -249,6 +256,7 @@ protected:
bool SystemIsWindowsCE = false;
bool SystemIsWindowsPhone = false;
bool SystemIsWindowsStore = false;
+ bool SystemIsWindowsKernelModeDriver = false;
bool SystemIsAndroid = false;
bool MSBuildCommandInitialized = false;
diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx
index 13cade8eee..fce248c5db 100644
--- a/Source/cmVisualStudio10TargetGenerator.cxx
+++ b/Source/cmVisualStudio10TargetGenerator.cxx
@@ -282,6 +282,7 @@ cmVisualStudio10TargetGenerator::cmVisualStudio10TargetGenerator(
this->Makefile->GetGeneratorConfigs(cmMakefile::ExcludeEmptyConfig);
this->NsightTegra = gg->IsNsightTegra();
this->Android = gg->TargetsAndroid();
+ this->WindowsKernelMode = gg->TargetsWindowsKernelModeDriver();
auto scanProp = target->GetProperty("CXX_SCAN_FOR_MODULES");
for (auto const& config : this->Configurations) {
if (scanProp.IsSet()) {
@@ -1434,7 +1435,11 @@ void cmVisualStudio10TargetGenerator::WriteProjectConfigurationValues(Elem& e0)
switch (this->GeneratorTarget->GetType()) {
case cmStateEnums::SHARED_LIBRARY:
case cmStateEnums::MODULE_LIBRARY:
- configType = "DynamicLibrary";
+ if (this->WindowsKernelMode) {
+ configType = "Driver";
+ } else {
+ configType = "DynamicLibrary";
+ }
break;
case cmStateEnums::OBJECT_LIBRARY:
case cmStateEnums::STATIC_LIBRARY:
@@ -1479,6 +1484,10 @@ void cmVisualStudio10TargetGenerator::WriteProjectConfigurationValues(Elem& e0)
} else if (this->Android) {
this->WriteAndroidConfigurationValues(e1, c);
}
+
+ if (this->WindowsKernelMode) {
+ this->WriteMSDriverConfigurationValues(e1, c);
+ }
}
}
@@ -1605,6 +1614,14 @@ void cmVisualStudio10TargetGenerator::WriteMSToolConfigurationValuesManaged(
oh.OutputFlagMap();
}
+void cmVisualStudio10TargetGenerator::WriteMSDriverConfigurationValues(
+ Elem& e1, std::string const&)
+{
+ // FIXME: Introduce a way for project code to control these.
+ e1.Element("DriverType", "KMDF");
+ e1.Element("DriverTargetPlatform", "Universal");
+}
+
void cmVisualStudio10TargetGenerator::WriteMSToolConfigurationValuesCommon(
Elem& e1, std::string const& config)
{
@@ -3214,9 +3231,13 @@ void cmVisualStudio10TargetGenerator::OutputLinkIncremental(
if (!this->MSTools) {
return;
}
+ if (this->WindowsKernelMode) {
+ return;
+ }
if (this->ProjectType == VsProjectType::csproj) {
return;
}
+
// static libraries and things greater than modules do not need
// to set this option
if (this->GeneratorTarget->GetType() == cmStateEnums::STATIC_LIBRARY ||
@@ -3684,6 +3705,10 @@ void cmVisualStudio10TargetGenerator::WriteClOptions(
e2.Element("ScanSourceForModuleDependencies",
this->ScanSourceForModuleDependencies[configName] ? "true"
: "false");
+ if (this->WindowsKernelMode) {
+ e2.Element("WppEnabled", "true");
+ e2.Element("WppRecorderEnabled", "true");
+ }
}
bool cmVisualStudio10TargetGenerator::ComputeRcOptions()
@@ -4819,6 +4844,10 @@ void cmVisualStudio10TargetGenerator::WriteItemDefinitionGroups(Elem& e0)
this->WriteMasmOptions(e1, c);
this->WriteNasmOptions(e1, c);
}
+
+ if (this->WindowsKernelMode) {
+ Elem(e1, "DriverSign").Element("FileDigestAlgorithm", "sha256");
+ }
// output midl flags
this->WriteMidlOptions(e1, c);
// write events
diff --git a/Source/cmVisualStudio10TargetGenerator.h b/Source/cmVisualStudio10TargetGenerator.h
index 6142fc68f7..2a9f16ff40 100644
--- a/Source/cmVisualStudio10TargetGenerator.h
+++ b/Source/cmVisualStudio10TargetGenerator.h
@@ -74,6 +74,7 @@ private:
std::string const& config);
void WriteMSToolConfigurationValuesCommon(Elem& e1,
std::string const& config);
+ void WriteMSDriverConfigurationValues(Elem& e1, std::string const& config);
void WriteHeaderSource(Elem& e1, cmSourceFile const* sf,
ConfigToSettings const& toolSettings);
void WriteExtraSource(Elem& e1, cmSourceFile const* sf,
@@ -246,6 +247,7 @@ private:
bool Managed = false;
bool NsightTegra = false;
bool Android = false;
+ bool WindowsKernelMode = false;
bool HaveCustomCommandDepfile = false;
std::map ScanSourceForModuleDependencies;
unsigned int NsightTegraVersion[4];
diff --git a/Tests/RunCMake/cmake_language/Experimental/WindowsKernelModeDriver-set.cmake b/Tests/RunCMake/cmake_language/Experimental/WindowsKernelModeDriver-set.cmake
index f9e22c5c38..517cc2b995 100644
--- a/Tests/RunCMake/cmake_language/Experimental/WindowsKernelModeDriver-set.cmake
+++ b/Tests/RunCMake/cmake_language/Experimental/WindowsKernelModeDriver-set.cmake
@@ -1,5 +1,5 @@
set(CMAKE_EXPERIMENTAL_WINDOWS_KERNEL_MODE_DRIVER
- "fac18f65-504e-4dbb-b068-f356bb1f2ddb")
+ "9157bf90-2313-44d6-aefa-67cd83c8be7c")
cmake_language(GET_EXPERIMENTAL_FEATURE_ENABLED
"WindowsKernelModeDriver"