1998-09-13 15:55:36 +00:00
|
|
|
/*
|
|
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
|
|
* PROJECT: ReactOS kernel
|
|
|
|
* FILE: include/internal/objmgr.h
|
|
|
|
* PURPOSE: Object manager definitions
|
|
|
|
* PROGRAMMER: David Welch (welch@mcmail.com)
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __INCLUDE_INTERNAL_OBJMGR_H
|
|
|
|
#define __INCLUDE_INTERNAL_OBJMGR_H
|
|
|
|
|
2006-06-05 00:04:36 +00:00
|
|
|
typedef struct _OBP_SET_HANDLE_ATTRIBUTES_CONTEXT
|
|
|
|
{
|
|
|
|
KPROCESSOR_MODE PreviousMode;
|
|
|
|
OBJECT_HANDLE_ATTRIBUTE_INFORMATION Information;
|
|
|
|
} OBP_SET_HANDLE_ATTRIBUTES_CONTEXT, *POBP_SET_HANDLE_ATTRIBUTES_CONTEXT;
|
|
|
|
|
2006-05-24 21:44:59 +00:00
|
|
|
#define GENERIC_ACCESS (GENERIC_READ | \
|
|
|
|
GENERIC_WRITE | \
|
|
|
|
GENERIC_EXECUTE | \
|
|
|
|
GENERIC_ALL)
|
2000-07-04 08:52:47 +00:00
|
|
|
|
2005-04-11 21:50:15 +00:00
|
|
|
#define KERNEL_HANDLE_FLAG (1 << ((sizeof(HANDLE) * 8) - 1))
|
|
|
|
#define ObIsKernelHandle(Handle, ProcessorMode) \
|
|
|
|
(((ULONG_PTR)(Handle) & KERNEL_HANDLE_FLAG) && \
|
|
|
|
((ProcessorMode) == KernelMode))
|
|
|
|
#define ObKernelHandleToHandle(Handle) \
|
|
|
|
(HANDLE)((ULONG_PTR)(Handle) & ~KERNEL_HANDLE_FLAG)
|
2005-12-10 16:38:04 +00:00
|
|
|
#define ObMarkHandleAsKernelHandle(Handle) \
|
|
|
|
(HANDLE)((ULONG_PTR)(Handle) | KERNEL_HANDLE_FLAG)
|
1998-09-13 15:55:36 +00:00
|
|
|
|
2006-05-24 21:44:59 +00:00
|
|
|
extern KEVENT ObpDefaultObject;
|
|
|
|
extern POBJECT_TYPE ObpTypeObjectType;
|
2005-09-13 23:48:54 +00:00
|
|
|
extern POBJECT_TYPE ObSymbolicLinkType;
|
2006-05-24 21:44:59 +00:00
|
|
|
extern POBJECT_TYPE ObTypeObjectType;
|
|
|
|
extern POBJECT_DIRECTORY NameSpaceRoot;
|
|
|
|
extern POBJECT_DIRECTORY ObpTypeDirectoryObject;
|
2005-09-13 23:48:54 +00:00
|
|
|
extern PHANDLE_TABLE ObpKernelHandleTable;
|
2006-05-29 00:05:07 +00:00
|
|
|
extern WORK_QUEUE_ITEM ObpReaperWorkItem;
|
|
|
|
extern volatile PVOID ObpReaperList;
|
2006-05-29 03:32:43 +00:00
|
|
|
extern NPAGED_LOOKASIDE_LIST ObpNmLookasideList, ObpCiLookasideList;
|
2005-09-13 23:48:54 +00:00
|
|
|
|
2006-05-24 20:06:13 +00:00
|
|
|
BOOLEAN
|
2005-09-13 23:48:54 +00:00
|
|
|
NTAPI
|
2006-06-06 21:02:55 +00:00
|
|
|
ObpDeleteEntryDirectory(
|
|
|
|
IN POBP_LOOKUP_CONTEXT Context
|
|
|
|
);
|
2005-09-13 23:48:54 +00:00
|
|
|
|
2006-05-24 20:06:13 +00:00
|
|
|
BOOLEAN
|
2006-05-24 04:28:57 +00:00
|
|
|
NTAPI
|
2006-06-06 21:02:55 +00:00
|
|
|
ObpInsertEntryDirectory(
|
|
|
|
IN POBJECT_DIRECTORY Parent,
|
|
|
|
IN POBP_LOOKUP_CONTEXT Context,
|
|
|
|
IN POBJECT_HEADER ObjectHeader
|
|
|
|
);
|
2006-05-24 04:28:57 +00:00
|
|
|
|
2006-05-24 20:06:13 +00:00
|
|
|
PVOID
|
2005-09-13 23:48:54 +00:00
|
|
|
NTAPI
|
2006-06-06 21:02:55 +00:00
|
|
|
ObpLookupEntryDirectory(
|
|
|
|
IN POBJECT_DIRECTORY Directory,
|
|
|
|
IN PUNICODE_STRING Name,
|
|
|
|
IN ULONG Attributes,
|
|
|
|
IN UCHAR SearchShadow,
|
|
|
|
IN POBP_LOOKUP_CONTEXT Context
|
|
|
|
);
|
1998-10-05 04:01:30 +00:00
|
|
|
|
2003-02-25 16:43:45 +00:00
|
|
|
VOID
|
2005-09-13 23:48:54 +00:00
|
|
|
NTAPI
|
2006-06-06 21:02:55 +00:00
|
|
|
ObInitSymbolicLinkImplementation(
|
|
|
|
VOID
|
|
|
|
);
|
1998-10-05 04:01:30 +00:00
|
|
|
|
2006-05-24 04:28:57 +00:00
|
|
|
NTSTATUS
|
|
|
|
NTAPI
|
2006-06-06 21:02:55 +00:00
|
|
|
ObpCreateHandleTable(
|
|
|
|
IN PEPROCESS Parent,
|
|
|
|
IN PEPROCESS Process
|
2006-05-24 04:28:57 +00:00
|
|
|
);
|
|
|
|
|
2005-09-13 23:48:54 +00:00
|
|
|
VOID
|
|
|
|
NTAPI
|
2006-06-06 21:02:55 +00:00
|
|
|
ObKillProcess(
|
|
|
|
IN PEPROCESS Process
|
2005-09-13 23:48:54 +00:00
|
|
|
);
|
1998-09-13 15:55:36 +00:00
|
|
|
|
2005-09-13 23:48:54 +00:00
|
|
|
NTSTATUS
|
|
|
|
NTAPI
|
|
|
|
ObFindObject(
|
2006-05-28 19:05:19 +00:00
|
|
|
IN HANDLE RootHandle,
|
|
|
|
IN PUNICODE_STRING ObjectName,
|
|
|
|
IN ULONG Attributes,
|
|
|
|
IN KPROCESSOR_MODE PreviousMode,
|
|
|
|
IN PVOID *ReturnedObject,
|
|
|
|
IN POBJECT_TYPE ObjectType,
|
|
|
|
IN POBP_LOOKUP_CONTEXT Context,
|
2006-05-25 04:17:29 +00:00
|
|
|
IN PACCESS_STATE AccessState,
|
2006-05-28 19:05:19 +00:00
|
|
|
IN PSECURITY_QUALITY_OF_SERVICE SecurityQos,
|
|
|
|
IN PVOID ParseContext,
|
|
|
|
IN PVOID Insert
|
2005-09-13 23:48:54 +00:00
|
|
|
);
|
2003-10-21 15:50:51 +00:00
|
|
|
|
2006-06-05 00:04:36 +00:00
|
|
|
BOOLEAN
|
2005-09-13 23:48:54 +00:00
|
|
|
NTAPI
|
|
|
|
ObpSetHandleAttributes(
|
2006-06-05 00:04:36 +00:00
|
|
|
IN PHANDLE_TABLE HandleTable,
|
|
|
|
IN OUT PHANDLE_TABLE_ENTRY HandleTableEntry,
|
|
|
|
IN PVOID Context
|
2005-09-13 23:48:54 +00:00
|
|
|
);
|
1999-02-06 18:34:14 +00:00
|
|
|
|
2006-06-06 04:52:08 +00:00
|
|
|
VOID
|
2005-09-13 23:48:54 +00:00
|
|
|
NTAPI
|
2006-06-06 04:52:08 +00:00
|
|
|
ObpDeleteNameCheck(
|
|
|
|
IN PVOID Object
|
|
|
|
);
|
2005-09-13 23:48:54 +00:00
|
|
|
|
2002-06-11 22:09:03 +00:00
|
|
|
NTSTATUS
|
2005-09-13 23:48:54 +00:00
|
|
|
NTAPI
|
|
|
|
ObDuplicateObject(
|
|
|
|
PEPROCESS SourceProcess,
|
|
|
|
PEPROCESS TargetProcess,
|
|
|
|
HANDLE SourceHandle,
|
|
|
|
PHANDLE TargetHandle,
|
|
|
|
ACCESS_MASK DesiredAccess,
|
2005-12-10 16:38:04 +00:00
|
|
|
ULONG HandleAttributes,
|
2005-09-13 23:48:54 +00:00
|
|
|
ULONG Options
|
|
|
|
);
|
2002-03-05 00:20:54 +00:00
|
|
|
|
2004-07-16 17:20:23 +00:00
|
|
|
ULONG
|
2005-09-13 23:48:54 +00:00
|
|
|
NTAPI
|
2004-07-16 17:20:23 +00:00
|
|
|
ObpGetHandleCountByHandleTable(PHANDLE_TABLE HandleTable);
|
|
|
|
|
2004-11-21 06:51:18 +00:00
|
|
|
VOID
|
2006-06-06 21:02:55 +00:00
|
|
|
NTAPI
|
2005-09-13 23:48:54 +00:00
|
|
|
ObQueryDeviceMapInformation(
|
2006-06-06 21:02:55 +00:00
|
|
|
IN PEPROCESS Process,
|
|
|
|
OUT PPROCESS_DEVICEMAP_INFORMATION DeviceMapInfo
|
2005-09-13 23:48:54 +00:00
|
|
|
);
|
2004-07-16 17:20:23 +00:00
|
|
|
|
2005-09-13 23:48:54 +00:00
|
|
|
VOID
|
|
|
|
FASTCALL
|
|
|
|
ObpSetPermanentObject(
|
|
|
|
IN PVOID ObjectBody,
|
|
|
|
IN BOOLEAN Permanent
|
|
|
|
);
|
2005-01-23 22:42:31 +00:00
|
|
|
|
2006-05-29 00:05:07 +00:00
|
|
|
VOID
|
|
|
|
FASTCALL
|
|
|
|
ObpDeleteObject(
|
|
|
|
IN PVOID Object
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
NTAPI
|
|
|
|
ObpReapObject(
|
|
|
|
IN PVOID Unused
|
2006-05-24 21:44:59 +00:00
|
|
|
);
|
|
|
|
|
2004-07-16 17:20:23 +00:00
|
|
|
/* Security descriptor cache functions */
|
|
|
|
|
|
|
|
NTSTATUS
|
2005-09-13 23:48:54 +00:00
|
|
|
NTAPI
|
2004-07-16 17:20:23 +00:00
|
|
|
ObpInitSdCache(VOID);
|
|
|
|
|
|
|
|
NTSTATUS
|
2005-09-13 23:48:54 +00:00
|
|
|
NTAPI
|
|
|
|
ObpAddSecurityDescriptor(
|
|
|
|
IN PSECURITY_DESCRIPTOR SourceSD,
|
|
|
|
OUT PSECURITY_DESCRIPTOR *DestinationSD
|
|
|
|
);
|
2004-07-16 17:20:23 +00:00
|
|
|
|
|
|
|
NTSTATUS
|
2005-09-13 23:48:54 +00:00
|
|
|
NTAPI
|
2004-07-16 17:20:23 +00:00
|
|
|
ObpRemoveSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor);
|
2004-05-02 04:40:25 +00:00
|
|
|
|
2004-07-23 21:44:10 +00:00
|
|
|
VOID
|
2005-09-13 23:48:54 +00:00
|
|
|
NTAPI
|
2004-07-23 21:44:10 +00:00
|
|
|
ObpReferenceCachedSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor);
|
|
|
|
|
|
|
|
VOID
|
2005-09-13 23:48:54 +00:00
|
|
|
NTAPI
|
2004-07-23 21:44:10 +00:00
|
|
|
ObpDereferenceCachedSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor);
|
|
|
|
|
2005-05-06 22:54:40 +00:00
|
|
|
VOID
|
|
|
|
FASTCALL
|
2005-09-13 23:48:54 +00:00
|
|
|
ObInitializeFastReference(
|
|
|
|
IN PEX_FAST_REF FastRef,
|
|
|
|
PVOID Object
|
|
|
|
);
|
2005-05-06 22:54:40 +00:00
|
|
|
|
|
|
|
PVOID
|
|
|
|
FASTCALL
|
2005-09-13 23:48:54 +00:00
|
|
|
ObFastReplaceObject(
|
|
|
|
IN PEX_FAST_REF FastRef,
|
|
|
|
PVOID Object
|
|
|
|
);
|
2005-05-09 01:38:29 +00:00
|
|
|
|
2005-05-06 22:54:40 +00:00
|
|
|
PVOID
|
|
|
|
FASTCALL
|
|
|
|
ObFastReferenceObject(IN PEX_FAST_REF FastRef);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
FASTCALL
|
2005-09-13 23:48:54 +00:00
|
|
|
ObFastDereferenceObject(
|
|
|
|
IN PEX_FAST_REF FastRef,
|
|
|
|
PVOID Object
|
|
|
|
);
|
2005-05-09 01:38:29 +00:00
|
|
|
|
2006-05-29 03:32:43 +00:00
|
|
|
/* Object Create and Object Name Capture Functions */
|
2005-01-21 10:28:13 +00:00
|
|
|
|
|
|
|
NTSTATUS
|
Object Manager Patch. This patch continues the work done in the previous patch and makes the following changes in order to support OB 2.0 (it basically temporarily fixes a highly incorrect implementation so that caller code will be ready to work with the OB 2.0 without change):
1) The documented Object Create Information Structure and semantics implemented. All Object Attributes and passed data from user-mode is now probed and saved into this object create structure when ObCreateObject is called.
2) ObCreateObject does NOT PERFORM ANY OTHER OPERATION EXCEPT CREATING THE OBJECT ANYMORE. ObCreateObject will NOT insert the Object into the tree and other operations. These are now done correctly by ObInsertObject. Therefore, the biggest hurdle was changing pieces of code which assumed ObCreateObject would be enough.
3) ObInsertObject uses the captured create info for all operations isntead of the Object Attributes.
4) ObFindObject now uses the captured info as well.
5) The OBject name and directory are now stored in the documented Object Name Information, always allocated and freed from non paged pool.
HACKS:
5) Because the registry code is horribly broken and doesn't use ObFindObjectByName, the old ObFindObject had to be temporarily duplicated into CmpFindObject.
7) Win32k used ObInsertObject in CsrInsertObject as a way to create a handle inside csrss. However, OBInsertObject now does more then this. As a temporary hack, ObpCreateHandle is exported from the kernel and called from win32k. A fix needs to be done for this, but I don't know the design of win32k+csrss well enough to find a solution.
8) SEH has been commented out in some places of the new probing code because it breaks smss and explorer. These need to be investigated (seh did not exist in the previous code, so this is not really a hack)
9) Named objects with a parent directory are NOT allowed. However because of bugs in kernel32, the new check has been temporarily disabled. (this check did not exist in the previous code, so this is not really a hack)
The next patch will add a proper ObFindObject which will support a more complete Parse Procedure with context and security information. This is needed for proper registry access (requested by Eric Kohl) and for proper functionality of the Desktop/File creation, which should use the Parse routine, and not the Create Handle Routine. This will also make it possible to remove some previous hacks and pave the way for a fixed Iop/IoCreateFile
svn path=/trunk/; revision=15395
2005-05-18 19:26:47 +00:00
|
|
|
STDCALL
|
2005-09-13 23:48:54 +00:00
|
|
|
ObpCaptureObjectName(
|
|
|
|
IN PUNICODE_STRING CapturedName,
|
|
|
|
IN PUNICODE_STRING ObjectName,
|
2006-05-29 03:32:43 +00:00
|
|
|
IN KPROCESSOR_MODE AccessMode,
|
|
|
|
IN BOOLEAN AllocateFromLookaside
|
2005-09-13 23:48:54 +00:00
|
|
|
);
|
|
|
|
|
Object Manager Patch. This patch continues the work done in the previous patch and makes the following changes in order to support OB 2.0 (it basically temporarily fixes a highly incorrect implementation so that caller code will be ready to work with the OB 2.0 without change):
1) The documented Object Create Information Structure and semantics implemented. All Object Attributes and passed data from user-mode is now probed and saved into this object create structure when ObCreateObject is called.
2) ObCreateObject does NOT PERFORM ANY OTHER OPERATION EXCEPT CREATING THE OBJECT ANYMORE. ObCreateObject will NOT insert the Object into the tree and other operations. These are now done correctly by ObInsertObject. Therefore, the biggest hurdle was changing pieces of code which assumed ObCreateObject would be enough.
3) ObInsertObject uses the captured create info for all operations isntead of the Object Attributes.
4) ObFindObject now uses the captured info as well.
5) The OBject name and directory are now stored in the documented Object Name Information, always allocated and freed from non paged pool.
HACKS:
5) Because the registry code is horribly broken and doesn't use ObFindObjectByName, the old ObFindObject had to be temporarily duplicated into CmpFindObject.
7) Win32k used ObInsertObject in CsrInsertObject as a way to create a handle inside csrss. However, OBInsertObject now does more then this. As a temporary hack, ObpCreateHandle is exported from the kernel and called from win32k. A fix needs to be done for this, but I don't know the design of win32k+csrss well enough to find a solution.
8) SEH has been commented out in some places of the new probing code because it breaks smss and explorer. These need to be investigated (seh did not exist in the previous code, so this is not really a hack)
9) Named objects with a parent directory are NOT allowed. However because of bugs in kernel32, the new check has been temporarily disabled. (this check did not exist in the previous code, so this is not really a hack)
The next patch will add a proper ObFindObject which will support a more complete Parse Procedure with context and security information. This is needed for proper registry access (requested by Eric Kohl) and for proper functionality of the Desktop/File creation, which should use the Parse routine, and not the Create Handle Routine. This will also make it possible to remove some previous hacks and pave the way for a fixed Iop/IoCreateFile
svn path=/trunk/; revision=15395
2005-05-18 19:26:47 +00:00
|
|
|
NTSTATUS
|
|
|
|
STDCALL
|
2005-09-13 23:48:54 +00:00
|
|
|
ObpCaptureObjectAttributes(
|
|
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes,
|
|
|
|
IN KPROCESSOR_MODE AccessMode,
|
2006-05-29 03:32:43 +00:00
|
|
|
IN BOOLEAN AllocateFromLookaside,
|
2005-09-13 23:48:54 +00:00
|
|
|
IN POBJECT_CREATE_INFORMATION ObjectCreateInfo,
|
|
|
|
OUT PUNICODE_STRING ObjectName
|
|
|
|
);
|
2005-01-21 10:28:13 +00:00
|
|
|
|
|
|
|
VOID
|
2006-05-29 03:32:43 +00:00
|
|
|
static __inline
|
|
|
|
ObpReleaseCapturedAttributes(IN POBJECT_CREATE_INFORMATION ObjectCreateInfo)
|
|
|
|
{
|
|
|
|
/* Check if we have a security descriptor */
|
|
|
|
if (ObjectCreateInfo->SecurityDescriptor)
|
|
|
|
{
|
|
|
|
/* Release it */
|
|
|
|
SeReleaseSecurityDescriptor(ObjectCreateInfo->SecurityDescriptor,
|
|
|
|
ObjectCreateInfo->ProbeMode,
|
|
|
|
TRUE);
|
|
|
|
ObjectCreateInfo->SecurityDescriptor = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
PVOID
|
|
|
|
static __inline
|
|
|
|
ObpAllocateCapturedAttributes(IN PP_NPAGED_LOOKASIDE_NUMBER Type)
|
|
|
|
{
|
|
|
|
PKPRCB Prcb = KeGetCurrentPrcb();
|
|
|
|
PVOID Buffer;
|
|
|
|
PNPAGED_LOOKASIDE_LIST List;
|
|
|
|
|
|
|
|
/* Get the P list first */
|
|
|
|
List = (PNPAGED_LOOKASIDE_LIST)Prcb->PPLookasideList[Type].P;
|
|
|
|
|
|
|
|
/* Attempt allocation */
|
|
|
|
List->L.TotalAllocates++;
|
|
|
|
Buffer = (PVOID)InterlockedPopEntrySList(&List->L.ListHead);
|
|
|
|
if (!Buffer)
|
|
|
|
{
|
|
|
|
/* Let the balancer know that the P list failed */
|
|
|
|
List->L.AllocateMisses++;
|
|
|
|
|
|
|
|
/* Try the L List */
|
|
|
|
List = (PNPAGED_LOOKASIDE_LIST)Prcb->PPLookasideList[Type].L;
|
|
|
|
List->L.TotalAllocates++;
|
|
|
|
Buffer = (PVOID)InterlockedPopEntrySList(&List->L.ListHead);
|
|
|
|
if (!Buffer)
|
|
|
|
{
|
|
|
|
/* Let the balancer know the L list failed too */
|
|
|
|
List->L.AllocateMisses++;
|
|
|
|
|
|
|
|
/* Allocate it */
|
|
|
|
Buffer = List->L.Allocate(List->L.Type, List->L.Size, List->L.Tag);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Return buffer */
|
|
|
|
return Buffer;
|
|
|
|
}
|
2005-08-08 16:58:30 +00:00
|
|
|
|
2006-05-29 03:32:43 +00:00
|
|
|
VOID
|
|
|
|
static __inline
|
|
|
|
ObpFreeCapturedAttributes(IN PVOID Buffer,
|
|
|
|
IN PP_NPAGED_LOOKASIDE_NUMBER Type)
|
|
|
|
{
|
|
|
|
PKPRCB Prcb = KeGetCurrentPrcb();
|
|
|
|
PNPAGED_LOOKASIDE_LIST List;
|
|
|
|
|
|
|
|
/* Use the P List */
|
|
|
|
List = (PNPAGED_LOOKASIDE_LIST)Prcb->PPLookasideList[Type].P;
|
|
|
|
List->L.TotalFrees++;
|
|
|
|
|
|
|
|
/* Check if the Free was within the Depth or not */
|
|
|
|
if (ExQueryDepthSList(&List->L.ListHead) >= List->L.Depth)
|
|
|
|
{
|
|
|
|
/* Let the balancer know */
|
|
|
|
List->L.FreeMisses++;
|
|
|
|
|
|
|
|
/* Use the L List */
|
|
|
|
List = (PNPAGED_LOOKASIDE_LIST)Prcb->PPLookasideList[Type].L;
|
|
|
|
List->L.TotalFrees++;
|
|
|
|
|
|
|
|
/* Check if the Free was within the Depth or not */
|
|
|
|
if (ExQueryDepthSList(&List->L.ListHead) >= List->L.Depth)
|
|
|
|
{
|
|
|
|
/* All lists failed, use the pool */
|
|
|
|
List->L.FreeMisses++;
|
|
|
|
List->L.Free(Buffer);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* The free was within the Depth */
|
|
|
|
InterlockedPushEntrySList(&List->L.ListHead,
|
|
|
|
(PSINGLE_LIST_ENTRY)Buffer);
|
|
|
|
}
|
|
|
|
}
|
2005-01-21 21:37:32 +00:00
|
|
|
|
2006-05-29 03:32:43 +00:00
|
|
|
VOID
|
|
|
|
static __inline
|
|
|
|
ObpReleaseCapturedName(IN PUNICODE_STRING Name)
|
|
|
|
{
|
|
|
|
/* We know this is a pool-allocation if the size doesn't match */
|
|
|
|
if (Name->MaximumLength != 248)
|
|
|
|
{
|
|
|
|
ExFreePool(Name->Buffer);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* Otherwise, free from the lookaside */
|
|
|
|
ObpFreeCapturedAttributes(Name, LookasideNameBufferList);
|
|
|
|
}
|
|
|
|
}
|
2005-10-10 13:03:55 +00:00
|
|
|
|
2006-05-29 03:32:43 +00:00
|
|
|
VOID
|
|
|
|
static __inline
|
|
|
|
ObpFreeAndReleaseCapturedAttributes(IN POBJECT_CREATE_INFORMATION ObjectCreateInfo)
|
|
|
|
{
|
|
|
|
/* First release the attributes, then free them from the lookaside list */
|
|
|
|
ObpReleaseCapturedAttributes(ObjectCreateInfo);
|
|
|
|
ObpFreeCapturedAttributes(ObjectCreateInfo, LookasideCreateInfoList);
|
|
|
|
}
|
2004-05-02 04:40:25 +00:00
|
|
|
|
1998-09-13 15:55:36 +00:00
|
|
|
#endif /* __INCLUDE_INTERNAL_OBJMGR_H */
|