[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 |