[CONSRV]
[reactos.git] / win32ss / user / consrv / conoutput.c
index e49b31a..719a534 100644 (file)
@@ -131,22 +131,6 @@ ConioWriteConsole(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff,
 
     for (i = 0; i < Length; i++)
     {
-        if (Console->UnpauseEvent)
-        {
-/** FIXME: Added in 47359 for pausing
-            Status = NtDuplicateObject(NtCurrentProcess(),
-                                       Console->UnpauseEvent,
-                                       Process->ProcessHandle,
-                                       &WriteConsoleRequest->UnpauseEvent,
-                                       SYNCHRONIZE, 0, 0);
-            ConioUnlockScreenBuffer(Buff);
-            return (NT_SUCCESS(Status) ? STATUS_PENDING : Status);
-**/
-
-            /* Wait on the console unpause event till it becomes signaled */
-            WaitForSingleObject(Console->UnpauseEvent, INFINITE);
-        }
-
         if (Buff->Mode & ENABLE_PROCESSED_OUTPUT)
         {
             /* --- LF --- */
@@ -446,6 +430,124 @@ ConioEffectiveCursorSize(PCSRSS_CONSOLE Console, DWORD Scale)
     return Size;
 }
 
+static NTSTATUS
+DoWriteConsole(IN PCSR_API_MESSAGE ApiMessage,
+               IN PCSR_THREAD ClientThread,
+               IN BOOL CreateWaitBlock OPTIONAL);
+
+// Wait function CSR_WAIT_FUNCTION
+static BOOLEAN
+WriteConsoleThread(IN PLIST_ENTRY WaitList,
+                   IN PCSR_THREAD WaitThread,
+                   IN PCSR_API_MESSAGE WaitApiMessage,
+                   IN PVOID WaitContext,
+                   IN PVOID WaitArgument1,
+                   IN PVOID WaitArgument2,
+                   IN ULONG WaitFlags)
+{
+    NTSTATUS Status;
+
+    Status = DoWriteConsole(WaitApiMessage,
+                            WaitThread,
+                            FALSE);
+
+    if (Status != STATUS_PENDING)
+    {
+        WaitApiMessage->Status = Status;
+    }
+
+    return (Status == STATUS_PENDING ? FALSE : TRUE);
+}
+
+static NTSTATUS
+DoWriteConsole(IN PCSR_API_MESSAGE ApiMessage,
+               IN PCSR_THREAD ClientThread,
+               IN BOOL CreateWaitBlock OPTIONAL)
+{
+    NTSTATUS Status = STATUS_SUCCESS;
+    PCSRSS_WRITE_CONSOLE WriteConsoleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.WriteConsoleRequest;
+    PCSRSS_CONSOLE Console;
+    PCSRSS_SCREEN_BUFFER Buff;
+    PCHAR Buffer;
+    DWORD Written = 0;
+    ULONG Length;
+
+    Status = ConioLockScreenBuffer(ConsoleGetPerProcessData(ClientThread->Process), WriteConsoleRequest->ConsoleHandle, &Buff, GENERIC_WRITE);
+    if (!NT_SUCCESS(Status)) return Status;
+
+    Console = Buff->Header.Console;
+
+    // if (Console->PauseFlags & (PAUSED_FROM_KEYBOARD | PAUSED_FROM_SCROLLBAR | PAUSED_FROM_SELECTION))
+    if (Console->PauseFlags && Console->UnpauseEvent != NULL)
+    {
+        if (CreateWaitBlock)
+        {
+            if (!CsrCreateWait(&Console->WriteWaitQueue,
+                               WriteConsoleThread,
+                               ClientThread,
+                               ApiMessage,
+                               NULL,
+                               NULL))
+            {
+                /* Fail */
+                ConioUnlockScreenBuffer(Buff);
+                return STATUS_NO_MEMORY;
+            }
+        }
+
+        /* Wait until we un-pause the console */
+        Status = STATUS_PENDING;
+    }
+    else
+    {
+        if(WriteConsoleRequest->Unicode)
+        {
+            Length = WideCharToMultiByte(Console->OutputCodePage, 0,
+                                         (PWCHAR)WriteConsoleRequest->Buffer,
+                                         WriteConsoleRequest->NrCharactersToWrite,
+                                         NULL, 0, NULL, NULL);
+            Buffer = RtlAllocateHeap(GetProcessHeap(), 0, Length);
+            if (Buffer)
+            {
+                WideCharToMultiByte(Console->OutputCodePage, 0,
+                                    (PWCHAR)WriteConsoleRequest->Buffer,
+                                    WriteConsoleRequest->NrCharactersToWrite,
+                                    Buffer, Length, NULL, NULL);
+            }
+            else
+            {
+                Status = STATUS_NO_MEMORY;
+            }
+        }
+        else
+        {
+            Buffer = (PCHAR)WriteConsoleRequest->Buffer;
+        }
+
+        if (Buffer)
+        {
+            if (NT_SUCCESS(Status))
+            {
+                Status = ConioWriteConsole(Console, Buff, Buffer,
+                                           WriteConsoleRequest->NrCharactersToWrite, TRUE);
+                if (NT_SUCCESS(Status))
+                {
+                    Written = WriteConsoleRequest->NrCharactersToWrite;
+                }
+            }
+            if (WriteConsoleRequest->Unicode)
+            {
+                RtlFreeHeap(GetProcessHeap(), 0, Buffer);
+            }
+        }
+
+        WriteConsoleRequest->NrCharactersWritten = Written;
+    }
+
+    ConioUnlockScreenBuffer(Buff);
+    return Status;
+}
+
 
 /* PUBLIC APIS ****************************************************************/
 
@@ -469,6 +571,11 @@ CSR_API(SrvReadConsoleOutput)
 
     DPRINT("SrvReadConsoleOutput\n");
 
+    CharInfo = ReadConsoleOutputRequest->CharInfo;
+    ReadRegion = ReadConsoleOutputRequest->ReadRegion;
+    BufferSize = ReadConsoleOutputRequest->BufferSize;
+    BufferCoord = ReadConsoleOutputRequest->BufferCoord;
+
     if (!CsrValidateMessageBuffer(ApiMessage,
                                   (PVOID*)&ReadConsoleOutputRequest->CharInfo,
                                   BufferSize.X * BufferSize.Y,
@@ -480,20 +587,6 @@ CSR_API(SrvReadConsoleOutput)
     Status = ConioLockScreenBuffer(ProcessData, ReadConsoleOutputRequest->ConsoleHandle, &Buff, GENERIC_READ);
     if (!NT_SUCCESS(Status)) return Status;
 
-    CharInfo = ReadConsoleOutputRequest->CharInfo;
-    ReadRegion = ReadConsoleOutputRequest->ReadRegion;
-    BufferSize = ReadConsoleOutputRequest->BufferSize;
-    BufferCoord = ReadConsoleOutputRequest->BufferCoord;
-
-/*
-    if (!Win32CsrValidateBuffer(ProcessData->Process, CharInfo,
-                                BufferSize.X * BufferSize.Y, sizeof(CHAR_INFO)))
-    {
-        ConioUnlockScreenBuffer(Buff);
-        return STATUS_ACCESS_VIOLATION;
-    }
-*/
-
     /* FIXME: Is this correct? */
     CodePage = ProcessData->Console->OutputCodePage;
 
@@ -546,13 +639,6 @@ CSR_API(SrvWriteConsole)
 {
     NTSTATUS Status;
     PCSRSS_WRITE_CONSOLE WriteConsoleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.WriteConsoleRequest;
-    PCHAR Buffer;
-    PCSRSS_SCREEN_BUFFER Buff;
-    // PCSR_PROCESS Process = CsrGetClientThread()->Process;
-    PCSRSS_CONSOLE Console;
-    DWORD Written = 0;
-    ULONG Length;
-    // ULONG CharSize = (WriteConsoleRequest->Unicode ? sizeof(WCHAR) : sizeof(CHAR));
 
     DPRINT("SrvWriteConsole\n");
 
@@ -564,68 +650,12 @@ CSR_API(SrvWriteConsole)
         return STATUS_INVALID_PARAMETER;
     }
 
-    Status = ConioLockScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), WriteConsoleRequest->ConsoleHandle, &Buff, GENERIC_WRITE);
-    if (!NT_SUCCESS(Status)) return Status;
-
-    Console = Buff->Header.Console;
-
-/** FIXME: Added in 47359 for pausing
-    if (Console->UnpauseEvent)
-    {
-        Status = NtDuplicateObject(NtCurrentProcess(),
-                                   Console->UnpauseEvent,
-                                   Process->ProcessHandle,
-                                   &WriteConsoleRequest->UnpauseEvent,
-                                   SYNCHRONIZE, 0, 0);
-        ConioUnlockScreenBuffer(Buff);
-        return (NT_SUCCESS(Status) ? STATUS_PENDING : Status);
-    }
-**/
-
-    if(WriteConsoleRequest->Unicode)
-    {
-        Length = WideCharToMultiByte(Console->OutputCodePage, 0,
-                                     (PWCHAR)WriteConsoleRequest->Buffer,
-                                     WriteConsoleRequest->NrCharactersToWrite,
-                                     NULL, 0, NULL, NULL);
-        Buffer = RtlAllocateHeap(GetProcessHeap(), 0, Length);
-        if (Buffer)
-        {
-            WideCharToMultiByte(Console->OutputCodePage, 0,
-                                (PWCHAR)WriteConsoleRequest->Buffer,
-                                WriteConsoleRequest->NrCharactersToWrite,
-                                Buffer, Length, NULL, NULL);
-        }
-        else
-        {
-            Status = STATUS_NO_MEMORY;
-        }
-    }
-    else
-    {
-        Buffer = (PCHAR)WriteConsoleRequest->Buffer;
-    }
-
-    if (Buffer)
-    {
-        if (NT_SUCCESS(Status))
-        {
-            Status = ConioWriteConsole(Console, Buff, Buffer,
-                                       WriteConsoleRequest->NrCharactersToWrite, TRUE);
-            if (NT_SUCCESS(Status))
-            {
-                Written = WriteConsoleRequest->NrCharactersToWrite;
-            }
-        }
-        if (WriteConsoleRequest->Unicode)
-        {
-            RtlFreeHeap(GetProcessHeap(), 0, Buffer);
-        }
-    }
-
-    ConioUnlockScreenBuffer(Buff);
+    Status = DoWriteConsole(ApiMessage,
+                            CsrGetClientThread(),
+                            TRUE);
 
-    WriteConsoleRequest->NrCharactersWritten = Written;
+    if (Status == STATUS_PENDING)
+        *ReplyCode = CsrReplyPending;
 
     return Status;
 }
@@ -648,6 +678,10 @@ CSR_API(SrvWriteConsoleOutput)
 
     DPRINT("SrvWriteConsoleOutput\n");
 
+    BufferSize = WriteConsoleOutputRequest->BufferSize;
+    BufferCoord = WriteConsoleOutputRequest->BufferCoord;
+    CharInfo = WriteConsoleOutputRequest->CharInfo;
+
     if (!CsrValidateMessageBuffer(ApiMessage,
                                   (PVOID*)&WriteConsoleOutputRequest->CharInfo,
                                   BufferSize.X * BufferSize.Y,
@@ -664,19 +698,6 @@ CSR_API(SrvWriteConsoleOutput)
 
     Console = Buff->Header.Console;
 
-    BufferSize = WriteConsoleOutputRequest->BufferSize;
-    BufferCoord = WriteConsoleOutputRequest->BufferCoord;
-    CharInfo = WriteConsoleOutputRequest->CharInfo;
-
-/*
-    if (!Win32CsrValidateBuffer(ProcessData->Process, CharInfo,
-                                BufferSize.X * BufferSize.Y, sizeof(CHAR_INFO)))
-    {
-        ConioUnlockScreenBuffer(Buff);
-        return STATUS_ACCESS_VIOLATION;
-    }
-*/
-
     WriteRegion = WriteConsoleOutputRequest->WriteRegion;
 
     SizeY = min(BufferSize.Y - BufferCoord.Y, ConioRectHeight(&WriteRegion));
@@ -743,8 +764,6 @@ CSR_API(SrvReadConsoleOutputString)
 
     DPRINT("SrvReadConsoleOutputString\n");
 
-    ReadBuffer = ReadConsoleOutputCodeRequest->pCode.pCode;
-
     CodeType = ReadConsoleOutputCodeRequest->CodeType;
     switch (CodeType)
     {
@@ -764,11 +783,20 @@ CSR_API(SrvReadConsoleOutputString)
             return STATUS_INVALID_PARAMETER;
     }
 
+    if (!CsrValidateMessageBuffer(ApiMessage,
+                                  (PVOID*)&ReadConsoleOutputCodeRequest->pCode.pCode,
+                                  ReadConsoleOutputCodeRequest->NumCodesToRead,
+                                  CodeSize))
+    {
+        return STATUS_INVALID_PARAMETER;
+    }
+
     Status = ConioLockScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), ReadConsoleOutputCodeRequest->ConsoleHandle, &Buff, GENERIC_READ);
     if (!NT_SUCCESS(Status)) return Status;
 
     Console = Buff->Header.Console;
 
+    ReadBuffer = ReadConsoleOutputCodeRequest->pCode.pCode;
     Xpos = ReadConsoleOutputCodeRequest->ReadCoord.X;
     Ypos = (ReadConsoleOutputCodeRequest->ReadCoord.Y + Buff->VirtualY) % Buff->MaxY;
 
@@ -845,169 +873,136 @@ CSR_API(SrvReadConsoleOutputString)
     return STATUS_SUCCESS;
 }
 
-CSR_API(CsrWriteConsoleOutputChar)
+CSR_API(SrvWriteConsoleOutputString)
 {
     NTSTATUS Status;
-    PCSRSS_WRITE_CONSOLE_OUTPUT_CHAR WriteConsoleOutputCharRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.WriteConsoleOutputCharRequest;
-    PCHAR String, tmpString = NULL;
-    PBYTE Buffer;
+    PCSRSS_WRITE_CONSOLE_OUTPUT_CODE WriteConsoleOutputCodeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.WriteConsoleOutputCodeRequest;
     PCSRSS_CONSOLE Console;
     PCSRSS_SCREEN_BUFFER Buff;
-    DWORD X, Y, Length, CharSize, Written = 0;
+    USHORT CodeType;
+    PBYTE Buffer; // PUCHAR
+    PCHAR String, tmpString = NULL;
+    DWORD X, Y, Length; // , Written = 0;
+    ULONG CodeSize;
     SMALL_RECT UpdateRect;
 
-    DPRINT("CsrWriteConsoleOutputChar\n");
+    DPRINT("SrvWriteConsoleOutputString\n");
+
+    CodeType = WriteConsoleOutputCodeRequest->CodeType;
+    switch (CodeType)
+    {
+        case CODE_ASCII:
+            CodeSize = sizeof(CHAR);
+            break;
 
-    CharSize = (WriteConsoleOutputCharRequest->Unicode ? sizeof(WCHAR) : sizeof(CHAR));
+        case CODE_UNICODE:
+            CodeSize = sizeof(WCHAR);
+            break;
+
+        case CODE_ATTRIBUTE:
+            CodeSize = sizeof(WORD);
+            break;
 
-    if (ApiMessage->Header.u1.s1.TotalLength
-            < CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR)
-            + (WriteConsoleOutputCharRequest->Length * CharSize))
+        default:
+            return STATUS_INVALID_PARAMETER;
+    }
+
+    if (!CsrValidateMessageBuffer(ApiMessage,
+                                  (PVOID*)&WriteConsoleOutputCodeRequest->pCode.pCode,
+                                  WriteConsoleOutputCodeRequest->Length,
+                                  CodeSize))
     {
-        DPRINT1("Invalid ApiMessage size\n");
         return STATUS_INVALID_PARAMETER;
     }
 
-    Status = ConioLockScreenBuffer(CsrGetClientThread()->Process,
-                                    WriteConsoleOutputCharRequest->ConsoleHandle,
+    Status = ConioLockScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
+                                    WriteConsoleOutputCodeRequest->ConsoleHandle,
                                     &Buff,
                                     GENERIC_WRITE);
-    if (NT_SUCCESS(Status))
+    if (!NT_SUCCESS(Status)) return Status;
+
+    Console = Buff->Header.Console;
+
+    switch (CodeType)
     {
-        Console = Buff->Header.Console;
-        if(WriteConsoleOutputCharRequest->Unicode)
+        case CODE_UNICODE:
         {
             Length = WideCharToMultiByte(Console->OutputCodePage, 0,
-                                         (PWCHAR)WriteConsoleOutputCharRequest->String,
-                                         WriteConsoleOutputCharRequest->Length,
+                                         (PWCHAR)WriteConsoleOutputCodeRequest->pCode.UnicodeChar,
+                                         WriteConsoleOutputCodeRequest->Length,
                                          NULL, 0, NULL, NULL);
             tmpString = String = RtlAllocateHeap(GetProcessHeap(), 0, Length);
             if (String)
             {
                 WideCharToMultiByte(Console->OutputCodePage, 0,
-                                    (PWCHAR)WriteConsoleOutputCharRequest->String,
-                                    WriteConsoleOutputCharRequest->Length,
+                                    (PWCHAR)WriteConsoleOutputCodeRequest->pCode.UnicodeChar,
+                                    WriteConsoleOutputCodeRequest->Length,
                                     String, Length, NULL, NULL);
             }
             else
             {
                 Status = STATUS_NO_MEMORY;
             }
-        }
-        else
-        {
-            String = (PCHAR)WriteConsoleOutputCharRequest->String;
-        }
 
-        if (String)
-        {
-            if (NT_SUCCESS(Status))
-            {
-                X = WriteConsoleOutputCharRequest->Coord.X;
-                Y = (WriteConsoleOutputCharRequest->Coord.Y + Buff->VirtualY) % Buff->MaxY;
-                Length = WriteConsoleOutputCharRequest->Length;
-                Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X)];
-                while (Length--)
-                {
-                    *Buffer = *String++;
-                    Written++;
-                    Buffer += 2;
-                    if (++X == Buff->MaxX)
-                    {
-                        if (++Y == Buff->MaxY)
-                        {
-                            Y = 0;
-                            Buffer = Buff->Buffer;
-                        }
-                        X = 0;
-                    }
-                }
-                if (Buff == Console->ActiveBuffer)
-                {
-                    ConioComputeUpdateRect(Buff, &UpdateRect, &WriteConsoleOutputCharRequest->Coord,
-                                           WriteConsoleOutputCharRequest->Length);
-                    ConioDrawRegion(Console, &UpdateRect);
-                }
-
-                WriteConsoleOutputCharRequest->EndCoord.X = X;
-                WriteConsoleOutputCharRequest->EndCoord.Y = (Y + Buff->MaxY - Buff->VirtualY) % Buff->MaxY;
-
-            }
-            if (WriteConsoleOutputCharRequest->Unicode)
-            {
-                RtlFreeHeap(GetProcessHeap(), 0, tmpString);
-            }
+            break;
         }
-        ConioUnlockScreenBuffer(Buff);
-    }
-    WriteConsoleOutputCharRequest->NrCharactersWritten = Written;
-    return Status;
-}
-
-CSR_API(CsrWriteConsoleOutputAttrib)
-{
-    PCSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB WriteConsoleOutputAttribRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.WriteConsoleOutputAttribRequest;
-    PCSRSS_CONSOLE Console;
-    PCSRSS_SCREEN_BUFFER Buff;
-    PUCHAR Buffer;
-    PWORD Attribute;
-    int X, Y, Length;
-    NTSTATUS Status;
-    SMALL_RECT UpdateRect;
 
-    DPRINT("CsrWriteConsoleOutputAttrib\n");
+        case CODE_ASCII:
+            String = (PCHAR)WriteConsoleOutputCodeRequest->pCode.AsciiChar;
+            break;
 
-    if (ApiMessage->Header.u1.s1.TotalLength
-            < CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB)
-            + WriteConsoleOutputAttribRequest->Length * sizeof(WORD))
-    {
-        DPRINT1("Invalid ApiMessage size\n");
-        return STATUS_INVALID_PARAMETER;
+        case CODE_ATTRIBUTE:
+        default:
+            // *(ReadBuffer++) = Code;
+            String = (PCHAR)WriteConsoleOutputCodeRequest->pCode.Attribute;
+            break;
     }
 
-    Status = ConioLockScreenBuffer(CsrGetClientThread()->Process,
-                                   WriteConsoleOutputAttribRequest->ConsoleHandle,
-                                   &Buff,
-                                   GENERIC_WRITE);
-    if (! NT_SUCCESS(Status))
+    if (String && NT_SUCCESS(Status))
     {
-        return Status;
-    }
-    Console = Buff->Header.Console;
+        X = WriteConsoleOutputCodeRequest->Coord.X;
+        Y = (WriteConsoleOutputCodeRequest->Coord.Y + Buff->VirtualY) % Buff->MaxY;
+        Length = WriteConsoleOutputCodeRequest->Length;
+        Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X) + (CodeType == CODE_ATTRIBUTE ? 1 : 0)];
 
-    X = WriteConsoleOutputAttribRequest->Coord.X;
-    Y = (WriteConsoleOutputAttribRequest->Coord.Y + Buff->VirtualY) % Buff->MaxY;
-    Length = WriteConsoleOutputAttribRequest->Length;
-    Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X) + 1];
-    Attribute = WriteConsoleOutputAttribRequest->Attribute;
-    while (Length--)
-    {
-        *Buffer = (UCHAR)(*Attribute++);
-        Buffer += 2;
-        if (++X == Buff->MaxX)
+        while (Length--)
         {
-            if (++Y == Buff->MaxY)
+            *Buffer = *String++;
+            // ReadBuffer = (PVOID)((ULONG_PTR)ReadBuffer + CodeSize);
+            String = (PCHAR)((ULONG_PTR)String + CodeSize);
+            // Written++;
+            Buffer += 2;
+            if (++X == Buff->MaxX)
             {
-                Y = 0;
-                Buffer = Buff->Buffer + 1;
+                if (++Y == Buff->MaxY)
+                {
+                    Y = 0;
+                    Buffer = Buff->Buffer + (CodeType == CODE_ATTRIBUTE ? 1 : 0);
+                }
+                X = 0;
             }
-            X = 0;
         }
+
+        if (Buff == Console->ActiveBuffer)
+        {
+            ConioComputeUpdateRect(Buff, &UpdateRect, &WriteConsoleOutputCodeRequest->Coord,
+                                   WriteConsoleOutputCodeRequest->Length);
+            ConioDrawRegion(Console, &UpdateRect);
+        }
+
+        WriteConsoleOutputCodeRequest->EndCoord.X = X;
+        WriteConsoleOutputCodeRequest->EndCoord.Y = (Y + Buff->MaxY - Buff->VirtualY) % Buff->MaxY;
     }
 
-    if (Buff == Console->ActiveBuffer)
+    if (tmpString)
     {
-        ConioComputeUpdateRect(Buff, &UpdateRect, &WriteConsoleOutputAttribRequest->Coord,
-                               WriteConsoleOutputAttribRequest->Length);
-        ConioDrawRegion(Console, &UpdateRect);
+        RtlFreeHeap(GetProcessHeap(), 0, tmpString);
     }
 
-    WriteConsoleOutputAttribRequest->EndCoord.X = X;
-    WriteConsoleOutputAttribRequest->EndCoord.Y = (Y + Buff->MaxY - Buff->VirtualY) % Buff->MaxY;
-
     ConioUnlockScreenBuffer(Buff);
 
-    return STATUS_SUCCESS;
+    // WriteConsoleOutputCodeRequest->NrCharactersWritten = Written;
+    return Status;
 }
 
 CSR_API(SrvFillConsoleOutput)
@@ -1016,7 +1011,7 @@ CSR_API(SrvFillConsoleOutput)
     PCSRSS_FILL_OUTPUT FillOutputRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.FillOutputRequest;
     PCSRSS_CONSOLE Console;
     PCSRSS_SCREEN_BUFFER Buff;
-    DWORD X, Y, Length, Start; // , Written = 0;
+    DWORD X, Y, Length; // , Written = 0;
     USHORT CodeType;
     BYTE Code;
     PBYTE Buffer;
@@ -1034,8 +1029,7 @@ CSR_API(SrvFillConsoleOutput)
     X = FillOutputRequest->Coord.X;
     Y = (FillOutputRequest->Coord.Y + Buff->VirtualY) % Buff->MaxY;
     Length = FillOutputRequest->Length;
-    Start = 2 * (Y * Buff->MaxX + X) + (CodeType == CODE_ATTRIBUTE ? 1 : 0);
-    Buffer = &Buff->Buffer[Start];
+    Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X) + (CodeType == CODE_ATTRIBUTE ? 1 : 0)];
 
     switch (CodeType)
     {
@@ -1296,7 +1290,7 @@ CSR_API(SrvGetConsoleScreenBufferInfo)
     PCSRSS_SCREEN_BUFFER_INFO ScreenBufferInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ScreenBufferInfoRequest;
     PCSRSS_CONSOLE Console;
     PCSRSS_SCREEN_BUFFER Buff;
-    PCONSOLE_SCREEN_BUFFER_INFO pInfo;
+    PCONSOLE_SCREEN_BUFFER_INFO pInfo = &ScreenBufferInfoRequest->Info;
 
     DPRINT("SrvGetConsoleScreenBufferInfo\n");
 
@@ -1304,7 +1298,7 @@ CSR_API(SrvGetConsoleScreenBufferInfo)
     if (!NT_SUCCESS(Status)) return Status;
 
     Console = Buff->Header.Console;
-    pInfo = &ScreenBufferInfoRequest->Info;
+
     pInfo->dwSize.X = Buff->MaxX;
     pInfo->dwSize.Y = Buff->MaxY;
     pInfo->dwCursorPosition.X = Buff->CurrentX;
@@ -1316,6 +1310,7 @@ CSR_API(SrvGetConsoleScreenBufferInfo)
     pInfo->srWindow.Bottom = Buff->ShowY + Console->Size.Y - 1;
     pInfo->dwMaximumWindowSize.X = Buff->MaxX;
     pInfo->dwMaximumWindowSize.Y = Buff->MaxY;
+
     ConioUnlockScreenBuffer(Buff);
 
     return STATUS_SUCCESS;