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  }

你可能感兴趣的:(react)