- Use the given buffer for getting the name of the parent. - Check the length of the buffer. - Intialise the name string if it is necessary. Modified: trunk/reactos/ntoskrnl/cm/regobj.c _____
Modified: trunk/reactos/ntoskrnl/cm/regobj.c --- trunk/reactos/ntoskrnl/cm/regobj.c 2005-09-24 18:09:06 UTC (rev 18029) +++ trunk/reactos/ntoskrnl/cm/regobj.c 2005-09-24 18:28:04 UTC (rev 18030) @@ -490,50 +490,50 @@
ULONG Length, PULONG ReturnLength) { - POBJECT_NAME_INFORMATION LocalInfo; PKEY_OBJECT KeyObject; - ULONG LocalReturnLength; NTSTATUS Status;
DPRINT ("CmiObjectQueryName() called\n");
KeyObject = (PKEY_OBJECT)ObjectBody;
- LocalInfo = ExAllocatePool (NonPagedPool, - sizeof(OBJECT_NAME_INFORMATION) + - MAX_PATH * sizeof(WCHAR)); - if (LocalInfo == NULL) - return STATUS_INSUFFICIENT_RESOURCES; - if (KeyObject->ParentKey != KeyObject) { Status = ObQueryNameString (KeyObject->ParentKey, - LocalInfo, - MAX_PATH * sizeof(WCHAR), - &LocalReturnLength); + ObjectNameInfo, + Length, + ReturnLength); } else { /* KeyObject is the root key */ Status = ObQueryNameString (HEADER_TO_OBJECT_NAME(BODY_TO_HEADER(KeyObject))->Directory, - LocalInfo, - MAX_PATH * sizeof(WCHAR), - &LocalReturnLength); + ObjectNameInfo, + Length, + ReturnLength); }
- if (!NT_SUCCESS (Status)) + if (!NT_SUCCESS(Status) && Status != STATUS_INFO_LENGTH_MISMATCH) { - ExFreePool (LocalInfo); return Status; } - DPRINT ("Parent path: %wZ\n", &LocalInfo->Name); + (*ReturnLength) += sizeof(WCHAR) + KeyObject->Name.Length;
- Status = RtlAppendUnicodeStringToString (&ObjectNameInfo->Name, - &LocalInfo->Name); - ExFreePool (LocalInfo); - if (!NT_SUCCESS (Status)) - return Status; + if (Status == STATUS_INFO_LENGTH_MISMATCH || *ReturnLength > Length) + { + return STATUS_INFO_LENGTH_MISMATCH; + }
+ if (ObjectNameInfo->Name.Buffer == NULL) + { + ObjectNameInfo->Name.Buffer = (PWCHAR)(ObjectNameInfo + 1); + ObjectNameInfo->Name.Length = 0; + ObjectNameInfo->Name.MaximumLength = Length - sizeof(OBJECT_NAME_INFORMATION); + } + + + DPRINT ("Parent path: %wZ\n", ObjectNameInfo->Name); + Status = RtlAppendUnicodeToString (&ObjectNameInfo->Name, L"\"); if (!NT_SUCCESS (Status))