/* INCLUDES *****************************************************************/
-#include <ddk/ntddk.h>
+#define NTOS_MODE_KERNEL
+#include <ntos.h>
#include <roscfg.h>
#include <internal/ob.h>
#include <internal/ps.h>
#define NDEBUG
#include <internal/debug.h>
+
/* FUNCTIONS ************************************************************/
PVOID HEADER_TO_BODY(POBJECT_HEADER obj)
return(((void *)obj)+sizeof(OBJECT_HEADER)-sizeof(COMMON_BODY_HEADER));
}
+
POBJECT_HEADER BODY_TO_HEADER(PVOID body)
{
PCOMMON_BODY_HEADER chdr = (PCOMMON_BODY_HEADER)body;
*
* RETURN VALUE
*/
-NTSTATUS ObFindObject(POBJECT_ATTRIBUTES ObjectAttributes,
- PVOID* ReturnedObject,
- PUNICODE_STRING RemainingPath,
- POBJECT_TYPE ObjectType)
+NTSTATUS
+ObFindObject(POBJECT_ATTRIBUTES ObjectAttributes,
+ PVOID* ReturnedObject,
+ PUNICODE_STRING RemainingPath,
+ POBJECT_TYPE ObjectType)
{
PVOID NextObject;
PVOID CurrentObject;
PVOID RootObject;
POBJECT_HEADER CurrentHeader;
NTSTATUS Status;
- PWSTR Path;
PWSTR current;
UNICODE_STRING PathString;
ULONG Attributes;
-
+ PUNICODE_STRING ObjectName;
+
DPRINT("ObFindObject(ObjectAttributes %x, ReturnedObject %x, "
"RemainingPath %x)\n",ObjectAttributes,ReturnedObject,RemainingPath);
DPRINT("ObjectAttributes->ObjectName %wZ\n",
return(Status);
}
}
-
- Path = ObjectAttributes->ObjectName->Buffer;
-
- if (Path[0] == 0)
- {
- *ReturnedObject = CurrentObject;
- return(STATUS_SUCCESS);
- }
-
- if ((ObjectAttributes->RootDirectory == NULL) && (Path[0] != '\\'))
- {
- ObDereferenceObject(CurrentObject);
- return(STATUS_UNSUCCESSFUL);
- }
-
- if (Path)
- {
- RtlCreateUnicodeString (&PathString, Path);
- current = PathString.Buffer;
- }
- else
- {
- RtlInitUnicodeString (&PathString, NULL);
- current = NULL;
- }
+
+ ObjectName = ObjectAttributes->ObjectName;
+ if (ObjectName->Length == 0 ||
+ ObjectName->Buffer[0] == UNICODE_NULL)
+ {
+ *ReturnedObject = CurrentObject;
+ return STATUS_SUCCESS;
+ }
+
+ if (ObjectAttributes->RootDirectory == NULL &&
+ ObjectName->Buffer[0] != L'\\')
+ {
+ ObDereferenceObject (CurrentObject);
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ /* Create a zero-terminated copy of the object name */
+ PathString.Length = ObjectName->Length;
+ PathString.MaximumLength = ObjectName->Length + sizeof(WCHAR);
+ PathString.Buffer = ExAllocatePool (NonPagedPool,
+ PathString.MaximumLength);
+ if (PathString.Buffer == NULL)
+ {
+ ObDereferenceObject (CurrentObject);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ RtlCopyMemory (PathString.Buffer,
+ ObjectName->Buffer,
+ ObjectName->Length);
+ PathString.Buffer[PathString.Length / sizeof(WCHAR)] = UNICODE_NULL;
+
+ current = PathString.Buffer;
RootObject = CurrentObject;
Attributes = ObjectAttributes->Attributes;
/**********************************************************************
* NAME EXPORTED
- * ObCreateObject@36
+ * ObQueryNameString@16
*
* DESCRIPTION
*
* ARGUMENTS
*
* RETURN VALUE
+ *
+ * @implemented
*/
NTSTATUS STDCALL
-ObCreateObject(OUT PHANDLE Handle,
- IN ACCESS_MASK DesiredAccess,
- IN POBJECT_ATTRIBUTES ObjectAttributes,
- IN POBJECT_TYPE Type,
- OUT PVOID *Object)
+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)
{
PVOID Parent = NULL;
UNICODE_STRING RemainingPath;
POBJECT_HEADER ParentHeader = NULL;
NTSTATUS Status;
BOOLEAN ObjectAttached = FALSE;
+ PWCHAR NamePtr;
assert_irql(APC_LEVEL);
- DPRINT("ObCreateObject(Handle %x, ObjectAttributes %x, Type %x)\n",
+ DPRINT("ObRosCreateObject(Handle %x, ObjectAttributes %x, Type %x)\n",
Handle, ObjectAttributes, Type);
if (ObjectAttributes != NULL &&
ParentHeader->ObjectType == ObDirectoryType &&
RemainingPath.Buffer != NULL)
{
+ NamePtr = RemainingPath.Buffer;
+ if (*NamePtr == L'\\')
+ NamePtr++;
+
ObpAddEntryDirectory(Parent,
Header,
- RemainingPath.Buffer+1);
+ NamePtr);
+
ObjectAttached = TRUE;
}
return(STATUS_SUCCESS);
}
+/**********************************************************************
+ * NAME EXPORTED
+ * ObCreateObject@36
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ *
+ * @unimplemented
+ */
+NTSTATUS STDCALL
+ObCreateObject (IN KPROCESSOR_MODE ObjectAttributesAccessMode OPTIONAL,
+ IN POBJECT_TYPE ObjectType,
+ IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
+ IN KPROCESSOR_MODE AccessMode,
+ IN OUT PVOID ParseContext OPTIONAL,
+ IN ULONG ObjectSize,
+ IN ULONG PagedPoolCharge OPTIONAL,
+ IN ULONG NonPagedPoolCharge OPTIONAL,
+ OUT PVOID *Object)
+{
+ UNIMPLEMENTED
+ return STATUS_NOT_IMPLEMENTED;
+}
+/*
+ * @implemented
+ */
NTSTATUS STDCALL
ObReferenceObjectByPointer(IN PVOID Object,
IN ACCESS_MASK DesiredAccess,
}
+/*
+ * @implemented
+ */
NTSTATUS STDCALL
ObOpenObjectByPointer(IN POBJECT Object,
IN ULONG HandleAttributes,
{
CPRINT("Object %x/%x has invalid reference count (%d)\n",
Header, HEADER_TO_BODY(Header), Header->RefCount);
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
if (Header->HandleCount < 0)
{
CPRINT("Object %x/%x has invalid handle count (%d)\n",
Header, HEADER_TO_BODY(Header), Header->HandleCount);
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
if (Header->RefCount == 0 &&
{
if (Header->CloseInProcess)
{
- KeBugCheck(0);
+ KEBUGCHECK(0);
return STATUS_UNSUCCESSFUL;
}
Header->CloseInProcess = TRUE;
*
* RETURN VALUE
* None.
+ *
+ * @implemented
*/
VOID FASTCALL
ObfReferenceObject(IN PVOID Object)
if (Header->CloseInProcess)
{
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
InterlockedIncrement(&Header->RefCount);
*
* RETURN VALUE
* None.
+ *
+ * @implemented
*/
VOID FASTCALL
ObfDereferenceObject(IN PVOID Object)
*
* RETURN VALUE
* Reference count.
+ *
+ * @implemented
*/
ULONG STDCALL
ObGetObjectPointerCount(PVOID Object)