/* FUNCTIONS ***************************************************************/
+/*
+ * @implemented
+ */
NTSTATUS STDCALL
RtlCheckRegistryKey(IN ULONG RelativeTo,
IN PWSTR Path)
}
+/*
+ * @implemented
+ */
NTSTATUS STDCALL
RtlCreateRegistryKey(IN ULONG RelativeTo,
IN PWSTR Path)
}
+/*
+ * @implemented
+ */
NTSTATUS STDCALL
RtlDeleteRegistryValue(IN ULONG RelativeTo,
- IN PWSTR Path,
- IN PWSTR ValueName)
+ IN PCWSTR Path,
+ IN PCWSTR ValueName)
{
HANDLE KeyHandle;
NTSTATUS Status;
UNICODE_STRING Name;
Status = RtlpGetRegistryHandle(RelativeTo,
- Path,
+ (PWSTR)Path,
FALSE,
&KeyHandle);
if (!NT_SUCCESS(Status))
}
+/*
+ * @unimplemented
+ */
NTSTATUS STDCALL
RtlFormatCurrentUserKeyPath(PUNICODE_STRING KeyPath)
{
}
+/*
+ * @implemented
+ */
NTSTATUS STDCALL
RtlOpenCurrentUser(IN ACCESS_MASK DesiredAccess,
OUT PHANDLE KeyHandle)
}
+/*
+ * @unimplemented
+ */
NTSTATUS STDCALL
RtlQueryRegistryValues(IN ULONG RelativeTo,
- IN PWSTR Path,
+ IN PCWSTR Path,
IN PRTL_QUERY_REGISTRY_TABLE QueryTable,
IN PVOID Context,
IN PVOID Environment)
ULONG ResultSize;
ULONG Index;
ULONG StringLen;
+ ULONG ValueNameSize;
PWSTR StringPtr;
PWSTR ExpandBuffer;
+ PWSTR ValueName;
UNICODE_STRING EnvValue;
UNICODE_STRING EnvExpandedValue;
DPRINT("RtlQueryRegistryValues() called\n");
Status = RtlpGetRegistryHandle(RelativeTo,
- Path,
+ (PWSTR)Path,
FALSE,
&BaseKeyHandle);
if (!NT_SUCCESS(Status))
while ((QueryEntry->QueryRoutine != NULL) ||
(QueryEntry->Name != NULL))
{
- if ((QueryEntry->QueryRoutine == NULL) &&
- ((QueryEntry->Flags & RTL_QUERY_REGISTRY_SUBKEY) != 0))
- {
- Status = STATUS_INVALID_PARAMETER;
- break;
- }
-
- DPRINT("Name: %S\n", QueryEntry->Name);
-
if (((QueryEntry->Flags & (RTL_QUERY_REGISTRY_SUBKEY | RTL_QUERY_REGISTRY_TOPKEY)) != 0) &&
(BaseKeyHandle != CurrentKeyHandle))
{
SourceString = (PUNICODE_STRING)QueryEntry->DefaultData;
ValueString = (PUNICODE_STRING)QueryEntry->EntryContext;
- if (ValueString->Buffer == 0)
+ if (ValueString->Buffer == NULL)
{
ValueString->Length = SourceString->Length;
ValueString->MaximumLength = SourceString->MaximumLength;
ValueString = (PUNICODE_STRING)QueryEntry->EntryContext;
if (ValueString->Buffer == NULL)
{
- ValueString->MaximumLength = ValueInfo->DataLength + sizeof(WCHAR);
+ ValueString->MaximumLength = ValueInfo->DataLength;
ValueString->Buffer = RtlAllocateHeap(RtlGetProcessHeap(),
0,
ValueString->MaximumLength);
ValueString->Buffer[0] = 0;
}
ValueString->Length = min(ValueInfo->DataLength,
- ValueString->MaximumLength - sizeof(WCHAR));
+ ValueString->MaximumLength) - sizeof(WCHAR);
memcpy(ValueString->Buffer,
ValueInfo->Data,
ValueString->Length);
RtlInitUnicodeString(&EnvValue,
(PWSTR)ValueInfo->Data);
EnvExpandedValue.Length = 0;
- EnvExpandedValue.MaximumLength = ValueInfo->DataLength * 2 * sizeof(WCHAR);
+ EnvExpandedValue.MaximumLength = ValueInfo->DataLength * 2;
EnvExpandedValue.Buffer = ExpandBuffer;
*ExpandBuffer = 0;
&StringLen);
StringLen = (wcslen(ExpandBuffer) + 1) * sizeof(WCHAR);
- Status = QueryEntry->QueryRoutine(FullValueInfo->Name,
+ Status = QueryEntry->QueryRoutine(QueryEntry->Name,
REG_SZ,
(PVOID)ExpandBuffer,
StringLen,
FullValueInfo = RtlAllocateHeap(RtlGetProcessHeap(),
0,
BufferSize);
- if (FullValueInfo == NULL)
+ if (FullValueInfo == NULL)
{
Status = STATUS_NO_MEMORY;
break;
}
-
- Index = 0;
+ ValueNameSize = 256 * sizeof(WCHAR);
+ ValueName = RtlAllocateHeap(RtlGetProcessHeap(),
+ 0,
+ ValueNameSize);
+ if (ValueName == NULL)
+ {
+ Status = STATUS_NO_MEMORY;
+ break;
+ }
+ Index = 0;
while (TRUE)
{
Status = NtEnumerateValueKey(CurrentKeyHandle,
break;
}
+ if (FullValueInfo->NameLength > ValueNameSize - sizeof(WCHAR))
+ {
+ /* Should not happen, because the name length is limited to 255 characters */
+ RtlFreeHeap(RtlGetProcessHeap(),
+ 0,
+ ValueName);
+ ValueNameSize = FullValueInfo->NameLength + sizeof(WCHAR);
+ ValueName = RtlAllocateHeap(RtlGetProcessHeap(),
+ 0,
+ ValueNameSize);
+ if (ValueName == NULL)
+ {
+ Status = STATUS_NO_MEMORY;
+ break;
+ }
+ }
+
+ memcpy(ValueName,
+ FullValueInfo->Name,
+ FullValueInfo->NameLength);
+ ValueName[FullValueInfo->NameLength / sizeof(WCHAR)] = 0;
+
DPRINT("FullValueInfo->Type: %lu\n", FullValueInfo->Type);
if ((FullValueInfo->Type == REG_MULTI_SZ) &&
!(QueryEntry->Flags & RTL_QUERY_REGISTRY_NOEXPAND))
while (*StringPtr != 0)
{
StringLen = (wcslen(StringPtr) + 1) * sizeof(WCHAR);
- Status = QueryEntry->QueryRoutine(QueryEntry->Name,
+ Status = QueryEntry->QueryRoutine(ValueName,
REG_SZ,
(PVOID)StringPtr,
StringLen,
RtlInitUnicodeString(&EnvValue,
StringPtr);
EnvExpandedValue.Length = 0;
- EnvExpandedValue.MaximumLength = FullValueInfo->DataLength * 2 * sizeof(WCHAR);
+ EnvExpandedValue.MaximumLength = FullValueInfo->DataLength * 2;
EnvExpandedValue.Buffer = ExpandBuffer;
*ExpandBuffer = 0;
&StringLen);
StringLen = (wcslen(ExpandBuffer) + 1) * sizeof(WCHAR);
- Status = QueryEntry->QueryRoutine(FullValueInfo->Name,
+ Status = QueryEntry->QueryRoutine(ValueName,
REG_SZ,
(PVOID)ExpandBuffer,
StringLen,
}
else
{
- Status = QueryEntry->QueryRoutine(FullValueInfo->Name,
+ Status = QueryEntry->QueryRoutine(ValueName,
FullValueInfo->Type,
(PVOID)FullValueInfo + FullValueInfo->DataOffset,
FullValueInfo->DataLength,
RtlFreeHeap(RtlGetProcessHeap(),
0,
FullValueInfo);
-
+ RtlFreeHeap(RtlGetProcessHeap(),
+ 0,
+ ValueName);
if (!NT_SUCCESS(Status))
break;
}
}
+/*
+ * @implemented
+ */
NTSTATUS STDCALL
RtlWriteRegistryValue(IN ULONG RelativeTo,
- IN PWSTR Path,
- IN PWSTR ValueName,
+ IN PCWSTR Path,
+ IN PCWSTR ValueName,
IN ULONG ValueType,
IN PVOID ValueData,
IN ULONG ValueLength)
UNICODE_STRING Name;
Status = RtlpGetRegistryHandle(RelativeTo,
- Path,
+ (PWSTR)Path,
TRUE,
&KeyHandle);
if (!NT_SUCCESS(Status))
}
+/*
+ * @implemented
+ */
NTSTATUS STDCALL
RtlpNtCreateKey(OUT HANDLE KeyHandle,
IN ACCESS_MASK DesiredAccess,
}
+/*
+ * @implemented
+ */
NTSTATUS STDCALL
RtlpNtEnumerateSubKey(IN HANDLE KeyHandle,
OUT PUNICODE_STRING SubKeyName,
}
+/*
+ * @implemented
+ */
NTSTATUS STDCALL
RtlpNtMakeTemporaryKey(IN HANDLE KeyHandle)
{
}
+/*
+ * @implemented
+ */
NTSTATUS STDCALL
RtlpNtOpenKey(OUT HANDLE KeyHandle,
IN ACCESS_MASK DesiredAccess,
}
+/*
+ * @implemented
+ */
NTSTATUS STDCALL
RtlpNtQueryValueKey(IN HANDLE KeyHandle,
OUT PULONG Type OPTIONAL,
}
+/*
+ * @implemented
+ */
NTSTATUS STDCALL
RtlpNtSetValueKey(IN HANDLE KeyHandle,
IN ULONG Type,