- Fix initialiization of the object manager lookaside lists.

- Rename the variables to understandable names.
- Don't leak object locks when destroying an object type.
- Directory objects must be case-insensitive.
- Symbolic links must be case-insensitive.
- Create \KernelObjects directory during startup.

svn path=/trunk/; revision=32811
This commit is contained in:
Aleksey Bragin 2008-04-01 19:27:58 +00:00
parent 43d5fa83aa
commit 24e07f0eac
3 changed files with 93 additions and 39 deletions

View file

@ -123,6 +123,21 @@ typedef struct _OB_TEMP_BUFFER
AUX_DATA AuxData; AUX_DATA AuxData;
} OB_TEMP_BUFFER, *POB_TEMP_BUFFER; } OB_TEMP_BUFFER, *POB_TEMP_BUFFER;
//
// Startup and Shutdown Functions
//
BOOLEAN
NTAPI
ObInitSystem(
VOID
);
VOID
NTAPI
ObShutdownSystem(
VOID
);
// //
// Directory Namespace Functions // Directory Namespace Functions
// //
@ -330,6 +345,12 @@ ObpFreeObjectNameBuffer(
IN PUNICODE_STRING Name IN PUNICODE_STRING Name
); );
VOID
NTAPI
ObpDeleteObjectType(
IN PVOID Object
);
// //
// DOS Devices Functions // DOS Devices Functions
// //
@ -541,7 +562,7 @@ extern POBJECT_DIRECTORY ObpTypeDirectoryObject;
extern PHANDLE_TABLE ObpKernelHandleTable; extern PHANDLE_TABLE ObpKernelHandleTable;
extern WORK_QUEUE_ITEM ObpReaperWorkItem; extern WORK_QUEUE_ITEM ObpReaperWorkItem;
extern volatile PVOID ObpReaperList; extern volatile PVOID ObpReaperList;
extern NPAGED_LOOKASIDE_LIST ObpNmLookasideList, ObpCiLookasideList; extern GENERAL_LOOKASIDE ObpNameBufferLookasideList, ObpCreateInfoLookasideList;
extern BOOLEAN IoCountOperations; extern BOOLEAN IoCountOperations;
extern ALIGNEDNAME ObpDosDevicesShortNamePrefix; extern ALIGNEDNAME ObpDosDevicesShortNamePrefix;
extern ALIGNEDNAME ObpDosDevicesShortNameRoot; extern ALIGNEDNAME ObpDosDevicesShortNameRoot;

View file

@ -61,7 +61,7 @@ ObInit2(VOID)
{ {
CCHAR i; CCHAR i;
PKPRCB Prcb; PKPRCB Prcb;
PNPAGED_LOOKASIDE_LIST CurrentList = NULL; PGENERAL_LOOKASIDE CurrentList = NULL;
/* Now allocate the per-processor lists */ /* Now allocate the per-processor lists */
for (i = 0; i < KeNumberProcessors; i++) for (i = 0; i < KeNumberProcessors; i++)
@ -70,54 +70,52 @@ ObInit2(VOID)
Prcb = KiProcessorBlock[(int)i]; Prcb = KiProcessorBlock[(int)i];
/* Set the OBJECT_CREATE_INFORMATION List */ /* Set the OBJECT_CREATE_INFORMATION List */
Prcb->PPLookasideList[LookasideCreateInfoList].L = &ObpCiLookasideList.L; Prcb->PPLookasideList[LookasideCreateInfoList].L = &ObpCreateInfoLookasideList;
CurrentList = ExAllocatePoolWithTag(NonPagedPool, CurrentList = ExAllocatePoolWithTag(NonPagedPool,
sizeof(NPAGED_LOOKASIDE_LIST), sizeof(GENERAL_LOOKASIDE),
TAG('O', 'b', 'C', 'I')); TAG('O', 'b', 'C', 'I'));
if (CurrentList) if (CurrentList)
{ {
/* Initialize it */ /* Initialize it */
ExInitializeNPagedLookasideList(CurrentList, ExInitializeSystemLookasideList(CurrentList,
NULL, NonPagedPool,
NULL,
0,
sizeof(OBJECT_CREATE_INFORMATION), sizeof(OBJECT_CREATE_INFORMATION),
TAG('O', 'b', 'C', 'I'), TAG('O', 'b', 'C', 'I'),
32); 32,
&ExSystemLookasideListHead);
} }
else else
{ {
/* No list, use the static buffer */ /* No list, use the static buffer */
CurrentList = &ObpCiLookasideList; CurrentList = &ObpCreateInfoLookasideList;
} }
/* Link it */ /* Link it */
Prcb->PPLookasideList[LookasideCreateInfoList].P = &CurrentList->L; Prcb->PPLookasideList[LookasideCreateInfoList].P = CurrentList;
/* Set the captured UNICODE_STRING Object Name List */ /* Set the captured UNICODE_STRING Object Name List */
Prcb->PPLookasideList[LookasideNameBufferList].L = &ObpNmLookasideList.L; Prcb->PPLookasideList[LookasideNameBufferList].L = &ObpNameBufferLookasideList;
CurrentList = ExAllocatePoolWithTag(NonPagedPool, CurrentList = ExAllocatePoolWithTag(NonPagedPool,
sizeof(NPAGED_LOOKASIDE_LIST), sizeof(GENERAL_LOOKASIDE),
TAG('O', 'b', 'N', 'M')); TAG('O', 'b', 'N', 'M'));
if (CurrentList) if (CurrentList)
{ {
/* Initialize it */ /* Initialize it */
ExInitializeNPagedLookasideList(CurrentList, ExInitializeSystemLookasideList(CurrentList,
NULL, PagedPool,
NULL,
0,
248, 248,
TAG('O', 'b', 'N', 'M'), TAG('O', 'b', 'N', 'M'),
16); 16,
&ExSystemLookasideListHead);
} }
else else
{ {
/* No list, use the static buffer */ /* No list, use the static buffer */
CurrentList = &ObpNmLookasideList; CurrentList = &ObpNameBufferLookasideList;
} }
/* Link it */ /* Link it */
Prcb->PPLookasideList[LookasideNameBufferList].P = &CurrentList->L; Prcb->PPLookasideList[LookasideNameBufferList].P = CurrentList;
} }
return TRUE; return TRUE;
@ -144,34 +142,32 @@ ObInit(VOID)
if (ObpInitializationPhase != 0) goto ObPostPhase0; if (ObpInitializationPhase != 0) goto ObPostPhase0;
/* Initialize the OBJECT_CREATE_INFORMATION List */ /* Initialize the OBJECT_CREATE_INFORMATION List */
ExInitializeNPagedLookasideList(&ObpCiLookasideList, ExInitializeSystemLookasideList(&ObpCreateInfoLookasideList,
NULL, NonPagedPool,
NULL,
0,
sizeof(OBJECT_CREATE_INFORMATION), sizeof(OBJECT_CREATE_INFORMATION),
TAG('O', 'b', 'C', 'I'), TAG('O', 'b', 'C', 'I'),
32); 32,
&ExSystemLookasideListHead);
/* Set the captured UNICODE_STRING Object Name List */ /* Set the captured UNICODE_STRING Object Name List */
ExInitializeNPagedLookasideList(&ObpNmLookasideList, ExInitializeSystemLookasideList(&ObpNameBufferLookasideList,
NULL, PagedPool,
NULL,
0,
248, 248,
TAG('O', 'b', 'N', 'M'), TAG('O', 'b', 'N', 'M'),
16); 16,
&ExSystemLookasideListHead);
/* Temporarily setup both pointers to the shared list */ /* Temporarily setup both pointers to the shared list */
Prcb->PPLookasideList[LookasideCreateInfoList].L = &ObpCiLookasideList.L; Prcb->PPLookasideList[LookasideCreateInfoList].L = &ObpCreateInfoLookasideList;
Prcb->PPLookasideList[LookasideCreateInfoList].P = &ObpCiLookasideList.L; Prcb->PPLookasideList[LookasideCreateInfoList].P = &ObpCreateInfoLookasideList;
Prcb->PPLookasideList[LookasideNameBufferList].L = &ObpNmLookasideList.L; Prcb->PPLookasideList[LookasideNameBufferList].L = &ObpNameBufferLookasideList;
Prcb->PPLookasideList[LookasideNameBufferList].P = &ObpNmLookasideList.L; Prcb->PPLookasideList[LookasideNameBufferList].P = &ObpNameBufferLookasideList;
/* Initialize the security descriptor cache */ /* Initialize the security descriptor cache */
ObpInitSdCache(); ObpInitSdCache();
/* Initialize the Default Event */ /* Initialize the Default Event */
KeInitializeEvent(&ObpDefaultObject, NotificationEvent, TRUE ); KeInitializeEvent(&ObpDefaultObject, NotificationEvent, TRUE);
/* Setup default access for the system process */ /* Setup default access for the system process */
PsGetCurrentProcess()->GrantedAccess = PROCESS_ALL_ACCESS; PsGetCurrentProcess()->GrantedAccess = PROCESS_ALL_ACCESS;
@ -198,21 +194,22 @@ ObInit(VOID)
ObjectTypeInitializer.GenericMapping = ObpTypeMapping; ObjectTypeInitializer.GenericMapping = ObpTypeMapping;
ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(OBJECT_TYPE); ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(OBJECT_TYPE);
ObjectTypeInitializer.InvalidAttributes = OBJ_OPENLINK; ObjectTypeInitializer.InvalidAttributes = OBJ_OPENLINK;
ObjectTypeInitializer.DeleteProcedure = ObpDeleteObjectType;
ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &ObpTypeObjectType); ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &ObpTypeObjectType);
/* Create the Directory Type */ /* Create the Directory Type */
RtlInitUnicodeString(&Name, L"Directory"); RtlInitUnicodeString(&Name, L"Directory");
ObjectTypeInitializer.ValidAccessMask = DIRECTORY_ALL_ACCESS; ObjectTypeInitializer.ValidAccessMask = DIRECTORY_ALL_ACCESS;
ObjectTypeInitializer.UseDefaultObject = FALSE; ObjectTypeInitializer.CaseInsensitive = TRUE;
ObjectTypeInitializer.MaintainTypeList = FALSE; ObjectTypeInitializer.MaintainTypeList = FALSE;
ObjectTypeInitializer.GenericMapping = ObpDirectoryMapping; ObjectTypeInitializer.GenericMapping = ObpDirectoryMapping;
ObjectTypeInitializer.DeleteProcedure = NULL;
ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(OBJECT_DIRECTORY); ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(OBJECT_DIRECTORY);
ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &ObDirectoryType); ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &ObDirectoryType);
/* Create 'symbolic link' object type */ /* Create 'symbolic link' object type */
RtlInitUnicodeString(&Name, L"SymbolicLink"); RtlInitUnicodeString(&Name, L"SymbolicLink");
ObjectTypeInitializer.DefaultNonPagedPoolCharge = ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(OBJECT_SYMBOLIC_LINK);
sizeof(OBJECT_SYMBOLIC_LINK);
ObjectTypeInitializer.GenericMapping = ObpSymbolicLinkMapping; ObjectTypeInitializer.GenericMapping = ObpSymbolicLinkMapping;
ObjectTypeInitializer.ValidAccessMask = SYMBOLIC_LINK_ALL_ACCESS; ObjectTypeInitializer.ValidAccessMask = SYMBOLIC_LINK_ALL_ACCESS;
ObjectTypeInitializer.ParseProcedure = ObpParseSymbolicLink; ObjectTypeInitializer.ParseProcedure = ObpParseSymbolicLink;
@ -255,6 +252,24 @@ ObPostPhase0:
Status = NtClose(Handle); Status = NtClose(Handle);
if (!NT_SUCCESS(Status)) return FALSE; if (!NT_SUCCESS(Status)) return FALSE;
/* Initialize Object Types directory attributes */
RtlInitUnicodeString(&Name, L"\\KernelObjects");
InitializeObjectAttributes(&ObjectAttributes,
&Name,
OBJ_CASE_INSENSITIVE | OBJ_PERMANENT,
NULL,
NULL);
/* Create the directory */
Status = NtCreateDirectoryObject(&Handle,
DIRECTORY_ALL_ACCESS,
&ObjectAttributes);
if (!NT_SUCCESS(Status)) return FALSE;
/* Close the extra handle */
Status = NtClose(Handle);
if (!NT_SUCCESS(Status)) return FALSE;
/* Initialize Object Types directory attributes */ /* Initialize Object Types directory attributes */
RtlInitUnicodeString(&Name, L"\\ObjectTypes"); RtlInitUnicodeString(&Name, L"\\ObjectTypes");
InitializeObjectAttributes(&ObjectAttributes, InitializeObjectAttributes(&ObjectAttributes,

View file

@ -22,7 +22,7 @@ extern ULONG NtGlobalFlag;
POBJECT_TYPE ObpTypeObjectType = NULL; POBJECT_TYPE ObpTypeObjectType = NULL;
KEVENT ObpDefaultObject; KEVENT ObpDefaultObject;
NPAGED_LOOKASIDE_LIST ObpNmLookasideList, ObpCiLookasideList; GENERAL_LOOKASIDE ObpNameBufferLookasideList, ObpCreateInfoLookasideList;
WORK_QUEUE_ITEM ObpReaperWorkItem; WORK_QUEUE_ITEM ObpReaperWorkItem;
volatile PVOID ObpReaperList; volatile PVOID ObpReaperList;
@ -1236,6 +1236,24 @@ ObCreateObjectType(IN PUNICODE_STRING TypeName,
return STATUS_INSUFFICIENT_RESOURCES; return STATUS_INSUFFICIENT_RESOURCES;
} }
VOID
NTAPI
ObpDeleteObjectType(IN PVOID Object)
{
ULONG i;
POBJECT_TYPE ObjectType = (PVOID)Object;
/* Loop our locks */
for (i = 0; i < 4; i++)
{
/* Delete each one */
ExDeleteResourceLite(&ObjectType->ObjectLocks[i]);
}
/* Delete our main mutex */
ExDeleteResourceLite(&ObjectType->Mutex);
}
/*++ /*++
* @name ObMakeTemporaryObject * @name ObMakeTemporaryObject
* @implemented NT4 * @implemented NT4