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
还有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 }
在这个函数里主要创建了一个即插即用的事件响应线程,然后就进入循环处理不同的过程处理。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |