mirror of
https://github.com/reactos/reactos.git
synced 2024-09-29 05:54:05 +00:00
[NTOS/CM]
- Add NtQueryKey(KeyNameInformation) implementation. CORE-8581 #resolve svn path=/trunk/; revision=64396
This commit is contained in:
parent
ea57e45a4b
commit
4d394c076a
|
@ -1514,13 +1514,103 @@ CmpQueryFlagsInformation(
|
|||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static
|
||||
NTSTATUS
|
||||
CmpQueryNameInformation(
|
||||
_In_ PCM_KEY_CONTROL_BLOCK Kcb,
|
||||
_Out_opt_ PKEY_NAME_INFORMATION KeyNameInfo,
|
||||
_In_ ULONG Length,
|
||||
_Out_ PULONG ResultLength)
|
||||
{
|
||||
ULONG NeededLength;
|
||||
PCM_KEY_CONTROL_BLOCK CurrentKcb;
|
||||
|
||||
NeededLength = 0;
|
||||
CurrentKcb = Kcb;
|
||||
|
||||
/* Count the needed buffer size */
|
||||
while (CurrentKcb)
|
||||
{
|
||||
if (CurrentKcb->NameBlock->Compressed)
|
||||
NeededLength += CmpCompressedNameSize(CurrentKcb->NameBlock->Name, CurrentKcb->NameBlock->NameLength);
|
||||
else
|
||||
NeededLength += CurrentKcb->NameBlock->NameLength;
|
||||
|
||||
NeededLength += sizeof(OBJ_NAME_PATH_SEPARATOR);
|
||||
|
||||
CurrentKcb = CurrentKcb->ParentKcb;
|
||||
}
|
||||
|
||||
_SEH2_TRY
|
||||
{
|
||||
*ResultLength = NeededLength + FIELD_OFFSET(KEY_NAME_INFORMATION, Name[0]);
|
||||
if (Length < *ResultLength)
|
||||
return STATUS_BUFFER_TOO_SMALL;
|
||||
}
|
||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
return _SEH2_GetExceptionCode();
|
||||
}
|
||||
_SEH2_END;
|
||||
|
||||
/* Do the real copy */
|
||||
KeyNameInfo->NameLength = 0;
|
||||
CurrentKcb = Kcb;
|
||||
while (CurrentKcb)
|
||||
{
|
||||
ULONG NameLength;
|
||||
|
||||
_SEH2_TRY
|
||||
{
|
||||
if (CurrentKcb->NameBlock->Compressed)
|
||||
{
|
||||
NameLength = CmpCompressedNameSize(CurrentKcb->NameBlock->Name, CurrentKcb->NameBlock->NameLength);
|
||||
/* Copy the compressed name */
|
||||
CmpCopyCompressedName(&KeyNameInfo->Name[(NeededLength - NameLength)/sizeof(WCHAR)],
|
||||
NameLength,
|
||||
CurrentKcb->NameBlock->Name,
|
||||
CurrentKcb->NameBlock->NameLength);
|
||||
}
|
||||
else
|
||||
{
|
||||
NameLength = CurrentKcb->NameBlock->NameLength;
|
||||
/* Otherwise, copy the raw name */
|
||||
RtlCopyMemory(&KeyNameInfo->Name[(NeededLength - NameLength)/sizeof(WCHAR)],
|
||||
CurrentKcb->NameBlock->Name,
|
||||
NameLength);
|
||||
}
|
||||
|
||||
NeededLength -= NameLength;
|
||||
NeededLength -= sizeof(OBJ_NAME_PATH_SEPARATOR);
|
||||
/* Add path separator */
|
||||
KeyNameInfo->Name[NeededLength/sizeof(WCHAR)] = OBJ_NAME_PATH_SEPARATOR;
|
||||
KeyNameInfo->NameLength += NameLength + sizeof(OBJ_NAME_PATH_SEPARATOR);
|
||||
}
|
||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
return _SEH2_GetExceptionCode();
|
||||
}
|
||||
_SEH2_END;
|
||||
|
||||
CurrentKcb = CurrentKcb->ParentKcb;
|
||||
}
|
||||
|
||||
/* Make sure we copied everything */
|
||||
ASSERT(NeededLength == 0);
|
||||
ASSERT(KeyNameInfo->Name[0] == OBJ_NAME_PATH_SEPARATOR);
|
||||
|
||||
/* We're done */
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CmQueryKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
|
||||
IN KEY_INFORMATION_CLASS KeyInformationClass,
|
||||
IN PVOID KeyInformation,
|
||||
IN ULONG Length,
|
||||
IN PULONG ResultLength)
|
||||
CmQueryKey(_In_ PCM_KEY_CONTROL_BLOCK Kcb,
|
||||
_In_ KEY_INFORMATION_CLASS KeyInformationClass,
|
||||
_Out_opt_ PVOID KeyInformation,
|
||||
_In_ ULONG Length,
|
||||
_Out_ PULONG ResultLength)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
PHHIVE Hive;
|
||||
|
@ -1588,12 +1678,12 @@ CmQueryKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
|
|||
ResultLength);
|
||||
break;
|
||||
|
||||
/* Unsupported class for now */
|
||||
case KeyNameInformation:
|
||||
|
||||
/* Print message and fail */
|
||||
DPRINT1("Unsupported class: %d!\n", KeyInformationClass);
|
||||
Status = STATUS_NOT_IMPLEMENTED;
|
||||
/* Call the internal API */
|
||||
Status = CmpQueryNameInformation(Kcb,
|
||||
KeyInformation,
|
||||
Length,
|
||||
ResultLength);
|
||||
break;
|
||||
|
||||
/* Illegal classes */
|
||||
|
|
Loading…
Reference in a new issue