[0.4.11][BLUE] Optimize ScrIoControl for speed (#5185)

Optimize IOCTL_CONSOLE_FILL_OUTPUT_ATTRIBUTE and IOCTL_CONSOLE_FILL_OUTPUT_CHARACTER for speed by using cache.
a part of CORE-18838
It is faster because it minimizes the amount of pointer dereferences within the for-loops.

fix picked from 0.4.15-dev-5881-g 3526ffc094
---------
also partially pick unrelated cleanup from:
0.4.14-dev-439-g 75f188c200 (only the change in blue.c)
---------
and take back with me some whitespace-tweaks to bring the file closer to todays releases/0.4.14
This commit is contained in:
Joachim Henze 2023-06-06 23:41:54 +02:00
parent 9facbf6b7f
commit 8783260051

View file

@ -1,11 +1,8 @@
/* /*
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
* FILE: services/dd/blue/blue.c * PURPOSE: Driver Management Functions.
* PURPOSE: Console (blue screen) device driver * PROGRAMMER: Eric Kohl
* PROGRAMMER: Eric Kohl
* UPDATE HISTORY:
* ??? Created
*/ */
/* INCLUDES ******************************************************************/ /* INCLUDES ******************************************************************/
@ -15,20 +12,11 @@
#define NDEBUG #define NDEBUG
#include <debug.h> #include <debug.h>
// ROS Internal. Please deprecate.
NTHALAPI
BOOLEAN
NTAPI
HalQueryDisplayOwnership(
VOID
);
/* NOTES ******************************************************************/ /* NOTES ******************************************************************/
/* /*
* [[character][attribute]][[character][attribute]].... * [[character][attribute]][[character][attribute]]....
*/ */
/* TYPEDEFS ***************************************************************/ /* TYPEDEFS ***************************************************************/
typedef struct _DEVICE_EXTENSION typedef struct _DEVICE_EXTENSION
@ -38,9 +26,9 @@ typedef struct _DEVICE_EXTENSION
INT CursorVisible; INT CursorVisible;
USHORT CharAttribute; USHORT CharAttribute;
ULONG Mode; ULONG Mode;
UCHAR ScanLines; /* Height of a text line */ UCHAR ScanLines; /* Height of a text line */
USHORT Rows; /* Number of rows */ USHORT Rows; /* Number of rows */
USHORT Columns; /* Number of columns */ USHORT Columns; /* Number of columns */
} DEVICE_EXTENSION, *PDEVICE_EXTENSION; } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
typedef struct _VGA_REGISTERS typedef struct _VGA_REGISTERS
@ -104,7 +92,7 @@ ScrSetRegisters(const VGA_REGISTERS *Registers)
/* Write sequencer registers */ /* Write sequencer registers */
for (i = 1; i < sizeof(Registers->Sequencer); i++) for (i = 1; i < sizeof(Registers->Sequencer); i++)
{ {
WRITE_PORT_UCHAR(SEQ, i); WRITE_PORT_UCHAR(SEQ, i);
WRITE_PORT_UCHAR(SEQDATA, Registers->Sequencer[i]); WRITE_PORT_UCHAR(SEQDATA, Registers->Sequencer[i]);
} }
@ -139,7 +127,7 @@ ScrSetRegisters(const VGA_REGISTERS *Registers)
WRITE_PORT_UCHAR(ATTRIB, Registers->Attribute[i]); WRITE_PORT_UCHAR(ATTRIB, Registers->Attribute[i]);
} }
/* Set the PEL mask. */ /* Set the PEL mask */
WRITE_PORT_UCHAR(PELMASK, 0xff); WRITE_PORT_UCHAR(PELMASK, 0xff);
} }
@ -152,7 +140,7 @@ ScrAcquireOwnership(PDEVICE_EXTENSION DeviceExtension)
ScrSetRegisters(&VidpMode3Regs); ScrSetRegisters(&VidpMode3Regs);
/* Disable screen and enable palette access. */ /* Disable screen and enable palette access */
READ_PORT_UCHAR(STATUS); READ_PORT_UCHAR(STATUS);
WRITE_PORT_UCHAR(ATTRIB, 0x00); WRITE_PORT_UCHAR(ATTRIB, 0x00);
@ -164,66 +152,65 @@ ScrAcquireOwnership(PDEVICE_EXTENSION DeviceExtension)
WRITE_PORT_UCHAR(PELDATA, DefaultPalette[Index * 3 + 2] >> 2); WRITE_PORT_UCHAR(PELDATA, DefaultPalette[Index * 3 + 2] >> 2);
} }
/* Enable screen and disable palette access. */ /* Enable screen and disable palette access */
READ_PORT_UCHAR(STATUS); READ_PORT_UCHAR(STATUS);
WRITE_PORT_UCHAR(ATTRIB, 0x20); WRITE_PORT_UCHAR(ATTRIB, 0x20);
/* get current output position */ /* get current output position */
WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORPOSLO); WRITE_PORT_UCHAR(CRTC_COMMAND, CRTC_CURSORPOSLO);
offset = READ_PORT_UCHAR (CRTC_DATA); offset = READ_PORT_UCHAR(CRTC_DATA);
WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORPOSHI); WRITE_PORT_UCHAR(CRTC_COMMAND, CRTC_CURSORPOSHI);
offset += (READ_PORT_UCHAR (CRTC_DATA) << 8); offset += (READ_PORT_UCHAR(CRTC_DATA) << 8);
/* switch blinking characters off */ /* switch blinking characters off */
READ_PORT_UCHAR (ATTRC_INPST1); READ_PORT_UCHAR(ATTRC_INPST1);
value = READ_PORT_UCHAR (ATTRC_WRITEREG); value = READ_PORT_UCHAR(ATTRC_WRITEREG);
WRITE_PORT_UCHAR (ATTRC_WRITEREG, 0x10); WRITE_PORT_UCHAR(ATTRC_WRITEREG, 0x10);
data = READ_PORT_UCHAR (ATTRC_READREG); data = READ_PORT_UCHAR(ATTRC_READREG);
data = data & ~0x08; data = data & ~0x08;
WRITE_PORT_UCHAR (ATTRC_WRITEREG, data); WRITE_PORT_UCHAR(ATTRC_WRITEREG, data);
WRITE_PORT_UCHAR (ATTRC_WRITEREG, value); WRITE_PORT_UCHAR(ATTRC_WRITEREG, value);
READ_PORT_UCHAR (ATTRC_INPST1); READ_PORT_UCHAR(ATTRC_INPST1);
/* read screen information from crt controller */ /* read screen information from crt controller */
WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_COLUMNS); WRITE_PORT_UCHAR(CRTC_COMMAND, CRTC_COLUMNS);
DeviceExtension->Columns = READ_PORT_UCHAR (CRTC_DATA) + 1; DeviceExtension->Columns = READ_PORT_UCHAR(CRTC_DATA) + 1;
WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_ROWS); WRITE_PORT_UCHAR(CRTC_COMMAND, CRTC_ROWS);
DeviceExtension->Rows = READ_PORT_UCHAR (CRTC_DATA); DeviceExtension->Rows = READ_PORT_UCHAR(CRTC_DATA);
WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_OVERFLOW); WRITE_PORT_UCHAR(CRTC_COMMAND, CRTC_OVERFLOW);
data = READ_PORT_UCHAR (CRTC_DATA); data = READ_PORT_UCHAR(CRTC_DATA);
DeviceExtension->Rows |= (((data & 0x02) << 7) | ((data & 0x40) << 3)); DeviceExtension->Rows |= (((data & 0x02) << 7) | ((data & 0x40) << 3));
DeviceExtension->Rows++; DeviceExtension->Rows++;
WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_SCANLINES); WRITE_PORT_UCHAR(CRTC_COMMAND, CRTC_SCANLINES);
DeviceExtension->ScanLines = (READ_PORT_UCHAR (CRTC_DATA) & 0x1F) + 1; DeviceExtension->ScanLines = (READ_PORT_UCHAR(CRTC_DATA) & 0x1F) + 1;
/* show blinking cursor */ /* show blinking cursor */
WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORSTART); WRITE_PORT_UCHAR(CRTC_COMMAND, CRTC_CURSORSTART);
WRITE_PORT_UCHAR (CRTC_DATA, (DeviceExtension->ScanLines - 1) & 0x1F); WRITE_PORT_UCHAR(CRTC_DATA, (DeviceExtension->ScanLines - 1) & 0x1F);
WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSOREND); WRITE_PORT_UCHAR(CRTC_COMMAND, CRTC_CURSOREND);
data = READ_PORT_UCHAR (CRTC_DATA) & 0xE0; data = READ_PORT_UCHAR(CRTC_DATA) & 0xE0;
WRITE_PORT_UCHAR (CRTC_DATA, WRITE_PORT_UCHAR(CRTC_DATA,
data | ((DeviceExtension->ScanLines - 1) & 0x1F)); data | ((DeviceExtension->ScanLines - 1) & 0x1F));
/* calculate number of text rows */ /* calculate number of text rows */
DeviceExtension->Rows = DeviceExtension->Rows = DeviceExtension->Rows / DeviceExtension->ScanLines;
DeviceExtension->Rows / DeviceExtension->ScanLines;
#ifdef BOCHS_30ROWS #ifdef BOCHS_30ROWS
DeviceExtension->Rows = 30; DeviceExtension->Rows = 30;
#endif #endif
DPRINT ("%d Columns %d Rows %d Scanlines\n", DPRINT("%d Columns %d Rows %d Scanlines\n",
DeviceExtension->Columns, DeviceExtension->Columns,
DeviceExtension->Rows, DeviceExtension->Rows,
DeviceExtension->ScanLines); DeviceExtension->ScanLines);
} }
NTSTATUS NTAPI NTSTATUS NTAPI
DriverEntry (PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath); DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath);
static DRIVER_DISPATCH ScrCreate; static DRIVER_DISPATCH ScrCreate;
static NTSTATUS NTAPI static NTSTATUS NTAPI
ScrCreate(PDEVICE_OBJECT DeviceObject, ScrCreate(PDEVICE_OBJECT DeviceObject,
PIRP Irp) PIRP Irp)
{ {
PDEVICE_EXTENSION DeviceExtension; PDEVICE_EXTENSION DeviceExtension;
PHYSICAL_ADDRESS BaseAddress; PHYSICAL_ADDRESS BaseAddress;
@ -242,7 +229,7 @@ ScrCreate(PDEVICE_OBJECT DeviceObject,
} }
else else
{ {
/* store dummy values here */ /* Store dummy values */
DeviceExtension->Columns = 1; DeviceExtension->Columns = 1;
DeviceExtension->Rows = 1; DeviceExtension->Rows = 1;
DeviceExtension->ScanLines = 1; DeviceExtension->ScanLines = 1;
@ -259,17 +246,17 @@ ScrCreate(PDEVICE_OBJECT DeviceObject,
Status = STATUS_SUCCESS; Status = STATUS_SUCCESS;
Irp->IoStatus.Status = Status; Irp->IoStatus.Status = Status;
IoCompleteRequest (Irp, IO_NO_INCREMENT); IoCompleteRequest(Irp, IO_NO_INCREMENT);
return (Status); return Status;
} }
static DRIVER_DISPATCH ScrWrite; static DRIVER_DISPATCH ScrWrite;
static NTSTATUS NTAPI static NTSTATUS NTAPI
ScrWrite(PDEVICE_OBJECT DeviceObject, ScrWrite(PDEVICE_OBJECT DeviceObject,
PIRP Irp) PIRP Irp)
{ {
PIO_STACK_LOCATION stk = IoGetCurrentIrpStackLocation (Irp); PIO_STACK_LOCATION stk = IoGetCurrentIrpStackLocation(Irp);
PDEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension; PDEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
NTSTATUS Status; NTSTATUS Status;
char *pch = Irp->UserBuffer; char *pch = Irp->UserBuffer;
@ -286,7 +273,7 @@ ScrWrite(PDEVICE_OBJECT DeviceObject,
Status = STATUS_SUCCESS; Status = STATUS_SUCCESS;
Irp->IoStatus.Status = Status; Irp->IoStatus.Status = Status;
IoCompleteRequest (Irp, IO_NO_INCREMENT); IoCompleteRequest(Irp, IO_NO_INCREMENT);
return Status; return Status;
} }
@ -296,22 +283,22 @@ ScrWrite(PDEVICE_OBJECT DeviceObject,
columns = DeviceExtension->Columns; columns = DeviceExtension->Columns;
_disable(); _disable();
WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORPOSHI); WRITE_PORT_UCHAR(CRTC_COMMAND, CRTC_CURSORPOSHI);
offset = READ_PORT_UCHAR (CRTC_DATA)<<8; offset = READ_PORT_UCHAR(CRTC_DATA)<<8;
WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORPOSLO); WRITE_PORT_UCHAR(CRTC_COMMAND, CRTC_CURSORPOSLO);
offset += READ_PORT_UCHAR (CRTC_DATA); offset += READ_PORT_UCHAR(CRTC_DATA);
_enable(); _enable();
cursory = offset / columns; cursory = offset / columns;
cursorx = offset % columns; cursorx = offset % columns;
if( processed == 0 ) if (!processed)
{ {
/* raw output mode */ /* raw output mode */
// FIXME: Does the buffer only contains chars? or chars + attributes? // FIXME: Does the buffer only contains chars? or chars + attributes?
// FIXME2: Fix buffer overflow. // FIXME2: Fix buffer overflow.
memcpy( &vidmem[(cursorx * 2) + (cursory * columns * 2)], pch, stk->Parameters.Write.Length ); memcpy( &vidmem[(cursorx * 2) + (cursory * columns * 2)], pch, stk->Parameters.Write.Length );
offset += (stk->Parameters.Write.Length / 2); offset += (stk->Parameters.Write.Length / 2);
} }
else { else {
for (i = 0; i < stk->Parameters.Write.Length; i++, pch++) for (i = 0; i < stk->Parameters.Write.Length; i++, pch++)
{ {
@ -319,16 +306,16 @@ ScrWrite(PDEVICE_OBJECT DeviceObject,
{ {
case '\b': case '\b':
if (cursorx > 0) if (cursorx > 0)
{ {
cursorx--; cursorx--;
} }
else if (cursory > 0) else if (cursory > 0)
{ {
cursorx = columns - 1; cursorx = columns - 1;
cursory--; cursory--;
} }
vidmem[(cursorx * 2) + (cursory * columns * 2)] = ' '; vidmem[(cursorx * 2) + (cursory * columns * 2)] = ' ';
vidmem[(cursorx * 2) + (cursory * columns * 2) + 1] = (char) DeviceExtension->CharAttribute; vidmem[(cursorx * 2) + (cursory * columns * 2) + 1] = (char)DeviceExtension->CharAttribute;
break; break;
case '\n': case '\n':
@ -343,27 +330,27 @@ ScrWrite(PDEVICE_OBJECT DeviceObject,
case '\t': case '\t':
offset = TAB_WIDTH - (cursorx % TAB_WIDTH); offset = TAB_WIDTH - (cursorx % TAB_WIDTH);
for (j = 0; j < offset; j++) for (j = 0; j < offset; j++)
{ {
vidmem[(cursorx * 2) + (cursory * columns * 2)] = ' '; vidmem[(cursorx * 2) + (cursory * columns * 2)] = ' ';
cursorx++; cursorx++;
if (cursorx >= columns) if (cursorx >= columns)
{ {
cursory++; cursory++;
cursorx = 0; cursorx = 0;
} }
} }
break; break;
default: default:
vidmem[(cursorx * 2) + (cursory * columns * 2)] = *pch; vidmem[(cursorx * 2) + (cursory * columns * 2)] = *pch;
vidmem[(cursorx * 2) + (cursory * columns * 2) + 1] = (char) DeviceExtension->CharAttribute; vidmem[(cursorx * 2) + (cursory * columns * 2) + 1] = (char)DeviceExtension->CharAttribute;
cursorx++; cursorx++;
if (cursorx >= columns) if (cursorx >= columns)
{ {
cursory++; cursory++;
cursorx = 0; cursorx = 0;
} }
break; break;
} }
@ -372,22 +359,22 @@ ScrWrite(PDEVICE_OBJECT DeviceObject,
{ {
unsigned short *LinePtr; unsigned short *LinePtr;
memcpy (vidmem, memcpy(vidmem,
&vidmem[columns * 2], &vidmem[columns * 2],
columns * (rows - 1) * 2); columns * (rows - 1) * 2);
LinePtr = (unsigned short *) &vidmem[columns * (rows - 1) * 2]; LinePtr = (unsigned short *) &vidmem[columns * (rows - 1) * 2];
for (j = 0; j < columns; j++) for (j = 0; j < columns; j++)
{ {
LinePtr[j] = DeviceExtension->CharAttribute << 8; LinePtr[j] = DeviceExtension->CharAttribute << 8;
} }
cursory = rows - 1; cursory = rows - 1;
for (j = 0; j < columns; j++) for (j = 0; j < columns; j++)
{ {
vidmem[(j * 2) + (cursory * columns * 2)] = ' '; vidmem[(j * 2) + (cursory * columns * 2)] = ' ';
vidmem[(j * 2) + (cursory * columns * 2) + 1] = (char)DeviceExtension->CharAttribute; vidmem[(j * 2) + (cursory * columns * 2) + 1] = (char)DeviceExtension->CharAttribute;
} }
} }
} }
@ -395,17 +382,17 @@ ScrWrite(PDEVICE_OBJECT DeviceObject,
offset = (cursory * columns) + cursorx; offset = (cursory * columns) + cursorx;
} }
_disable(); _disable();
WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORPOSLO); WRITE_PORT_UCHAR(CRTC_COMMAND, CRTC_CURSORPOSLO);
WRITE_PORT_UCHAR (CRTC_DATA, offset); WRITE_PORT_UCHAR(CRTC_DATA, offset);
WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORPOSHI); WRITE_PORT_UCHAR(CRTC_COMMAND, CRTC_CURSORPOSHI);
offset >>= 8; offset >>= 8;
WRITE_PORT_UCHAR (CRTC_DATA, offset); WRITE_PORT_UCHAR(CRTC_DATA, offset);
_enable(); _enable();
Status = STATUS_SUCCESS; Status = STATUS_SUCCESS;
Irp->IoStatus.Status = Status; Irp->IoStatus.Status = Status;
IoCompleteRequest (Irp, IO_NO_INCREMENT); IoCompleteRequest(Irp, IO_NO_INCREMENT);
return Status; return Status;
} }
@ -413,9 +400,9 @@ ScrWrite(PDEVICE_OBJECT DeviceObject,
static DRIVER_DISPATCH ScrIoControl; static DRIVER_DISPATCH ScrIoControl;
static NTSTATUS NTAPI static NTSTATUS NTAPI
ScrIoControl(PDEVICE_OBJECT DeviceObject, ScrIoControl(PDEVICE_OBJECT DeviceObject,
PIRP Irp) PIRP Irp)
{ {
PIO_STACK_LOCATION stk = IoGetCurrentIrpStackLocation (Irp); PIO_STACK_LOCATION stk = IoGetCurrentIrpStackLocation(Irp);
PDEVICE_EXTENSION DeviceExtension; PDEVICE_EXTENSION DeviceExtension;
NTSTATUS Status; NTSTATUS Status;
@ -433,10 +420,10 @@ ScrIoControl(PDEVICE_OBJECT DeviceObject,
{ {
/* read cursor position from crtc */ /* read cursor position from crtc */
_disable(); _disable();
WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORPOSLO); WRITE_PORT_UCHAR(CRTC_COMMAND, CRTC_CURSORPOSLO);
offset = READ_PORT_UCHAR (CRTC_DATA); offset = READ_PORT_UCHAR(CRTC_DATA);
WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORPOSHI); WRITE_PORT_UCHAR(CRTC_COMMAND, CRTC_CURSORPOSHI);
offset += (READ_PORT_UCHAR (CRTC_DATA) << 8); offset += (READ_PORT_UCHAR(CRTC_DATA) << 8);
_enable(); _enable();
} }
else else
@ -460,7 +447,7 @@ ScrIoControl(PDEVICE_OBJECT DeviceObject,
pcsbi->dwMaximumWindowSize.X = columns; pcsbi->dwMaximumWindowSize.X = columns;
pcsbi->dwMaximumWindowSize.Y = rows; pcsbi->dwMaximumWindowSize.Y = rows;
Irp->IoStatus.Information = sizeof (CONSOLE_SCREEN_BUFFER_INFO); Irp->IoStatus.Information = sizeof(CONSOLE_SCREEN_BUFFER_INFO);
Status = STATUS_SUCCESS; Status = STATUS_SUCCESS;
} }
break; break;
@ -485,10 +472,10 @@ ScrIoControl(PDEVICE_OBJECT DeviceObject,
if (!InbvCheckDisplayOwnership()) if (!InbvCheckDisplayOwnership())
{ {
_disable(); _disable();
WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORPOSLO); WRITE_PORT_UCHAR(CRTC_COMMAND, CRTC_CURSORPOSLO);
WRITE_PORT_UCHAR (CRTC_DATA, offset); WRITE_PORT_UCHAR(CRTC_DATA, offset);
WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORPOSHI); WRITE_PORT_UCHAR(CRTC_COMMAND, CRTC_CURSORPOSHI);
WRITE_PORT_UCHAR (CRTC_DATA, offset>>8); WRITE_PORT_UCHAR(CRTC_DATA, offset>>8);
_enable(); _enable();
} }
@ -504,7 +491,7 @@ ScrIoControl(PDEVICE_OBJECT DeviceObject,
pcci->dwSize = DeviceExtension->CursorSize; pcci->dwSize = DeviceExtension->CursorSize;
pcci->bVisible = DeviceExtension->CursorVisible; pcci->bVisible = DeviceExtension->CursorVisible;
Irp->IoStatus.Information = sizeof (CONSOLE_CURSOR_INFO); Irp->IoStatus.Information = sizeof(CONSOLE_CURSOR_INFO);
Status = STATUS_SUCCESS; Status = STATUS_SUCCESS;
} }
break; break;
@ -532,11 +519,11 @@ ScrIoControl(PDEVICE_OBJECT DeviceObject,
data |= (UCHAR)(height - size); data |= (UCHAR)(height - size);
_disable(); _disable();
WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORSTART); WRITE_PORT_UCHAR(CRTC_COMMAND, CRTC_CURSORSTART);
WRITE_PORT_UCHAR (CRTC_DATA, data); WRITE_PORT_UCHAR(CRTC_DATA, data);
WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSOREND); WRITE_PORT_UCHAR(CRTC_COMMAND, CRTC_CURSOREND);
value = READ_PORT_UCHAR (CRTC_DATA) & 0xE0; value = READ_PORT_UCHAR(CRTC_DATA) & 0xE0;
WRITE_PORT_UCHAR (CRTC_DATA, value | (height - 1)); WRITE_PORT_UCHAR(CRTC_DATA, value | (height - 1));
_enable(); _enable();
} }
@ -587,6 +574,8 @@ ScrIoControl(PDEVICE_OBJECT DeviceObject,
if (!InbvCheckDisplayOwnership()) if (!InbvCheckDisplayOwnership())
{ {
UCHAR attr = Buf->wAttribute;
vidmem = DeviceExtension->VideoMemory; vidmem = DeviceExtension->VideoMemory;
offset = (Buf->dwCoord.Y * DeviceExtension->Columns * 2) + offset = (Buf->dwCoord.Y * DeviceExtension->Columns * 2) +
(Buf->dwCoord.X * 2) + 1; (Buf->dwCoord.X * 2) + 1;
@ -597,7 +586,7 @@ ScrIoControl(PDEVICE_OBJECT DeviceObject,
for (dwCount = 0; dwCount < nMaxLength; dwCount++) for (dwCount = 0; dwCount < nMaxLength; dwCount++)
{ {
vidmem[offset + (dwCount * 2)] = (char) Buf->wAttribute; vidmem[offset + (dwCount * 2)] = attr;
} }
} }
@ -716,6 +705,8 @@ ScrIoControl(PDEVICE_OBJECT DeviceObject,
if (!InbvCheckDisplayOwnership()) if (!InbvCheckDisplayOwnership())
{ {
UCHAR ch = Buf->cCharacter;
vidmem = DeviceExtension->VideoMemory; vidmem = DeviceExtension->VideoMemory;
offset = (Buf->dwCoord.Y * DeviceExtension->Columns * 2) + offset = (Buf->dwCoord.Y * DeviceExtension->Columns * 2) +
(Buf->dwCoord.X * 2); (Buf->dwCoord.X * 2);
@ -726,7 +717,7 @@ ScrIoControl(PDEVICE_OBJECT DeviceObject,
for (dwCount = 0; dwCount < nMaxLength; dwCount++) for (dwCount = 0; dwCount < nMaxLength; dwCount++)
{ {
vidmem[offset + (dwCount * 2)] = (char) Buf->cCharacter; vidmem[offset + (dwCount * 2)] = ch;
} }
} }
@ -846,10 +837,10 @@ ScrIoControl(PDEVICE_OBJECT DeviceObject,
ConsoleDraw->CursorX; ConsoleDraw->CursorX;
_disable(); _disable();
WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORPOSLO); WRITE_PORT_UCHAR(CRTC_COMMAND, CRTC_CURSORPOSLO);
WRITE_PORT_UCHAR (CRTC_DATA, Offset); WRITE_PORT_UCHAR(CRTC_DATA, Offset);
WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORPOSHI); WRITE_PORT_UCHAR(CRTC_COMMAND, CRTC_CURSORPOSHI);
WRITE_PORT_UCHAR (CRTC_DATA, Offset >> 8); WRITE_PORT_UCHAR(CRTC_DATA, Offset >> 8);
_enable(); _enable();
} }
@ -878,7 +869,7 @@ ScrIoControl(PDEVICE_OBJECT DeviceObject,
} }
Irp->IoStatus.Status = Status; Irp->IoStatus.Status = Status;
IoCompleteRequest (Irp, IO_NO_INCREMENT); IoCompleteRequest(Irp, IO_NO_INCREMENT);
return Status; return Status;
} }
@ -886,7 +877,7 @@ ScrIoControl(PDEVICE_OBJECT DeviceObject,
static DRIVER_DISPATCH ScrDispatch; static DRIVER_DISPATCH ScrDispatch;
static NTSTATUS NTAPI static NTSTATUS NTAPI
ScrDispatch(PDEVICE_OBJECT DeviceObject, ScrDispatch(PDEVICE_OBJECT DeviceObject,
PIRP Irp) PIRP Irp)
{ {
PIO_STACK_LOCATION stk = IoGetCurrentIrpStackLocation(Irp); PIO_STACK_LOCATION stk = IoGetCurrentIrpStackLocation(Irp);
NTSTATUS Status; NTSTATUS Status;
@ -902,51 +893,48 @@ ScrDispatch(PDEVICE_OBJECT DeviceObject,
break; break;
} }
Irp->IoStatus.Status = Status; Irp->IoStatus.Status = Status;
IoCompleteRequest (Irp, IO_NO_INCREMENT); IoCompleteRequest(Irp, IO_NO_INCREMENT);
return Status; return Status;
} }
/* /*
* Module entry point * Module entry point
*/ */
NTSTATUS NTAPI NTSTATUS NTAPI
DriverEntry (PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{ {
PDEVICE_OBJECT DeviceObject; PDEVICE_OBJECT DeviceObject;
NTSTATUS Status; NTSTATUS Status;
UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Device\\BlueScreen"); UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Device\\BlueScreen");
UNICODE_STRING SymlinkName = RTL_CONSTANT_STRING(L"\\??\\BlueScreen"); UNICODE_STRING SymlinkName = RTL_CONSTANT_STRING(L"\\??\\BlueScreen");
DPRINT ("Screen Driver 0.0.6\n"); DPRINT("Screen Driver 0.0.6\n");
DriverObject->MajorFunction[IRP_MJ_CREATE] = ScrCreate; DriverObject->MajorFunction[IRP_MJ_CREATE] = ScrCreate;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = ScrDispatch; DriverObject->MajorFunction[IRP_MJ_CLOSE] = ScrDispatch;
DriverObject->MajorFunction[IRP_MJ_READ] = ScrDispatch; DriverObject->MajorFunction[IRP_MJ_READ] = ScrDispatch;
DriverObject->MajorFunction[IRP_MJ_WRITE] = ScrWrite; DriverObject->MajorFunction[IRP_MJ_WRITE] = ScrWrite;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL ] = ScrIoControl; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ScrIoControl;
Status = IoCreateDevice (DriverObject,
sizeof(DEVICE_EXTENSION),
&DeviceName,
FILE_DEVICE_SCREEN,
FILE_DEVICE_SECURE_OPEN,
TRUE,
&DeviceObject);
Status = IoCreateDevice(DriverObject,
sizeof(DEVICE_EXTENSION),
&DeviceName,
FILE_DEVICE_SCREEN,
FILE_DEVICE_SECURE_OPEN,
TRUE,
&DeviceObject);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
return Status; return Status;
} }
Status = IoCreateSymbolicLink (&SymlinkName, &DeviceName); Status = IoCreateSymbolicLink(&SymlinkName, &DeviceName);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
else else
IoDeleteDevice (DeviceObject); IoDeleteDevice(DeviceObject);
return Status; return Status;
} }