|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [XENVBD PATCH 1/2] Add RegistryOpenParametersKey
Server 2025 WHQL tests enables "verifier.exe /onecheck /rc 33 36" on some
drivers
under test, which will detect a violation if drivers attempt to access absolute
registry paths.
IoOpenDriverRegistryKey will open the parameters key for a driver, but its not
defined for Server 2016. Use MmGetSystemRoutineAddress to dynamically find the
function so that a single binary can be used on Server 2016 and Server 2025.
Signed-off-by: Owen Smith <owen.smith@xxxxxxxxx>
---
src/xendisk/driver.c | 19 ++---------
src/xendisk/registry.c | 72 ++++++++++++++++++++++++++++++++++++++++-
src/xendisk/registry.h | 9 +++++-
src/xenvbd/driver.c | 27 +++-------------
src/xenvbd/registry.c | 73 +++++++++++++++++++++++++++++++++++++++++-
src/xenvbd/registry.h | 10 +++++-
6 files changed, 167 insertions(+), 43 deletions(-)
diff --git a/src/xendisk/driver.c b/src/xendisk/driver.c
index e24a1a4..e30b75c 100644
--- a/src/xendisk/driver.c
+++ b/src/xendisk/driver.c
@@ -221,7 +221,6 @@ DriverEntry(
IN PUNICODE_STRING RegistryPath
)
{
- HANDLE ServiceKey;
HANDLE ParametersKey;
ULONG Index;
NTSTATUS status;
@@ -246,25 +245,16 @@ DriverEntry(
MONTH,
YEAR);
- status = RegistryInitialize(RegistryPath);
+ status = RegistryInitialize(DriverObject, RegistryPath);
if (!NT_SUCCESS(status))
goto fail1;
- status = RegistryOpenServiceKey(KEY_ALL_ACCESS, &ServiceKey);
+ status = RegistryOpenParametersKey(KEY_READ, &ParametersKey);
if (!NT_SUCCESS(status))
goto fail2;
- status = RegistryOpenSubKey(ServiceKey,
- "Parameters",
- KEY_READ,
- &ParametersKey);
- if (!NT_SUCCESS(status))
- goto fail3;
-
__DriverSetParametersKey(ParametersKey);
- RegistryCloseKey(ServiceKey);
-
DriverObject->DriverExtension->AddDevice = AddDevice;
for (Index = 0; Index <= IRP_MJ_MAXIMUM_FUNCTION; Index++) {
@@ -277,11 +267,6 @@ DriverEntry(
return STATUS_SUCCESS;
-fail3:
- Error("fail3\n");
-
- RegistryCloseKey(ServiceKey);
-
fail2:
Error("fail2\n");
diff --git a/src/xendisk/registry.c b/src/xendisk/registry.c
index 173b6b2..9773d7d 100644
--- a/src/xendisk/registry.c
+++ b/src/xendisk/registry.c
@@ -38,8 +38,13 @@
#define REGISTRY_TAG 'GERX'
+static PDRIVER_OBJECT RegistryDriverObject;
static UNICODE_STRING RegistryPath;
+typedef NTSTATUS(*IOOPENDRIVERREGISTRYKEY)(PDRIVER_OBJECT, DRIVER_REGKEY_TYPE,
ACCESS_MASK, ULONG, PHANDLE);
+
+static IOOPENDRIVERREGISTRYKEY __IoOpenDriverRegistryKey;
+
static FORCEINLINE PVOID
__RegistryAllocate(
IN ULONG Length
@@ -58,9 +63,12 @@ __RegistryFree(
NTSTATUS
RegistryInitialize(
- IN PUNICODE_STRING Path
+ IN PDRIVER_OBJECT DriverObject,
+ IN PUNICODE_STRING Path
)
{
+ UNICODE_STRING Unicode;
+ PVOID Func;
NTSTATUS status;
ASSERT3P(RegistryPath.Buffer, ==, NULL);
@@ -69,6 +77,16 @@ RegistryInitialize(
if (!NT_SUCCESS(status))
goto fail1;
+ ASSERT3P(RegistryDriverObject, ==, NULL);
+ RegistryDriverObject = DriverObject;
+
+ ASSERT3P(__IoOpenDriverRegistryKey, ==, NULL);
+ RtlInitUnicodeString(&Unicode, L"IoOpenDriverRegistryKey");
+
+ Func = MmGetSystemRoutineAddress(&Unicode);
+ if (Func != NULL)
+ __IoOpenDriverRegistryKey = (IOOPENDRIVERREGISTRYKEY)Func;
+
return STATUS_SUCCESS;
fail1:
@@ -82,6 +100,10 @@ RegistryTeardown(
VOID
)
{
+ __IoOpenDriverRegistryKey = NULL;
+
+ RegistryDriverObject = NULL;
+
RtlFreeUnicodeString(&RegistryPath);
RegistryPath.Buffer = NULL;
RegistryPath.MaximumLength = RegistryPath.Length = 0;
@@ -266,6 +288,54 @@ RegistryCreateServiceKey(
return RegistryCreateKey(NULL, &RegistryPath, REG_OPTION_NON_VOLATILE,
Key);
}
+NTSTATUS
+RegistryOpenParametersKey(
+ IN ACCESS_MASK DesiredAccess,
+ OUT PHANDLE Key
+ )
+{
+ HANDLE ServiceKey;
+ NTSTATUS status;
+
+ if (__IoOpenDriverRegistryKey != NULL) {
+ status = __IoOpenDriverRegistryKey(RegistryDriverObject,
+ DriverRegKeyParameters,
+ DesiredAccess,
+ 0,
+ Key);
+ if (!NT_SUCCESS(status))
+ goto fail1;
+
+ goto done;
+ }
+
+ status = RegistryOpenKey(NULL, &RegistryPath, DesiredAccess, &ServiceKey);
+ if (!NT_SUCCESS(status))
+ goto fail2;
+
+ status = RegistryOpenSubKey(ServiceKey, "Parameters", DesiredAccess, Key);
+ if (!NT_SUCCESS(status))
+ goto fail3;
+
+ RegistryCloseKey(ServiceKey);
+
+done:
+ return STATUS_SUCCESS;
+
+fail3:
+ Error("fail3\n");
+
+ RegistryCloseKey(ServiceKey);
+
+fail2:
+ Error("fail2\n");
+
+fail1:
+ Error("fail1 %08x\n", status);
+
+ return status;
+}
+
NTSTATUS
RegistryOpenSoftwareKey(
IN PDEVICE_OBJECT DeviceObject,
diff --git a/src/xendisk/registry.h b/src/xendisk/registry.h
index 7516e51..b33eb81 100644
--- a/src/xendisk/registry.h
+++ b/src/xendisk/registry.h
@@ -37,7 +37,8 @@
extern NTSTATUS
RegistryInitialize(
- IN PUNICODE_STRING Path
+ IN PDRIVER_OBJECT DriverObject,
+ IN PUNICODE_STRING Path
);
extern VOID
@@ -72,6 +73,12 @@ RegistryCreateServiceKey(
OUT PHANDLE Key
);
+extern NTSTATUS
+RegistryOpenParametersKey(
+ IN ACCESS_MASK DesiredAccess,
+ OUT PHANDLE Key
+ );
+
extern NTSTATUS
RegistryOpenSoftwareKey(
IN PDEVICE_OBJECT DeviceObject,
diff --git a/src/xenvbd/driver.c b/src/xenvbd/driver.c
index 0d6c21d..ba0ad33 100644
--- a/src/xenvbd/driver.c
+++ b/src/xenvbd/driver.c
@@ -351,7 +351,6 @@ DriverEntry(
IN PUNICODE_STRING RegistryPath
)
{
- HANDLE ServiceKey;
HANDLE ParametersKey;
NTSTATUS status;
@@ -371,21 +370,14 @@ DriverEntry(
MONTH,
YEAR);
- status = RegistryInitialize(RegistryPath);
+ status = RegistryInitialize(DriverObject, RegistryPath);
if (!NT_SUCCESS(status))
goto fail1;
- status = RegistryOpenServiceKey(KEY_ALL_ACCESS, &ServiceKey);
+ status = RegistryOpenParametersKey(KEY_READ, &ParametersKey);
if (!NT_SUCCESS(status))
goto fail2;
- status = RegistryOpenSubKey(ServiceKey,
- "Parameters",
- KEY_READ,
- &ParametersKey);
- if (!NT_SUCCESS(status))
- goto fail3;
-
Driver.ParametersKey = ParametersKey;
Driver.Adapter = NULL;
@@ -394,7 +386,7 @@ DriverEntry(
status = AdapterDriverEntry(RegistryPath,
DriverObject);
if (!NT_SUCCESS(status))
- goto fail4;
+ goto fail3;
Driver.StorPortDispatchPnp = DriverObject->MajorFunction[IRP_MJ_PNP];
Driver.StorPortDispatchPower = DriverObject->MajorFunction[IRP_MJ_POWER];
@@ -404,22 +396,13 @@ DriverEntry(
DriverObject->MajorFunction[IRP_MJ_POWER] = DispatchPower;
DriverObject->DriverUnload = DriverUnload;
- RegistryCloseKey(ServiceKey);
- ServiceKey = NULL;
-
return STATUS_SUCCESS;
-fail4:
- Error("fail4\n");
-
- RegistryCloseKey(Driver.ParametersKey);
- Driver.ParametersKey = NULL;
-
fail3:
Error("fail3\n");
- RegistryCloseKey(ServiceKey);
- ServiceKey = NULL;
+ RegistryCloseKey(Driver.ParametersKey);
+ Driver.ParametersKey = NULL;
fail2:
Error("fail2\n");
diff --git a/src/xenvbd/registry.c b/src/xenvbd/registry.c
index 811701f..069c62a 100644
--- a/src/xenvbd/registry.c
+++ b/src/xenvbd/registry.c
@@ -38,8 +38,13 @@
#define REGISTRY_TAG 'GERX'
+static PDRIVER_OBJECT RegistryDriverObject;
static UNICODE_STRING RegistryPath;
+typedef NTSTATUS(*IOOPENDRIVERREGISTRYKEY)(PDRIVER_OBJECT, DRIVER_REGKEY_TYPE,
ACCESS_MASK, ULONG, PHANDLE);
+
+static IOOPENDRIVERREGISTRYKEY __IoOpenDriverRegistryKey;
+
static FORCEINLINE PVOID
__RegistryAllocate(
IN ULONG Length
@@ -58,9 +63,12 @@ __RegistryFree(
NTSTATUS
RegistryInitialize(
- IN PUNICODE_STRING Path
+ IN PDRIVER_OBJECT DriverObject,
+ IN PUNICODE_STRING Path
)
{
+ UNICODE_STRING Unicode;
+ PVOID Func;
NTSTATUS status;
ASSERT3P(RegistryPath.Buffer, ==, NULL);
@@ -69,6 +77,16 @@ RegistryInitialize(
if (!NT_SUCCESS(status))
goto fail1;
+ ASSERT3P(RegistryDriverObject, ==, NULL);
+ RegistryDriverObject = DriverObject;
+
+ ASSERT3P(__IoOpenDriverRegistryKey, ==, NULL);
+ RtlInitUnicodeString(&Unicode, L"IoOpenDriverRegistryKey");
+
+ Func = MmGetSystemRoutineAddress(&Unicode);
+ if (Func != NULL)
+ __IoOpenDriverRegistryKey = (IOOPENDRIVERREGISTRYKEY)Func;
+
return STATUS_SUCCESS;
fail1:
@@ -82,6 +100,10 @@ RegistryTeardown(
VOID
)
{
+ __IoOpenDriverRegistryKey = NULL;
+
+ RegistryDriverObject = NULL;
+
RtlFreeUnicodeString(&RegistryPath);
RegistryPath.Buffer = NULL;
RegistryPath.MaximumLength = RegistryPath.Length = 0;
@@ -270,6 +292,55 @@ RegistryCreateServiceKey(
return RegistryCreateKey(NULL, &RegistryPath, REG_OPTION_NON_VOLATILE,
Key);
}
+__drv_requiresIRQL(PASSIVE_LEVEL)
+NTSTATUS
+RegistryOpenParametersKey(
+ IN ACCESS_MASK DesiredAccess,
+ OUT PHANDLE Key
+ )
+{
+ HANDLE ServiceKey;
+ NTSTATUS status;
+
+ if (__IoOpenDriverRegistryKey != NULL) {
+ status = __IoOpenDriverRegistryKey(RegistryDriverObject,
+ DriverRegKeyParameters,
+ DesiredAccess,
+ 0,
+ Key);
+ if (!NT_SUCCESS(status))
+ goto fail1;
+
+ goto done;
+ }
+
+ status = RegistryOpenKey(NULL, &RegistryPath, DesiredAccess, &ServiceKey);
+ if (!NT_SUCCESS(status))
+ goto fail2;
+
+ status = RegistryOpenSubKey(ServiceKey, "Parameters", DesiredAccess, Key);
+ if (!NT_SUCCESS(status))
+ goto fail3;
+
+ RegistryCloseKey(ServiceKey);
+
+done:
+ return STATUS_SUCCESS;
+
+fail3:
+ Error("fail3\n");
+
+ RegistryCloseKey(ServiceKey);
+
+fail2:
+ Error("fail2\n");
+
+fail1:
+ Error("fail1 %08x\n", status);
+
+ return status;
+}
+
__drv_requiresIRQL(PASSIVE_LEVEL)
NTSTATUS
RegistryOpenSoftwareKey(
diff --git a/src/xenvbd/registry.h b/src/xenvbd/registry.h
index d8a2df5..8dac63e 100644
--- a/src/xenvbd/registry.h
+++ b/src/xenvbd/registry.h
@@ -37,7 +37,8 @@
extern NTSTATUS
RegistryInitialize(
- IN PUNICODE_STRING Path
+ IN PDRIVER_OBJECT DriverObject,
+ IN PUNICODE_STRING Path
);
extern VOID
@@ -76,6 +77,13 @@ RegistryCreateServiceKey(
OUT PHANDLE Key
);
+__drv_requiresIRQL(PASSIVE_LEVEL)
+extern NTSTATUS
+RegistryOpenParametersKey(
+ IN ACCESS_MASK DesiredAccess,
+ OUT PHANDLE Key
+ );
+
__drv_requiresIRQL(PASSIVE_LEVEL)
extern NTSTATUS
RegistryOpenSoftwareKey(
--
2.44.0.windows.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |