reactos操作系统实现(63)

 

前面把注册表初始化完成之后,就开始进行安装引导程序了。这里安装的引导程序是分区引导程序,或者安装到软盘引导程序。当然也可以选择跳过不安装它,界面如下:

 

 reactos操作系统实现(63)_第1张图片

这个函数的代码如下:

#001  static PAGE_NUMBER

#002  BootLoaderPage(PINPUT_RECORD Ir)

#003  {

#004      UCHAR PartitionType;

#005      BOOLEAN InstallOnFloppy;

#006      USHORT Line = 12;

#007 

#008      CONSOLE_SetStatusText(MUIGetString(STRING_PLEASEWAIT));

#009 

 

取得分区的磁盘类型。根据不同的分区类型进行检查是否可以安装引导程序。

#010      PartitionType = PartitionList->ActiveBootPartition->PartInfo[0].PartitionType;

#011 

#012      if (PartitionType == PARTITION_ENTRY_UNUSED)

#013      {

#014          DPRINT("Error: active partition invalid (unused)/n");

#015          InstallOnFloppy = TRUE;

#016      }

#017      else if (PartitionType == 0x0A)

#018      {

#019          /* OS/2 boot manager partition */

#020          DPRINT("Found OS/2 boot manager partition/n");

#021          InstallOnFloppy = TRUE;

#022      }

#023      else if (PartitionType == 0x83)

#024      {

#025          /* Linux ext2 partition */

#026          DPRINT("Found Linux ext2 partition/n");

#027          InstallOnFloppy = TRUE;

#028      }

#029      else if (PartitionType == PARTITION_IFS)

#030      {

#031          /* NTFS partition */

#032          DPRINT("Found NTFS partition/n");

#033          InstallOnFloppy = TRUE;

#034      }

#035      else if ((PartitionType == PARTITION_FAT_12) ||

#036               (PartitionType == PARTITION_FAT_16) ||

#037               (PartitionType == PARTITION_HUGE) ||

#038               (PartitionType == PARTITION_XINT13) ||

#039               (PartitionType == PARTITION_FAT32) ||

#040               (PartitionType == PARTITION_FAT32_XINT13))

#041      {

 

目前只支持FAT12FAT16FAT32的文件系统安装引导程序。

#042          DPRINT("Found FAT partition/n");

#043          InstallOnFloppy = FALSE;

#044      }

#045      else

#046      {

#047          /* Unknown partition */

#048          DPRINT("Unknown partition found/n");

#049          InstallOnFloppy = TRUE;

#050      }

#051 

#052      if (InstallOnFloppy == TRUE)

#053      {

#054          return BOOT_LOADER_FLOPPY_PAGE;

#055      }

#056 

 

检查是否无人参与安装方式。

#057      if (IsUnattendedSetup)

#058      {

#059          if (UnattendMBRInstallType == 0) /* skip MBR installation */

#060          {

#061              return SUCCESS_PAGE;

#062          }

#063          else if (UnattendMBRInstallType == 1) /* install on floppy */

#064          {

#065              return BOOT_LOADER_FLOPPY_PAGE;

#066          }

#067          else if (UnattendMBRInstallType == 2) /* install on hdd */

#068          {

#069              return BOOT_LOADER_HARDDISK_PAGE;

#070          }

#071      }

#072 

 

开始显示安装引导标题。

#073      MUIDisplayPage(BOOT_LOADER_PAGE);

#074      CONSOLE_InvertTextXY(8, Line, 60, 1);

#075 

 

循环地检查用户的输入。

#076      while(TRUE)

#077      {

#078          CONSOLE_ConInKey(Ir);

#079 

 

下一行的菜单选择。

#080          if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&

#081              (Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN))  /* DOWN */

#082          {

#083              CONSOLE_NormalTextXY(8, Line, 60, 1);

#084 

#085              Line++;

#086              if (Line<12) Line=14;

#087              if (Line>14) Line=12;

#088 

#089              CONSOLE_InvertTextXY(8, Line, 60, 1);

#090          }

 

上一行的菜单选择。

#091          else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&

#092                   (Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP))  /* UP */

#093          {

#094              CONSOLE_NormalTextXY(8, Line, 60, 1);

#095 

#096              Line--;

#097              if (Line<12) Line=14;

#098              if (Line>14) Line=12;

#099 

#100              CONSOLE_InvertTextXY(8, Line, 60, 1);

#101          }

 

如果按F3就表示退出操作系统安装。

#102          else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&

#103                   (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3))  /* F3 */

#104          {

#105              if (ConfirmQuit(Ir) == TRUE)

#106                  return QUIT_PAGE;

#107 

#108              break;

#109          }

 

如果按回车键就检查选择那一个选项,然后进入不同的页面操作。

#110          else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D)     /* ENTER */

#111          {

#112              if (Line == 12)

#113              {

#114                  return BOOT_LOADER_HARDDISK_PAGE;

#115              }

#116              else if (Line == 13)

#117              {

#118                  return BOOT_LOADER_FLOPPY_PAGE;

#119              }

#120              else if (Line == 14)

#121              {

#122                  return SUCCESS_PAGE;;

#123              }

#124 

#125              return BOOT_LOADER_PAGE;

#126          }

#127      }

#128 

#129      return BOOT_LOADER_PAGE;

#130  }

 

你可能感兴趣的:(react)