- Get beep and blue to compile/link on MSVC.
[reactos.git] / reactos / drivers / dd / blue / blue.c
index dc2f1f8..c5d2d19 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: blue.c,v 1.38 2003/06/20 13:04:09 gvg 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
 
 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
+DriverEntry (PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath);
+
+static NTSTATUS STDCALL
 ScrCreate(PDEVICE_OBJECT DeviceObject,
          PIRP Irp)
 {
@@ -74,12 +96,12 @@ ScrCreate(PDEVICE_OBJECT DeviceObject,
     PHYSICAL_ADDRESS BaseAddress;
     NTSTATUS Status;
     unsigned int offset;
-    BYTE data, value;
+    UCHAR data, value;
 
     DeviceExtension = DeviceObject->DeviceExtension;
 
     /* disable interrupts */
-    __asm__("cli\n\t");
+    _disable();
 
     /* get current output position */
     WRITE_PORT_UCHAR (CRTC_COMMAND, CRTC_CURSORPOSLO);
@@ -110,7 +132,7 @@ ScrCreate(PDEVICE_OBJECT DeviceObject,
     DeviceExtension->ScanLines = (READ_PORT_UCHAR (CRTC_DATA) & 0x1F) + 1;
 
     /* enable interrupts */
-    __asm__("sti\n\t");
+    _enable();
 
     /* calculate number of text rows */
     DeviceExtension->Rows =
@@ -127,7 +149,7 @@ ScrCreate(PDEVICE_OBJECT DeviceObject,
     /* get pointer to video memory */
     BaseAddress.QuadPart = VIDMEM_BASE;
     DeviceExtension->VideoMemory =
-        (PBYTE)MmMapIoSpace (BaseAddress, DeviceExtension->Rows * DeviceExtension->Columns * 2, FALSE);
+        (PUCHAR)MmMapIoSpace (BaseAddress, DeviceExtension->Rows * DeviceExtension->Columns * 2, MmNonCached);
 
     DeviceExtension->CursorSize    = 5; /* FIXME: value correct?? */
     DeviceExtension->CursorVisible = TRUE;
@@ -138,14 +160,14 @@ ScrCreate(PDEVICE_OBJECT DeviceObject,
                             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;
 
@@ -156,7 +178,7 @@ ScrCreate(PDEVICE_OBJECT DeviceObject,
 }
 
 
-NTSTATUS STDCALL
+static NTSTATUS STDCALL
 ScrWrite(PDEVICE_OBJECT DeviceObject,
         PIRP Irp)
 {
@@ -164,22 +186,34 @@ ScrWrite(PDEVICE_OBJECT DeviceObject,
     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;
 
-    __asm__ ("cli\n\t");
+    _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);
-    __asm__ ("sti\n\t");
+    _enable();
 
     cursory = offset / columns;
     cursorx = offset % columns;
@@ -207,23 +241,23 @@ ScrWrite(PDEVICE_OBJECT DeviceObject,
                   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++;
@@ -231,7 +265,7 @@ ScrWrite(PDEVICE_OBJECT DeviceObject,
                            }
                      }
                   break;
-                  
+
                default:
                   vidmem[(cursorx * 2) + (cursory * columns * 2)] = *pch;
                   vidmem[(cursorx * 2) + (cursory * columns * 2) + 1] = (char) DeviceExtension->CharAttribute;
@@ -265,17 +299,17 @@ ScrWrite(PDEVICE_OBJECT DeviceObject,
                      }
                }
          }
-       
+
        /* Set the cursor position */
        offset = (cursory * columns) + cursorx;
     }
-    __asm__ ("cli\n\t");
+    _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);
-    __asm__ ("sti\n\t");
+    _enable();
 
     Status = STATUS_SUCCESS;
 
@@ -286,298 +320,335 @@ ScrWrite(PDEVICE_OBJECT DeviceObject,
 }
 
 
-NTSTATUS STDCALL
+static NTSTATUS STDCALL
 ScrIoControl(PDEVICE_OBJECT DeviceObject,
             PIRP Irp)
 {
-    PIO_STACK_LOCATION stk = IoGetCurrentIrpStackLocation (Irp);
-    PDEVICE_EXTENSION DeviceExtension;
-    NTSTATUS Status;
-    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);
+  PIO_STACK_LOCATION stk = IoGetCurrentIrpStackLocation (Irp);
+  PDEVICE_EXTENSION DeviceExtension;
+  NTSTATUS Status;
 
-                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:
+  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 */
+          _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_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;
+              size = 1;
             }
-            break;
 
-        case IOCTL_CONSOLE_GET_CURSOR_INFO:
-            {
-                PCONSOLE_CURSOR_INFO pcci = (PCONSOLE_CURSOR_INFO)Irp->AssociatedIrp.SystemBuffer;
+          data |= (UCHAR)(height - size);
 
-                pcci->dwSize = DeviceExtension->CursorSize;
-                pcci->bVisible = DeviceExtension->CursorVisible;
+          _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));
 
-                Irp->IoStatus.Information = sizeof (CONSOLE_CURSOR_INFO);
-                Status = STATUS_SUCCESS;
-            }
-            break;
+          _enable();
 
-        case IOCTL_CONSOLE_SET_CURSOR_INFO:
-            {
-                PCONSOLE_CURSOR_INFO pcci = (PCONSOLE_CURSOR_INFO)Irp->AssociatedIrp.SystemBuffer;
-                BYTE data, value;
-                DWORD size, height;
+          Irp->IoStatus.Information = 0;
+          Status = STATUS_SUCCESS;
+        }
+        break;
 
-                DeviceExtension->CursorSize = pcci->dwSize;
-                DeviceExtension->CursorVisible = pcci->bVisible;
-                height = DeviceExtension->ScanLines;
-                data = (pcci->bVisible) ? 0x40 : 0x20;
+      case IOCTL_CONSOLE_GET_MODE:
+        {
+          PCONSOLE_MODE pcm = (PCONSOLE_MODE)Irp->AssociatedIrp.SystemBuffer;
 
-                size = (pcci->dwSize * height) / 100;
-                if (size < 1)
-                    size = 1;
+          pcm->dwMode = DeviceExtension->Mode;
 
-                data |= (BYTE)(height - size);
+          Irp->IoStatus.Information = sizeof(CONSOLE_MODE);
+          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_SET_MODE:
+        {
+          PCONSOLE_MODE pcm = (PCONSOLE_MODE)Irp->AssociatedIrp.SystemBuffer;
 
-                __asm__("sti\n\t");
+          DeviceExtension->Mode = pcm->dwMode;
 
-                Irp->IoStatus.Information = 0;
-                Status = STATUS_SUCCESS;
-            }
-            break;
+          Irp->IoStatus.Information = 0;
+          Status = STATUS_SUCCESS;
+        }
+        break;
 
-        case IOCTL_CONSOLE_GET_MODE:
-            {
-                PCONSOLE_MODE pcm = (PCONSOLE_MODE)Irp->AssociatedIrp.SystemBuffer;
+      case IOCTL_CONSOLE_FILL_OUTPUT_ATTRIBUTE:
+        {
+          POUTPUT_ATTRIBUTE Buf = (POUTPUT_ATTRIBUTE)Irp->AssociatedIrp.SystemBuffer;
+          PUCHAR vidmem;
+          int offset;
+          ULONG dwCount;
 
-                pcm->dwMode = DeviceExtension->Mode;
+          vidmem = DeviceExtension->VideoMemory;
+          offset = (Buf->dwCoord.Y * DeviceExtension->Columns * 2) +
+                    (Buf->dwCoord.X * 2) + 1;
 
-                Irp->IoStatus.Information = sizeof(CONSOLE_MODE);
-                Status = STATUS_SUCCESS;
+          for (dwCount = 0; dwCount < Buf->nLength; dwCount++)
+            {
+              vidmem[offset + (dwCount * 2)] = (char) Buf->wAttribute;
             }
-            break;
 
-        case IOCTL_CONSOLE_SET_MODE:
-            {
-                PCONSOLE_MODE pcm = (PCONSOLE_MODE)Irp->AssociatedIrp.SystemBuffer;
+          Buf->dwTransfered = Buf->nLength;
 
-                DeviceExtension->Mode = pcm->dwMode;
+          Irp->IoStatus.Information = 0;
+          Status = STATUS_SUCCESS;
+        }
+        break;
 
-                Irp->IoStatus.Information = 0;
-                Status = STATUS_SUCCESS;
-            }
-            break;
+      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;
+
+          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 < stk->Parameters.DeviceIoControl.OutputBufferLength; dwCount++, pAttr++)
             {
-                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;
+              *((char *) pAttr) = vidmem[offset + (dwCount * 2)];
             }
-            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 = 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.DeviceIoControl.OutputBufferLength; dwCount++, pAttr++)
-                {
-                    (char) *pAttr = vidmem[offset + (dwCount * 2)];
-                }
+      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;
-            }
-            break;
-
-        case IOCTL_CONSOLE_WRITE_OUTPUT_ATTRIBUTE:
+          for (dwCount = 0; dwCount < (stk->Parameters.DeviceIoControl.OutputBufferLength - sizeof( COORD )); dwCount++, pAttr++)
             {
-                COORD *pCoord = (COORD *)MmGetSystemAddressForMdl(Irp->MdlAddress);
-               CHAR *pAttr = (CHAR *)(pCoord + 1);
-                char *vidmem;
-                int offset;
-                DWORD dwCount;
-
-                vidmem = DeviceExtension->VideoMemory;
-                offset = (pCoord->Y * DeviceExtension->Columns * 2) +
-                         (pCoord->X * 2) + 1;
-
-                for (dwCount = 0; dwCount < (stk->Parameters.DeviceIoControl.InputBufferLength - sizeof( COORD )); dwCount++, pAttr++)
-                {
-                    vidmem[offset + (dwCount * 2)] = *pAttr;
-                }
-                Irp->IoStatus.Information = 0;
-                Status = STATUS_SUCCESS;
+              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.DeviceIoControl.OutputBufferLength; 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++)
             {
-               COORD *pCoord;
-                LPSTR pChar;
-                char *vidmem;
-                int offset;
-                DWORD dwCount;
-               pCoord = (COORD *)MmGetSystemAddressForMdl(Irp->MdlAddress);
-               pChar = (CHAR *)(pCoord + 1);
-                vidmem = DeviceExtension->VideoMemory;
-                offset = (pCoord->Y * DeviceExtension->Columns * 2) +
-                         (pCoord->X * 2);
-
-                for (dwCount = 0; dwCount < (stk->Parameters.DeviceIoControl.InputBufferLength - sizeof( COORD )); dwCount++, pChar++)
-                {
-                    vidmem[offset + (dwCount * 2)] = *pChar;
-                }
-
-               Irp->IoStatus.Information = 0;
-                Status = STATUS_SUCCESS;
+              RtlCopyMemory(Dest, Src, SrcDelta);
+              Src += SrcDelta;
+              Dest += DestDelta;
             }
-            break;
 
+          Offset = (ConsoleDraw->CursorY * DeviceExtension->Columns) +
+                   ConsoleDraw->CursorX;
 
-        default:
-            Status = STATUS_NOT_IMPLEMENTED;
+          _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;
     }
 
-    Irp->IoStatus.Status = Status;
-    IoCompleteRequest (Irp, IO_NO_INCREMENT);
+  Irp->IoStatus.Status = Status;
+  IoCompleteRequest (Irp, IO_NO_INCREMENT);
 
-    return (Status);
+  return Status;
 }
 
 
-NTSTATUS STDCALL
+static NTSTATUS STDCALL
 ScrDispatch(PDEVICE_OBJECT DeviceObject,
            PIRP Irp)
 {
@@ -610,8 +681,8 @@ NTSTATUS STDCALL
 DriverEntry (PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
 {
     PDEVICE_OBJECT DeviceObject;
-    UNICODE_STRING DeviceName = UNICODE_STRING_INITIALIZER(L"\\Device\\BlueScreen");
-    UNICODE_STRING SymlinkName = UNICODE_STRING_INITIALIZER(L"\\??\\BlueScreen");
+    UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Device\\BlueScreen");
+    UNICODE_STRING SymlinkName = RTL_CONSTANT_STRING(L"\\??\\BlueScreen");
 
     DPRINT ("Screen Driver 0.0.6\n");