I/O管理器是管理着整个计算机的输入和输出的操作,因此它是一个基本的组成部份。I/O管理器的初始化调用是在文件reactos/ntoskrnl/ex/init.c里,它主要调用I/O管理器的函数IoInitSystem()来实现,这个函数在文件reactos/ntoskrnl/io/iomgr/iomgr.c里。这个函数的实现代码如下:
#001 BOOLEAN
#002 INIT_FUNCTION
#003 NTAPI
#004 IoInitSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
#005 {
#006 LARGE_INTEGER ExpireTime;
#007 NTSTATUS Status;
#008 CHAR Buffer[256];
#009 ANSI_STRING NtBootPath,RootString;
#010
清空NT引导的目录。
#011 /* Initialize empty NT Boot Path */
#012 RtlInitEmptyAnsiString(&NtBootPath,Buffer,sizeof(Buffer));
#013
初始化I/O的后备列表。
#014 /* Initialize the lookaside lists */
#015 IopInitLookasideLists();
#016
初始化I/O相关的锁和列表。
#017 /* Initialize all locks and lists */
#018 ExInitializeResource(&IopDatabaseResource);
#019 ExInitializeResource(&FileSystemListLock);
#020 ExInitializeResource(&IopSecurityResource);
#021 KeInitializeGuardedMutex(&FsChangeNotifyListLock);
#022 KeInitializeGuardedMutex(&PnpNotifyListLock);
#023 InitializeListHead(&IopDiskFsListHead);
#024 InitializeListHead(&IopCdRomFsListHead);
#025 InitializeListHead(&IopTapeFsListHead);
#026 InitializeListHead(&IopNetworkFsListHead);
#027 InitializeListHead(&DriverBootReinitListHead);
#028 InitializeListHead(&DriverReinitListHead);
#029 InitializeListHead(&PnpNotifyListHead);
#030 InitializeListHead(&ShutdownListHead);
#031 InitializeListHead(&LastChanceShutdownListHead);
#032 InitializeListHead(&FsChangeNotifyListHead);
#033 InitializeListHead(&IopErrorLogListHead);
#034 KeInitializeSpinLock(&IoStatisticsLock);
#035 KeInitializeSpinLock(&DriverReinitListLock);
#036 KeInitializeSpinLock(&DriverBootReinitListLock);
#037 KeInitializeSpinLock(&ShutdownListLock);
#038 KeInitializeSpinLock(&IopLogListLock);
#039
初始化定时器自旋锁。
#040 /* Initialize Timer List Lock */
#041 KeInitializeSpinLock(&IopTimerLock);
#042
初始化定时器列表。
#043 /* Initialize Timer List */
#044 InitializeListHead(&IopTimerQueueHead);
#045
初始化DPC的定时器。
#046 /* Initialize the DPC/Timer which will call the other Timer Routines */
#047 ExpireTime.QuadPart = -10000000;
#048 KeInitializeDpc(&IopTimerDpc,IopTimerDispatch,NULL);
#049 KeInitializeTimerEx(&IopTimer,SynchronizationTimer);
#050 KeSetTimerEx(&IopTimer,ExpireTime,1000,&IopTimerDpc);
#051
创建一些与I/O相关的对象。
#052 /* Create Object Types */
#053 if (!IopCreateObjectTypes()) return FALSE;
#054
创建驱动程序和文件系统的根目录。
#055 /* Create Object Directories */
#056 if (!IopCreateRootDirectories()) return FALSE;
#057
初始化PnP管理器。
#058 /* Initialize PnP manager */
#059 PnpInit();
#060
#061 /* Create the group driver list */
#062 IoCreateDriverList();
#063
加载启动时的驱动程序,并释放启动的文件占用资源。
#064 /* Load boot start drivers */
#065 IopInitializeBootDrivers();
#066
需要回调的引导驱动程序。
#067 /* Call back drivers that asked for */
#068 IopReinitializeBootDrivers();
#069
初始化PnP相关的设备。
#070 /* Initialize PnP root relations */
#071 IopEnumerateDevice(IopRootDeviceNode->PhysicalDeviceObject);
#072
检查是否通过内存盘来引导。
#073 /* Check if this was a ramdisk boot */
#074 if (!_strnicmp(LoaderBlock->ArcBootDeviceName,"ramdisk(0)",10))
#075 {
#076 /* Initialize the ramdisk driver */
#077 IopStartRamdisk(LoaderBlock);
#078 }
#079
为引导设备创建ARC名称。
#080 /* Create ARC names for boot devices */
#081 IopCreateArcNames(LoaderBlock);
#082
标记系统引导分区。
#083 /* Mark the system boot partition */
#084 if (!IopMarkBootPartition(LoaderBlock)) return FALSE;
#085
初始化KDB调试系统。
#086 #ifndef _WINKD_
#087 /* Read KDB Data */
#088 KdbInit();
#089
#090 /* I/O is now setup for disk access,so phase 3 */
#091 KdInitSystem(3,LoaderBlock);
#092 #endif
#093
加载PnP管理器发现的驱动服务程序。
#094 /* Load services for devices found by PnP manager */
#095 IopInitializePnpServices(IopRootDeviceNode);
#096
加载系统驱动程序。
#097 /* Load system start drivers */
#098 PnpSystemInit = TRUE;
#099 IopInitializeSystemDrivers();
#100
删除组驱动程序列表,释放占用系统资源。
#101 /* Destroy the group driver list */
#102 IoDestroyDriverList();
#103
重新初始化驱动程序。
#104 /* Reinitialize drivers that requested it */
#105 IopReinitializeDrivers();
#106
转换系统根目录的ARC名称为NT路径。
#107 /* Convert SystemRoot from ARC to NT path */
#108 Status = IopReassignSystemRoot(LoaderBlock,&NtBootPath);
#109 if (!NT_SUCCESS(Status)) return FALSE;
#110
设置根路径的字符串。
#111 /* Set the ANSI_STRING for the root path */
#112 RootString.MaximumLength = NtSystemRoot.MaximumLength / sizeof(WCHAR);
#113 RootString.Length = 0;
#114 RootString.Buffer = ExAllocatePoolWithTag(PagedPool,
#115 RootString.MaximumLength,
#116 TAG_IO);
#117
#118 /* Convert the path into the ANSI_STRING */
#119 Status = RtlUnicodeStringToAnsiString(&RootString,&NtSystemRoot,FALSE);
#120 if (!NT_SUCCESS(Status)) return FALSE;
#121
设置驱动器的名称。
#122 /* Assign drive letters */
#123 IoAssignDriveLetters(LoaderBlock,
#124 &NtBootPath,
#125 (PUCHAR)RootString.Buffer,
#126 &RootString);
#127
#128 /* Update system root */
#129 Status = RtlAnsiStringToUnicodeString(&NtSystemRoot,&RootString,FALSE);
#130 if (!NT_SUCCESS(Status)) return FALSE;
#131
加载系统的动态连接和其它入口程序。
#132 /* Load the System DLL and its Entrypoints */
#133 if (!NT_SUCCESS(PsLocateSystemDll())) return FALSE;
#134
#135 /* Return success */
#136 return TRUE;
#137}