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 DPRINT1("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
;
83 DPRINT1("ConDrvSetConsolePalette calling...\n");
85 Status
= ConDrvSetConsolePalette(Buffer
->Header
.Console
,
87 SetPaletteRequest
->PaletteHandle
,
88 SetPaletteRequest
->Usage
);
90 DPRINT1("ConDrvSetConsolePalette returned Status 0x%08lx\n", Status
);
92 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
97 ConDrvGetConsoleCursorInfo(IN PCONSOLE Console
,
98 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
99 OUT PCONSOLE_CURSOR_INFO CursorInfo
);
100 CSR_API(SrvGetConsoleCursorInfo
)
103 PCONSOLE_GETSETCURSORINFO CursorInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.CursorInfoRequest
;
104 PTEXTMODE_SCREEN_BUFFER Buffer
;
106 DPRINT("SrvGetConsoleCursorInfo\n");
108 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
109 CursorInfoRequest
->OutputHandle
,
110 &Buffer
, GENERIC_READ
, TRUE
);
111 if (!NT_SUCCESS(Status
)) return Status
;
113 Status
= ConDrvGetConsoleCursorInfo(Buffer
->Header
.Console
,
115 &CursorInfoRequest
->Info
);
117 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
122 ConDrvSetConsoleCursorInfo(IN PCONSOLE Console
,
123 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
124 IN PCONSOLE_CURSOR_INFO CursorInfo
);
125 CSR_API(SrvSetConsoleCursorInfo
)
128 PCONSOLE_GETSETCURSORINFO CursorInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.CursorInfoRequest
;
129 PTEXTMODE_SCREEN_BUFFER Buffer
;
131 DPRINT("SrvSetConsoleCursorInfo\n");
133 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
134 CursorInfoRequest
->OutputHandle
,
135 &Buffer
, GENERIC_WRITE
, TRUE
);
136 if (!NT_SUCCESS(Status
)) return Status
;
138 Status
= ConDrvSetConsoleCursorInfo(Buffer
->Header
.Console
,
140 &CursorInfoRequest
->Info
);
142 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
147 ConDrvSetConsoleCursorPosition(IN PCONSOLE Console
,
148 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
150 CSR_API(SrvSetConsoleCursorPosition
)
153 PCONSOLE_SETCURSORPOSITION SetCursorPositionRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetCursorPositionRequest
;
154 PTEXTMODE_SCREEN_BUFFER Buffer
;
156 DPRINT("SrvSetConsoleCursorPosition\n");
158 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
159 SetCursorPositionRequest
->OutputHandle
,
160 &Buffer
, GENERIC_WRITE
, TRUE
);
161 if (!NT_SUCCESS(Status
)) return Status
;
163 Status
= ConDrvSetConsoleCursorPosition(Buffer
->Header
.Console
,
165 &SetCursorPositionRequest
->Position
);
167 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
171 CSR_API(SrvCreateConsoleScreenBuffer
)
173 NTSTATUS Status
= STATUS_INVALID_PARAMETER
;
174 PCONSOLE_CREATESCREENBUFFER CreateScreenBufferRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.CreateScreenBufferRequest
;
175 PCONSOLE_PROCESS_DATA ProcessData
= ConsoleGetPerProcessData(CsrGetClientThread()->Process
);
177 PCONSOLE_SCREEN_BUFFER Buff
;
179 PVOID ScreenBufferInfo
= NULL
;
180 TEXTMODE_BUFFER_INFO TextModeInfo
= {{80, 25},
181 DEFAULT_SCREEN_ATTRIB
,
182 DEFAULT_POPUP_ATTRIB
,
184 CSR_DEFAULT_CURSOR_SIZE
};
185 GRAPHICS_BUFFER_INFO GraphicsInfo
;
186 GraphicsInfo
.Info
= CreateScreenBufferRequest
->GraphicsBufferInfo
; // HACK for MSVC
188 DPRINT("SrvCreateConsoleScreenBuffer\n");
190 Status
= ConSrvGetConsole(ProcessData
, &Console
, TRUE
);
191 if (!NT_SUCCESS(Status
)) return Status
;
193 if (CreateScreenBufferRequest
->ScreenBufferType
== CONSOLE_TEXTMODE_BUFFER
)
195 ScreenBufferInfo
= &TextModeInfo
;
198 if (Console->ActiveBuffer)
200 TextModeInfo.ScreenBufferSize = Console->ActiveBuffer->ScreenBufferSize;
201 if (TextModeInfo.ScreenBufferSize.X == 0) TextModeInfo.ScreenBufferSize.X = 80;
202 if (TextModeInfo.ScreenBufferSize.Y == 0) TextModeInfo.ScreenBufferSize.Y = 25;
204 TextModeInfo.ScreenAttrib = Console->ActiveBuffer->ScreenBuffer.TextBuffer.ScreenDefaultAttrib;
205 TextModeInfo.PopupAttrib = Console->ActiveBuffer->ScreenBuffer.TextBuffer.PopupDefaultAttrib;
207 TextModeInfo.IsCursorVisible = Console->ActiveBuffer->CursorInfo.bVisible;
208 TextModeInfo.CursorSize = Console->ActiveBuffer->CursorInfo.dwSize;
213 * This is Windows' behaviour
216 /* Use the current console size. Regularize it if needed. */
217 TextModeInfo
.ScreenBufferSize
= Console
->ConsoleSize
;
218 if (TextModeInfo
.ScreenBufferSize
.X
== 0) TextModeInfo
.ScreenBufferSize
.X
= 1;
219 if (TextModeInfo
.ScreenBufferSize
.Y
== 0) TextModeInfo
.ScreenBufferSize
.Y
= 1;
221 /* If we have an active screen buffer, use its attributes as the new ones */
222 if (Console
->ActiveBuffer
&& GetType(Console
->ActiveBuffer
) == TEXTMODE_BUFFER
)
224 PTEXTMODE_SCREEN_BUFFER Buffer
= (PTEXTMODE_SCREEN_BUFFER
)Console
->ActiveBuffer
;
226 TextModeInfo
.ScreenAttrib
= Buffer
->ScreenDefaultAttrib
;
227 TextModeInfo
.PopupAttrib
= Buffer
->PopupDefaultAttrib
;
229 TextModeInfo
.IsCursorVisible
= Buffer
->CursorInfo
.bVisible
;
230 TextModeInfo
.CursorSize
= Buffer
->CursorInfo
.dwSize
;
233 else if (CreateScreenBufferRequest
->ScreenBufferType
== CONSOLE_GRAPHICS_BUFFER
)
235 /* Get infos from the graphics buffer information structure */
236 if (!CsrValidateMessageBuffer(ApiMessage
,
237 (PVOID
*)&CreateScreenBufferRequest
->GraphicsBufferInfo
.lpBitMapInfo
,
239 CreateScreenBufferRequest
->GraphicsBufferInfo
.dwBitMapInfoLength
))
241 Status
= STATUS_INVALID_PARAMETER
;
245 ScreenBufferInfo
= &GraphicsInfo
;
247 /* Initialize shared variables */
248 CreateScreenBufferRequest
->GraphicsBufferInfo
.hMutex
= GraphicsInfo
.Info
.hMutex
= INVALID_HANDLE_VALUE
;
249 CreateScreenBufferRequest
->GraphicsBufferInfo
.lpBitMap
= GraphicsInfo
.Info
.lpBitMap
= NULL
;
251 /* A graphics screen buffer is never inheritable */
252 CreateScreenBufferRequest
->Inheritable
= FALSE
;
255 Status
= ConDrvCreateScreenBuffer(&Buff
,
257 CreateScreenBufferRequest
->ScreenBufferType
,
259 if (!NT_SUCCESS(Status
)) goto Quit
;
261 /* Insert the new handle inside the process handles table */
262 RtlEnterCriticalSection(&ProcessData
->HandleTableLock
);
264 Status
= ConSrvInsertObject(ProcessData
,
265 &CreateScreenBufferRequest
->OutputHandle
,
267 CreateScreenBufferRequest
->Access
,
268 CreateScreenBufferRequest
->Inheritable
,
269 CreateScreenBufferRequest
->ShareMode
);
271 RtlLeaveCriticalSection(&ProcessData
->HandleTableLock
);
273 if (!NT_SUCCESS(Status
)) goto Quit
;
275 if (CreateScreenBufferRequest
->ScreenBufferType
== CONSOLE_GRAPHICS_BUFFER
)
277 PGRAPHICS_SCREEN_BUFFER Buffer
= (PGRAPHICS_SCREEN_BUFFER
)Buff
;
279 * Initialize the graphics buffer information structure
280 * and give it back to the client.
282 CreateScreenBufferRequest
->GraphicsBufferInfo
.hMutex
= Buffer
->ClientMutex
;
283 CreateScreenBufferRequest
->GraphicsBufferInfo
.lpBitMap
= Buffer
->ClientBitMap
;
287 ConSrvReleaseConsole(Console
, TRUE
);
292 ConDrvSetConsoleActiveScreenBuffer(IN PCONSOLE Console
,
293 IN PCONSOLE_SCREEN_BUFFER Buffer
);
294 CSR_API(SrvSetConsoleActiveScreenBuffer
)
297 PCONSOLE_SETACTIVESCREENBUFFER SetScreenBufferRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetScreenBufferRequest
;
298 PCONSOLE_SCREEN_BUFFER Buffer
;
300 DPRINT("SrvSetConsoleActiveScreenBuffer\n");
302 Status
= ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
303 SetScreenBufferRequest
->OutputHandle
,
304 &Buffer
, GENERIC_WRITE
, TRUE
);
305 if (!NT_SUCCESS(Status
)) return Status
;
307 Status
= ConDrvSetConsoleActiveScreenBuffer(Buffer
->Header
.Console
,
310 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
315 /* CSR THREADS FOR WriteConsole ***********************************************/
318 DoWriteConsole(IN PCSR_API_MESSAGE ApiMessage
,
319 IN PCSR_THREAD ClientThread
,
320 IN BOOL CreateWaitBlock OPTIONAL
);
322 // Wait function CSR_WAIT_FUNCTION
325 WriteConsoleThread(IN PLIST_ENTRY WaitList
,
326 IN PCSR_THREAD WaitThread
,
327 IN PCSR_API_MESSAGE WaitApiMessage
,
328 IN PVOID WaitContext
,
329 IN PVOID WaitArgument1
,
330 IN PVOID WaitArgument2
,
335 DPRINT("WriteConsoleThread - WaitContext = 0x%p, WaitArgument1 = 0x%p, WaitArgument2 = 0x%p, WaitFlags = %lu\n", WaitContext
, WaitArgument1
, WaitArgument2
, WaitFlags
);
338 * If we are notified of the process termination via a call
339 * to CsrNotifyWaitBlock triggered by CsrDestroyProcess or
340 * CsrDestroyThread, just return.
342 if (WaitFlags
& CsrProcessTerminating
)
344 Status
= STATUS_THREAD_IS_TERMINATING
;
348 Status
= DoWriteConsole(WaitApiMessage
,
353 if (Status
!= STATUS_PENDING
)
355 WaitApiMessage
->Status
= Status
;
358 return (Status
== STATUS_PENDING
? FALSE
: TRUE
);
362 ConDrvWriteConsole(IN PCONSOLE Console
,
363 IN PTEXTMODE_SCREEN_BUFFER ScreenBuffer
,
365 IN PVOID StringBuffer
,
366 IN ULONG NumCharsToWrite
,
367 OUT PULONG NumCharsWritten OPTIONAL
);
369 DoWriteConsole(IN PCSR_API_MESSAGE ApiMessage
,
370 IN PCSR_THREAD ClientThread
,
371 IN BOOL CreateWaitBlock OPTIONAL
)
374 PCONSOLE_WRITECONSOLE WriteConsoleRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteConsoleRequest
;
375 PTEXTMODE_SCREEN_BUFFER ScreenBuffer
;
377 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(ClientThread
->Process
),
378 WriteConsoleRequest
->OutputHandle
,
379 &ScreenBuffer
, GENERIC_WRITE
, FALSE
);
380 if (!NT_SUCCESS(Status
)) return Status
;
382 Status
= ConDrvWriteConsole(ScreenBuffer
->Header
.Console
,
384 WriteConsoleRequest
->Unicode
,
385 WriteConsoleRequest
->Buffer
,
386 WriteConsoleRequest
->NrCharactersToWrite
,
387 &WriteConsoleRequest
->NrCharactersWritten
);
389 if (Status
== STATUS_PENDING
)
393 if (!CsrCreateWait(&ScreenBuffer
->Header
.Console
->WriteWaitQueue
,
400 Status
= STATUS_NO_MEMORY
;
405 /* Wait until we un-pause the console */
406 // Status = STATUS_PENDING;
410 ConSrvReleaseScreenBuffer(ScreenBuffer
, FALSE
);
415 /* TEXT OUTPUT APIS ***********************************************************/
418 ConDrvReadConsoleOutput(IN PCONSOLE Console
,
419 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
421 OUT PCHAR_INFO CharInfo
/*Buffer*/,
422 IN PCOORD BufferSize
,
423 IN PCOORD BufferCoord
,
424 IN OUT PSMALL_RECT ReadRegion
);
425 CSR_API(SrvReadConsoleOutput
)
428 PCONSOLE_READOUTPUT ReadOutputRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ReadOutputRequest
;
429 PTEXTMODE_SCREEN_BUFFER Buffer
;
431 DPRINT("SrvReadConsoleOutput\n");
433 if (!CsrValidateMessageBuffer(ApiMessage
,
434 (PVOID
*)&ReadOutputRequest
->CharInfo
,
435 ReadOutputRequest
->BufferSize
.X
* ReadOutputRequest
->BufferSize
.Y
,
438 return STATUS_INVALID_PARAMETER
;
441 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
442 ReadOutputRequest
->OutputHandle
,
443 &Buffer
, GENERIC_READ
, TRUE
);
444 if (!NT_SUCCESS(Status
)) return Status
;
446 Status
= ConDrvReadConsoleOutput(Buffer
->Header
.Console
,
448 ReadOutputRequest
->Unicode
,
449 ReadOutputRequest
->CharInfo
,
450 &ReadOutputRequest
->BufferSize
,
451 &ReadOutputRequest
->BufferCoord
,
452 &ReadOutputRequest
->ReadRegion
);
454 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
459 ConDrvWriteConsoleOutput(IN PCONSOLE Console
,
460 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
462 IN PCHAR_INFO CharInfo
/*Buffer*/,
463 IN PCOORD BufferSize
,
464 IN PCOORD BufferCoord
,
465 IN OUT PSMALL_RECT WriteRegion
);
466 CSR_API(SrvWriteConsoleOutput
)
469 PCONSOLE_WRITEOUTPUT WriteOutputRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteOutputRequest
;
470 PTEXTMODE_SCREEN_BUFFER Buffer
;
472 DPRINT("SrvWriteConsoleOutput\n");
474 if (!CsrValidateMessageBuffer(ApiMessage
,
475 (PVOID
*)&WriteOutputRequest
->CharInfo
,
476 WriteOutputRequest
->BufferSize
.X
* WriteOutputRequest
->BufferSize
.Y
,
479 return STATUS_INVALID_PARAMETER
;
482 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
483 WriteOutputRequest
->OutputHandle
,
484 &Buffer
, GENERIC_WRITE
, TRUE
);
485 if (!NT_SUCCESS(Status
)) return Status
;
487 Status
= ConDrvWriteConsoleOutput(Buffer
->Header
.Console
,
489 WriteOutputRequest
->Unicode
,
490 WriteOutputRequest
->CharInfo
,
491 &WriteOutputRequest
->BufferSize
,
492 &WriteOutputRequest
->BufferCoord
,
493 &WriteOutputRequest
->WriteRegion
);
495 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
499 CSR_API(SrvWriteConsole
)
502 PCONSOLE_WRITECONSOLE WriteConsoleRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteConsoleRequest
;
504 DPRINT("SrvWriteConsole\n");
506 if (!CsrValidateMessageBuffer(ApiMessage
,
507 (PVOID
)&WriteConsoleRequest
->Buffer
,
508 WriteConsoleRequest
->BufferSize
,
511 return STATUS_INVALID_PARAMETER
;
514 Status
= DoWriteConsole(ApiMessage
,
515 CsrGetClientThread(),
518 if (Status
== STATUS_PENDING
) *ReplyCode
= CsrReplyPending
;
524 ConDrvReadConsoleOutputString(IN PCONSOLE Console
,
525 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
526 IN CODE_TYPE CodeType
,
527 OUT PVOID StringBuffer
,
528 IN ULONG NumCodesToRead
,
531 OUT PULONG CodesRead
);
532 CSR_API(SrvReadConsoleOutputString
)
535 PCONSOLE_READOUTPUTCODE ReadOutputCodeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ReadOutputCodeRequest
;
536 PTEXTMODE_SCREEN_BUFFER Buffer
;
539 DPRINT("SrvReadConsoleOutputString\n");
541 switch (ReadOutputCodeRequest
->CodeType
)
544 CodeSize
= sizeof(CHAR
);
548 CodeSize
= sizeof(WCHAR
);
552 CodeSize
= sizeof(WORD
);
556 return STATUS_INVALID_PARAMETER
;
559 if (!CsrValidateMessageBuffer(ApiMessage
,
560 (PVOID
*)&ReadOutputCodeRequest
->pCode
.pCode
,
561 ReadOutputCodeRequest
->NumCodesToRead
,
564 return STATUS_INVALID_PARAMETER
;
567 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
568 ReadOutputCodeRequest
->OutputHandle
,
569 &Buffer
, GENERIC_READ
, TRUE
);
570 if (!NT_SUCCESS(Status
)) return Status
;
572 Status
= ConDrvReadConsoleOutputString(Buffer
->Header
.Console
,
574 ReadOutputCodeRequest
->CodeType
,
575 ReadOutputCodeRequest
->pCode
.pCode
,
576 ReadOutputCodeRequest
->NumCodesToRead
,
577 &ReadOutputCodeRequest
->ReadCoord
,
578 &ReadOutputCodeRequest
->EndCoord
,
579 &ReadOutputCodeRequest
->CodesRead
);
581 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
586 ConDrvWriteConsoleOutputString(IN PCONSOLE Console
,
587 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
588 IN CODE_TYPE CodeType
,
589 IN PVOID StringBuffer
,
590 IN ULONG NumCodesToWrite
,
591 IN PCOORD WriteCoord
/*,
593 OUT PULONG CodesWritten */);
594 CSR_API(SrvWriteConsoleOutputString
)
597 PCONSOLE_WRITEOUTPUTCODE WriteOutputCodeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteOutputCodeRequest
;
598 PTEXTMODE_SCREEN_BUFFER Buffer
;
601 DPRINT("SrvWriteConsoleOutputString\n");
603 switch (WriteOutputCodeRequest
->CodeType
)
606 CodeSize
= sizeof(CHAR
);
610 CodeSize
= sizeof(WCHAR
);
614 CodeSize
= sizeof(WORD
);
618 return STATUS_INVALID_PARAMETER
;
621 if (!CsrValidateMessageBuffer(ApiMessage
,
622 (PVOID
*)&WriteOutputCodeRequest
->pCode
.pCode
,
623 WriteOutputCodeRequest
->Length
,
626 return STATUS_INVALID_PARAMETER
;
629 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
630 WriteOutputCodeRequest
->OutputHandle
,
631 &Buffer
, GENERIC_WRITE
, TRUE
);
632 if (!NT_SUCCESS(Status
)) return Status
;
634 Status
= ConDrvWriteConsoleOutputString(Buffer
->Header
.Console
,
636 WriteOutputCodeRequest
->CodeType
,
637 WriteOutputCodeRequest
->pCode
.pCode
,
638 WriteOutputCodeRequest
->Length
, // NumCodesToWrite,
639 &WriteOutputCodeRequest
->Coord
/*, // WriteCoord,
640 &WriteOutputCodeRequest->EndCoord,
641 &WriteOutputCodeRequest->NrCharactersWritten */);
643 // WriteOutputCodeRequest->NrCharactersWritten = Written;
645 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
650 ConDrvFillConsoleOutput(IN PCONSOLE Console
,
651 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
652 IN CODE_TYPE CodeType
,
654 IN ULONG NumCodesToWrite
,
655 IN PCOORD WriteCoord
/*,
656 OUT PULONG CodesWritten */);
657 CSR_API(SrvFillConsoleOutput
)
660 PCONSOLE_FILLOUTPUTCODE FillOutputRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.FillOutputRequest
;
661 PTEXTMODE_SCREEN_BUFFER Buffer
;
662 USHORT CodeType
= FillOutputRequest
->CodeType
;
664 DPRINT("SrvFillConsoleOutput\n");
666 if ( (CodeType
!= CODE_ASCII
) &&
667 (CodeType
!= CODE_UNICODE
) &&
668 (CodeType
!= CODE_ATTRIBUTE
) )
670 return STATUS_INVALID_PARAMETER
;
673 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
674 FillOutputRequest
->OutputHandle
,
675 &Buffer
, GENERIC_WRITE
, TRUE
);
676 if (!NT_SUCCESS(Status
)) return Status
;
678 Status
= ConDrvFillConsoleOutput(Buffer
->Header
.Console
,
681 &FillOutputRequest
->Code
,
682 FillOutputRequest
->Length
, // NumCodesToWrite,
683 &FillOutputRequest
->Coord
/*, // WriteCoord,
684 &FillOutputRequest->NrCharactersWritten */);
686 // FillOutputRequest->NrCharactersWritten = Written;
688 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
693 ConDrvGetConsoleScreenBufferInfo(IN PCONSOLE Console
,
694 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
695 OUT PCONSOLE_SCREEN_BUFFER_INFO ScreenBufferInfo
);
696 CSR_API(SrvGetConsoleScreenBufferInfo
)
699 PCONSOLE_GETSCREENBUFFERINFO ScreenBufferInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ScreenBufferInfoRequest
;
700 PTEXTMODE_SCREEN_BUFFER Buffer
;
702 DPRINT("SrvGetConsoleScreenBufferInfo\n");
704 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
705 ScreenBufferInfoRequest
->OutputHandle
,
706 &Buffer
, GENERIC_READ
, TRUE
);
707 if (!NT_SUCCESS(Status
)) return Status
;
709 Status
= ConDrvGetConsoleScreenBufferInfo(Buffer
->Header
.Console
,
711 &ScreenBufferInfoRequest
->Info
);
713 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
718 ConDrvSetConsoleTextAttribute(IN PCONSOLE Console
,
719 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
721 CSR_API(SrvSetConsoleTextAttribute
)
724 PCONSOLE_SETTEXTATTRIB SetTextAttribRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetTextAttribRequest
;
725 PTEXTMODE_SCREEN_BUFFER Buffer
;
727 DPRINT("SrvSetConsoleTextAttribute\n");
729 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
730 SetTextAttribRequest
->OutputHandle
,
731 &Buffer
, GENERIC_WRITE
, TRUE
);
732 if (!NT_SUCCESS(Status
)) return Status
;
734 Status
= ConDrvSetConsoleTextAttribute(Buffer
->Header
.Console
,
736 SetTextAttribRequest
->Attrib
);
738 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
743 ConDrvSetConsoleScreenBufferSize(IN PCONSOLE Console
,
744 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
746 CSR_API(SrvSetConsoleScreenBufferSize
)
749 PCONSOLE_SETSCREENBUFFERSIZE SetScreenBufferSizeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetScreenBufferSizeRequest
;
750 PTEXTMODE_SCREEN_BUFFER Buffer
;
752 DPRINT("SrvSetConsoleScreenBufferSize\n");
754 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
755 SetScreenBufferSizeRequest
->OutputHandle
,
756 &Buffer
, GENERIC_WRITE
, TRUE
);
757 if (!NT_SUCCESS(Status
)) return Status
;
759 Status
= ConDrvSetConsoleScreenBufferSize(Buffer
->Header
.Console
,
761 &SetScreenBufferSizeRequest
->Size
);
763 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
768 ConDrvScrollConsoleScreenBuffer(IN PCONSOLE Console
,
769 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
771 IN PSMALL_RECT ScrollRectangle
,
772 IN BOOLEAN UseClipRectangle
,
773 IN PSMALL_RECT ClipRectangle OPTIONAL
,
774 IN PCOORD DestinationOrigin
,
775 IN CHAR_INFO FillChar
);
776 CSR_API(SrvScrollConsoleScreenBuffer
)
779 PCONSOLE_SCROLLSCREENBUFFER ScrollScreenBufferRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ScrollScreenBufferRequest
;
780 PTEXTMODE_SCREEN_BUFFER Buffer
;
782 DPRINT("SrvScrollConsoleScreenBuffer\n");
784 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
785 ScrollScreenBufferRequest
->OutputHandle
,
786 &Buffer
, GENERIC_WRITE
, TRUE
);
787 if (!NT_SUCCESS(Status
)) return Status
;
789 Status
= ConDrvScrollConsoleScreenBuffer(Buffer
->Header
.Console
,
791 ScrollScreenBufferRequest
->Unicode
,
792 &ScrollScreenBufferRequest
->ScrollRectangle
,
793 ScrollScreenBufferRequest
->UseClipRectangle
,
794 &ScrollScreenBufferRequest
->ClipRectangle
,
795 &ScrollScreenBufferRequest
->DestinationOrigin
,
796 ScrollScreenBufferRequest
->Fill
);
798 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
803 ConDrvSetConsoleWindowInfo(IN PCONSOLE Console
,
804 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
806 IN PSMALL_RECT WindowRect
);
807 CSR_API(SrvSetConsoleWindowInfo
)
810 PCONSOLE_SETWINDOWINFO SetWindowInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetWindowInfoRequest
;
811 // PCONSOLE_SCREEN_BUFFER Buffer;
812 PTEXTMODE_SCREEN_BUFFER Buffer
;
814 DPRINT1("SrvSetConsoleWindowInfo(0x%08x, %d, {L%d, T%d, R%d, B%d}) called\n",
815 SetWindowInfoRequest
->OutputHandle
, SetWindowInfoRequest
->Absolute
,
816 SetWindowInfoRequest
->WindowRect
.Left
,
817 SetWindowInfoRequest
->WindowRect
.Top
,
818 SetWindowInfoRequest
->WindowRect
.Right
,
819 SetWindowInfoRequest
->WindowRect
.Bottom
);
821 // ConSrvGetScreenBuffer
822 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
823 SetWindowInfoRequest
->OutputHandle
,
824 &Buffer
, GENERIC_READ
, TRUE
);
825 if (!NT_SUCCESS(Status
)) return Status
;
827 Status
= ConDrvSetConsoleWindowInfo(Buffer
->Header
.Console
,
829 SetWindowInfoRequest
->Absolute
,
830 &SetWindowInfoRequest
->WindowRect
);
832 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);