#define NDEBUG
#include <internal/debug.h>
+
/* 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 */
#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
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;
}
*/
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 */