From 0342a00bdec6b79cc67cfc66c3ad2142dba2d832 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Tue, 4 Jul 2006 22:41:47 +0000 Subject: [PATCH] - Fix and combine the creation of I/O Object Types, it was a complete mess with missing attributes and dangerous bugs (Adapters and Controllers had IopParseDevice as a parse routine and the same pool charge as a deivice object, etc.) svn path=/trunk/; revision=22852 --- reactos/ntoskrnl/include/internal/io.h | 13 ++++++-- reactos/ntoskrnl/io/iomgr/driver.c | 16 ---------- reactos/ntoskrnl/io/iomgr/iocomp.c | 20 ------------ reactos/ntoskrnl/io/iomgr/iomgr.c | 42 +++++++++++++++++++------- 4 files changed, 41 insertions(+), 50 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/io.h b/reactos/ntoskrnl/include/internal/io.h index b1d19bd6c4c..eb8f94a111c 100644 --- a/reactos/ntoskrnl/include/internal/io.h +++ b/reactos/ntoskrnl/include/internal/io.h @@ -772,6 +772,12 @@ IopInitializeSystemDrivers( VOID ); +VOID +NTAPI +IopDeleteDriver( + IN PVOID ObjectBody +); + NTSTATUS FASTCALL IopCreateDriverObject( @@ -925,9 +931,9 @@ IopRemoveTimerFromTimerList( // I/O Completion Routines // VOID -FASTCALL -IopInitIoCompletionImplementation( - VOID +NTAPI +IopDeleteIoCompletion( + PVOID ObjectBody ); // @@ -994,6 +1000,7 @@ extern POBJECT_TYPE IoCompletionType; extern PDEVICE_NODE IopRootDeviceNode; extern ULONG IopTraceLevel; extern NPAGED_LOOKASIDE_LIST IopMdlLookasideList; +extern GENERIC_MAPPING IopCompletionMapping; // // Inlined Functions diff --git a/reactos/ntoskrnl/io/iomgr/driver.c b/reactos/ntoskrnl/io/iomgr/driver.c index 61b9bb8a551..f9c6684c5f0 100644 --- a/reactos/ntoskrnl/io/iomgr/driver.c +++ b/reactos/ntoskrnl/io/iomgr/driver.c @@ -115,22 +115,6 @@ VOID INIT_FUNCTION IopInitDriverImplementation(VOID) { - OBJECT_TYPE_INITIALIZER ObjectTypeInitializer; - UNICODE_STRING Name; - - DPRINT("Creating Registry Object Type\n"); - - /* Initialize the Driver object type */ - RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer)); - RtlInitUnicodeString(&Name, L"Driver"); - ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer); - ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(DRIVER_OBJECT); - ObjectTypeInitializer.PoolType = NonPagedPool; - ObjectTypeInitializer.UseDefaultObject = TRUE; - ObjectTypeInitializer.DeleteProcedure = IopDeleteDriver; - - ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &IoDriverObjectType); - InitializeListHead(&DriverReinitListHead); KeInitializeSpinLock(&DriverReinitListLock); DriverReinitTailEntry = NULL; diff --git a/reactos/ntoskrnl/io/iomgr/iocomp.c b/reactos/ntoskrnl/io/iomgr/iocomp.c index 50ae6cf186e..3d0cd0df314 100644 --- a/reactos/ntoskrnl/io/iomgr/iocomp.c +++ b/reactos/ntoskrnl/io/iomgr/iocomp.c @@ -111,26 +111,6 @@ IopDeleteIoCompletion(PVOID ObjectBody) } } -VOID -FASTCALL -IopInitIoCompletionImplementation(VOID) -{ - OBJECT_TYPE_INITIALIZER ObjectTypeInitializer; - UNICODE_STRING Name; - - /* Initialize the Driver object type */ - RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer)); - RtlInitUnicodeString(&Name, L"IoCompletion"); - ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer); - ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(KQUEUE); - ObjectTypeInitializer.PoolType = NonPagedPool; - ObjectTypeInitializer.ValidAccessMask = IO_COMPLETION_ALL_ACCESS; - ObjectTypeInitializer.UseDefaultObject = TRUE; - ObjectTypeInitializer.GenericMapping = IopCompletionMapping; - ObjectTypeInitializer.DeleteProcedure = IopDeleteIoCompletion; - ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &IoCompletionType); -} - /* PUBLIC FUNCTIONS **********************************************************/ /* diff --git a/reactos/ntoskrnl/io/iomgr/iomgr.c b/reactos/ntoskrnl/io/iomgr/iomgr.c index 070f7df6960..66b617d8f4d 100644 --- a/reactos/ntoskrnl/io/iomgr/iomgr.c +++ b/reactos/ntoskrnl/io/iomgr/iomgr.c @@ -232,21 +232,14 @@ IoInit (VOID) UNICODE_STRING LinkName = RTL_CONSTANT_STRING(L"\\DosDevices"); HANDLE Handle; - IopInitDriverImplementation(); - - DPRINT("Creating Device Object Type\n"); - - /* Initialize the Driver object type */ + /* Initialize default settings */ RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer)); - RtlInitUnicodeString(&Name, L"Device"); ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer); - ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(DEVICE_OBJECT); ObjectTypeInitializer.PoolType = NonPagedPool; + ObjectTypeInitializer.InvalidAttributes = OBJ_OPENLINK; ObjectTypeInitializer.ValidAccessMask = FILE_ALL_ACCESS; ObjectTypeInitializer.UseDefaultObject = TRUE; ObjectTypeInitializer.GenericMapping = IopFileMapping; - ObjectTypeInitializer.ParseProcedure = IopParseDevice; - ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &IoDeviceObjectType); /* Do the Adapter Type */ RtlInitUnicodeString(&Name, L"Adapter"); @@ -257,10 +250,37 @@ IoInit (VOID) ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(CONTROLLER_OBJECT); ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &IoControllerObjectType); + /* Do the Device Type */ + RtlInitUnicodeString(&Name, L"Device"); + ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(DEVICE_OBJECT); + ObjectTypeInitializer.ParseProcedure = IopParseDevice; + ObjectTypeInitializer.SecurityProcedure = IopSecurityFile; + ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &IoDeviceObjectType); + + /* Initialize the Driver object type */ + RtlInitUnicodeString(&Name, L"Driver"); + ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(DRIVER_OBJECT); + ObjectTypeInitializer.DeleteProcedure = IopDeleteDriver; + ObjectTypeInitializer.ParseProcedure = NULL; + ObjectTypeInitializer.SecurityProcedure = NULL; + ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &IoDriverObjectType); + + /* Initialize the I/O Completion object type */ + RtlInitUnicodeString(&Name, L"IoCompletion"); + ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(KQUEUE); + ObjectTypeInitializer.ValidAccessMask = IO_COMPLETION_ALL_ACCESS; + ObjectTypeInitializer.InvalidAttributes |= OBJ_PERMANENT; + ObjectTypeInitializer.GenericMapping = IopCompletionMapping; + ObjectTypeInitializer.DeleteProcedure = IopDeleteIoCompletion; + ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &IoCompletionType); + /* Initialize the File object type */ RtlInitUnicodeString(&Name, L"File"); - ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer); ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(FILE_OBJECT); + ObjectTypeInitializer.InvalidAttributes |= OBJ_EXCLUSIVE; + ObjectTypeInitializer.MaintainHandleCount = TRUE; + ObjectTypeInitializer.ValidAccessMask = FILE_ALL_ACCESS; + ObjectTypeInitializer.GenericMapping = IopFileMapping; ObjectTypeInitializer.CloseProcedure = IopCloseFile; ObjectTypeInitializer.DeleteProcedure = IopDeleteFile; ObjectTypeInitializer.SecurityProcedure = IopSecurityFile; @@ -341,6 +361,7 @@ IoInit (VOID) /* * Initialize remaining subsubsystem */ + IopInitDriverImplementation(); IoInitCancelHandling(); IoInitFileSystemImplementation(); IoInitVpbImplementation(); @@ -348,7 +369,6 @@ IoInit (VOID) IopInitPnpNotificationImplementation(); IopInitErrorLog(); IopInitTimerImplementation(); - IopInitIoCompletionImplementation(); IopInitLookasideLists(); /*