NTSTATUS DsppInitialize ( _In_ ULONG Flags ) { BL_LIBRARY_PARAMETERS LibraryParameters = BlpLibraryParameters; BOOLEAN NoGraphics, HighestMode; NTSTATUS Status; PBL_DISPLAY_MODE DisplayMode; ULONGLONG GraphicsResolution; PBL_GRAPHICS_CONSOLE GraphicsConsole; PBL_TEXT_CONSOLE TextConsole, RemoteConsole; /* Initialize font data */ BfiCachedStrikeData = 0; InitializeListHead(&BfiDeferredListHead); InitializeListHead(&BfiFontFileListHead); /* Allocate the font rectangle */ BfiGraphicsRectangle = BlMmAllocateHeap(90); if (!BfiGraphicsRectangle) { return STATUS_NO_MEMORY; } /* Display re-initialization not yet handled */ if (LibraryParameters.LibraryFlags & BL_LIBRARY_FLAG_REINITIALIZE_ALL) { EfiPrintf(L"Display path not handled\r\n"); return STATUS_NOT_SUPPORTED; } /* Check if no graphics console is needed */ if ((Flags & BL_LIBRARY_FLAG_NO_GRAPHICS_CONSOLE) || (DsppGraphicsDisabledByBcd())) { /* Remember this */ NoGraphics = TRUE; } else { /* No graphics -- remember this */ NoGraphics = FALSE; } /* On first load, we always initialize a graphics display */ GraphicsConsole = NULL; if (!(Flags & BL_LIBRARY_FLAG_REINITIALIZE_ALL) || !(NoGraphics)) { /* Default to mode 0 (1024x768) */ DisplayMode = &ConsoleGraphicalResolutionList[0]; /* Check what resolution to use*/ Status = BlGetBootOptionInteger(BlpApplicationEntry.BcdData, BcdLibraryInteger_GraphicsResolution, &GraphicsResolution); if (NT_SUCCESS(Status)) { ConsoleGraphicalResolutionListFlags |= BL_DISPLAY_GRAPHICS_FORCED_VIDEO_MODE_FLAG; EfiPrintf(L"Display selection not yet handled\r\n"); return STATUS_NOT_IMPLEMENTED; } /* Check if the highest mode should be forced */ Status = BlGetBootOptionBoolean(BlpApplicationEntry.BcdData, BcdLibraryBoolean_GraphicsForceHighestMode, &HighestMode); if (NT_SUCCESS(Status)) { ConsoleGraphicalResolutionListFlags |= BL_DISPLAY_GRAPHICS_FORCED_HIGH_RES_MODE_FLAG; EfiPrintf(L"High res mode not yet handled\r\n"); return STATUS_NOT_IMPLEMENTED; } /* Do we need graphics mode after all? */ if (!NoGraphics) { /* Yep -- go allocate it */ GraphicsConsole = BlMmAllocateHeap(sizeof(*GraphicsConsole)); if (GraphicsConsole) { /* Construct it */ Status = ConsoleGraphicalConstruct(GraphicsConsole); if (!NT_SUCCESS(Status)) { EfiPrintf(L"GFX FAILED: %lx\r\n", Status); BlMmFreeHeap(GraphicsConsole); GraphicsConsole = NULL; } else { /* TEST */ RtlFillMemory(GraphicsConsole->FrameBuffer, GraphicsConsole->FrameBufferSize, 0x55); } } } /* Are we using something else than the default mode? */ if (DisplayMode != &ConsoleGraphicalResolutionList[0]) { EfiPrintf(L"Display path not handled\r\n"); return STATUS_NOT_SUPPORTED; } /* Mask out all the flags now */ ConsoleGraphicalResolutionListFlags &= ~(BL_DISPLAY_GRAPHICS_FORCED_VIDEO_MODE_FLAG | BL_DISPLAY_GRAPHICS_FORCED_HIGH_RES_MODE_FLAG); } /* Do we have a graphics console? */ TextConsole = NULL; if (!GraphicsConsole) { /* Nope -- go allocate a text console */ TextConsole = BlMmAllocateHeap(sizeof(*TextConsole)); if (TextConsole) { /* Construct it */ Status = ConsoleTextLocalConstruct(TextConsole, TRUE); if (!NT_SUCCESS(Status)) { BlMmFreeHeap(TextConsole); TextConsole = NULL; } } } /* Initialize all globals to NULL */ DspRemoteInputConsole = NULL; DspTextConsole = NULL; DspGraphicalConsole = NULL; /* If we don't have a text console, go get a remote console */ RemoteConsole = NULL; if (!TextConsole) { ConsoleCreateRemoteConsole(&RemoteConsole); } /* Do we have a remote console? */ if (!RemoteConsole) { /* Nope -- what about a graphical one? */ if (GraphicsConsole) { /* Yes, use it for both graphics and text */ DspGraphicalConsole = GraphicsConsole; DspTextConsole = GraphicsConsole; } else if (TextConsole) { /* Nope, but we have a text console */ DspTextConsole = TextConsole; } /* Console has been setup */ return STATUS_SUCCESS; } /* We have a remote console -- have to figure out how to use it*/ EfiPrintf(L"Display path not handled\r\n"); return STATUS_NOT_SUPPORTED; }
NTSTATUS DsppReinitialize ( _In_ ULONG Flags ) { PBL_TEXT_CONSOLE TextConsole; PBL_GRAPHICS_CONSOLE GraphicsConsole; NTSTATUS Status; ULONGLONG GraphicsResolution; BOOLEAN HighestMode; BL_DISPLAY_MODE CurrentResolution; /* Do we have local input yet? */ if (!DspLocalInputConsole) { /* Create it now */ ConsoleCreateLocalInputConsole(); } /* If a graphics console is present without a remote console... */ TextConsole = NULL; if (!(DspRemoteInputConsole) && (DspGraphicalConsole)) { /* Try to create a remote console */ ConsoleCreateRemoteConsole(&TextConsole); } /* All good for now */ Status = STATUS_SUCCESS; /* Now check if we were able to create the remote console */ if (TextConsole) { EfiPrintf(L"EMS not supported\r\n"); return STATUS_NOT_IMPLEMENTED; } /* Set a local for the right cast */ GraphicsConsole = DspGraphicalConsole; /* Nothing to do without a graphics console being reinitialized */ if (!(Flags & BL_LIBRARY_FLAG_REINITIALIZE_ALL) || !(GraphicsConsole) || !(((PBL_GRAPHICS_CONSOLE_VTABLE)GraphicsConsole->TextConsole.Callbacks)->IsEnabled(GraphicsConsole))) { return Status; } /* Check if graphics are disabled in the BCD */ if (DsppGraphicsDisabledByBcd()) { /* Turn off the graphics console, switching back to text mode */ Status = ((PBL_GRAPHICS_CONSOLE_VTABLE)GraphicsConsole->TextConsole.Callbacks)->Enable(GraphicsConsole, FALSE); } /* Check if a custom graphics resolution is set */ if (MiscGetBootOption(BlpApplicationEntry.BcdData, BcdLibraryInteger_GraphicsResolution)) { /* Check what it's set to */ Status = BlGetBootOptionInteger(BlpApplicationEntry.BcdData, BcdLibraryInteger_GraphicsResolution, &GraphicsResolution); if (!NT_SUCCESS(Status)) { return Status; } /* Now check our current graphical resolution */ Status = ((PBL_GRAPHICS_CONSOLE_VTABLE)GraphicsConsole->TextConsole.Callbacks)->GetGraphicalResolution(GraphicsConsole, &CurrentResolution); if (!NT_SUCCESS(Status)) { return Status; } /* Remember that we're forcing a video mode */ ConsoleGraphicalResolutionListFlags |= BL_DISPLAY_GRAPHICS_FORCED_VIDEO_MODE_FLAG; /* Check which resolution to set */ if (!GraphicsResolution) { /* 1024x768 */ EfiPrintf(L"Display selection not yet handled\r\n"); return STATUS_NOT_IMPLEMENTED; } else if (GraphicsResolution == 1) { /* 800x600 */ EfiPrintf(L"Display selection not yet handled\r\n"); return STATUS_NOT_IMPLEMENTED; } else if (GraphicsResolution == 2) { /* 1024x600 */ EfiPrintf(L"Display selection not yet handled\r\n"); return STATUS_NOT_IMPLEMENTED; } } /* Check if the force highest mode setting is present */ if (MiscGetBootOption(BlpApplicationEntry.BcdData, BcdLibraryBoolean_GraphicsForceHighestMode)) { /* Check what it's set to */ Status = BlGetBootOptionBoolean(BlpApplicationEntry.BcdData, BcdLibraryBoolean_GraphicsForceHighestMode, &HighestMode); if ((NT_SUCCESS(Status)) && (HighestMode)) { /* Remember that high rest mode is being forced */ ConsoleGraphicalResolutionListFlags |= BL_DISPLAY_GRAPHICS_FORCED_HIGH_RES_MODE_FLAG; /* Turn it on */ //((PBL_GRAPHICS_CONSOLE_VTABLE)GraphicsConsole->TextConsole.Callbacks)->SetGraphicalResolution(GraphicsConsole, 0, 0); /* All done now */ ConsoleGraphicalResolutionListFlags |= ~BL_DISPLAY_GRAPHICS_FORCED_HIGH_RES_MODE_FLAG; EfiPrintf(L"High res mode not yet handled\r\n"); Status = STATUS_NOT_IMPLEMENTED; } } /* Return back to the caller */ return Status; }