* bootdata/txtsetup.sif (SetupData): Add /NOBOOTSCREEN to OsLoadOptions.
* hal/halx86/display.c (CHAR_ATTRIBUTE_BLACK): Define.
(HalClearDisplay): Add CharAttribute parameter.
(HalInitializeDisplay, HalReleaseDisplayOwnership): Blue screen.
* hal/halx86/halinit.c (DriverEntry): Blue screen for boot phase 2.
* include/reactos/resource.h (IDB_BOOTIMAGE): Define.
* ntoskrnl/Makefile: Add boot video objects.
* ntoskrnl/Makefile.i386: Ditto.
* ntoskrnl/ntoskrnl.def: Add boot video exports.
* ntoskrnl/ntoskrnl.edf: Ditto.
* ntoskrnl/ntoskrnl.rc (IDB_BOOTIMAGE): Define.
* ntoskrnl/include/internal/kd.h (KdInit3): Add.
* ntoskrnl/kd/kdebug.c (KdInitSystem): Print information in KdInit3.
* ntoskrnl/ke/bug.c (KeBugCheckWithTf, KeBugCheckEx): Switch to
text-mode on crash if needed.
* ntoskrnl/ke/main.c (ExpInitializeExecutive): Display bootscreen image
during boot.
* ntoskrnl/ke/i386/v86m_sup.S (_KiV86Complete): Restore previous mode and
old exception handler list.
* subsys/csrss/init.c: Change PrintString to DPRINT1.
* subsys/smss/init.c: Change PrintString to DPRINT1.
(SignalInitEvent): New.
(InitSessionManager): Call SignalInitEvent to switch to text-mode if
needed.
* subsys/smss/smss.c: Change PrintString to DPRINT1.
* ntoskrnl/inbv: New directory.
* ntoskrnl/inbv/i386: Ditto.
* ntoskrnl/res: Ditto.
* include/ntos/bootvid.h: New file.
* ntoskrnl/inbv/.cvsignore: Ditto.
* ntoskrnl/inbv/bootvid.c: Ditto.
* ntoskrnl/inbv/inbv.c: Ditto.
* ntoskrnl/inbv/i386/.cvsignore: Ditto.
* ntoskrnl/inbv/i386/pixelsup.S: Ditto.
* ntoskrnl/res/bootimage.bmp: Ditto.
svn path=/trunk/; revision=5529
+2003-08-11 Casper S. Hornstrup <chorns@users.sourceforge.net>
+
+ * bootdata/txtsetup.sif (SetupData): Add /NOBOOTSCREEN to OsLoadOptions.
+ * hal/halx86/display.c (CHAR_ATTRIBUTE_BLACK): Define.
+ (HalClearDisplay): Add CharAttribute parameter.
+ (HalInitializeDisplay, HalReleaseDisplayOwnership): Blue screen.
+ * hal/halx86/halinit.c (DriverEntry): Blue screen for boot phase 2.
+ * include/reactos/resource.h (IDB_BOOTIMAGE): Define.
+ * ntoskrnl/Makefile: Add boot video objects.
+ * ntoskrnl/Makefile.i386: Ditto.
+ * ntoskrnl/ntoskrnl.def: Add boot video exports.
+ * ntoskrnl/ntoskrnl.edf: Ditto.
+ * ntoskrnl/ntoskrnl.rc (IDB_BOOTIMAGE): Define.
+ * ntoskrnl/include/internal/kd.h (KdInit3): Add.
+ * ntoskrnl/kd/kdebug.c (KdInitSystem): Print information in KdInit3.
+ * ntoskrnl/ke/bug.c (KeBugCheckWithTf, KeBugCheckEx): Switch to
+ text-mode on crash if needed.
+ * ntoskrnl/ke/main.c (ExpInitializeExecutive): Display bootscreen image
+ during boot.
+ * ntoskrnl/ke/i386/v86m_sup.S (_KiV86Complete): Restore previous mode and
+ old exception handler list.
+ * subsys/csrss/init.c: Change PrintString to DPRINT1.
+ * subsys/smss/init.c: Change PrintString to DPRINT1.
+ (SignalInitEvent): New.
+ (InitSessionManager): Call SignalInitEvent to switch to text-mode if
+ needed.
+ * subsys/smss/smss.c: Change PrintString to DPRINT1.
+ * ntoskrnl/inbv: New directory.
+ * ntoskrnl/inbv/i386: Ditto.
+ * ntoskrnl/res: Ditto.
+ * include/ntos/bootvid.h: New file.
+ * ntoskrnl/inbv/.cvsignore: Ditto.
+ * ntoskrnl/inbv/bootvid.c: Ditto.
+ * ntoskrnl/inbv/inbv.c: Ditto.
+ * ntoskrnl/inbv/i386/.cvsignore: Ditto.
+ * ntoskrnl/inbv/i386/pixelsup.S: Ditto.
+ * ntoskrnl/res/bootimage.bmp: Ditto.
+
2003-08-09 Martin Fuchs <martin-fuchs@gmx.net>
* win32k/ntuser/window.c implemented NtUserSetShellWindowEx() and
[SetupData]
DefaultPath = \ReactOS
-OsLoadOptions = "/NODEBUG"
-;OsLoadOptions = "/DEBUGPORT=COM1"
-;OsLoadOptions = "/DEBUGPORT=SCREEN"
-;OsLoadOptions = "/DEBUGPORT=BOCHS"
+OsLoadOptions = "/NOBOOTSCREEN /NODEBUG"
+;OsLoadOptions = "/NOBOOTSCREEN /DEBUGPORT=COM1"
+;OsLoadOptions = "/NOBOOTSCREEN /DEBUGPORT=SCREEN"
+;OsLoadOptions = "/NOBOOTSCREEN /DEBUGPORT=BOCHS"
[NLS]
AnsiCodepage = c_1252.nls
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/* $Id: display.c,v 1.5 2003/06/21 14:25:30 gvg Exp $
+/* $Id: display.c,v 1.6 2003/08/11 18:50:12 chorns Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
#define CRTC_CURLO 0x0f
-#define CHAR_ATTRIBUTE 0x17 /* grey on blue */
+#define CHAR_ATTRIBUTE_BLACK 0x00 /* black on black */
+#define CHAR_ATTRIBUTE 0x17 /* grey on blue */
/* VARIABLES ****************************************************************/
/* STATIC FUNCTIONS *********************************************************/
-static VOID
-HalClearDisplay (VOID)
+VOID
+HalClearDisplay (UCHAR CharAttribute)
{
WORD *ptr = (WORD*)VideoBuffer;
ULONG i;
for (i = 0; i < SizeX * SizeY; i++, ptr++)
- *ptr = ((CHAR_ATTRIBUTE << 8) + ' ');
+ *ptr = ((CharAttribute << 8) + ' ');
CursorX = 0;
CursorY = 0;
#ifdef BOCHS_30ROWS
SizeY=30;
#endif
- HalClearDisplay();
+ HalClearDisplay(CHAR_ATTRIBUTE_BLACK);
DisplayInitialized = TRUE;
}
if (HalResetDisplayParameters(SizeX, SizeY) == TRUE)
{
HalOwnsDisplay = TRUE;
- HalClearDisplay();
+ HalClearDisplay(CHAR_ATTRIBUTE);
}
}
-/* $Id: halinit.c,v 1.4 2003/02/26 14:14:03 ekohl Exp $
+/* $Id: halinit.c,v 1.5 2003/08/11 18:50:12 chorns Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
/* FUNCTIONS ***************************************************************/
+extern VOID
+HalClearDisplay (UCHAR CharAttribute);
+
NTSTATUS
STDCALL
DriverEntry(
{
if (BootPhase == 0)
{
+ /* Initialize display and make the screen black */
HalInitializeDisplay (LoaderBlock);
#ifdef MP
/* Enumerate the devices on the motherboard */
HalpStartEnumerator();
}
+ else if (BootPhase == 2)
+ {
+ /* Go to blue screen */
+ HalClearDisplay (0x17); /* grey on blue */
+ }
return TRUE;
}
--- /dev/null
+#ifndef __INCLUDE_NTOS_BOOTVID_H\r
+#define __INCLUDE_NTOS_BOOTVID_H\r
+\r
+VOID\r
+STDCALL\r
+InbvAcquireDisplayOwnership(VOID);\r
+\r
+BOOLEAN\r
+STDCALL\r
+InbvCheckDisplayOwnership(VOID);\r
+\r
+BOOLEAN\r
+STDCALL\r
+InbvDisplayString(IN PCHAR String);\r
+\r
+VOID\r
+STDCALL\r
+InbvEnableBootDriver(IN BOOLEAN Enable);\r
+\r
+BOOLEAN\r
+STDCALL\r
+InbvEnableDisplayString(IN BOOLEAN Enable);\r
+\r
+VOID\r
+STDCALL\r
+InbvInstallDisplayStringFilter(IN PVOID Unknown);\r
+\r
+BOOLEAN\r
+STDCALL\r
+InbvIsBootDriverInstalled(VOID);\r
+\r
+VOID\r
+STDCALL\r
+InbvNotifyDisplayOwnershipLost(IN PVOID Callback);\r
+\r
+BOOLEAN\r
+STDCALL\r
+InbvResetDisplay(VOID);\r
+\r
+VOID\r
+STDCALL\r
+InbvSetScrollRegion(IN ULONG Left,\r
+ IN ULONG Top,\r
+ IN ULONG Width,\r
+ IN ULONG Height);\r
+\r
+VOID\r
+STDCALL\r
+InbvSetTextColor(IN ULONG Color);\r
+\r
+VOID\r
+STDCALL\r
+InbvSolidColorFill(IN ULONG Left,\r
+ IN ULONG Top,\r
+ IN ULONG Width,\r
+ IN ULONG Height,\r
+ IN ULONG Color);\r
+\r
+\r
+VOID\r
+STDCALL\r
+VidCleanUp(VOID);\r
+\r
+BOOLEAN\r
+STDCALL\r
+VidInitialize(VOID);\r
+\r
+BOOLEAN\r
+STDCALL\r
+VidResetDisplay(VOID);\r
+\r
+BOOLEAN\r
+STDCALL\r
+VidIsBootDriverInstalled(VOID);\r
+\r
+#endif /* __INCLUDE_NTOS_BOOTVID_H */\r
/* ReactOS default Application Registry Root Path */
#define RES_STR_ROSAPP_REGISTRY_ROOT "Software\\ReactWare"
+/* Bitmaps */
+#define IDB_BOOTIMAGE 100
+
#endif /* ndef _INC_REACTOS_RESOURCE_H */
-# $Id: Makefile,v 1.103 2003/08/07 04:03:24 royce Exp $
+# $Id: Makefile,v 1.104 2003/08/11 18:50:12 chorns Exp $
#
# ReactOS Operating System
#
kd/gdbstub.o \
kd/mda.o
+# Boot video (Inbv)
+OBJECTS_INBV = \
+ inbv/inbv.o \
+ inbv/bootvid.o
+
DEP_OBJECTS := $(OBJECTS_NT) $(OBJECTS_MM) $(OBJECTS_ARCH) \
$(OBJECTS_IO) $(OBJECTS_KE) $(OBJECTS_OB) \
$(OBJECTS_PS) $(OBJECTS_EX) $(OBJECTS_CC) $(OBJECTS_FS) $(OBJECTS_SE) \
-o $(OBJECTS_PATH)/kd.o \
$(OBJECTS_KD)
+$(OBJECTS_PATH)/inbv.o: $(OBJECTS_INBV)
+ $(LD) \
+ -r \
+ -o $(OBJECTS_PATH)/inbv.o \
+ $(OBJECTS_INBV)
+
# Note: arch.o MUST be the first file!!!
OBJECTS := \
$(OBJECTS_PATH)/arch.o \
$(OBJECTS_PATH)/ps.o \
$(OBJECTS_PATH)/rtl.o \
$(OBJECTS_PATH)/se.o \
+ $(OBJECTS_PATH)/inbv.o \
$(OBJECTS_RESOURCE)
clean:
- $(RM) $(OBJECTS_PATH)/*.o cc/*.o cm/*.o dbg/*.o dbg/i386/*.o ex/*.o \
- ex/i386/*.o io/*.o ke/*.o ldr/*.o mm/*.o nt/*.o ob/*.o ps/*.o \
+ ex/i386/*.o inbv/*.o io/*.o ke/*.o ldr/*.o mm/*.o nt/*.o ob/*.o ps/*.o \
rtl/*.o rtl/i386/*.o se/*.o ke/i386/*.o mm/i386/*.o fs/*.o po/*.o \
lpc/*.o kd/*.o $(TARGETNAME).o junk.tmp base.tmp temp.exp \
$(TARGETNAME).exe $(TARGETNAME).nostrip.exe $(TARGETNAME).sym ntoskrnl.map \
rtl/i386/exception.o \
rtl/i386/seh.o
+OBJECTS_INBV_I386 := \
+ inbv/i386/pixelsup.o
+
RTL_EXCLUDE_FILTER :=
-OBJECTS_ARCH = $(OBJECTS_BOOT) $(OBJECTS_EX_I386) $(OBJECTS_KE_I386) $(OBJECTS_MM_I386) $(OBJECTS_RTL_I386)
+OBJECTS_ARCH = $(OBJECTS_BOOT) $(OBJECTS_EX_I386) $(OBJECTS_KE_I386) $(OBJECTS_MM_I386) \
+ $(OBJECTS_RTL_I386) $(OBJECTS_INBV_I386)
--- /dev/null
+/* $Id: bootvid.c,v 1.1 2003/08/11 18:50:12 chorns Exp $
+ *
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS kernel
+ * FILE: ntoskrnl/inbv/bootvid.c
+ * PURPOSE: Boot video support
+ * PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
+ * UPDATE HISTORY:
+ * 12-07-2003 CSH Created
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include <roskrnl.h>
+#include <reactos/resource.h>
+#include <internal/i386/mm.h>
+#include <internal/v86m.h>
+
+#define NDEBUG
+#include <internal/debug.h>
+
+#define RT_BITMAP 2
+
+typedef struct tagRGBQUAD {
+ unsigned char rgbBlue;
+ unsigned char rgbGreen;
+ unsigned char rgbRed;
+ unsigned char rgbReserved;
+} RGBQUAD, *PRGBQUAD;
+
+typedef long FXPT2DOT30;
+
+typedef struct tagCIEXYZ {
+ FXPT2DOT30 ciexyzX;
+ FXPT2DOT30 ciexyzY;
+ FXPT2DOT30 ciexyzZ;
+} CIEXYZ;
+typedef CIEXYZ * LPCIEXYZ;
+
+typedef struct tagCIEXYZTRIPLE {
+ CIEXYZ ciexyzRed;
+ CIEXYZ ciexyzGreen;
+ CIEXYZ ciexyzBlue;
+} CIEXYZTRIPLE;
+typedef CIEXYZTRIPLE *LPCIEXYZTRIPLE;
+
+typedef struct {
+ DWORD bV5Size;
+ LONG bV5Width;
+ LONG bV5Height;
+ WORD bV5Planes;
+ WORD bV5BitCount;
+ DWORD bV5Compression;
+ DWORD bV5SizeImage;
+ LONG bV5XPelsPerMeter;
+ LONG bV5YPelsPerMeter;
+ DWORD bV5ClrUsed;
+ DWORD bV5ClrImportant;
+ DWORD bV5RedMask;
+ DWORD bV5GreenMask;
+ DWORD bV5BlueMask;
+ DWORD bV5AlphaMask;
+ DWORD bV5CSType;
+ CIEXYZTRIPLE bV5Endpoints;
+ DWORD bV5GammaRed;
+ DWORD bV5GammaGreen;
+ DWORD bV5GammaBlue;
+ DWORD bV5Intent;
+ DWORD bV5ProfileData;
+ DWORD bV5ProfileSize;
+ DWORD bV5Reserved;
+} BITMAPV5HEADER, *PBITMAPV5HEADER;
+
+
+#define MISC 0x3c2
+#define SEQ 0x3c4
+#define CRTC 0x3d4
+#define GRAPHICS 0x3ce
+#define FEATURE 0x3da
+#define ATTRIB 0x3c0
+#define STATUS 0x3da
+
+typedef struct _VideoMode {
+ unsigned short VidSeg;
+ unsigned char Misc;
+ unsigned char Feature;
+ unsigned short Seq[6];
+ unsigned short Crtc[25];
+ unsigned short Gfx[9];
+ unsigned char Attrib[21];
+} VideoMode;
+
+typedef struct {
+ ULONG r;
+ ULONG g;
+ ULONG b;
+} FADER_PALETTE_ENTRY;
+
+/* In pixelsups.S */
+extern VOID
+InbvPutPixels(int x, int y, unsigned long c);
+
+/* GLOBALS *******************************************************************/
+
+char *vidmem;
+
+/* Must be 4 bytes per entry */
+long maskbit[640];
+long y80[480];
+
+static HANDLE BitmapThreadHandle;
+static CLIENT_ID BitmapThreadId;
+static BOOLEAN BitmapIsDrawn;
+static BOOLEAN BitmapThreadShouldTerminate;
+static PUCHAR BootimageBitmap;
+static BOOLEAN InGraphicsMode = FALSE;
+
+/* DATA **********************************************************************/
+
+static VideoMode Mode12 = {
+ 0xa000, 0xe3, 0x00,
+
+ {0x03, 0x01, 0x0f, 0x00, 0x06 },
+
+ {0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0x0b, 0x3e, 0x00, 0x40, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x59, 0xea, 0x8c, 0xdf, 0x28, 0x00, 0xe7, 0x04, 0xe3,
+ 0xff},
+
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xff},
+
+ {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
+ 0x0c, 0x0d, 0x0e, 0x0f, 0x81, 0x00, 0x0f, 0x00, 0x00}
+};
+
+static BOOLEAN VideoAddressSpaceInitialized = FALSE;
+static PVOID NonBiosBaseAddress;
+
+/* FUNCTIONS *****************************************************************/
+
+static BOOLEAN
+InbvFindBootimage()
+{
+ PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry;
+ LDR_RESOURCE_INFO ResourceInfo;
+ NTSTATUS Status;
+ PVOID BaseAddress = (PVOID)KERNEL_BASE;
+ ULONG Size;
+
+ ResourceInfo.Type = RT_BITMAP;
+ ResourceInfo.Name = IDB_BOOTIMAGE;
+ ResourceInfo.Language = 0x09;
+
+ Status = LdrFindResource_U(BaseAddress,
+ &ResourceInfo,
+ RESOURCE_DATA_LEVEL,
+ &ResourceDataEntry);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("LdrFindResource_U() failed with status 0x%.08x\n", Status);
+ return FALSE;
+ }
+
+ Status = LdrAccessResource(BaseAddress,
+ ResourceDataEntry,
+ (PVOID*)&BootimageBitmap,
+ &Size);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("LdrAccessResource() failed with status 0x%.08x\n", Status);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+static BOOLEAN
+InbvInitializeVideoAddressSpace(VOID)
+{
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ UNICODE_STRING PhysMemName;
+ NTSTATUS Status;
+ HANDLE PhysMemHandle;
+ PVOID BaseAddress;
+ LARGE_INTEGER Offset;
+ ULONG ViewSize;
+ CHAR IVT[1024];
+ CHAR BDA[256];
+ PVOID start = (PVOID)0x0;
+
+ /*
+ * Open the physical memory section
+ */
+ RtlInitUnicodeStringFromLiteral(&PhysMemName, L"\\Device\\PhysicalMemory");
+ InitializeObjectAttributes(&ObjectAttributes,
+ &PhysMemName,
+ 0,
+ NULL,
+ NULL);
+ Status = NtOpenSection(&PhysMemHandle, SECTION_ALL_ACCESS,
+ &ObjectAttributes);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("Couldn't open \\Device\\PhysicalMemory\n");
+ return FALSE;
+ }
+
+ /*
+ * Map the BIOS and device registers into the address space
+ */
+ Offset.QuadPart = 0xa0000;
+ ViewSize = 0x100000 - 0xa0000;
+ BaseAddress = (PVOID)0xa0000;
+ Status = NtMapViewOfSection(PhysMemHandle,
+ NtCurrentProcess(),
+ &BaseAddress,
+ 0,
+ 8192,
+ &Offset,
+ &ViewSize,
+ ViewUnmap,
+ 0,
+ PAGE_EXECUTE_READWRITE);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("Couldn't map physical memory (%x)\n", Status);
+ NtClose(PhysMemHandle);
+ return FALSE;
+ }
+ NtClose(PhysMemHandle);
+ if (BaseAddress != (PVOID)0xa0000)
+ {
+ DPRINT("Couldn't map physical memory at the right address "
+ "(was %x)\n", BaseAddress);
+ return FALSE;
+ }
+
+ /*
+ * Map some memory to use for the non-BIOS parts of the v86 mode address
+ * space
+ */
+ NonBiosBaseAddress = (PVOID)0x1;
+ ViewSize = 0xa0000 - 0x1000;
+ Status = NtAllocateVirtualMemory(NtCurrentProcess(),
+ &NonBiosBaseAddress,
+ 0,
+ &ViewSize,
+ MEM_COMMIT,
+ PAGE_EXECUTE_READWRITE);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("Failed to allocate virtual memory (Status %x)\n", Status);
+ return FALSE;
+ }
+ if (NonBiosBaseAddress != (PVOID)0x0)
+ {
+ DPRINT("Failed to allocate virtual memory at right address "
+ "(was %x)\n", NonBiosBaseAddress);
+ return FALSE;
+ }
+
+ /*
+ * Get the real mode IVT from the kernel
+ */
+ Status = NtVdmControl(0, IVT);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("NtVdmControl failed (status %x)\n", Status);
+ return FALSE;
+ }
+
+ /*
+ * Copy the real mode IVT into the right place
+ */
+ memcpy(start, IVT, 1024);
+
+ /*
+ * Get the BDA from the kernel
+ */
+ Status = NtVdmControl(1, BDA);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("NtVdmControl failed (status %x)\n", Status);
+ return FALSE;
+ }
+
+ /*
+ * Copy the BDA into the right place
+ */
+ memcpy((PVOID)0x400, BDA, 256);
+
+ return TRUE;
+}
+
+
+static BOOLEAN
+InbvDeinitializeVideoAddressSpace(VOID)
+{
+ ULONG RegionSize;
+ PUCHAR ViewBase;
+
+ RegionSize = 0xa0000 - 0x1000;
+ NtFreeVirtualMemory(NtCurrentProcess(),
+ &NonBiosBaseAddress,
+ &RegionSize,
+ MEM_RELEASE);
+
+ ViewBase = (PUCHAR) 0xa0000;
+ NtUnmapViewOfSection(NtCurrentProcess(), ViewBase);
+
+ return TRUE;
+}
+
+
+static VOID
+vgaPreCalc()
+{
+ ULONG j;
+
+ for(j = 0; j < 80; j++)
+ {
+ maskbit[j * 8 + 0] = 128;
+ maskbit[j * 8 + 1] = 64;
+ maskbit[j * 8 + 2] = 32;
+ maskbit[j * 8 + 3] = 16;
+ maskbit[j * 8 + 4] = 8;
+ maskbit[j * 8 + 5] = 4;
+ maskbit[j * 8 + 6] = 2;
+ maskbit[j * 8 + 7] = 1;
+ }
+ for(j = 0; j < 480; j++)
+ {
+ y80[j] = j * 80; /* 80 = 640 / 8 = Number of bytes per scanline */
+ }
+}
+
+static __inline__ VOID
+InbvOutxay(PUSHORT ad, UCHAR x, UCHAR y)
+{
+ USHORT xy = (x << 8) + y;
+ WRITE_PORT_USHORT(ad, xy);
+}
+
+
+static VOID
+InbvSetMode(VideoMode mode)
+{
+ unsigned char x;
+
+ WRITE_PORT_UCHAR((PUCHAR)MISC, mode.Misc);
+ WRITE_PORT_UCHAR((PUCHAR)STATUS, 0);
+ WRITE_PORT_UCHAR((PUCHAR)FEATURE, mode.Feature);
+
+ for(x=0; x<5; x++)
+ {
+ InbvOutxay((PUSHORT)SEQ, mode.Seq[x], x);
+ }
+
+ WRITE_PORT_USHORT((PUSHORT)CRTC, 0x11);
+ WRITE_PORT_USHORT((PUSHORT)CRTC, (mode.Crtc[0x11] & 0x7f));
+
+ for(x=0; x<25; x++)
+ {
+ InbvOutxay((PUSHORT)CRTC, mode.Crtc[x], x);
+ }
+
+ for(x=0; x<9; x++)
+ {
+ InbvOutxay((PUSHORT)GRAPHICS, mode.Gfx[x], x);
+ }
+
+ x=READ_PORT_UCHAR((PUCHAR)FEATURE);
+
+ for(x=0; x<21; x++)
+ {
+ WRITE_PORT_UCHAR((PUCHAR)ATTRIB, x);
+ WRITE_PORT_UCHAR((PUCHAR)ATTRIB, mode.Attrib[x]);
+ }
+
+ x=READ_PORT_UCHAR((PUCHAR)STATUS);
+
+ WRITE_PORT_UCHAR((PUCHAR)ATTRIB, 0x20);
+}
+
+
+static VOID
+InbvInitVGAMode(VOID)
+{
+ KV86M_REGISTERS Regs;
+ NTSTATUS Status;
+
+ vidmem = (char *)(0xd0000000 + 0xa0000);
+ memset(&Regs, 0, sizeof(Regs));
+ Regs.Eax = 0x0012;
+
+ Status = Ke386CallBios(0x10, &Regs);
+ assert(NT_SUCCESS(Status));
+
+ /* Get VGA registers into the correct state (mainly for setting up the palette registers correctly) */
+ InbvSetMode(Mode12);
+
+ /* Get the VGA into the mode we want to work with */
+ WRITE_PORT_UCHAR((PUCHAR)0x3ce,0x08); /* Set */
+ WRITE_PORT_UCHAR((PUCHAR)0x3cf,0); /* the MASK */
+ WRITE_PORT_USHORT((PUSHORT)0x3ce,0x0205); /* write mode = 2 (bits 0,1) read mode = 0 (bit 3) */
+ (UCHAR) READ_REGISTER_UCHAR(vidmem); /* Update bit buffer */
+ WRITE_REGISTER_UCHAR(vidmem, 0); /* Write the pixel */
+ WRITE_PORT_UCHAR((PUCHAR)0x3ce,0x08);
+ WRITE_PORT_UCHAR((PUCHAR)0x3cf,0xff);
+
+ /* Zero out video memory (clear a possibly trashed screen) */
+ RtlZeroMemory(vidmem, 64000);
+
+ vgaPreCalc();
+}
+
+
+BOOLEAN
+STDCALL
+VidResetDisplay(VOID)
+{
+ KV86M_REGISTERS Regs;
+ NTSTATUS Status;
+
+#if 0
+ /* FIXME: What if the system has crashed, eg. this function is called from KeBugCheck() ? */
+
+ /* Maybe wait until boot screen bitmap is drawn */
+ while (!BitmapIsDrawn)
+ {
+ NtYieldExecution();
+ }
+#endif
+
+ /* Zero out video memory (clear the screen) */
+ RtlZeroMemory(vidmem, 64000);
+
+ memset(&Regs, 0, sizeof(Regs));
+ Regs.Eax = 0x0003;
+ Status = Ke386CallBios(0x10, &Regs);
+ assert(NT_SUCCESS(Status));
+
+ memset(&Regs, 0, sizeof(Regs));
+ Regs.Eax = 0x1112;
+ Status = Ke386CallBios(0x10, &Regs);
+ assert(NT_SUCCESS(Status));
+
+ memset(&Regs, 0, sizeof(Regs));
+ Regs.Eax = 0x0632; // AH = 0x06 - Scroll active page up, AL = 0x32 - Clear 25 lines
+ Regs.Ecx = 0x0000; // CX = 0x0000 - Upper left of scroll
+ Regs.Edx = 0x314F; // DX = 0x314F - Lower right of scroll
+ Regs.Ebx = 0x1100; // Use normal attribute on blanked line
+ Status = Ke386CallBios(0x10, &Regs);
+ assert(NT_SUCCESS(Status));
+
+ InGraphicsMode = FALSE;
+
+ return TRUE;
+}
+
+
+VOID
+STDCALL
+VidCleanUp(VOID)
+{
+ if (InGraphicsMode)
+ {
+ VidResetDisplay();
+ }
+
+ if (VideoAddressSpaceInitialized)
+ {
+ InbvDeinitializeVideoAddressSpace();
+ VideoAddressSpaceInitialized = FALSE;
+ }
+
+ BitmapThreadShouldTerminate = TRUE;
+}
+
+
+static __inline__ VOID
+InbvSetColor(int cindex, unsigned char red, unsigned char green, unsigned char blue)
+{
+ red = red / (256 / 64);
+ green = green / (256 / 64);
+ blue = blue / (256 / 64);
+
+ WRITE_PORT_UCHAR((PUCHAR)0x03c8, cindex);
+ WRITE_PORT_UCHAR((PUCHAR)0x03c9, red);
+ WRITE_PORT_UCHAR((PUCHAR)0x03c9, green);
+ WRITE_PORT_UCHAR((PUCHAR)0x03c9, blue);
+}
+
+
+static __inline__ VOID
+InbvSetBlackPalette()
+{
+ register ULONG r = 0;
+
+ for (r = 0; r < 16; r++)
+ {
+ InbvSetColor(r, 0, 0, 0);
+ }
+}
+
+
+static VOID
+InbvDisplayBitmap(ULONG Width, ULONG Height, PCHAR ImageData)
+{
+ ULONG j,k,y;
+ register ULONG i;
+ register ULONG x;
+ register ULONG c;
+
+ k = 0;
+ for (y = 0; y < Height; y++)
+ {
+ for (j = 0; j < 8; j++)
+ {
+ x = j;
+
+ /*
+ * Loop through the line and process every 8th pixel.
+ * This way we can get a way with using the same bit mask
+ * for several pixels and thus not need to do as much I/O
+ * communication.
+ */
+ while (x < 640)
+ {
+ c = 0;
+
+ if (x < Width)
+ {
+ c = ImageData[k + x];
+ for (i = 1; i < 4; i++)
+ {
+ if (x + i*8 < Width)
+ {
+ c |= (ImageData[k + x + i * 8] << i * 8);
+ }
+ }
+ }
+
+ InbvPutPixels(x, 479 - y, c);
+ x += 8*4;
+ }
+ }
+ k += Width;
+ }
+}
+
+
+static VOID
+InbvDisplayCompressedBitmap()
+{
+ PBITMAPV5HEADER bminfo;
+ ULONG i,j,k;
+ ULONG x,y;
+ ULONG curx,cury;
+ ULONG bfOffBits;
+ ULONG clen;
+ PCHAR ImageData;
+
+ bminfo = (PBITMAPV5HEADER) &BootimageBitmap[0];
+ DPRINT("bV5Size = %d\n", bminfo->bV5Size);
+ DPRINT("bV5Width = %d\n", bminfo->bV5Width);
+ DPRINT("bV5Height = %d\n", bminfo->bV5Height);
+ DPRINT("bV5Planes = %d\n", bminfo->bV5Planes);
+ DPRINT("bV5BitCount = %d\n", bminfo->bV5BitCount);
+ DPRINT("bV5Compression = %d\n", bminfo->bV5Compression);
+ DPRINT("bV5SizeImage = %d\n", bminfo->bV5SizeImage);
+ DPRINT("bV5XPelsPerMeter = %d\n", bminfo->bV5XPelsPerMeter);
+ DPRINT("bV5YPelsPerMeter = %d\n", bminfo->bV5YPelsPerMeter);
+ DPRINT("bV5ClrUsed = %d\n", bminfo->bV5ClrUsed);
+ DPRINT("bV5ClrImportant = %d\n", bminfo->bV5ClrImportant);
+
+ bfOffBits = bminfo->bV5Size + bminfo->bV5ClrUsed * sizeof(RGBQUAD);
+ DPRINT("bfOffBits = %d\n", bfOffBits);
+ DPRINT("size of color indices = %d\n", bminfo->bV5ClrUsed * sizeof(RGBQUAD));
+ DPRINT("first byte of data = %d\n", BootimageBitmap[bfOffBits]);
+
+ InbvSetBlackPalette();
+
+ ImageData = ExAllocatePool(NonPagedPool, bminfo->bV5Width * bminfo->bV5Height);
+ RtlZeroMemory(ImageData, bminfo->bV5Width * bminfo->bV5Height);
+
+ /*
+ * ImageData has 1 pixel per byte.
+ * bootimage has 2 pixels per byte.
+ */
+
+ if (bminfo->bV5Compression == 2)
+ {
+ k = 0;
+ j = 0;
+ while ((j < bminfo->bV5SizeImage) && (k < (ULONG) (bminfo->bV5Width * bminfo->bV5Height)))
+ {
+ unsigned char b;
+
+ clen = BootimageBitmap[bfOffBits + j];
+ j++;
+
+ if (clen > 0)
+ {
+ /* Encoded mode */
+
+ b = BootimageBitmap[bfOffBits + j];
+ j++;
+
+ for (i = 0; i < (clen / 2); i++)
+ {
+ ImageData[k] = (b & 0xf0) >> 4;
+ k++;
+ ImageData[k] = b & 0xf;
+ k++;
+ }
+ if ((clen & 1) > 0)
+ {
+ ImageData[k] = (b & 0xf0) >> 4;
+ k++;
+ }
+ }
+ else
+ {
+ /* Absolute mode */
+ b = BootimageBitmap[bfOffBits + j];
+ j++;
+
+ if (b == 0)
+ {
+ /* End of line */
+ }
+ else if (b == 1)
+ {
+ /* End of image */
+ break;
+ }
+ else if (b == 2)
+ {
+ x = BootimageBitmap[bfOffBits + j];
+ j++;
+ y = BootimageBitmap[bfOffBits + j];
+ j++;
+ curx = k % bminfo->bV5Width;
+ cury = k / bminfo->bV5Width;
+ k = (cury + y) * bminfo->bV5Width + (curx + x);
+ }
+ else
+ {
+ if ((j & 1) > 0)
+ {
+ DPRINT("Unaligned copy!\n");
+ }
+
+ clen = b;
+ for (i = 0; i < (clen / 2); i++)
+ {
+ b = BootimageBitmap[bfOffBits + j];
+ j++;
+
+ ImageData[k] = (b & 0xf0) >> 4;
+ k++;
+ ImageData[k] = b & 0xf;
+ k++;
+ }
+ if ((clen & 1) > 0)
+ {
+ b = BootimageBitmap[bfOffBits + j];
+ j++;
+ ImageData[k] = (b & 0xf0) >> 4;
+ k++;
+ }
+ /* Word align */
+ j += (j & 1);
+ }
+ }
+ }
+
+ InbvDisplayBitmap(bminfo->bV5Width, bminfo->bV5Height, ImageData);
+ }
+ else
+ {
+ DbgPrint("Warning boot image need to be compressed using RLE4\n");
+ }
+
+ ExFreePool(ImageData);
+}
+
+
+#define PALETTE_FADE_STEPS 20
+#define PALETTE_FADE_TIME 20 * 10000 /* 20ms */
+
+static VOID
+InbvFadeUpPalette()
+{
+ PBITMAPV5HEADER bminfo;
+ PRGBQUAD Palette;
+ ULONG i;
+ unsigned char r,g,b;
+ register ULONG c;
+ LARGE_INTEGER Interval;
+ FADER_PALETTE_ENTRY FaderPalette[16];
+ FADER_PALETTE_ENTRY FaderPaletteDelta[16];
+
+ RtlZeroMemory(&FaderPalette, sizeof(FaderPalette));
+ RtlZeroMemory(&FaderPaletteDelta, sizeof(FaderPaletteDelta));
+
+ bminfo = (PBITMAPV5HEADER) &BootimageBitmap[0]; //sizeof(BITMAPFILEHEADER)];
+ Palette = (PRGBQUAD) &BootimageBitmap[/* sizeof(BITMAPFILEHEADER) + */ bminfo->bV5Size];
+
+ for (i = 0; i < 16; i++)
+ {
+ if (i < bminfo->bV5ClrUsed)
+ {
+ FaderPaletteDelta[i].r = ((Palette[i].rgbRed << 8) / PALETTE_FADE_STEPS);
+ FaderPaletteDelta[i].g = ((Palette[i].rgbGreen << 8) / PALETTE_FADE_STEPS);
+ FaderPaletteDelta[i].b = ((Palette[i].rgbBlue << 8) / PALETTE_FADE_STEPS);
+ }
+ }
+
+ for (i = 0; i < PALETTE_FADE_STEPS; i++)
+ {
+ for (c = 0; c < bminfo->bV5ClrUsed; c++)
+ {
+ /* Add the delta */
+ FaderPalette[c].r += FaderPaletteDelta[c].r;
+ FaderPalette[c].g += FaderPaletteDelta[c].g;
+ FaderPalette[c].b += FaderPaletteDelta[c].b;
+
+ /* Get the integer values */
+ r = FaderPalette[c].r >> 8;
+ g = FaderPalette[c].g >> 8;
+ b = FaderPalette[c].b >> 8;
+
+ /* Don't go too far */
+ if (r > Palette[c].rgbRed)
+ r = Palette[c].rgbRed;
+ if (g > Palette[c].rgbGreen)
+ g = Palette[c].rgbGreen;
+ if (b > Palette[c].rgbBlue)
+ b = Palette[c].rgbBlue;
+
+ /* Update the hardware */
+ InbvSetColor(c, r, g, b);
+ }
+ Interval.QuadPart = -PALETTE_FADE_TIME;
+ KeDelayExecutionThread(KernelMode, FALSE, &Interval);
+ }
+}
+
+static VOID STDCALL
+InbvBitmapThreadMain(PVOID Ignored)
+{
+ if (InbvFindBootimage())
+ {
+ InbvDisplayCompressedBitmap();
+ InbvFadeUpPalette();
+ }
+ else
+ {
+ DbgPrint("Warning: Cannot find boot image\n");
+ }
+
+ BitmapIsDrawn = TRUE;
+ for(;;)
+ {
+ if (BitmapThreadShouldTerminate)
+ {
+ DPRINT("Terminating\n");
+ return;
+ }
+ NtYieldExecution();
+ }
+}
+
+
+BOOLEAN
+STDCALL
+VidIsBootDriverInstalled(VOID)
+{
+ return InGraphicsMode;
+}
+
+
+BOOLEAN
+STDCALL
+VidInitialize(VOID)
+{
+ NTSTATUS Status;
+
+ if (!VideoAddressSpaceInitialized)
+ {
+ InbvInitializeVideoAddressSpace();
+ }
+
+ InbvInitVGAMode();
+
+ InGraphicsMode = TRUE;
+
+ BitmapIsDrawn = FALSE;
+ BitmapThreadShouldTerminate = FALSE;
+
+ Status = PsCreateSystemThread(&BitmapThreadHandle,
+ THREAD_ALL_ACCESS,
+ NULL,
+ NULL,
+ &BitmapThreadId,
+ InbvBitmapThreadMain,
+ NULL);
+ if (!NT_SUCCESS(Status))
+ {
+ return FALSE;
+ }
+
+ return TRUE;
+}
--- /dev/null
+/* $Id: pixelsup.S,v 1.1 2003/08/11 18:50:12 chorns Exp $
+ *
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS kernel
+ * FILE: ntoskrnl/inbv/i386/pixelsup.S
+ * PURPOSE: Boot video support
+ * PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
+ */
+
+/*
+ * VOID
+ * InbvPutPixels(int x, int y, unsigned long c);
+ *
+ * Will put 4 pixels on the screen at
+ * (x+0*8,y), (x+1*8,y), (x+2*8,y), and (x+3*8,y)
+ * c will contain:
+ * bits 0- 3: Palette index for pixel at (x+0*8,y)
+ * bits 8-11: Palette index for pixel at (x+1*8,y)
+ * bits 16-19: Palette index for pixel at (x+2*8,y)
+ * bits 24-27: Palette index for pixel at (x+3*8,y)
+ *
+ * Parameters:
+ * [EBP+08h] - x X-coordinate of first pixel
+ * [ESP+0Ch] - y Y-coordinate of first pixel
+ * [ESP+10h] - c 4*4-bit color indices
+ */
+.globl _InbvPutPixels
+_InbvPutPixels:
+ pushl %ebp
+ movl %esp, %ebp
+
+ /* Compute mask and put it in EBX
+ mask = maskbit[x] */
+ movl 0x8(%ebp), %esi
+ movl _maskbit(,%esi, 4), %ebx
+
+ /* Don't set bit mask if it is already set */
+ cmpl (inbv_last_mask),%ebx
+ je .nomask
+
+ /* Set Mask Bit Register
+ WRITE_PORT_UCHAR((PUCHAR)0x3ce,0x08);
+ WRITE_PORT_UCHAR((PUCHAR)0x3cf,mask); */
+ movl %ebx,(inbv_last_mask)
+ movw $0x3ce,%dx
+ movb $0x08,%al
+ outb %al,%dx
+ movw $0x3cf,%dx
+ movb %bl,%al
+ outb %al,%dx
+
+.nomask:
+
+ /* Compute offset in video memory and put it in EBX
+ offset = (x >> 3) + y80[y]; */
+ movl 0xC(%ebp), %esi /* y */
+ movl _y80(,%esi, 4), %ebx
+ movl 0x8(%ebp), %eax /* x */
+ shrl $0x3, %eax
+ addl %eax, %ebx
+
+ /* Latch first byte
+ (UCHAR) READ_REGISTER_UCHAR(vidmem + offset+0); */
+ movl (_vidmem), %esi
+ addl %ebx, %esi
+ movb 0x0(%esi), %bl
+ /* Write color index for first pixel
+ *((PUCHAR)(vidmem + offset+0)) = (c >> 0*8) & 0xff; */
+ movl 0x10(%ebp), %eax
+ movb %al, 0x0(%esi)
+
+ /* Latch second byte
+ (UCHAR) READ_REGISTER_UCHAR(vidmem + offset+1); */
+ movb 0x1(%esi), %bl
+ /* Write color index for second pixel
+ *((PUCHAR)(vidmem + offset+1)) = (c >> 1*8) & 0xff; */
+ shrl $0x8, %eax
+ movb %al, 0x1(%esi)
+
+ /* Latch third byte
+ (UCHAR) READ_REGISTER_UCHAR(vidmem + offset+2); */
+ movb 0x2(%esi), %bl
+ /* Write color index for third pixel
+ *((PUCHAR)(vidmem + offset+2)) = (c >> 2*8) & 0xff; */
+ shrl $0x8, %eax
+ movb %al, 0x2(%esi)
+
+ /* Latch fourth byte
+ (UCHAR) READ_REGISTER_UCHAR(vidmem + offset+3); */
+ movb 0x3(%esi), %bl
+ /* Write color index for fourth pixel
+ *((PUCHAR)(vidmem + offset+3)) = (c >> 3*8) & 0xff; */
+ shrl $0x8, %eax
+ movb %al, 0x3(%esi)
+
+ popl %ebp
+ ret
+
+.bss
+inbv_last_mask:
+ .short 0
--- /dev/null
+/* $Id: inbv.c,v 1.1 2003/08/11 18:50:12 chorns Exp $
+ *
+ * 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
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include <roskrnl.h>
+#include <ntos/bootvid.h>
+
+#define NDEBUG
+#include <internal/debug.h>
+
+
+/* GLOBALS *******************************************************************/
+
+/* DATA **********************************************************************/
+
+/* FUNCTIONS *****************************************************************/
+
+VOID
+STDCALL
+InbvAcquireDisplayOwnership(VOID)
+{
+}
+
+
+BOOLEAN
+STDCALL
+InbvCheckDisplayOwnership(VOID)
+{
+ return FALSE;
+}
+
+
+BOOLEAN
+STDCALL
+InbvDisplayString(IN PCHAR String)
+{
+ return FALSE;
+}
+
+
+VOID
+STDCALL
+InbvEnableBootDriver(IN BOOLEAN Enable)
+{
+ if (Enable)
+ {
+ VidInitialize();
+ }
+ else
+ {
+ VidCleanUp();
+ }
+}
+
+BOOLEAN
+STDCALL
+InbvEnableDisplayString(IN BOOLEAN Enable)
+{
+ return FALSE;
+}
+
+
+VOID
+STDCALL
+InbvInstallDisplayStringFilter(IN PVOID Unknown)
+{
+}
+
+
+BOOLEAN
+STDCALL
+InbvIsBootDriverInstalled(VOID)
+{
+ return VidIsBootDriverInstalled();
+}
+
+
+VOID
+STDCALL
+InbvNotifyDisplayOwnershipLost(IN PVOID Callback)
+{
+}
+
+
+BOOLEAN
+STDCALL
+InbvResetDisplay(VOID)
+{
+ return VidResetDisplay();
+}
+
+
+VOID
+STDCALL
+InbvSetScrollRegion(IN ULONG Left,
+ IN ULONG Top,
+ IN ULONG Width,
+ IN ULONG Height)
+{
+}
+
+
+VOID
+STDCALL
+InbvSetTextColor(IN ULONG Color)
+{
+}
+
+
+VOID
+STDCALL
+InbvSolidColorFill(IN ULONG Left,
+ IN ULONG Top,
+ IN ULONG Width,
+ IN ULONG Height,
+ IN ULONG Color)
+{
+}
-/* $Id: kd.h,v 1.18 2003/02/14 17:52:30 ekohl Exp $
+/* $Id: kd.h,v 1.19 2003/08/11 18:50:12 chorns Exp $
*
* kernel debugger prototypes
*/
VOID
KdInit2(VOID);
+VOID
+KdInit3(VOID);
+
VOID
KdPutChar(UCHAR Value);
-/* $Id: kdebug.c,v 1.45 2003/07/21 21:53:51 royce Exp $
+/* $Id: kdebug.c,v 1.46 2003/08/11 18:50:12 chorns Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
p1 = p2;
}
- /* Print some information */
- if (KdDebuggerEnabled == TRUE)
- {
- if (KdDebugState & KD_DEBUG_GDB)
- PrintString("\n GDB debugging enabled. COM%ld %ld Baud\n\n",
- GdbPortInfo.ComPort, GdbPortInfo.BaudRate);
-
- if (KdDebugState & KD_DEBUG_PICE)
- PrintString("\n Private ICE debugger enabled\n\n");
-
- if (KdDebugState & KD_DEBUG_SCREEN)
- PrintString("\n Screen debugging enabled\n\n");
-
- if (KdDebugState & KD_DEBUG_BOCHS)
- PrintString("\n Bochs debugging enabled\n\n");
-
- if (KdDebugState & KD_DEBUG_SERIAL)
- PrintString("\n Serial debugging enabled. COM%ld %ld Baud\n\n",
- LogPortInfo.ComPort, LogPortInfo.BaudRate);
-
- if (KdDebugState & KD_DEBUG_FILELOG)
- PrintString("\n File log debugging enabled\n\n");
- if (KdDebugState & KD_DEBUG_MDA)
- PrintString("\n MDA debugging enabled\n\n");
- }
-
/* Perform any initialization nescessary */
if (KdDebuggerEnabled == TRUE)
{
}
}
+
+VOID
+KdInit3(VOID)
+{
+ /* Print some information */
+ if (KdDebuggerEnabled == TRUE)
+ {
+ if (KdDebugState & KD_DEBUG_GDB)
+ PrintString("\n GDB debugging enabled. COM%ld %ld Baud\n\n",
+ GdbPortInfo.ComPort, GdbPortInfo.BaudRate);
+
+ if (KdDebugState & KD_DEBUG_PICE)
+ PrintString("\n Private ICE debugger enabled\n\n");
+
+ if (KdDebugState & KD_DEBUG_SCREEN)
+ PrintString("\n Screen debugging enabled\n\n");
+
+ if (KdDebugState & KD_DEBUG_BOCHS)
+ PrintString("\n Bochs debugging enabled\n\n");
+
+ if (KdDebugState & KD_DEBUG_SERIAL)
+ PrintString("\n Serial debugging enabled. COM%ld %ld Baud\n\n",
+ LogPortInfo.ComPort, LogPortInfo.BaudRate);
+
+ if (KdDebugState & KD_DEBUG_FILELOG)
+ PrintString("\n File log debugging enabled\n\n");
+ if (KdDebugState & KD_DEBUG_MDA)
+ PrintString("\n MDA debugging enabled\n\n");
+ }
+}
+
+
VOID
KdSerialDebugPrint (LPSTR Message)
{
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/* $Id: bug.c,v 1.34 2003/07/15 16:26:18 silverblade Exp $
+/* $Id: bug.c,v 1.35 2003/08/11 18:50:12 chorns Exp $
*
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/ke/bug.c
/* INCLUDES *****************************************************************/
#include <roskrnl.h>
+#include <ntos/bootvid.h>
#include <internal/kd.h>
#include <internal/ke.h>
#include <internal/ps.h>
PRTL_MESSAGE_RESOURCE_ENTRY Message;
NTSTATUS Status;
+ /*
+ * The bug check may have happened while the bootscreen image was displayed.
+ * If this happened, switch back to text mode.
+ */
+ if (InbvIsBootDriverInstalled())
+ {
+ InbvEnableBootDriver(FALSE);
+ }
+
/* Make sure we're switching back to the blue screen and print messages on it */
HalReleaseDisplayOwnership();
KdDebugState |= KD_DEBUG_SCREEN;
{
PRTL_MESSAGE_RESOURCE_ENTRY Message;
NTSTATUS Status;
+
+ /*
+ * The bug check may have happened while the bootscreen image was displayed.
+ * If this happened, switch back to text mode.
+ */
+ if (InbvIsBootDriverInstalled())
+ {
+ InbvEnableBootDriver(FALSE);
+ }
/* Make sure we're switching back to the blue screen and print messages on it */
HalReleaseDisplayOwnership();
popl KV86M_REGISTERS_ECX(%ebx)
popl KV86M_REGISTERS_EAX(%ebx)
- /* Ignore the previous mode */
- addl $4, %esp
+ /* Restore the old previous mode */
+ popl %eax
+ movb %al, %ss:KTHREAD_PREVIOUS_MODE(%esi)
- /* Ignore old exception handler list */
- addl $4, %esp
+ /* Restore the old exception handler list */
+ popl %eax
+ movl %eax, %fs:KPCR_EXCEPTION_LIST
/* Ignore the 32-bit fs register */
addl $4, %esp
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/* $Id: main.c,v 1.166 2003/07/21 21:53:51 royce Exp $
+/* $Id: main.c,v 1.167 2003/08/11 18:50:12 chorns Exp $
*
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/ke/main.c
#include <internal/registry.h>
#include <internal/nls.h>
#include <reactos/bugcodes.h>
+#include <ntos/bootvid.h>
#ifdef HALDBG
#include <internal/ntosdbg.h>
BOOLEAN SetupBoot;
PCHAR p1, p2;
ULONG MaxMem;
+ BOOLEAN NoBootScreen = FALSE;
+ UNICODE_STRING Name;
+ HANDLE InitDoneEventHandle;
+ OBJECT_ATTRIBUTES ObjectAttributes;
/*
* Fail at runtime if someone has changed various structures without
}
}
}
+ else if (!_strnicmp(p2, "NOBOOTSCREEN", 12))
+ {
+ p2 += 12;
+ NoBootScreen = TRUE;
+ }
p1 = p2;
}
DbgBreakPointWithStatus (DBG_STATUS_CONTROL_C);
}
- /*
- * Display version number and copyright/warranty message
- */
- HalDisplayString("Starting ReactOS "KERNEL_VERSION_STR" (Build "
- KERNEL_VERSION_BUILD_STR")\n");
- HalDisplayString(RES_STR_LEGAL_COPYRIGHT);
- HalDisplayString("\n\nReactOS is free software, covered by the GNU General "
- "Public License, and you\n");
- HalDisplayString("are welcome to change it and/or distribute copies of it "
- "under certain\n");
- HalDisplayString("conditions. There is absolutely no warranty for "
- "ReactOS.\n\n");
-
/* Initialize all processors */
KeNumberProcessors = 0;
KeNumberProcessors++;
}
- if (KeNumberProcessors > 1)
- {
- sprintf(str,
- "Found %d system processors. [%lu MB Memory]\n",
- KeNumberProcessors,
- (KeLoaderBlock.MemHigher + 1088)/ 1024);
- }
- else
- {
- sprintf(str,
- "Found 1 system processor. [%lu MB Memory]\n",
- (KeLoaderBlock.MemHigher + 1088)/ 1024);
- }
- HalDisplayString(str);
-
/*
* Initialize various critical subsystems
*/
/* Report all resources used by hal */
HalReportResourceUsage();
+ /* Display the boot screen image if not disabled */
+ if (!NoBootScreen)
+ {
+ InbvEnableBootDriver(TRUE);
+ }
+
+ /*
+ * Clear the screen to blue
+ */
+ HalInitSystem(2, (PLOADER_PARAMETER_BLOCK)&KeLoaderBlock);
+
+ /*
+ * Display version number and copyright/warranty message
+ */
+ HalDisplayString("Starting ReactOS "KERNEL_VERSION_STR" (Build "
+ KERNEL_VERSION_BUILD_STR")\n");
+ HalDisplayString(RES_STR_LEGAL_COPYRIGHT);
+ HalDisplayString("\n\nReactOS is free software, covered by the GNU General "
+ "Public License, and you\n");
+ HalDisplayString("are welcome to change it and/or distribute copies of it "
+ "under certain\n");
+ HalDisplayString("conditions. There is absolutely no warranty for "
+ "ReactOS.\n\n");
+
+ if (KeNumberProcessors > 1)
+ {
+ sprintf(str,
+ "Found %d system processors. [%lu MB Memory]\n",
+ KeNumberProcessors,
+ (KeLoaderBlock.MemHigher + 1088)/ 1024);
+ }
+ else
+ {
+ sprintf(str,
+ "Found 1 system processor. [%lu MB Memory]\n",
+ (KeLoaderBlock.MemHigher + 1088)/ 1024);
+ }
+ HalDisplayString(str);
+
+ KdInit3();
+
+
/* Create the NLS section */
RtlpCreateNlsSection();
PiInitDefaultLocale();
- /*
- * Start the motherboard enumerator (the HAL)
- */
- HalInitSystem(2, (PLOADER_PARAMETER_BLOCK)&KeLoaderBlock);
#if 0
/*
* Load boot start drivers
*/
InitSystemSharedUserPage ((PUCHAR)KeLoaderBlock.CommandLine);
+ /* Create 'ReactOSInitDone' event */
+ RtlInitUnicodeString(&Name, L"\\ReactOSInitDone");
+ InitializeObjectAttributes(&ObjectAttributes,
+ &Name,
+ 0,
+ NULL,
+ NULL);
+ Status = NtCreateEvent(&InitDoneEventHandle,
+ EVENT_ALL_ACCESS,
+ &ObjectAttributes,
+ FALSE, /* Synchronization event */
+ FALSE); /* Not signalled */
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Failed to create 'ReactOSInitDone' event (Status 0x%x)\n", Status);
+ InitDoneEventHandle = INVALID_HANDLE_VALUE;
+ }
+
/*
* Launch initial process
*/
KEBUGCHECKEX(SESSION4_INITIALIZATION_FAILED, Status, 0, 0, 0);
}
- /*
- * Crash the system if the initial process terminates within 5 seconds.
- */
- Timeout.QuadPart = -50000000LL;
- Status = NtWaitForSingleObject(ProcessHandle,
- FALSE,
- &Timeout);
- if (Status != STATUS_TIMEOUT)
+ if (InitDoneEventHandle != INVALID_HANDLE_VALUE)
{
- KEBUGCHECKEX(SESSION5_INITIALIZATION_FAILED, Status, 0, 0, 0);
+ HANDLE Handles[2]; /* Init event, Initial process */
+
+ Handles[0] = InitDoneEventHandle;
+ Handles[1] = ProcessHandle;
+
+ /* Wait for the system to be initialized */
+ Timeout.QuadPart = -1200000000LL; /* 120 second timeout */
+ Status = NtWaitForMultipleObjects(((LONG) sizeof(Handles) / sizeof(HANDLE)),
+ Handles,
+ WaitAny,
+ FALSE, /* Non-alertable */
+ &Timeout);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("NtWaitForMultipleObjects failed with status 0x%x!\n", Status);
+ }
+ else if (Status == STATUS_TIMEOUT)
+ {
+ DPRINT1("WARNING: System not initialized after 120 seconds.\n");
+ }
+ else if (Status == STATUS_WAIT_0 + 1)
+ {
+ /*
+ * Crash the system if the initial process was terminated.
+ */
+ KEBUGCHECKEX(SESSION5_INITIALIZATION_FAILED, Status, 0, 0, 0);
+ }
+
+ if (!NoBootScreen)
+ {
+ InbvEnableBootDriver(FALSE);
+ }
+
+ NtSetEvent(InitDoneEventHandle, NULL);
+
+ NtClose(InitDoneEventHandle);
+ }
+ else
+ {
+ /* On failure to create 'ReactOSInitDone' event, go to text mode ASAP */
+ if (!NoBootScreen)
+ {
+ InbvEnableBootDriver(FALSE);
+ }
+
+ /*
+ * Crash the system if the initial process terminates within 5 seconds.
+ */
+ Timeout.QuadPart = -50000000LL;
+ Status = NtWaitForSingleObject(ProcessHandle,
+ FALSE,
+ &Timeout);
+ if (Status != STATUS_TIMEOUT)
+ {
+ KEBUGCHECKEX(SESSION5_INITIALIZATION_FAILED, Status, 0, 0, 0);
+ }
}
NtClose(ThreadHandle);
-; $Id: ntoskrnl.def,v 1.159 2003/07/25 23:51:23 dwelch Exp $
+; $Id: ntoskrnl.def,v 1.160 2003/08/11 18:50:12 chorns Exp $
;
; reactos/ntoskrnl/ntoskrnl.def
;
FsRtlUninitializeOplock@4
HalDispatchTable DATA
HalPrivateDispatchTable DATA
+InbvAcquireDisplayOwnership@0
+InbvCheckDisplayOwnership@0
+InbvDisplayString@4
+InbvEnableBootDriver@4
+InbvEnableDisplayString@4
+InbvInstallDisplayStringFilter@4
+InbvIsBootDriverInstalled@0
+InbvNotifyDisplayOwnershipLost@4
+InbvResetDisplay@0
+InbvSetScrollRegion@16
+InbvSetTextColor@4
+InbvSolidColorFill@20
@InterlockedCompareExchange@12
@InterlockedDecrement@4
@InterlockedExchange@8
-; $Id: ntoskrnl.edf,v 1.147 2003/07/31 01:44:18 royce Exp $
+; $Id: ntoskrnl.edf,v 1.148 2003/08/11 18:50:12 chorns Exp $
;
; reactos/ntoskrnl/ntoskrnl.def
;
FsRtlUninitializeOplock=FsRtlUninitializeOplock@4
HalDispatchTable DATA
HalPrivateDispatchTable DATA
+InbvAcquireDisplayOwnership=InbvAcquireDisplayOwnership@0
+InbvCheckDisplayOwnership=InbvCheckDisplayOwnership@0
+InbvDisplayString=InbvDisplayString@4
+InbvEnableBootDriver=InbvEnableBootDriver@4
+InbvEnableDisplayString=InbvEnableDisplayString@4
+InbvInstallDisplayStringFilter=InbvInstallDisplayStringFilter@4
+InbvIsBootDriverInstalled=InbvIsBootDriverInstalled@0
+InbvNotifyDisplayOwnershipLost=InbvNotifyDisplayOwnershipLost@4
+InbvResetDisplay=InbvResetDisplay@0
+InbvSetScrollRegion=InbvSetScrollRegion@16
+InbvSetTextColor=InbvSetTextColor@4
+InbvSolidColorFill=InbvSolidColorFill@20
InterlockedCompareExchange=@InterlockedCompareExchange@12
InterlockedDecrement=@InterlockedDecrement@4
InterlockedExchange=@InterlockedExchange@8
END
END
+IDB_BOOTIMAGE BITMAP DISCARDABLE "res/bootimage.bmp"
+
#include "bugcodes.rc"
-/* $Id: init.c,v 1.19 2003/06/17 13:55:16 gvg Exp $
+/* $Id: init.c,v 1.20 2003/08/11 18:50:12 chorns Exp $
*
* reactos/subsys/csrss/init.c
*
#include "api.h"
+#define NDEBUG
+#include <debug.h>
+
/* GLOBALS ******************************************************************/
/*
Status = CsrParseCommandLine (ArgumentCount, ArgumentArray);
if (!NT_SUCCESS(Status))
{
- PrintString("CSR: Unable to parse the command line (Status: %x)\n", Status);
+ DPRINT1("CSR: Unable to parse the command line (Status: %x)\n", Status);
return(FALSE);
}
0);
if (!NT_SUCCESS(Status))
{
- PrintString("CSR: Unable to create \\ApiPort (Status %x)\n", Status);
+ DPRINT1("CSR: Unable to create \\ApiPort (Status %x)\n", Status);
return(FALSE);
}
CsrssApiHeap = RtlCreateHeap(HEAP_GROWABLE,
NULL);
if (CsrssApiHeap == NULL)
{
- PrintString("CSR: Failed to create private heap, aborting\n");
+ DPRINT1("CSR: Failed to create private heap, aborting\n");
return FALSE;
}
NULL);
if (!NT_SUCCESS(Status))
{
- PrintString("CSR: Unable to create server thread\n");
+ DPRINT1("CSR: Unable to create server thread\n");
NtClose(ApiPortHandle);
return FALSE;
}
Status = NtCreateEvent( &RefreshEventHandle, STANDARD_RIGHTS_ALL, &RefreshEventAttr, FALSE, FALSE );
if( !NT_SUCCESS( Status ) )
{
- PrintString( "CSR: Unable to create refresh event!\n" );
+ DPRINT1( "CSR: Unable to create refresh event!\n" );
return FALSE;
}
Status = RtlCreateUserThread( NtCurrentProcess(), NULL, FALSE, 0, NULL, NULL, (PTHREAD_START_ROUTINE)Console_Api, (PVOID) RefreshEventHandle, NULL, NULL );
if( !NT_SUCCESS( Status ) )
{
- PrintString( "CSR: Unable to create console thread\n" );
+ DPRINT1( "CSR: Unable to create console thread\n" );
return FALSE;
}
-/* $Id: init.c,v 1.49 2003/07/24 18:14:59 royce Exp $
+/* $Id: init.c,v 1.50 2003/08/11 18:50:12 chorns Exp $
*
* init.c - Session Manager initialization
*
#include "smss.h"
#define NDEBUG
-
+#include <debug.h>
/* GLOBALS ******************************************************************/
NTSTATUS Status = STATUS_SUCCESS;
#ifndef NDEBUG
- PrintString("ValueName '%S' Type %lu Length %lu\n", ValueName, ValueType, ValueLength);
- PrintString("ValueData '%S'\n", (PWSTR)ValueData);
+ DbgPrint("ValueName '%S' Type %lu Length %lu\n", ValueName, ValueType, ValueLength);
+ DbgPrint("ValueData '%S'\n", (PWSTR)ValueData);
#endif
if (ValueType != REG_SZ)
{
WCHAR LinkBuffer[80];
NTSTATUS Status;
-#ifndef NDEBUG
- PrintString("ValueName '%S' Type %lu Length %lu\n", ValueName, ValueType, ValueLength);
- PrintString("ValueData '%S'\n", (PWSTR)ValueData);
-#endif
+ DPRINT("ValueName '%S' Type %lu Length %lu\n", ValueName, ValueType, ValueLength);
+ DPRINT("ValueData '%S'\n", (PWSTR)ValueData);
if (ValueType != REG_SZ)
{
RtlInitUnicodeString(&DeviceName,
(PWSTR)ValueData);
-#ifndef NDEBUG
- PrintString("SM: Linking %wZ --> %wZ\n",
+ DPRINT("SM: Linking %wZ --> %wZ\n",
&LinkName,
&DeviceName);
-#endif
/* create symbolic link */
InitializeObjectAttributes(&ObjectAttributes,
&DeviceName);
if (!NT_SUCCESS(Status))
{
- PrintString("SmDosDevicesQueryRoutine: NtCreateSymbolicLink( %wZ --> %wZ ) failed!\n",
+ DPRINT1("SmDosDevicesQueryRoutine: NtCreateSymbolicLink( %wZ --> %wZ ) failed!\n",
&LinkName,
&DeviceName);
}
ULONG len;
NTSTATUS Status;
-#ifndef NDEBUG
- PrintString("ValueName '%S' Type %lu Length %lu\n", ValueName, ValueType, ValueLength);
- PrintString("ValueData '%S'\n", (PWSTR)ValueData);
-#endif
+ DPRINT("ValueName '%S' Type %lu Length %lu\n", ValueName, ValueType, ValueLength);
+ DPRINT("ValueData '%S'\n", (PWSTR)ValueData);
if (ValueType != REG_SZ)
{
wcscpy(CommandLine, p2);
}
- PrintString("Running %S...\n", Description);
-#ifndef NDEBUG
- PrintString("ImageName: '%S'\n", ImageName);
- PrintString("CommandLine: '%S'\n", CommandLine);
-#endif
+ DPRINT("Running %S...\n", Description);
+ DPRINT("ImageName: '%S'\n", ImageName);
+ DPRINT("CommandLine: '%S'\n", CommandLine);
/* initialize executable path */
wcscpy(ImagePath, L"\\SystemRoot\\system32\\");
&ProcessInfo);
if (!NT_SUCCESS(Status))
{
- PrintString("Running %s failed (Status %lx)\n", Description, Status);
+ DPRINT1("Running %s failed (Status %lx)\n", Description, Status);
return(STATUS_SUCCESS);
}
NULL);
if (!NT_SUCCESS(Status))
{
- PrintString("SmRunBootApps: RtlQueryRegistryValues() failed! (Status %lx)\n", Status);
+ DPRINT1("SmRunBootApps: RtlQueryRegistryValues() failed! (Status %lx)\n", Status);
}
return(Status);
static NTSTATUS
SmProcessFileRenameList(VOID)
{
-#ifndef NDEBUG
- PrintString("SmProcessFileRenameList() called\n");
-#endif
+ DPRINT("SmProcessFileRenameList() called\n");
/* FIXME: implement it! */
-#ifndef NDEBUG
- PrintString("SmProcessFileRenameList() done\n");
-#endif
+ DPRINT("SmProcessFileRenameList() done\n");
return(STATUS_SUCCESS);
}
HANDLE SectionHandle;
NTSTATUS Status;
-#ifndef NDEBUG
- PrintString("ValueName '%S' Type %lu Length %lu\n", ValueName, ValueType, ValueLength);
- PrintString("ValueData '%S' Context %p EntryContext %p\n", (PWSTR)ValueData, Context, EntryContext);
-#endif
+ DPRINT("ValueName '%S' Type %lu Length %lu\n", ValueName, ValueType, ValueLength);
+ DPRINT("ValueData '%S' Context %p EntryContext %p\n", (PWSTR)ValueData, Context, EntryContext);
/* Ignore the 'DllDirectory' value */
if (!_wcsicmp(ValueName, L"DllDirectory"))
FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE);
if (!NT_SUCCESS(Status))
{
-#ifndef NDEBUG
- PrintString("NtOpenFile() failed (Status %lx)\n", Status);
-#endif
+ DPRINT1("NtOpenFile() failed (Status %lx)\n", Status);
return STATUS_SUCCESS;
}
-#ifndef NDEBUG
- PrintString("Opened file %wZ successfully\n", &ImageName);
-#endif
+ DPRINT("Opened file %wZ successfully\n", &ImageName);
/* Check for valid image checksum */
Status = LdrVerifyImageMatchesChecksum (FileHandle,
}
else if (!NT_SUCCESS(Status))
{
-#ifndef NDEBUG
- PrintString("Failed to check the image checksum\n");
-#endif
+ DPRINT1("Failed to check the image checksum\n");
+
NtClose(SectionHandle);
NtClose(FileHandle);
FileHandle);
if (NT_SUCCESS(Status))
{
-#ifndef NDEBUG
- PrintString("Created section successfully\n");
-#endif
+ DPRINT("Created section successfully\n");
NtClose(SectionHandle);
}
HANDLE SymlinkHandle;
NTSTATUS Status;
-#ifndef NDEBUG
- PrintString("SmLoadKnownDlls() called\n");
-#endif
+ DPRINT("SmLoadKnownDlls() called\n");
/* Create 'KnownDlls' object directory */
RtlInitUnicodeString(&Name,
&ObjectAttributes);
if (!NT_SUCCESS(Status))
{
-#ifndef NDEBUG
- PrintString("NtCreateDirectoryObject() failed (Status %lx)\n", Status);
-#endif
+ DPRINT1("NtCreateDirectoryObject() failed (Status %lx)\n", Status);
return Status;
}
SmSystemEnvironment);
if (!NT_SUCCESS(Status))
{
-#ifndef NDEBUG
- PrintString("RtlQueryRegistryValues() failed (Status %lx)\n", Status);
-#endif
+ DPRINT1("RtlQueryRegistryValues() failed (Status %lx)\n", Status);
return Status;
}
-#ifndef NDEBUG
- PrintString("DllDosPath: '%wZ'\n", &DllDosPath);
-#endif
+ DPRINT("DllDosPath: '%wZ'\n", &DllDosPath);
if (!RtlDosPathNameToNtPathName_U(DllDosPath.Buffer,
&DllNtPath,
NULL,
NULL))
{
-#ifndef NDEBUG
- PrintString("RtlDosPathNameToNtPathName_U() failed\n");
-#endif
+ DPRINT1("RtlDosPathNameToNtPathName_U() failed\n");
return STATUS_OBJECT_NAME_INVALID;
}
- PrintString("DllNtPath: '%wZ'\n", &DllNtPath);
+ DPRINT("DllNtPath: '%wZ'\n", &DllNtPath);
/* Open the dll path directory */
InitializeObjectAttributes(&ObjectAttributes,
FILE_SYNCHRONOUS_IO_NONALERT | FILE_DIRECTORY_FILE);
if (!NT_SUCCESS(Status))
{
-#ifndef NDEBUG
- PrintString("NtOpenFile() failed (Status %lx)\n", Status);
-#endif
+ DPRINT("NtOpenFile() failed (Status %lx)\n", Status);
return Status;
}
&DllDosPath);
if (!NT_SUCCESS(Status))
{
-#ifndef NDEBUG
- PrintString("NtCreateSymbolicLink() failed (Status %lx)\n", Status);
-#endif
+ DPRINT1("NtCreateSymbolicLink() failed (Status %lx)\n", Status);
return Status;
}
NULL);
if (!NT_SUCCESS(Status))
{
-#ifndef NDEBUG
- PrintString("RtlQueryRegistryValues() failed (Status %lx)\n", Status);
-#endif
+ DPRINT1("RtlQueryRegistryValues() failed (Status %lx)\n", Status);
}
-#ifndef NDEBUG
- PrintString("SmLoadKnownDlls() done\n");
-#endif
+ DPRINT("SmLoadKnownDlls() done\n");
return Status;
}
NTSTATUS Status;
LPWSTR p;
-#ifndef NDEBUG
- PrintString("ValueName '%S' Type %lu Length %lu\n", ValueName, ValueType, ValueLength);
- PrintString("ValueData '%S'\n", (PWSTR)ValueData);
-#endif
+ DPRINT("ValueName '%S' Type %lu Length %lu\n", ValueName, ValueType, ValueLength);
+ DPRINT("ValueData '%S'\n", (PWSTR)ValueData);
if (ValueType != REG_SZ)
{
UNICODE_STRING EnvVariable;
UNICODE_STRING EnvValue;
-#ifndef NDEBUG
- PrintString("ValueName '%S' Type %lu Length %lu\n", ValueName, ValueType, ValueLength);
- PrintString("ValueData '%S'\n", (PWSTR)ValueData);
-#endif
+ DPRINT("ValueName '%S' Type %lu Length %lu\n", ValueName, ValueType, ValueLength);
+ DPRINT("ValueData '%S'\n", (PWSTR)ValueData);
if (ValueType != REG_SZ)
{
&ImageInfo,
sizeof(SYSTEM_LOAD_AND_CALL_IMAGE));
- PrintString("SMSS: Loaded win32k.sys (Status %lx)\n", Status);
+ DPRINT("SMSS: Loaded win32k.sys (Status %lx)\n", Status);
#if 0
if (!NT_SUCCESS(Status))
{
}
+static VOID
+SignalInitEvent()
+{
+ NTSTATUS Status;
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ UNICODE_STRING UnicodeString;
+ HANDLE ReactOSInitEvent;
+
+ RtlInitUnicodeStringFromLiteral(&UnicodeString, L"\\ReactOSInitDone");
+ InitializeObjectAttributes(&ObjectAttributes,
+ &UnicodeString,
+ EVENT_ALL_ACCESS,
+ 0,
+ NULL);
+ Status = NtOpenEvent(&ReactOSInitEvent,
+ EVENT_ALL_ACCESS,
+ &ObjectAttributes);
+ if (NT_SUCCESS(Status))
+ {
+ LARGE_INTEGER Timeout;
+ /* This will cause the boot screen image to go away (if displayed) */
+ NtPulseEvent(ReactOSInitEvent, NULL);
+
+ /* Wait for the display mode to be changed (if in graphics mode) */
+ Timeout.QuadPart = -50000000LL; /* 5 second timeout */
+ NtWaitForSingleObject(ReactOSInitEvent, FALSE, &Timeout);
+
+ NtClose(ReactOSInitEvent);
+ }
+ else
+ {
+ /* We don't really care if this fails */
+ DPRINT1("SM: Failed to open ReactOS init notification event\n");
+ }
+}
+
+
NTSTATUS
InitSessionManager(HANDLE Children[])
{
Status = SmCreateObjectDirectories();
if (!NT_SUCCESS(Status))
{
- PrintString("SM: Failed to create object directories (Status %lx)\n", Status);
+ DPRINT1("SM: Failed to create object directories (Status %lx)\n", Status);
return(Status);
}
Status = SmCreateApiPort();
if (!NT_SUCCESS(Status))
{
- PrintString("SM: Failed to create SmApiPort (Status %lx)\n", Status);
+ DPRINT1("SM: Failed to create SmApiPort (Status %lx)\n", Status);
return(Status);
}
&SmSystemEnvironment);
if (!NT_SUCCESS(Status))
{
- PrintString("SM: Failed to create the system environment (Status %lx)\n", Status);
+ DPRINT1("SM: Failed to create the system environment (Status %lx)\n", Status);
return(Status);
}
Status = SmSetEnvironmentVariables();
if (!NT_SUCCESS(Status))
{
- PrintString("SM: Failed to set system environment variables (Status %lx)\n", Status);
+ DPRINT1("SM: Failed to set system environment variables (Status %lx)\n", Status);
return(Status);
}
Status = SmInitDosDevices();
if (!NT_SUCCESS(Status))
{
- PrintString("SM: Failed to create dos device links (Status %lx)\n", Status);
+ DPRINT1("SM: Failed to create dos device links (Status %lx)\n", Status);
return(Status);
}
Status = SmRunBootApps();
if (!NT_SUCCESS(Status))
{
- PrintString("SM: Failed to run boot applications (Status %lx)\n", Status);
+ DPRINT1("SM: Failed to run boot applications (Status %lx)\n", Status);
return(Status);
}
Status = SmProcessFileRenameList();
if (!NT_SUCCESS(Status))
{
- PrintString("SM: Failed to process the file rename list (Status %lx)\n", Status);
+ DPRINT1("SM: Failed to process the file rename list (Status %lx)\n", Status);
return(Status);
}
- PrintString("SM: loading well-known DLLs\n");
+ DPRINT("SM: loading well-known DLLs\n");
/* Load the well known DLLs */
Status = SmLoadKnownDlls();
if (!NT_SUCCESS(Status))
{
- PrintString("SM: Failed to preload system DLLs (Status %lx)\n", Status);
+ DPRINT1("SM: Failed to preload system DLLs (Status %lx)\n", Status);
/* Don't crash ReactOS if DLLs cannot be loaded */
}
- PrintString("SM: creating system paging files\n");
+ DPRINT("SM: creating system paging files\n");
/* Create paging files */
Status = SmCreatePagingFiles();
if (!NT_SUCCESS(Status))
{
- PrintString("SM: Failed to create paging files (Status %lx)\n", Status);
+ DPRINT1("SM: Failed to create paging files (Status %lx)\n", Status);
return(Status);
}
- PrintString("SM: initializing registry\n");
+ DPRINT("SM: initializing registry\n");
/* Load remaining registry hives */
NtInitializeRegistry(FALSE);
Status = SmUpdateEnvironment();
if (!NT_SUCCESS(Status))
{
- PrintString("SM: Failed to update environment variables (Status %lx)\n", Status);
+ DPRINT1("SM: Failed to update environment variables (Status %lx)\n", Status);
return(Status);
}
#endif
- PrintString("SM: loading subsystems\n");
+ DPRINT("SM: loading subsystems\n");
/* Load the subsystems */
Status = SmLoadSubsystems();
if (!NT_SUCCESS(Status))
{
- PrintString("SM: Failed to load subsystems (Status %lx)\n", Status);
+ DPRINT1("SM: Failed to load subsystems (Status %lx)\n", Status);
return(Status);
}
- PrintString("SM: initializing csrss\n");
+
+ SignalInitEvent();
+
+
+ DPRINT("SM: initializing csrss\n");
/* Run csrss.exe */
RtlInitUnicodeStringFromLiteral(&UnicodeString,
* Start the logon process (winlogon.exe)
*/
- PrintString("SM: starting winlogon\n");
+ DPRINT("SM: starting winlogon\n");
/* initialize executable path */
wcscpy(UnicodeBuffer, L"\\??\\");
-/* $Id: smss.c,v 1.14 2002/10/25 22:08:20 chorns Exp $
+/* $Id: smss.c,v 1.15 2003/08/11 18:50:12 chorns Exp $
*
* smss.c - Session Manager
*
#include "smss.h"
+#define NDEBUG
+#include <debug.h>
+
void
DisplayString(LPCWSTR lpwString)
Status = InitSessionManager(Children);
if (!NT_SUCCESS(Status))
{
- PrintString("SM: Initialization failed!\n");
+ DPRINT1("SM: Initialization failed!\n");
goto ByeBye;
}
NULL); /* NULL for infinite */
if (!NT_SUCCESS(Status))
{
- PrintString("SM: NtWaitForMultipleObjects failed!\n");
+ DPRINT1("SM: NtWaitForMultipleObjects failed!\n");
}
else
{
- PrintString("SM: Process terminated!\n");
+ DPRINT1("SM: Process terminated!\n");
}
ByeBye: