mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 19:33:16 +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
3 changed files with 115 additions and 8 deletions
|
@ -269,6 +269,34 @@ typedef struct _OBJECT_DIRECTORY_INFORMATION
|
||||||
UNICODE_STRING TypeName;
|
UNICODE_STRING TypeName;
|
||||||
} OBJECT_DIRECTORY_INFORMATION, *POBJECT_DIRECTORY_INFORMATION;
|
} 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
|
#ifndef NTOS_MODE_USER
|
||||||
|
|
||||||
typedef struct _OBJECT_BASIC_INFORMATION
|
typedef struct _OBJECT_BASIC_INFORMATION
|
||||||
|
@ -306,14 +334,14 @@ typedef struct _OBJECT_CREATE_INFORMATION
|
||||||
typedef struct _OBJECT_TYPE_INITIALIZER
|
typedef struct _OBJECT_TYPE_INITIALIZER
|
||||||
{
|
{
|
||||||
USHORT Length;
|
USHORT Length;
|
||||||
UCHAR UseDefaultObject;
|
BOOLEAN UseDefaultObject;
|
||||||
UCHAR CaseInsensitive;
|
BOOLEAN CaseInsensitive;
|
||||||
ULONG InvalidAttributes;
|
ULONG InvalidAttributes;
|
||||||
GENERIC_MAPPING GenericMapping;
|
GENERIC_MAPPING GenericMapping;
|
||||||
ULONG ValidAccessMask;
|
ULONG ValidAccessMask;
|
||||||
UCHAR SecurityRequired;
|
BOOLEAN SecurityRequired;
|
||||||
UCHAR MaintainHandleCount;
|
BOOLEAN MaintainHandleCount;
|
||||||
UCHAR MaintainTypeList;
|
BOOLEAN MaintainTypeList;
|
||||||
POOL_TYPE PoolType;
|
POOL_TYPE PoolType;
|
||||||
ULONG DefaultPagedPoolCharge;
|
ULONG DefaultPagedPoolCharge;
|
||||||
ULONG DefaultNonPagedPoolCharge;
|
ULONG DefaultNonPagedPoolCharge;
|
||||||
|
|
|
@ -820,6 +820,78 @@ ObpAllocateObject(IN POBJECT_CREATE_INFORMATION ObjectCreateInfo,
|
||||||
return STATUS_SUCCESS;
|
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 **********************************************************/
|
/* PUBLIC FUNCTIONS **********************************************************/
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
@ -1416,8 +1488,13 @@ NtQueryObject(IN HANDLE ObjectHandle,
|
||||||
|
|
||||||
/* Information about this type */
|
/* Information about this type */
|
||||||
case ObjectTypeInformation:
|
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;
|
break;
|
||||||
|
|
||||||
/* Information about all types */
|
/* Information about all types */
|
||||||
|
|
|
@ -985,6 +985,7 @@ ObQueryNameString(IN PVOID Object,
|
||||||
POBJECT_DIRECTORY ParentDirectory;
|
POBJECT_DIRECTORY ParentDirectory;
|
||||||
ULONG NameSize;
|
ULONG NameSize;
|
||||||
PWCH ObjectName;
|
PWCH ObjectName;
|
||||||
|
BOOLEAN ObjectIsNamed;
|
||||||
|
|
||||||
/* Get the Kernel Meta-Structures */
|
/* Get the Kernel Meta-Structures */
|
||||||
ObjectHeader = OBJECT_TO_OBJECT_HEADER(Object);
|
ObjectHeader = OBJECT_TO_OBJECT_HEADER(Object);
|
||||||
|
@ -994,8 +995,9 @@ ObQueryNameString(IN PVOID Object,
|
||||||
if (ObjectHeader->Type->TypeInfo.QueryNameProcedure)
|
if (ObjectHeader->Type->TypeInfo.QueryNameProcedure)
|
||||||
{
|
{
|
||||||
/* Call the procedure */
|
/* Call the procedure */
|
||||||
|
ObjectIsNamed = ((LocalInfo) && (LocalInfo->Name.Length > 0));
|
||||||
return ObjectHeader->Type->TypeInfo.QueryNameProcedure(Object,
|
return ObjectHeader->Type->TypeInfo.QueryNameProcedure(Object,
|
||||||
TRUE, //fixme
|
ObjectIsNamed,
|
||||||
ObjectNameInfo,
|
ObjectNameInfo,
|
||||||
Length,
|
Length,
|
||||||
ReturnLength,
|
ReturnLength,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue