[SDK]
authorPierre Schweitzer <pierre@reactos.org>
Sun, 1 Jan 2017 16:44:40 +0000 (16:44 +0000)
committerPierre Schweitzer <pierre@reactos.org>
Sun, 1 Jan 2017 16:44:40 +0000 (16:44 +0000)
Implement the rtlver library with RtlIsNtDdiVersionAvailable(). Will be used later on by BtrFS driver.
Reference: https://msdn.microsoft.com/en-us/library/windows/hardware/ff561954(v=vs.85).aspx

CORE-12617

svn path=/trunk/; revision=73496

reactos/sdk/lib/drivers/CMakeLists.txt
reactos/sdk/lib/drivers/rtlver/CMakeLists.txt [new file with mode: 0644]
reactos/sdk/lib/drivers/rtlver/rtl.c [new file with mode: 0644]

index a65f687..0c69fee 100644 (file)
@@ -6,4 +6,5 @@ add_subdirectory(ip)
 add_subdirectory(libusb)
 add_subdirectory(lwip)
 add_subdirectory(ntoskrnl_vista)
 add_subdirectory(libusb)
 add_subdirectory(lwip)
 add_subdirectory(ntoskrnl_vista)
+add_subdirectory(rtlver)
 add_subdirectory(sound)
 add_subdirectory(sound)
diff --git a/reactos/sdk/lib/drivers/rtlver/CMakeLists.txt b/reactos/sdk/lib/drivers/rtlver/CMakeLists.txt
new file mode 100644 (file)
index 0000000..3b63ea1
--- /dev/null
@@ -0,0 +1,7 @@
+add_definitions(-DUNICODE -D_UNICODE -D__NTOSKRNL__ -D_NTOSKRNL_ -D_NTSYSTEM_)
+
+list(APPEND SOURCE
+    rtl.c)
+
+add_library(rtlver ${SOURCE})
+add_dependencies(rtlver xdk)
diff --git a/reactos/sdk/lib/drivers/rtlver/rtl.c b/reactos/sdk/lib/drivers/rtlver/rtl.c
new file mode 100644 (file)
index 0000000..6259abb
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * PROJECT:         ReactOS Kernel - Vista+ APIs
+ * LICENSE:         GPL v2 - See COPYING in the top level directory
+ * FILE:            lib/drivers/ntoskrnl_vista/rtl.c
+ * PURPOSE:         Implementation of RtlIsNtDdiVersionAvailable and RtlIsServicePackVersionInstalled 
+ * PROGRAMMERS:     Pierre Schweitzer <pierre@reactos.org>
+ */
+
+#include <ntdef.h>
+#include <ntifs.h>
+
+BOOLEAN
+WdmlibRtlIsNtDdiVersionAvailable(
+    _In_ ULONG Version)
+{
+    UNICODE_STRING ImportName;
+    ULONG Major, Minor, Current;
+    BOOLEAN (NTAPI *pRtlIsNtDdiVersionAvailable)(ULONG Version);
+
+    /* Try to use ntoskrnl version if available */
+    RtlInitUnicodeString(&ImportName, L"RtlIsNtDdiVersionAvailable");
+    pRtlIsNtDdiVersionAvailable = MmGetSystemRoutineAddress(&ImportName);
+    if (pRtlIsNtDdiVersionAvailable)
+    {
+        return pRtlIsNtDdiVersionAvailable(Version);
+    }
+
+    /* Only provide OS version. No SP */
+    if (SPVER(Version) || SUBVER(Version))
+    {
+        return FALSE;
+    }
+
+    /* Compute the version and compare */
+    Major = 0;
+    Minor = 0;
+    PsGetVersion(&Major, &Minor, NULL, NULL);
+    Current = (Minor + (Major << 8)) << 16;
+
+    return (Current >= Version);
+}