/* Set the key and free the converted name */
LocalObjectType->Key = *(PULONG)AnsiName.Buffer;
- ExFreePool(AnsiName.Buffer);
+ RtlFreeAnsiString(&AnsiName);
}
else
{
InitializeListHead(&LocalObjectType->TypeList);
/* Lock the object type */
- ObpEnterObjectTypeMutex(LocalObjectType);
+ ObpEnterObjectTypeMutex(ObpTypeObjectType);
/* Get creator info and insert it into the type list */
CreatorInfo = OBJECT_HEADER_TO_CREATOR_INFO(Header);
- if (CreatorInfo) InsertTailList(&ObpTypeObjectType->TypeList,
- &CreatorInfo->TypeList);
+ if (CreatorInfo)
+ {
+ InsertTailList(&ObpTypeObjectType->TypeList,
+ &CreatorInfo->TypeList);
+
+ /* CORE-8423: Avoid inserting this a second time if someone creates a
+ * handle to the object type (bug in Windows 2003) */
+ Header->Flags &= ~OB_FLAG_CREATE_INFO;
+ }
/* Set the index and the entry into the object type array */
LocalObjectType->Index = ObpTypeObjectType->TotalNumberOfObjects;
+
+ NT_ASSERT(LocalObjectType->Index != 0);
+
if (LocalObjectType->Index < 32)
{
/* It fits, insert it */
}
/* Release the object type */
- ObpLeaveObjectTypeMutex(LocalObjectType);
+ ObpLeaveObjectTypeMutex(ObpTypeObjectType);
/* Check if we're actually creating the directory object itself */
if (!(ObpTypeDirectoryObject) ||
return STATUS_INSUFFICIENT_RESOURCES;
}
+VOID
+NTAPI
+ObDeleteCapturedInsertInfo(IN PVOID Object)
+{
+ POBJECT_HEADER ObjectHeader;
+ PAGED_CODE();
+
+ /* Check if there is anything to free */
+ ObjectHeader = OBJECT_TO_OBJECT_HEADER(Object);
+ if ((ObjectHeader->Flags & OB_FLAG_CREATE_INFO) &&
+ (ObjectHeader->ObjectCreateInfo != NULL))
+ {
+ /* Free the create info */
+ ObpFreeObjectCreateInformation(ObjectHeader->ObjectCreateInfo);
+ ObjectHeader->ObjectCreateInfo = NULL;
+ }
+}
+
VOID
NTAPI
ObpDeleteObjectType(IN PVOID Object)
switch (ObjectInformationClass)
{
case ObjectHandleFlagInformation:
-
+
/* Validate the length */
if (Length != sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION))
{
/* Invalid length */
return STATUS_INFO_LENGTH_MISMATCH;
}
-
+
/* Save the previous mode */
Context.PreviousMode = ExGetPreviousMode();
}
/* Check if this is a kernel handle */
- if (ObIsKernelHandle(ObjectHandle, Context.PreviousMode))
+ if (ObpIsKernelHandle(ObjectHandle, Context.PreviousMode))
{
/* Get the actual handle */
ObjectHandle = ObKernelHandleToHandle(ObjectHandle);
/* De-attach if we were attached, and return status */
if (AttachedToProcess) KeUnstackDetachProcess(&ApcState);
break;
-
+
case ObjectSessionInformation:
-
+
/* Only a system process can do this */
PreviousMode = ExGetPreviousMode();
if (!SeSinglePrivilegeCheck(SeTcbPrivilege, PreviousMode))
else
{
/* Get the object directory */
- Status = ObReferenceObjectByHandle(ObjectHandle,
- 0,
+ Status = ObReferenceObjectByHandle(ObjectHandle,
+ 0,
ObDirectoryType,
PreviousMode,
(PVOID*)&Directory,
}
}
break;
-
+
default:
/* Unsupported class */
Status = STATUS_INVALID_INFO_CLASS;