+ObQueryNameString (IN PVOID Object,
+ OUT POBJECT_NAME_INFORMATION ObjectNameInfo,
+ IN ULONG Length,
+ OUT PULONG ReturnLength)
+{
+ POBJECT_NAME_INFORMATION LocalInfo;
+ POBJECT_HEADER ObjectHeader;
+ ULONG LocalReturnLength;
+ NTSTATUS Status;
+
+ *ReturnLength = 0;
+
+ if (Length < sizeof(OBJECT_NAME_INFORMATION) + sizeof(WCHAR))
+ return STATUS_INVALID_BUFFER_SIZE;
+
+ ObjectNameInfo->Name.MaximumLength = Length - sizeof(OBJECT_NAME_INFORMATION);
+ ObjectNameInfo->Name.Length = 0;
+ ObjectNameInfo->Name.Buffer =
+ (PWCHAR)((ULONG_PTR)ObjectNameInfo + sizeof(OBJECT_NAME_INFORMATION));
+ ObjectNameInfo->Name.Buffer[0] = 0;
+
+ ObjectHeader = BODY_TO_HEADER(Object);
+
+ if (ObjectHeader->ObjectType != NULL &&
+ ObjectHeader->ObjectType->QueryName != NULL)
+ {
+ DPRINT ("Calling %x\n", ObjectHeader->ObjectType->QueryName);
+ Status = ObjectHeader->ObjectType->QueryName (Object,
+ ObjectNameInfo,
+ Length,
+ ReturnLength);
+ }
+ else if (ObjectHeader->Name.Length > 0 && ObjectHeader->Name.Buffer != NULL)
+ {
+ DPRINT ("Object does not have a 'QueryName' function\n");
+
+ if (ObjectHeader->Parent == NameSpaceRoot)
+ {
+ DPRINT ("Reached the root directory\n");
+ ObjectNameInfo->Name.Length = 0;
+ ObjectNameInfo->Name.Buffer[0] = 0;
+ Status = STATUS_SUCCESS;
+ }
+ else if (ObjectHeader->Parent != NULL)
+ {
+ LocalInfo = ExAllocatePool (NonPagedPool,
+ sizeof(OBJECT_NAME_INFORMATION) +
+ MAX_PATH * sizeof(WCHAR));
+ if (LocalInfo == NULL)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ Status = ObQueryNameString (ObjectHeader->Parent,
+ LocalInfo,
+ MAX_PATH * sizeof(WCHAR),
+ &LocalReturnLength);
+ if (!NT_SUCCESS (Status))
+ {
+ ExFreePool (LocalInfo);
+ return Status;
+ }
+
+ Status = RtlAppendUnicodeStringToString (&ObjectNameInfo->Name,
+ &LocalInfo->Name);
+
+ ExFreePool (LocalInfo);
+
+ if (!NT_SUCCESS (Status))
+ return Status;
+ }
+
+ DPRINT ("Object path %wZ\n", &ObjectHeader->Name);
+ Status = RtlAppendUnicodeToString (&ObjectNameInfo->Name,
+ L"\\");
+ if (!NT_SUCCESS (Status))
+ return Status;
+
+ Status = RtlAppendUnicodeStringToString (&ObjectNameInfo->Name,
+ &ObjectHeader->Name);
+ }
+ else
+ {
+ DPRINT ("Object is unnamed\n");
+
+ ObjectNameInfo->Name.MaximumLength = 0;
+ ObjectNameInfo->Name.Length = 0;
+ ObjectNameInfo->Name.Buffer = NULL;
+
+ Status = STATUS_SUCCESS;
+ }
+
+ if (NT_SUCCESS (Status))
+ {
+ ObjectNameInfo->Name.MaximumLength =
+ (ObjectNameInfo->Name.Length) ? ObjectNameInfo->Name.Length + sizeof(WCHAR) : 0;
+ *ReturnLength =
+ sizeof(OBJECT_NAME_INFORMATION) + ObjectNameInfo->Name.MaximumLength;
+ DPRINT ("Returned object path: %wZ\n", &ObjectNameInfo->Name);
+ }
+
+ return Status;
+}
+
+
+/**********************************************************************
+ * NAME EXPORTED
+ * ObRosCreateObject@20
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * NOTE
+ * Internal ReactOS function
+ * RETURN VALUE
+ */
+NTSTATUS STDCALL
+ObRosCreateObject (OUT PHANDLE Handle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ IN POBJECT_TYPE Type,
+ OUT PVOID *Object)