-/* $Id: blue.c,v 1.28 2000/09/29 15:03:21 jean Exp $
+/* $Id$
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
/* INCLUDES ******************************************************************/
-#include <ddk/ntddk.h>
-#include <ddk/ntddblue.h>
-#include <string.h>
-#include <defines.h>
+#include <ntddk.h>
+
+/* FIXME: W32API NEEDS TO BE FIXED */
+#ifdef _MSC_VER
+/*
+ * Wincon.h can't be included due to missing user-mode types,
+ * so we'll define them here
+ */
+typedef ULONG DWORD, *LPDWORD;
+typedef USHORT UINT, *LPWORD;
+typedef USHORT WORD;
+typedef UCHAR BYTE;
+typedef INT BOOL;
+typedef PVOID HWND;
+typedef PVOID LPVOID;
+#define WINAPI NTAPI
+#define APIENTRY WINAPI
+#define WINBASEAPI
+typedef struct _SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES;
+#endif
+
+#include <wincon.h>
+#include <blue/ntddblue.h>
+#include <ndk/halfuncs.h>
#define NDEBUG
#include <debug.h>
-
/* DEFINITIONS ***************************************************************/
#define VIDMEM_BASE 0xb8000
-#define VIDMEM_SIZE 0x2000
#define CRTC_COMMAND ((PUCHAR)0x3d4)
#define CRTC_DATA ((PUCHAR)0x3d5)
typedef struct _DEVICE_EXTENSION
{
- PBYTE VideoMemory; /* Pointer to video memory */
- DWORD CursorSize;
- BOOL CursorVisible;
- WORD CharAttribute;
- DWORD Mode;
- BYTE ScanLines; /* Height of a text line */
- WORD Rows; /* Number of rows */
- WORD Columns; /* Number of columns */
+ PUCHAR VideoMemory; /* Pointer to video memory */
+ ULONG CursorSize;
+ INT CursorVisible;
+ USHORT CharAttribute;
+ ULONG Mode;
+ UCHAR ScanLines; /* Height of a text line */
+ USHORT Rows; /* Number of rows */
+ USHORT Columns; /* Number of columns */
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
/* FUNCTIONS **************************************************************/
-NTSTATUS
-STDCALL ScrCreate (PDEVICE_OBJECT DeviceObject, PIRP Irp)
+NTSTATUS STDCALL
+DriverEntry (PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath);
+
+static NTSTATUS STDCALL
+ScrCreate(PDEVICE_OBJECT DeviceObject,
+ PIRP Irp)
{
PDEVICE_EXTENSION DeviceExtension;
PHYSICAL_ADDRESS BaseAddress;
NTSTATUS Status;
unsigned int offset;
- BYTE data, value;
+ UCHAR data, value;
DeviceExtension = DeviceObject->DeviceExtension;
- /* get pointer to video memory */
- BaseAddress.QuadPart = VIDMEM_BASE;
- DeviceExtension->VideoMemory =
- (PBYTE)MmMapIoSpace (BaseAddress, VIDMEM_SIZE, FALSE);
-
/* disable interrupts */
- __asm__("cli\n\t");
+ _disable();
/* get current output position */
WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORPOSLO);
DeviceExtension->ScanLines = (READ_PORT_UCHAR (CRTC_DATA) & 0x1F) + 1;
/* enable interrupts */
- __asm__("sti\n\t");
+ _enable();
/* calculate number of text rows */
DeviceExtension->Rows =
DeviceExtension->Rows,
DeviceExtension->ScanLines);
+ /* get pointer to video memory */
+ BaseAddress.QuadPart = VIDMEM_BASE;
+ DeviceExtension->VideoMemory =
+ (PUCHAR)MmMapIoSpace (BaseAddress, DeviceExtension->Rows * DeviceExtension->Columns * 2, MmNonCached);
+
DeviceExtension->CursorSize = 5; /* FIXME: value correct?? */
DeviceExtension->CursorVisible = TRUE;
ENABLE_WRAP_AT_EOL_OUTPUT;
/* show blinking cursor */
- __asm__("cli\n\t");
+ _disable();
WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORSTART);
WRITE_PORT_UCHAR (CRTC_DATA, (DeviceExtension->ScanLines - 1) & 0x1F);
WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSOREND);
data = READ_PORT_UCHAR (CRTC_DATA) & 0xE0;
WRITE_PORT_UCHAR (CRTC_DATA,
data | ((DeviceExtension->ScanLines - 1) & 0x1F));
- __asm__("sti\n\t");
+ _enable();
Status = STATUS_SUCCESS;
}
-NTSTATUS
-STDCALL ScrWrite (PDEVICE_OBJECT DeviceObject, PIRP Irp)
+static NTSTATUS STDCALL
+ScrWrite(PDEVICE_OBJECT DeviceObject,
+ PIRP Irp)
{
PIO_STACK_LOCATION stk = IoGetCurrentIrpStackLocation (Irp);
PDEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
NTSTATUS Status;
char *pch = Irp->UserBuffer;
- char *vidmem;
- int i, j, offset;
+ PUCHAR vidmem;
+ unsigned int i;
+ int j, offset;
int cursorx, cursory;
int rows, columns;
int processed = DeviceExtension->Mode & ENABLE_PROCESSED_OUTPUT;
+ if (HalQueryDisplayOwnership())
+ {
+ /* Display is in graphics mode, we're not allowed to touch it */
+ Status = STATUS_SUCCESS;
+
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest (Irp, IO_NO_INCREMENT);
+
+ return Status;
+ }
+
vidmem = DeviceExtension->VideoMemory;
rows = DeviceExtension->Rows;
columns = DeviceExtension->Columns;
+ _disable();
WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORPOSHI);
offset = READ_PORT_UCHAR (CRTC_DATA)<<8;
WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORPOSLO);
offset += READ_PORT_UCHAR (CRTC_DATA);
+ _enable();
cursory = offset / columns;
cursorx = offset % columns;
vidmem[(cursorx * 2) + (cursory * columns * 2)] = ' ';
vidmem[(cursorx * 2) + (cursory * columns * 2) + 1] = (char) DeviceExtension->CharAttribute;
break;
-
+
case '\n':
cursory++;
cursorx = 0;
break;
-
+
case '\r':
+ cursorx = 0;
break;
-
+
case '\t':
offset = TAB_WIDTH - (cursorx % TAB_WIDTH);
for (j = 0; j < offset; j++)
{
vidmem[(cursorx * 2) + (cursory * columns * 2)] = ' ';
cursorx++;
-
+
if (cursorx >= columns)
{
cursory++;
}
}
break;
-
+
default:
vidmem[(cursorx * 2) + (cursory * columns * 2)] = *pch;
vidmem[(cursorx * 2) + (cursory * columns * 2) + 1] = (char) DeviceExtension->CharAttribute;
}
}
}
-
+
/* Set the cursor position */
offset = (cursory * columns) + cursorx;
}
+ _disable();
WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORPOSLO);
WRITE_PORT_UCHAR (CRTC_DATA, offset);
WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORPOSHI);
offset >>= 8;
WRITE_PORT_UCHAR (CRTC_DATA, offset);
+ _enable();
Status = STATUS_SUCCESS;
}
-NTSTATUS
-STDCALL ScrIoControl (PDEVICE_OBJECT DeviceObject, PIRP Irp)
+static NTSTATUS STDCALL
+ScrIoControl(PDEVICE_OBJECT DeviceObject,
+ PIRP Irp)
{
- PIO_STACK_LOCATION stk = IoGetCurrentIrpStackLocation (Irp);
- PDEVICE_EXTENSION DeviceExtension;
- NTSTATUS Status;
+ PIO_STACK_LOCATION stk = IoGetCurrentIrpStackLocation (Irp);
+ PDEVICE_EXTENSION DeviceExtension;
+ NTSTATUS Status;
- DeviceExtension = DeviceObject->DeviceExtension;
-
- switch (stk->Parameters.DeviceIoControl.IoControlCode)
+ DeviceExtension = DeviceObject->DeviceExtension;
+ switch (stk->Parameters.DeviceIoControl.IoControlCode)
{
- case IOCTL_CONSOLE_GET_SCREEN_BUFFER_INFO:
- {
- PCONSOLE_SCREEN_BUFFER_INFO pcsbi = (PCONSOLE_SCREEN_BUFFER_INFO)Irp->AssociatedIrp.SystemBuffer;
- int rows = DeviceExtension->Rows;
- int columns = DeviceExtension->Columns;
- unsigned int offset;
-
- /* read cursor position from crtc */
- __asm__("cli\n\t");
- WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORPOSLO);
- offset = READ_PORT_UCHAR (CRTC_DATA);
- WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORPOSHI);
- offset += (READ_PORT_UCHAR (CRTC_DATA) << 8);
- __asm__("sti\n\t");
-
- pcsbi->dwSize.X = columns;
- pcsbi->dwSize.Y = rows;
-
- pcsbi->dwCursorPosition.X = (SHORT)(offset % columns);
- pcsbi->dwCursorPosition.Y = (SHORT)(offset / columns);
-
- pcsbi->wAttributes = DeviceExtension->CharAttribute;
-
- pcsbi->srWindow.Left = 0;
- pcsbi->srWindow.Right = columns - 1;
- pcsbi->srWindow.Top = 0;
- pcsbi->srWindow.Bottom = rows - 1;
-
- pcsbi->dwMaximumWindowSize.X = columns;
- pcsbi->dwMaximumWindowSize.Y = rows;
-
- Irp->IoStatus.Information = sizeof (CONSOLE_SCREEN_BUFFER_INFO);
- Status = STATUS_SUCCESS;
- }
- break;
-
- case IOCTL_CONSOLE_SET_SCREEN_BUFFER_INFO:
- {
- PCONSOLE_SCREEN_BUFFER_INFO pcsbi = (PCONSOLE_SCREEN_BUFFER_INFO)Irp->AssociatedIrp.SystemBuffer;
- unsigned int offset;
-
- DeviceExtension->CharAttribute = pcsbi->wAttributes;
- offset = (pcsbi->dwCursorPosition.Y * DeviceExtension->Columns) +
- pcsbi->dwCursorPosition.X;
-
- __asm__("cli\n\t");
- WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORPOSLO);
- WRITE_PORT_UCHAR (CRTC_DATA, offset);
- WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORPOSHI);
- WRITE_PORT_UCHAR (CRTC_DATA, offset>>8);
- __asm__("sti\n\t");
-
- Irp->IoStatus.Information = 0;
- Status = STATUS_SUCCESS;
- }
- break;
-
- case IOCTL_CONSOLE_GET_CURSOR_INFO:
+ case IOCTL_CONSOLE_GET_SCREEN_BUFFER_INFO:
+ {
+ PCONSOLE_SCREEN_BUFFER_INFO pcsbi = (PCONSOLE_SCREEN_BUFFER_INFO)Irp->AssociatedIrp.SystemBuffer;
+ int rows = DeviceExtension->Rows;
+ int columns = DeviceExtension->Columns;
+ unsigned int offset;
+
+ /* read cursor position from crtc */
+ _disable();
+ WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORPOSLO);
+ offset = READ_PORT_UCHAR (CRTC_DATA);
+ WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORPOSHI);
+ offset += (READ_PORT_UCHAR (CRTC_DATA) << 8);
+ _enable();
+
+ pcsbi->dwSize.X = columns;
+ pcsbi->dwSize.Y = rows;
+
+ pcsbi->dwCursorPosition.X = (SHORT)(offset % columns);
+ pcsbi->dwCursorPosition.Y = (SHORT)(offset / columns);
+
+ pcsbi->wAttributes = DeviceExtension->CharAttribute;
+
+ pcsbi->srWindow.Left = 0;
+ pcsbi->srWindow.Right = columns - 1;
+ pcsbi->srWindow.Top = 0;
+ pcsbi->srWindow.Bottom = rows - 1;
+
+ pcsbi->dwMaximumWindowSize.X = columns;
+ pcsbi->dwMaximumWindowSize.Y = rows;
+
+ Irp->IoStatus.Information = sizeof (CONSOLE_SCREEN_BUFFER_INFO);
+ Status = STATUS_SUCCESS;
+ }
+ break;
+
+ case IOCTL_CONSOLE_SET_SCREEN_BUFFER_INFO:
+ {
+ PCONSOLE_SCREEN_BUFFER_INFO pcsbi = (PCONSOLE_SCREEN_BUFFER_INFO)Irp->AssociatedIrp.SystemBuffer;
+ unsigned int offset;
+
+ DeviceExtension->CharAttribute = pcsbi->wAttributes;
+ offset = (pcsbi->dwCursorPosition.Y * DeviceExtension->Columns) +
+ pcsbi->dwCursorPosition.X;
+
+ _disable();
+ WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORPOSLO);
+ WRITE_PORT_UCHAR (CRTC_DATA, offset);
+ WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORPOSHI);
+ WRITE_PORT_UCHAR (CRTC_DATA, offset>>8);
+ _enable();
+
+ Irp->IoStatus.Information = 0;
+ Status = STATUS_SUCCESS;
+ }
+ break;
+
+ case IOCTL_CONSOLE_GET_CURSOR_INFO:
+ {
+ PCONSOLE_CURSOR_INFO pcci = (PCONSOLE_CURSOR_INFO)Irp->AssociatedIrp.SystemBuffer;
+
+ pcci->dwSize = DeviceExtension->CursorSize;
+ pcci->bVisible = DeviceExtension->CursorVisible;
+
+ Irp->IoStatus.Information = sizeof (CONSOLE_CURSOR_INFO);
+ Status = STATUS_SUCCESS;
+ }
+ break;
+
+ case IOCTL_CONSOLE_SET_CURSOR_INFO:
+ {
+ PCONSOLE_CURSOR_INFO pcci = (PCONSOLE_CURSOR_INFO)Irp->AssociatedIrp.SystemBuffer;
+ UCHAR data, value;
+ ULONG size, height;
+
+ DeviceExtension->CursorSize = pcci->dwSize;
+ DeviceExtension->CursorVisible = pcci->bVisible;
+ height = DeviceExtension->ScanLines;
+ data = (pcci->bVisible) ? 0x00 : 0x20;
+
+ size = (pcci->dwSize * height) / 100;
+ if (size < 1)
{
- PCONSOLE_CURSOR_INFO pcci = (PCONSOLE_CURSOR_INFO)Irp->AssociatedIrp.SystemBuffer;
-
- pcci->dwSize = DeviceExtension->CursorSize;
- pcci->bVisible = DeviceExtension->CursorVisible;
-
- Irp->IoStatus.Information = sizeof (CONSOLE_CURSOR_INFO);
- Status = STATUS_SUCCESS;
+ size = 1;
}
- break;
- case IOCTL_CONSOLE_SET_CURSOR_INFO:
- {
- PCONSOLE_CURSOR_INFO pcci = (PCONSOLE_CURSOR_INFO)Irp->AssociatedIrp.SystemBuffer;
- BYTE data, value;
- DWORD size, height;
+ data |= (UCHAR)(height - size);
- DeviceExtension->CursorSize = pcci->dwSize;
- DeviceExtension->CursorVisible = pcci->bVisible;
- height = DeviceExtension->ScanLines;
- data = (pcci->bVisible) ? 0x40 : 0x20;
+ _disable();
+ WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORSTART);
+ WRITE_PORT_UCHAR (CRTC_DATA, data);
+ WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSOREND);
+ value = READ_PORT_UCHAR (CRTC_DATA) & 0xE0;
+ WRITE_PORT_UCHAR (CRTC_DATA, value | (height - 1));
- size = (pcci->dwSize * height) / 100;
- if (size < 1)
- size = 1;
+ _enable();
- data |= (BYTE)(height - size);
+ Irp->IoStatus.Information = 0;
+ Status = STATUS_SUCCESS;
+ }
+ break;
- __asm__("cli\n\t");
- WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORSTART);
- WRITE_PORT_UCHAR (CRTC_DATA, data);
- WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSOREND);
- value = READ_PORT_UCHAR (CRTC_DATA) & 0xE0;
- WRITE_PORT_UCHAR (CRTC_DATA, value | (height - 1));
+ case IOCTL_CONSOLE_GET_MODE:
+ {
+ PCONSOLE_MODE pcm = (PCONSOLE_MODE)Irp->AssociatedIrp.SystemBuffer;
- __asm__("sti\n\t");
+ pcm->dwMode = DeviceExtension->Mode;
- Irp->IoStatus.Information = 0;
- Status = STATUS_SUCCESS;
- }
- break;
-
- case IOCTL_CONSOLE_GET_MODE:
- {
- PCONSOLE_MODE pcm = (PCONSOLE_MODE)Irp->AssociatedIrp.SystemBuffer;
+ Irp->IoStatus.Information = sizeof(CONSOLE_MODE);
+ Status = STATUS_SUCCESS;
+ }
+ break;
- pcm->dwMode = DeviceExtension->Mode;
+ case IOCTL_CONSOLE_SET_MODE:
+ {
+ PCONSOLE_MODE pcm = (PCONSOLE_MODE)Irp->AssociatedIrp.SystemBuffer;
- Irp->IoStatus.Information = sizeof(CONSOLE_MODE);
- Status = STATUS_SUCCESS;
- }
- break;
+ DeviceExtension->Mode = pcm->dwMode;
- case IOCTL_CONSOLE_SET_MODE:
- {
- PCONSOLE_MODE pcm = (PCONSOLE_MODE)Irp->AssociatedIrp.SystemBuffer;
+ Irp->IoStatus.Information = 0;
+ Status = STATUS_SUCCESS;
+ }
+ break;
- DeviceExtension->Mode = pcm->dwMode;
+ case IOCTL_CONSOLE_FILL_OUTPUT_ATTRIBUTE:
+ {
+ POUTPUT_ATTRIBUTE Buf = (POUTPUT_ATTRIBUTE)Irp->AssociatedIrp.SystemBuffer;
+ PUCHAR vidmem;
+ int offset;
+ ULONG dwCount;
- Irp->IoStatus.Information = 0;
- Status = STATUS_SUCCESS;
- }
- break;
+ vidmem = DeviceExtension->VideoMemory;
+ offset = (Buf->dwCoord.Y * DeviceExtension->Columns * 2) +
+ (Buf->dwCoord.X * 2) + 1;
- case IOCTL_CONSOLE_FILL_OUTPUT_ATTRIBUTE:
+ for (dwCount = 0; dwCount < Buf->nLength; dwCount++)
{
- POUTPUT_ATTRIBUTE Buf = (POUTPUT_ATTRIBUTE)Irp->AssociatedIrp.SystemBuffer;
- char *vidmem;
- int offset;
- DWORD dwCount;
-
- vidmem = DeviceExtension->VideoMemory;
- offset = (Buf->dwCoord.Y * DeviceExtension->Columns * 2) +
- (Buf->dwCoord.X * 2) + 1;
-
- for (dwCount = 0; dwCount < Buf->nLength; dwCount++)
- {
- vidmem[offset + (dwCount * 2)] = (char) Buf->wAttribute;
- }
-
- Buf->dwTransfered = Buf->nLength;
-
- Irp->IoStatus.Information = 0;
- Status = STATUS_SUCCESS;
+ vidmem[offset + (dwCount * 2)] = (char) Buf->wAttribute;
}
- break;
- case IOCTL_CONSOLE_READ_OUTPUT_ATTRIBUTE:
- {
- POUTPUT_ATTRIBUTE Buf = (POUTPUT_ATTRIBUTE)Irp->AssociatedIrp.SystemBuffer;
- PWORD pAttr = (PWORD)MmGetSystemAddressForMdl(Irp->MdlAddress);
- char *vidmem;
- int offset;
- DWORD dwCount;
+ Buf->dwTransfered = Buf->nLength;
- vidmem = DeviceExtension->VideoMemory;
- offset = (Buf->dwCoord.Y * DeviceExtension->Columns * 2) +
- (Buf->dwCoord.X * 2) + 1;
+ Irp->IoStatus.Information = 0;
+ Status = STATUS_SUCCESS;
+ }
+ break;
- for (dwCount = 0; dwCount < stk->Parameters.Write.Length; dwCount++, pAttr++)
- {
- (char) *pAttr = vidmem[offset + (dwCount * 2)];
- }
+ case IOCTL_CONSOLE_READ_OUTPUT_ATTRIBUTE:
+ {
+ POUTPUT_ATTRIBUTE Buf = (POUTPUT_ATTRIBUTE)Irp->AssociatedIrp.SystemBuffer;
+ PUSHORT pAttr = (PUSHORT)MmGetSystemAddressForMdl(Irp->MdlAddress);
+ PUCHAR vidmem;
+ int offset;
+ ULONG dwCount;
- Buf->dwTransfered = dwCount;
+ vidmem = DeviceExtension->VideoMemory;
+ offset = (Buf->dwCoord.Y * DeviceExtension->Columns * 2) +
+ (Buf->dwCoord.X * 2) + 1;
- Irp->IoStatus.Information = sizeof(OUTPUT_ATTRIBUTE);
- Status = STATUS_SUCCESS;
+ for (dwCount = 0; dwCount < stk->Parameters.DeviceIoControl.OutputBufferLength; dwCount++, pAttr++)
+ {
+ *((char *) pAttr) = vidmem[offset + (dwCount * 2)];
}
- break;
- case IOCTL_CONSOLE_WRITE_OUTPUT_ATTRIBUTE:
- {
- POUTPUT_ATTRIBUTE Buf = (POUTPUT_ATTRIBUTE)Irp->AssociatedIrp.SystemBuffer;
- PWORD pAttr = (PWORD)MmGetSystemAddressForMdl(Irp->MdlAddress);
- char *vidmem;
- int offset;
- DWORD dwCount;
+ Buf->dwTransfered = dwCount;
- vidmem = DeviceExtension->VideoMemory;
- offset = (Buf->dwCoord.Y * DeviceExtension->Columns * 2) +
- (Buf->dwCoord.X * 2) + 1;
+ Irp->IoStatus.Information = sizeof(OUTPUT_ATTRIBUTE);
+ Status = STATUS_SUCCESS;
+ }
+ break;
- for (dwCount = 0; dwCount < stk->Parameters.Write.Length; dwCount++, pAttr++)
- {
- vidmem[offset + (dwCount * 2)] = (char) *pAttr;
- }
+ case IOCTL_CONSOLE_WRITE_OUTPUT_ATTRIBUTE:
+ {
+ COORD *pCoord = (COORD *)MmGetSystemAddressForMdl(Irp->MdlAddress);
+ CHAR *pAttr = (CHAR *)(pCoord + 1);
+ PUCHAR vidmem;
+ int offset;
+ ULONG dwCount;
- Buf->dwTransfered = dwCount;
+ vidmem = DeviceExtension->VideoMemory;
+ offset = (pCoord->Y * DeviceExtension->Columns * 2) +
+ (pCoord->X * 2) + 1;
- Irp->IoStatus.Information = sizeof(OUTPUT_ATTRIBUTE);
- Status = STATUS_SUCCESS;
+ for (dwCount = 0; dwCount < (stk->Parameters.DeviceIoControl.OutputBufferLength - sizeof( COORD )); dwCount++, pAttr++)
+ {
+ vidmem[offset + (dwCount * 2)] = *pAttr;
}
- break;
-
- case IOCTL_CONSOLE_SET_TEXT_ATTRIBUTE:
- DeviceExtension->CharAttribute = (WORD)*(PWORD)Irp->AssociatedIrp.SystemBuffer;
- Irp->IoStatus.Information = 0;
- Status = STATUS_SUCCESS;
- break;
-
-
- case IOCTL_CONSOLE_FILL_OUTPUT_CHARACTER:
+ Irp->IoStatus.Information = 0;
+ Status = STATUS_SUCCESS;
+ }
+ break;
+
+ case IOCTL_CONSOLE_SET_TEXT_ATTRIBUTE:
+ DeviceExtension->CharAttribute = (USHORT)*(PUSHORT)Irp->AssociatedIrp.SystemBuffer;
+ Irp->IoStatus.Information = 0;
+ Status = STATUS_SUCCESS;
+ break;
+
+ case IOCTL_CONSOLE_FILL_OUTPUT_CHARACTER:
+ {
+ POUTPUT_CHARACTER Buf = (POUTPUT_CHARACTER)Irp->AssociatedIrp.SystemBuffer;
+ PUCHAR vidmem;
+ int offset;
+ ULONG dwCount;
+
+ vidmem = DeviceExtension->VideoMemory;
+ offset = (Buf->dwCoord.Y * DeviceExtension->Columns * 2) +
+ (Buf->dwCoord.X * 2);
+
+ CHECKPOINT
+
+ for (dwCount = 0; dwCount < Buf->nLength; dwCount++)
{
- POUTPUT_CHARACTER Buf = (POUTPUT_CHARACTER)Irp->AssociatedIrp.SystemBuffer;
- char *vidmem;
- int offset;
- DWORD dwCount;
+ vidmem[offset + (dwCount * 2)] = (char) Buf->cCharacter;
+ }
- vidmem = DeviceExtension->VideoMemory;
- offset = (Buf->dwCoord.Y * DeviceExtension->Columns * 2) +
- (Buf->dwCoord.X * 2);
+ Buf->dwTransfered = Buf->nLength;
- CHECKPOINT
+ Irp->IoStatus.Information = 0;
+ Status = STATUS_SUCCESS;
+ }
+ break;
- for (dwCount = 0; dwCount < Buf->nLength; dwCount++)
- {
- vidmem[offset + (dwCount * 2)] = (char) Buf->cCharacter;
- }
+ case IOCTL_CONSOLE_READ_OUTPUT_CHARACTER:
+ {
+ POUTPUT_CHARACTER Buf = (POUTPUT_CHARACTER)Irp->AssociatedIrp.SystemBuffer;
+ LPSTR pChar = (LPSTR)MmGetSystemAddressForMdl(Irp->MdlAddress);
+ PUCHAR vidmem;
+ int offset;
+ ULONG dwCount;
- Buf->dwTransfered = Buf->nLength;
+ vidmem = DeviceExtension->VideoMemory;
+ offset = (Buf->dwCoord.Y * DeviceExtension->Columns * 2) +
+ (Buf->dwCoord.X * 2);
- Irp->IoStatus.Information = 0;
- Status = STATUS_SUCCESS;
+ for (dwCount = 0; dwCount < stk->Parameters.DeviceIoControl.OutputBufferLength; dwCount++, pChar++)
+ {
+ *pChar = vidmem[offset + (dwCount * 2)];
}
- break;
- case IOCTL_CONSOLE_READ_OUTPUT_CHARACTER:
- {
- POUTPUT_CHARACTER Buf = (POUTPUT_CHARACTER)Irp->AssociatedIrp.SystemBuffer;
- LPSTR pChar = (LPSTR)MmGetSystemAddressForMdl(Irp->MdlAddress);
- char *vidmem;
- int offset;
- DWORD dwCount;
+ Buf->dwTransfered = dwCount;
- vidmem = DeviceExtension->VideoMemory;
- offset = (Buf->dwCoord.Y * DeviceExtension->Columns * 2) +
- (Buf->dwCoord.X * 2);
+ Irp->IoStatus.Information = sizeof(OUTPUT_ATTRIBUTE);
+ Status = STATUS_SUCCESS;
+ }
+ break;
- for (dwCount = 0; dwCount < stk->Parameters.Write.Length; dwCount++, pChar++)
- {
- *pChar = vidmem[offset + (dwCount * 2)];
- }
+ case IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER:
+ {
+ COORD *pCoord;
+ LPSTR pChar;
+ PUCHAR vidmem;
+ int offset;
+ ULONG dwCount;
- Buf->dwTransfered = dwCount;
+ pCoord = (COORD *)MmGetSystemAddressForMdl(Irp->MdlAddress);
+ pChar = (CHAR *)(pCoord + 1);
+ vidmem = DeviceExtension->VideoMemory;
+ offset = (pCoord->Y * DeviceExtension->Columns * 2) +
+ (pCoord->X * 2);
- Irp->IoStatus.Information = sizeof(OUTPUT_ATTRIBUTE);
- Status = STATUS_SUCCESS;
+ for (dwCount = 0; dwCount < (stk->Parameters.DeviceIoControl.OutputBufferLength - sizeof( COORD )); dwCount++, pChar++)
+ {
+ vidmem[offset + (dwCount * 2)] = *pChar;
}
- break;
- case IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER:
+ Irp->IoStatus.Information = 0;
+ Status = STATUS_SUCCESS;
+ }
+ break;
+
+ case IOCTL_CONSOLE_DRAW:
+ {
+ PCONSOLE_DRAW ConsoleDraw;
+ PUCHAR Src, Dest;
+ UINT SrcDelta, DestDelta, i, Offset;
+
+ ConsoleDraw = (PCONSOLE_DRAW) MmGetSystemAddressForMdl(Irp->MdlAddress);
+ Src = (PUCHAR) (ConsoleDraw + 1);
+ SrcDelta = ConsoleDraw->SizeX * 2;
+ Dest = DeviceExtension->VideoMemory +
+ (ConsoleDraw->Y * DeviceExtension->Columns + ConsoleDraw->X) * 2;
+ DestDelta = DeviceExtension->Columns * 2;
+
+ for (i = 0; i < ConsoleDraw->SizeY; i++)
{
- POUTPUT_CHARACTER Buf = (POUTPUT_CHARACTER)Irp->AssociatedIrp.SystemBuffer;
- LPSTR pChar = (LPSTR)MmGetSystemAddressForMdl(Irp->MdlAddress);
- char *vidmem;
- int offset;
- DWORD dwCount;
-
- vidmem = DeviceExtension->VideoMemory;
- offset = (Buf->dwCoord.Y * DeviceExtension->Columns * 2) +
- (Buf->dwCoord.X * 2) + 1;
-
- for (dwCount = 0; dwCount < stk->Parameters.Write.Length; dwCount++, pChar++)
- {
- vidmem[offset + (dwCount * 2)] = (char) *pChar;
- }
+ RtlCopyMemory(Dest, Src, SrcDelta);
+ Src += SrcDelta;
+ Dest += DestDelta;
+ }
- Buf->dwTransfered = dwCount;
+ Offset = (ConsoleDraw->CursorY * DeviceExtension->Columns) +
+ ConsoleDraw->CursorX;
- Irp->IoStatus.Information = sizeof(OUTPUT_ATTRIBUTE);
- Status = STATUS_SUCCESS;
- }
- break;
+ _disable();
+ WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORPOSLO);
+ WRITE_PORT_UCHAR (CRTC_DATA, Offset);
+ WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORPOSHI);
+ WRITE_PORT_UCHAR (CRTC_DATA, Offset >> 8);
+ _enable();
+ Irp->IoStatus.Information = 0;
+ Status = STATUS_SUCCESS;
+ }
+ break;
- default:
- Status = STATUS_NOT_IMPLEMENTED;
+ default:
+ Status = STATUS_NOT_IMPLEMENTED;
}
- Irp->IoStatus.Status = Status;
- IoCompleteRequest (Irp, IO_NO_INCREMENT);
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest (Irp, IO_NO_INCREMENT);
- return (Status);
+ return Status;
}
-NTSTATUS
-STDCALL ScrDispatch (PDEVICE_OBJECT DeviceObject, PIRP Irp)
+static NTSTATUS STDCALL
+ScrDispatch(PDEVICE_OBJECT DeviceObject,
+ PIRP Irp)
{
PIO_STACK_LOCATION stk = IoGetCurrentIrpStackLocation(Irp);
NTSTATUS Status;
/*
* Module entry point
*/
-NTSTATUS
-STDCALL
+NTSTATUS STDCALL
DriverEntry (PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
PDEVICE_OBJECT DeviceObject;
- UNICODE_STRING DeviceName;
- UNICODE_STRING SymlinkName;
+ UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Device\\BlueScreen");
+ UNICODE_STRING SymlinkName = RTL_CONSTANT_STRING(L"\\??\\BlueScreen");
- DbgPrint ("Screen Driver 0.0.6\n");
+ DPRINT ("Screen Driver 0.0.6\n");
DriverObject->MajorFunction[IRP_MJ_CREATE] = ScrCreate;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = ScrDispatch;
DriverObject->MajorFunction[IRP_MJ_WRITE] = ScrWrite;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL ] = ScrIoControl;
- RtlInitUnicodeString (&DeviceName, L"\\Device\\BlueScreen");
IoCreateDevice (DriverObject,
sizeof(DEVICE_EXTENSION),
&DeviceName,
TRUE,
&DeviceObject);
- RtlInitUnicodeString (&SymlinkName, L"\\??\\BlueScreen");
IoCreateSymbolicLink (&SymlinkName, &DeviceName);
return (STATUS_SUCCESS);