1 /* INCLUDES ******************************************************************/
6 #include "bootvid/bootvid.h"
8 /* GLOBALS *******************************************************************/
11 * Enable this define if you want Inbv to use coloured headless mode.
13 // #define INBV_HEADLESS_COLORS
16 * ReactOS uses the same boot screen for all the products.
17 * Also it doesn't use a parallel system thread for the
18 * rotating "progress" bar.
22 * Enable this define when ReactOS will have different SKUs
23 * (Workstation, Server, Storage Server, Cluster Server, etc...).
25 // #define REACTOS_SKUS
28 * Enable this define when Inbv will support rotating progress bar.
30 // #define INBV_ROTBAR_IMPLEMENTED
32 static KSPIN_LOCK BootDriverLock
;
33 static KIRQL InbvOldIrql
;
34 static INBV_DISPLAY_STATE InbvDisplayState
= INBV_DISPLAY_STATE_DISABLED
;
35 BOOLEAN InbvBootDriverInstalled
= FALSE
;
36 static BOOLEAN InbvDisplayDebugStrings
= FALSE
;
37 static INBV_DISPLAY_STRING_FILTER InbvDisplayFilter
= NULL
;
38 static ULONG ProgressBarLeft
= 0, ProgressBarTop
= 0;
39 static BOOLEAN ShowProgressBar
= FALSE
;
40 static INBV_PROGRESS_STATE InbvProgressState
;
41 static BT_PROGRESS_INDICATOR InbvProgressIndicator
= {0, 25, 0};
42 static INBV_RESET_DISPLAY_PARAMETERS InbvResetDisplayParameters
= NULL
;
43 static ULONG ResourceCount
= 0;
44 static PUCHAR ResourceList
[1 + IDB_CLUSTER_SERVER
]; // First entry == NULL, followed by 'ResourceCount' entries.
46 #ifdef INBV_ROTBAR_IMPLEMENTED
47 static BOOLEAN RotBarThreadActive
= FALSE
;
48 static ROT_BAR_TYPE RotBarSelection
;
49 static ULONG PltRotBarStatus
;
54 * Headless terminal text colors
57 #ifdef INBV_HEADLESS_COLORS
59 // Conversion table CGA to ANSI color index
60 static const UCHAR CGA_TO_ANSI_COLOR_TABLE
[16] =
78 67 // Bright Grey (White)
81 #define CGA_TO_ANSI_COLOR(CgaColor) \
82 CGA_TO_ANSI_COLOR_TABLE[CgaColor & 0x0F]
86 // Default colors: text in white, background in black
87 static ULONG InbvTerminalTextColor
= 37;
88 static ULONG InbvTerminalBkgdColor
= 40;
91 /* FADING FUNCTION ***********************************************************/
93 /** From include/psdk/wingdi.h **/
94 typedef struct tagRGBQUAD
100 } RGBQUAD
,*LPRGBQUAD
;
101 /*******************************/
103 static RGBQUAD MainPalette
[16];
105 #define PALETTE_FADE_STEPS 15
106 #define PALETTE_FADE_TIME 20 * 1000 /* 20ms */
108 /** From bootvid/precomp.h **/
112 typedef struct tagBITMAPINFOHEADER
121 LONG biXPelsPerMeter
;
122 LONG biYPelsPerMeter
;
124 ULONG biClrImportant
;
125 } BITMAPINFOHEADER
, *PBITMAPINFOHEADER
;
126 /****************************/
131 VOID NTAPI
InbvAcquireLock(VOID
);
132 VOID NTAPI
InbvReleaseLock(VOID
);
137 UCHAR PaletteBitmapBuffer
[sizeof(BITMAPINFOHEADER
) + sizeof(MainPalette
)];
138 PBITMAPINFOHEADER PaletteBitmap
= (PBITMAPINFOHEADER
)PaletteBitmapBuffer
;
139 LPRGBQUAD Palette
= (LPRGBQUAD
)(PaletteBitmapBuffer
+ sizeof(BITMAPINFOHEADER
));
141 ULONG Iteration
, Index
, ClrUsed
;
143 /* Check if we're installed and we own it */
144 if (InbvBootDriverInstalled
&&
145 (InbvDisplayState
== INBV_DISPLAY_STATE_OWNED
))
147 /* Acquire the lock */
151 * Build a bitmap containing the fade in palette. The palette entries
152 * are then processed in a loop and set using VidBitBlt function.
154 ClrUsed
= RTL_NUMBER_OF(MainPalette
);
155 RtlZeroMemory(PaletteBitmap
, sizeof(BITMAPINFOHEADER
));
156 PaletteBitmap
->biSize
= sizeof(BITMAPINFOHEADER
);
157 PaletteBitmap
->biBitCount
= 4;
158 PaletteBitmap
->biClrUsed
= ClrUsed
;
161 * Main animation loop.
163 for (Iteration
= 0; Iteration
<= PALETTE_FADE_STEPS
; ++Iteration
)
165 for (Index
= 0; Index
< ClrUsed
; Index
++)
167 Palette
[Index
].rgbRed
= (UCHAR
)
168 (MainPalette
[Index
].rgbRed
* Iteration
/ PALETTE_FADE_STEPS
);
169 Palette
[Index
].rgbGreen
= (UCHAR
)
170 (MainPalette
[Index
].rgbGreen
* Iteration
/ PALETTE_FADE_STEPS
);
171 Palette
[Index
].rgbBlue
= (UCHAR
)
172 (MainPalette
[Index
].rgbBlue
* Iteration
/ PALETTE_FADE_STEPS
);
175 VidBitBlt(PaletteBitmapBuffer
, 0, 0);
178 KeStallExecutionProcessor(PALETTE_FADE_TIME
);
181 /* Release the lock */
185 KeStallExecutionProcessor(PALETTE_FADE_TIME
);
189 /* FUNCTIONS *****************************************************************/
194 FindBitmapResource(IN PLOADER_PARAMETER_BLOCK LoaderBlock
,
197 UNICODE_STRING UpString
= RTL_CONSTANT_STRING(L
"ntoskrnl.exe");
198 UNICODE_STRING MpString
= RTL_CONSTANT_STRING(L
"ntkrnlmp.exe");
199 PLIST_ENTRY NextEntry
, ListHead
;
200 PLDR_DATA_TABLE_ENTRY LdrEntry
;
201 PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry
;
202 LDR_RESOURCE_INFO ResourceInfo
;
206 /* Loop the driver list */
207 ListHead
= &LoaderBlock
->LoadOrderListHead
;
208 NextEntry
= ListHead
->Flink
;
209 while (NextEntry
!= ListHead
)
212 LdrEntry
= CONTAINING_RECORD(NextEntry
,
213 LDR_DATA_TABLE_ENTRY
,
216 /* Check for a match */
217 if (RtlEqualUnicodeString(&LdrEntry
->BaseDllName
, &UpString
, TRUE
) ||
218 RtlEqualUnicodeString(&LdrEntry
->BaseDllName
, &MpString
, TRUE
))
225 /* Check if we found it */
226 if (NextEntry
!= ListHead
)
228 /* Try to find the resource */
229 ResourceInfo
.Type
= 2; // RT_BITMAP;
230 ResourceInfo
.Name
= ResourceId
;
231 ResourceInfo
.Language
= 0;
232 Status
= LdrFindResource_U(LdrEntry
->DllBase
,
236 if (NT_SUCCESS(Status
))
238 /* Access the resource */
240 Status
= LdrAccessResource(LdrEntry
->DllBase
,
244 if ((Data
) && (ResourceId
< 3))
246 KiBugCheckData
[4] ^= RtlComputeCrc32(0, Data
, Size
);
248 if (!NT_SUCCESS(Status
)) Data
= NULL
;
252 /* Return the pointer */
259 InbvDriverInitialize(IN PLOADER_PARAMETER_BLOCK LoaderBlock
,
263 BOOLEAN ResetMode
= FALSE
; // By default do not reset the video mode
266 /* Quit if we're already installed */
267 if (InbvBootDriverInstalled
) return TRUE
;
269 /* Initialize the lock and check the current display state */
270 KeInitializeSpinLock(&BootDriverLock
);
271 if (InbvDisplayState
== INBV_DISPLAY_STATE_OWNED
)
273 /* Reset the video mode in case we do not have a custom boot logo */
274 CommandLine
= (LoaderBlock
->LoadOptions
? _strupr(LoaderBlock
->LoadOptions
) : NULL
);
275 ResetMode
= (CommandLine
== NULL
) || (strstr(CommandLine
, "BOOTLOGO") == NULL
);
278 /* Initialize the video */
279 InbvBootDriverInstalled
= VidInitialize(ResetMode
);
280 if (InbvBootDriverInstalled
)
282 /* Find bitmap resources in the kernel */
283 ResourceCount
= min(Count
, RTL_NUMBER_OF(ResourceList
) - 1);
284 for (i
= 1; i
<= ResourceCount
; i
++)
287 ResourceList
[i
] = FindBitmapResource(LoaderBlock
, i
);
290 /* Set the progress bar ranges */
291 InbvSetProgressBarSubset(0, 100);
294 /* Return install state */
295 return InbvBootDriverInstalled
;
300 InbvAcquireLock(VOID
)
304 /* Check if we're at dispatch level or lower */
305 OldIrql
= KeGetCurrentIrql();
306 if (OldIrql
<= DISPATCH_LEVEL
)
308 /* Loop until the lock is free */
309 while (!KeTestSpinLock(&BootDriverLock
));
311 /* Raise IRQL to dispatch level */
312 KeRaiseIrql(DISPATCH_LEVEL
, &OldIrql
);
315 /* Acquire the lock */
316 KiAcquireSpinLock(&BootDriverLock
);
317 InbvOldIrql
= OldIrql
;
322 InbvReleaseLock(VOID
)
326 /* Capture the old IRQL */
327 OldIrql
= InbvOldIrql
;
329 /* Release the driver lock */
330 KiReleaseSpinLock(&BootDriverLock
);
332 /* If we were at dispatch level or lower, restore the old IRQL */
333 if (InbvOldIrql
<= DISPATCH_LEVEL
) KeLowerIrql(OldIrql
);
339 InbvEnableBootDriver(IN BOOLEAN Enable
)
341 /* Check if we're installed */
342 if (InbvBootDriverInstalled
)
344 /* Check for lost state */
345 if (InbvDisplayState
>= INBV_DISPLAY_STATE_LOST
) return;
347 /* Acquire the lock */
350 /* Cleanup the screen if we own it */
351 if (InbvDisplayState
== INBV_DISPLAY_STATE_OWNED
) VidCleanUp();
353 /* Set the new display state */
354 InbvDisplayState
= Enable
? INBV_DISPLAY_STATE_OWNED
:
355 INBV_DISPLAY_STATE_DISABLED
;
357 /* Release the lock */
362 /* Set the new display state */
363 InbvDisplayState
= Enable
? INBV_DISPLAY_STATE_OWNED
:
364 INBV_DISPLAY_STATE_DISABLED
;
370 InbvAcquireDisplayOwnership(VOID
)
372 /* Check if we have a callback and we're just acquiring it now */
373 if ((InbvResetDisplayParameters
) &&
374 (InbvDisplayState
== INBV_DISPLAY_STATE_LOST
))
376 /* Call the callback */
377 InbvResetDisplayParameters(80, 50);
380 /* Acquire the display */
381 InbvDisplayState
= INBV_DISPLAY_STATE_OWNED
;
386 InbvSetDisplayOwnership(IN BOOLEAN DisplayOwned
)
388 /* Set the new display state */
389 InbvDisplayState
= DisplayOwned
? INBV_DISPLAY_STATE_OWNED
:
390 INBV_DISPLAY_STATE_LOST
;
395 InbvCheckDisplayOwnership(VOID
)
397 /* Return if we own it or not */
398 return InbvDisplayState
!= INBV_DISPLAY_STATE_LOST
;
403 InbvGetDisplayState(VOID
)
405 /* Return the actual state */
406 return InbvDisplayState
;
411 InbvDisplayString(IN PCHAR String
)
413 /* Make sure we own the display */
414 if (InbvDisplayState
== INBV_DISPLAY_STATE_OWNED
)
416 /* If we're not allowed, return success anyway */
417 if (!InbvDisplayDebugStrings
) return TRUE
;
419 /* Check if a filter is installed */
420 if (InbvDisplayFilter
) InbvDisplayFilter(&String
);
422 /* Acquire the lock */
425 /* Make sure we're installed and display the string */
426 if (InbvBootDriverInstalled
) VidDisplayString((PUCHAR
)String
);
428 /* Print the string on the EMS port */
429 HeadlessDispatch(HeadlessCmdPutString
,
431 strlen(String
) + sizeof(ANSI_NULL
),
435 /* Release the lock */
442 /* We don't own it, fail */
448 InbvEnableDisplayString(IN BOOLEAN Enable
)
452 /* Get the old setting */
453 OldSetting
= InbvDisplayDebugStrings
;
456 InbvDisplayDebugStrings
= Enable
;
458 /* Return the old setting */
464 InbvInstallDisplayStringFilter(IN INBV_DISPLAY_STRING_FILTER Filter
)
466 /* Save the filter */
467 InbvDisplayFilter
= Filter
;
472 InbvIsBootDriverInstalled(VOID
)
474 /* Return driver state */
475 return InbvBootDriverInstalled
;
480 InbvNotifyDisplayOwnershipLost(IN INBV_RESET_DISPLAY_PARAMETERS Callback
)
482 /* Check if we're installed */
483 if (InbvBootDriverInstalled
)
485 /* Acquire the lock and cleanup if we own the screen */
487 if (InbvDisplayState
!= INBV_DISPLAY_STATE_LOST
) VidCleanUp();
489 /* Set the reset callback and display state */
490 InbvResetDisplayParameters
= Callback
;
491 InbvDisplayState
= INBV_DISPLAY_STATE_LOST
;
493 /* Release the lock */
498 /* Set the reset callback and display state */
499 InbvResetDisplayParameters
= Callback
;
500 InbvDisplayState
= INBV_DISPLAY_STATE_LOST
;
506 InbvResetDisplay(VOID
)
508 /* Check if we're installed and we own it */
509 if (InbvBootDriverInstalled
&&
510 (InbvDisplayState
== INBV_DISPLAY_STATE_OWNED
))
513 VidResetDisplay(TRUE
);
517 /* Nothing to reset */
523 InbvSetScrollRegion(IN ULONG Left
,
528 /* Just call bootvid */
529 VidSetScrollRegion(Left
, Top
, Right
, Bottom
);
534 InbvSetTextColor(IN ULONG Color
)
536 HEADLESS_CMD_SET_COLOR HeadlessSetColor
;
538 /* Set color for EMS port */
539 #ifdef INBV_HEADLESS_COLORS
540 InbvTerminalTextColor
= 30 + CGA_TO_ANSI_COLOR(Color
);
542 InbvTerminalTextColor
= 37;
544 HeadlessSetColor
.TextColor
= InbvTerminalTextColor
;
545 HeadlessSetColor
.BkgdColor
= InbvTerminalBkgdColor
;
546 HeadlessDispatch(HeadlessCmdSetColor
,
548 sizeof(HeadlessSetColor
),
552 /* Update the text color */
553 VidSetTextColor(Color
);
558 InbvSolidColorFill(IN ULONG Left
,
564 HEADLESS_CMD_SET_COLOR HeadlessSetColor
;
566 /* Make sure we own it */
567 if (InbvDisplayState
== INBV_DISPLAY_STATE_OWNED
)
569 /* Acquire the lock */
572 /* Check if we're installed */
573 if (InbvBootDriverInstalled
)
576 VidSolidColorFill(Left
, Top
, Right
, Bottom
, (UCHAR
)Color
);
579 /* Set color for EMS port and clear display */
580 #ifdef INBV_HEADLESS_COLORS
581 InbvTerminalBkgdColor
= 40 + CGA_TO_ANSI_COLOR(Color
);
583 InbvTerminalBkgdColor
= 40;
585 HeadlessSetColor
.TextColor
= InbvTerminalTextColor
;
586 HeadlessSetColor
.BkgdColor
= InbvTerminalBkgdColor
;
587 HeadlessDispatch(HeadlessCmdSetColor
,
589 sizeof(HeadlessSetColor
),
592 HeadlessDispatch(HeadlessCmdClearDisplay
,
596 /* Release the lock */
604 InbvUpdateProgressBar(IN ULONG Progress
)
606 ULONG FillCount
, BoundedProgress
;
608 /* Make sure the progress bar is enabled, that we own and are installed */
609 if (ShowProgressBar
&&
610 InbvBootDriverInstalled
&&
611 (InbvDisplayState
== INBV_DISPLAY_STATE_OWNED
))
613 /* Compute fill count */
614 BoundedProgress
= (InbvProgressState
.Floor
/ 100) + Progress
;
615 FillCount
= 121 * (InbvProgressState
.Bias
* BoundedProgress
) / 1000000;
617 /* Acquire the lock */
620 /* Fill the progress bar */
621 VidSolidColorFill(ProgressBarLeft
,
623 ProgressBarLeft
+ FillCount
,
627 /* Release the lock */
634 InbvBufferToScreenBlt(IN PUCHAR Buffer
,
641 /* Check if we're installed and we own it */
642 if (InbvBootDriverInstalled
&&
643 (InbvDisplayState
== INBV_DISPLAY_STATE_OWNED
))
646 VidBufferToScreenBlt(Buffer
, X
, Y
, Width
, Height
, Delta
);
652 InbvBitBlt(IN PUCHAR Buffer
,
656 /* Check if we're installed and we own it */
657 if (InbvBootDriverInstalled
&&
658 (InbvDisplayState
== INBV_DISPLAY_STATE_OWNED
))
660 /* Acquire the lock */
664 VidBitBlt(Buffer
, X
, Y
);
666 /* Release the lock */
673 InbvScreenToBufferBlt(IN PUCHAR Buffer
,
680 /* Check if we're installed and we own it */
681 if (InbvBootDriverInstalled
&&
682 (InbvDisplayState
== INBV_DISPLAY_STATE_OWNED
))
685 VidScreenToBufferBlt(Buffer
, X
, Y
, Width
, Height
, Delta
);
691 InbvSetProgressBarCoordinates(IN ULONG Left
,
694 /* Update the coordinates */
695 ProgressBarLeft
= Left
;
696 ProgressBarTop
= Top
;
698 /* Enable the progress bar */
699 ShowProgressBar
= TRUE
;
704 InbvSetProgressBarSubset(IN ULONG Floor
,
708 ASSERT(Floor
< Ceiling
);
709 ASSERT(Ceiling
<= 100);
711 /* Update the progress bar state */
712 InbvProgressState
.Floor
= Floor
* 100;
713 InbvProgressState
.Ceiling
= Ceiling
* 100;
714 InbvProgressState
.Bias
= (Ceiling
* 100) - Floor
;
720 InbvIndicateProgress(VOID
)
724 /* Increase progress */
725 InbvProgressIndicator
.Count
++;
727 /* Compute new percentage */
728 Percentage
= min(100 * InbvProgressIndicator
.Count
/
729 InbvProgressIndicator
.Expected
,
731 if (Percentage
!= InbvProgressIndicator
.Percentage
)
733 /* Percentage has moved, update the progress bar */
734 InbvProgressIndicator
.Percentage
= Percentage
;
735 InbvUpdateProgressBar(Percentage
);
741 InbvGetResourceAddress(IN ULONG ResourceNumber
)
743 /* Validate the resource number */
744 if (ResourceNumber
> ResourceCount
) return NULL
;
746 /* Return the address */
747 return ResourceList
[ResourceNumber
];
752 NtDisplayString(IN PUNICODE_STRING DisplayString
)
754 OEM_STRING OemString
;
756 /* Convert the string to OEM and display it */
757 RtlUnicodeStringToOemString(&OemString
, DisplayString
, TRUE
);
758 InbvDisplayString(OemString
.Buffer
);
759 RtlFreeOemString(&OemString
);
762 return STATUS_SUCCESS
;
768 DisplayBootBitmap(IN BOOLEAN TextMode
)
770 PVOID Header
= NULL
, Footer
= NULL
, Screen
= NULL
;
772 #ifdef INBV_ROTBAR_IMPLEMENTED
774 ROT_BAR_TYPE TempRotBarSelection
= RB_UNSPECIFIED
;
782 #ifdef INBV_ROTBAR_IMPLEMENTED
783 /* Check if the system thread has already been created */
784 if (RotBarThreadActive
)
786 /* Reset the progress bar */
788 RotBarSelection
= RB_UNSPECIFIED
;
793 ShowProgressBar
= FALSE
;
795 /* Check if this is text mode */
798 /* Check the type of the OS: workstation or server */
799 if (SharedUserData
->NtProductType
== NtProductWinNt
)
801 /* Workstation; set colors */
802 InbvSetTextColor(15);
803 InbvSolidColorFill(0, 0, 639, 479, 7);
804 InbvSolidColorFill(0, 421, 639, 479, 1);
807 Header
= InbvGetResourceAddress(IDB_WKSTA_HEADER
);
808 Footer
= InbvGetResourceAddress(IDB_WKSTA_FOOTER
);
812 /* Server; set colors */
813 InbvSetTextColor(14);
814 InbvSolidColorFill(0, 0, 639, 479, 6);
815 InbvSolidColorFill(0, 421, 639, 479, 1);
818 Header
= InbvGetResourceAddress(IDB_SERVER_HEADER
);
819 Footer
= InbvGetResourceAddress(IDB_SERVER_FOOTER
);
822 /* Set the scrolling region */
823 InbvSetScrollRegion(32, 80, 631, 400);
825 /* Make sure we have resources */
826 if (Header
&& Footer
)
828 /* BitBlt them on the screen */
829 InbvBitBlt(Footer
, 0, 419);
830 InbvBitBlt(Header
, 0, 0);
835 /* Is the boot driver installed? */
836 if (!InbvBootDriverInstalled
) return;
838 /* Load the standard boot screen */
839 Screen
= InbvGetResourceAddress(IDB_BOOT_SCREEN
);
843 if (SharedUserData
->NtProductType
== NtProductWinNt
)
845 #ifdef INBV_ROTBAR_IMPLEMENTED
846 /* Workstation product, use appropriate status bar color */
847 Bar
= InbvGetResourceAddress(IDB_BAR_WKSTA
);
852 /* Display correct branding based on server suite */
853 if (ExVerifySuite(StorageServer
))
855 /* Storage Server Edition */
856 Text
= InbvGetResourceAddress(IDB_STORAGE_SERVER
);
858 else if (ExVerifySuite(ComputeServer
))
860 /* Compute Cluster Edition */
861 Text
= InbvGetResourceAddress(IDB_CLUSTER_SERVER
);
866 Text
= InbvGetResourceAddress(IDB_SERVER_LOGO
);
869 #ifdef INBV_ROTBAR_IMPLEMENTED
870 /* Server product, use appropriate status bar color */
871 Bar
= InbvGetResourceAddress(IDB_BAR_SERVER
);
876 /* Make sure we have a logo */
879 PBITMAPINFOHEADER BitmapInfoHeader
;
883 * Save the main image palette and replace it with black palette,
884 * so that we can do fade in effect later.
886 BitmapInfoHeader
= (PBITMAPINFOHEADER
)Screen
;
887 Palette
= (LPRGBQUAD
)((PUCHAR
)Screen
+ BitmapInfoHeader
->biSize
);
888 RtlCopyMemory(MainPalette
, Palette
, sizeof(MainPalette
));
889 RtlZeroMemory(Palette
, sizeof(MainPalette
));
891 /* Blit the background */
892 InbvBitBlt(Screen
, 0, 0);
894 #ifdef INBV_ROTBAR_IMPLEMENTED
895 /* Choose progress bar */
896 TempRotBarSelection
= RB_SQUARE_CELLS
;
899 /* Set progress bar coordinates and display it */
900 InbvSetProgressBarCoordinates(259, 352);
903 /* Check for non-workstation products */
904 if (SharedUserData
->NtProductType
!= NtProductWinNt
)
906 /* Overwrite part of the logo for a server product */
907 InbvScreenToBufferBlt(Buffer
, 413, 237, 7, 7, 8);
908 InbvSolidColorFill(418, 230, 454, 256, 0);
909 InbvBufferToScreenBlt(Buffer
, 413, 237, 7, 7, 8);
911 /* In setup mode, you haven't selected a SKU yet */
912 if (ExpInTextModeSetup
) Text
= NULL
;
918 /* Draw the SKU text if it exits */
919 if (Text
) InbvBitBlt(Text
, 180, 121);
922 #ifdef INBV_ROTBAR_IMPLEMENTED
923 /* Draw the progress bar bit */
924 if (Bar
) InbvBitBlt(Bar
, 0, 0);
927 /* Display the boot logo and fade it in */
930 /* Set filter which will draw text display if needed */
931 InbvInstallDisplayStringFilter(DisplayFilter
);
934 #ifdef INBV_ROTBAR_IMPLEMENTED
935 /* Do we have a system thread? */
936 if (RotBarThreadActive
)
938 /* We do, initialize the progress bar */
940 RotBarSelection
= TempRotBarSelection
;
950 DisplayFilter(PCHAR
*String
)
952 /* Windows hack to skip first dots */
953 static BOOLEAN DotHack
= TRUE
;
955 /* If "." is given set *String to empty string */
956 if(DotHack
&& strcmp(*String
, ".") == 0)
961 /* Remove the filter */
962 InbvInstallDisplayStringFilter(NULL
);
966 /* Draw text screen */
967 DisplayBootBitmap(TRUE
);
974 FinalizeBootLogo(VOID
)
976 /* Acquire lock and check the display state */
978 if (InbvGetDisplayState() == INBV_DISPLAY_STATE_OWNED
)
980 /* Clear the screen */
981 VidSolidColorFill(0, 0, 639, 479, 0);
984 /* Reset progress bar and lock */
985 #ifdef INBV_ROTBAR_IMPLEMENTED