ReactOS通过对象管理机制为内核提供了一致的和安全的访问方式。对象管理器是一个用于创建、删除、保护和跟踪对象的内核一部份。由于I/O管理的设备是多方面的,就需要创建很多对象来表达这种设备,下面就来了解关于I/O相关的对象,初始化的代码如下:
#001 BOOLEAN
#002 INIT_FUNCTION
#003 NTAPI
#004 IopCreateObjectTypes(VOID)
#005 {
#006 OBJECT_TYPE_INITIALIZER ObjectTypeInitializer;
#007 UNICODE_STRING Name;
#008 初始化对象为缺省的设置。
#009 /* Initialize default settings */ #010 RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer)); #011 ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer); #012 ObjectTypeInitializer.PoolType = NonPagedPool; #013 ObjectTypeInitializer.InvalidAttributes = OBJ_OPENLINK; #014 ObjectTypeInitializer.ValidAccessMask = FILE_ALL_ACCESS; #015 ObjectTypeInitializer.UseDefaultObject = TRUE; #016 ObjectTypeInitializer.GenericMapping = IopFileMapping; #017
创建适配器对象。
#018 /* Do the Adapter Type */ #019 RtlInitUnicodeString(&Name, L"Adapter"); #020 if (!NT_SUCCESS(ObCreateObjectType(&Name, #021 &ObjectTypeInitializer, #022 NULL, #023 &IoAdapterObjectType))) return FALSE; #024
创建控制器对象。
#025 /* Do the Controller Type */ #026 RtlInitUnicodeString(&Name, L"Controller"); #027 ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(CONTROLLER_OBJECT); #028 if (!NT_SUCCESS(ObCreateObjectType(&Name, #029 &ObjectTypeInitializer, #030 NULL, #031 &IoControllerObjectType))) return FALSE; #032
创建设备对象,设置分析回调函数是IopParseDevice。
#033 /* Do the Device Type. FIXME: Needs Delete Routine! */ #034 RtlInitUnicodeString(&Name, L"Device"); #035 ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(DEVICE_OBJECT); #036 ObjectTypeInitializer.ParseProcedure = IopParseDevice; #037 ObjectTypeInitializer.SecurityProcedure = IopSecurityFile; #038 if (!NT_SUCCESS(ObCreateObjectType(&Name, #039 &ObjectTypeInitializer, #040 NULL, #041 &IoDeviceObjectType))) return FALSE; #042
创建驱动程序对象。
#043 /* Initialize the Driver object type */ #044 RtlInitUnicodeString(&Name, L"Driver"); #045 ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(DRIVER_OBJECT); #046 ObjectTypeInitializer.DeleteProcedure = IopDeleteDriver; #047 ObjectTypeInitializer.ParseProcedure = NULL; #048 ObjectTypeInitializer.SecurityProcedure = NULL; #049 if (!NT_SUCCESS(ObCreateObjectType(&Name, #050 &ObjectTypeInitializer, #051 NULL, #052 &IoDriverObjectType))) return FALSE; #053