reactos操作系统实现(71)

前端之家收集整理的这篇文章主要介绍了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相关文章