|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [XENCONS PATCH 02/11] Sync Registry implementation with Xenbus
Use IoOpenDriverRegistryKey to open registry keys.
Signed-off-by: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>
---
src/xencons/driver.c | 2 +-
src/xencons/registry.c | 348 +++++++++++++++++++++++++++++------------
src/xencons/registry.h | 144 +++++++++--------
3 files changed, 328 insertions(+), 166 deletions(-)
diff --git a/src/xencons/driver.c b/src/xencons/driver.c
index 76a04f9..01836ee 100644
--- a/src/xencons/driver.c
+++ b/src/xencons/driver.c
@@ -271,7 +271,7 @@ DriverEntry(
MONTH,
YEAR);
- status = RegistryInitialize(RegistryPath);
+ status = RegistryInitialize(DriverObject, RegistryPath);
if (!NT_SUCCESS(status))
goto fail1;
diff --git a/src/xencons/registry.c b/src/xencons/registry.c
index 3e0f3b0..1f7a73c 100644
--- a/src/xencons/registry.c
+++ b/src/xencons/registry.c
@@ -38,11 +38,16 @@
#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
+ _In_ ULONG Length
)
{
return __AllocatePoolWithTag(NonPagedPool, Length, REGISTRY_TAG);
@@ -50,17 +55,21 @@ __RegistryAllocate(
static FORCEINLINE VOID
__RegistryFree(
- IN PVOID Buffer
+ _In_ PVOID Buffer
)
{
__FreePoolWithTag(Buffer, REGISTRY_TAG);
}
NTSTATUS
+#pragma prefast(suppress:28101) // unannotated DriverEntry function
RegistryInitialize(
- IN PUNICODE_STRING Path
+ _In_opt_ PDRIVER_OBJECT DriverObject,
+ _In_ PUNICODE_STRING Path
)
{
+ UNICODE_STRING Unicode;
+ PVOID Func;
NTSTATUS status;
ASSERT3P(RegistryPath.Buffer, ==, NULL);
@@ -69,6 +78,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,17 +101,69 @@ RegistryTeardown(
VOID
)
{
+ __IoOpenDriverRegistryKey = NULL;
+
+ RegistryDriverObject = NULL;
+
RtlFreeUnicodeString(&RegistryPath);
RegistryPath.Buffer = NULL;
RegistryPath.MaximumLength = RegistryPath.Length = 0;
}
+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
RegistryOpenKey(
- IN HANDLE Parent,
- IN PUNICODE_STRING Path,
- IN ACCESS_MASK DesiredAccess,
- OUT PHANDLE Key
+ _In_opt_ HANDLE Parent,
+ _In_ PUNICODE_STRING Path,
+ _In_ ACCESS_MASK DesiredAccess,
+ _Out_ PHANDLE Key
)
{
OBJECT_ATTRIBUTES Attributes;
@@ -118,15 +189,15 @@ fail1:
static NTSTATUS
RegistryOpenRoot(
- IN PWCHAR Path,
- OUT PHANDLE Parent,
- OUT PWCHAR *ChildPath
+ _In_ PWSTR Path,
+ _Out_ PHANDLE Parent,
+ _Outptr_result_z_ PWSTR *ChildPath
)
{
- const WCHAR Prefix[] = L"\\Registry\\Machine\\";
- ULONG Length;
- UNICODE_STRING Unicode;
- NTSTATUS status;
+ PCWSTR Prefix = L"\\Registry\\Machine\\";
+ ULONG Length;
+ UNICODE_STRING Unicode;
+ NTSTATUS status;
Length = (ULONG)wcslen(Prefix);
@@ -151,17 +222,17 @@ fail1:
NTSTATUS
RegistryCreateKey(
- IN HANDLE Parent,
- IN PUNICODE_STRING Path,
- IN ULONG Options,
- OUT PHANDLE Key
+ _In_opt_ HANDLE Parent,
+ _In_ PUNICODE_STRING Path,
+ _In_ ULONG Options,
+ _Out_ PHANDLE Key
)
{
- PWCHAR Buffer;
+ PWSTR Buffer;
HANDLE Root;
- PWCHAR ChildPath;
- PWCHAR ChildName;
- PWCHAR Context;
+ PWSTR ChildPath;
+ PWSTR ChildName;
+ PWSTR Context;
HANDLE Child;
NTSTATUS status;
@@ -251,8 +322,8 @@ fail1:
NTSTATUS
RegistryOpenServiceKey(
- IN ACCESS_MASK DesiredAccess,
- OUT PHANDLE Key
+ _In_ ACCESS_MASK DesiredAccess,
+ _Out_ PHANDLE Key
)
{
return RegistryOpenKey(NULL, &RegistryPath, DesiredAccess, Key);
@@ -260,7 +331,7 @@ RegistryOpenServiceKey(
NTSTATUS
RegistryCreateServiceKey(
- OUT PHANDLE Key
+ _Out_ PHANDLE Key
)
{
return RegistryCreateKey(NULL, &RegistryPath, REG_OPTION_NON_VOLATILE,
Key);
@@ -268,9 +339,9 @@ RegistryCreateServiceKey(
NTSTATUS
RegistryOpenSoftwareKey(
- IN PDEVICE_OBJECT DeviceObject,
- IN ACCESS_MASK DesiredAccess,
- OUT PHANDLE Key
+ _In_ PDEVICE_OBJECT DeviceObject,
+ _In_ ACCESS_MASK DesiredAccess,
+ _Out_ PHANDLE Key
)
{
NTSTATUS status;
@@ -290,15 +361,15 @@ fail1:
NTSTATUS
RegistryOpenHardwareKey(
- IN PDEVICE_OBJECT DeviceObject,
- IN ACCESS_MASK DesiredAccess,
- OUT PHANDLE Key
+ _In_ PDEVICE_OBJECT DeviceObject,
+ _In_ ACCESS_MASK DesiredAccess,
+ _Out_ PHANDLE Key
)
{
HANDLE SubKey;
ULONG Length;
PKEY_NAME_INFORMATION Info;
- PWCHAR Cursor;
+ PWSTR Cursor;
UNICODE_STRING Unicode;
NTSTATUS status;
@@ -315,11 +386,11 @@ RegistryOpenHardwareKey(
NULL,
0,
&Length);
- if (status != STATUS_BUFFER_OVERFLOW &&
+ if (!NT_SUCCESS(status) &&
+ status != STATUS_BUFFER_OVERFLOW &&
status != STATUS_BUFFER_TOO_SMALL)
goto fail2;
-#pragma prefast(suppress:6102)
Info = __RegistryAllocate(Length + sizeof (WCHAR));
status = STATUS_NO_MEMORY;
@@ -367,10 +438,10 @@ fail1:
NTSTATUS
RegistryOpenSubKey(
- IN PHANDLE Key,
- IN PCHAR Name,
- IN ACCESS_MASK DesiredAccess,
- OUT PHANDLE SubKey
+ _In_opt_ PHANDLE Key,
+ _In_ PSTR Name,
+ _In_ ACCESS_MASK DesiredAccess,
+ _Out_ PHANDLE SubKey
)
{
ANSI_STRING Ansi;
@@ -400,10 +471,10 @@ fail1:
NTSTATUS
RegistryCreateSubKey(
- IN PHANDLE Key,
- IN PCHAR Name,
- IN ULONG Options,
- OUT PHANDLE SubKey
+ _In_opt_ HANDLE Key,
+ _In_ PSTR Name,
+ _In_ ULONG Options,
+ _Out_ PHANDLE SubKey
)
{
ANSI_STRING Ansi;
@@ -433,8 +504,8 @@ fail1:
NTSTATUS
RegistryDeleteSubKey(
- IN PHANDLE Key,
- IN PCHAR Name
+ _In_ PHANDLE Key,
+ _In_ PSTR Name
)
{
ANSI_STRING Ansi;
@@ -474,9 +545,9 @@ fail1:
NTSTATUS
RegistryEnumerateSubKeys(
- IN HANDLE Key,
- IN NTSTATUS (*Callback)(PVOID, HANDLE, PANSI_STRING),
- IN PVOID Context
+ _In_ HANDLE Key,
+ _In_ NTSTATUS (*Callback)(PVOID, HANDLE, PANSI_STRING),
+ _In_ PVOID Context
)
{
ULONG Size;
@@ -494,7 +565,6 @@ RegistryEnumerateSubKeys(
status != STATUS_BUFFER_TOO_SMALL)
goto fail1;
-#pragma prefast(suppress:6102)
Full = __RegistryAllocate(Size);
status = STATUS_NO_MEMORY;
@@ -578,9 +648,9 @@ fail1:
NTSTATUS
RegistryEnumerateValues(
- IN HANDLE Key,
- IN NTSTATUS (*Callback)(PVOID, HANDLE, PANSI_STRING,
ULONG),
- IN PVOID Context
+ _In_ HANDLE Key,
+ _In_ NTSTATUS (*Callback)(PVOID, HANDLE, PANSI_STRING,
ULONG),
+ _In_ PVOID Context
)
{
ULONG Size;
@@ -598,7 +668,6 @@ RegistryEnumerateValues(
status != STATUS_BUFFER_TOO_SMALL)
goto fail1;
-#pragma prefast(suppress:6102)
Full = __RegistryAllocate(Size);
status = STATUS_NO_MEMORY;
@@ -642,8 +711,15 @@ RegistryEnumerateValues(
Ansi.MaximumLength = (USHORT)((Basic->NameLength / sizeof (WCHAR)) +
sizeof (CHAR));
Ansi.Buffer = __RegistryAllocate(Ansi.MaximumLength);
+ status = STATUS_NO_MEMORY;
+ if (Ansi.Buffer == NULL)
+ goto fail6;
+
status = RtlUnicodeStringToAnsiString(&Ansi, &Unicode, FALSE);
- ASSERT(NT_SUCCESS(status));
+ if (!NT_SUCCESS(status)) {
+ __RegistryFree(Ansi.Buffer);
+ goto fail7;
+ }
Ansi.Length = (USHORT)(strlen(Ansi.Buffer) * sizeof (CHAR));
@@ -652,7 +728,7 @@ RegistryEnumerateValues(
__RegistryFree(Ansi.Buffer);
if (!NT_SUCCESS(status))
- goto fail6;
+ goto fail8;
}
__RegistryFree(Basic);
@@ -661,6 +737,8 @@ RegistryEnumerateValues(
return STATUS_SUCCESS;
+fail8:
+fail7:
fail6:
fail5:
__RegistryFree(Basic);
@@ -676,8 +754,8 @@ fail1:
NTSTATUS
RegistryDeleteValue(
- IN PHANDLE Key,
- IN PCHAR Name
+ _In_ PHANDLE Key,
+ _In_ PSTR Name
)
{
ANSI_STRING Ansi;
@@ -707,9 +785,9 @@ fail1:
NTSTATUS
RegistryQueryDwordValue(
- IN HANDLE Key,
- IN PCHAR Name,
- OUT PULONG Value
+ _In_ HANDLE Key,
+ _In_ PSTR Name,
+ _Out_ PULONG Value
)
{
ANSI_STRING Ansi;
@@ -730,11 +808,11 @@ RegistryQueryDwordValue(
NULL,
0,
&Size);
- if (status != STATUS_BUFFER_OVERFLOW &&
+ if (!NT_SUCCESS(status) &&
+ status != STATUS_BUFFER_OVERFLOW &&
status != STATUS_BUFFER_TOO_SMALL)
goto fail2;
-#pragma prefast(suppress:6102)
Partial = __RegistryAllocate(Size);
status = STATUS_NO_MEMORY;
@@ -775,11 +853,81 @@ fail1:
return status;
}
+NTSTATUS
+RegistryQueryQwordValue(
+ _In_ HANDLE Key,
+ _In_ PSTR Name,
+ _Out_ PULONGLONG Value
+ )
+{
+ 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 (!NT_SUCCESS(status) &&
+ status != STATUS_BUFFER_OVERFLOW &&
+ status != STATUS_BUFFER_TOO_SMALL)
+ goto fail2;
+
+ 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;
+
+ status = STATUS_INVALID_PARAMETER;
+ if (Partial->Type != REG_QWORD ||
+ Partial->DataLength != sizeof (ULONGLONG))
+ goto fail5;
+
+ *Value = *(PULONGLONG)Partial->Data;
+
+ __RegistryFree(Partial);
+
+ RtlFreeUnicodeString(&Unicode);
+
+ return STATUS_SUCCESS;
+
+fail5:
+fail4:
+ __RegistryFree(Partial);
+
+fail3:
+fail2:
+ RtlFreeUnicodeString(&Unicode);
+
+fail1:
+ return status;
+}
+
NTSTATUS
RegistryUpdateDwordValue(
- IN HANDLE Key,
- IN PCHAR Name,
- IN ULONG Value
+ _In_ HANDLE Key,
+ _In_ PSTR Name,
+ _In_ ULONG Value
)
{
ANSI_STRING Ansi;
@@ -833,7 +981,7 @@ fail1:
static PANSI_STRING
RegistrySzToAnsi(
- IN PWCHAR Buffer
+ _In_ PWSTR Buffer
)
{
PANSI_STRING Ansi;
@@ -872,7 +1020,7 @@ fail1:
static PANSI_STRING
RegistryMultiSzToAnsi(
- IN PWCHAR Buffer
+ _In_ PWSTR Buffer
)
{
PANSI_STRING Ansi;
@@ -934,10 +1082,10 @@ fail1:
NTSTATUS
RegistryQuerySzValue(
- IN HANDLE Key,
- IN PCHAR Name,
- OUT PULONG Type OPTIONAL,
- OUT PANSI_STRING *Array
+ _In_ HANDLE Key,
+ _In_ PSTR Name,
+ _Out_opt_ PULONG Type,
+ _Outptr_ PANSI_STRING *Array
)
{
ANSI_STRING Ansi;
@@ -958,11 +1106,11 @@ RegistryQuerySzValue(
NULL,
0,
&Size);
- if (status != STATUS_BUFFER_OVERFLOW &&
+ if (!NT_SUCCESS(status) &&
+ status != STATUS_BUFFER_OVERFLOW &&
status != STATUS_BUFFER_TOO_SMALL)
goto fail2;
-#pragma prefast(suppress:6102)
Value = __RegistryAllocate(Size);
status = STATUS_NO_MEMORY;
@@ -981,12 +1129,12 @@ RegistryQuerySzValue(
switch (Value->Type) {
case REG_SZ:
status = STATUS_NO_MEMORY;
- *Array = RegistrySzToAnsi((PWCHAR)Value->Data);
+ *Array = RegistrySzToAnsi((PWSTR)Value->Data);
break;
case REG_MULTI_SZ:
status = STATUS_NO_MEMORY;
- *Array = RegistryMultiSzToAnsi((PWCHAR)Value->Data);
+ *Array = RegistryMultiSzToAnsi((PWSTR)Value->Data);
break;
default:
@@ -1021,10 +1169,10 @@ fail1:
NTSTATUS
RegistryQueryBinaryValue(
- IN HANDLE Key,
- IN PCHAR Name,
- OUT PVOID *Buffer,
- OUT PULONG Length
+ _In_ HANDLE Key,
+ _In_ PSTR Name,
+ _Outptr_ PVOID *Buffer,
+ _Out_ PULONG Length
)
{
ANSI_STRING Ansi;
@@ -1045,11 +1193,11 @@ RegistryQueryBinaryValue(
NULL,
0,
&Size);
- if (status != STATUS_BUFFER_OVERFLOW &&
+ if (!NT_SUCCESS(status) &&
+ status != STATUS_BUFFER_OVERFLOW &&
status != STATUS_BUFFER_TOO_SMALL)
goto fail2;
-#pragma prefast(suppress:6102)
Partial = __RegistryAllocate(Size);
status = STATUS_NO_MEMORY;
@@ -1106,10 +1254,10 @@ fail1:
NTSTATUS
RegistryUpdateBinaryValue(
- IN HANDLE Key,
- IN PCHAR Name,
- IN PVOID Buffer,
- IN ULONG Length
+ _In_ HANDLE Key,
+ _In_ PSTR Name,
+ _In_ PVOID Buffer,
+ _In_ ULONG Length
)
{
ANSI_STRING Ansi;
@@ -1163,8 +1311,8 @@ fail1:
NTSTATUS
RegistryQueryKeyName(
- IN HANDLE Key,
- OUT PANSI_STRING *Array
+ _In_ HANDLE Key,
+ _Outptr_ PANSI_STRING *Array
)
{
PKEY_NAME_INFORMATION Value;
@@ -1176,12 +1324,12 @@ RegistryQueryKeyName(
NULL,
0,
&Size);
- if (status != STATUS_BUFFER_OVERFLOW &&
+ if (!NT_SUCCESS(status) &&
+ status != STATUS_BUFFER_OVERFLOW &&
status != STATUS_BUFFER_TOO_SMALL)
goto fail1;
// Name information is not intrinsically NULL terminated
-#pragma prefast(suppress:6102)
Value = __RegistryAllocate(Size + sizeof (WCHAR));
status = STATUS_NO_MEMORY;
@@ -1197,7 +1345,7 @@ RegistryQueryKeyName(
goto fail3;
Value->Name[Value->NameLength / sizeof (WCHAR)] = L'\0';
- *Array = RegistrySzToAnsi((PWCHAR)Value->Name);
+ *Array = RegistrySzToAnsi((PWSTR)Value->Name);
status = STATUS_NO_MEMORY;
if (*Array == NULL)
@@ -1218,16 +1366,16 @@ fail1:
NTSTATUS
RegistryQuerySystemStartOption(
- IN PCHAR Prefix,
- OUT PANSI_STRING *Value
+ _In_ PSTR Prefix,
+ _Outptr_ PANSI_STRING *Value
)
{
UNICODE_STRING Unicode;
HANDLE Key;
PANSI_STRING Ansi;
ULONG Length;
- PCHAR Option;
- PCHAR Context;
+ PSTR Option;
+ PSTR Context;
NTSTATUS status;
RtlInitUnicodeString(&Unicode,
L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control");
@@ -1388,10 +1536,10 @@ fail1:
NTSTATUS
RegistryUpdateSzValue(
- IN HANDLE Key,
- IN PCHAR Name,
- IN ULONG Type,
- IN PANSI_STRING Array
+ _In_ HANDLE Key,
+ _In_ PSTR Name,
+ _In_ ULONG Type,
+ _In_ PANSI_STRING Array
)
{
ANSI_STRING Ansi;
@@ -1452,7 +1600,7 @@ fail1:
VOID
RegistryFreeSzValue(
- IN PANSI_STRING Array
+ _In_ PANSI_STRING Array
)
{
ULONG Index;
@@ -1468,7 +1616,7 @@ RegistryFreeSzValue(
VOID
RegistryFreeBinaryValue(
- IN PVOID Buffer
+ _In_ PVOID Buffer
)
{
__RegistryFree(Buffer);
@@ -1476,7 +1624,7 @@ RegistryFreeBinaryValue(
VOID
RegistryCloseKey(
- IN HANDLE Key
+ _In_ HANDLE Key
)
{
ZwClose(Key);
diff --git a/src/xencons/registry.h b/src/xencons/registry.h
index 05bec85..170445b 100644
--- a/src/xencons/registry.h
+++ b/src/xencons/registry.h
@@ -37,7 +37,8 @@
extern NTSTATUS
RegistryInitialize(
- IN PUNICODE_STRING Path
+ _In_opt_ PDRIVER_OBJECT DrvObj,
+ _In_ PUNICODE_STRING Path
);
extern VOID
@@ -45,160 +46,173 @@ RegistryTeardown(
VOID
);
+extern NTSTATUS
+RegistryOpenParametersKey(
+ _In_ ACCESS_MASK DesiredAccess,
+ _Out_ PHANDLE Key
+ );
+
extern NTSTATUS
RegistryOpenKey(
- IN HANDLE Parent,
- IN PUNICODE_STRING Path,
- IN ACCESS_MASK DesiredAccess,
- OUT PHANDLE Key
+ _In_opt_ HANDLE Parent,
+ _In_ PUNICODE_STRING Path,
+ _In_ ACCESS_MASK DesiredAccess,
+ _Out_ PHANDLE Key
);
extern NTSTATUS
RegistryCreateKey(
- IN HANDLE Parent,
- IN PUNICODE_STRING Path,
- IN ULONG Options,
- OUT PHANDLE Key
+ _In_opt_ HANDLE Parent,
+ _In_ PUNICODE_STRING Path,
+ _In_ ULONG Options,
+ _Out_ PHANDLE Key
);
extern NTSTATUS
RegistryOpenServiceKey(
- IN ACCESS_MASK DesiredAccess,
- OUT PHANDLE Key
+ _In_ ACCESS_MASK DesiredAccess,
+ _Out_ PHANDLE Key
);
extern NTSTATUS
RegistryCreateServiceKey(
- OUT PHANDLE Key
+ _Out_ PHANDLE Key
);
extern NTSTATUS
RegistryOpenSoftwareKey(
- IN PDEVICE_OBJECT DeviceObject,
- IN ACCESS_MASK DesiredAccess,
- OUT PHANDLE Key
+ _In_ PDEVICE_OBJECT DeviceObject,
+ _In_ ACCESS_MASK DesiredAccess,
+ _Out_ PHANDLE Key
);
extern NTSTATUS
RegistryOpenHardwareKey(
- IN PDEVICE_OBJECT DeviceObject,
- IN ACCESS_MASK DesiredAccess,
- OUT PHANDLE Key
+ _In_ PDEVICE_OBJECT DeviceObject,
+ _In_ ACCESS_MASK DesiredAccess,
+ _Out_ PHANDLE Key
);
extern NTSTATUS
RegistryOpenSubKey(
- IN HANDLE Key,
- IN PCHAR Name,
- IN ACCESS_MASK DesiredAccess,
- OUT PHANDLE SubKey
+ _In_opt_ HANDLE Key,
+ _In_ PSTR Name,
+ _In_ ACCESS_MASK DesiredAccess,
+ _Out_ PHANDLE SubKey
);
extern NTSTATUS
RegistryCreateSubKey(
- IN HANDLE Key,
- IN PCHAR Name,
- IN ULONG Options,
- OUT PHANDLE SubKey
+ _In_opt_ HANDLE Key,
+ _In_ PSTR Name,
+ _In_ ULONG Options,
+ _Out_ PHANDLE SubKey
);
extern NTSTATUS
RegistryDeleteSubKey(
- IN HANDLE Key,
- IN PCHAR Name
+ _In_ HANDLE Key,
+ _In_ PSTR Name
);
extern NTSTATUS
RegistryEnumerateSubKeys(
- IN HANDLE Key,
- IN NTSTATUS (*Callback)(PVOID, HANDLE, PANSI_STRING),
- IN PVOID Context
+ _In_ HANDLE Key,
+ _In_ NTSTATUS (*Callback)(PVOID, HANDLE, PANSI_STRING),
+ _In_ PVOID Context
);
extern NTSTATUS
RegistryEnumerateValues(
- IN HANDLE Key,
- IN NTSTATUS (*Callback)(PVOID, HANDLE, PANSI_STRING, ULONG),
- IN PVOID Context
+ _In_ HANDLE Key,
+ _In_ NTSTATUS (*Callback)(PVOID, HANDLE, PANSI_STRING, ULONG),
+ _In_ PVOID Context
);
extern NTSTATUS
RegistryDeleteValue(
- IN HANDLE Key,
- IN PCHAR Name
+ _In_ HANDLE Key,
+ _In_ PSTR Name
);
extern NTSTATUS
RegistryQueryDwordValue(
- IN HANDLE Key,
- IN PCHAR Name,
- OUT PULONG Value
+ _In_ HANDLE Key,
+ _In_ PSTR Name,
+ _Out_ PULONG Value
+ );
+
+extern NTSTATUS
+RegistryQueryQwordValue(
+ _In_ HANDLE Key,
+ _In_ PSTR Name,
+ _Out_ PULONGLONG Value
);
extern NTSTATUS
RegistryUpdateDwordValue(
- IN HANDLE Key,
- IN PCHAR Name,
- IN ULONG Value
+ _In_ HANDLE Key,
+ _In_ PSTR Name,
+ _In_ ULONG Value
);
extern NTSTATUS
RegistryQuerySzValue(
- IN HANDLE Key,
- IN PCHAR Name,
- OUT PULONG Type OPTIONAL,
- OUT PANSI_STRING *Array
+ _In_ HANDLE Key,
+ _In_ PSTR Name,
+ _Out_opt_ PULONG Type,
+ _Outptr_ PANSI_STRING *Array
);
extern NTSTATUS
RegistryQueryBinaryValue(
- IN HANDLE Key,
- IN PCHAR Name,
- OUT PVOID *Buffer,
- OUT PULONG Length
+ _In_ HANDLE Key,
+ _In_ PSTR Name,
+ _Outptr_ PVOID *Buffer,
+ _Out_ PULONG Length
);
extern NTSTATUS
RegistryUpdateBinaryValue(
- IN HANDLE Key,
- IN PCHAR Name,
- IN PVOID Buffer,
- IN ULONG Length
+ _In_ HANDLE Key,
+ _In_ PSTR Name,
+ _In_ PVOID Buffer,
+ _In_ ULONG Length
);
extern NTSTATUS
RegistryQueryKeyName(
- IN HANDLE Key,
- OUT PANSI_STRING *Array
+ _In_ HANDLE Key,
+ _Outptr_ PANSI_STRING *Array
);
extern NTSTATUS
RegistryQuerySystemStartOption(
- IN PCHAR Name,
- OUT PANSI_STRING *Option
+ _In_ PSTR Name,
+ _Outptr_ PANSI_STRING *Option
);
extern VOID
RegistryFreeSzValue(
- IN PANSI_STRING Array
+ _In_ PANSI_STRING Array
);
extern VOID
RegistryFreeBinaryValue(
- IN PVOID Buffer
+ _In_ PVOID Buffer
);
extern NTSTATUS
RegistryUpdateSzValue(
- IN HANDLE Key,
- IN PCHAR Name,
- IN ULONG Type,
- IN PANSI_STRING Array
+ _In_ HANDLE Key,
+ _In_ PSTR Name,
+ _In_ ULONG Type,
+ _In_ PANSI_STRING Array
);
extern VOID
RegistryCloseKey(
- IN HANDLE Key
+ _In_ HANDLE Key
);
#endif // _XENCONS_REGISTRY_H
--
2.51.0.windows.1
--
Ngoc Tu Dinh | Vates XCP-ng Developer
XCP-ng & Xen Orchestra - Vates solutions
web: https://vates.tech
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |