2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Console Server DLL
4 * FILE: win32ss/user/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"
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 ConDrvGetConsoleCursorInfo(IN PCONSOLE Console
,
55 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
56 OUT PCONSOLE_CURSOR_INFO CursorInfo
);
57 CSR_API(SrvGetConsoleCursorInfo
)
60 PCONSOLE_GETSETCURSORINFO CursorInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.CursorInfoRequest
;
61 PTEXTMODE_SCREEN_BUFFER Buffer
;
63 DPRINT("SrvGetConsoleCursorInfo\n");
65 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
66 CursorInfoRequest
->OutputHandle
,
67 &Buffer
, GENERIC_READ
, TRUE
);
68 if (!NT_SUCCESS(Status
)) return Status
;
70 Status
= ConDrvGetConsoleCursorInfo(Buffer
->Header
.Console
,
72 &CursorInfoRequest
->Info
);
74 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
79 ConDrvSetConsoleCursorInfo(IN PCONSOLE Console
,
80 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
81 IN PCONSOLE_CURSOR_INFO CursorInfo
);
82 CSR_API(SrvSetConsoleCursorInfo
)
85 PCONSOLE_GETSETCURSORINFO CursorInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.CursorInfoRequest
;
86 PTEXTMODE_SCREEN_BUFFER Buffer
;
88 DPRINT("SrvSetConsoleCursorInfo\n");
90 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
91 CursorInfoRequest
->OutputHandle
,
92 &Buffer
, GENERIC_WRITE
, TRUE
);
93 if (!NT_SUCCESS(Status
)) return Status
;
95 Status
= ConDrvSetConsoleCursorInfo(Buffer
->Header
.Console
,
97 &CursorInfoRequest
->Info
);
99 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
104 ConDrvSetConsoleCursorPosition(IN PCONSOLE Console
,
105 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
107 CSR_API(SrvSetConsoleCursorPosition
)
110 PCONSOLE_SETCURSORPOSITION SetCursorPositionRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetCursorPositionRequest
;
111 PTEXTMODE_SCREEN_BUFFER Buffer
;
113 DPRINT("SrvSetConsoleCursorPosition\n");
115 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
116 SetCursorPositionRequest
->OutputHandle
,
117 &Buffer
, GENERIC_WRITE
, TRUE
);
118 if (!NT_SUCCESS(Status
)) return Status
;
120 Status
= ConDrvSetConsoleCursorPosition(Buffer
->Header
.Console
,
122 &SetCursorPositionRequest
->Position
);
124 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
128 CSR_API(SrvCreateConsoleScreenBuffer
)
130 NTSTATUS Status
= STATUS_INVALID_PARAMETER
;
131 PCONSOLE_CREATESCREENBUFFER CreateScreenBufferRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.CreateScreenBufferRequest
;
132 PCONSOLE_PROCESS_DATA ProcessData
= ConsoleGetPerProcessData(CsrGetClientThread()->Process
);
134 PCONSOLE_SCREEN_BUFFER Buff
;
136 PVOID ScreenBufferInfo
= NULL
;
137 TEXTMODE_BUFFER_INFO TextModeInfo
= {{80, 25},
138 DEFAULT_SCREEN_ATTRIB
,
139 DEFAULT_POPUP_ATTRIB
,
141 CSR_DEFAULT_CURSOR_SIZE
};
142 GRAPHICS_BUFFER_INFO GraphicsInfo
;
143 GraphicsInfo
.Info
= CreateScreenBufferRequest
->GraphicsBufferInfo
; // HACK for MSVC
145 DPRINT("SrvCreateConsoleScreenBuffer\n");
147 Status
= ConSrvGetConsole(ProcessData
, &Console
, TRUE
);
148 if (!NT_SUCCESS(Status
)) return Status
;
150 if (CreateScreenBufferRequest
->ScreenBufferType
== CONSOLE_TEXTMODE_BUFFER
)
152 ScreenBufferInfo
= &TextModeInfo
;
155 if (Console->ActiveBuffer)
157 TextModeInfo.ScreenBufferSize = Console->ActiveBuffer->ScreenBufferSize;
158 if (TextModeInfo.ScreenBufferSize.X == 0) TextModeInfo.ScreenBufferSize.X = 80;
159 if (TextModeInfo.ScreenBufferSize.Y == 0) TextModeInfo.ScreenBufferSize.Y = 25;
161 TextModeInfo.ScreenAttrib = Console->ActiveBuffer->ScreenBuffer.TextBuffer.ScreenDefaultAttrib;
162 TextModeInfo.PopupAttrib = Console->ActiveBuffer->ScreenBuffer.TextBuffer.PopupDefaultAttrib;
164 TextModeInfo.IsCursorVisible = Console->ActiveBuffer->CursorInfo.bVisible;
165 TextModeInfo.CursorSize = Console->ActiveBuffer->CursorInfo.dwSize;
170 * This is Windows' behaviour
173 /* Use the current console size. Regularize it if needed. */
174 TextModeInfo
.ScreenBufferSize
= Console
->ConsoleSize
;
175 if (TextModeInfo
.ScreenBufferSize
.X
== 0) TextModeInfo
.ScreenBufferSize
.X
= 1;
176 if (TextModeInfo
.ScreenBufferSize
.Y
== 0) TextModeInfo
.ScreenBufferSize
.Y
= 1;
178 /* If we have an active screen buffer, use its attributes as the new ones */
179 if (Console
->ActiveBuffer
&& GetType(Console
->ActiveBuffer
) == TEXTMODE_BUFFER
)
181 PTEXTMODE_SCREEN_BUFFER Buffer
= (PTEXTMODE_SCREEN_BUFFER
)Console
->ActiveBuffer
;
183 TextModeInfo
.ScreenAttrib
= Buffer
->ScreenDefaultAttrib
;
184 TextModeInfo
.PopupAttrib
= Buffer
->PopupDefaultAttrib
;
186 TextModeInfo
.IsCursorVisible
= Buffer
->CursorInfo
.bVisible
;
187 TextModeInfo
.CursorSize
= Buffer
->CursorInfo
.dwSize
;
190 else if (CreateScreenBufferRequest
->ScreenBufferType
== CONSOLE_GRAPHICS_BUFFER
)
192 /* Get infos from the graphics buffer information structure */
193 if (!CsrValidateMessageBuffer(ApiMessage
,
194 (PVOID
*)&CreateScreenBufferRequest
->GraphicsBufferInfo
.lpBitMapInfo
,
196 CreateScreenBufferRequest
->GraphicsBufferInfo
.dwBitMapInfoLength
))
198 Status
= STATUS_INVALID_PARAMETER
;
202 ScreenBufferInfo
= &GraphicsInfo
;
204 /* Initialize shared variables */
205 CreateScreenBufferRequest
->GraphicsBufferInfo
.hMutex
= GraphicsInfo
.Info
.hMutex
= INVALID_HANDLE_VALUE
;
206 CreateScreenBufferRequest
->GraphicsBufferInfo
.lpBitMap
= GraphicsInfo
.Info
.lpBitMap
= NULL
;
208 /* A graphics screen buffer is never inheritable */
209 CreateScreenBufferRequest
->Inheritable
= FALSE
;
212 Status
= ConDrvCreateScreenBuffer(&Buff
,
214 CreateScreenBufferRequest
->ScreenBufferType
,
216 if (!NT_SUCCESS(Status
)) goto Quit
;
218 /* Insert the new handle inside the process handles table */
219 RtlEnterCriticalSection(&ProcessData
->HandleTableLock
);
221 Status
= ConSrvInsertObject(ProcessData
,
222 &CreateScreenBufferRequest
->OutputHandle
,
224 CreateScreenBufferRequest
->Access
,
225 CreateScreenBufferRequest
->Inheritable
,
226 CreateScreenBufferRequest
->ShareMode
);
228 RtlLeaveCriticalSection(&ProcessData
->HandleTableLock
);
230 if (!NT_SUCCESS(Status
)) goto Quit
;
232 if (CreateScreenBufferRequest
->ScreenBufferType
== CONSOLE_GRAPHICS_BUFFER
)
234 PGRAPHICS_SCREEN_BUFFER Buffer
= (PGRAPHICS_SCREEN_BUFFER
)Buff
;
236 * Initialize the graphics buffer information structure
237 * and give it back to the client.
239 CreateScreenBufferRequest
->GraphicsBufferInfo
.hMutex
= Buffer
->ClientMutex
;
240 CreateScreenBufferRequest
->GraphicsBufferInfo
.lpBitMap
= Buffer
->ClientBitMap
;
244 ConSrvReleaseConsole(Console
, TRUE
);
249 ConDrvSetConsoleActiveScreenBuffer(IN PCONSOLE Console
,
250 IN PCONSOLE_SCREEN_BUFFER Buffer
);
251 CSR_API(SrvSetConsoleActiveScreenBuffer
)
254 PCONSOLE_SETACTIVESCREENBUFFER SetScreenBufferRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetScreenBufferRequest
;
255 PCONSOLE_SCREEN_BUFFER Buffer
;
257 DPRINT("SrvSetConsoleActiveScreenBuffer\n");
259 Status
= ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
260 SetScreenBufferRequest
->OutputHandle
,
261 &Buffer
, GENERIC_WRITE
, TRUE
);
262 if (!NT_SUCCESS(Status
)) return Status
;
264 Status
= ConDrvSetConsoleActiveScreenBuffer(Buffer
->Header
.Console
,
267 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
272 /* CSR THREADS FOR WriteConsole ***********************************************/
275 DoWriteConsole(IN PCSR_API_MESSAGE ApiMessage
,
276 IN PCSR_THREAD ClientThread
,
277 IN BOOL CreateWaitBlock OPTIONAL
);
279 // Wait function CSR_WAIT_FUNCTION
281 WriteConsoleThread(IN PLIST_ENTRY WaitList
,
282 IN PCSR_THREAD WaitThread
,
283 IN PCSR_API_MESSAGE WaitApiMessage
,
284 IN PVOID WaitContext
,
285 IN PVOID WaitArgument1
,
286 IN PVOID WaitArgument2
,
291 DPRINT("WriteConsoleThread - WaitContext = 0x%p, WaitArgument1 = 0x%p, WaitArgument2 = 0x%p, WaitFlags = %lu\n", WaitContext
, WaitArgument1
, WaitArgument2
, WaitFlags
);
294 * If we are notified of the process termination via a call
295 * to CsrNotifyWaitBlock triggered by CsrDestroyProcess or
296 * CsrDestroyThread, just return.
298 if (WaitFlags
& CsrProcessTerminating
)
300 Status
= STATUS_THREAD_IS_TERMINATING
;
304 Status
= DoWriteConsole(WaitApiMessage
,
309 if (Status
!= STATUS_PENDING
)
311 WaitApiMessage
->Status
= Status
;
314 return (Status
== STATUS_PENDING
? FALSE
: TRUE
);
318 DoWriteConsole(IN PCSR_API_MESSAGE ApiMessage
,
319 IN PCSR_THREAD ClientThread
,
320 IN BOOL CreateWaitBlock OPTIONAL
)
322 NTSTATUS Status
= STATUS_SUCCESS
;
323 PCONSOLE_WRITECONSOLE WriteConsoleRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteConsoleRequest
;
325 PTEXTMODE_SCREEN_BUFFER Buff
;
330 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(ClientThread
->Process
), WriteConsoleRequest
->OutputHandle
, &Buff
, GENERIC_WRITE
, FALSE
);
331 if (!NT_SUCCESS(Status
)) return Status
;
333 Console
= Buff
->Header
.Console
;
335 // if (Console->PauseFlags & (PAUSED_FROM_KEYBOARD | PAUSED_FROM_SCROLLBAR | PAUSED_FROM_SELECTION))
336 if (Console
->PauseFlags
&& Console
->UnpauseEvent
!= NULL
)
340 if (!CsrCreateWait(&Console
->WriteWaitQueue
,
348 ConSrvReleaseScreenBuffer(Buff
, FALSE
);
349 return STATUS_NO_MEMORY
;
353 /* Wait until we un-pause the console */
354 Status
= STATUS_PENDING
;
358 if (WriteConsoleRequest
->Unicode
)
360 Buffer
= WriteConsoleRequest
->Buffer
;
364 Length
= MultiByteToWideChar(Console
->OutputCodePage
, 0,
365 (PCHAR
)WriteConsoleRequest
->Buffer
,
366 WriteConsoleRequest
->NrCharactersToWrite
,
368 Buffer
= RtlAllocateHeap(RtlGetProcessHeap(), 0, Length
* sizeof(WCHAR
));
371 MultiByteToWideChar(Console
->OutputCodePage
, 0,
372 (PCHAR
)WriteConsoleRequest
->Buffer
,
373 WriteConsoleRequest
->NrCharactersToWrite
,
374 (PWCHAR
)Buffer
, Length
);
378 Status
= STATUS_NO_MEMORY
;
384 if (NT_SUCCESS(Status
))
386 Status
= ConioWriteConsole(Console
,
389 WriteConsoleRequest
->NrCharactersToWrite
,
391 if (NT_SUCCESS(Status
))
393 Written
= WriteConsoleRequest
->NrCharactersToWrite
;
397 if (!WriteConsoleRequest
->Unicode
)
398 RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer
);
401 WriteConsoleRequest
->NrCharactersWritten
= Written
;
404 ConSrvReleaseScreenBuffer(Buff
, FALSE
);
409 /* TEXT OUTPUT APIS ***********************************************************/
412 ConDrvReadConsoleOutput(IN PCONSOLE Console
,
413 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
415 OUT PCHAR_INFO CharInfo
/*Buffer*/,
416 IN PCOORD BufferSize
,
417 IN PCOORD BufferCoord
,
418 IN OUT PSMALL_RECT ReadRegion
);
419 CSR_API(SrvReadConsoleOutput
)
422 PCONSOLE_READOUTPUT ReadOutputRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ReadOutputRequest
;
423 PTEXTMODE_SCREEN_BUFFER Buffer
;
425 DPRINT("SrvReadConsoleOutput\n");
427 if (!CsrValidateMessageBuffer(ApiMessage
,
428 (PVOID
*)&ReadOutputRequest
->CharInfo
,
429 ReadOutputRequest
->BufferSize
.X
* ReadOutputRequest
->BufferSize
.Y
,
432 return STATUS_INVALID_PARAMETER
;
435 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
436 ReadOutputRequest
->OutputHandle
,
437 &Buffer
, GENERIC_READ
, TRUE
);
438 if (!NT_SUCCESS(Status
)) return Status
;
440 Status
= ConDrvReadConsoleOutput(Buffer
->Header
.Console
,
442 ReadOutputRequest
->Unicode
,
443 ReadOutputRequest
->CharInfo
,
444 &ReadOutputRequest
->BufferSize
,
445 &ReadOutputRequest
->BufferCoord
,
446 &ReadOutputRequest
->ReadRegion
);
448 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
453 ConDrvWriteConsoleOutput(IN PCONSOLE Console
,
454 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
456 IN PCHAR_INFO CharInfo
/*Buffer*/,
457 IN PCOORD BufferSize
,
458 IN PCOORD BufferCoord
,
459 IN OUT PSMALL_RECT WriteRegion
);
460 CSR_API(SrvWriteConsoleOutput
)
463 PCONSOLE_WRITEOUTPUT WriteOutputRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteOutputRequest
;
464 PTEXTMODE_SCREEN_BUFFER Buffer
;
466 DPRINT("SrvWriteConsoleOutput\n");
468 if (!CsrValidateMessageBuffer(ApiMessage
,
469 (PVOID
*)&WriteOutputRequest
->CharInfo
,
470 WriteOutputRequest
->BufferSize
.X
* WriteOutputRequest
->BufferSize
.Y
,
473 return STATUS_INVALID_PARAMETER
;
476 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
477 WriteOutputRequest
->OutputHandle
,
478 &Buffer
, GENERIC_WRITE
, TRUE
);
479 if (!NT_SUCCESS(Status
)) return Status
;
481 Status
= ConDrvWriteConsoleOutput(Buffer
->Header
.Console
,
483 WriteOutputRequest
->Unicode
,
484 WriteOutputRequest
->CharInfo
,
485 &WriteOutputRequest
->BufferSize
,
486 &WriteOutputRequest
->BufferCoord
,
487 &WriteOutputRequest
->WriteRegion
);
489 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
493 CSR_API(SrvWriteConsole
)
496 PCONSOLE_WRITECONSOLE WriteConsoleRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteConsoleRequest
;
498 DPRINT("SrvWriteConsole\n");
500 if (!CsrValidateMessageBuffer(ApiMessage
,
501 (PVOID
)&WriteConsoleRequest
->Buffer
,
502 WriteConsoleRequest
->BufferSize
,
505 return STATUS_INVALID_PARAMETER
;
508 Status
= DoWriteConsole(ApiMessage
,
509 CsrGetClientThread(),
512 if (Status
== STATUS_PENDING
)
513 *ReplyCode
= CsrReplyPending
;
519 ConDrvReadConsoleOutputString(IN PCONSOLE Console
,
520 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
521 IN CODE_TYPE CodeType
,
522 OUT PVOID StringBuffer
,
523 IN ULONG NumCodesToRead
,
526 OUT PULONG CodesRead
);
527 CSR_API(SrvReadConsoleOutputString
)
530 PCONSOLE_READOUTPUTCODE ReadOutputCodeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ReadOutputCodeRequest
;
531 PTEXTMODE_SCREEN_BUFFER Buffer
;
534 DPRINT("SrvReadConsoleOutputString\n");
536 switch (ReadOutputCodeRequest
->CodeType
)
539 CodeSize
= sizeof(CHAR
);
543 CodeSize
= sizeof(WCHAR
);
547 CodeSize
= sizeof(WORD
);
551 return STATUS_INVALID_PARAMETER
;
554 if (!CsrValidateMessageBuffer(ApiMessage
,
555 (PVOID
*)&ReadOutputCodeRequest
->pCode
.pCode
,
556 ReadOutputCodeRequest
->NumCodesToRead
,
559 return STATUS_INVALID_PARAMETER
;
562 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
563 ReadOutputCodeRequest
->OutputHandle
,
564 &Buffer
, GENERIC_READ
, TRUE
);
565 if (!NT_SUCCESS(Status
)) return Status
;
567 Status
= ConDrvReadConsoleOutputString(Buffer
->Header
.Console
,
569 ReadOutputCodeRequest
->CodeType
,
570 ReadOutputCodeRequest
->pCode
.pCode
,
571 ReadOutputCodeRequest
->NumCodesToRead
,
572 &ReadOutputCodeRequest
->ReadCoord
,
573 &ReadOutputCodeRequest
->EndCoord
,
574 &ReadOutputCodeRequest
->CodesRead
);
576 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
581 ConDrvWriteConsoleOutputString(IN PCONSOLE Console
,
582 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
583 IN CODE_TYPE CodeType
,
584 IN PVOID StringBuffer
,
585 IN ULONG NumCodesToWrite
,
586 IN PCOORD WriteCoord
/*,
588 OUT PULONG CodesWritten */);
589 CSR_API(SrvWriteConsoleOutputString
)
592 PCONSOLE_WRITEOUTPUTCODE WriteOutputCodeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteOutputCodeRequest
;
593 PTEXTMODE_SCREEN_BUFFER Buffer
;
596 DPRINT("SrvWriteConsoleOutputString\n");
598 switch (WriteOutputCodeRequest
->CodeType
)
601 CodeSize
= sizeof(CHAR
);
605 CodeSize
= sizeof(WCHAR
);
609 CodeSize
= sizeof(WORD
);
613 return STATUS_INVALID_PARAMETER
;
616 if (!CsrValidateMessageBuffer(ApiMessage
,
617 (PVOID
*)&WriteOutputCodeRequest
->pCode
.pCode
,
618 WriteOutputCodeRequest
->Length
,
621 return STATUS_INVALID_PARAMETER
;
624 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
625 WriteOutputCodeRequest
->OutputHandle
,
626 &Buffer
, GENERIC_WRITE
, TRUE
);
627 if (!NT_SUCCESS(Status
)) return Status
;
629 Status
= ConDrvWriteConsoleOutputString(Buffer
->Header
.Console
,
631 WriteOutputCodeRequest
->CodeType
,
632 WriteOutputCodeRequest
->pCode
.pCode
,
633 WriteOutputCodeRequest
->Length
, // NumCodesToWrite,
634 &WriteOutputCodeRequest
->Coord
/*, // WriteCoord,
635 &WriteOutputCodeRequest->EndCoord,
636 &WriteOutputCodeRequest->NrCharactersWritten */);
638 // WriteOutputCodeRequest->NrCharactersWritten = Written;
640 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
645 ConDrvFillConsoleOutput(IN PCONSOLE Console
,
646 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
647 IN CODE_TYPE CodeType
,
649 IN ULONG NumCodesToWrite
,
650 IN PCOORD WriteCoord
/*,
651 OUT PULONG CodesWritten */);
652 CSR_API(SrvFillConsoleOutput
)
655 PCONSOLE_FILLOUTPUTCODE FillOutputRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.FillOutputRequest
;
656 PTEXTMODE_SCREEN_BUFFER Buffer
;
657 USHORT CodeType
= FillOutputRequest
->CodeType
;
659 DPRINT("SrvFillConsoleOutput\n");
661 if ( (CodeType
!= CODE_ASCII
) &&
662 (CodeType
!= CODE_UNICODE
) &&
663 (CodeType
!= CODE_ATTRIBUTE
) )
665 return STATUS_INVALID_PARAMETER
;
668 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
669 FillOutputRequest
->OutputHandle
,
670 &Buffer
, GENERIC_WRITE
, TRUE
);
671 if (!NT_SUCCESS(Status
)) return Status
;
673 Status
= ConDrvFillConsoleOutput(Buffer
->Header
.Console
,
676 &FillOutputRequest
->Code
,
677 FillOutputRequest
->Length
, // NumCodesToWrite,
678 &FillOutputRequest
->Coord
/*, // WriteCoord,
679 &FillOutputRequest->NrCharactersWritten */);
681 // FillOutputRequest->NrCharactersWritten = Written;
683 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
688 ConDrvGetConsoleScreenBufferInfo(IN PCONSOLE Console
,
689 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
690 OUT PCONSOLE_SCREEN_BUFFER_INFO ScreenBufferInfo
);
691 CSR_API(SrvGetConsoleScreenBufferInfo
)
694 PCONSOLE_GETSCREENBUFFERINFO ScreenBufferInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ScreenBufferInfoRequest
;
695 PTEXTMODE_SCREEN_BUFFER Buffer
;
697 DPRINT("SrvGetConsoleScreenBufferInfo\n");
699 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
700 ScreenBufferInfoRequest
->OutputHandle
,
701 &Buffer
, GENERIC_READ
, TRUE
);
702 if (!NT_SUCCESS(Status
)) return Status
;
704 Status
= ConDrvGetConsoleScreenBufferInfo(Buffer
->Header
.Console
,
706 &ScreenBufferInfoRequest
->Info
);
708 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
713 ConDrvSetConsoleTextAttribute(IN PCONSOLE Console
,
714 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
716 CSR_API(SrvSetConsoleTextAttribute
)
719 PCONSOLE_SETTEXTATTRIB SetTextAttribRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetTextAttribRequest
;
720 PTEXTMODE_SCREEN_BUFFER Buffer
;
722 DPRINT("SrvSetConsoleTextAttribute\n");
724 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
725 SetTextAttribRequest
->OutputHandle
,
726 &Buffer
, GENERIC_WRITE
, TRUE
);
727 if (!NT_SUCCESS(Status
)) return Status
;
729 Status
= ConDrvSetConsoleTextAttribute(Buffer
->Header
.Console
,
731 SetTextAttribRequest
->Attrib
);
733 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
738 ConDrvSetConsoleScreenBufferSize(IN PCONSOLE Console
,
739 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
741 CSR_API(SrvSetConsoleScreenBufferSize
)
744 PCONSOLE_SETSCREENBUFFERSIZE SetScreenBufferSizeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetScreenBufferSizeRequest
;
745 PTEXTMODE_SCREEN_BUFFER Buffer
;
747 DPRINT("SrvSetConsoleScreenBufferSize\n");
749 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
750 SetScreenBufferSizeRequest
->OutputHandle
,
751 &Buffer
, GENERIC_WRITE
, TRUE
);
752 if (!NT_SUCCESS(Status
)) return Status
;
754 Status
= ConDrvSetConsoleScreenBufferSize(Buffer
->Header
.Console
,
756 &SetScreenBufferSizeRequest
->Size
);
758 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
763 ConDrvScrollConsoleScreenBuffer(IN PCONSOLE Console
,
764 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
766 IN PSMALL_RECT ScrollRectangle
,
767 IN BOOLEAN UseClipRectangle
,
768 IN PSMALL_RECT ClipRectangle OPTIONAL
,
769 IN PCOORD DestinationOrigin
,
770 IN CHAR_INFO FillChar
);
771 CSR_API(SrvScrollConsoleScreenBuffer
)
774 PCONSOLE_SCROLLSCREENBUFFER ScrollScreenBufferRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ScrollScreenBufferRequest
;
775 PTEXTMODE_SCREEN_BUFFER Buffer
;
777 DPRINT("SrvScrollConsoleScreenBuffer\n");
779 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
780 ScrollScreenBufferRequest
->OutputHandle
,
781 &Buffer
, GENERIC_WRITE
, TRUE
);
782 if (!NT_SUCCESS(Status
)) return Status
;
784 Status
= ConDrvScrollConsoleScreenBuffer(Buffer
->Header
.Console
,
786 ScrollScreenBufferRequest
->Unicode
,
787 &ScrollScreenBufferRequest
->ScrollRectangle
,
788 ScrollScreenBufferRequest
->UseClipRectangle
,
789 &ScrollScreenBufferRequest
->ClipRectangle
,
790 &ScrollScreenBufferRequest
->DestinationOrigin
,
791 ScrollScreenBufferRequest
->Fill
);
793 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);