mirror of
https://github.com/reactos/reactos.git
synced 2024-06-03 11:11:54 +00:00
- Implement ObQueryTypeInfo and link it to NtQueryObject.
- Fix a bug in ObQueryNameInfo. See issue #1993 for more details. svn path=/trunk/; revision=25625
This commit is contained in:
parent
bdc7f65b2d
commit
2691e0994a
|
@ -269,6 +269,34 @@ typedef struct _OBJECT_DIRECTORY_INFORMATION
|
|||
UNICODE_STRING TypeName;
|
||||
} OBJECT_DIRECTORY_INFORMATION, *POBJECT_DIRECTORY_INFORMATION;
|
||||
|
||||
//
|
||||
// Object Type Information
|
||||
//
|
||||
typedef struct _OBJECT_TYPE_INFORMATION
|
||||
{
|
||||
UNICODE_STRING TypeName;
|
||||
ULONG TotalNumberOfObjects;
|
||||
ULONG TotalNumberOfHandles;
|
||||
ULONG TotalPagedPoolUsage;
|
||||
ULONG TotalNonPagedPoolUsage;
|
||||
ULONG TotalNamePoolUsage;
|
||||
ULONG TotalHandleTableUsage;
|
||||
ULONG HighWaterNumberOfObjects;
|
||||
ULONG HighWaterNumberOfHandles;
|
||||
ULONG HighWaterPagedPoolUsage;
|
||||
ULONG HighWaterNonPagedPoolUsage;
|
||||
ULONG HighWaterNamePoolUsage;
|
||||
ULONG HighWaterHandleTableUsage;
|
||||
ULONG InvalidAttributes;
|
||||
GENERIC_MAPPING GenericMapping;
|
||||
ULONG ValidAccessMask;
|
||||
BOOLEAN SecurityRequired;
|
||||
BOOLEAN MaintainHandleCount;
|
||||
ULONG PoolType;
|
||||
ULONG DefaultPagedPoolCharge;
|
||||
ULONG DefaultNonPagedPoolCharge;
|
||||
} OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION;
|
||||
|
||||
#ifndef NTOS_MODE_USER
|
||||
|
||||
typedef struct _OBJECT_BASIC_INFORMATION
|
||||
|
@ -306,14 +334,14 @@ typedef struct _OBJECT_CREATE_INFORMATION
|
|||
typedef struct _OBJECT_TYPE_INITIALIZER
|
||||
{
|
||||
USHORT Length;
|
||||
UCHAR UseDefaultObject;
|
||||
UCHAR CaseInsensitive;
|
||||
BOOLEAN UseDefaultObject;
|
||||
BOOLEAN CaseInsensitive;
|
||||
ULONG InvalidAttributes;
|
||||
GENERIC_MAPPING GenericMapping;
|
||||
ULONG ValidAccessMask;
|
||||
UCHAR SecurityRequired;
|
||||
UCHAR MaintainHandleCount;
|
||||
UCHAR MaintainTypeList;
|
||||
BOOLEAN SecurityRequired;
|
||||
BOOLEAN MaintainHandleCount;
|
||||
BOOLEAN MaintainTypeList;
|
||||
POOL_TYPE PoolType;
|
||||
ULONG DefaultPagedPoolCharge;
|
||||
ULONG DefaultNonPagedPoolCharge;
|
||||
|
|
|
@ -820,6 +820,78 @@ ObpAllocateObject(IN POBJECT_CREATE_INFORMATION ObjectCreateInfo,
|
|||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
ObQueryTypeInfo(IN POBJECT_TYPE ObjectType,
|
||||
OUT POBJECT_TYPE_INFORMATION ObjectTypeInfo,
|
||||
IN ULONG Length,
|
||||
OUT PULONG ReturnLength)
|
||||
{
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
PWSTR InfoBuffer;
|
||||
|
||||
/* Enter SEH */
|
||||
_SEH_TRY
|
||||
{
|
||||
/* Set return length aligned to 4-byte boundary */
|
||||
*ReturnLength += sizeof(*ObjectTypeInfo) +
|
||||
ALIGN_UP(ObjectType->Name.MaximumLength, ULONG);
|
||||
|
||||
/* Check if thats too much though. */
|
||||
if (Length < *ReturnLength) return STATUS_INFO_LENGTH_MISMATCH;
|
||||
|
||||
/* Build the data */
|
||||
ObjectTypeInfo->TotalNumberOfHandles =
|
||||
ObjectType->TotalNumberOfHandles;
|
||||
ObjectTypeInfo->TotalNumberOfObjects =
|
||||
ObjectType->TotalNumberOfObjects;
|
||||
ObjectTypeInfo->HighWaterNumberOfHandles =
|
||||
ObjectType->HighWaterNumberOfHandles;
|
||||
ObjectTypeInfo->HighWaterNumberOfObjects =
|
||||
ObjectType->HighWaterNumberOfObjects;
|
||||
ObjectTypeInfo->PoolType =
|
||||
ObjectType->TypeInfo.PoolType;
|
||||
ObjectTypeInfo->DefaultNonPagedPoolCharge =
|
||||
ObjectType->TypeInfo.DefaultNonPagedPoolCharge;
|
||||
ObjectTypeInfo->DefaultPagedPoolCharge =
|
||||
ObjectType->TypeInfo.DefaultPagedPoolCharge;
|
||||
ObjectTypeInfo->ValidAccessMask =
|
||||
ObjectType->TypeInfo.ValidAccessMask;
|
||||
ObjectTypeInfo->SecurityRequired =
|
||||
ObjectType->TypeInfo.SecurityRequired;
|
||||
ObjectTypeInfo->InvalidAttributes =
|
||||
ObjectType->TypeInfo.InvalidAttributes;
|
||||
ObjectTypeInfo->GenericMapping =
|
||||
ObjectType->TypeInfo.GenericMapping;
|
||||
ObjectTypeInfo->MaintainHandleCount =
|
||||
ObjectType->TypeInfo.MaintainHandleCount;
|
||||
|
||||
/* Setup the name buffer */
|
||||
InfoBuffer = (PWSTR)(ObjectTypeInfo + 1);
|
||||
ObjectTypeInfo->TypeName.Buffer = InfoBuffer;
|
||||
ObjectTypeInfo->TypeName.MaximumLength = ObjectType->Name.MaximumLength;
|
||||
ObjectTypeInfo->TypeName.Length = ObjectType->Name.Length;
|
||||
|
||||
/* Copy it */
|
||||
RtlCopyMemory(InfoBuffer,
|
||||
ObjectType->Name.Buffer,
|
||||
ObjectType->Name.Length);
|
||||
|
||||
/* Null-terminate it */
|
||||
(InfoBuffer)[ObjectType->Name.Length / sizeof(WCHAR)] = UNICODE_NULL;
|
||||
}
|
||||
_SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
|
||||
{
|
||||
/* Otherwise, get the exception code */
|
||||
Status = _SEH_GetExceptionCode();
|
||||
}
|
||||
_SEH_END;
|
||||
|
||||
/* Return status to caller */
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/* PUBLIC FUNCTIONS **********************************************************/
|
||||
|
||||
NTSTATUS
|
||||
|
@ -1416,8 +1488,13 @@ NtQueryObject(IN HANDLE ObjectHandle,
|
|||
|
||||
/* Information about this type */
|
||||
case ObjectTypeInformation:
|
||||
DPRINT1("NOT IMPLEMENTED!\n");
|
||||
Status = STATUS_NOT_IMPLEMENTED;
|
||||
|
||||
/* Call the helper and break out */
|
||||
Status = ObQueryTypeInfo(ObjectHeader->Type,
|
||||
(POBJECT_TYPE_INFORMATION)
|
||||
ObjectInformation,
|
||||
Length,
|
||||
&InfoLength);
|
||||
break;
|
||||
|
||||
/* Information about all types */
|
||||
|
|
|
@ -985,6 +985,7 @@ ObQueryNameString(IN PVOID Object,
|
|||
POBJECT_DIRECTORY ParentDirectory;
|
||||
ULONG NameSize;
|
||||
PWCH ObjectName;
|
||||
BOOLEAN ObjectIsNamed;
|
||||
|
||||
/* Get the Kernel Meta-Structures */
|
||||
ObjectHeader = OBJECT_TO_OBJECT_HEADER(Object);
|
||||
|
@ -994,8 +995,9 @@ ObQueryNameString(IN PVOID Object,
|
|||
if (ObjectHeader->Type->TypeInfo.QueryNameProcedure)
|
||||
{
|
||||
/* Call the procedure */
|
||||
ObjectIsNamed = ((LocalInfo) && (LocalInfo->Name.Length > 0));
|
||||
return ObjectHeader->Type->TypeInfo.QueryNameProcedure(Object,
|
||||
TRUE, //fixme
|
||||
ObjectIsNamed,
|
||||
ObjectNameInfo,
|
||||
Length,
|
||||
ReturnLength,
|
||||
|
|
Loading…
Reference in a new issue