reactos操作系统实现(141)

 在操作系统启动的早期阶段,由于很多基本的功能没有初始化(比如IO管理器都没有初始化),因此完整和功能强大的显示驱动程序是不可能运行的,那么就需要在这个阶段写一个比较简单的VGA显示驱动程序给内核引导时使用,这个驱动程序就是bootvid.dll

 

先来分析在内核里调用初始化的位置,具体如下:

#001  VOID

#002  NTAPI

#003  Phase1InitializationDiscard(IN PVOID Context)

#004  {

......

#045 

 

检查是否需要使用GUI显示引导信息,如果不需要GUI显示,那么NoGuiBoot就为TRUE

#046      /* Check if GUI Boot is enabled */

#047      NoGuiBoot = (strstr(CommandLine, "NOGUIBOOT")) ? TRUE: FALSE;

#048 

#049      /* Get the SOS setting */

#050      SosEnabled = strstr(CommandLine, "SOS") ? TRUE: FALSE;

#051 

 

下面就是调用bootvid.dll里的函数来初始化。

#052      /* Setup the boot driver */

#053      InbvEnableBootDriver(!NoGuiBoot);

#054      InbvDriverInitialize(LoaderBlock, 18);

 

InbvEnableBootDriver函数用来清除已经显示的状态,并且根据是否使用GUI显示设置InbvDisplayState显示状态。

#001  NTAPI

#002  InbvEnableBootDriver(IN BOOLEAN Enable)

#003  {

#004      /* Check if we're installed */

 

检查是否已经加载了显示驱动程序。

#005      if (InbvBootDriverInstalled)

#006      {

 

是否已经失去显示控制。

#007          /* Check for lost state */

#008          if (InbvDisplayState >= INBV_DISPLAY_STATE_LOST) return;

#009 

 

获取显示控制权,然后清空当前显示内容。

#010          /* Acquire the lock */

#011          InbvAcquireLock();

#012 

#013          /* Cleanup the screen if we own it */

#014          if (InbvDisplayState == INBV_DISPLAY_STATE_OWNED) VidCleanUp();

#015 

 

设置是否显示GUI界面。

#016          /* Set the new display state */

#017          InbvDisplayState = Enable ? INBV_DISPLAY_STATE_OWNED:

#018                                      INBV_DISPLAY_STATE_DISABLED;

#019 

#020          /* Release the lock */

#021          InbvReleaseLock();

#022      }

#023      else

#024      {

 

设置是否显示GUI界面。

#025          /* Set the new display state */

#026          InbvDisplayState = Enable ? INBV_DISPLAY_STATE_OWNED:

#027                                      INBV_DISPLAY_STATE_DISABLED;

#028      }

#029  }

 

posted @ 2009-11-24 23:34  ajuanabc  阅读(235)  评论(0编辑  收藏  举报