[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [RFC PATCH 1/5] Add RegistryOpenParametersKey
Use IoOpenDriverRegistryKey to avoid opening an absolute registry path. Driver Verifier can detect registry isolation violations when running WHQL tests on Server 2025. The rule states that a driver may not open an absolute registry key path. Use the specific API to open the 'Parameters' key with KEY_READ when querying settings. Signed-off-by: Owen Smith <owen.smith@xxxxxxxxx> --- src/common/registry.c | 22 +++++++++++++++++++++- src/common/registry.h | 9 ++++++++- src/xen/driver.c | 2 +- src/xenbus/driver.c | 19 ++----------------- src/xenfilt/driver.c | 33 +++------------------------------ 5 files changed, 35 insertions(+), 50 deletions(-) diff --git a/src/common/registry.c b/src/common/registry.c index 0d29ddc..73a55d2 100644 --- a/src/common/registry.c +++ b/src/common/registry.c @@ -38,6 +38,7 @@ #define REGISTRY_TAG 'GERX' +static PDRIVER_OBJECT DriverObject; static UNICODE_STRING RegistryPath; static FORCEINLINE PVOID @@ -58,7 +59,8 @@ __RegistryFree( NTSTATUS RegistryInitialize( - IN PUNICODE_STRING Path + IN PDRIVER_OBJECT DrvObj, + IN PUNICODE_STRING Path ) { NTSTATUS status; @@ -69,6 +71,9 @@ RegistryInitialize( if (!NT_SUCCESS(status)) goto fail1; + ASSERT3P(DriverObject, ==, NULL); + DriverObject = DrvObj; + return STATUS_SUCCESS; fail1: @@ -82,11 +87,26 @@ RegistryTeardown( VOID ) { + DriverObject = NULL; + RtlFreeUnicodeString(&RegistryPath); RegistryPath.Buffer = NULL; RegistryPath.MaximumLength = RegistryPath.Length = 0; } +NTSTATUS +RegistryOpenParametersKey( + IN ACCESS_MASK DesiredAccess, + OUT PHANDLE Key + ) +{ + return IoOpenDriverRegistryKey(DriverObject, + DriverRegKeyParameters, + DesiredAccess, + 0, + Key); +} + NTSTATUS RegistryOpenKey( IN HANDLE Parent, diff --git a/src/common/registry.h b/src/common/registry.h index cbe9015..efa96ea 100644 --- a/src/common/registry.h +++ b/src/common/registry.h @@ -37,7 +37,8 @@ extern NTSTATUS RegistryInitialize( - IN PUNICODE_STRING Path + IN PDRIVER_OBJECT DrvObj, + IN PUNICODE_STRING Path ); extern VOID @@ -45,6 +46,12 @@ RegistryTeardown( VOID ); +extern NTSTATUS +RegistryOpenParametersKey( + IN ACCESS_MASK DesiredAccess, + OUT PHANDLE Key + ); + extern NTSTATUS RegistryOpenKey( IN HANDLE Parent, diff --git a/src/xen/driver.c b/src/xen/driver.c index 8fe6c5c..e04a772 100644 --- a/src/xen/driver.c +++ b/src/xen/driver.c @@ -515,7 +515,7 @@ DllInitialize( if (!NT_SUCCESS(status)) goto fail1; - status = RegistryInitialize(RegistryPath); + status = RegistryInitialize(NULL, RegistryPath); if (!NT_SUCCESS(status)) goto fail2; diff --git a/src/xenbus/driver.c b/src/xenbus/driver.c index 522acef..d6efe89 100644 --- a/src/xenbus/driver.c +++ b/src/xenbus/driver.c @@ -811,7 +811,6 @@ DriverEntry( IN PUNICODE_STRING RegistryPath ) { - HANDLE ServiceKey; HANDLE ParametersKey; ULONG Index; LOG_LEVEL LogLevel; @@ -839,21 +838,14 @@ DriverEntry( MONTH, YEAR); - status = RegistryInitialize(RegistryPath); + status = RegistryInitialize(DriverObject, RegistryPath); if (!NT_SUCCESS(status)) goto fail1; - status = RegistryOpenServiceKey(KEY_READ, &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); status = LogReadLogLevel(ParametersKey, @@ -864,8 +856,6 @@ DriverEntry( __DriverSetConsoleLogLevel(LogLevel); - RegistryCloseKey(ServiceKey); - status = XenTouch(__MODULE__, MAJOR_VERSION, MINOR_VERSION, @@ -900,11 +890,6 @@ done: return STATUS_SUCCESS; -fail3: - Error("fail3\n"); - - RegistryCloseKey(ServiceKey); - fail2: Error("fail2\n"); diff --git a/src/xenfilt/driver.c b/src/xenfilt/driver.c index 724d418..aee663a 100644 --- a/src/xenfilt/driver.c +++ b/src/xenfilt/driver.c @@ -113,33 +113,6 @@ DriverGetDriverObject( return __DriverGetDriverObject(); } -static FORCEINLINE NTSTATUS -__DriverOpenParametersKey( - OUT PHANDLE ParametersKey - ) -{ - HANDLE ServiceKey; - NTSTATUS status; - - status = RegistryOpenServiceKey(KEY_READ, &ServiceKey); - if (!NT_SUCCESS(status)) - goto fail1; - - status = RegistryOpenSubKey(ServiceKey, "Parameters", KEY_READ, ParametersKey); - if (!NT_SUCCESS(status)) - goto fail2; - - RegistryCloseKey(ServiceKey); - - return STATUS_SUCCESS; - -fail2: - RegistryCloseKey(ServiceKey); - -fail1: - return status; -} - static FORCEINLINE VOID __DriverSetEmulatedContext( IN PXENFILT_EMULATED_CONTEXT Context @@ -247,7 +220,7 @@ __DriverGetActive( ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL); - status = __DriverOpenParametersKey(&ParametersKey); + status = RegistryOpenParametersKey(KEY_READ, &ParametersKey); if (!NT_SUCCESS(status)) goto fail1; @@ -752,7 +725,7 @@ DriverGetEmulatedType( ULONG Index; NTSTATUS status; - status = __DriverOpenParametersKey(&ParametersKey); + status = RegistryOpenParametersKey(KEY_READ, &ParametersKey); if (!NT_SUCCESS(status)) goto fail1; @@ -947,7 +920,7 @@ DriverEntry( if (!NT_SUCCESS(status)) goto done; - status = RegistryInitialize(RegistryPath); + status = RegistryInitialize(DriverObject, RegistryPath); if (!NT_SUCCESS(status)) goto fail1; -- 2.44.0.windows.1
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |