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 BOOL 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
,
359 if (Status
!= STATUS_PENDING
)
361 WaitApiMessage
->Status
= Status
;
364 return (Status
== STATUS_PENDING
? FALSE
: TRUE
);
368 ConDrvWriteConsole(IN PCONSOLE Console
,
369 IN PTEXTMODE_SCREEN_BUFFER ScreenBuffer
,
371 IN PVOID StringBuffer
,
372 IN ULONG NumCharsToWrite
,
373 OUT PULONG NumCharsWritten OPTIONAL
);
375 DoWriteConsole(IN PCSR_API_MESSAGE ApiMessage
,
376 IN PCSR_THREAD ClientThread
,
377 IN BOOL CreateWaitBlock OPTIONAL
)
380 PCONSOLE_WRITECONSOLE WriteConsoleRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteConsoleRequest
;
381 PTEXTMODE_SCREEN_BUFFER ScreenBuffer
;
383 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(ClientThread
->Process
),
384 WriteConsoleRequest
->OutputHandle
,
385 &ScreenBuffer
, GENERIC_WRITE
, FALSE
);
386 if (!NT_SUCCESS(Status
)) return Status
;
388 Status
= ConDrvWriteConsole(ScreenBuffer
->Header
.Console
,
390 WriteConsoleRequest
->Unicode
,
391 WriteConsoleRequest
->Buffer
,
392 WriteConsoleRequest
->NrCharactersToWrite
,
393 &WriteConsoleRequest
->NrCharactersWritten
);
395 if (Status
== STATUS_PENDING
)
399 if (!CsrCreateWait(&ScreenBuffer
->Header
.Console
->WriteWaitQueue
,
406 Status
= STATUS_NO_MEMORY
;
411 /* Wait until we un-pause the console */
412 // Status = STATUS_PENDING;
416 ConSrvReleaseScreenBuffer(ScreenBuffer
, FALSE
);
421 /* TEXT OUTPUT APIS ***********************************************************/
424 ConDrvReadConsoleOutput(IN PCONSOLE Console
,
425 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
427 OUT PCHAR_INFO CharInfo
/*Buffer*/,
428 IN PCOORD BufferSize
,
429 IN PCOORD BufferCoord
,
430 IN OUT PSMALL_RECT ReadRegion
);
431 CSR_API(SrvReadConsoleOutput
)
434 PCONSOLE_READOUTPUT ReadOutputRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ReadOutputRequest
;
435 PTEXTMODE_SCREEN_BUFFER Buffer
;
437 DPRINT("SrvReadConsoleOutput\n");
439 if (!CsrValidateMessageBuffer(ApiMessage
,
440 (PVOID
*)&ReadOutputRequest
->CharInfo
,
441 ReadOutputRequest
->BufferSize
.X
* ReadOutputRequest
->BufferSize
.Y
,
444 return STATUS_INVALID_PARAMETER
;
447 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
448 ReadOutputRequest
->OutputHandle
,
449 &Buffer
, GENERIC_READ
, TRUE
);
450 if (!NT_SUCCESS(Status
)) return Status
;
452 Status
= ConDrvReadConsoleOutput(Buffer
->Header
.Console
,
454 ReadOutputRequest
->Unicode
,
455 ReadOutputRequest
->CharInfo
,
456 &ReadOutputRequest
->BufferSize
,
457 &ReadOutputRequest
->BufferCoord
,
458 &ReadOutputRequest
->ReadRegion
);
460 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
465 ConDrvWriteConsoleOutput(IN PCONSOLE Console
,
466 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
468 IN PCHAR_INFO CharInfo
/*Buffer*/,
469 IN PCOORD BufferSize
,
470 IN PCOORD BufferCoord
,
471 IN OUT PSMALL_RECT WriteRegion
);
472 CSR_API(SrvWriteConsoleOutput
)
475 PCONSOLE_WRITEOUTPUT WriteOutputRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteOutputRequest
;
476 PTEXTMODE_SCREEN_BUFFER Buffer
;
478 DPRINT("SrvWriteConsoleOutput\n");
480 if (!CsrValidateMessageBuffer(ApiMessage
,
481 (PVOID
*)&WriteOutputRequest
->CharInfo
,
482 WriteOutputRequest
->BufferSize
.X
* WriteOutputRequest
->BufferSize
.Y
,
485 return STATUS_INVALID_PARAMETER
;
488 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
489 WriteOutputRequest
->OutputHandle
,
490 &Buffer
, GENERIC_WRITE
, TRUE
);
491 if (!NT_SUCCESS(Status
)) return Status
;
493 Status
= ConDrvWriteConsoleOutput(Buffer
->Header
.Console
,
495 WriteOutputRequest
->Unicode
,
496 WriteOutputRequest
->CharInfo
,
497 &WriteOutputRequest
->BufferSize
,
498 &WriteOutputRequest
->BufferCoord
,
499 &WriteOutputRequest
->WriteRegion
);
501 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
505 CSR_API(SrvWriteConsole
)
508 PCONSOLE_WRITECONSOLE WriteConsoleRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteConsoleRequest
;
510 DPRINT("SrvWriteConsole\n");
512 if (!CsrValidateMessageBuffer(ApiMessage
,
513 (PVOID
)&WriteConsoleRequest
->Buffer
,
514 WriteConsoleRequest
->BufferSize
,
517 return STATUS_INVALID_PARAMETER
;
520 Status
= DoWriteConsole(ApiMessage
,
521 CsrGetClientThread(),
524 if (Status
== STATUS_PENDING
) *ReplyCode
= CsrReplyPending
;
530 ConDrvReadConsoleOutputString(IN PCONSOLE Console
,
531 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
532 IN CODE_TYPE CodeType
,
533 OUT PVOID StringBuffer
,
534 IN ULONG NumCodesToRead
,
537 OUT PULONG CodesRead
);
538 CSR_API(SrvReadConsoleOutputString
)
541 PCONSOLE_READOUTPUTCODE ReadOutputCodeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ReadOutputCodeRequest
;
542 PTEXTMODE_SCREEN_BUFFER Buffer
;
545 DPRINT("SrvReadConsoleOutputString\n");
547 switch (ReadOutputCodeRequest
->CodeType
)
550 CodeSize
= sizeof(CHAR
);
554 CodeSize
= sizeof(WCHAR
);
558 CodeSize
= sizeof(WORD
);
562 return STATUS_INVALID_PARAMETER
;
565 if (!CsrValidateMessageBuffer(ApiMessage
,
566 (PVOID
*)&ReadOutputCodeRequest
->pCode
.pCode
,
567 ReadOutputCodeRequest
->NumCodesToRead
,
570 return STATUS_INVALID_PARAMETER
;
573 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
574 ReadOutputCodeRequest
->OutputHandle
,
575 &Buffer
, GENERIC_READ
, TRUE
);
576 if (!NT_SUCCESS(Status
)) return Status
;
578 Status
= ConDrvReadConsoleOutputString(Buffer
->Header
.Console
,
580 ReadOutputCodeRequest
->CodeType
,
581 ReadOutputCodeRequest
->pCode
.pCode
,
582 ReadOutputCodeRequest
->NumCodesToRead
,
583 &ReadOutputCodeRequest
->ReadCoord
,
584 &ReadOutputCodeRequest
->EndCoord
,
585 &ReadOutputCodeRequest
->CodesRead
);
587 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
592 ConDrvWriteConsoleOutputString(IN PCONSOLE Console
,
593 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
594 IN CODE_TYPE CodeType
,
595 IN PVOID StringBuffer
,
596 IN ULONG NumCodesToWrite
,
597 IN PCOORD WriteCoord
/*,
599 OUT PULONG CodesWritten */);
600 CSR_API(SrvWriteConsoleOutputString
)
603 PCONSOLE_WRITEOUTPUTCODE WriteOutputCodeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteOutputCodeRequest
;
604 PTEXTMODE_SCREEN_BUFFER Buffer
;
607 DPRINT("SrvWriteConsoleOutputString\n");
609 switch (WriteOutputCodeRequest
->CodeType
)
612 CodeSize
= sizeof(CHAR
);
616 CodeSize
= sizeof(WCHAR
);
620 CodeSize
= sizeof(WORD
);
624 return STATUS_INVALID_PARAMETER
;
627 if (!CsrValidateMessageBuffer(ApiMessage
,
628 (PVOID
*)&WriteOutputCodeRequest
->pCode
.pCode
,
629 WriteOutputCodeRequest
->Length
,
632 return STATUS_INVALID_PARAMETER
;
635 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
636 WriteOutputCodeRequest
->OutputHandle
,
637 &Buffer
, GENERIC_WRITE
, TRUE
);
638 if (!NT_SUCCESS(Status
)) return Status
;
640 Status
= ConDrvWriteConsoleOutputString(Buffer
->Header
.Console
,
642 WriteOutputCodeRequest
->CodeType
,
643 WriteOutputCodeRequest
->pCode
.pCode
,
644 WriteOutputCodeRequest
->Length
, // NumCodesToWrite,
645 &WriteOutputCodeRequest
->Coord
/*, // WriteCoord,
646 &WriteOutputCodeRequest->EndCoord,
647 &WriteOutputCodeRequest->NrCharactersWritten */);
649 // WriteOutputCodeRequest->NrCharactersWritten = Written;
651 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
656 ConDrvFillConsoleOutput(IN PCONSOLE Console
,
657 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
658 IN CODE_TYPE CodeType
,
660 IN ULONG NumCodesToWrite
,
661 IN PCOORD WriteCoord
/*,
662 OUT PULONG CodesWritten */);
663 CSR_API(SrvFillConsoleOutput
)
666 PCONSOLE_FILLOUTPUTCODE FillOutputRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.FillOutputRequest
;
667 PTEXTMODE_SCREEN_BUFFER Buffer
;
668 USHORT CodeType
= FillOutputRequest
->CodeType
;
670 DPRINT("SrvFillConsoleOutput\n");
672 if ( (CodeType
!= CODE_ASCII
) &&
673 (CodeType
!= CODE_UNICODE
) &&
674 (CodeType
!= CODE_ATTRIBUTE
) )
676 return STATUS_INVALID_PARAMETER
;
679 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
680 FillOutputRequest
->OutputHandle
,
681 &Buffer
, GENERIC_WRITE
, TRUE
);
682 if (!NT_SUCCESS(Status
)) return Status
;
684 Status
= ConDrvFillConsoleOutput(Buffer
->Header
.Console
,
687 &FillOutputRequest
->Code
,
688 FillOutputRequest
->Length
, // NumCodesToWrite,
689 &FillOutputRequest
->Coord
/*, // WriteCoord,
690 &FillOutputRequest->NrCharactersWritten */);
692 // FillOutputRequest->NrCharactersWritten = Written;
694 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
699 ConDrvGetConsoleScreenBufferInfo(IN PCONSOLE Console
,
700 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
701 OUT PCONSOLE_SCREEN_BUFFER_INFO ScreenBufferInfo
);
702 CSR_API(SrvGetConsoleScreenBufferInfo
)
705 PCONSOLE_GETSCREENBUFFERINFO ScreenBufferInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ScreenBufferInfoRequest
;
706 PTEXTMODE_SCREEN_BUFFER Buffer
;
708 DPRINT("SrvGetConsoleScreenBufferInfo\n");
710 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
711 ScreenBufferInfoRequest
->OutputHandle
,
712 &Buffer
, GENERIC_READ
, TRUE
);
713 if (!NT_SUCCESS(Status
)) return Status
;
715 Status
= ConDrvGetConsoleScreenBufferInfo(Buffer
->Header
.Console
,
717 &ScreenBufferInfoRequest
->Info
);
719 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
724 ConDrvSetConsoleTextAttribute(IN PCONSOLE Console
,
725 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
727 CSR_API(SrvSetConsoleTextAttribute
)
730 PCONSOLE_SETTEXTATTRIB SetTextAttribRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetTextAttribRequest
;
731 PTEXTMODE_SCREEN_BUFFER Buffer
;
733 DPRINT("SrvSetConsoleTextAttribute\n");
735 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
736 SetTextAttribRequest
->OutputHandle
,
737 &Buffer
, GENERIC_WRITE
, TRUE
);
738 if (!NT_SUCCESS(Status
)) return Status
;
740 Status
= ConDrvSetConsoleTextAttribute(Buffer
->Header
.Console
,
742 SetTextAttribRequest
->Attrib
);
744 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
749 ConDrvSetConsoleScreenBufferSize(IN PCONSOLE Console
,
750 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
752 CSR_API(SrvSetConsoleScreenBufferSize
)
755 PCONSOLE_SETSCREENBUFFERSIZE SetScreenBufferSizeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetScreenBufferSizeRequest
;
756 PTEXTMODE_SCREEN_BUFFER Buffer
;
758 DPRINT("SrvSetConsoleScreenBufferSize\n");
760 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
761 SetScreenBufferSizeRequest
->OutputHandle
,
762 &Buffer
, GENERIC_WRITE
, TRUE
);
763 if (!NT_SUCCESS(Status
)) return Status
;
765 Status
= ConDrvSetConsoleScreenBufferSize(Buffer
->Header
.Console
,
767 &SetScreenBufferSizeRequest
->Size
);
769 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
774 ConDrvScrollConsoleScreenBuffer(IN PCONSOLE Console
,
775 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
777 IN PSMALL_RECT ScrollRectangle
,
778 IN BOOLEAN UseClipRectangle
,
779 IN PSMALL_RECT ClipRectangle OPTIONAL
,
780 IN PCOORD DestinationOrigin
,
781 IN CHAR_INFO FillChar
);
782 CSR_API(SrvScrollConsoleScreenBuffer
)
785 PCONSOLE_SCROLLSCREENBUFFER ScrollScreenBufferRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ScrollScreenBufferRequest
;
786 PTEXTMODE_SCREEN_BUFFER Buffer
;
788 DPRINT("SrvScrollConsoleScreenBuffer\n");
790 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
791 ScrollScreenBufferRequest
->OutputHandle
,
792 &Buffer
, GENERIC_WRITE
, TRUE
);
793 if (!NT_SUCCESS(Status
)) return Status
;
795 Status
= ConDrvScrollConsoleScreenBuffer(Buffer
->Header
.Console
,
797 ScrollScreenBufferRequest
->Unicode
,
798 &ScrollScreenBufferRequest
->ScrollRectangle
,
799 ScrollScreenBufferRequest
->UseClipRectangle
,
800 &ScrollScreenBufferRequest
->ClipRectangle
,
801 &ScrollScreenBufferRequest
->DestinationOrigin
,
802 ScrollScreenBufferRequest
->Fill
);
804 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
809 ConDrvSetConsoleWindowInfo(IN PCONSOLE Console
,
810 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
812 IN PSMALL_RECT WindowRect
);
813 CSR_API(SrvSetConsoleWindowInfo
)
816 PCONSOLE_SETWINDOWINFO SetWindowInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetWindowInfoRequest
;
817 // PCONSOLE_SCREEN_BUFFER Buffer;
818 PTEXTMODE_SCREEN_BUFFER Buffer
;
820 DPRINT1("SrvSetConsoleWindowInfo(0x%08x, %d, {L%d, T%d, R%d, B%d}) called\n",
821 SetWindowInfoRequest
->OutputHandle
, SetWindowInfoRequest
->Absolute
,
822 SetWindowInfoRequest
->WindowRect
.Left
,
823 SetWindowInfoRequest
->WindowRect
.Top
,
824 SetWindowInfoRequest
->WindowRect
.Right
,
825 SetWindowInfoRequest
->WindowRect
.Bottom
);
827 // ConSrvGetScreenBuffer
828 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
829 SetWindowInfoRequest
->OutputHandle
,
830 &Buffer
, GENERIC_READ
, TRUE
);
831 if (!NT_SUCCESS(Status
)) return Status
;
833 Status
= ConDrvSetConsoleWindowInfo(Buffer
->Header
.Console
,
835 SetWindowInfoRequest
->Absolute
,
836 &SetWindowInfoRequest
->WindowRect
);
838 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);