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/term.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 PCONSOLE_SCREEN_BUFFER Buffer
,
57 IN HPALETTE PaletteHandle
,
58 IN UINT PaletteUsage
);
59 CSR_API(SrvSetConsolePalette
)
62 PCONSOLE_SETPALETTE SetPaletteRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetPaletteRequest
;
63 // PGRAPHICS_SCREEN_BUFFER Buffer;
64 PCONSOLE_SCREEN_BUFFER Buffer
;
66 DPRINT("SrvSetConsolePalette\n");
68 // NOTE: Tests show that this function is used only for graphics screen buffers
69 // and otherwise it returns FALSE + sets last error to invalid handle.
70 // I think it's ridiculous, because if you are in text mode, simulating
71 // a change of VGA palette via DAC registers (done by a call to SetConsolePalette)
72 // cannot be done... So I allow it in ReactOS !
74 Status = ConSrvGetGraphicsBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
75 SetPaletteRequest->OutputHandle,
76 &Buffer, GENERIC_WRITE, TRUE);
78 Status
= ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
79 SetPaletteRequest
->OutputHandle
,
80 &Buffer
, GENERIC_WRITE
, TRUE
);
81 if (!NT_SUCCESS(Status
)) return Status
;
84 * Make the palette handle public, so that it can be
85 * used by other threads calling GDI functions on it.
86 * Indeed, the palette handle comes from a console app
87 * calling ourselves, running in CSRSS.
89 NtUserConsoleControl(ConsoleMakePalettePublic
,
90 &SetPaletteRequest
->PaletteHandle
,
91 sizeof(SetPaletteRequest
->PaletteHandle
));
93 Status
= ConDrvSetConsolePalette(Buffer
->Header
.Console
,
95 SetPaletteRequest
->PaletteHandle
,
96 SetPaletteRequest
->Usage
);
98 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
103 ConDrvGetConsoleCursorInfo(IN PCONSOLE Console
,
104 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
105 OUT PCONSOLE_CURSOR_INFO CursorInfo
);
106 CSR_API(SrvGetConsoleCursorInfo
)
109 PCONSOLE_GETSETCURSORINFO CursorInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.CursorInfoRequest
;
110 PTEXTMODE_SCREEN_BUFFER Buffer
;
112 DPRINT("SrvGetConsoleCursorInfo\n");
114 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
115 CursorInfoRequest
->OutputHandle
,
116 &Buffer
, GENERIC_READ
, TRUE
);
117 if (!NT_SUCCESS(Status
)) return Status
;
119 Status
= ConDrvGetConsoleCursorInfo(Buffer
->Header
.Console
,
121 &CursorInfoRequest
->Info
);
123 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
128 ConDrvSetConsoleCursorInfo(IN PCONSOLE Console
,
129 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
130 IN PCONSOLE_CURSOR_INFO CursorInfo
);
131 CSR_API(SrvSetConsoleCursorInfo
)
134 PCONSOLE_GETSETCURSORINFO CursorInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.CursorInfoRequest
;
135 PTEXTMODE_SCREEN_BUFFER Buffer
;
137 DPRINT("SrvSetConsoleCursorInfo\n");
139 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
140 CursorInfoRequest
->OutputHandle
,
141 &Buffer
, GENERIC_WRITE
, TRUE
);
142 if (!NT_SUCCESS(Status
)) return Status
;
144 Status
= ConDrvSetConsoleCursorInfo(Buffer
->Header
.Console
,
146 &CursorInfoRequest
->Info
);
148 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
153 ConDrvSetConsoleCursorPosition(IN PCONSOLE Console
,
154 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
156 CSR_API(SrvSetConsoleCursorPosition
)
159 PCONSOLE_SETCURSORPOSITION SetCursorPositionRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetCursorPositionRequest
;
160 PTEXTMODE_SCREEN_BUFFER Buffer
;
162 DPRINT("SrvSetConsoleCursorPosition\n");
164 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
165 SetCursorPositionRequest
->OutputHandle
,
166 &Buffer
, GENERIC_WRITE
, TRUE
);
167 if (!NT_SUCCESS(Status
)) return Status
;
169 Status
= ConDrvSetConsoleCursorPosition(Buffer
->Header
.Console
,
171 &SetCursorPositionRequest
->Position
);
173 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
177 CSR_API(SrvCreateConsoleScreenBuffer
)
179 NTSTATUS Status
= STATUS_INVALID_PARAMETER
;
180 PCONSOLE_CREATESCREENBUFFER CreateScreenBufferRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.CreateScreenBufferRequest
;
181 PCONSOLE_PROCESS_DATA ProcessData
= ConsoleGetPerProcessData(CsrGetClientThread()->Process
);
183 PCONSOLE_SCREEN_BUFFER Buff
;
185 PVOID ScreenBufferInfo
= NULL
;
186 TEXTMODE_BUFFER_INFO TextModeInfo
= {{80, 25},
187 DEFAULT_SCREEN_ATTRIB
,
188 DEFAULT_POPUP_ATTRIB
,
190 CSR_DEFAULT_CURSOR_SIZE
};
191 GRAPHICS_BUFFER_INFO GraphicsInfo
;
192 GraphicsInfo
.Info
= CreateScreenBufferRequest
->GraphicsBufferInfo
; // HACK for MSVC
194 DPRINT("SrvCreateConsoleScreenBuffer\n");
196 Status
= ConSrvGetConsole(ProcessData
, &Console
, TRUE
);
197 if (!NT_SUCCESS(Status
)) return Status
;
199 if (CreateScreenBufferRequest
->ScreenBufferType
== CONSOLE_TEXTMODE_BUFFER
)
201 ScreenBufferInfo
= &TextModeInfo
;
204 if (Console->ActiveBuffer)
206 TextModeInfo.ScreenBufferSize = Console->ActiveBuffer->ScreenBufferSize;
207 if (TextModeInfo.ScreenBufferSize.X == 0) TextModeInfo.ScreenBufferSize.X = 80;
208 if (TextModeInfo.ScreenBufferSize.Y == 0) TextModeInfo.ScreenBufferSize.Y = 25;
210 TextModeInfo.ScreenAttrib = Console->ActiveBuffer->ScreenBuffer.TextBuffer.ScreenDefaultAttrib;
211 TextModeInfo.PopupAttrib = Console->ActiveBuffer->ScreenBuffer.TextBuffer.PopupDefaultAttrib;
213 TextModeInfo.IsCursorVisible = Console->ActiveBuffer->CursorInfo.bVisible;
214 TextModeInfo.CursorSize = Console->ActiveBuffer->CursorInfo.dwSize;
219 * This is Windows' behaviour
222 /* Use the current console size. Regularize it if needed. */
223 TextModeInfo
.ScreenBufferSize
= Console
->ConsoleSize
;
224 if (TextModeInfo
.ScreenBufferSize
.X
== 0) TextModeInfo
.ScreenBufferSize
.X
= 1;
225 if (TextModeInfo
.ScreenBufferSize
.Y
== 0) TextModeInfo
.ScreenBufferSize
.Y
= 1;
227 /* If we have an active screen buffer, use its attributes as the new ones */
228 if (Console
->ActiveBuffer
&& GetType(Console
->ActiveBuffer
) == TEXTMODE_BUFFER
)
230 PTEXTMODE_SCREEN_BUFFER Buffer
= (PTEXTMODE_SCREEN_BUFFER
)Console
->ActiveBuffer
;
232 TextModeInfo
.ScreenAttrib
= Buffer
->ScreenDefaultAttrib
;
233 TextModeInfo
.PopupAttrib
= Buffer
->PopupDefaultAttrib
;
235 TextModeInfo
.IsCursorVisible
= Buffer
->CursorInfo
.bVisible
;
236 TextModeInfo
.CursorSize
= Buffer
->CursorInfo
.dwSize
;
239 else if (CreateScreenBufferRequest
->ScreenBufferType
== CONSOLE_GRAPHICS_BUFFER
)
241 /* Get infos from the graphics buffer information structure */
242 if (!CsrValidateMessageBuffer(ApiMessage
,
243 (PVOID
*)&CreateScreenBufferRequest
->GraphicsBufferInfo
.lpBitMapInfo
,
245 CreateScreenBufferRequest
->GraphicsBufferInfo
.dwBitMapInfoLength
))
247 Status
= STATUS_INVALID_PARAMETER
;
251 ScreenBufferInfo
= &GraphicsInfo
;
253 /* Initialize shared variables */
254 CreateScreenBufferRequest
->GraphicsBufferInfo
.hMutex
= GraphicsInfo
.Info
.hMutex
= INVALID_HANDLE_VALUE
;
255 CreateScreenBufferRequest
->GraphicsBufferInfo
.lpBitMap
= GraphicsInfo
.Info
.lpBitMap
= NULL
;
257 /* A graphics screen buffer is never inheritable */
258 CreateScreenBufferRequest
->Inheritable
= FALSE
;
261 Status
= ConDrvCreateScreenBuffer(&Buff
,
263 CreateScreenBufferRequest
->ScreenBufferType
,
265 if (!NT_SUCCESS(Status
)) goto Quit
;
267 /* Insert the new handle inside the process handles table */
268 RtlEnterCriticalSection(&ProcessData
->HandleTableLock
);
270 Status
= ConSrvInsertObject(ProcessData
,
271 &CreateScreenBufferRequest
->OutputHandle
,
273 CreateScreenBufferRequest
->Access
,
274 CreateScreenBufferRequest
->Inheritable
,
275 CreateScreenBufferRequest
->ShareMode
);
277 RtlLeaveCriticalSection(&ProcessData
->HandleTableLock
);
279 if (!NT_SUCCESS(Status
)) goto Quit
;
281 if (CreateScreenBufferRequest
->ScreenBufferType
== CONSOLE_GRAPHICS_BUFFER
)
283 PGRAPHICS_SCREEN_BUFFER Buffer
= (PGRAPHICS_SCREEN_BUFFER
)Buff
;
285 * Initialize the graphics buffer information structure
286 * and give it back to the client.
288 CreateScreenBufferRequest
->GraphicsBufferInfo
.hMutex
= Buffer
->ClientMutex
;
289 CreateScreenBufferRequest
->GraphicsBufferInfo
.lpBitMap
= Buffer
->ClientBitMap
;
293 ConSrvReleaseConsole(Console
, TRUE
);
298 ConDrvSetConsoleActiveScreenBuffer(IN PCONSOLE Console
,
299 IN PCONSOLE_SCREEN_BUFFER Buffer
);
300 CSR_API(SrvSetConsoleActiveScreenBuffer
)
303 PCONSOLE_SETACTIVESCREENBUFFER SetScreenBufferRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetScreenBufferRequest
;
304 PCONSOLE_SCREEN_BUFFER Buffer
;
306 DPRINT("SrvSetConsoleActiveScreenBuffer\n");
308 Status
= ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
309 SetScreenBufferRequest
->OutputHandle
,
310 &Buffer
, GENERIC_WRITE
, TRUE
);
311 if (!NT_SUCCESS(Status
)) return Status
;
313 Status
= ConDrvSetConsoleActiveScreenBuffer(Buffer
->Header
.Console
,
316 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
321 /* CSR THREADS FOR WriteConsole ***********************************************/
324 DoWriteConsole(IN PCSR_API_MESSAGE ApiMessage
,
325 IN PCSR_THREAD ClientThread
,
326 IN BOOLEAN CreateWaitBlock OPTIONAL
);
328 // Wait function CSR_WAIT_FUNCTION
331 WriteConsoleThread(IN PLIST_ENTRY WaitList
,
332 IN PCSR_THREAD WaitThread
,
333 IN PCSR_API_MESSAGE WaitApiMessage
,
334 IN PVOID WaitContext
,
335 IN PVOID WaitArgument1
,
336 IN PVOID WaitArgument2
,
341 DPRINT("WriteConsoleThread - WaitContext = 0x%p, WaitArgument1 = 0x%p, WaitArgument2 = 0x%p, WaitFlags = %lu\n", WaitContext
, WaitArgument1
, WaitArgument2
, WaitFlags
);
344 * If we are notified of the process termination via a call
345 * to CsrNotifyWaitBlock triggered by CsrDestroyProcess or
346 * CsrDestroyThread, just return.
348 if (WaitFlags
& CsrProcessTerminating
)
350 Status
= STATUS_THREAD_IS_TERMINATING
;
354 Status
= DoWriteConsole(WaitApiMessage
, WaitThread
, FALSE
);
357 if (Status
!= STATUS_PENDING
)
359 WaitApiMessage
->Status
= Status
;
362 return (Status
== STATUS_PENDING
? FALSE
: TRUE
);
366 ConDrvWriteConsole(IN PCONSOLE Console
,
367 IN PTEXTMODE_SCREEN_BUFFER ScreenBuffer
,
369 IN PVOID StringBuffer
,
370 IN ULONG NumCharsToWrite
,
371 OUT PULONG NumCharsWritten OPTIONAL
);
373 DoWriteConsole(IN PCSR_API_MESSAGE ApiMessage
,
374 IN PCSR_THREAD ClientThread
,
375 IN BOOLEAN CreateWaitBlock OPTIONAL
)
378 PCONSOLE_WRITECONSOLE WriteConsoleRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteConsoleRequest
;
379 PTEXTMODE_SCREEN_BUFFER ScreenBuffer
;
381 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(ClientThread
->Process
),
382 WriteConsoleRequest
->OutputHandle
,
383 &ScreenBuffer
, GENERIC_WRITE
, FALSE
);
384 if (!NT_SUCCESS(Status
)) return Status
;
386 Status
= ConDrvWriteConsole(ScreenBuffer
->Header
.Console
,
388 WriteConsoleRequest
->Unicode
,
389 WriteConsoleRequest
->Buffer
,
390 WriteConsoleRequest
->NrCharactersToWrite
,
391 &WriteConsoleRequest
->NrCharactersWritten
);
393 if (Status
== STATUS_PENDING
)
397 if (!CsrCreateWait(&ScreenBuffer
->Header
.Console
->WriteWaitQueue
,
404 Status
= STATUS_NO_MEMORY
;
409 /* Wait until we un-pause the console */
410 // Status = STATUS_PENDING;
414 ConSrvReleaseScreenBuffer(ScreenBuffer
, FALSE
);
419 /* TEXT OUTPUT APIS ***********************************************************/
422 ConDrvReadConsoleOutput(IN PCONSOLE Console
,
423 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
425 OUT PCHAR_INFO CharInfo
/*Buffer*/,
426 IN PCOORD BufferSize
,
427 IN PCOORD BufferCoord
,
428 IN OUT PSMALL_RECT ReadRegion
);
429 CSR_API(SrvReadConsoleOutput
)
432 PCONSOLE_READOUTPUT ReadOutputRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ReadOutputRequest
;
433 PTEXTMODE_SCREEN_BUFFER Buffer
;
435 DPRINT("SrvReadConsoleOutput\n");
437 if (!CsrValidateMessageBuffer(ApiMessage
,
438 (PVOID
*)&ReadOutputRequest
->CharInfo
,
439 ReadOutputRequest
->BufferSize
.X
* ReadOutputRequest
->BufferSize
.Y
,
442 return STATUS_INVALID_PARAMETER
;
445 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
446 ReadOutputRequest
->OutputHandle
,
447 &Buffer
, GENERIC_READ
, TRUE
);
448 if (!NT_SUCCESS(Status
)) return Status
;
450 Status
= ConDrvReadConsoleOutput(Buffer
->Header
.Console
,
452 ReadOutputRequest
->Unicode
,
453 ReadOutputRequest
->CharInfo
,
454 &ReadOutputRequest
->BufferSize
,
455 &ReadOutputRequest
->BufferCoord
,
456 &ReadOutputRequest
->ReadRegion
);
458 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
463 ConDrvWriteConsoleOutput(IN PCONSOLE Console
,
464 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
466 IN PCHAR_INFO CharInfo
/*Buffer*/,
467 IN PCOORD BufferSize
,
468 IN PCOORD BufferCoord
,
469 IN OUT PSMALL_RECT WriteRegion
);
470 CSR_API(SrvWriteConsoleOutput
)
473 PCONSOLE_WRITEOUTPUT WriteOutputRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteOutputRequest
;
474 PTEXTMODE_SCREEN_BUFFER Buffer
;
476 DPRINT("SrvWriteConsoleOutput\n");
478 if (!CsrValidateMessageBuffer(ApiMessage
,
479 (PVOID
*)&WriteOutputRequest
->CharInfo
,
480 WriteOutputRequest
->BufferSize
.X
* WriteOutputRequest
->BufferSize
.Y
,
483 return STATUS_INVALID_PARAMETER
;
486 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
487 WriteOutputRequest
->OutputHandle
,
488 &Buffer
, GENERIC_WRITE
, TRUE
);
489 if (!NT_SUCCESS(Status
)) return Status
;
491 Status
= ConDrvWriteConsoleOutput(Buffer
->Header
.Console
,
493 WriteOutputRequest
->Unicode
,
494 WriteOutputRequest
->CharInfo
,
495 &WriteOutputRequest
->BufferSize
,
496 &WriteOutputRequest
->BufferCoord
,
497 &WriteOutputRequest
->WriteRegion
);
499 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
503 CSR_API(SrvWriteConsole
)
506 PCONSOLE_WRITECONSOLE WriteConsoleRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteConsoleRequest
;
508 DPRINT("SrvWriteConsole\n");
510 if (!CsrValidateMessageBuffer(ApiMessage
,
511 (PVOID
)&WriteConsoleRequest
->Buffer
,
512 WriteConsoleRequest
->BufferSize
,
515 return STATUS_INVALID_PARAMETER
;
518 Status
= DoWriteConsole(ApiMessage
, CsrGetClientThread(), TRUE
);
520 if (Status
== STATUS_PENDING
) *ReplyCode
= CsrReplyPending
;
526 ConDrvReadConsoleOutputString(IN PCONSOLE Console
,
527 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
528 IN CODE_TYPE CodeType
,
529 OUT PVOID StringBuffer
,
530 IN ULONG NumCodesToRead
,
533 OUT PULONG CodesRead
);
534 CSR_API(SrvReadConsoleOutputString
)
537 PCONSOLE_READOUTPUTCODE ReadOutputCodeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ReadOutputCodeRequest
;
538 PTEXTMODE_SCREEN_BUFFER Buffer
;
541 DPRINT("SrvReadConsoleOutputString\n");
543 switch (ReadOutputCodeRequest
->CodeType
)
546 CodeSize
= sizeof(CHAR
);
550 CodeSize
= sizeof(WCHAR
);
554 CodeSize
= sizeof(WORD
);
558 return STATUS_INVALID_PARAMETER
;
561 if (!CsrValidateMessageBuffer(ApiMessage
,
562 (PVOID
*)&ReadOutputCodeRequest
->pCode
.pCode
,
563 ReadOutputCodeRequest
->NumCodesToRead
,
566 return STATUS_INVALID_PARAMETER
;
569 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
570 ReadOutputCodeRequest
->OutputHandle
,
571 &Buffer
, GENERIC_READ
, TRUE
);
572 if (!NT_SUCCESS(Status
)) return Status
;
574 Status
= ConDrvReadConsoleOutputString(Buffer
->Header
.Console
,
576 ReadOutputCodeRequest
->CodeType
,
577 ReadOutputCodeRequest
->pCode
.pCode
,
578 ReadOutputCodeRequest
->NumCodesToRead
,
579 &ReadOutputCodeRequest
->ReadCoord
,
580 &ReadOutputCodeRequest
->EndCoord
,
581 &ReadOutputCodeRequest
->CodesRead
);
583 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
588 ConDrvWriteConsoleOutputString(IN PCONSOLE Console
,
589 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
590 IN CODE_TYPE CodeType
,
591 IN PVOID StringBuffer
,
592 IN ULONG NumCodesToWrite
,
593 IN PCOORD WriteCoord
/*,
595 OUT PULONG CodesWritten */);
596 CSR_API(SrvWriteConsoleOutputString
)
599 PCONSOLE_WRITEOUTPUTCODE WriteOutputCodeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteOutputCodeRequest
;
600 PTEXTMODE_SCREEN_BUFFER Buffer
;
603 DPRINT("SrvWriteConsoleOutputString\n");
605 switch (WriteOutputCodeRequest
->CodeType
)
608 CodeSize
= sizeof(CHAR
);
612 CodeSize
= sizeof(WCHAR
);
616 CodeSize
= sizeof(WORD
);
620 return STATUS_INVALID_PARAMETER
;
623 if (!CsrValidateMessageBuffer(ApiMessage
,
624 (PVOID
*)&WriteOutputCodeRequest
->pCode
.pCode
,
625 WriteOutputCodeRequest
->Length
,
628 return STATUS_INVALID_PARAMETER
;
631 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
632 WriteOutputCodeRequest
->OutputHandle
,
633 &Buffer
, GENERIC_WRITE
, TRUE
);
634 if (!NT_SUCCESS(Status
)) return Status
;
636 Status
= ConDrvWriteConsoleOutputString(Buffer
->Header
.Console
,
638 WriteOutputCodeRequest
->CodeType
,
639 WriteOutputCodeRequest
->pCode
.pCode
,
640 WriteOutputCodeRequest
->Length
, // NumCodesToWrite,
641 &WriteOutputCodeRequest
->Coord
/*, // WriteCoord,
642 &WriteOutputCodeRequest->EndCoord,
643 &WriteOutputCodeRequest->NrCharactersWritten */);
645 // WriteOutputCodeRequest->NrCharactersWritten = Written;
647 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
652 ConDrvFillConsoleOutput(IN PCONSOLE Console
,
653 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
654 IN CODE_TYPE CodeType
,
656 IN ULONG NumCodesToWrite
,
657 IN PCOORD WriteCoord
/*,
658 OUT PULONG CodesWritten */);
659 CSR_API(SrvFillConsoleOutput
)
662 PCONSOLE_FILLOUTPUTCODE FillOutputRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.FillOutputRequest
;
663 PTEXTMODE_SCREEN_BUFFER Buffer
;
664 USHORT CodeType
= FillOutputRequest
->CodeType
;
666 DPRINT("SrvFillConsoleOutput\n");
668 if ( (CodeType
!= CODE_ASCII
) &&
669 (CodeType
!= CODE_UNICODE
) &&
670 (CodeType
!= CODE_ATTRIBUTE
) )
672 return STATUS_INVALID_PARAMETER
;
675 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
676 FillOutputRequest
->OutputHandle
,
677 &Buffer
, GENERIC_WRITE
, TRUE
);
678 if (!NT_SUCCESS(Status
)) return Status
;
680 Status
= ConDrvFillConsoleOutput(Buffer
->Header
.Console
,
683 &FillOutputRequest
->Code
,
684 FillOutputRequest
->Length
, // NumCodesToWrite,
685 &FillOutputRequest
->Coord
/*, // WriteCoord,
686 &FillOutputRequest->NrCharactersWritten */);
688 // FillOutputRequest->NrCharactersWritten = Written;
690 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
695 ConDrvGetConsoleScreenBufferInfo(IN PCONSOLE Console
,
696 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
697 OUT PCONSOLE_SCREEN_BUFFER_INFO ScreenBufferInfo
);
698 CSR_API(SrvGetConsoleScreenBufferInfo
)
701 PCONSOLE_GETSCREENBUFFERINFO ScreenBufferInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ScreenBufferInfoRequest
;
702 PTEXTMODE_SCREEN_BUFFER Buffer
;
704 DPRINT("SrvGetConsoleScreenBufferInfo\n");
706 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
707 ScreenBufferInfoRequest
->OutputHandle
,
708 &Buffer
, GENERIC_READ
, TRUE
);
709 if (!NT_SUCCESS(Status
)) return Status
;
711 Status
= ConDrvGetConsoleScreenBufferInfo(Buffer
->Header
.Console
,
713 &ScreenBufferInfoRequest
->Info
);
715 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
720 ConDrvSetConsoleTextAttribute(IN PCONSOLE Console
,
721 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
723 CSR_API(SrvSetConsoleTextAttribute
)
726 PCONSOLE_SETTEXTATTRIB SetTextAttribRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetTextAttribRequest
;
727 PTEXTMODE_SCREEN_BUFFER Buffer
;
729 DPRINT("SrvSetConsoleTextAttribute\n");
731 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
732 SetTextAttribRequest
->OutputHandle
,
733 &Buffer
, GENERIC_WRITE
, TRUE
);
734 if (!NT_SUCCESS(Status
)) return Status
;
736 Status
= ConDrvSetConsoleTextAttribute(Buffer
->Header
.Console
,
738 SetTextAttribRequest
->Attrib
);
740 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
745 ConDrvSetConsoleScreenBufferSize(IN PCONSOLE Console
,
746 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
748 CSR_API(SrvSetConsoleScreenBufferSize
)
751 PCONSOLE_SETSCREENBUFFERSIZE SetScreenBufferSizeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetScreenBufferSizeRequest
;
752 PTEXTMODE_SCREEN_BUFFER Buffer
;
754 DPRINT("SrvSetConsoleScreenBufferSize\n");
756 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
757 SetScreenBufferSizeRequest
->OutputHandle
,
758 &Buffer
, GENERIC_WRITE
, TRUE
);
759 if (!NT_SUCCESS(Status
)) return Status
;
761 Status
= ConDrvSetConsoleScreenBufferSize(Buffer
->Header
.Console
,
763 &SetScreenBufferSizeRequest
->Size
);
765 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
770 ConDrvScrollConsoleScreenBuffer(IN PCONSOLE Console
,
771 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
773 IN PSMALL_RECT ScrollRectangle
,
774 IN BOOLEAN UseClipRectangle
,
775 IN PSMALL_RECT ClipRectangle OPTIONAL
,
776 IN PCOORD DestinationOrigin
,
777 IN CHAR_INFO FillChar
);
778 CSR_API(SrvScrollConsoleScreenBuffer
)
781 PCONSOLE_SCROLLSCREENBUFFER ScrollScreenBufferRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ScrollScreenBufferRequest
;
782 PTEXTMODE_SCREEN_BUFFER Buffer
;
784 DPRINT("SrvScrollConsoleScreenBuffer\n");
786 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
787 ScrollScreenBufferRequest
->OutputHandle
,
788 &Buffer
, GENERIC_WRITE
, TRUE
);
789 if (!NT_SUCCESS(Status
)) return Status
;
791 Status
= ConDrvScrollConsoleScreenBuffer(Buffer
->Header
.Console
,
793 ScrollScreenBufferRequest
->Unicode
,
794 &ScrollScreenBufferRequest
->ScrollRectangle
,
795 ScrollScreenBufferRequest
->UseClipRectangle
,
796 &ScrollScreenBufferRequest
->ClipRectangle
,
797 &ScrollScreenBufferRequest
->DestinationOrigin
,
798 ScrollScreenBufferRequest
->Fill
);
800 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
805 ConDrvSetConsoleWindowInfo(IN PCONSOLE Console
,
806 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
808 IN PSMALL_RECT WindowRect
);
809 CSR_API(SrvSetConsoleWindowInfo
)
812 PCONSOLE_SETWINDOWINFO SetWindowInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetWindowInfoRequest
;
813 // PCONSOLE_SCREEN_BUFFER Buffer;
814 PTEXTMODE_SCREEN_BUFFER Buffer
;
816 DPRINT1("SrvSetConsoleWindowInfo(0x%08x, %d, {L%d, T%d, R%d, B%d}) called\n",
817 SetWindowInfoRequest
->OutputHandle
, SetWindowInfoRequest
->Absolute
,
818 SetWindowInfoRequest
->WindowRect
.Left
,
819 SetWindowInfoRequest
->WindowRect
.Top
,
820 SetWindowInfoRequest
->WindowRect
.Right
,
821 SetWindowInfoRequest
->WindowRect
.Bottom
);
823 // ConSrvGetScreenBuffer
824 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
825 SetWindowInfoRequest
->OutputHandle
,
826 &Buffer
, GENERIC_READ
, TRUE
);
827 if (!NT_SUCCESS(Status
)) return Status
;
829 Status
= ConDrvSetConsoleWindowInfo(Buffer
->Header
.Console
,
831 SetWindowInfoRequest
->Absolute
,
832 &SetWindowInfoRequest
->WindowRect
);
834 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);