2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Console Server DLL
4 * FILE: win32ss/user/winsrv/consrv/conoutput.c
5 * PURPOSE: General Console Output Functions
6 * PROGRAMMERS: Jeffrey Morlan
7 * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
10 /* INCLUDES *******************************************************************/
14 #include "include/conio.h"
15 #include "include/conio2.h"
16 #include "conoutput.h"
23 /* PRIVATE FUNCTIONS **********************************************************/
26 /* PUBLIC SERVER APIS *********************************************************/
29 ConDrvInvalidateBitMapRect(IN PCONSOLE Console
,
30 IN PCONSOLE_SCREEN_BUFFER Buffer
,
31 IN PSMALL_RECT Region
);
32 CSR_API(SrvInvalidateBitMapRect
)
35 PCONSOLE_INVALIDATEDIBITS InvalidateDIBitsRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.InvalidateDIBitsRequest
;
36 PCONSOLE_SCREEN_BUFFER Buffer
;
38 DPRINT("SrvInvalidateBitMapRect\n");
40 Status
= ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
41 InvalidateDIBitsRequest
->OutputHandle
,
42 &Buffer
, GENERIC_READ
, TRUE
);
43 if (!NT_SUCCESS(Status
)) return Status
;
45 Status
= ConDrvInvalidateBitMapRect(Buffer
->Header
.Console
,
47 &InvalidateDIBitsRequest
->Region
);
49 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
54 ConDrvSetConsolePalette(IN PCONSOLE Console
,
55 IN PGRAPHICS_SCREEN_BUFFER Buffer
,
56 IN HPALETTE PaletteHandle
,
58 CSR_API(SrvSetConsolePalette
)
61 PCONSOLE_SETPALETTE SetPaletteRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetPaletteRequest
;
62 // PCONSOLE_SCREEN_BUFFER Buffer;
63 PGRAPHICS_SCREEN_BUFFER Buffer
;
65 DPRINT("SrvSetConsolePalette\n");
67 // NOTE: Tests show that this function is used only for graphics screen buffers
68 // and otherwise it returns false + sets last error to invalid handle.
69 Status
= ConSrvGetGraphicsBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
70 SetPaletteRequest
->OutputHandle
,
71 &Buffer
, GENERIC_WRITE
, TRUE
);
72 if (!NT_SUCCESS(Status
)) return Status
;
74 Status
= ConDrvSetConsolePalette(Buffer
->Header
.Console
,
76 SetPaletteRequest
->PaletteHandle
,
77 SetPaletteRequest
->Usage
);
79 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
84 ConDrvGetConsoleCursorInfo(IN PCONSOLE Console
,
85 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
86 OUT PCONSOLE_CURSOR_INFO CursorInfo
);
87 CSR_API(SrvGetConsoleCursorInfo
)
90 PCONSOLE_GETSETCURSORINFO CursorInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.CursorInfoRequest
;
91 PTEXTMODE_SCREEN_BUFFER Buffer
;
93 DPRINT("SrvGetConsoleCursorInfo\n");
95 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
96 CursorInfoRequest
->OutputHandle
,
97 &Buffer
, GENERIC_READ
, TRUE
);
98 if (!NT_SUCCESS(Status
)) return Status
;
100 Status
= ConDrvGetConsoleCursorInfo(Buffer
->Header
.Console
,
102 &CursorInfoRequest
->Info
);
104 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
109 ConDrvSetConsoleCursorInfo(IN PCONSOLE Console
,
110 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
111 IN PCONSOLE_CURSOR_INFO CursorInfo
);
112 CSR_API(SrvSetConsoleCursorInfo
)
115 PCONSOLE_GETSETCURSORINFO CursorInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.CursorInfoRequest
;
116 PTEXTMODE_SCREEN_BUFFER Buffer
;
118 DPRINT("SrvSetConsoleCursorInfo\n");
120 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
121 CursorInfoRequest
->OutputHandle
,
122 &Buffer
, GENERIC_WRITE
, TRUE
);
123 if (!NT_SUCCESS(Status
)) return Status
;
125 Status
= ConDrvSetConsoleCursorInfo(Buffer
->Header
.Console
,
127 &CursorInfoRequest
->Info
);
129 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
134 ConDrvSetConsoleCursorPosition(IN PCONSOLE Console
,
135 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
137 CSR_API(SrvSetConsoleCursorPosition
)
140 PCONSOLE_SETCURSORPOSITION SetCursorPositionRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetCursorPositionRequest
;
141 PTEXTMODE_SCREEN_BUFFER Buffer
;
143 DPRINT("SrvSetConsoleCursorPosition\n");
145 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
146 SetCursorPositionRequest
->OutputHandle
,
147 &Buffer
, GENERIC_WRITE
, TRUE
);
148 if (!NT_SUCCESS(Status
)) return Status
;
150 Status
= ConDrvSetConsoleCursorPosition(Buffer
->Header
.Console
,
152 &SetCursorPositionRequest
->Position
);
154 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
158 CSR_API(SrvCreateConsoleScreenBuffer
)
160 NTSTATUS Status
= STATUS_INVALID_PARAMETER
;
161 PCONSOLE_CREATESCREENBUFFER CreateScreenBufferRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.CreateScreenBufferRequest
;
162 PCONSOLE_PROCESS_DATA ProcessData
= ConsoleGetPerProcessData(CsrGetClientThread()->Process
);
164 PCONSOLE_SCREEN_BUFFER Buff
;
166 PVOID ScreenBufferInfo
= NULL
;
167 TEXTMODE_BUFFER_INFO TextModeInfo
= {{80, 25},
168 DEFAULT_SCREEN_ATTRIB
,
169 DEFAULT_POPUP_ATTRIB
,
171 CSR_DEFAULT_CURSOR_SIZE
};
172 GRAPHICS_BUFFER_INFO GraphicsInfo
;
173 GraphicsInfo
.Info
= CreateScreenBufferRequest
->GraphicsBufferInfo
; // HACK for MSVC
175 DPRINT("SrvCreateConsoleScreenBuffer\n");
177 Status
= ConSrvGetConsole(ProcessData
, &Console
, TRUE
);
178 if (!NT_SUCCESS(Status
)) return Status
;
180 if (CreateScreenBufferRequest
->ScreenBufferType
== CONSOLE_TEXTMODE_BUFFER
)
182 ScreenBufferInfo
= &TextModeInfo
;
185 if (Console->ActiveBuffer)
187 TextModeInfo.ScreenBufferSize = Console->ActiveBuffer->ScreenBufferSize;
188 if (TextModeInfo.ScreenBufferSize.X == 0) TextModeInfo.ScreenBufferSize.X = 80;
189 if (TextModeInfo.ScreenBufferSize.Y == 0) TextModeInfo.ScreenBufferSize.Y = 25;
191 TextModeInfo.ScreenAttrib = Console->ActiveBuffer->ScreenBuffer.TextBuffer.ScreenDefaultAttrib;
192 TextModeInfo.PopupAttrib = Console->ActiveBuffer->ScreenBuffer.TextBuffer.PopupDefaultAttrib;
194 TextModeInfo.IsCursorVisible = Console->ActiveBuffer->CursorInfo.bVisible;
195 TextModeInfo.CursorSize = Console->ActiveBuffer->CursorInfo.dwSize;
200 * This is Windows' behaviour
203 /* Use the current console size. Regularize it if needed. */
204 TextModeInfo
.ScreenBufferSize
= Console
->ConsoleSize
;
205 if (TextModeInfo
.ScreenBufferSize
.X
== 0) TextModeInfo
.ScreenBufferSize
.X
= 1;
206 if (TextModeInfo
.ScreenBufferSize
.Y
== 0) TextModeInfo
.ScreenBufferSize
.Y
= 1;
208 /* If we have an active screen buffer, use its attributes as the new ones */
209 if (Console
->ActiveBuffer
&& GetType(Console
->ActiveBuffer
) == TEXTMODE_BUFFER
)
211 PTEXTMODE_SCREEN_BUFFER Buffer
= (PTEXTMODE_SCREEN_BUFFER
)Console
->ActiveBuffer
;
213 TextModeInfo
.ScreenAttrib
= Buffer
->ScreenDefaultAttrib
;
214 TextModeInfo
.PopupAttrib
= Buffer
->PopupDefaultAttrib
;
216 TextModeInfo
.IsCursorVisible
= Buffer
->CursorInfo
.bVisible
;
217 TextModeInfo
.CursorSize
= Buffer
->CursorInfo
.dwSize
;
220 else if (CreateScreenBufferRequest
->ScreenBufferType
== CONSOLE_GRAPHICS_BUFFER
)
222 /* Get infos from the graphics buffer information structure */
223 if (!CsrValidateMessageBuffer(ApiMessage
,
224 (PVOID
*)&CreateScreenBufferRequest
->GraphicsBufferInfo
.lpBitMapInfo
,
226 CreateScreenBufferRequest
->GraphicsBufferInfo
.dwBitMapInfoLength
))
228 Status
= STATUS_INVALID_PARAMETER
;
232 ScreenBufferInfo
= &GraphicsInfo
;
234 /* Initialize shared variables */
235 CreateScreenBufferRequest
->GraphicsBufferInfo
.hMutex
= GraphicsInfo
.Info
.hMutex
= INVALID_HANDLE_VALUE
;
236 CreateScreenBufferRequest
->GraphicsBufferInfo
.lpBitMap
= GraphicsInfo
.Info
.lpBitMap
= NULL
;
238 /* A graphics screen buffer is never inheritable */
239 CreateScreenBufferRequest
->Inheritable
= FALSE
;
242 Status
= ConDrvCreateScreenBuffer(&Buff
,
244 CreateScreenBufferRequest
->ScreenBufferType
,
246 if (!NT_SUCCESS(Status
)) goto Quit
;
248 /* Insert the new handle inside the process handles table */
249 RtlEnterCriticalSection(&ProcessData
->HandleTableLock
);
251 Status
= ConSrvInsertObject(ProcessData
,
252 &CreateScreenBufferRequest
->OutputHandle
,
254 CreateScreenBufferRequest
->Access
,
255 CreateScreenBufferRequest
->Inheritable
,
256 CreateScreenBufferRequest
->ShareMode
);
258 RtlLeaveCriticalSection(&ProcessData
->HandleTableLock
);
260 if (!NT_SUCCESS(Status
)) goto Quit
;
262 if (CreateScreenBufferRequest
->ScreenBufferType
== CONSOLE_GRAPHICS_BUFFER
)
264 PGRAPHICS_SCREEN_BUFFER Buffer
= (PGRAPHICS_SCREEN_BUFFER
)Buff
;
266 * Initialize the graphics buffer information structure
267 * and give it back to the client.
269 CreateScreenBufferRequest
->GraphicsBufferInfo
.hMutex
= Buffer
->ClientMutex
;
270 CreateScreenBufferRequest
->GraphicsBufferInfo
.lpBitMap
= Buffer
->ClientBitMap
;
274 ConSrvReleaseConsole(Console
, TRUE
);
279 ConDrvSetConsoleActiveScreenBuffer(IN PCONSOLE Console
,
280 IN PCONSOLE_SCREEN_BUFFER Buffer
);
281 CSR_API(SrvSetConsoleActiveScreenBuffer
)
284 PCONSOLE_SETACTIVESCREENBUFFER SetScreenBufferRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetScreenBufferRequest
;
285 PCONSOLE_SCREEN_BUFFER Buffer
;
287 DPRINT("SrvSetConsoleActiveScreenBuffer\n");
289 Status
= ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
290 SetScreenBufferRequest
->OutputHandle
,
291 &Buffer
, GENERIC_WRITE
, TRUE
);
292 if (!NT_SUCCESS(Status
)) return Status
;
294 Status
= ConDrvSetConsoleActiveScreenBuffer(Buffer
->Header
.Console
,
297 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
302 /* CSR THREADS FOR WriteConsole ***********************************************/
305 DoWriteConsole(IN PCSR_API_MESSAGE ApiMessage
,
306 IN PCSR_THREAD ClientThread
,
307 IN BOOL CreateWaitBlock OPTIONAL
);
309 // Wait function CSR_WAIT_FUNCTION
311 WriteConsoleThread(IN PLIST_ENTRY WaitList
,
312 IN PCSR_THREAD WaitThread
,
313 IN PCSR_API_MESSAGE WaitApiMessage
,
314 IN PVOID WaitContext
,
315 IN PVOID WaitArgument1
,
316 IN PVOID WaitArgument2
,
321 DPRINT("WriteConsoleThread - WaitContext = 0x%p, WaitArgument1 = 0x%p, WaitArgument2 = 0x%p, WaitFlags = %lu\n", WaitContext
, WaitArgument1
, WaitArgument2
, WaitFlags
);
324 * If we are notified of the process termination via a call
325 * to CsrNotifyWaitBlock triggered by CsrDestroyProcess or
326 * CsrDestroyThread, just return.
328 if (WaitFlags
& CsrProcessTerminating
)
330 Status
= STATUS_THREAD_IS_TERMINATING
;
334 Status
= DoWriteConsole(WaitApiMessage
,
339 if (Status
!= STATUS_PENDING
)
341 WaitApiMessage
->Status
= Status
;
344 return (Status
== STATUS_PENDING
? FALSE
: TRUE
);
348 ConDrvWriteConsole(IN PCONSOLE Console
,
349 IN PTEXTMODE_SCREEN_BUFFER ScreenBuffer
,
351 IN PVOID StringBuffer
,
352 IN ULONG NumCharsToWrite
,
353 OUT PULONG NumCharsWritten OPTIONAL
);
355 DoWriteConsole(IN PCSR_API_MESSAGE ApiMessage
,
356 IN PCSR_THREAD ClientThread
,
357 IN BOOL CreateWaitBlock OPTIONAL
)
360 PCONSOLE_WRITECONSOLE WriteConsoleRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteConsoleRequest
;
361 PTEXTMODE_SCREEN_BUFFER ScreenBuffer
;
363 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(ClientThread
->Process
),
364 WriteConsoleRequest
->OutputHandle
,
365 &ScreenBuffer
, GENERIC_WRITE
, FALSE
);
366 if (!NT_SUCCESS(Status
)) return Status
;
368 Status
= ConDrvWriteConsole(ScreenBuffer
->Header
.Console
,
370 WriteConsoleRequest
->Unicode
,
371 WriteConsoleRequest
->Buffer
,
372 WriteConsoleRequest
->NrCharactersToWrite
,
373 &WriteConsoleRequest
->NrCharactersWritten
);
375 if (Status
== STATUS_PENDING
)
379 if (!CsrCreateWait(&ScreenBuffer
->Header
.Console
->WriteWaitQueue
,
387 Status
= STATUS_NO_MEMORY
;
392 /* Wait until we un-pause the console */
393 // Status = STATUS_PENDING;
397 ConSrvReleaseScreenBuffer(ScreenBuffer
, FALSE
);
402 /* TEXT OUTPUT APIS ***********************************************************/
405 ConDrvReadConsoleOutput(IN PCONSOLE Console
,
406 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
408 OUT PCHAR_INFO CharInfo
/*Buffer*/,
409 IN PCOORD BufferSize
,
410 IN PCOORD BufferCoord
,
411 IN OUT PSMALL_RECT ReadRegion
);
412 CSR_API(SrvReadConsoleOutput
)
415 PCONSOLE_READOUTPUT ReadOutputRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ReadOutputRequest
;
416 PTEXTMODE_SCREEN_BUFFER Buffer
;
418 DPRINT("SrvReadConsoleOutput\n");
420 if (!CsrValidateMessageBuffer(ApiMessage
,
421 (PVOID
*)&ReadOutputRequest
->CharInfo
,
422 ReadOutputRequest
->BufferSize
.X
* ReadOutputRequest
->BufferSize
.Y
,
425 return STATUS_INVALID_PARAMETER
;
428 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
429 ReadOutputRequest
->OutputHandle
,
430 &Buffer
, GENERIC_READ
, TRUE
);
431 if (!NT_SUCCESS(Status
)) return Status
;
433 Status
= ConDrvReadConsoleOutput(Buffer
->Header
.Console
,
435 ReadOutputRequest
->Unicode
,
436 ReadOutputRequest
->CharInfo
,
437 &ReadOutputRequest
->BufferSize
,
438 &ReadOutputRequest
->BufferCoord
,
439 &ReadOutputRequest
->ReadRegion
);
441 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
446 ConDrvWriteConsoleOutput(IN PCONSOLE Console
,
447 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
449 IN PCHAR_INFO CharInfo
/*Buffer*/,
450 IN PCOORD BufferSize
,
451 IN PCOORD BufferCoord
,
452 IN OUT PSMALL_RECT WriteRegion
);
453 CSR_API(SrvWriteConsoleOutput
)
456 PCONSOLE_WRITEOUTPUT WriteOutputRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteOutputRequest
;
457 PTEXTMODE_SCREEN_BUFFER Buffer
;
459 DPRINT("SrvWriteConsoleOutput\n");
461 if (!CsrValidateMessageBuffer(ApiMessage
,
462 (PVOID
*)&WriteOutputRequest
->CharInfo
,
463 WriteOutputRequest
->BufferSize
.X
* WriteOutputRequest
->BufferSize
.Y
,
466 return STATUS_INVALID_PARAMETER
;
469 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
470 WriteOutputRequest
->OutputHandle
,
471 &Buffer
, GENERIC_WRITE
, TRUE
);
472 if (!NT_SUCCESS(Status
)) return Status
;
474 Status
= ConDrvWriteConsoleOutput(Buffer
->Header
.Console
,
476 WriteOutputRequest
->Unicode
,
477 WriteOutputRequest
->CharInfo
,
478 &WriteOutputRequest
->BufferSize
,
479 &WriteOutputRequest
->BufferCoord
,
480 &WriteOutputRequest
->WriteRegion
);
482 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
486 CSR_API(SrvWriteConsole
)
489 PCONSOLE_WRITECONSOLE WriteConsoleRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteConsoleRequest
;
491 DPRINT("SrvWriteConsole\n");
493 if (!CsrValidateMessageBuffer(ApiMessage
,
494 (PVOID
)&WriteConsoleRequest
->Buffer
,
495 WriteConsoleRequest
->BufferSize
,
498 return STATUS_INVALID_PARAMETER
;
501 Status
= DoWriteConsole(ApiMessage
,
502 CsrGetClientThread(),
505 if (Status
== STATUS_PENDING
) *ReplyCode
= CsrReplyPending
;
511 ConDrvReadConsoleOutputString(IN PCONSOLE Console
,
512 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
513 IN CODE_TYPE CodeType
,
514 OUT PVOID StringBuffer
,
515 IN ULONG NumCodesToRead
,
518 OUT PULONG CodesRead
);
519 CSR_API(SrvReadConsoleOutputString
)
522 PCONSOLE_READOUTPUTCODE ReadOutputCodeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ReadOutputCodeRequest
;
523 PTEXTMODE_SCREEN_BUFFER Buffer
;
526 DPRINT("SrvReadConsoleOutputString\n");
528 switch (ReadOutputCodeRequest
->CodeType
)
531 CodeSize
= sizeof(CHAR
);
535 CodeSize
= sizeof(WCHAR
);
539 CodeSize
= sizeof(WORD
);
543 return STATUS_INVALID_PARAMETER
;
546 if (!CsrValidateMessageBuffer(ApiMessage
,
547 (PVOID
*)&ReadOutputCodeRequest
->pCode
.pCode
,
548 ReadOutputCodeRequest
->NumCodesToRead
,
551 return STATUS_INVALID_PARAMETER
;
554 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
555 ReadOutputCodeRequest
->OutputHandle
,
556 &Buffer
, GENERIC_READ
, TRUE
);
557 if (!NT_SUCCESS(Status
)) return Status
;
559 Status
= ConDrvReadConsoleOutputString(Buffer
->Header
.Console
,
561 ReadOutputCodeRequest
->CodeType
,
562 ReadOutputCodeRequest
->pCode
.pCode
,
563 ReadOutputCodeRequest
->NumCodesToRead
,
564 &ReadOutputCodeRequest
->ReadCoord
,
565 &ReadOutputCodeRequest
->EndCoord
,
566 &ReadOutputCodeRequest
->CodesRead
);
568 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
573 ConDrvWriteConsoleOutputString(IN PCONSOLE Console
,
574 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
575 IN CODE_TYPE CodeType
,
576 IN PVOID StringBuffer
,
577 IN ULONG NumCodesToWrite
,
578 IN PCOORD WriteCoord
/*,
580 OUT PULONG CodesWritten */);
581 CSR_API(SrvWriteConsoleOutputString
)
584 PCONSOLE_WRITEOUTPUTCODE WriteOutputCodeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteOutputCodeRequest
;
585 PTEXTMODE_SCREEN_BUFFER Buffer
;
588 DPRINT("SrvWriteConsoleOutputString\n");
590 switch (WriteOutputCodeRequest
->CodeType
)
593 CodeSize
= sizeof(CHAR
);
597 CodeSize
= sizeof(WCHAR
);
601 CodeSize
= sizeof(WORD
);
605 return STATUS_INVALID_PARAMETER
;
608 if (!CsrValidateMessageBuffer(ApiMessage
,
609 (PVOID
*)&WriteOutputCodeRequest
->pCode
.pCode
,
610 WriteOutputCodeRequest
->Length
,
613 return STATUS_INVALID_PARAMETER
;
616 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
617 WriteOutputCodeRequest
->OutputHandle
,
618 &Buffer
, GENERIC_WRITE
, TRUE
);
619 if (!NT_SUCCESS(Status
)) return Status
;
621 Status
= ConDrvWriteConsoleOutputString(Buffer
->Header
.Console
,
623 WriteOutputCodeRequest
->CodeType
,
624 WriteOutputCodeRequest
->pCode
.pCode
,
625 WriteOutputCodeRequest
->Length
, // NumCodesToWrite,
626 &WriteOutputCodeRequest
->Coord
/*, // WriteCoord,
627 &WriteOutputCodeRequest->EndCoord,
628 &WriteOutputCodeRequest->NrCharactersWritten */);
630 // WriteOutputCodeRequest->NrCharactersWritten = Written;
632 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
637 ConDrvFillConsoleOutput(IN PCONSOLE Console
,
638 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
639 IN CODE_TYPE CodeType
,
641 IN ULONG NumCodesToWrite
,
642 IN PCOORD WriteCoord
/*,
643 OUT PULONG CodesWritten */);
644 CSR_API(SrvFillConsoleOutput
)
647 PCONSOLE_FILLOUTPUTCODE FillOutputRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.FillOutputRequest
;
648 PTEXTMODE_SCREEN_BUFFER Buffer
;
649 USHORT CodeType
= FillOutputRequest
->CodeType
;
651 DPRINT("SrvFillConsoleOutput\n");
653 if ( (CodeType
!= CODE_ASCII
) &&
654 (CodeType
!= CODE_UNICODE
) &&
655 (CodeType
!= CODE_ATTRIBUTE
) )
657 return STATUS_INVALID_PARAMETER
;
660 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
661 FillOutputRequest
->OutputHandle
,
662 &Buffer
, GENERIC_WRITE
, TRUE
);
663 if (!NT_SUCCESS(Status
)) return Status
;
665 Status
= ConDrvFillConsoleOutput(Buffer
->Header
.Console
,
668 &FillOutputRequest
->Code
,
669 FillOutputRequest
->Length
, // NumCodesToWrite,
670 &FillOutputRequest
->Coord
/*, // WriteCoord,
671 &FillOutputRequest->NrCharactersWritten */);
673 // FillOutputRequest->NrCharactersWritten = Written;
675 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
680 ConDrvGetConsoleScreenBufferInfo(IN PCONSOLE Console
,
681 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
682 OUT PCONSOLE_SCREEN_BUFFER_INFO ScreenBufferInfo
);
683 CSR_API(SrvGetConsoleScreenBufferInfo
)
686 PCONSOLE_GETSCREENBUFFERINFO ScreenBufferInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ScreenBufferInfoRequest
;
687 PTEXTMODE_SCREEN_BUFFER Buffer
;
689 DPRINT("SrvGetConsoleScreenBufferInfo\n");
691 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
692 ScreenBufferInfoRequest
->OutputHandle
,
693 &Buffer
, GENERIC_READ
, TRUE
);
694 if (!NT_SUCCESS(Status
)) return Status
;
696 Status
= ConDrvGetConsoleScreenBufferInfo(Buffer
->Header
.Console
,
698 &ScreenBufferInfoRequest
->Info
);
700 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
705 ConDrvSetConsoleTextAttribute(IN PCONSOLE Console
,
706 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
708 CSR_API(SrvSetConsoleTextAttribute
)
711 PCONSOLE_SETTEXTATTRIB SetTextAttribRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetTextAttribRequest
;
712 PTEXTMODE_SCREEN_BUFFER Buffer
;
714 DPRINT("SrvSetConsoleTextAttribute\n");
716 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
717 SetTextAttribRequest
->OutputHandle
,
718 &Buffer
, GENERIC_WRITE
, TRUE
);
719 if (!NT_SUCCESS(Status
)) return Status
;
721 Status
= ConDrvSetConsoleTextAttribute(Buffer
->Header
.Console
,
723 SetTextAttribRequest
->Attrib
);
725 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
730 ConDrvSetConsoleScreenBufferSize(IN PCONSOLE Console
,
731 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
733 CSR_API(SrvSetConsoleScreenBufferSize
)
736 PCONSOLE_SETSCREENBUFFERSIZE SetScreenBufferSizeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetScreenBufferSizeRequest
;
737 PTEXTMODE_SCREEN_BUFFER Buffer
;
739 DPRINT("SrvSetConsoleScreenBufferSize\n");
741 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
742 SetScreenBufferSizeRequest
->OutputHandle
,
743 &Buffer
, GENERIC_WRITE
, TRUE
);
744 if (!NT_SUCCESS(Status
)) return Status
;
746 Status
= ConDrvSetConsoleScreenBufferSize(Buffer
->Header
.Console
,
748 &SetScreenBufferSizeRequest
->Size
);
750 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
755 ConDrvScrollConsoleScreenBuffer(IN PCONSOLE Console
,
756 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
758 IN PSMALL_RECT ScrollRectangle
,
759 IN BOOLEAN UseClipRectangle
,
760 IN PSMALL_RECT ClipRectangle OPTIONAL
,
761 IN PCOORD DestinationOrigin
,
762 IN CHAR_INFO FillChar
);
763 CSR_API(SrvScrollConsoleScreenBuffer
)
766 PCONSOLE_SCROLLSCREENBUFFER ScrollScreenBufferRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ScrollScreenBufferRequest
;
767 PTEXTMODE_SCREEN_BUFFER Buffer
;
769 DPRINT("SrvScrollConsoleScreenBuffer\n");
771 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
772 ScrollScreenBufferRequest
->OutputHandle
,
773 &Buffer
, GENERIC_WRITE
, TRUE
);
774 if (!NT_SUCCESS(Status
)) return Status
;
776 Status
= ConDrvScrollConsoleScreenBuffer(Buffer
->Header
.Console
,
778 ScrollScreenBufferRequest
->Unicode
,
779 &ScrollScreenBufferRequest
->ScrollRectangle
,
780 ScrollScreenBufferRequest
->UseClipRectangle
,
781 &ScrollScreenBufferRequest
->ClipRectangle
,
782 &ScrollScreenBufferRequest
->DestinationOrigin
,
783 ScrollScreenBufferRequest
->Fill
);
785 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
790 ConDrvSetConsoleWindowInfo(IN PCONSOLE Console
,
791 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
793 IN PSMALL_RECT WindowRect
);
794 CSR_API(SrvSetConsoleWindowInfo
)
797 PCONSOLE_SETWINDOWINFO SetWindowInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetWindowInfoRequest
;
798 // PCONSOLE_SCREEN_BUFFER Buffer;
799 PTEXTMODE_SCREEN_BUFFER Buffer
;
801 DPRINT1("SrvSetConsoleWindowInfo(0x%08x, %d, {L%d, T%d, R%d, B%d}) called\n",
802 SetWindowInfoRequest
->OutputHandle
, SetWindowInfoRequest
->Absolute
,
803 SetWindowInfoRequest
->WindowRect
.Left
,
804 SetWindowInfoRequest
->WindowRect
.Top
,
805 SetWindowInfoRequest
->WindowRect
.Right
,
806 SetWindowInfoRequest
->WindowRect
.Bottom
);
808 // ConSrvGetScreenBuffer
809 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
810 SetWindowInfoRequest
->OutputHandle
,
811 &Buffer
, GENERIC_READ
, TRUE
);
812 if (!NT_SUCCESS(Status
)) return Status
;
814 Status
= ConDrvSetConsoleWindowInfo(Buffer
->Header
.Console
,
816 SetWindowInfoRequest
->Absolute
,
817 &SetWindowInfoRequest
->WindowRect
);
819 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);