接着下来分析具体实现安装过程的函数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, 0, 0, 0, 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,0,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
还有SCSI和OEM安装的页面。
#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 }
在这个函数里主要创建了一个即插即用的事件响应线程,然后就进入循环处理不同的过程处理。