|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH 3/4 v2] SDV: ZwRegistryOpen rule violations
-----Original Message-----
From: Paul Durrant <paul@xxxxxxx>
Sent: 16 February 2022 10:45
To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx
Cc: Owen Smith <owen.smith@xxxxxxxxxx>; Paul Durrant <paul@xxxxxxx>
Subject: [PATCH 3/4 v2] SDV: ZwRegistryOpen rule violations
[CAUTION - EXTERNAL EMAIL] DO NOT reply, click links, or open attachments
unless you have verified the sender and know the content is safe.
From: Owen Smith <owen.smith@xxxxxxxxxx>
Dont hold the ParametersKey open, SDV treats this as a mismatched
ZwRegistryOpen and ZwClose pair.
Open the registry key when required, and close it once its no longer required.
Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>
Remove DriverGetParametersKey() from xenfilt/driver.h and don't add the
implementation of DriverOpenParametersKey() in xenfilt/driver.c.
Signed-off-by: Paul Durrant <paul@xxxxxxx>
I completely missed that the ParametersKey was never used, I was just fixing
SDV issues. Removing this unused code is good.
Acked-By: Owen Smith <owen.smith@xxxxxxxxxx>
---
src/xenfilt/driver.c | 101 +++++++++++++++++++------------------------
src/xenfilt/driver.h | 5 ---
2 files changed, 45 insertions(+), 61 deletions(-)
diff --git a/src/xenfilt/driver.c b/src/xenfilt/driver.c index
f131282fd795..8a8396e528b8 100644
--- a/src/xenfilt/driver.c
+++ b/src/xenfilt/driver.c
@@ -47,7 +47,6 @@
typedef struct _XENFILT_DRIVER {
PDRIVER_OBJECT DriverObject;
- HANDLE ParametersKey;
MUTEX Mutex;
LIST_ENTRY List;
@@ -113,28 +112,31 @@ DriverGetDriverObject(
return __DriverGetDriverObject();
}
-static FORCEINLINE VOID
-__DriverSetParametersKey(
- IN HANDLE Key
+static FORCEINLINE NTSTATUS
+__DriverOpenParametersKey(
+ OUT PHANDLE ParametersKey
)
{
- Driver.ParametersKey = Key;
-}
+ HANDLE ServiceKey;
+ NTSTATUS status;
-static FORCEINLINE HANDLE
-__DriverGetParametersKey(
- VOID
- )
-{
- return Driver.ParametersKey;
-}
+ status = RegistryOpenServiceKey(KEY_READ, &ServiceKey);
+ if (!NT_SUCCESS(status))
+ goto fail1;
-HANDLE
-DriverGetParametersKey(
- VOID
- )
-{
- return __DriverGetParametersKey();
+ 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
@@ -244,7 +246,9 @@ __DriverGetActive(
ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
- ParametersKey = __DriverGetParametersKey();
+ status = __DriverOpenParametersKey(&ParametersKey);
+ if (!NT_SUCCESS(status))
+ goto fail1;
status = RtlStringCbPrintfA(Name, MAXNAMELEN, "Active%s", Key);
ASSERT(NT_SUCCESS(status));
@@ -254,14 +258,14 @@ __DriverGetActive(
NULL,
&Ansi);
if (!NT_SUCCESS(status))
- goto fail1;
+ goto fail2;
Length = Ansi[0].Length + sizeof (CHAR);
*Value = __AllocatePoolWithTag(NonPagedPool, Length, 'TLIF');
status = STATUS_NO_MEMORY;
if (*Value == NULL)
- goto fail2;
+ goto fail3;
status = RtlStringCbPrintfA(*Value,
Length, @@ -271,13 +275,20 @@
__DriverGetActive(
RegistryFreeSzValue(Ansi);
+ RegistryCloseKey(ParametersKey);
+
Trace("<====\n");
return STATUS_SUCCESS;
+fail3:
+ Error("fail3\n");
+
fail2:
Error("fail2\n");
+ RegistryCloseKey(ParametersKey);
+
fail1:
if (status != STATUS_OBJECT_NAME_NOT_FOUND)
Error("fail1 (%08x)\n", status); @@ -409,8 +420,6 @@ DriverUnload(
IN PDRIVER_OBJECT DriverObject
)
{
- HANDLE ParametersKey;
-
ASSERT3P(DriverObject, ==, __DriverGetDriverObject());
Trace("====>\n");
@@ -428,10 +437,6 @@ DriverUnload(
EmulatedTeardown(Driver.EmulatedContext);
Driver.EmulatedContext = NULL;
- ParametersKey = __DriverGetParametersKey();
- __DriverSetParametersKey(NULL);
- RegistryCloseKey(ParametersKey);
-
RegistryTeardown();
Info("XENFILT %d.%d.%d (%d) (%02d.%02d.%04d)\n", @@ -744,8 +749,11 @@
DriverGetEmulatedType(
HANDLE ParametersKey;
XENFILT_EMULATED_OBJECT_TYPE Type;
ULONG Index;
+ NTSTATUS status;
- ParametersKey = __DriverGetParametersKey();
+ status = __DriverOpenParametersKey(&ParametersKey);
+ if (!NT_SUCCESS(status))
+ goto fail1;
Type = XENFILT_EMULATED_OBJECT_TYPE_UNKNOWN;
Index = 0;
@@ -753,7 +761,6 @@ DriverGetEmulatedType(
do {
ULONG Length;
PANSI_STRING Ansi;
- NTSTATUS status;
Length = (ULONG)strlen(&Id[Index]);
if (Length == 0)
@@ -779,7 +786,14 @@ DriverGetEmulatedType(
Index += Length + 1;
} while (Type == XENFILT_EMULATED_OBJECT_TYPE_UNKNOWN);
+ RegistryCloseKey(ParametersKey);
+
return Type;
+
+fail1:
+ Error("fail1 %08x\n", status);
+
+ return XENFILT_EMULATED_OBJECT_TYPE_UNKNOWN;
}
DRIVER_ADD_DEVICE DriverAddDevice;
@@ -886,8 +900,6 @@ DriverEntry(
IN PUNICODE_STRING RegistryPath
)
{
- HANDLE ServiceKey;
- HANDLE ParametersKey;
PXENFILT_EMULATED_CONTEXT EmulatedContext;
ULONG Index;
NTSTATUS status;
@@ -926,19 +938,9 @@ DriverEntry(
if (!NT_SUCCESS(status))
goto fail1;
- status = RegistryOpenServiceKey(KEY_READ, &ServiceKey);
- if (!NT_SUCCESS(status))
- goto fail2;
-
- status = RegistryOpenSubKey(ServiceKey, "Parameters", KEY_READ,
&ParametersKey);
- if (!NT_SUCCESS(status))
- goto fail3;
-
- __DriverSetParametersKey(ParametersKey);
-
status = EmulatedInitialize(&EmulatedContext);
if (!NT_SUCCESS(status))
- goto fail4;
+ goto fail2;
__DriverSetEmulatedContext(EmulatedContext);
@@ -948,8 +950,6 @@ DriverEntry(
sizeof (Driver.EmulatedInterface));
ASSERT(NT_SUCCESS(status));
- RegistryCloseKey(ServiceKey);
-
DriverObject->DriverExtension->AddDevice = DriverAddDevice;
for (Index = 0; Index <= IRP_MJ_MAXIMUM_FUNCTION; Index++) { @@ -966,17
+966,6 @@ done:
Trace("<====\n");
return STATUS_SUCCESS;
-fail4:
- Error("fail4\n");
-
- __DriverSetParametersKey(NULL);
- RegistryCloseKey(ParametersKey);
-
-fail3:
- Error("fail3\n");
-
- RegistryCloseKey(ServiceKey);
-
fail2:
Error("fail2\n");
diff --git a/src/xenfilt/driver.h b/src/xenfilt/driver.h index
286580bed8a0..6a5665d58e45 100644
--- a/src/xenfilt/driver.h
+++ b/src/xenfilt/driver.h
@@ -37,11 +37,6 @@ DriverGetDriverObject(
VOID
);
-extern HANDLE
-DriverGetParametersKey(
- VOID
- );
-
extern VOID
DriverAcquireMutex(
VOID
--
2.17.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |