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 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 ConDrvWriteConsole(IN PCONSOLE Console
,
319 IN PTEXTMODE_SCREEN_BUFFER ScreenBuffer
,
321 IN PVOID StringBuffer
,
322 IN ULONG NumCharsToWrite
,
323 OUT PULONG NumCharsWritten OPTIONAL
);
325 DoWriteConsole(IN PCSR_API_MESSAGE ApiMessage
,
326 IN PCSR_THREAD ClientThread
,
327 IN BOOL CreateWaitBlock OPTIONAL
)
330 PCONSOLE_WRITECONSOLE WriteConsoleRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteConsoleRequest
;
331 PTEXTMODE_SCREEN_BUFFER ScreenBuffer
;
333 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(ClientThread
->Process
),
334 WriteConsoleRequest
->OutputHandle
,
335 &ScreenBuffer
, GENERIC_WRITE
, FALSE
);
336 if (!NT_SUCCESS(Status
)) return Status
;
338 Status
= ConDrvWriteConsole(ScreenBuffer
->Header
.Console
,
340 WriteConsoleRequest
->Unicode
,
341 WriteConsoleRequest
->Buffer
,
342 WriteConsoleRequest
->NrCharactersToWrite
,
343 &WriteConsoleRequest
->NrCharactersWritten
);
345 if (Status
== STATUS_PENDING
)
349 if (!CsrCreateWait(&ScreenBuffer
->Header
.Console
->WriteWaitQueue
,
357 Status
= STATUS_NO_MEMORY
;
362 /* Wait until we un-pause the console */
363 // Status = STATUS_PENDING;
367 ConSrvReleaseScreenBuffer(ScreenBuffer
, FALSE
);
372 /* TEXT OUTPUT APIS ***********************************************************/
375 ConDrvReadConsoleOutput(IN PCONSOLE Console
,
376 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
378 OUT PCHAR_INFO CharInfo
/*Buffer*/,
379 IN PCOORD BufferSize
,
380 IN PCOORD BufferCoord
,
381 IN OUT PSMALL_RECT ReadRegion
);
382 CSR_API(SrvReadConsoleOutput
)
385 PCONSOLE_READOUTPUT ReadOutputRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ReadOutputRequest
;
386 PTEXTMODE_SCREEN_BUFFER Buffer
;
388 DPRINT("SrvReadConsoleOutput\n");
390 if (!CsrValidateMessageBuffer(ApiMessage
,
391 (PVOID
*)&ReadOutputRequest
->CharInfo
,
392 ReadOutputRequest
->BufferSize
.X
* ReadOutputRequest
->BufferSize
.Y
,
395 return STATUS_INVALID_PARAMETER
;
398 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
399 ReadOutputRequest
->OutputHandle
,
400 &Buffer
, GENERIC_READ
, TRUE
);
401 if (!NT_SUCCESS(Status
)) return Status
;
403 Status
= ConDrvReadConsoleOutput(Buffer
->Header
.Console
,
405 ReadOutputRequest
->Unicode
,
406 ReadOutputRequest
->CharInfo
,
407 &ReadOutputRequest
->BufferSize
,
408 &ReadOutputRequest
->BufferCoord
,
409 &ReadOutputRequest
->ReadRegion
);
411 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
416 ConDrvWriteConsoleOutput(IN PCONSOLE Console
,
417 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
419 IN PCHAR_INFO CharInfo
/*Buffer*/,
420 IN PCOORD BufferSize
,
421 IN PCOORD BufferCoord
,
422 IN OUT PSMALL_RECT WriteRegion
);
423 CSR_API(SrvWriteConsoleOutput
)
426 PCONSOLE_WRITEOUTPUT WriteOutputRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteOutputRequest
;
427 PTEXTMODE_SCREEN_BUFFER Buffer
;
429 DPRINT("SrvWriteConsoleOutput\n");
431 if (!CsrValidateMessageBuffer(ApiMessage
,
432 (PVOID
*)&WriteOutputRequest
->CharInfo
,
433 WriteOutputRequest
->BufferSize
.X
* WriteOutputRequest
->BufferSize
.Y
,
436 return STATUS_INVALID_PARAMETER
;
439 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
440 WriteOutputRequest
->OutputHandle
,
441 &Buffer
, GENERIC_WRITE
, TRUE
);
442 if (!NT_SUCCESS(Status
)) return Status
;
444 Status
= ConDrvWriteConsoleOutput(Buffer
->Header
.Console
,
446 WriteOutputRequest
->Unicode
,
447 WriteOutputRequest
->CharInfo
,
448 &WriteOutputRequest
->BufferSize
,
449 &WriteOutputRequest
->BufferCoord
,
450 &WriteOutputRequest
->WriteRegion
);
452 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
456 CSR_API(SrvWriteConsole
)
459 PCONSOLE_WRITECONSOLE WriteConsoleRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteConsoleRequest
;
461 DPRINT("SrvWriteConsole\n");
463 if (!CsrValidateMessageBuffer(ApiMessage
,
464 (PVOID
)&WriteConsoleRequest
->Buffer
,
465 WriteConsoleRequest
->BufferSize
,
468 return STATUS_INVALID_PARAMETER
;
471 Status
= DoWriteConsole(ApiMessage
,
472 CsrGetClientThread(),
475 if (Status
== STATUS_PENDING
) *ReplyCode
= CsrReplyPending
;
481 ConDrvReadConsoleOutputString(IN PCONSOLE Console
,
482 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
483 IN CODE_TYPE CodeType
,
484 OUT PVOID StringBuffer
,
485 IN ULONG NumCodesToRead
,
488 OUT PULONG CodesRead
);
489 CSR_API(SrvReadConsoleOutputString
)
492 PCONSOLE_READOUTPUTCODE ReadOutputCodeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ReadOutputCodeRequest
;
493 PTEXTMODE_SCREEN_BUFFER Buffer
;
496 DPRINT("SrvReadConsoleOutputString\n");
498 switch (ReadOutputCodeRequest
->CodeType
)
501 CodeSize
= sizeof(CHAR
);
505 CodeSize
= sizeof(WCHAR
);
509 CodeSize
= sizeof(WORD
);
513 return STATUS_INVALID_PARAMETER
;
516 if (!CsrValidateMessageBuffer(ApiMessage
,
517 (PVOID
*)&ReadOutputCodeRequest
->pCode
.pCode
,
518 ReadOutputCodeRequest
->NumCodesToRead
,
521 return STATUS_INVALID_PARAMETER
;
524 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
525 ReadOutputCodeRequest
->OutputHandle
,
526 &Buffer
, GENERIC_READ
, TRUE
);
527 if (!NT_SUCCESS(Status
)) return Status
;
529 Status
= ConDrvReadConsoleOutputString(Buffer
->Header
.Console
,
531 ReadOutputCodeRequest
->CodeType
,
532 ReadOutputCodeRequest
->pCode
.pCode
,
533 ReadOutputCodeRequest
->NumCodesToRead
,
534 &ReadOutputCodeRequest
->ReadCoord
,
535 &ReadOutputCodeRequest
->EndCoord
,
536 &ReadOutputCodeRequest
->CodesRead
);
538 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
543 ConDrvWriteConsoleOutputString(IN PCONSOLE Console
,
544 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
545 IN CODE_TYPE CodeType
,
546 IN PVOID StringBuffer
,
547 IN ULONG NumCodesToWrite
,
548 IN PCOORD WriteCoord
/*,
550 OUT PULONG CodesWritten */);
551 CSR_API(SrvWriteConsoleOutputString
)
554 PCONSOLE_WRITEOUTPUTCODE WriteOutputCodeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteOutputCodeRequest
;
555 PTEXTMODE_SCREEN_BUFFER Buffer
;
558 DPRINT("SrvWriteConsoleOutputString\n");
560 switch (WriteOutputCodeRequest
->CodeType
)
563 CodeSize
= sizeof(CHAR
);
567 CodeSize
= sizeof(WCHAR
);
571 CodeSize
= sizeof(WORD
);
575 return STATUS_INVALID_PARAMETER
;
578 if (!CsrValidateMessageBuffer(ApiMessage
,
579 (PVOID
*)&WriteOutputCodeRequest
->pCode
.pCode
,
580 WriteOutputCodeRequest
->Length
,
583 return STATUS_INVALID_PARAMETER
;
586 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
587 WriteOutputCodeRequest
->OutputHandle
,
588 &Buffer
, GENERIC_WRITE
, TRUE
);
589 if (!NT_SUCCESS(Status
)) return Status
;
591 Status
= ConDrvWriteConsoleOutputString(Buffer
->Header
.Console
,
593 WriteOutputCodeRequest
->CodeType
,
594 WriteOutputCodeRequest
->pCode
.pCode
,
595 WriteOutputCodeRequest
->Length
, // NumCodesToWrite,
596 &WriteOutputCodeRequest
->Coord
/*, // WriteCoord,
597 &WriteOutputCodeRequest->EndCoord,
598 &WriteOutputCodeRequest->NrCharactersWritten */);
600 // WriteOutputCodeRequest->NrCharactersWritten = Written;
602 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
607 ConDrvFillConsoleOutput(IN PCONSOLE Console
,
608 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
609 IN CODE_TYPE CodeType
,
611 IN ULONG NumCodesToWrite
,
612 IN PCOORD WriteCoord
/*,
613 OUT PULONG CodesWritten */);
614 CSR_API(SrvFillConsoleOutput
)
617 PCONSOLE_FILLOUTPUTCODE FillOutputRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.FillOutputRequest
;
618 PTEXTMODE_SCREEN_BUFFER Buffer
;
619 USHORT CodeType
= FillOutputRequest
->CodeType
;
621 DPRINT("SrvFillConsoleOutput\n");
623 if ( (CodeType
!= CODE_ASCII
) &&
624 (CodeType
!= CODE_UNICODE
) &&
625 (CodeType
!= CODE_ATTRIBUTE
) )
627 return STATUS_INVALID_PARAMETER
;
630 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
631 FillOutputRequest
->OutputHandle
,
632 &Buffer
, GENERIC_WRITE
, TRUE
);
633 if (!NT_SUCCESS(Status
)) return Status
;
635 Status
= ConDrvFillConsoleOutput(Buffer
->Header
.Console
,
638 &FillOutputRequest
->Code
,
639 FillOutputRequest
->Length
, // NumCodesToWrite,
640 &FillOutputRequest
->Coord
/*, // WriteCoord,
641 &FillOutputRequest->NrCharactersWritten */);
643 // FillOutputRequest->NrCharactersWritten = Written;
645 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
650 ConDrvGetConsoleScreenBufferInfo(IN PCONSOLE Console
,
651 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
652 OUT PCONSOLE_SCREEN_BUFFER_INFO ScreenBufferInfo
);
653 CSR_API(SrvGetConsoleScreenBufferInfo
)
656 PCONSOLE_GETSCREENBUFFERINFO ScreenBufferInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ScreenBufferInfoRequest
;
657 PTEXTMODE_SCREEN_BUFFER Buffer
;
659 DPRINT("SrvGetConsoleScreenBufferInfo\n");
661 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
662 ScreenBufferInfoRequest
->OutputHandle
,
663 &Buffer
, GENERIC_READ
, TRUE
);
664 if (!NT_SUCCESS(Status
)) return Status
;
666 Status
= ConDrvGetConsoleScreenBufferInfo(Buffer
->Header
.Console
,
668 &ScreenBufferInfoRequest
->Info
);
670 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
675 ConDrvSetConsoleTextAttribute(IN PCONSOLE Console
,
676 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
678 CSR_API(SrvSetConsoleTextAttribute
)
681 PCONSOLE_SETTEXTATTRIB SetTextAttribRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetTextAttribRequest
;
682 PTEXTMODE_SCREEN_BUFFER Buffer
;
684 DPRINT("SrvSetConsoleTextAttribute\n");
686 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
687 SetTextAttribRequest
->OutputHandle
,
688 &Buffer
, GENERIC_WRITE
, TRUE
);
689 if (!NT_SUCCESS(Status
)) return Status
;
691 Status
= ConDrvSetConsoleTextAttribute(Buffer
->Header
.Console
,
693 SetTextAttribRequest
->Attrib
);
695 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
700 ConDrvSetConsoleScreenBufferSize(IN PCONSOLE Console
,
701 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
703 CSR_API(SrvSetConsoleScreenBufferSize
)
706 PCONSOLE_SETSCREENBUFFERSIZE SetScreenBufferSizeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetScreenBufferSizeRequest
;
707 PTEXTMODE_SCREEN_BUFFER Buffer
;
709 DPRINT("SrvSetConsoleScreenBufferSize\n");
711 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
712 SetScreenBufferSizeRequest
->OutputHandle
,
713 &Buffer
, GENERIC_WRITE
, TRUE
);
714 if (!NT_SUCCESS(Status
)) return Status
;
716 Status
= ConDrvSetConsoleScreenBufferSize(Buffer
->Header
.Console
,
718 &SetScreenBufferSizeRequest
->Size
);
720 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
725 ConDrvScrollConsoleScreenBuffer(IN PCONSOLE Console
,
726 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
728 IN PSMALL_RECT ScrollRectangle
,
729 IN BOOLEAN UseClipRectangle
,
730 IN PSMALL_RECT ClipRectangle OPTIONAL
,
731 IN PCOORD DestinationOrigin
,
732 IN CHAR_INFO FillChar
);
733 CSR_API(SrvScrollConsoleScreenBuffer
)
736 PCONSOLE_SCROLLSCREENBUFFER ScrollScreenBufferRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ScrollScreenBufferRequest
;
737 PTEXTMODE_SCREEN_BUFFER Buffer
;
739 DPRINT("SrvScrollConsoleScreenBuffer\n");
741 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
742 ScrollScreenBufferRequest
->OutputHandle
,
743 &Buffer
, GENERIC_WRITE
, TRUE
);
744 if (!NT_SUCCESS(Status
)) return Status
;
746 Status
= ConDrvScrollConsoleScreenBuffer(Buffer
->Header
.Console
,
748 ScrollScreenBufferRequest
->Unicode
,
749 &ScrollScreenBufferRequest
->ScrollRectangle
,
750 ScrollScreenBufferRequest
->UseClipRectangle
,
751 &ScrollScreenBufferRequest
->ClipRectangle
,
752 &ScrollScreenBufferRequest
->DestinationOrigin
,
753 ScrollScreenBufferRequest
->Fill
);
755 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
760 ConDrvSetConsoleWindowInfo(IN PCONSOLE Console
,
761 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
763 IN PSMALL_RECT WindowRect
);
764 CSR_API(SrvSetConsoleWindowInfo
)
767 PCONSOLE_SETWINDOWINFO SetWindowInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetWindowInfoRequest
;
768 // PCONSOLE_SCREEN_BUFFER Buffer;
769 PTEXTMODE_SCREEN_BUFFER Buffer
;
771 DPRINT1("SrvSetConsoleWindowInfo(0x%08x, %d, {L%d, T%d, R%d, B%d}) called\n",
772 SetWindowInfoRequest
->OutputHandle
, SetWindowInfoRequest
->Absolute
,
773 SetWindowInfoRequest
->WindowRect
.Left
,
774 SetWindowInfoRequest
->WindowRect
.Top
,
775 SetWindowInfoRequest
->WindowRect
.Right
,
776 SetWindowInfoRequest
->WindowRect
.Bottom
);
778 // ConSrvGetScreenBuffer
779 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
780 SetWindowInfoRequest
->OutputHandle
,
781 &Buffer
, GENERIC_READ
, TRUE
);
782 if (!NT_SUCCESS(Status
)) return Status
;
784 Status
= ConDrvSetConsoleWindowInfo(Buffer
->Header
.Console
,
786 SetWindowInfoRequest
->Absolute
,
787 &SetWindowInfoRequest
->WindowRect
);
789 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);