-/* $Id: inbv.c,v 1.1 2003/08/11 18:50:12 chorns Exp $
+/* $Id$
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/inbv/inbv.c
* PURPOSE: Boot video support
- * PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
- * UPDATE HISTORY:
- * 12-07-2003 CSH Created
+ *
+ * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
*/
/* INCLUDES ******************************************************************/
-#include <roskrnl.h>
-#include <ntos/bootvid.h>
-
+#include <ntoskrnl.h>
+#include "../../drivers/dd/bootvid/ntbootvid.h"
#define NDEBUG
#include <internal/debug.h>
+#if defined (ALLOC_PRAGMA)
+#pragma alloc_text(INIT, InbvEnableBootDriver)
+#endif
+
/* GLOBALS *******************************************************************/
/* DATA **********************************************************************/
+static HANDLE BootVidDevice = NULL;
+static BOOL BootVidDriverInstalled = FALSE;
+static NTBOOTVID_FUNCTION_TABLE BootVidFunctionTable;
+
/* FUNCTIONS *****************************************************************/
+NTSTATUS
+STATIC
+InbvCheckBootVid(VOID)
+{
+ IO_STATUS_BLOCK Iosb;
+
+ if (BootVidDevice == NULL)
+ {
+ NTSTATUS Status;
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ UNICODE_STRING BootVidName = RTL_CONSTANT_STRING(L"\\Device\\BootVid");
+
+ InitializeObjectAttributes(&ObjectAttributes,
+ &BootVidName,
+ 0,
+ NULL,
+ NULL);
+ Status = ZwOpenFile(&BootVidDevice,
+ FILE_ALL_ACCESS,
+ &ObjectAttributes,
+ &Iosb,
+ 0,
+ 0);
+ if (!NT_SUCCESS(Status))
+ {
+ return(Status);
+ }
+ }
+ return(STATUS_SUCCESS);
+}
+
+
VOID
STDCALL
InbvAcquireDisplayOwnership(VOID)
{
}
-
BOOLEAN
STDCALL
InbvCheckDisplayOwnership(VOID)
return FALSE;
}
-
BOOLEAN
STDCALL
InbvDisplayString(IN PCHAR String)
{
- return FALSE;
+ /* Call Bootvid (we don't support bootvid for now)
+ * vidDisplayString(String);
+ * so instead, we'll fall-back to HAL
+ */
+ HalDisplayString(String);
+
+ /* Call Headless (We don't support headless for now)
+ HeadlessDispatch(DISPLAY_STRING);
+ */
+
+ /* Return success */
+ return TRUE;
+}
+
+BOOLEAN
+STDCALL
+InbvResetDisplayParameters(ULONG SizeX, ULONG SizeY)
+{
+ return(InbvResetDisplay());
}
VOID
-STDCALL
+STDCALL INIT_FUNCTION
InbvEnableBootDriver(IN BOOLEAN Enable)
{
+ NTSTATUS Status;
+ IO_STATUS_BLOCK Iosb;
+
+ Status = InbvCheckBootVid();
+ if (!NT_SUCCESS(Status))
+ {
+ return;
+ }
+
if (Enable)
{
- VidInitialize();
+ /* Notify the hal we will acquire the display. */
+ HalAcquireDisplayOwnership(InbvResetDisplayParameters);
+
+ Status = NtDeviceIoControlFile(BootVidDevice,
+ NULL,
+ NULL,
+ NULL,
+ &Iosb,
+ IOCTL_BOOTVID_INITIALIZE,
+ NULL,
+ 0,
+ &BootVidFunctionTable,
+ sizeof(BootVidFunctionTable));
+ if (!NT_SUCCESS(Status))
+ {
+ KEBUGCHECK(0);
+ }
+ BootVidDriverInstalled = TRUE;
+ CHECKPOINT;
}
else
{
- VidCleanUp();
+ Status = NtDeviceIoControlFile(BootVidDevice,
+ NULL,
+ NULL,
+ NULL,
+ &Iosb,
+ IOCTL_BOOTVID_CLEANUP,
+ NULL,
+ 0,
+ NULL,
+ 0);
+ if (!NT_SUCCESS(Status))
+ {
+ KEBUGCHECK(0);
+ }
+ BootVidDriverInstalled = FALSE;
+ /* Notify the hal we have released the display. */
+ HalReleaseDisplayOwnership();
+
+ NtClose(BootVidDevice);
+ BootVidDevice = NULL;
}
}
+
BOOLEAN
STDCALL
InbvEnableDisplayString(IN BOOLEAN Enable)
STDCALL
InbvIsBootDriverInstalled(VOID)
{
- return VidIsBootDriverInstalled();
+ return(BootVidDriverInstalled);
}
STDCALL
InbvResetDisplay(VOID)
{
- return VidResetDisplay();
+ if (!BootVidDriverInstalled)
+ {
+ return(FALSE);
+ }
+ return(BootVidFunctionTable.ResetDisplay());
}
IN ULONG Color)
{
}
+
+NTSTATUS
+STDCALL
+NtDisplayString(IN PUNICODE_STRING DisplayString)
+{
+ OEM_STRING OemString;
+
+ RtlUnicodeStringToOemString(&OemString, DisplayString, TRUE);
+ HalDisplayString(OemString.Buffer);
+ RtlFreeOemString(&OemString);
+
+ return STATUS_SUCCESS;
+}