@H_502_2@ReactOS通过对象管理机制为内核提供了一致的和安全的访问方式。对象管理器是一个用于创建、删除、保护和跟踪对象的内核一部份。由于I/O管理的设备是多方面的,就需要创建很多对象来表达这种设备,下面就来了解关于I/O相关的对象,初始化的代码如下: @H_502_2@#001 BOOLEAN @H_502_2@#002 INIT_FUNCTION @H_502_2@#003 NTAPI @H_502_2@#004 IopCreateObjectTypes(VOID) @H_502_2@#005 { @H_502_2@#006 OBJECT_TYPE_INITIALIZER ObjectTypeInitializer; @H_502_2@#007 UNICODE_STRING Name; @H_502_2@#008 @H_502_2@ @H_502_2@初始化对象为缺省的设置。 @H_502_2@#009 /* Initialize default settings */ @H_502_2@#010 RtlZeroMemory(&ObjectTypeInitializer,sizeof(ObjectTypeInitializer)); @H_502_2@#011 ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer); @H_502_2@#012 ObjectTypeInitializer.PoolType = NonPagedPool; @H_502_2@#013 ObjectTypeInitializer.InvalidAttributes = OBJ_OPENLINK; @H_502_2@#014 ObjectTypeInitializer.ValidAccessMask = FILE_ALL_ACCESS; @H_502_2@#015 ObjectTypeInitializer.UseDefaultObject = TRUE; @H_502_2@#016 ObjectTypeInitializer.GenericMapping = IopFileMapping; @H_502_2@#017 @H_502_2@ @H_502_2@创建适配器对象。 @H_502_2@#018 /* Do the Adapter Type */ @H_502_2@#019 RtlInitUnicodeString(&Name,L"Adapter"); @H_502_2@#020 if (!NT_SUCCESS(ObCreateObjectType(&Name, @H_502_2@#021 &ObjectTypeInitializer, @H_502_2@#022 NULL, @H_502_2@#023 &IoAdapterObjectType))) return FALSE; @H_502_2@#024 @H_502_2@ @H_502_2@创建控制器对象。 @H_502_2@#025 /* Do the Controller Type */ @H_502_2@#026 RtlInitUnicodeString(&Name,L"Controller"); @H_502_2@#027 ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(CONTROLLER_OBJECT); @H_502_2@#028 if (!NT_SUCCESS(ObCreateObjectType(&Name, @H_502_2@#029 &ObjectTypeInitializer, @H_502_2@#030 NULL, @H_502_2@#031 &IoControllerObjectType))) return FALSE; @H_502_2@#032 @H_502_2@ @H_502_2@创建设备对象,设置分析回调函数是IopParseDevice。 @H_502_2@#033 /* Do the Device Type. FIXME: Needs Delete Routine! */ @H_502_2@#034 RtlInitUnicodeString(&Name,L"Device"); @H_502_2@#035 ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(DEVICE_OBJECT); @H_502_2@#036 ObjectTypeInitializer.ParseProcedure = IopParseDevice; @H_502_2@#037 ObjectTypeInitializer.SecurityProcedure = IopSecurityFile; @H_502_2@#038 if (!NT_SUCCESS(ObCreateObjectType(&Name, @H_502_2@#039 &ObjectTypeInitializer, @H_502_2@#040 NULL, @H_502_2@#041 &IoDeviceObjectType))) return FALSE; @H_502_2@#042 @H_502_2@ @H_502_2@创建驱动程序对象。 @H_502_2@#043 /* Initialize the Driver object type */ @H_502_2@#044 RtlInitUnicodeString(&Name,L"Driver"); @H_502_2@#045 ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(DRIVER_OBJECT); @H_502_2@#046 ObjectTypeInitializer.DeleteProcedure = IopDeleteDriver; @H_502_2@#047 ObjectTypeInitializer.ParseProcedure = NULL; @H_502_2@#048 ObjectTypeInitializer.SecurityProcedure = NULL; @H_502_2@#049 if (!NT_SUCCESS(ObCreateObjectType(&Name, @H_502_2@#050 &ObjectTypeInitializer, @H_502_2@#051 NULL, @H_502_2@#052 &IoDriverObjectType))) return FALSE; @H_502_2@#053 @H_502_2@ @H_502_2@创建I/O端口完成对象。 @H_502_2@#054 /* Initialize the I/O Completion object type */ @H_502_2@#055 RtlInitUnicodeString(&Name,L"IoCompletion"); @H_502_2@#056 ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(KQUEUE); @H_502_2@#057 ObjectTypeInitializer.ValidAccessMask = IO_COMPLETION_ALL_ACCESS; @H_502_2@#058 ObjectTypeInitializer.InvalidAttributes |= OBJ_PERMANENT; @H_502_2@#059 ObjectTypeInitializer.GenericMapping = IopCompletionMapping; @H_502_2@#060 ObjectTypeInitializer.DeleteProcedure = IopDeleteIoCompletion; @H_502_2@#061 if (!NT_SUCCESS(ObCreateObjectType(&Name, @H_502_2@#062 &ObjectTypeInitializer, @H_502_2@#063 NULL, @H_502_2@#064 &IoCompletionType))) return FALSE; @H_502_2@#065 @H_502_2@ @H_502_2@创建文件对象。 @H_502_2@#066 /* Initialize the File object type */ @H_502_2@#067 RtlInitUnicodeString(&Name,L"File"); @H_502_2@#068 ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(FILE_OBJECT); @H_502_2@#069 ObjectTypeInitializer.InvalidAttributes |= OBJ_EXCLUSIVE; @H_502_2@#070 ObjectTypeInitializer.MaintainHandleCount = TRUE; @H_502_2@#071 ObjectTypeInitializer.ValidAccessMask = FILE_ALL_ACCESS; @H_502_2@#072 ObjectTypeInitializer.GenericMapping = IopFileMapping; @H_502_2@#073 ObjectTypeInitializer.CloseProcedure = IopCloseFile; @H_502_2@#074 ObjectTypeInitializer.DeleteProcedure = IopDeleteFile; @H_502_2@#075 ObjectTypeInitializer.SecurityProcedure = IopSecurityFile; @H_502_2@#076 ObjectTypeInitializer.QueryNameProcedure = IopQueryNameFile; @H_502_2@#077 ObjectTypeInitializer.ParseProcedure = IopParseFile; @H_502_2@#078 ObjectTypeInitializer.UseDefaultObject = FALSE; @H_502_2@#079 if (!NT_SUCCESS(ObCreateObjectType(&Name, @H_502_2@#080 &ObjectTypeInitializer, @H_502_2@#081 NULL, @H_502_2@#082 &IoFileObjectType))) return FALSE; @H_502_2@#083 @H_502_2@#084 /* Success */ @H_502_2@#085 return TRUE; @H_502_2@#086 } @H_502_2@这里主要就是根据不同的对象,设置不同的特性。