PVOID
NTAPI
+INIT_FUNCTION
FindBitmapResource(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
IN ULONG ResourceId)
{
PLDR_DATA_TABLE_ENTRY LdrEntry;
PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry;
LDR_RESOURCE_INFO ResourceInfo;
- ULONG Size;
NTSTATUS Status;
PVOID Data = NULL;
if (NextEntry != ListHead)
{
/* Try to find the resource */
- ResourceInfo.Type = 2;
+ ResourceInfo.Type = 2; //RT_BITMAP;
ResourceInfo.Name = ResourceId;
ResourceInfo.Language = 0;
Status = LdrFindResource_U(LdrEntry->DllBase,
if (NT_SUCCESS(Status))
{
/* Access the resource */
+ ULONG Size = 0;
Status = LdrAccessResource(LdrEntry->DllBase,
ResourceDataEntry,
&Data,
&Size);
+ if ((Data) && (ResourceId < 3))
+ {
+ KiBugCheckData[4] ^= RtlComputeCrc32(0, Data, Size);
+ }
if (!NT_SUCCESS(Status)) Data = NULL;
}
}
BOOLEAN
NTAPI
+INIT_FUNCTION
InbvDriverInitialize(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
IN ULONG Count)
{
VidResetDisplay(CustomLogo);
/* Find bitmap resources in the kernel */
- ResourceCount = Count;
- for (i = 0; i < Count; i++)
+ ResourceCount = min(IDB_CLUSTER_SERVER, Count);
+ for (i = 1; i <= Count; i++)
{
/* Do the lookup */
ResourceList[i] = FindBitmapResource(LoaderBlock, i);
NTAPI
InbvAcquireLock(VOID)
{
- /* Check if we're below dispatch level */
- InbvOldIrql = KeGetCurrentIrql();
- if (InbvOldIrql < DISPATCH_LEVEL)
+ KIRQL OldIrql;
+
+ /* Check if we're at dispatch level or lower */
+ OldIrql = KeGetCurrentIrql();
+ if (OldIrql <= DISPATCH_LEVEL)
{
+ /* Loop until the lock is free */
+ while (!KeTestSpinLock(&BootDriverLock));
+
/* Raise IRQL to dispatch level */
- KeRaiseIrql(DISPATCH_LEVEL, &InbvOldIrql);
+ KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
}
/* Acquire the lock */
KiAcquireSpinLock(&BootDriverLock);
+ InbvOldIrql = OldIrql;
}
VOID
NTAPI
InbvReleaseLock(VOID)
{
+ KIRQL OldIrql;
+
+ /* Capture the old IRQL */
+ OldIrql = InbvOldIrql;
+
/* Release the driver lock */
KiReleaseSpinLock(&BootDriverLock);
- /* If we were below dispatch level, lower IRQL back */
- if (InbvOldIrql < DISPATCH_LEVEL) KeLowerIrql(InbvOldIrql);
+ /* If we were at dispatch level or lower, restore the old IRQL */
+ if (InbvOldIrql <= DISPATCH_LEVEL) KeLowerIrql(OldIrql);
}
VOID
NTAPI
+INIT_FUNCTION
InbvEnableBootDriver(IN BOOLEAN Enable)
{
/* Check if we're installed */
/* Make sure we're installed and display the string */
if (InbvBootDriverInstalled) VidDisplayString((PUCHAR) String);
- /* Call Headless (We don't support headless for now)
- HeadlessDispatch(DISPLAY_STRING); */
+ /* Print the string on the EMS port */
+ HeadlessDispatch(
+ HeadlessCmdPutString,
+ String,
+ strlen(String) + sizeof(ANSI_NULL),
+ NULL,
+ NULL);
/* Release the lock */
InbvReleaseLock();
VOID
NTAPI
+INIT_FUNCTION
InbvUpdateProgressBar(IN ULONG Progress)
{
ULONG FillCount, BoundedProgress;
VOID
NTAPI
+INIT_FUNCTION
InbvIndicateProgress(VOID)
{
ULONG Percentage;
VOID
NTAPI
+INIT_FUNCTION
DisplayBootBitmap(IN BOOLEAN SosMode)
{
- PVOID Header, Band, Bar, Text, Screen;
+ PVOID Header, Band, Text, Screen;
ROT_BAR_TYPE TempRotBarSelection = RB_UNSPECIFIED;
UCHAR Buffer[64];
{
/* Reset the progress bar */
InbvAcquireLock();
- RotBarSelection = 0;
+ RotBarSelection = RB_UNSPECIFIED;
InbvReleaseLock();
}
if (SharedUserData->NtProductType == NtProductWinNt)
{
/* Workstation product, display appropriate status bar color */
- Bar = InbvGetResourceAddress(IDB_BAR_PRO);
+ InbvGetResourceAddress(IDB_BAR_PRO);
}
else
{
}
/* Server product, display appropriate status bar color */
- Bar = InbvGetResourceAddress(IDB_BAR_SERVER);
+ InbvGetResourceAddress(IDB_BAR_SERVER);
}
/* Make sure we had a logo */
VOID
NTAPI
+INIT_FUNCTION
FinalizeBootLogo(VOID)
{
/* Acquire lock and check the display state */