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 *******************************************************************/
17 /* PUBLIC SERVER APIS *********************************************************/
20 ConDrvInvalidateBitMapRect(IN PCONSOLE Console
,
21 IN PCONSOLE_SCREEN_BUFFER Buffer
,
22 IN PSMALL_RECT Region
);
23 CSR_API(SrvInvalidateBitMapRect
)
26 PCONSOLE_INVALIDATEDIBITS InvalidateDIBitsRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.InvalidateDIBitsRequest
;
27 PCONSOLE_SCREEN_BUFFER Buffer
;
29 DPRINT("SrvInvalidateBitMapRect\n");
31 Status
= ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
32 InvalidateDIBitsRequest
->OutputHandle
,
33 &Buffer
, GENERIC_READ
, TRUE
);
34 if (!NT_SUCCESS(Status
)) return Status
;
36 Status
= ConDrvInvalidateBitMapRect(Buffer
->Header
.Console
,
38 &InvalidateDIBitsRequest
->Region
);
40 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
45 ConDrvSetConsolePalette(IN PCONSOLE Console
,
46 // IN PGRAPHICS_SCREEN_BUFFER Buffer,
47 IN PCONSOLE_SCREEN_BUFFER Buffer
,
48 IN HPALETTE PaletteHandle
,
49 IN UINT PaletteUsage
);
50 CSR_API(SrvSetConsolePalette
)
53 PCONSOLE_SETPALETTE SetPaletteRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetPaletteRequest
;
54 // PGRAPHICS_SCREEN_BUFFER Buffer;
55 PCONSOLE_SCREEN_BUFFER Buffer
;
57 DPRINT("SrvSetConsolePalette\n");
59 // NOTE: Tests show that this function is used only for graphics screen buffers
60 // and otherwise it returns FALSE + sets last error to invalid handle.
61 // I think it's ridiculous, because if you are in text mode, simulating
62 // a change of VGA palette via DAC registers (done by a call to SetConsolePalette)
63 // cannot be done... So I allow it in ReactOS !
65 Status = ConSrvGetGraphicsBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
66 SetPaletteRequest->OutputHandle,
67 &Buffer, GENERIC_WRITE, TRUE);
69 Status
= ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
70 SetPaletteRequest
->OutputHandle
,
71 &Buffer
, GENERIC_WRITE
, TRUE
);
72 if (!NT_SUCCESS(Status
)) return Status
;
75 * Make the palette handle public, so that it can be
76 * used by other threads calling GDI functions on it.
77 * Indeed, the palette handle comes from a console app
78 * calling ourselves, running in CSRSS.
80 NtUserConsoleControl(ConsoleMakePalettePublic
,
81 &SetPaletteRequest
->PaletteHandle
,
82 sizeof(SetPaletteRequest
->PaletteHandle
));
84 Status
= ConDrvSetConsolePalette(Buffer
->Header
.Console
,
86 SetPaletteRequest
->PaletteHandle
,
87 SetPaletteRequest
->Usage
);
89 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
94 ConDrvGetConsoleCursorInfo(IN PCONSOLE Console
,
95 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
96 OUT PCONSOLE_CURSOR_INFO CursorInfo
);
97 CSR_API(SrvGetConsoleCursorInfo
)
100 PCONSOLE_GETSETCURSORINFO CursorInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.CursorInfoRequest
;
101 PTEXTMODE_SCREEN_BUFFER Buffer
;
103 DPRINT("SrvGetConsoleCursorInfo\n");
105 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
106 CursorInfoRequest
->OutputHandle
,
107 &Buffer
, GENERIC_READ
, TRUE
);
108 if (!NT_SUCCESS(Status
)) return Status
;
110 Status
= ConDrvGetConsoleCursorInfo(Buffer
->Header
.Console
,
112 &CursorInfoRequest
->Info
);
114 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
119 ConDrvSetConsoleCursorInfo(IN PCONSOLE Console
,
120 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
121 IN PCONSOLE_CURSOR_INFO CursorInfo
);
122 CSR_API(SrvSetConsoleCursorInfo
)
125 PCONSOLE_GETSETCURSORINFO CursorInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.CursorInfoRequest
;
126 PTEXTMODE_SCREEN_BUFFER Buffer
;
128 DPRINT("SrvSetConsoleCursorInfo\n");
130 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
131 CursorInfoRequest
->OutputHandle
,
132 &Buffer
, GENERIC_WRITE
, TRUE
);
133 if (!NT_SUCCESS(Status
)) return Status
;
135 Status
= ConDrvSetConsoleCursorInfo(Buffer
->Header
.Console
,
137 &CursorInfoRequest
->Info
);
139 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
144 ConDrvSetConsoleCursorPosition(IN PCONSOLE Console
,
145 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
147 CSR_API(SrvSetConsoleCursorPosition
)
150 PCONSOLE_SETCURSORPOSITION SetCursorPositionRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetCursorPositionRequest
;
151 PTEXTMODE_SCREEN_BUFFER Buffer
;
153 DPRINT("SrvSetConsoleCursorPosition\n");
155 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
156 SetCursorPositionRequest
->OutputHandle
,
157 &Buffer
, GENERIC_WRITE
, TRUE
);
158 if (!NT_SUCCESS(Status
)) return Status
;
160 Status
= ConDrvSetConsoleCursorPosition(Buffer
->Header
.Console
,
162 &SetCursorPositionRequest
->Position
);
164 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
168 CSR_API(SrvCreateConsoleScreenBuffer
)
170 NTSTATUS Status
= STATUS_INVALID_PARAMETER
;
171 PCONSOLE_CREATESCREENBUFFER CreateScreenBufferRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.CreateScreenBufferRequest
;
172 PCONSOLE_PROCESS_DATA ProcessData
= ConsoleGetPerProcessData(CsrGetClientThread()->Process
);
174 PCONSOLE_SCREEN_BUFFER Buff
;
176 PVOID ScreenBufferInfo
= NULL
;
177 TEXTMODE_BUFFER_INFO TextModeInfo
= {{80, 25},
178 DEFAULT_SCREEN_ATTRIB
,
179 DEFAULT_POPUP_ATTRIB
,
181 CSR_DEFAULT_CURSOR_SIZE
};
182 GRAPHICS_BUFFER_INFO GraphicsInfo
;
183 GraphicsInfo
.Info
= CreateScreenBufferRequest
->GraphicsBufferInfo
; // HACK for MSVC
185 DPRINT("SrvCreateConsoleScreenBuffer\n");
187 Status
= ConSrvGetConsole(ProcessData
, &Console
, TRUE
);
188 if (!NT_SUCCESS(Status
)) return Status
;
190 if (CreateScreenBufferRequest
->ScreenBufferType
== CONSOLE_TEXTMODE_BUFFER
)
192 ScreenBufferInfo
= &TextModeInfo
;
195 if (Console->ActiveBuffer)
197 TextModeInfo.ScreenBufferSize = Console->ActiveBuffer->ScreenBufferSize;
198 if (TextModeInfo.ScreenBufferSize.X == 0) TextModeInfo.ScreenBufferSize.X = 80;
199 if (TextModeInfo.ScreenBufferSize.Y == 0) TextModeInfo.ScreenBufferSize.Y = 25;
201 TextModeInfo.ScreenAttrib = Console->ActiveBuffer->ScreenBuffer.TextBuffer.ScreenDefaultAttrib;
202 TextModeInfo.PopupAttrib = Console->ActiveBuffer->ScreenBuffer.TextBuffer.PopupDefaultAttrib;
204 TextModeInfo.IsCursorVisible = Console->ActiveBuffer->CursorInfo.bVisible;
205 TextModeInfo.CursorSize = Console->ActiveBuffer->CursorInfo.dwSize;
210 * This is Windows' behaviour
213 /* Use the current console size. Regularize it if needed. */
214 TextModeInfo
.ScreenBufferSize
= Console
->ConsoleSize
;
215 if (TextModeInfo
.ScreenBufferSize
.X
== 0) TextModeInfo
.ScreenBufferSize
.X
= 1;
216 if (TextModeInfo
.ScreenBufferSize
.Y
== 0) TextModeInfo
.ScreenBufferSize
.Y
= 1;
218 /* If we have an active screen buffer, use its attributes as the new ones */
219 if (Console
->ActiveBuffer
&& GetType(Console
->ActiveBuffer
) == TEXTMODE_BUFFER
)
221 PTEXTMODE_SCREEN_BUFFER Buffer
= (PTEXTMODE_SCREEN_BUFFER
)Console
->ActiveBuffer
;
223 TextModeInfo
.ScreenAttrib
= Buffer
->ScreenDefaultAttrib
;
224 TextModeInfo
.PopupAttrib
= Buffer
->PopupDefaultAttrib
;
226 TextModeInfo
.IsCursorVisible
= Buffer
->CursorInfo
.bVisible
;
227 TextModeInfo
.CursorSize
= Buffer
->CursorInfo
.dwSize
;
230 else if (CreateScreenBufferRequest
->ScreenBufferType
== CONSOLE_GRAPHICS_BUFFER
)
232 /* Get infos from the graphics buffer information structure */
233 if (!CsrValidateMessageBuffer(ApiMessage
,
234 (PVOID
*)&CreateScreenBufferRequest
->GraphicsBufferInfo
.lpBitMapInfo
,
236 CreateScreenBufferRequest
->GraphicsBufferInfo
.dwBitMapInfoLength
))
238 Status
= STATUS_INVALID_PARAMETER
;
242 ScreenBufferInfo
= &GraphicsInfo
;
244 /* Initialize shared variables */
245 CreateScreenBufferRequest
->GraphicsBufferInfo
.hMutex
= GraphicsInfo
.Info
.hMutex
= INVALID_HANDLE_VALUE
;
246 CreateScreenBufferRequest
->GraphicsBufferInfo
.lpBitMap
= GraphicsInfo
.Info
.lpBitMap
= NULL
;
248 /* A graphics screen buffer is never inheritable */
249 CreateScreenBufferRequest
->Inheritable
= FALSE
;
252 Status
= ConDrvCreateScreenBuffer(&Buff
,
254 CreateScreenBufferRequest
->ScreenBufferType
,
256 if (!NT_SUCCESS(Status
)) goto Quit
;
258 /* Insert the new handle inside the process handles table */
259 RtlEnterCriticalSection(&ProcessData
->HandleTableLock
);
261 Status
= ConSrvInsertObject(ProcessData
,
262 &CreateScreenBufferRequest
->OutputHandle
,
264 CreateScreenBufferRequest
->Access
,
265 CreateScreenBufferRequest
->Inheritable
,
266 CreateScreenBufferRequest
->ShareMode
);
268 RtlLeaveCriticalSection(&ProcessData
->HandleTableLock
);
270 if (!NT_SUCCESS(Status
)) goto Quit
;
272 if (CreateScreenBufferRequest
->ScreenBufferType
== CONSOLE_GRAPHICS_BUFFER
)
274 PGRAPHICS_SCREEN_BUFFER Buffer
= (PGRAPHICS_SCREEN_BUFFER
)Buff
;
276 * Initialize the graphics buffer information structure
277 * and give it back to the client.
279 CreateScreenBufferRequest
->GraphicsBufferInfo
.hMutex
= Buffer
->ClientMutex
;
280 CreateScreenBufferRequest
->GraphicsBufferInfo
.lpBitMap
= Buffer
->ClientBitMap
;
284 ConSrvReleaseConsole(Console
, TRUE
);
289 ConDrvSetConsoleActiveScreenBuffer(IN PCONSOLE Console
,
290 IN PCONSOLE_SCREEN_BUFFER Buffer
);
291 CSR_API(SrvSetConsoleActiveScreenBuffer
)
294 PCONSOLE_SETACTIVESCREENBUFFER SetScreenBufferRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetScreenBufferRequest
;
295 PCONSOLE_SCREEN_BUFFER Buffer
;
297 DPRINT("SrvSetConsoleActiveScreenBuffer\n");
299 Status
= ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
300 SetScreenBufferRequest
->OutputHandle
,
301 &Buffer
, GENERIC_WRITE
, TRUE
);
302 if (!NT_SUCCESS(Status
)) return Status
;
304 Status
= ConDrvSetConsoleActiveScreenBuffer(Buffer
->Header
.Console
,
307 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
312 /* CSR THREADS FOR WriteConsole ***********************************************/
315 DoWriteConsole(IN PCSR_API_MESSAGE ApiMessage
,
316 IN PCSR_THREAD ClientThread
,
317 IN BOOLEAN CreateWaitBlock OPTIONAL
);
319 // Wait function CSR_WAIT_FUNCTION
322 WriteConsoleThread(IN PLIST_ENTRY WaitList
,
323 IN PCSR_THREAD WaitThread
,
324 IN PCSR_API_MESSAGE WaitApiMessage
,
325 IN PVOID WaitContext
,
326 IN PVOID WaitArgument1
,
327 IN PVOID WaitArgument2
,
332 DPRINT("WriteConsoleThread - WaitContext = 0x%p, WaitArgument1 = 0x%p, WaitArgument2 = 0x%p, WaitFlags = %lu\n", WaitContext
, WaitArgument1
, WaitArgument2
, WaitFlags
);
335 * If we are notified of the process termination via a call
336 * to CsrNotifyWaitBlock triggered by CsrDestroyProcess or
337 * CsrDestroyThread, just return.
339 if (WaitFlags
& CsrProcessTerminating
)
341 Status
= STATUS_THREAD_IS_TERMINATING
;
345 Status
= DoWriteConsole(WaitApiMessage
, WaitThread
, FALSE
);
348 if (Status
!= STATUS_PENDING
)
350 WaitApiMessage
->Status
= Status
;
353 return (Status
== STATUS_PENDING
? FALSE
: TRUE
);
357 ConDrvWriteConsole(IN PCONSOLE Console
,
358 IN PTEXTMODE_SCREEN_BUFFER ScreenBuffer
,
360 IN PVOID StringBuffer
,
361 IN ULONG NumCharsToWrite
,
362 OUT PULONG NumCharsWritten OPTIONAL
);
364 DoWriteConsole(IN PCSR_API_MESSAGE ApiMessage
,
365 IN PCSR_THREAD ClientThread
,
366 IN BOOLEAN CreateWaitBlock OPTIONAL
)
369 PCONSOLE_WRITECONSOLE WriteConsoleRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteConsoleRequest
;
370 PTEXTMODE_SCREEN_BUFFER ScreenBuffer
;
372 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(ClientThread
->Process
),
373 WriteConsoleRequest
->OutputHandle
,
374 &ScreenBuffer
, GENERIC_WRITE
, FALSE
);
375 if (!NT_SUCCESS(Status
)) return Status
;
377 Status
= ConDrvWriteConsole(ScreenBuffer
->Header
.Console
,
379 WriteConsoleRequest
->Unicode
,
380 WriteConsoleRequest
->Buffer
,
381 WriteConsoleRequest
->NrCharactersToWrite
,
382 &WriteConsoleRequest
->NrCharactersWritten
);
384 if (Status
== STATUS_PENDING
)
388 if (!CsrCreateWait(&ScreenBuffer
->Header
.Console
->WriteWaitQueue
,
395 Status
= STATUS_NO_MEMORY
;
400 /* Wait until we un-pause the console */
401 // Status = STATUS_PENDING;
405 ConSrvReleaseScreenBuffer(ScreenBuffer
, FALSE
);
410 /* TEXT OUTPUT APIS ***********************************************************/
413 ConDrvReadConsoleOutput(IN PCONSOLE Console
,
414 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
416 OUT PCHAR_INFO CharInfo
/*Buffer*/,
417 IN PCOORD BufferSize
,
418 IN PCOORD BufferCoord
,
419 IN OUT PSMALL_RECT ReadRegion
);
420 CSR_API(SrvReadConsoleOutput
)
423 PCONSOLE_READOUTPUT ReadOutputRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ReadOutputRequest
;
424 PTEXTMODE_SCREEN_BUFFER Buffer
;
426 DPRINT("SrvReadConsoleOutput\n");
428 if (!CsrValidateMessageBuffer(ApiMessage
,
429 (PVOID
*)&ReadOutputRequest
->CharInfo
,
430 ReadOutputRequest
->BufferSize
.X
* ReadOutputRequest
->BufferSize
.Y
,
433 return STATUS_INVALID_PARAMETER
;
436 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
437 ReadOutputRequest
->OutputHandle
,
438 &Buffer
, GENERIC_READ
, TRUE
);
439 if (!NT_SUCCESS(Status
)) return Status
;
441 Status
= ConDrvReadConsoleOutput(Buffer
->Header
.Console
,
443 ReadOutputRequest
->Unicode
,
444 ReadOutputRequest
->CharInfo
,
445 &ReadOutputRequest
->BufferSize
,
446 &ReadOutputRequest
->BufferCoord
,
447 &ReadOutputRequest
->ReadRegion
);
449 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
454 ConDrvWriteConsoleOutput(IN PCONSOLE Console
,
455 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
457 IN PCHAR_INFO CharInfo
/*Buffer*/,
458 IN PCOORD BufferSize
,
459 IN PCOORD BufferCoord
,
460 IN OUT PSMALL_RECT WriteRegion
);
461 CSR_API(SrvWriteConsoleOutput
)
464 PCONSOLE_WRITEOUTPUT WriteOutputRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteOutputRequest
;
465 PTEXTMODE_SCREEN_BUFFER Buffer
;
467 DPRINT("SrvWriteConsoleOutput\n");
469 if (!CsrValidateMessageBuffer(ApiMessage
,
470 (PVOID
*)&WriteOutputRequest
->CharInfo
,
471 WriteOutputRequest
->BufferSize
.X
* WriteOutputRequest
->BufferSize
.Y
,
474 return STATUS_INVALID_PARAMETER
;
477 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
478 WriteOutputRequest
->OutputHandle
,
479 &Buffer
, GENERIC_WRITE
, TRUE
);
480 if (!NT_SUCCESS(Status
)) return Status
;
482 Status
= ConDrvWriteConsoleOutput(Buffer
->Header
.Console
,
484 WriteOutputRequest
->Unicode
,
485 WriteOutputRequest
->CharInfo
,
486 &WriteOutputRequest
->BufferSize
,
487 &WriteOutputRequest
->BufferCoord
,
488 &WriteOutputRequest
->WriteRegion
);
490 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
494 CSR_API(SrvWriteConsole
)
497 PCONSOLE_WRITECONSOLE WriteConsoleRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteConsoleRequest
;
499 DPRINT("SrvWriteConsole\n");
501 if (!CsrValidateMessageBuffer(ApiMessage
,
502 (PVOID
)&WriteConsoleRequest
->Buffer
,
503 WriteConsoleRequest
->BufferSize
,
506 return STATUS_INVALID_PARAMETER
;
509 Status
= DoWriteConsole(ApiMessage
, CsrGetClientThread(), TRUE
);
511 if (Status
== STATUS_PENDING
) *ReplyCode
= CsrReplyPending
;
517 ConDrvReadConsoleOutputString(IN PCONSOLE Console
,
518 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
519 IN CODE_TYPE CodeType
,
520 OUT PVOID StringBuffer
,
521 IN ULONG NumCodesToRead
,
524 OUT PULONG CodesRead
);
525 CSR_API(SrvReadConsoleOutputString
)
528 PCONSOLE_READOUTPUTCODE ReadOutputCodeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ReadOutputCodeRequest
;
529 PTEXTMODE_SCREEN_BUFFER Buffer
;
532 DPRINT("SrvReadConsoleOutputString\n");
534 switch (ReadOutputCodeRequest
->CodeType
)
537 CodeSize
= sizeof(CHAR
);
541 CodeSize
= sizeof(WCHAR
);
545 CodeSize
= sizeof(WORD
);
549 return STATUS_INVALID_PARAMETER
;
552 if (!CsrValidateMessageBuffer(ApiMessage
,
553 (PVOID
*)&ReadOutputCodeRequest
->pCode
.pCode
,
554 ReadOutputCodeRequest
->NumCodesToRead
,
557 return STATUS_INVALID_PARAMETER
;
560 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
561 ReadOutputCodeRequest
->OutputHandle
,
562 &Buffer
, GENERIC_READ
, TRUE
);
563 if (!NT_SUCCESS(Status
)) return Status
;
565 Status
= ConDrvReadConsoleOutputString(Buffer
->Header
.Console
,
567 ReadOutputCodeRequest
->CodeType
,
568 ReadOutputCodeRequest
->pCode
.pCode
,
569 ReadOutputCodeRequest
->NumCodesToRead
,
570 &ReadOutputCodeRequest
->ReadCoord
,
571 &ReadOutputCodeRequest
->EndCoord
,
572 &ReadOutputCodeRequest
->CodesRead
);
574 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
579 ConDrvWriteConsoleOutputString(IN PCONSOLE Console
,
580 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
581 IN CODE_TYPE CodeType
,
582 IN PVOID StringBuffer
,
583 IN ULONG NumCodesToWrite
,
584 IN PCOORD WriteCoord
/*,
586 OUT PULONG CodesWritten */);
587 CSR_API(SrvWriteConsoleOutputString
)
590 PCONSOLE_WRITEOUTPUTCODE WriteOutputCodeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteOutputCodeRequest
;
591 PTEXTMODE_SCREEN_BUFFER Buffer
;
594 DPRINT("SrvWriteConsoleOutputString\n");
596 switch (WriteOutputCodeRequest
->CodeType
)
599 CodeSize
= sizeof(CHAR
);
603 CodeSize
= sizeof(WCHAR
);
607 CodeSize
= sizeof(WORD
);
611 return STATUS_INVALID_PARAMETER
;
614 if (!CsrValidateMessageBuffer(ApiMessage
,
615 (PVOID
*)&WriteOutputCodeRequest
->pCode
.pCode
,
616 WriteOutputCodeRequest
->Length
,
619 return STATUS_INVALID_PARAMETER
;
622 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
623 WriteOutputCodeRequest
->OutputHandle
,
624 &Buffer
, GENERIC_WRITE
, TRUE
);
625 if (!NT_SUCCESS(Status
)) return Status
;
627 Status
= ConDrvWriteConsoleOutputString(Buffer
->Header
.Console
,
629 WriteOutputCodeRequest
->CodeType
,
630 WriteOutputCodeRequest
->pCode
.pCode
,
631 WriteOutputCodeRequest
->Length
, // NumCodesToWrite,
632 &WriteOutputCodeRequest
->Coord
/*, // WriteCoord,
633 &WriteOutputCodeRequest->EndCoord,
634 &WriteOutputCodeRequest->NrCharactersWritten */);
636 // WriteOutputCodeRequest->NrCharactersWritten = Written;
638 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
643 ConDrvFillConsoleOutput(IN PCONSOLE Console
,
644 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
645 IN CODE_TYPE CodeType
,
647 IN ULONG NumCodesToWrite
,
648 IN PCOORD WriteCoord
/*,
649 OUT PULONG CodesWritten */);
650 CSR_API(SrvFillConsoleOutput
)
653 PCONSOLE_FILLOUTPUTCODE FillOutputRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.FillOutputRequest
;
654 PTEXTMODE_SCREEN_BUFFER Buffer
;
655 USHORT CodeType
= FillOutputRequest
->CodeType
;
657 DPRINT("SrvFillConsoleOutput\n");
659 if ( (CodeType
!= CODE_ASCII
) &&
660 (CodeType
!= CODE_UNICODE
) &&
661 (CodeType
!= CODE_ATTRIBUTE
) )
663 return STATUS_INVALID_PARAMETER
;
666 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
667 FillOutputRequest
->OutputHandle
,
668 &Buffer
, GENERIC_WRITE
, TRUE
);
669 if (!NT_SUCCESS(Status
)) return Status
;
671 Status
= ConDrvFillConsoleOutput(Buffer
->Header
.Console
,
674 &FillOutputRequest
->Code
,
675 FillOutputRequest
->Length
, // NumCodesToWrite,
676 &FillOutputRequest
->Coord
/*, // WriteCoord,
677 &FillOutputRequest->NrCharactersWritten */);
679 // FillOutputRequest->NrCharactersWritten = Written;
681 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
686 ConDrvGetConsoleScreenBufferInfo(IN PCONSOLE Console
,
687 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
688 OUT PCONSOLE_SCREEN_BUFFER_INFO ScreenBufferInfo
);
689 CSR_API(SrvGetConsoleScreenBufferInfo
)
692 PCONSOLE_GETSCREENBUFFERINFO ScreenBufferInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ScreenBufferInfoRequest
;
693 PTEXTMODE_SCREEN_BUFFER Buffer
;
695 DPRINT("SrvGetConsoleScreenBufferInfo\n");
697 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
698 ScreenBufferInfoRequest
->OutputHandle
,
699 &Buffer
, GENERIC_READ
, TRUE
);
700 if (!NT_SUCCESS(Status
)) return Status
;
702 Status
= ConDrvGetConsoleScreenBufferInfo(Buffer
->Header
.Console
,
704 &ScreenBufferInfoRequest
->Info
);
706 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
711 ConDrvSetConsoleTextAttribute(IN PCONSOLE Console
,
712 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
714 CSR_API(SrvSetConsoleTextAttribute
)
717 PCONSOLE_SETTEXTATTRIB SetTextAttribRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetTextAttribRequest
;
718 PTEXTMODE_SCREEN_BUFFER Buffer
;
720 DPRINT("SrvSetConsoleTextAttribute\n");
722 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
723 SetTextAttribRequest
->OutputHandle
,
724 &Buffer
, GENERIC_WRITE
, TRUE
);
725 if (!NT_SUCCESS(Status
)) return Status
;
727 Status
= ConDrvSetConsoleTextAttribute(Buffer
->Header
.Console
,
729 SetTextAttribRequest
->Attrib
);
731 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
736 ConDrvSetConsoleScreenBufferSize(IN PCONSOLE Console
,
737 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
739 CSR_API(SrvSetConsoleScreenBufferSize
)
742 PCONSOLE_SETSCREENBUFFERSIZE SetScreenBufferSizeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetScreenBufferSizeRequest
;
743 PTEXTMODE_SCREEN_BUFFER Buffer
;
745 DPRINT("SrvSetConsoleScreenBufferSize\n");
747 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
748 SetScreenBufferSizeRequest
->OutputHandle
,
749 &Buffer
, GENERIC_WRITE
, TRUE
);
750 if (!NT_SUCCESS(Status
)) return Status
;
752 Status
= ConDrvSetConsoleScreenBufferSize(Buffer
->Header
.Console
,
754 &SetScreenBufferSizeRequest
->Size
);
756 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
761 ConDrvScrollConsoleScreenBuffer(IN PCONSOLE Console
,
762 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
764 IN PSMALL_RECT ScrollRectangle
,
765 IN BOOLEAN UseClipRectangle
,
766 IN PSMALL_RECT ClipRectangle OPTIONAL
,
767 IN PCOORD DestinationOrigin
,
768 IN CHAR_INFO FillChar
);
769 CSR_API(SrvScrollConsoleScreenBuffer
)
772 PCONSOLE_SCROLLSCREENBUFFER ScrollScreenBufferRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ScrollScreenBufferRequest
;
773 PTEXTMODE_SCREEN_BUFFER Buffer
;
775 DPRINT("SrvScrollConsoleScreenBuffer\n");
777 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
778 ScrollScreenBufferRequest
->OutputHandle
,
779 &Buffer
, GENERIC_WRITE
, TRUE
);
780 if (!NT_SUCCESS(Status
)) return Status
;
782 Status
= ConDrvScrollConsoleScreenBuffer(Buffer
->Header
.Console
,
784 ScrollScreenBufferRequest
->Unicode
,
785 &ScrollScreenBufferRequest
->ScrollRectangle
,
786 ScrollScreenBufferRequest
->UseClipRectangle
,
787 &ScrollScreenBufferRequest
->ClipRectangle
,
788 &ScrollScreenBufferRequest
->DestinationOrigin
,
789 ScrollScreenBufferRequest
->Fill
);
791 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
796 ConDrvSetConsoleWindowInfo(IN PCONSOLE Console
,
797 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
799 IN PSMALL_RECT WindowRect
);
800 CSR_API(SrvSetConsoleWindowInfo
)
803 PCONSOLE_SETWINDOWINFO SetWindowInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetWindowInfoRequest
;
804 // PCONSOLE_SCREEN_BUFFER Buffer;
805 PTEXTMODE_SCREEN_BUFFER Buffer
;
807 DPRINT1("SrvSetConsoleWindowInfo(0x%08x, %d, {L%d, T%d, R%d, B%d}) called\n",
808 SetWindowInfoRequest
->OutputHandle
, SetWindowInfoRequest
->Absolute
,
809 SetWindowInfoRequest
->WindowRect
.Left
,
810 SetWindowInfoRequest
->WindowRect
.Top
,
811 SetWindowInfoRequest
->WindowRect
.Right
,
812 SetWindowInfoRequest
->WindowRect
.Bottom
);
814 // ConSrvGetScreenBuffer
815 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
816 SetWindowInfoRequest
->OutputHandle
,
817 &Buffer
, GENERIC_READ
, TRUE
);
818 if (!NT_SUCCESS(Status
)) return Status
;
820 Status
= ConDrvSetConsoleWindowInfo(Buffer
->Header
.Console
,
822 SetWindowInfoRequest
->Absolute
,
823 &SetWindowInfoRequest
->WindowRect
);
825 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);