reactos操作系统实现(71)
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} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |