X-Git-Url: http://git.jankratochvil.net/?p=reactos.git;a=blobdiff_plain;f=ntoskrnl%2Fob%2Fntobj.c;fp=ntoskrnl%2Fob%2Fntobj.c;h=d59b705bfedea118f3f41239fc7714abb656e0a6;hp=cb3fda8973cd5472464a8a6d099b84cfed56ec97;hb=7c0cf90e3b750f1f0dc83b2eec9e5c68a512c30f;hpb=ee8b63255465d8c28be3e7bd11628015708fc1ab diff --git a/ntoskrnl/ob/ntobj.c b/ntoskrnl/ob/ntobj.c index cb3fda8..d59b705 100644 --- a/ntoskrnl/ob/ntobj.c +++ b/ntoskrnl/ob/ntobj.c @@ -18,20 +18,30 @@ #define NDEBUG #include + /* FUNCTIONS ************************************************************/ #ifndef LIBCAPTIVE -NTSTATUS -STDCALL -NtSetInformationObject ( - IN HANDLE ObjectHandle, - IN CINT ObjectInformationClass, - IN PVOID ObjectInformation, - IN ULONG Length - ) +/********************************************************************** + * NAME EXPORTED + * NtSetInformationObject + * + * DESCRIPTION + * + * ARGUMENTS + * + * RETURN VALUE + * + * REVISIONS + */ +NTSTATUS STDCALL +NtSetInformationObject (IN HANDLE ObjectHandle, + IN CINT ObjectInformationClass, + IN PVOID ObjectInformation, + IN ULONG Length) { - UNIMPLEMENTED; + UNIMPLEMENTED; } #endif /* LIBCAPTIVE */ @@ -66,15 +76,6 @@ PUNICODE_STRING string) #ifndef LIBCAPTIVE -NTSTATUS -STDCALL -NtQueryObject ( - IN HANDLE ObjectHandle, - IN CINT ObjectInformationClass, - OUT PVOID ObjectInformation, - IN ULONG Length, - OUT PULONG ResultLength - ) /*Very, very, very new implementation. Test it! Probably we should add meaning to QueryName in POBJECT_TYPE, no matter if we know @@ -84,95 +85,103 @@ NtQueryObject ( If we don't do it this way, we should anyway add switches and separate functions to handle the different object types*/ + +/********************************************************************** + * NAME EXPORTED + * NtQueryObject + * + * DESCRIPTION + * + * ARGUMENTS + * + * RETURN VALUE + * + * REVISIONS + */ +NTSTATUS STDCALL +NtQueryObject (IN HANDLE ObjectHandle, + IN CINT ObjectInformationClass, + OUT PVOID ObjectInformation, + IN ULONG Length, + OUT PULONG ReturnLength) { - POBJECT_NAME_INFORMATION nameinfo; POBJECT_TYPE_INFORMATION typeinfo; - PFILE_NAME_INFORMATION filenameinfo; - PVOID Object; - NTSTATUS Status; - POBJECT_HEADER ObjectHeader; - PFILE_OBJECT fileob; - - Status = ObReferenceObjectByHandle(ObjectHandle, - 0, - NULL, - KernelMode, - &Object, - NULL); - if (Status != STATUS_SUCCESS) + POBJECT_HEADER ObjectHeader; + PVOID Object; + NTSTATUS Status; + + Status = ObReferenceObjectByHandle (ObjectHandle, + 0, + NULL, + KeGetPreviousMode(), + &Object, + NULL); + if (!NT_SUCCESS (Status)) { return Status; } - + ObjectHeader = BODY_TO_HEADER(Object); - + switch (ObjectInformationClass) { - case ObjectNameInformation: - if (Length!=sizeof(OBJECT_NAME_INFORMATION)) return STATUS_INVALID_BUFFER_SIZE; - nameinfo = (POBJECT_NAME_INFORMATION)ObjectInformation; - (*ResultLength)=Length; - - if (ObjectHeader->Type==InternalFileType) // FIXME: Temporary QueryName implementation, or at least separate functions - { - fileob = (PFILE_OBJECT) Object; - Status = internalNameBuilder(BODY_TO_HEADER(fileob->DeviceObject->Vpb->RealDevice), &nameinfo->Name); - - if (Status != STATUS_SUCCESS) - { - ObDereferenceObject(Object); - return Status; - } - filenameinfo = ExAllocatePool(NonPagedPool,MAX_PATH*sizeof(WCHAR)+sizeof(ULONG)); - IoQueryFileInformation(fileob,FileNameInformation,MAX_PATH*sizeof(WCHAR)+sizeof(ULONG), filenameinfo,NULL); - - Status = RtlAppendUnicodeToString(&(nameinfo->Name), filenameinfo->FileName); - - ExFreePool( filenameinfo); - ObDereferenceObject(Object); - return Status; - } - else - if (ObjectHeader->Name.Buffer) // If it's got a name there, we can probably just make the full path through Name and Parent + case ObjectNameInformation: + Status = ObQueryNameString (Object, + (POBJECT_NAME_INFORMATION)ObjectInformation, + Length, + ReturnLength); + break; + + case ObjectTypeInformation: + typeinfo = (POBJECT_TYPE_INFORMATION)ObjectInformation; + if (Length!=sizeof(OBJECT_TYPE_INFORMATION)) + return STATUS_INVALID_BUFFER_SIZE; + + // FIXME: Is this supposed to only be the header's Name field? + // Can somebody check/verify this? + RtlCopyUnicodeString(&typeinfo->Name,&ObjectHeader->Name); + + if (Status != STATUS_SUCCESS) { - Status = internalNameBuilder(ObjectHeader, &nameinfo->Name); - ObDereferenceObject(Object); - return Status; + break; } - ObDereferenceObject(Object); - return STATUS_NOT_IMPLEMENTED; - case ObjectTypeInformation: - typeinfo = (POBJECT_TYPE_INFORMATION)ObjectInformation; - if (Length!=sizeof(OBJECT_TYPE_INFORMATION)) return STATUS_INVALID_BUFFER_SIZE; - - // FIXME: Is this supposed to only be the header's Name field? - // Can somebody check/verify this? - RtlCopyUnicodeString(&typeinfo->Name,&ObjectHeader->Name); - - if (Status != STATUS_SUCCESS) - { - ObDereferenceObject(Object); - return Status; - } - - RtlCopyUnicodeString(&typeinfo->Type,&ObjectHeader->ObjectType->TypeName); - //This should be info from the object header, not the object type, right? - typeinfo->TotalHandles = ObjectHeader-> HandleCount; - typeinfo->ReferenceCount = ObjectHeader -> RefCount; - - ObDereferenceObject(Object); - return Status; - default: - ObDereferenceObject(Object); - return STATUS_NOT_IMPLEMENTED; + + RtlCopyUnicodeString(&typeinfo->Type,&ObjectHeader->ObjectType->TypeName); + //This should be info from the object header, not the object type, right? + typeinfo->TotalHandles = ObjectHeader-> HandleCount; + typeinfo->ReferenceCount = ObjectHeader -> RefCount; + break; + + default: + Status = STATUS_NOT_IMPLEMENTED; + break; } + + ObDereferenceObject(Object); + + return Status; } + +/********************************************************************** + * NAME EXPORTED + * ObMakeTemporaryObject + * + * DESCRIPTION + * + * ARGUMENTS + * + * RETURN VALUE + * + * REVISIONS + * + * @implemented + */ VOID STDCALL -ObMakeTemporaryObject (PVOID ObjectBody) +ObMakeTemporaryObject (IN PVOID ObjectBody) { - POBJECT_HEADER ObjectHeader; - + POBJECT_HEADER ObjectHeader; + ObjectHeader = BODY_TO_HEADER(ObjectBody); ObjectHeader->Permanent = FALSE; } @@ -192,33 +201,29 @@ ObMakeTemporaryObject (PVOID ObjectBody) */ NTSTATUS STDCALL -NtMakeTemporaryObject ( - HANDLE Handle - ) +NtMakeTemporaryObject (IN HANDLE Handle) { - PVOID Object; - NTSTATUS Status; - POBJECT_HEADER ObjectHeader; - - Status = ObReferenceObjectByHandle( - Handle, - 0, - NULL, - KernelMode, - & Object, - NULL - ); - if (Status != STATUS_SUCCESS) - { - return Status; - } + POBJECT_HEADER ObjectHeader; + PVOID Object; + NTSTATUS Status; - ObjectHeader = BODY_TO_HEADER(Object); - ObjectHeader->Permanent = FALSE; - - ObDereferenceObject(Object); - - return STATUS_SUCCESS; + Status = ObReferenceObjectByHandle(Handle, + 0, + NULL, + KernelMode, + & Object, + NULL); + if (Status != STATUS_SUCCESS) + { + return Status; + } + + ObjectHeader = BODY_TO_HEADER(Object); + ObjectHeader->Permanent = FALSE; + + ObDereferenceObject(Object); + + return STATUS_SUCCESS; } #endif /* LIBCAPTIVE */