2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: dll/win32/kernel32/client/console/readwrite.c
5 * PURPOSE: Win32 Console Client read-write functions
6 * PROGRAMMERS: Emanuele Aliberti
8 * Filip Navara (xnavara@volny.cz)
9 * Thomas Weidenmueller (w3seek@reactos.org)
13 /* INCLUDES *******************************************************************/
21 /* PRIVATE FUNCTIONS **********************************************************/
29 IntReadConsole(HANDLE hConsoleInput
,
31 DWORD nNumberOfCharsToRead
,
32 LPDWORD lpNumberOfCharsRead
,
33 PCONSOLE_READCONSOLE_CONTROL pInputControl
,
36 CSR_API_MESSAGE Request
;
38 PCSR_CAPTURE_BUFFER CaptureBuffer
;
39 NTSTATUS Status
= STATUS_SUCCESS
;
40 ULONG CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
42 CaptureBuffer
= CsrAllocateCaptureBuffer(1, nNumberOfCharsToRead
* CharSize
);
43 if (CaptureBuffer
== NULL
)
45 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
46 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
50 CsrAllocateMessagePointer(CaptureBuffer
,
51 nNumberOfCharsToRead
* CharSize
,
52 &Request
.Data
.ReadConsoleRequest
.Buffer
);
54 Request
.Data
.ReadConsoleRequest
.ConsoleHandle
= hConsoleInput
;
55 Request
.Data
.ReadConsoleRequest
.Unicode
= bUnicode
;
56 Request
.Data
.ReadConsoleRequest
.NrCharactersToRead
= (WORD
)nNumberOfCharsToRead
;
57 Request
.Data
.ReadConsoleRequest
.NrCharactersRead
= 0;
58 Request
.Data
.ReadConsoleRequest
.CtrlWakeupMask
= 0;
59 if (pInputControl
&& pInputControl
->nLength
== sizeof(CONSOLE_READCONSOLE_CONTROL
))
61 Request
.Data
.ReadConsoleRequest
.NrCharactersRead
= pInputControl
->nInitialChars
;
62 memcpy(Request
.Data
.ReadConsoleRequest
.Buffer
,
64 pInputControl
->nInitialChars
* sizeof(WCHAR
));
65 Request
.Data
.ReadConsoleRequest
.CtrlWakeupMask
= pInputControl
->dwCtrlWakeupMask
;
68 CsrRequest
= CSR_CREATE_API_NUMBER(CSR_CONSOLE
, READ_CONSOLE
);
72 if (Status
== STATUS_PENDING
)
74 Status
= NtWaitForSingleObject(Request
.Data
.ReadConsoleRequest
.EventHandle
,
77 if (!NT_SUCCESS(Status
))
79 DPRINT1("Wait for console input failed!\n");
84 Status
= CsrClientCallServer(&Request
,
87 sizeof(CSR_API_MESSAGE
));
88 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
90 DPRINT1("CSR returned error in ReadConsole\n");
91 CsrFreeCaptureBuffer(CaptureBuffer
);
92 BaseSetLastNTError(Status
);
96 while (Status
== STATUS_PENDING
);
99 Request
.Data
.ReadConsoleRequest
.Buffer
,
100 Request
.Data
.ReadConsoleRequest
.NrCharactersRead
* CharSize
);
102 if (lpNumberOfCharsRead
!= NULL
)
103 *lpNumberOfCharsRead
= Request
.Data
.ReadConsoleRequest
.NrCharactersRead
;
105 if (pInputControl
&& pInputControl
->nLength
== sizeof(CONSOLE_READCONSOLE_CONTROL
))
106 pInputControl
->dwControlKeyState
= Request
.Data
.ReadConsoleRequest
.ControlKeyState
;
108 CsrFreeCaptureBuffer(CaptureBuffer
);
116 IntPeekConsoleInput(HANDLE hConsoleInput
,
117 PINPUT_RECORD lpBuffer
,
119 LPDWORD lpNumberOfEventsRead
,
122 CSR_API_MESSAGE Request
;
123 PCSR_CAPTURE_BUFFER CaptureBuffer
;
126 if (lpBuffer
== NULL
)
128 SetLastError(ERROR_INVALID_PARAMETER
);
132 Size
= nLength
* sizeof(INPUT_RECORD
);
134 /* Allocate a Capture Buffer */
135 DPRINT("IntPeekConsoleInput: %lx %p\n", Size
, lpNumberOfEventsRead
);
136 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
137 if (CaptureBuffer
== NULL
)
139 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
140 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
144 /* Allocate space in the Buffer */
145 CsrCaptureMessageBuffer(CaptureBuffer
,
148 (PVOID
*)&Request
.Data
.PeekConsoleInputRequest
.InputRecord
);
150 /* Set up the data to send to the Console Server */
151 Request
.Data
.PeekConsoleInputRequest
.ConsoleHandle
= hConsoleInput
;
152 Request
.Data
.PeekConsoleInputRequest
.Unicode
= bUnicode
;
153 Request
.Data
.PeekConsoleInputRequest
.Length
= nLength
;
155 /* Call the server */
156 CsrClientCallServer(&Request
,
158 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, PEEK_CONSOLE_INPUT
),
159 sizeof(CSR_API_MESSAGE
));
160 DPRINT("Server returned: %x\n", Request
.Status
);
162 /* Check for success*/
163 if (NT_SUCCESS(Request
.Status
))
165 /* Return the number of events read */
166 DPRINT("Events read: %lx\n", Request
.Data
.PeekConsoleInputRequest
.Length
);
167 *lpNumberOfEventsRead
= Request
.Data
.PeekConsoleInputRequest
.Length
;
169 /* Copy into the buffer */
170 DPRINT("Copying to buffer\n");
171 RtlCopyMemory(lpBuffer
,
172 Request
.Data
.PeekConsoleInputRequest
.InputRecord
,
173 sizeof(INPUT_RECORD
) * *lpNumberOfEventsRead
);
178 *lpNumberOfEventsRead
= 0;
179 BaseSetLastNTError(Request
.Status
);
182 /* Release the capture buffer */
183 CsrFreeCaptureBuffer(CaptureBuffer
);
185 /* Return TRUE or FALSE */
186 return NT_SUCCESS(Request
.Status
);
192 IntReadConsoleInput(HANDLE hConsoleInput
,
193 PINPUT_RECORD lpBuffer
,
195 LPDWORD lpNumberOfEventsRead
,
198 CSR_API_MESSAGE Request
;
203 CsrRequest
= CSR_CREATE_API_NUMBER(CSR_CONSOLE
, READ_INPUT
);
208 Request
.Data
.ReadInputRequest
.ConsoleHandle
= hConsoleInput
;
209 Request
.Data
.ReadInputRequest
.Unicode
= bUnicode
;
211 Status
= CsrClientCallServer(&Request
,
214 sizeof(CSR_API_MESSAGE
));
215 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
219 /* we couldn't read a single record, fail */
220 BaseSetLastNTError(Status
);
225 /* FIXME - fail gracefully in case we already read at least one record? */
229 else if (Status
== STATUS_PENDING
)
233 Status
= NtWaitForSingleObject(Request
.Data
.ReadInputRequest
.Event
, FALSE
, 0);
234 if (!NT_SUCCESS(Status
))
236 BaseSetLastNTError(Status
);
242 /* nothing more to read (waiting for more input??), let's just bail */
248 lpBuffer
[Read
++] = Request
.Data
.ReadInputRequest
.Input
;
251 if (!Request
.Data
.ReadInputRequest
.MoreEvents
)
253 /* nothing more to read, bail */
259 if (lpNumberOfEventsRead
!= NULL
)
261 *lpNumberOfEventsRead
= Read
;
270 IntReadConsoleOutput(HANDLE hConsoleOutput
,
274 PSMALL_RECT lpReadRegion
,
277 CSR_API_MESSAGE Request
;
278 PCSR_CAPTURE_BUFFER CaptureBuffer
;
279 DWORD Size
, SizeX
, SizeY
;
281 if (lpBuffer
== NULL
)
283 SetLastError(ERROR_INVALID_PARAMETER
);
287 Size
= dwBufferSize
.X
* dwBufferSize
.Y
* sizeof(CHAR_INFO
);
289 /* Allocate a Capture Buffer */
290 DPRINT("IntReadConsoleOutput: %lx %p\n", Size
, lpReadRegion
);
291 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
292 if (CaptureBuffer
== NULL
)
294 DPRINT1("CsrAllocateCaptureBuffer failed with size 0x%x!\n", Size
);
295 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
299 /* Allocate space in the Buffer */
300 CsrCaptureMessageBuffer(CaptureBuffer
,
303 (PVOID
*)&Request
.Data
.ReadConsoleOutputRequest
.CharInfo
);
305 /* Set up the data to send to the Console Server */
306 Request
.Data
.ReadConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
307 Request
.Data
.ReadConsoleOutputRequest
.Unicode
= bUnicode
;
308 Request
.Data
.ReadConsoleOutputRequest
.BufferSize
= dwBufferSize
;
309 Request
.Data
.ReadConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
310 Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
= *lpReadRegion
;
312 /* Call the server */
313 CsrClientCallServer(&Request
,
315 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, READ_CONSOLE_OUTPUT
),
316 sizeof(CSR_API_MESSAGE
));
317 DPRINT("Server returned: %x\n", Request
.Status
);
319 /* Check for success*/
320 if (NT_SUCCESS(Request
.Status
))
322 /* Copy into the buffer */
323 DPRINT("Copying to buffer\n");
324 SizeX
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Right
-
325 Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Left
+ 1;
326 SizeY
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Bottom
-
327 Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Top
+ 1;
328 RtlCopyMemory(lpBuffer
,
329 Request
.Data
.ReadConsoleOutputRequest
.CharInfo
,
330 sizeof(CHAR_INFO
) * SizeX
* SizeY
);
335 BaseSetLastNTError(Request
.Status
);
338 /* Return the read region */
339 DPRINT("read region: %lx\n", Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
);
340 *lpReadRegion
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
;
342 /* Release the capture buffer */
343 CsrFreeCaptureBuffer(CaptureBuffer
);
345 /* Return TRUE or FALSE */
346 return NT_SUCCESS(Request
.Status
);
352 IntReadConsoleOutputCharacter(HANDLE hConsoleOutput
,
356 LPDWORD lpNumberOfCharsRead
,
359 PCSR_API_MESSAGE Request
;
362 ULONG SizeBytes
, CharSize
;
365 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
367 nLength
= min(nLength
, CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR
/ CharSize
);
368 SizeBytes
= nLength
* CharSize
;
370 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
371 max(sizeof(CSR_API_MESSAGE
),
372 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR
) + SizeBytes
));
375 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
379 CsrRequest
= CSR_CREATE_API_NUMBER(CSR_CONSOLE
, READ_CONSOLE_OUTPUT_CHAR
);
380 Request
->Data
.ReadConsoleOutputCharRequest
.ReadCoord
= dwReadCoord
;
386 Request
->Data
.ReadConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
387 Request
->Data
.ReadConsoleOutputCharRequest
.Unicode
= bUnicode
;
388 Request
->Data
.ReadConsoleOutputCharRequest
.NumCharsToRead
= nLength
;
389 SizeBytes
= Request
->Data
.ReadConsoleOutputCharRequest
.NumCharsToRead
* CharSize
;
391 Status
= CsrClientCallServer(Request
,
394 max(sizeof(CSR_API_MESSAGE
),
395 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR
) + SizeBytes
));
396 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Request
->Status
))
398 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
399 BaseSetLastNTError(Status
);
403 BytesRead
= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
* CharSize
;
404 memcpy(lpCharacter
, Request
->Data
.ReadConsoleOutputCharRequest
.String
, BytesRead
);
405 lpCharacter
= (PVOID
)((ULONG_PTR
)lpCharacter
+ (ULONG_PTR
)BytesRead
);
406 CharsRead
+= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
;
407 nLength
-= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
;
409 Request
->Data
.ReadConsoleOutputCharRequest
.ReadCoord
= Request
->Data
.ReadConsoleOutputCharRequest
.EndCoord
;
412 if (lpNumberOfCharsRead
!= NULL
)
414 *lpNumberOfCharsRead
= CharsRead
;
417 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
429 IntWriteConsole(HANDLE hConsoleOutput
,
431 DWORD nNumberOfCharsToWrite
,
432 LPDWORD lpNumberOfCharsWritten
,
436 PCSR_API_MESSAGE Request
;
440 ULONG SizeBytes
, CharSize
;
443 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
444 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
446 max(sizeof(CSR_API_MESSAGE
),
447 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE
) + min(nNumberOfCharsToWrite
,
448 CSRSS_MAX_WRITE_CONSOLE
/ CharSize
) * CharSize
));
451 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
455 CsrRequest
= CSR_CREATE_API_NUMBER(CSR_CONSOLE
, WRITE_CONSOLE
);
457 while (nNumberOfCharsToWrite
> 0)
459 Request
->Data
.WriteConsoleRequest
.ConsoleHandle
= hConsoleOutput
;
460 Request
->Data
.WriteConsoleRequest
.Unicode
= bUnicode
;
462 nChars
= (USHORT
)min(nNumberOfCharsToWrite
, CSRSS_MAX_WRITE_CONSOLE
/ CharSize
);
463 Request
->Data
.WriteConsoleRequest
.NrCharactersToWrite
= nChars
;
465 SizeBytes
= nChars
* CharSize
;
467 memcpy(Request
->Data
.WriteConsoleRequest
.Buffer
, lpBuffer
, SizeBytes
);
469 Status
= CsrClientCallServer(Request
,
472 max(sizeof(CSR_API_MESSAGE
),
473 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE
) + SizeBytes
));
475 if (Status
== STATUS_PENDING
)
477 WaitForSingleObject(Request
->Data
.WriteConsoleRequest
.UnpauseEvent
, INFINITE
);
478 CloseHandle(Request
->Data
.WriteConsoleRequest
.UnpauseEvent
);
481 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
483 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
484 BaseSetLastNTError(Status
);
488 nNumberOfCharsToWrite
-= nChars
;
489 lpBuffer
= (PVOID
)((ULONG_PTR
)lpBuffer
+ (ULONG_PTR
)SizeBytes
);
490 Written
+= Request
->Data
.WriteConsoleRequest
.NrCharactersWritten
;
493 if (lpNumberOfCharsWritten
!= NULL
)
495 *lpNumberOfCharsWritten
= Written
;
497 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
505 IntWriteConsoleInput(HANDLE hConsoleInput
,
506 PINPUT_RECORD lpBuffer
,
508 LPDWORD lpNumberOfEventsWritten
,
511 CSR_API_MESSAGE Request
;
512 PCSR_CAPTURE_BUFFER CaptureBuffer
;
515 if (lpBuffer
== NULL
)
517 SetLastError(ERROR_INVALID_PARAMETER
);
521 Size
= nLength
* sizeof(INPUT_RECORD
);
523 /* Allocate a Capture Buffer */
524 DPRINT("IntWriteConsoleInput: %lx %p\n", Size
, lpNumberOfEventsWritten
);
525 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
526 if (CaptureBuffer
== NULL
)
528 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
529 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
533 /* Allocate space in the Buffer */
534 CsrCaptureMessageBuffer(CaptureBuffer
,
537 (PVOID
*)&Request
.Data
.WriteConsoleInputRequest
.InputRecord
);
539 /* Set up the data to send to the Console Server */
540 Request
.Data
.WriteConsoleInputRequest
.ConsoleHandle
= hConsoleInput
;
541 Request
.Data
.WriteConsoleInputRequest
.Unicode
= bUnicode
;
542 Request
.Data
.WriteConsoleInputRequest
.Length
= nLength
;
544 /* Call the server */
545 CsrClientCallServer(&Request
,
547 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, WRITE_CONSOLE_INPUT
),
548 sizeof(CSR_API_MESSAGE
));
549 DPRINT("Server returned: %x\n", Request
.Status
);
551 /* Check for success*/
552 if (NT_SUCCESS(Request
.Status
))
554 /* Return the number of events read */
555 DPRINT("Events read: %lx\n", Request
.Data
.WriteConsoleInputRequest
.Length
);
556 *lpNumberOfEventsWritten
= Request
.Data
.WriteConsoleInputRequest
.Length
;
561 *lpNumberOfEventsWritten
= 0;
562 BaseSetLastNTError(Request
.Status
);
565 /* Release the capture buffer */
566 CsrFreeCaptureBuffer(CaptureBuffer
);
568 /* Return TRUE or FALSE */
569 return NT_SUCCESS(Request
.Status
);
575 IntWriteConsoleOutput(HANDLE hConsoleOutput
,
576 CONST CHAR_INFO
*lpBuffer
,
579 PSMALL_RECT lpWriteRegion
,
582 CSR_API_MESSAGE Request
;
583 PCSR_CAPTURE_BUFFER CaptureBuffer
;
586 Size
= dwBufferSize
.Y
* dwBufferSize
.X
* sizeof(CHAR_INFO
);
588 /* Allocate a Capture Buffer */
589 DPRINT("IntWriteConsoleOutput: %lx %p\n", Size
, lpWriteRegion
);
590 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
591 if (CaptureBuffer
== NULL
)
593 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
594 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
598 /* Allocate space in the Buffer */
599 CsrCaptureMessageBuffer(CaptureBuffer
,
602 (PVOID
*)&Request
.Data
.WriteConsoleOutputRequest
.CharInfo
);
604 /* Copy from the buffer */
605 RtlCopyMemory(Request
.Data
.WriteConsoleOutputRequest
.CharInfo
, lpBuffer
, Size
);
607 /* Set up the data to send to the Console Server */
608 Request
.Data
.WriteConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
609 Request
.Data
.WriteConsoleOutputRequest
.Unicode
= bUnicode
;
610 Request
.Data
.WriteConsoleOutputRequest
.BufferSize
= dwBufferSize
;
611 Request
.Data
.WriteConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
612 Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
= *lpWriteRegion
;
614 /* Call the server */
615 CsrClientCallServer(&Request
,
617 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, WRITE_CONSOLE_OUTPUT
),
618 sizeof(CSR_API_MESSAGE
));
619 DPRINT("Server returned: %x\n", Request
.Status
);
621 /* Check for success*/
622 if (!NT_SUCCESS(Request
.Status
))
625 BaseSetLastNTError(Request
.Status
);
628 /* Return the read region */
629 DPRINT("read region: %lx\n", Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
);
630 *lpWriteRegion
= Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
;
632 /* Release the capture buffer */
633 CsrFreeCaptureBuffer(CaptureBuffer
);
635 /* Return TRUE or FALSE */
636 return NT_SUCCESS(Request
.Status
);
642 IntWriteConsoleOutputCharacter(HANDLE hConsoleOutput
,
646 LPDWORD lpNumberOfCharsWritten
,
649 PCSR_API_MESSAGE Request
;
652 ULONG CharSize
, nChars
;
656 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
658 nChars
= min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
/ CharSize
);
659 //SizeBytes = nChars * CharSize;
661 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
662 max(sizeof(CSR_API_MESSAGE
),
663 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR
)
664 + min (nChars
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
/ CharSize
) * CharSize
));
667 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
671 CsrRequest
= CSR_CREATE_API_NUMBER(CSR_CONSOLE
, WRITE_CONSOLE_OUTPUT_CHAR
);
672 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= dwWriteCoord
;
678 Request
->Data
.WriteConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
679 Request
->Data
.WriteConsoleOutputCharRequest
.Unicode
= bUnicode
;
680 Request
->Data
.WriteConsoleOutputCharRequest
.Length
= (WORD
)min(nLength
, nChars
);
681 BytesWrite
= Request
->Data
.WriteConsoleOutputCharRequest
.Length
* CharSize
;
683 memcpy(Request
->Data
.WriteConsoleOutputCharRequest
.String
, lpCharacter
, BytesWrite
);
685 Status
= CsrClientCallServer(Request
,
688 max(sizeof(CSR_API_MESSAGE
),
689 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR
) + BytesWrite
));
691 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
693 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
694 BaseSetLastNTError(Status
);
698 nLength
-= Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
;
699 lpCharacter
= (PVOID
)((ULONG_PTR
)lpCharacter
+ (ULONG_PTR
)(Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
* CharSize
));
700 Written
+= Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
;
702 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= Request
->Data
.WriteConsoleOutputCharRequest
.EndCoord
;
705 if (lpNumberOfCharsWritten
!= NULL
)
707 *lpNumberOfCharsWritten
= Written
;
710 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
718 IntFillConsoleOutputCharacter(HANDLE hConsoleOutput
,
722 LPDWORD lpNumberOfCharsWritten
,
725 CSR_API_MESSAGE Request
;
728 Request
.Data
.FillOutputRequest
.ConsoleHandle
= hConsoleOutput
;
729 Request
.Data
.FillOutputRequest
.Unicode
= bUnicode
;
732 Request
.Data
.FillOutputRequest
.Char
.UnicodeChar
= *((WCHAR
*)cCharacter
);
734 Request
.Data
.FillOutputRequest
.Char
.AsciiChar
= *((CHAR
*)cCharacter
);
736 Request
.Data
.FillOutputRequest
.Position
= dwWriteCoord
;
737 Request
.Data
.FillOutputRequest
.Length
= (WORD
)nLength
;
739 Status
= CsrClientCallServer(&Request
,
741 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, FILL_OUTPUT
),
742 sizeof(CSR_API_MESSAGE
));
744 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
746 BaseSetLastNTError(Status
);
750 if(lpNumberOfCharsWritten
!= NULL
)
752 *lpNumberOfCharsWritten
= Request
.Data
.FillOutputRequest
.NrCharactersWritten
;
759 /* FUNCTIONS ******************************************************************/
765 /*--------------------------------------------------------------
772 ReadConsoleW(HANDLE hConsoleInput
,
774 DWORD nNumberOfCharsToRead
,
775 LPDWORD lpNumberOfCharsRead
,
776 PCONSOLE_READCONSOLE_CONTROL pInputControl
)
778 return IntReadConsole(hConsoleInput
,
780 nNumberOfCharsToRead
,
787 /*--------------------------------------------------------------
794 ReadConsoleA(HANDLE hConsoleInput
,
796 DWORD nNumberOfCharsToRead
,
797 LPDWORD lpNumberOfCharsRead
,
798 PCONSOLE_READCONSOLE_CONTROL pInputControl
)
800 return IntReadConsole(hConsoleInput
,
802 nNumberOfCharsToRead
,
809 /*--------------------------------------------------------------
816 PeekConsoleInputW(HANDLE hConsoleInput
,
817 PINPUT_RECORD lpBuffer
,
819 LPDWORD lpNumberOfEventsRead
)
821 return IntPeekConsoleInput(hConsoleInput
,
823 lpNumberOfEventsRead
,
828 /*--------------------------------------------------------------
835 PeekConsoleInputA(HANDLE hConsoleInput
,
836 PINPUT_RECORD lpBuffer
,
838 LPDWORD lpNumberOfEventsRead
)
840 return IntPeekConsoleInput(hConsoleInput
,
843 lpNumberOfEventsRead
,
848 /*--------------------------------------------------------------
855 ReadConsoleInputW(HANDLE hConsoleInput
,
856 PINPUT_RECORD lpBuffer
,
858 LPDWORD lpNumberOfEventsRead
)
860 return IntReadConsoleInput(hConsoleInput
,
863 lpNumberOfEventsRead
,
868 /*--------------------------------------------------------------
875 ReadConsoleInputA(HANDLE hConsoleInput
,
876 PINPUT_RECORD lpBuffer
,
878 LPDWORD lpNumberOfEventsRead
)
880 return IntReadConsoleInput(hConsoleInput
,
883 lpNumberOfEventsRead
,
890 ReadConsoleInputExW(HANDLE hConsole
, LPVOID lpBuffer
, DWORD dwLen
, LPDWORD Unknown1
, DWORD Unknown2
)
899 ReadConsoleInputExA(HANDLE hConsole
, LPVOID lpBuffer
, DWORD dwLen
, LPDWORD Unknown1
, DWORD Unknown2
)
906 /*--------------------------------------------------------------
913 ReadConsoleOutputW(HANDLE hConsoleOutput
,
917 PSMALL_RECT lpReadRegion
)
919 return IntReadConsoleOutput(hConsoleOutput
,
928 /*--------------------------------------------------------------
935 ReadConsoleOutputA(HANDLE hConsoleOutput
,
939 PSMALL_RECT lpReadRegion
)
941 return IntReadConsoleOutput(hConsoleOutput
,
950 /*--------------------------------------------------------------
951 * ReadConsoleOutputCharacterW
957 ReadConsoleOutputCharacterW(HANDLE hConsoleOutput
,
961 LPDWORD lpNumberOfCharsRead
)
963 return IntReadConsoleOutputCharacter(hConsoleOutput
,
972 /*--------------------------------------------------------------
973 * ReadConsoleOutputCharacterA
979 ReadConsoleOutputCharacterA(HANDLE hConsoleOutput
,
983 LPDWORD lpNumberOfCharsRead
)
985 return IntReadConsoleOutputCharacter(hConsoleOutput
,
994 /*--------------------------------------------------------------
995 * ReadConsoleOutputAttribute
1001 ReadConsoleOutputAttribute(HANDLE hConsoleOutput
,
1005 LPDWORD lpNumberOfAttrsRead
)
1007 PCSR_API_MESSAGE Request
;
1012 if (lpNumberOfAttrsRead
!= NULL
)
1013 *lpNumberOfAttrsRead
= nLength
;
1015 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
1017 max(sizeof(CSR_API_MESSAGE
),
1018 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB
)
1019 + min (nLength
, CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
)) * sizeof(WORD
)));
1020 if (Request
== NULL
)
1022 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1026 CsrRequest
= CSR_CREATE_API_NUMBER(CSR_CONSOLE
, READ_CONSOLE_OUTPUT_ATTRIB
);
1028 while (nLength
!= 0)
1030 Request
->Data
.ReadConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
1031 Request
->Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= dwReadCoord
;
1033 if (nLength
> CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
))
1034 Size
= CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WCHAR
);
1038 Request
->Data
.ReadConsoleOutputAttribRequest
.NumAttrsToRead
= Size
;
1040 Status
= CsrClientCallServer(Request
,
1043 max(sizeof(CSR_API_MESSAGE
),
1044 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB
) + Size
* sizeof(WORD
)));
1045 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Request
->Status
))
1047 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1048 BaseSetLastNTError(Status
);
1052 memcpy(lpAttribute
, Request
->Data
.ReadConsoleOutputAttribRequest
.Attribute
, Size
* sizeof(WORD
));
1053 lpAttribute
+= Size
;
1055 Request
->Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= Request
->Data
.ReadConsoleOutputAttribRequest
.EndCoord
;
1058 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1064 /*******************
1066 *******************/
1068 /*--------------------------------------------------------------
1075 WriteConsoleW(HANDLE hConsoleOutput
,
1076 CONST VOID
*lpBuffer
,
1077 DWORD nNumberOfCharsToWrite
,
1078 LPDWORD lpNumberOfCharsWritten
,
1081 return IntWriteConsole(hConsoleOutput
,
1083 nNumberOfCharsToWrite
,
1084 lpNumberOfCharsWritten
,
1090 /*--------------------------------------------------------------
1097 WriteConsoleA(HANDLE hConsoleOutput
,
1098 CONST VOID
*lpBuffer
,
1099 DWORD nNumberOfCharsToWrite
,
1100 LPDWORD lpNumberOfCharsWritten
,
1103 return IntWriteConsole(hConsoleOutput
,
1105 nNumberOfCharsToWrite
,
1106 lpNumberOfCharsWritten
,
1112 /*--------------------------------------------------------------
1113 * WriteConsoleInputW
1119 WriteConsoleInputW(HANDLE hConsoleInput
,
1120 CONST INPUT_RECORD
*lpBuffer
,
1122 LPDWORD lpNumberOfEventsWritten
)
1124 return IntWriteConsoleInput(hConsoleInput
,
1125 (PINPUT_RECORD
)lpBuffer
,
1127 lpNumberOfEventsWritten
,
1132 /*--------------------------------------------------------------
1133 * WriteConsoleInputA
1139 WriteConsoleInputA(HANDLE hConsoleInput
,
1140 CONST INPUT_RECORD
*lpBuffer
,
1142 LPDWORD lpNumberOfEventsWritten
)
1144 return IntWriteConsoleInput(hConsoleInput
,
1145 (PINPUT_RECORD
)lpBuffer
,
1147 lpNumberOfEventsWritten
,
1152 /*--------------------------------------------------------------
1153 * WriteConsoleOutputW
1159 WriteConsoleOutputW(HANDLE hConsoleOutput
,
1160 CONST CHAR_INFO
*lpBuffer
,
1162 COORD dwBufferCoord
,
1163 PSMALL_RECT lpWriteRegion
)
1165 return IntWriteConsoleOutput(hConsoleOutput
,
1174 /*--------------------------------------------------------------
1175 * WriteConsoleOutputA
1181 WriteConsoleOutputA(HANDLE hConsoleOutput
,
1182 CONST CHAR_INFO
*lpBuffer
,
1184 COORD dwBufferCoord
,
1185 PSMALL_RECT lpWriteRegion
)
1187 return IntWriteConsoleOutput(hConsoleOutput
,
1196 /*--------------------------------------------------------------
1197 * WriteConsoleOutputCharacterW
1203 WriteConsoleOutputCharacterW(HANDLE hConsoleOutput
,
1204 LPCWSTR lpCharacter
,
1207 LPDWORD lpNumberOfCharsWritten
)
1209 return IntWriteConsoleOutputCharacter(hConsoleOutput
,
1213 lpNumberOfCharsWritten
,
1218 /*--------------------------------------------------------------
1219 * WriteConsoleOutputCharacterA
1225 WriteConsoleOutputCharacterA(HANDLE hConsoleOutput
,
1229 LPDWORD lpNumberOfCharsWritten
)
1231 return IntWriteConsoleOutputCharacter(hConsoleOutput
,
1235 lpNumberOfCharsWritten
,
1240 /*--------------------------------------------------------------
1241 * WriteConsoleOutputAttribute
1247 WriteConsoleOutputAttribute(HANDLE hConsoleOutput
,
1248 CONST WORD
*lpAttribute
,
1251 LPDWORD lpNumberOfAttrsWritten
)
1253 PCSR_API_MESSAGE Request
;
1258 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
1260 max(sizeof(CSR_API_MESSAGE
),
1261 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB
)
1262 + min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
)) * sizeof(WORD
)));
1263 if (Request
== NULL
)
1265 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1269 CsrRequest
= CSR_CREATE_API_NUMBER(CSR_CONSOLE
, WRITE_CONSOLE_OUTPUT_ATTRIB
);
1270 Request
->Data
.WriteConsoleOutputAttribRequest
.Coord
= dwWriteCoord
;
1272 if (lpNumberOfAttrsWritten
)
1273 *lpNumberOfAttrsWritten
= nLength
;
1276 Size
= (WORD
)min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
));
1277 Request
->Data
.WriteConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
1278 Request
->Data
.WriteConsoleOutputAttribRequest
.Length
= Size
;
1279 memcpy(Request
->Data
.WriteConsoleOutputAttribRequest
.Attribute
, lpAttribute
, Size
* sizeof(WORD
));
1281 Status
= CsrClientCallServer(Request
,
1284 max(sizeof(CSR_API_MESSAGE
),
1285 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB
) + Size
* sizeof(WORD
)));
1287 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
1289 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1290 BaseSetLastNTError (Status
);
1294 lpAttribute
+= Size
;
1295 Request
->Data
.WriteConsoleOutputAttribRequest
.Coord
= Request
->Data
.WriteConsoleOutputAttribRequest
.EndCoord
;
1298 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1304 /*--------------------------------------------------------------
1305 * FillConsoleOutputCharacterW
1311 FillConsoleOutputCharacterW(HANDLE hConsoleOutput
,
1315 LPDWORD lpNumberOfCharsWritten
)
1317 return IntFillConsoleOutputCharacter(hConsoleOutput
,
1321 lpNumberOfCharsWritten
,
1326 /*--------------------------------------------------------------
1327 * FillConsoleOutputCharacterA
1333 FillConsoleOutputCharacterA(HANDLE hConsoleOutput
,
1337 LPDWORD lpNumberOfCharsWritten
)
1339 return IntFillConsoleOutputCharacter(hConsoleOutput
,
1343 lpNumberOfCharsWritten
,
1348 /*--------------------------------------------------------------
1349 * FillConsoleOutputAttribute
1355 FillConsoleOutputAttribute(HANDLE hConsoleOutput
,
1359 LPDWORD lpNumberOfAttrsWritten
)
1361 CSR_API_MESSAGE Request
;
1364 Request
.Data
.FillOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
1365 Request
.Data
.FillOutputAttribRequest
.Attribute
= (CHAR
)wAttribute
;
1366 Request
.Data
.FillOutputAttribRequest
.Coord
= dwWriteCoord
;
1367 Request
.Data
.FillOutputAttribRequest
.Length
= (WORD
)nLength
;
1369 Status
= CsrClientCallServer(&Request
,
1371 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, FILL_OUTPUT_ATTRIB
),
1372 sizeof(CSR_API_MESSAGE
));
1373 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1375 BaseSetLastNTError ( Status
);
1379 if (lpNumberOfAttrsWritten
)
1380 *lpNumberOfAttrsWritten
= nLength
;