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, 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 

 

还有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  }

 

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

你可能感兴趣的:(reactos操作系统实现(52))