reactos操作系统实现(52)

接着下来分析具体实现安装过程的函数RunUSetup代码,如下:

#001 VOID

#002 RunUSetup(VOID)

#003 {

#004 INPUT_RECORD Ir;

#005 PAGE_NUMBER Page;

#006 LARGE_INTEGER Time;

#007 NTSTATUS Status;

#008

查询系统时间保存到Time里面。

#009 NtQuerySystemTime(&Time);

#010

下面调用RtlcreateuserThread函数来创建应用程序运行的线程。其中函数PnpEventThread是线程执行的线程函数

#011 Status = RtlcreateuserThread(NtCurrentProcess(),NULL,TRUE,PnpEventThread,&SetupInf,&hPnpThread,NULL);

#012 if (!NT_SUCCESS(Status))

#013 hPnpThread = INVALID_HANDLE_VALUE;

#014

进行控制台初始化,也就是显示初始化。

#015 if (!CONSOLE_Init())

#016 {

如果初始化显示失败,就提示出错,并退出

#017 PrintString(MUIGetString(STRING_CONSOLEFAIL1));

#018 PrintString(MUIGetString(STRING_CONSOLEFAIL2));

#019 PrintString(MUIGetString(STRING_CONSOLEFAIL3));

#020

#021 /* Raise a hard error (crash the system/BSOD) */

#022 NtRaiseHardError(STATUS_SYstem_PROCESS_TERMINATED,

#023 0,0);

#024 }

#025

初始化全局的UNICODE字符串。

#026 /* Initialize global unicode strings */

#027 RtlInitUnicodeString(&SourcePath,NULL);

#028 RtlInitUnicodeString(&SourceRootPath,NULL);

#029 RtlInitUnicodeString(&SourceRootDir,NULL);

#030 RtlInitUnicodeString(&InstallPath,NULL);

#031 RtlInitUnicodeString(&DestinationPath,NULL);

#032 RtlInitUnicodeString(&DestinationArcPath,NULL);

#033 RtlInitUnicodeString(&DestinationRootPath,NULL);

#034 RtlInitUnicodeString(&SystemRootPath,NULL);

#035

隐藏控制台的光标。

#036 /* Hide the cursor */

#037 CONSOLE_SetCursorType(TRUE,FALSE);

#038

循环处理所有安装的流程,并设置第一页显示页面

#039 Page = START_PAGE;

#040 while (Page != REBOOT_PAGE)

#041 {

清除控制台显示内容

#042 CONSOLE_ClearScreen();

#043 CONSOLE_Flush();

#044

#045 //CONSOLE_SetUnderlinedtextxY(4,3," ReactOS " KERNEL_VERSION_STR " Setup ");

#046 //CONSOLE_Flush();

#047

#048 switch (Page)

#049 {

下面显示第一页,启动页面。

#050 /* Start page */

#051 case START_PAGE:

#052 Page = SetupStartPage(&Ir);

#053 break;

#054

语言选择页。

#055 /* Language page */

#056 case LANGUAGE_PAGE:

#057 Page = LanguagePage(&Ir);

#058 break;

#059

声明权利页。

#060 /* License page */

#061 case LICENSE_PAGE:

#062 Page = LicensePage(&Ir);

#063 break;

#064

信息页面

#065 /* Intro page */

#066 case INTRO_PAGE:

#067 Page = IntroPage(&Ir);

#068 break;

#069

安装页面

#070 /* Install pages */

#071 case INSTALL_INTRO_PAGE:

#072 Page = InstallintroPage(&Ir);

#073 break;

#074

还有SCSIOEM安装的页面

#075 #if 0

#076 case SCSI_CONTROLLER_PAGE:

#077 Page = ScsiControllerPage(&Ir);

#078 break;

#079 #endif

#080

#081 #if 0

#082 case OEM_DRIVER_PAGE:

#083 Page = OemDriverPage(&Ir);

#084 break;

#085 #endif

#086

设备配置页面

#087 case DEVICE_SETTINGS_PAGE:

#088 Page = DeviceSettingsPage(&Ir);

#089 break;

#090

计算机设置页面

#091 case COmpuTER_SETTINGS_PAGE:

#092 Page = ComputerSettingsPage(&Ir);

#093 break;

#094

显示设置页面

#095 case disPLAY_SETTINGS_PAGE:

#096 Page = displaySettingsPage(&Ir);

#097 break;

#098

键盘设置页面

#099 case KEYBOARD_SETTINGS_PAGE:

#100 Page = KeyboardSettingsPage(&Ir);

#101 break;

#102

本地配置设置页面

#103 case LAYOUT_SETTINGS_PAGE:

#104 Page = LayoutSettingsPage(&Ir);

#105 break;

#106

选择磁盘分区安装页面

#107 case SELECT_PARTITION_PAGE:

#108 Page = SelectPartitionPage(&Ir);

#109 break;

#110

创建磁盘分区页面

#111 case CREATE_PARTITION_PAGE:

#112 Page = CreatePartitionPage(&Ir);

#113 break;

#114

删除磁盘分区页面

#115 case DELETE_PARTITION_PAGE:

#116 Page = DeletePartitionPage(&Ir);

#117 break;

#118

选择文件系统格式页面

#119 case SELECT_FILE_SYstem_PAGE:

#120 Page = SelectFileSystemPage(&Ir);

#121 break;

#122

格式化系统页面

#123 case FORMAT_PARTITION_PAGE:

#124 Page = (PAGE_NUMBER) FormatPartitionPage(&Ir);

#125 break;

#126

检查文件系统页面

#127 case CHECK_FILE_SYstem_PAGE:

#128 Page = (PAGE_NUMBER) CheckFileSystemPage(&Ir);

#129 break;

#130

选择安装目录页面

#131 case INSTALL_DIRECTORY_PAGE:

#132 Page = InstallDirectoryPage(&Ir);

#133 break;

#134

准备拷贝文件页面

#135 case PREPARE_copY_PAGE:

#136 Page = PreparecopyPage(&Ir);

#137 break;

#138

文件拷贝页面

#139 case FILE_copY_PAGE:

#140 Page = FilecopyPage(&Ir);

#141 break;

#142

注册组件页面

#143 case REGISTRY_PAGE:

#144 Page = RegistryPage(&Ir);

#145 break;

#146

引导页面

#147 case BOOT_LOADER_PAGE:

#148 Page = BootLoaderPage(&Ir);

#149 break;

#150

软盘引导页面

#151 case BOOT_LOADER_FLOPPY_PAGE:

#152 Page = BootLoaderFloppyPage(&Ir);

#153 break;

#154

硬盘引导页面

#155 case BOOT_LOADER_HARDdisK_PAGE:

#156 Page = BootLoaderHarddiskPage(&Ir);

#157 break;

#158

修复系统页面

#159 /* Repair pages */

#160 case REPAIR_INTRO_PAGE:

#161 Page = RepairIntroPage(&Ir);

#162 break;

#163

成功安装页面

#164 case SUCCESS_PAGE:

#165 Page = Successpage(&Ir);

#166 break;

#167

写入页面

#168 case FLUSH_PAGE:

#169 Page = FlushPage(&Ir);

#170 break;

#171

退出页面

#172 case QUIT_PAGE:

#173 Page = QuitPage(&Ir);

#174 break;

#175

重新启动页面。

#176 case REBOOT_PAGE:

#177 break;

#178 }

#179 }

#180

删除控制台。

#181 FreeConsole();

#182

#183 /* Avoid bugcheck */

#184 Time.QuadPart += 50000000;

#185 NtDelayExecution(FALSE,&Time);

#186

设置系统需要重新启动。

#187 /* Reboot */

#188 NtShutdownSystem(ShutdownReboot);

关闭当前进程。

#189 NtTerminateProcess(NtCurrentProcess(),0);

#190 }

在这函数里主要创建了一个即插即用的事件响应线程,然后就进入循环处理不同的过程处理。

相关文章

一、前言 在组件方面react和Vue一样的,核心思想玩的就是组件...
前言: 前段时间学习完react后,刚好就接到公司一个react项目...
前言: 最近收到组长通知我们项目组后面新开的项目准备统一技...
react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom...