X-Git-Url: http://git.jankratochvil.net/?p=reactos.git;a=blobdiff_plain;f=ntoskrnl%2Fob%2Fobject.c;fp=ntoskrnl%2Fob%2Fobject.c;h=c8b7c1883cec00358f32ea4bfbf312f45cfa432c;hp=52d9ba00296cf4535d09f041208ad1dfac5c1923;hb=a3df8bf1429570e0bd6c6428f6ed80073578cf4b;hpb=7c0db166f81fbe8c8b913d7f26048e337d383605 diff --git a/ntoskrnl/ob/object.c b/ntoskrnl/ob/object.c index 52d9ba0..c8b7c18 100644 --- a/ntoskrnl/ob/object.c +++ b/ntoskrnl/ob/object.c @@ -11,7 +11,8 @@ /* INCLUDES *****************************************************************/ -#include +#define NTOS_MODE_KERNEL +#include #include #include #include @@ -21,6 +22,7 @@ #define NDEBUG #include + /* FUNCTIONS ************************************************************/ PVOID HEADER_TO_BODY(POBJECT_HEADER obj) @@ -28,6 +30,7 @@ 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; @@ -98,21 +101,22 @@ VOID ObInitializeObject(POBJECT_HEADER ObjectHeader, * * 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", @@ -141,31 +145,39 @@ NTSTATUS ObFindObject(POBJECT_ATTRIBUTES ObjectAttributes, 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; @@ -221,20 +233,138 @@ NTSTATUS ObFindObject(POBJECT_ATTRIBUTES ObjectAttributes, /********************************************************************** * 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; @@ -242,10 +372,11 @@ ObCreateObject(OUT PHANDLE Handle, 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 && @@ -288,9 +419,14 @@ ObCreateObject(OUT PHANDLE Handle, ParentHeader->ObjectType == ObDirectoryType && RemainingPath.Buffer != NULL) { + NamePtr = RemainingPath.Buffer; + if (*NamePtr == L'\\') + NamePtr++; + ObpAddEntryDirectory(Parent, Header, - RemainingPath.Buffer+1); + NamePtr); + ObjectAttached = TRUE; } @@ -337,7 +473,36 @@ ObCreateObject(OUT PHANDLE Handle, 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, @@ -394,6 +559,9 @@ ObReferenceObjectByPointer(IN PVOID Object, } +/* + * @implemented + */ NTSTATUS STDCALL ObOpenObjectByPointer(IN POBJECT Object, IN ULONG HandleAttributes, @@ -438,13 +606,13 @@ ObpPerformRetentionChecks(POBJECT_HEADER Header) { 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 && @@ -453,7 +621,7 @@ ObpPerformRetentionChecks(POBJECT_HEADER Header) { if (Header->CloseInProcess) { - KeBugCheck(0); + KEBUGCHECK(0); return STATUS_UNSUCCESSFUL; } Header->CloseInProcess = TRUE; @@ -487,6 +655,8 @@ ObpPerformRetentionChecks(POBJECT_HEADER Header) * * RETURN VALUE * None. + * + * @implemented */ VOID FASTCALL ObfReferenceObject(IN PVOID Object) @@ -499,7 +669,7 @@ ObfReferenceObject(IN PVOID Object) if (Header->CloseInProcess) { - KeBugCheck(0); + KEBUGCHECK(0); } InterlockedIncrement(&Header->RefCount); @@ -520,6 +690,8 @@ ObfReferenceObject(IN PVOID Object) * * RETURN VALUE * None. + * + * @implemented */ VOID FASTCALL ObfDereferenceObject(IN PVOID Object) @@ -562,6 +734,8 @@ ObfDereferenceObject(IN PVOID Object) * * RETURN VALUE * Reference count. + * + * @implemented */ ULONG STDCALL ObGetObjectPointerCount(PVOID Object)