在操作系统启动的早期阶段,由于很多基本的功能没有初始化(比如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
#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}