|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 2/2] Re-synchrinize registry.c with XENBUS
The registry code in XENBUS has some fixes that are not present in the
XENVIF copy, so import the updated code from XENBUS.
Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
---
src/xenvif/registry.c | 79 +++++++++++++++++++++++++++++++++++++++------------
src/xenvif/registry.h | 13 +++++++++
2 files changed, 74 insertions(+), 18 deletions(-)
diff --git a/src/xenvif/registry.c b/src/xenvif/registry.c
index 9a7472b..d994e13 100644
--- a/src/xenvif/registry.c
+++ b/src/xenvif/registry.c
@@ -30,13 +30,12 @@
*/
#include <ntddk.h>
-#include <stdlib.h>
#include "registry.h"
#include "assert.h"
#include "util.h"
-#define REGISTRY_POOL 'GERX'
+#define REGISTRY_TAG 'GERX'
static UNICODE_STRING RegistryPath;
@@ -45,7 +44,7 @@ __RegistryAllocate(
IN ULONG Length
)
{
- return __AllocatePoolWithTag(NonPagedPool, Length, REGISTRY_POOL);
+ return __AllocatePoolWithTag(NonPagedPool, Length, REGISTRY_TAG);
}
static FORCEINLINE VOID
@@ -53,7 +52,7 @@ __RegistryFree(
IN PVOID Buffer
)
{
- __FreePoolWithTag(Buffer, REGISTRY_POOL);
+ __FreePoolWithTag(Buffer, REGISTRY_TAG);
}
NTSTATUS
@@ -117,6 +116,40 @@ fail1:
}
NTSTATUS
+RegistryCreateKey(
+ IN HANDLE Parent,
+ IN PUNICODE_STRING Path,
+ IN ULONG Options,
+ OUT PHANDLE Key
+ )
+{
+ OBJECT_ATTRIBUTES Attributes;
+ NTSTATUS status;
+
+ InitializeObjectAttributes(&Attributes,
+ Path,
+ OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
+ Parent,
+ NULL);
+
+ status = ZwCreateKey(Key,
+ KEY_ALL_ACCESS,
+ &Attributes,
+ 0,
+ NULL,
+ Options,
+ NULL
+ );
+ if (!NT_SUCCESS(status))
+ goto fail1;
+
+ return STATUS_SUCCESS;
+
+fail1:
+ return status;
+}
+
+NTSTATUS
RegistryOpenServiceKey(
IN ACCESS_MASK DesiredAccess,
OUT PHANDLE Key
@@ -126,6 +159,14 @@ RegistryOpenServiceKey(
}
NTSTATUS
+RegistryCreateServiceKey(
+ OUT PHANDLE Key
+ )
+{
+ return RegistryCreateKey(NULL, &RegistryPath, REG_OPTION_NON_VOLATILE,
Key);
+}
+
+NTSTATUS
RegistryOpenSoftwareKey(
IN PDEVICE_OBJECT DeviceObject,
IN ACCESS_MASK DesiredAccess,
@@ -331,6 +372,8 @@ RegistryDeleteSubKey(
ZwClose(SubKey);
+ (VOID) ZwFlushKey(Key);
+
RtlFreeUnicodeString(&Unicode);
return STATUS_SUCCESS;
@@ -569,6 +612,8 @@ RegistryDeleteValue(
RtlFreeUnicodeString(&Unicode);
+ (VOID) ZwFlushKey(Key);
+
return STATUS_SUCCESS;
fail2:
@@ -689,6 +734,8 @@ RegistryUpdateDwordValue(
__RegistryFree(Partial);
+ (VOID) ZwFlushKey(Key);
+
RtlFreeUnicodeString(&Unicode);
return STATUS_SUCCESS;
@@ -938,30 +985,25 @@ RegistryQueryBinaryValue(
if (!NT_SUCCESS(status))
goto fail4;
- *Buffer = NULL;
-
switch (Partial->Type) {
case REG_BINARY:
- *Length = Partial->DataLength;
-
- if (*Length == 0)
- break;
-
*Buffer = __RegistryAllocate(Partial->DataLength);
status = STATUS_NO_MEMORY;
if (*Buffer == NULL)
break;
+ *Length = Partial->DataLength;
RtlCopyMemory(*Buffer, Partial->Data, Partial->DataLength);
break;
default:
status = STATUS_INVALID_PARAMETER;
+ *Buffer = NULL;
break;
}
- if (!NT_SUCCESS(status))
+ if (*Buffer == NULL)
goto fail5;
__RegistryFree(Partial);
@@ -1002,7 +1044,7 @@ RegistryUpdateBinaryValue(
goto fail1;
Partial = __RegistryAllocate(FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION,
Data) +
- __min(Length, 1));
+ Length);
status = STATUS_NO_MEMORY;
if (Partial == NULL)
@@ -1010,11 +1052,8 @@ RegistryUpdateBinaryValue(
Partial->TitleIndex = 0;
Partial->Type = REG_BINARY;
-
- if (Length != 0) {
- Partial->DataLength = Length;
- RtlCopyMemory(Partial->Data, Buffer, Partial->DataLength);
- }
+ Partial->DataLength = Length;
+ RtlCopyMemory(Partial->Data, Buffer, Partial->DataLength);
status = ZwSetValueKey(Key,
&Unicode,
@@ -1027,6 +1066,8 @@ RegistryUpdateBinaryValue(
__RegistryFree(Partial);
+ (VOID) ZwFlushKey(Key);
+
RtlFreeUnicodeString(&Unicode);
return STATUS_SUCCESS;
@@ -1317,6 +1358,8 @@ RegistryUpdateSzValue(
__RegistryFree(Partial);
+ (VOID) ZwFlushKey(Key);
+
RtlFreeUnicodeString(&Unicode);
return STATUS_SUCCESS;
diff --git a/src/xenvif/registry.h b/src/xenvif/registry.h
index e39ccb5..faa6c71 100644
--- a/src/xenvif/registry.h
+++ b/src/xenvif/registry.h
@@ -53,12 +53,25 @@ RegistryOpenKey(
);
extern NTSTATUS
+RegistryCreateKey(
+ IN HANDLE Parent,
+ IN PUNICODE_STRING Path,
+ IN ULONG Options,
+ OUT PHANDLE Key
+ );
+
+extern NTSTATUS
RegistryOpenServiceKey(
IN ACCESS_MASK DesiredAccess,
OUT PHANDLE Key
);
extern NTSTATUS
+RegistryCreateServiceKey(
+ OUT PHANDLE Key
+ );
+
+extern NTSTATUS
RegistryOpenSoftwareKey(
IN PDEVICE_OBJECT DeviceObject,
IN ACCESS_MASK DesiredAccess,
--
2.1.1
_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |