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
;
67 /******************************************************************************\
68 |************** HACK! HACK! HACK! HACK! HACK! HACK! HACK! HACK! ***************|
69 \******************************************************************************/
71 #define PALETTESIZE 256
73 LPLOGPALETTE LogPalette
; /* Pointer to logical palette */
74 PALETTEENTRY MyPalette
[] =
75 { {0, 0, 0x80,0} , // 1
78 {0, 0x80,0x80,0} , // 3
80 {0x80,0, 0x80,0} , // 5
81 {0x80,0x80,0, 0} , // 6
82 {0xC0,0xC0,0xC0,0} , // 7
83 {0x80,0x80,0x80,0} , // 8
85 {0, 0xFF,0, 0} , // 10
86 {0, 0xFF,0xFF,0} , // 11
87 {0xFF,0, 0, 0} , // 12
88 {0xFF,0, 0xFF,0} , // 13
89 {0xFF,0xFF,0, 0} , // 14
90 {0xFF,0xFF,0xFF,0} }; // 15
92 /******************************************************************************\
93 |************** HACK! HACK! HACK! HACK! HACK! HACK! HACK! HACK! ***************|
94 \******************************************************************************/
97 DPRINT1("SrvSetConsolePalette\n");
99 // NOTE: Tests show that this function is used only for graphics screen buffers
100 // and otherwise it returns FALSE + sets last error to invalid handle.
101 // I think it's ridiculous, because if you are in text mode, simulating
102 // a change of VGA palette via DAC registers (done by a call to SetConsolePalette)
103 // cannot be done... So I allow it in ReactOS !
105 Status = ConSrvGetGraphicsBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
106 SetPaletteRequest->OutputHandle,
107 &Buffer, GENERIC_WRITE, TRUE);
109 Status
= ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
110 SetPaletteRequest
->OutputHandle
,
111 &Buffer
, GENERIC_WRITE
, TRUE
);
112 if (!NT_SUCCESS(Status
)) return Status
;
115 /******************************************************************************\
116 |************** HACK! HACK! HACK! HACK! HACK! HACK! HACK! HACK! ***************|
117 \******************************************************************************/
119 DPRINT1("HACK: FIXME: SrvSetConsolePalette - Use hacked palette for testing purposes!!\n");
121 LogPalette
= (LPLOGPALETTE
)ConsoleAllocHeap(HEAP_ZERO_MEMORY
,
122 (sizeof(LOGPALETTE
) +
123 (sizeof(PALETTEENTRY
) * PALETTESIZE
)));
128 LogPalette
->palVersion
= 0x300;
129 LogPalette
->palNumEntries
= PALETTESIZE
;
131 for (i
= 0 ; i
< PALETTESIZE
; i
++)
133 LogPalette
->palPalEntry
[i
] = MyPalette
[i
% sizeof(MyPalette
)/sizeof(MyPalette
[0])];
136 SetPaletteRequest
->PaletteHandle
= CreatePalette(LogPalette
);
137 SetPaletteRequest
->Usage
= SYSPAL_NOSTATIC256
;
138 ConsoleFreeHeap(LogPalette
);
142 DPRINT1("SrvSetConsolePalette - Hacked LogPalette is NULL\n");
145 /******************************************************************************\
146 |************** HACK! HACK! HACK! HACK! HACK! HACK! HACK! HACK! ***************|
147 \******************************************************************************/
150 DPRINT1("ConDrvSetConsolePalette calling...\n");
152 Status
= ConDrvSetConsolePalette(Buffer
->Header
.Console
,
154 SetPaletteRequest
->PaletteHandle
,
155 SetPaletteRequest
->Usage
);
157 DPRINT1("ConDrvSetConsolePalette returned Status 0x%08lx\n", Status
);
159 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
164 ConDrvGetConsoleCursorInfo(IN PCONSOLE Console
,
165 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
166 OUT PCONSOLE_CURSOR_INFO CursorInfo
);
167 CSR_API(SrvGetConsoleCursorInfo
)
170 PCONSOLE_GETSETCURSORINFO CursorInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.CursorInfoRequest
;
171 PTEXTMODE_SCREEN_BUFFER Buffer
;
173 DPRINT("SrvGetConsoleCursorInfo\n");
175 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
176 CursorInfoRequest
->OutputHandle
,
177 &Buffer
, GENERIC_READ
, TRUE
);
178 if (!NT_SUCCESS(Status
)) return Status
;
180 Status
= ConDrvGetConsoleCursorInfo(Buffer
->Header
.Console
,
182 &CursorInfoRequest
->Info
);
184 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
189 ConDrvSetConsoleCursorInfo(IN PCONSOLE Console
,
190 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
191 IN PCONSOLE_CURSOR_INFO CursorInfo
);
192 CSR_API(SrvSetConsoleCursorInfo
)
195 PCONSOLE_GETSETCURSORINFO CursorInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.CursorInfoRequest
;
196 PTEXTMODE_SCREEN_BUFFER Buffer
;
198 DPRINT("SrvSetConsoleCursorInfo\n");
200 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
201 CursorInfoRequest
->OutputHandle
,
202 &Buffer
, GENERIC_WRITE
, TRUE
);
203 if (!NT_SUCCESS(Status
)) return Status
;
205 Status
= ConDrvSetConsoleCursorInfo(Buffer
->Header
.Console
,
207 &CursorInfoRequest
->Info
);
209 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
214 ConDrvSetConsoleCursorPosition(IN PCONSOLE Console
,
215 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
217 CSR_API(SrvSetConsoleCursorPosition
)
220 PCONSOLE_SETCURSORPOSITION SetCursorPositionRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetCursorPositionRequest
;
221 PTEXTMODE_SCREEN_BUFFER Buffer
;
223 DPRINT("SrvSetConsoleCursorPosition\n");
225 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
226 SetCursorPositionRequest
->OutputHandle
,
227 &Buffer
, GENERIC_WRITE
, TRUE
);
228 if (!NT_SUCCESS(Status
)) return Status
;
230 Status
= ConDrvSetConsoleCursorPosition(Buffer
->Header
.Console
,
232 &SetCursorPositionRequest
->Position
);
234 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
238 CSR_API(SrvCreateConsoleScreenBuffer
)
240 NTSTATUS Status
= STATUS_INVALID_PARAMETER
;
241 PCONSOLE_CREATESCREENBUFFER CreateScreenBufferRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.CreateScreenBufferRequest
;
242 PCONSOLE_PROCESS_DATA ProcessData
= ConsoleGetPerProcessData(CsrGetClientThread()->Process
);
244 PCONSOLE_SCREEN_BUFFER Buff
;
246 PVOID ScreenBufferInfo
= NULL
;
247 TEXTMODE_BUFFER_INFO TextModeInfo
= {{80, 25},
248 DEFAULT_SCREEN_ATTRIB
,
249 DEFAULT_POPUP_ATTRIB
,
251 CSR_DEFAULT_CURSOR_SIZE
};
252 GRAPHICS_BUFFER_INFO GraphicsInfo
;
253 GraphicsInfo
.Info
= CreateScreenBufferRequest
->GraphicsBufferInfo
; // HACK for MSVC
255 DPRINT("SrvCreateConsoleScreenBuffer\n");
257 Status
= ConSrvGetConsole(ProcessData
, &Console
, TRUE
);
258 if (!NT_SUCCESS(Status
)) return Status
;
260 if (CreateScreenBufferRequest
->ScreenBufferType
== CONSOLE_TEXTMODE_BUFFER
)
262 ScreenBufferInfo
= &TextModeInfo
;
265 if (Console->ActiveBuffer)
267 TextModeInfo.ScreenBufferSize = Console->ActiveBuffer->ScreenBufferSize;
268 if (TextModeInfo.ScreenBufferSize.X == 0) TextModeInfo.ScreenBufferSize.X = 80;
269 if (TextModeInfo.ScreenBufferSize.Y == 0) TextModeInfo.ScreenBufferSize.Y = 25;
271 TextModeInfo.ScreenAttrib = Console->ActiveBuffer->ScreenBuffer.TextBuffer.ScreenDefaultAttrib;
272 TextModeInfo.PopupAttrib = Console->ActiveBuffer->ScreenBuffer.TextBuffer.PopupDefaultAttrib;
274 TextModeInfo.IsCursorVisible = Console->ActiveBuffer->CursorInfo.bVisible;
275 TextModeInfo.CursorSize = Console->ActiveBuffer->CursorInfo.dwSize;
280 * This is Windows' behaviour
283 /* Use the current console size. Regularize it if needed. */
284 TextModeInfo
.ScreenBufferSize
= Console
->ConsoleSize
;
285 if (TextModeInfo
.ScreenBufferSize
.X
== 0) TextModeInfo
.ScreenBufferSize
.X
= 1;
286 if (TextModeInfo
.ScreenBufferSize
.Y
== 0) TextModeInfo
.ScreenBufferSize
.Y
= 1;
288 /* If we have an active screen buffer, use its attributes as the new ones */
289 if (Console
->ActiveBuffer
&& GetType(Console
->ActiveBuffer
) == TEXTMODE_BUFFER
)
291 PTEXTMODE_SCREEN_BUFFER Buffer
= (PTEXTMODE_SCREEN_BUFFER
)Console
->ActiveBuffer
;
293 TextModeInfo
.ScreenAttrib
= Buffer
->ScreenDefaultAttrib
;
294 TextModeInfo
.PopupAttrib
= Buffer
->PopupDefaultAttrib
;
296 TextModeInfo
.IsCursorVisible
= Buffer
->CursorInfo
.bVisible
;
297 TextModeInfo
.CursorSize
= Buffer
->CursorInfo
.dwSize
;
300 else if (CreateScreenBufferRequest
->ScreenBufferType
== CONSOLE_GRAPHICS_BUFFER
)
302 /* Get infos from the graphics buffer information structure */
303 if (!CsrValidateMessageBuffer(ApiMessage
,
304 (PVOID
*)&CreateScreenBufferRequest
->GraphicsBufferInfo
.lpBitMapInfo
,
306 CreateScreenBufferRequest
->GraphicsBufferInfo
.dwBitMapInfoLength
))
308 Status
= STATUS_INVALID_PARAMETER
;
312 ScreenBufferInfo
= &GraphicsInfo
;
314 /* Initialize shared variables */
315 CreateScreenBufferRequest
->GraphicsBufferInfo
.hMutex
= GraphicsInfo
.Info
.hMutex
= INVALID_HANDLE_VALUE
;
316 CreateScreenBufferRequest
->GraphicsBufferInfo
.lpBitMap
= GraphicsInfo
.Info
.lpBitMap
= NULL
;
318 /* A graphics screen buffer is never inheritable */
319 CreateScreenBufferRequest
->Inheritable
= FALSE
;
322 Status
= ConDrvCreateScreenBuffer(&Buff
,
324 CreateScreenBufferRequest
->ScreenBufferType
,
326 if (!NT_SUCCESS(Status
)) goto Quit
;
328 /* Insert the new handle inside the process handles table */
329 RtlEnterCriticalSection(&ProcessData
->HandleTableLock
);
331 Status
= ConSrvInsertObject(ProcessData
,
332 &CreateScreenBufferRequest
->OutputHandle
,
334 CreateScreenBufferRequest
->Access
,
335 CreateScreenBufferRequest
->Inheritable
,
336 CreateScreenBufferRequest
->ShareMode
);
338 RtlLeaveCriticalSection(&ProcessData
->HandleTableLock
);
340 if (!NT_SUCCESS(Status
)) goto Quit
;
342 if (CreateScreenBufferRequest
->ScreenBufferType
== CONSOLE_GRAPHICS_BUFFER
)
344 PGRAPHICS_SCREEN_BUFFER Buffer
= (PGRAPHICS_SCREEN_BUFFER
)Buff
;
346 * Initialize the graphics buffer information structure
347 * and give it back to the client.
349 CreateScreenBufferRequest
->GraphicsBufferInfo
.hMutex
= Buffer
->ClientMutex
;
350 CreateScreenBufferRequest
->GraphicsBufferInfo
.lpBitMap
= Buffer
->ClientBitMap
;
354 ConSrvReleaseConsole(Console
, TRUE
);
359 ConDrvSetConsoleActiveScreenBuffer(IN PCONSOLE Console
,
360 IN PCONSOLE_SCREEN_BUFFER Buffer
);
361 CSR_API(SrvSetConsoleActiveScreenBuffer
)
364 PCONSOLE_SETACTIVESCREENBUFFER SetScreenBufferRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetScreenBufferRequest
;
365 PCONSOLE_SCREEN_BUFFER Buffer
;
367 DPRINT("SrvSetConsoleActiveScreenBuffer\n");
369 Status
= ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
370 SetScreenBufferRequest
->OutputHandle
,
371 &Buffer
, GENERIC_WRITE
, TRUE
);
372 if (!NT_SUCCESS(Status
)) return Status
;
374 Status
= ConDrvSetConsoleActiveScreenBuffer(Buffer
->Header
.Console
,
377 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
382 /* CSR THREADS FOR WriteConsole ***********************************************/
385 DoWriteConsole(IN PCSR_API_MESSAGE ApiMessage
,
386 IN PCSR_THREAD ClientThread
,
387 IN BOOL CreateWaitBlock OPTIONAL
);
389 // Wait function CSR_WAIT_FUNCTION
392 WriteConsoleThread(IN PLIST_ENTRY WaitList
,
393 IN PCSR_THREAD WaitThread
,
394 IN PCSR_API_MESSAGE WaitApiMessage
,
395 IN PVOID WaitContext
,
396 IN PVOID WaitArgument1
,
397 IN PVOID WaitArgument2
,
402 DPRINT("WriteConsoleThread - WaitContext = 0x%p, WaitArgument1 = 0x%p, WaitArgument2 = 0x%p, WaitFlags = %lu\n", WaitContext
, WaitArgument1
, WaitArgument2
, WaitFlags
);
405 * If we are notified of the process termination via a call
406 * to CsrNotifyWaitBlock triggered by CsrDestroyProcess or
407 * CsrDestroyThread, just return.
409 if (WaitFlags
& CsrProcessTerminating
)
411 Status
= STATUS_THREAD_IS_TERMINATING
;
415 Status
= DoWriteConsole(WaitApiMessage
,
420 if (Status
!= STATUS_PENDING
)
422 WaitApiMessage
->Status
= Status
;
425 return (Status
== STATUS_PENDING
? FALSE
: TRUE
);
429 ConDrvWriteConsole(IN PCONSOLE Console
,
430 IN PTEXTMODE_SCREEN_BUFFER ScreenBuffer
,
432 IN PVOID StringBuffer
,
433 IN ULONG NumCharsToWrite
,
434 OUT PULONG NumCharsWritten OPTIONAL
);
436 DoWriteConsole(IN PCSR_API_MESSAGE ApiMessage
,
437 IN PCSR_THREAD ClientThread
,
438 IN BOOL CreateWaitBlock OPTIONAL
)
441 PCONSOLE_WRITECONSOLE WriteConsoleRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteConsoleRequest
;
442 PTEXTMODE_SCREEN_BUFFER ScreenBuffer
;
444 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(ClientThread
->Process
),
445 WriteConsoleRequest
->OutputHandle
,
446 &ScreenBuffer
, GENERIC_WRITE
, FALSE
);
447 if (!NT_SUCCESS(Status
)) return Status
;
449 Status
= ConDrvWriteConsole(ScreenBuffer
->Header
.Console
,
451 WriteConsoleRequest
->Unicode
,
452 WriteConsoleRequest
->Buffer
,
453 WriteConsoleRequest
->NrCharactersToWrite
,
454 &WriteConsoleRequest
->NrCharactersWritten
);
456 if (Status
== STATUS_PENDING
)
460 if (!CsrCreateWait(&ScreenBuffer
->Header
.Console
->WriteWaitQueue
,
467 Status
= STATUS_NO_MEMORY
;
472 /* Wait until we un-pause the console */
473 // Status = STATUS_PENDING;
477 ConSrvReleaseScreenBuffer(ScreenBuffer
, FALSE
);
482 /* TEXT OUTPUT APIS ***********************************************************/
485 ConDrvReadConsoleOutput(IN PCONSOLE Console
,
486 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
488 OUT PCHAR_INFO CharInfo
/*Buffer*/,
489 IN PCOORD BufferSize
,
490 IN PCOORD BufferCoord
,
491 IN OUT PSMALL_RECT ReadRegion
);
492 CSR_API(SrvReadConsoleOutput
)
495 PCONSOLE_READOUTPUT ReadOutputRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ReadOutputRequest
;
496 PTEXTMODE_SCREEN_BUFFER Buffer
;
498 DPRINT("SrvReadConsoleOutput\n");
500 if (!CsrValidateMessageBuffer(ApiMessage
,
501 (PVOID
*)&ReadOutputRequest
->CharInfo
,
502 ReadOutputRequest
->BufferSize
.X
* ReadOutputRequest
->BufferSize
.Y
,
505 return STATUS_INVALID_PARAMETER
;
508 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
509 ReadOutputRequest
->OutputHandle
,
510 &Buffer
, GENERIC_READ
, TRUE
);
511 if (!NT_SUCCESS(Status
)) return Status
;
513 Status
= ConDrvReadConsoleOutput(Buffer
->Header
.Console
,
515 ReadOutputRequest
->Unicode
,
516 ReadOutputRequest
->CharInfo
,
517 &ReadOutputRequest
->BufferSize
,
518 &ReadOutputRequest
->BufferCoord
,
519 &ReadOutputRequest
->ReadRegion
);
521 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
526 ConDrvWriteConsoleOutput(IN PCONSOLE Console
,
527 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
529 IN PCHAR_INFO CharInfo
/*Buffer*/,
530 IN PCOORD BufferSize
,
531 IN PCOORD BufferCoord
,
532 IN OUT PSMALL_RECT WriteRegion
);
533 CSR_API(SrvWriteConsoleOutput
)
536 PCONSOLE_WRITEOUTPUT WriteOutputRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteOutputRequest
;
537 PTEXTMODE_SCREEN_BUFFER Buffer
;
539 DPRINT("SrvWriteConsoleOutput\n");
541 if (!CsrValidateMessageBuffer(ApiMessage
,
542 (PVOID
*)&WriteOutputRequest
->CharInfo
,
543 WriteOutputRequest
->BufferSize
.X
* WriteOutputRequest
->BufferSize
.Y
,
546 return STATUS_INVALID_PARAMETER
;
549 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
550 WriteOutputRequest
->OutputHandle
,
551 &Buffer
, GENERIC_WRITE
, TRUE
);
552 if (!NT_SUCCESS(Status
)) return Status
;
554 Status
= ConDrvWriteConsoleOutput(Buffer
->Header
.Console
,
556 WriteOutputRequest
->Unicode
,
557 WriteOutputRequest
->CharInfo
,
558 &WriteOutputRequest
->BufferSize
,
559 &WriteOutputRequest
->BufferCoord
,
560 &WriteOutputRequest
->WriteRegion
);
562 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
566 CSR_API(SrvWriteConsole
)
569 PCONSOLE_WRITECONSOLE WriteConsoleRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteConsoleRequest
;
571 DPRINT("SrvWriteConsole\n");
573 if (!CsrValidateMessageBuffer(ApiMessage
,
574 (PVOID
)&WriteConsoleRequest
->Buffer
,
575 WriteConsoleRequest
->BufferSize
,
578 return STATUS_INVALID_PARAMETER
;
581 Status
= DoWriteConsole(ApiMessage
,
582 CsrGetClientThread(),
585 if (Status
== STATUS_PENDING
) *ReplyCode
= CsrReplyPending
;
591 ConDrvReadConsoleOutputString(IN PCONSOLE Console
,
592 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
593 IN CODE_TYPE CodeType
,
594 OUT PVOID StringBuffer
,
595 IN ULONG NumCodesToRead
,
598 OUT PULONG CodesRead
);
599 CSR_API(SrvReadConsoleOutputString
)
602 PCONSOLE_READOUTPUTCODE ReadOutputCodeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ReadOutputCodeRequest
;
603 PTEXTMODE_SCREEN_BUFFER Buffer
;
606 DPRINT("SrvReadConsoleOutputString\n");
608 switch (ReadOutputCodeRequest
->CodeType
)
611 CodeSize
= sizeof(CHAR
);
615 CodeSize
= sizeof(WCHAR
);
619 CodeSize
= sizeof(WORD
);
623 return STATUS_INVALID_PARAMETER
;
626 if (!CsrValidateMessageBuffer(ApiMessage
,
627 (PVOID
*)&ReadOutputCodeRequest
->pCode
.pCode
,
628 ReadOutputCodeRequest
->NumCodesToRead
,
631 return STATUS_INVALID_PARAMETER
;
634 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
635 ReadOutputCodeRequest
->OutputHandle
,
636 &Buffer
, GENERIC_READ
, TRUE
);
637 if (!NT_SUCCESS(Status
)) return Status
;
639 Status
= ConDrvReadConsoleOutputString(Buffer
->Header
.Console
,
641 ReadOutputCodeRequest
->CodeType
,
642 ReadOutputCodeRequest
->pCode
.pCode
,
643 ReadOutputCodeRequest
->NumCodesToRead
,
644 &ReadOutputCodeRequest
->ReadCoord
,
645 &ReadOutputCodeRequest
->EndCoord
,
646 &ReadOutputCodeRequest
->CodesRead
);
648 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
653 ConDrvWriteConsoleOutputString(IN PCONSOLE Console
,
654 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
655 IN CODE_TYPE CodeType
,
656 IN PVOID StringBuffer
,
657 IN ULONG NumCodesToWrite
,
658 IN PCOORD WriteCoord
/*,
660 OUT PULONG CodesWritten */);
661 CSR_API(SrvWriteConsoleOutputString
)
664 PCONSOLE_WRITEOUTPUTCODE WriteOutputCodeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.WriteOutputCodeRequest
;
665 PTEXTMODE_SCREEN_BUFFER Buffer
;
668 DPRINT("SrvWriteConsoleOutputString\n");
670 switch (WriteOutputCodeRequest
->CodeType
)
673 CodeSize
= sizeof(CHAR
);
677 CodeSize
= sizeof(WCHAR
);
681 CodeSize
= sizeof(WORD
);
685 return STATUS_INVALID_PARAMETER
;
688 if (!CsrValidateMessageBuffer(ApiMessage
,
689 (PVOID
*)&WriteOutputCodeRequest
->pCode
.pCode
,
690 WriteOutputCodeRequest
->Length
,
693 return STATUS_INVALID_PARAMETER
;
696 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
697 WriteOutputCodeRequest
->OutputHandle
,
698 &Buffer
, GENERIC_WRITE
, TRUE
);
699 if (!NT_SUCCESS(Status
)) return Status
;
701 Status
= ConDrvWriteConsoleOutputString(Buffer
->Header
.Console
,
703 WriteOutputCodeRequest
->CodeType
,
704 WriteOutputCodeRequest
->pCode
.pCode
,
705 WriteOutputCodeRequest
->Length
, // NumCodesToWrite,
706 &WriteOutputCodeRequest
->Coord
/*, // WriteCoord,
707 &WriteOutputCodeRequest->EndCoord,
708 &WriteOutputCodeRequest->NrCharactersWritten */);
710 // WriteOutputCodeRequest->NrCharactersWritten = Written;
712 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
717 ConDrvFillConsoleOutput(IN PCONSOLE Console
,
718 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
719 IN CODE_TYPE CodeType
,
721 IN ULONG NumCodesToWrite
,
722 IN PCOORD WriteCoord
/*,
723 OUT PULONG CodesWritten */);
724 CSR_API(SrvFillConsoleOutput
)
727 PCONSOLE_FILLOUTPUTCODE FillOutputRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.FillOutputRequest
;
728 PTEXTMODE_SCREEN_BUFFER Buffer
;
729 USHORT CodeType
= FillOutputRequest
->CodeType
;
731 DPRINT("SrvFillConsoleOutput\n");
733 if ( (CodeType
!= CODE_ASCII
) &&
734 (CodeType
!= CODE_UNICODE
) &&
735 (CodeType
!= CODE_ATTRIBUTE
) )
737 return STATUS_INVALID_PARAMETER
;
740 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
741 FillOutputRequest
->OutputHandle
,
742 &Buffer
, GENERIC_WRITE
, TRUE
);
743 if (!NT_SUCCESS(Status
)) return Status
;
745 Status
= ConDrvFillConsoleOutput(Buffer
->Header
.Console
,
748 &FillOutputRequest
->Code
,
749 FillOutputRequest
->Length
, // NumCodesToWrite,
750 &FillOutputRequest
->Coord
/*, // WriteCoord,
751 &FillOutputRequest->NrCharactersWritten */);
753 // FillOutputRequest->NrCharactersWritten = Written;
755 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
760 ConDrvGetConsoleScreenBufferInfo(IN PCONSOLE Console
,
761 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
762 OUT PCONSOLE_SCREEN_BUFFER_INFO ScreenBufferInfo
);
763 CSR_API(SrvGetConsoleScreenBufferInfo
)
766 PCONSOLE_GETSCREENBUFFERINFO ScreenBufferInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ScreenBufferInfoRequest
;
767 PTEXTMODE_SCREEN_BUFFER Buffer
;
769 DPRINT("SrvGetConsoleScreenBufferInfo\n");
771 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
772 ScreenBufferInfoRequest
->OutputHandle
,
773 &Buffer
, GENERIC_READ
, TRUE
);
774 if (!NT_SUCCESS(Status
)) return Status
;
776 Status
= ConDrvGetConsoleScreenBufferInfo(Buffer
->Header
.Console
,
778 &ScreenBufferInfoRequest
->Info
);
780 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
785 ConDrvSetConsoleTextAttribute(IN PCONSOLE Console
,
786 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
788 CSR_API(SrvSetConsoleTextAttribute
)
791 PCONSOLE_SETTEXTATTRIB SetTextAttribRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetTextAttribRequest
;
792 PTEXTMODE_SCREEN_BUFFER Buffer
;
794 DPRINT("SrvSetConsoleTextAttribute\n");
796 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
797 SetTextAttribRequest
->OutputHandle
,
798 &Buffer
, GENERIC_WRITE
, TRUE
);
799 if (!NT_SUCCESS(Status
)) return Status
;
801 Status
= ConDrvSetConsoleTextAttribute(Buffer
->Header
.Console
,
803 SetTextAttribRequest
->Attrib
);
805 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
810 ConDrvSetConsoleScreenBufferSize(IN PCONSOLE Console
,
811 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
813 CSR_API(SrvSetConsoleScreenBufferSize
)
816 PCONSOLE_SETSCREENBUFFERSIZE SetScreenBufferSizeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetScreenBufferSizeRequest
;
817 PTEXTMODE_SCREEN_BUFFER Buffer
;
819 DPRINT("SrvSetConsoleScreenBufferSize\n");
821 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
822 SetScreenBufferSizeRequest
->OutputHandle
,
823 &Buffer
, GENERIC_WRITE
, TRUE
);
824 if (!NT_SUCCESS(Status
)) return Status
;
826 Status
= ConDrvSetConsoleScreenBufferSize(Buffer
->Header
.Console
,
828 &SetScreenBufferSizeRequest
->Size
);
830 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
835 ConDrvScrollConsoleScreenBuffer(IN PCONSOLE Console
,
836 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
838 IN PSMALL_RECT ScrollRectangle
,
839 IN BOOLEAN UseClipRectangle
,
840 IN PSMALL_RECT ClipRectangle OPTIONAL
,
841 IN PCOORD DestinationOrigin
,
842 IN CHAR_INFO FillChar
);
843 CSR_API(SrvScrollConsoleScreenBuffer
)
846 PCONSOLE_SCROLLSCREENBUFFER ScrollScreenBufferRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ScrollScreenBufferRequest
;
847 PTEXTMODE_SCREEN_BUFFER Buffer
;
849 DPRINT("SrvScrollConsoleScreenBuffer\n");
851 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
852 ScrollScreenBufferRequest
->OutputHandle
,
853 &Buffer
, GENERIC_WRITE
, TRUE
);
854 if (!NT_SUCCESS(Status
)) return Status
;
856 Status
= ConDrvScrollConsoleScreenBuffer(Buffer
->Header
.Console
,
858 ScrollScreenBufferRequest
->Unicode
,
859 &ScrollScreenBufferRequest
->ScrollRectangle
,
860 ScrollScreenBufferRequest
->UseClipRectangle
,
861 &ScrollScreenBufferRequest
->ClipRectangle
,
862 &ScrollScreenBufferRequest
->DestinationOrigin
,
863 ScrollScreenBufferRequest
->Fill
);
865 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);
870 ConDrvSetConsoleWindowInfo(IN PCONSOLE Console
,
871 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
873 IN PSMALL_RECT WindowRect
);
874 CSR_API(SrvSetConsoleWindowInfo
)
877 PCONSOLE_SETWINDOWINFO SetWindowInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetWindowInfoRequest
;
878 // PCONSOLE_SCREEN_BUFFER Buffer;
879 PTEXTMODE_SCREEN_BUFFER Buffer
;
881 DPRINT1("SrvSetConsoleWindowInfo(0x%08x, %d, {L%d, T%d, R%d, B%d}) called\n",
882 SetWindowInfoRequest
->OutputHandle
, SetWindowInfoRequest
->Absolute
,
883 SetWindowInfoRequest
->WindowRect
.Left
,
884 SetWindowInfoRequest
->WindowRect
.Top
,
885 SetWindowInfoRequest
->WindowRect
.Right
,
886 SetWindowInfoRequest
->WindowRect
.Bottom
);
888 // ConSrvGetScreenBuffer
889 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
890 SetWindowInfoRequest
->OutputHandle
,
891 &Buffer
, GENERIC_READ
, TRUE
);
892 if (!NT_SUCCESS(Status
)) return Status
;
894 Status
= ConDrvSetConsoleWindowInfo(Buffer
->Header
.Console
,
896 SetWindowInfoRequest
->Absolute
,
897 &SetWindowInfoRequest
->WindowRect
);
899 ConSrvReleaseScreenBuffer(Buffer
, TRUE
);