|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH] Re-synchronize registry.c with XENBUS
The registry code in XENBUS has some fixes that are not present in the
XENIFACE copy, so import the updated code from XENBUS.
Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
---
src/xeniface/registry.c | 263 ++++++++++++++++++++++++++++++++++++++++++------
src/xeniface/registry.h | 41 +++++++-
2 files changed, 268 insertions(+), 36 deletions(-)
diff --git a/src/xeniface/registry.c b/src/xeniface/registry.c
index 136502c..d994e13 100644
--- a/src/xeniface/registry.c
+++ b/src/xeniface/registry.c
@@ -32,10 +32,10 @@
#include <ntddk.h>
#include "registry.h"
-#include "util.h"
#include "assert.h"
+#include "util.h"
-#define REGISTRY_POOL 'GERX'
+#define REGISTRY_TAG 'GERX'
static UNICODE_STRING RegistryPath;
@@ -44,7 +44,7 @@ __RegistryAllocate(
IN ULONG Length
)
{
- return __AllocatePoolWithTag(NonPagedPool, Length, REGISTRY_POOL);
+ return __AllocatePoolWithTag(NonPagedPool, Length, REGISTRY_TAG);
}
static FORCEINLINE VOID
@@ -52,7 +52,7 @@ __RegistryFree(
IN PVOID Buffer
)
{
- __FreePoolWithTag(Buffer, REGISTRY_POOL);
+ __FreePoolWithTag(Buffer, REGISTRY_TAG);
}
NTSTATUS
@@ -116,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
@@ -125,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,
@@ -330,6 +372,8 @@ RegistryDeleteSubKey(
ZwClose(SubKey);
+ (VOID) ZwFlushKey(Key);
+
RtlFreeUnicodeString(&Unicode);
return STATUS_SUCCESS;
@@ -347,7 +391,7 @@ fail1:
NTSTATUS
RegistryEnumerateSubKeys(
IN HANDLE Key,
- IN NTSTATUS (*Callback)(PVOID, HANDLE, PCHAR),
+ IN NTSTATUS (*Callback)(PVOID, HANDLE, PANSI_STRING),
IN PVOID Context
)
{
@@ -390,6 +434,7 @@ RegistryEnumerateSubKeys(
goto fail4;
for (Index = 0; Index < Full->SubKeys; Index++) {
+ ULONG Ignore;
UNICODE_STRING Unicode;
ANSI_STRING Ansi;
@@ -398,7 +443,7 @@ RegistryEnumerateSubKeys(
KeyBasicInformation,
Basic,
Size,
- &Size);
+ &Ignore);
if (!NT_SUCCESS(status))
goto fail5;
@@ -418,7 +463,7 @@ RegistryEnumerateSubKeys(
Ansi.Length = (USHORT)(strlen(Ansi.Buffer) * sizeof (CHAR));
- status = Callback(Context, Key, Ansi.Buffer);
+ status = Callback(Context, Key, &Ansi);
__RegistryFree(Ansi.Buffer);
Ansi.Buffer = NULL;
@@ -450,7 +495,7 @@ fail1:
NTSTATUS
RegistryEnumerateValues(
IN HANDLE Key,
- IN NTSTATUS (*Callback)(PVOID, HANDLE, PCHAR),
+ IN NTSTATUS (*Callback)(PVOID, HANDLE, PANSI_STRING,
ULONG),
IN PVOID Context
)
{
@@ -493,6 +538,7 @@ RegistryEnumerateValues(
goto fail4;
for (Index = 0; Index < Full->Values; Index++) {
+ ULONG Ignore;
UNICODE_STRING Unicode;
ANSI_STRING Ansi;
@@ -501,7 +547,7 @@ RegistryEnumerateValues(
KeyValueBasicInformation,
Basic,
Size,
- &Size);
+ &Ignore);
if (!NT_SUCCESS(status))
goto fail5;
@@ -517,7 +563,7 @@ RegistryEnumerateValues(
Ansi.Length = (USHORT)(strlen(Ansi.Buffer) * sizeof (CHAR));
- status = Callback(Context, Key, Ansi.Buffer);
+ status = Callback(Context, Key, &Ansi, Basic->Type);
__RegistryFree(Ansi.Buffer);
@@ -566,6 +612,8 @@ RegistryDeleteValue(
RtlFreeUnicodeString(&Unicode);
+ (VOID) ZwFlushKey(Key);
+
return STATUS_SUCCESS;
fail2:
@@ -686,6 +734,8 @@ RegistryUpdateDwordValue(
__RegistryFree(Partial);
+ (VOID) ZwFlushKey(Key);
+
RtlFreeUnicodeString(&Unicode);
return STATUS_SUCCESS;
@@ -806,6 +856,7 @@ NTSTATUS
RegistryQuerySzValue(
IN HANDLE Key,
IN PCHAR Name,
+ OUT PULONG Type OPTIONAL,
OUT PANSI_STRING *Array
)
{
@@ -867,6 +918,9 @@ RegistryQuerySzValue(
if (*Array == NULL)
goto fail5;
+ if (Type != NULL)
+ *Type = Value->Type;
+
__RegistryFree(Value);
RtlFreeUnicodeString(&Unicode);
@@ -886,6 +940,150 @@ fail1:
}
NTSTATUS
+RegistryQueryBinaryValue(
+ IN HANDLE Key,
+ IN PCHAR Name,
+ OUT PVOID *Buffer,
+ OUT PULONG Length
+ )
+{
+ ANSI_STRING Ansi;
+ UNICODE_STRING Unicode;
+ PKEY_VALUE_PARTIAL_INFORMATION Partial;
+ ULONG Size;
+ NTSTATUS status;
+
+ RtlInitAnsiString(&Ansi, Name);
+
+ status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi, TRUE);
+ if (!NT_SUCCESS(status))
+ goto fail1;
+
+ status = ZwQueryValueKey(Key,
+ &Unicode,
+ KeyValuePartialInformation,
+ NULL,
+ 0,
+ &Size);
+ if (status != STATUS_BUFFER_OVERFLOW &&
+ status != STATUS_BUFFER_TOO_SMALL)
+ goto fail2;
+
+#pragma prefast(suppress:6102)
+ Partial = __RegistryAllocate(Size);
+
+ status = STATUS_NO_MEMORY;
+ if (Partial == NULL)
+ goto fail3;
+
+ status = ZwQueryValueKey(Key,
+ &Unicode,
+ KeyValuePartialInformation,
+ Partial,
+ Size,
+ &Size);
+ if (!NT_SUCCESS(status))
+ goto fail4;
+
+ switch (Partial->Type) {
+ case REG_BINARY:
+ *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 (*Buffer == NULL)
+ goto fail5;
+
+ __RegistryFree(Partial);
+
+ RtlFreeUnicodeString(&Unicode);
+
+ return STATUS_SUCCESS;
+
+fail5:
+fail4:
+ __RegistryFree(Partial);
+
+fail3:
+fail2:
+ RtlFreeUnicodeString(&Unicode);
+
+fail1:
+ return status;
+}
+
+NTSTATUS
+RegistryUpdateBinaryValue(
+ IN HANDLE Key,
+ IN PCHAR Name,
+ IN PVOID Buffer,
+ IN ULONG Length
+ )
+{
+ ANSI_STRING Ansi;
+ UNICODE_STRING Unicode;
+ PKEY_VALUE_PARTIAL_INFORMATION Partial;
+ NTSTATUS status;
+
+ RtlInitAnsiString(&Ansi, Name);
+
+ status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi, TRUE);
+ if (!NT_SUCCESS(status))
+ goto fail1;
+
+ Partial = __RegistryAllocate(FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION,
Data) +
+ Length);
+
+ status = STATUS_NO_MEMORY;
+ if (Partial == NULL)
+ goto fail2;
+
+ Partial->TitleIndex = 0;
+ Partial->Type = REG_BINARY;
+ Partial->DataLength = Length;
+ RtlCopyMemory(Partial->Data, Buffer, Partial->DataLength);
+
+ status = ZwSetValueKey(Key,
+ &Unicode,
+ Partial->TitleIndex,
+ Partial->Type,
+ Partial->Data,
+ Partial->DataLength);
+ if (!NT_SUCCESS(status))
+ goto fail3;
+
+ __RegistryFree(Partial);
+
+ (VOID) ZwFlushKey(Key);
+
+ RtlFreeUnicodeString(&Unicode);
+
+ return STATUS_SUCCESS;
+
+fail3:
+ __RegistryFree(Partial);
+
+fail2:
+ RtlFreeUnicodeString(&Unicode);
+
+fail1:
+
+ return status;
+}
+
+NTSTATUS
RegistryQueryKeyName(
IN HANDLE Key,
OUT PANSI_STRING *Array
@@ -960,7 +1158,7 @@ RegistryQuerySystemStartOption(
if (!NT_SUCCESS(status))
goto fail1;
- status = RegistryQuerySzValue(Key, "SystemStartOptions", &Ansi);
+ status = RegistryQuerySzValue(Key, "SystemStartOptions", NULL, &Ansi);
if (!NT_SUCCESS(status))
goto fail2;
@@ -969,13 +1167,13 @@ RegistryQuerySystemStartOption(
Length = (ULONG)strlen(Prefix);
Option = __strtok_r(Ansi[0].Buffer, " ", &Context);
- if (strncmp(Prefix, Option, Length) == 0)
- goto found;
-
- while ((Option = __strtok_r(NULL, " ", &Context)) != NULL)
+ while (Option != NULL) {
if (strncmp(Prefix, Option, Length) == 0)
goto found;
+ Option = __strtok_r(NULL, " ", &Context);
+ }
+
status = STATUS_OBJECT_NAME_NOT_FOUND;
goto fail3;
@@ -1115,12 +1313,11 @@ RegistryUpdateSzValue(
IN HANDLE Key,
IN PCHAR Name,
IN ULONG Type,
- ...
+ IN PANSI_STRING Array
)
{
ANSI_STRING Ansi;
UNICODE_STRING Unicode;
- va_list Arguments;
PKEY_VALUE_PARTIAL_INFORMATION Partial;
NTSTATUS status;
@@ -1129,33 +1326,23 @@ RegistryUpdateSzValue(
status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi, TRUE);
if (!NT_SUCCESS(status))
goto fail1;
-
- va_start(Arguments, Type);
- switch (Type) {
- case REG_SZ: {
- PANSI_STRING Argument;
-
- Argument = va_arg(Arguments, PANSI_STRING);
+ switch (Type) {
+ case REG_SZ:
status = STATUS_NO_MEMORY;
- Partial = RegistryAnsiToSz(Argument);
+ Partial = RegistryAnsiToSz(Array);
break;
- }
- case REG_MULTI_SZ: {
- PANSI_STRING Argument;
-
- Argument = va_arg(Arguments, PANSI_STRING);
+ case REG_MULTI_SZ:
status = STATUS_NO_MEMORY;
- Partial = RegistryAnsiToMultiSz(Argument);
+ Partial = RegistryAnsiToMultiSz(Array);
break;
- }
+
default:
status = STATUS_INVALID_PARAMETER;
Partial = NULL;
break;
}
- va_end(Arguments);
if (Partial == NULL)
goto fail2;
@@ -1171,6 +1358,8 @@ RegistryUpdateSzValue(
__RegistryFree(Partial);
+ (VOID) ZwFlushKey(Key);
+
RtlFreeUnicodeString(&Unicode);
return STATUS_SUCCESS;
@@ -1202,6 +1391,14 @@ RegistryFreeSzValue(
}
VOID
+RegistryFreeBinaryValue(
+ IN PVOID Buffer
+ )
+{
+ __RegistryFree(Buffer);
+}
+
+VOID
RegistryCloseKey(
IN HANDLE Key
)
diff --git a/src/xeniface/registry.h b/src/xeniface/registry.h
index 7a89804..92aa7b6 100644
--- a/src/xeniface/registry.h
+++ b/src/xeniface/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,
@@ -97,14 +110,14 @@ RegistryDeleteSubKey(
extern NTSTATUS
RegistryEnumerateSubKeys(
IN HANDLE Key,
- IN NTSTATUS (*Callback)(PVOID, HANDLE, PCHAR),
+ IN NTSTATUS (*Callback)(PVOID, HANDLE, PANSI_STRING),
IN PVOID Context
);
extern NTSTATUS
RegistryEnumerateValues(
IN HANDLE Key,
- IN NTSTATUS (*Callback)(PVOID, HANDLE, PCHAR),
+ IN NTSTATUS (*Callback)(PVOID, HANDLE, PANSI_STRING, ULONG),
IN PVOID Context
);
@@ -132,10 +145,27 @@ extern NTSTATUS
RegistryQuerySzValue(
IN HANDLE Key,
IN PCHAR Name,
+ OUT PULONG Type OPTIONAL,
OUT PANSI_STRING *Array
);
extern NTSTATUS
+RegistryQueryBinaryValue(
+ IN HANDLE Key,
+ IN PCHAR Name,
+ OUT PVOID *Buffer,
+ OUT PULONG Length
+ );
+
+extern NTSTATUS
+RegistryUpdateBinaryValue(
+ IN HANDLE Key,
+ IN PCHAR Name,
+ IN PVOID Buffer,
+ IN ULONG Length
+ );
+
+extern NTSTATUS
RegistryQueryKeyName(
IN HANDLE Key,
OUT PANSI_STRING *Array
@@ -152,12 +182,17 @@ RegistryFreeSzValue(
IN PANSI_STRING Array
);
+extern VOID
+RegistryFreeBinaryValue(
+ IN PVOID Buffer
+ );
+
extern NTSTATUS
RegistryUpdateSzValue(
IN HANDLE Key,
IN PCHAR Name,
IN ULONG Type,
- ...
+ IN PANSI_STRING Array
);
extern VOID
--
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 |