3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/kernel32/misc/console.c
6 * PURPOSE: Win32 server console functions
7 * PROGRAMMER: James Tabor
8 * <jimtabor@adsl-64-217-116-74.dsl.hstntx.swbell.net>
11 * 19990204 EA SetConsoleTitleA
15 /* INCLUDES ******************************************************************/
22 extern BOOL WINAPI
DefaultConsoleCtrlHandler(DWORD Event
);
23 extern __declspec(noreturn
) VOID CALLBACK
ConsoleControlDispatcher(DWORD CodeAndFlag
);
24 extern RTL_CRITICAL_SECTION ConsoleLock
;
25 extern BOOL ConsoleInitialized
;
26 extern BOOL WINAPI
IsDebuggerPresent(VOID
);
28 /* GLOBALS *******************************************************************/
30 static PHANDLER_ROUTINE
* CtrlHandlers
= NULL
;
31 static ULONG NrCtrlHandlers
= 0;
32 #define INPUTEXENAME_BUFLEN 256
33 static WCHAR InputExeName
[INPUTEXENAME_BUFLEN
] = L
"";
35 /* Default Console Control Handler *******************************************/
39 DefaultConsoleCtrlHandler(DWORD Event
)
44 DPRINT("Ctrl-C Event\n");
47 case CTRL_BREAK_EVENT
:
48 DPRINT("Ctrl-Break Event\n");
51 case CTRL_SHUTDOWN_EVENT
:
52 DPRINT("Ctrl Shutdown Event\n");
55 case CTRL_CLOSE_EVENT
:
56 DPRINT("Ctrl Close Event\n");
59 case CTRL_LOGOFF_EVENT
:
60 DPRINT("Ctrl Logoff Event\n");
72 ConsoleControlDispatcher(DWORD CodeAndFlag
)
75 DWORD nCode
= CodeAndFlag
& MAXLONG
;
78 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST
);
83 case CTRL_BREAK_EVENT
:
85 if(IsDebuggerPresent())
87 EXCEPTION_RECORD erException
;
88 erException
.ExceptionCode
=
89 (nCode
== CTRL_C_EVENT
? DBG_CONTROL_C
: DBG_CONTROL_BREAK
);
90 erException
.ExceptionFlags
= 0;
91 erException
.ExceptionRecord
= NULL
;
92 erException
.ExceptionAddress
= &DefaultConsoleCtrlHandler
;
93 erException
.NumberParameters
= 0;
94 RtlRaiseException(&erException
);
97 if (!ConsoleInitialized
) ExitThread(0);
98 RtlEnterCriticalSection(&ConsoleLock
);
100 if (!(nCode
== CTRL_C_EVENT
&&
101 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
& 1))
103 for(i
= NrCtrlHandlers
; i
> 0; -- i
)
104 if(CtrlHandlers
[i
- 1](nCode
)) break;
106 RtlLeaveCriticalSection(&ConsoleLock
);
110 case CTRL_CLOSE_EVENT
:
111 case CTRL_LOGOFF_EVENT
:
112 case CTRL_SHUTDOWN_EVENT
:
115 default: ExitThread(0);
118 if (!ConsoleInitialized
) ExitThread(0);
119 RtlEnterCriticalSection(&ConsoleLock
);
121 if (!(nCode
== CTRL_C_EVENT
&&
122 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
& 1))
127 if (i
== 1 && (CodeAndFlag
& MINLONG
) &&
128 (nCode
== CTRL_LOGOFF_EVENT
|| nCode
== CTRL_SHUTDOWN_EVENT
))
131 if (CtrlHandlers
[i
- 1](nCode
))
135 case CTRL_CLOSE_EVENT
:
136 case CTRL_LOGOFF_EVENT
:
137 case CTRL_SHUTDOWN_EVENT
:
138 nExitCode
= CodeAndFlag
;
145 RtlLeaveCriticalSection(&ConsoleLock
);
146 ExitThread(nExitCode
);
150 /* FUNCTIONS *****************************************************************/
157 AddConsoleAliasA(LPCSTR lpSource
,
161 LPWSTR lpSourceW
= NULL
;
162 LPWSTR lpTargetW
= NULL
;
163 LPWSTR lpExeNameW
= NULL
;
167 BasepAnsiStringToHeapUnicodeString(lpSource
, (LPWSTR
*) &lpSourceW
);
169 BasepAnsiStringToHeapUnicodeString(lpTarget
, (LPWSTR
*) &lpTargetW
);
171 BasepAnsiStringToHeapUnicodeString(lpExeName
, (LPWSTR
*) &lpExeNameW
);
173 bRetVal
= AddConsoleAliasW(lpSourceW
, lpTargetW
, lpExeNameW
);
177 RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR
*) lpSourceW
);
179 RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR
*) lpTargetW
);
181 RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR
*) lpExeNameW
);
192 AddConsoleAliasW(LPCWSTR lpSource
,
196 PCSR_API_MESSAGE Request
;
200 ULONG TargetLength
= 0;
206 DPRINT("AddConsoleAliasW enterd with lpSource %S lpTarget %S lpExeName %S\n", lpSource
, lpTarget
, lpExeName
);
208 ExeLength
= wcslen(lpExeName
) + 1;
209 SourceLength
= wcslen(lpSource
)+ 1;
211 TargetLength
= wcslen(lpTarget
) + 1;
213 Size
= (ExeLength
+ SourceLength
+ TargetLength
) * sizeof(WCHAR
);
214 RequestLength
= sizeof(CSR_API_MESSAGE
) + Size
;
216 Request
= RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY
, RequestLength
);
217 Ptr
= (WCHAR
*)(((ULONG_PTR
)Request
) + sizeof(CSR_API_MESSAGE
));
219 wcscpy(Ptr
, lpSource
);
220 Request
->Data
.AddConsoleAlias
.SourceLength
= SourceLength
;
221 Ptr
= (WCHAR
*)(((ULONG_PTR
)Request
) + sizeof(CSR_API_MESSAGE
) + SourceLength
* sizeof(WCHAR
));
223 wcscpy(Ptr
, lpExeName
);
224 Request
->Data
.AddConsoleAlias
.ExeLength
= ExeLength
;
225 Ptr
= (WCHAR
*)(((ULONG_PTR
)Request
) + sizeof(CSR_API_MESSAGE
) + (ExeLength
+ SourceLength
)* sizeof(WCHAR
));
227 if (lpTarget
) /* target can be optional */
228 wcscpy(Ptr
, lpTarget
);
230 Request
->Data
.AddConsoleAlias
.TargetLength
= TargetLength
;
232 CsrRequest
= MAKE_CSR_API(ADD_CONSOLE_ALIAS
, CSR_CONSOLE
);
233 Status
= CsrClientCallServer(Request
,
238 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
240 SetLastErrorByStatus(Status
);
241 RtlFreeHeap(GetProcessHeap(), 0, Request
);
245 RtlFreeHeap(GetProcessHeap(), 0, Request
);
251 * @unimplemented (Undocumented)
255 ConsoleMenuControl(HANDLE hConsole
,
259 DPRINT1("ConsoleMenuControl(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsole
, Unknown1
, Unknown2
);
260 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
270 DuplicateConsoleHandle(HANDLE hConsole
,
271 DWORD dwDesiredAccess
,
275 CSR_API_MESSAGE Request
;
279 if (dwOptions
& ~(DUPLICATE_CLOSE_SOURCE
| DUPLICATE_SAME_ACCESS
)
280 || (!(dwOptions
& DUPLICATE_SAME_ACCESS
)
281 && dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
)))
283 SetLastError (ERROR_INVALID_PARAMETER
);
284 return INVALID_HANDLE_VALUE
;
287 CsrRequest
= MAKE_CSR_API(DUPLICATE_HANDLE
, CSR_NATIVE
);
288 Request
.Data
.DuplicateHandleRequest
.Handle
= hConsole
;
289 Request
.Data
.DuplicateHandleRequest
.Access
= dwDesiredAccess
;
290 Request
.Data
.DuplicateHandleRequest
.Inheritable
= bInheritHandle
;
291 Request
.Data
.DuplicateHandleRequest
.Options
= dwOptions
;
293 Status
= CsrClientCallServer(&Request
,
296 sizeof(CSR_API_MESSAGE
));
297 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
=Request
.Status
))
299 SetLastErrorByStatus(Status
);
300 return INVALID_HANDLE_VALUE
;
303 return Request
.Data
.DuplicateHandleRequest
.Handle
;
308 * @unimplemented (Undocumented)
312 ExpungeConsoleCommandHistoryW(DWORD Unknown0
)
314 DPRINT1("ExpungeConsoleCommandHistoryW(0x%x) UNIMPLEMENTED!\n", Unknown0
);
315 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
321 * @unimplemented (Undocumented)
325 ExpungeConsoleCommandHistoryA (DWORD Unknown0
)
327 DPRINT1("ExpungeConsoleCommandHistoryW(0x%x) UNIMPLEMENTED!\n", Unknown0
);
328 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
338 GetConsoleAliasW(LPWSTR lpSource
,
339 LPWSTR lpTargetBuffer
,
340 DWORD TargetBufferLength
,
343 PCSR_API_MESSAGE Request
;
344 PCSR_CAPTURE_BUFFER CaptureBuffer
;
353 DPRINT("GetConsoleAliasW entered lpSource %S lpExeName %S\n", lpSource
, lpExeName
);
355 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_ALIAS
, CSR_CONSOLE
);
357 ExeLength
= wcslen(lpExeName
) + 1;
358 SourceLength
= wcslen(lpSource
) + 1;
360 Size
= (ExeLength
+ SourceLength
) * sizeof(WCHAR
);
362 RequestLength
= Size
+ sizeof(CSR_API_MESSAGE
);
363 Request
= RtlAllocateHeap(GetProcessHeap(), 0, RequestLength
);
365 CaptureBuffer
= CsrAllocateCaptureBuffer(1, TargetBufferLength
);
368 RtlFreeHeap(GetProcessHeap(), 0, Request
);
372 Request
->Data
.GetConsoleAlias
.TargetBuffer
= NULL
;
374 CsrCaptureMessageBuffer(CaptureBuffer
,
377 (PVOID
*)&Request
->Data
.GetConsoleAlias
.TargetBuffer
);
379 Request
->Data
.GetConsoleAlias
.TargetBufferLength
= TargetBufferLength
;
381 Ptr
= (LPWSTR
)((ULONG_PTR
)Request
+ sizeof(CSR_API_MESSAGE
));
382 wcscpy(Ptr
, lpSource
);
384 wcscpy(Ptr
, lpExeName
);
386 Request
->Data
.GetConsoleAlias
.ExeLength
= ExeLength
;
387 Request
->Data
.GetConsoleAlias
.SourceLength
= SourceLength
;
389 Status
= CsrClientCallServer(Request
,
392 sizeof(CSR_API_MESSAGE
) + Size
);
394 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
396 RtlFreeHeap(GetProcessHeap(), 0, Request
);
397 CsrFreeCaptureBuffer(CaptureBuffer
);
398 SetLastErrorByStatus(Status
);
402 wcscpy(lpTargetBuffer
, Request
->Data
.GetConsoleAlias
.TargetBuffer
);
403 RtlFreeHeap(GetProcessHeap(), 0, Request
);
404 CsrFreeCaptureBuffer(CaptureBuffer
);
406 return Request
->Data
.GetConsoleAlias
.BytesWritten
;
415 GetConsoleAliasA(LPSTR lpSource
,
416 LPSTR lpTargetBuffer
,
417 DWORD TargetBufferLength
,
422 LPWSTR lpwTargetBuffer
;
427 DPRINT("GetConsoleAliasA entered\n");
429 dwSourceSize
= (strlen(lpSource
)+1) * sizeof(WCHAR
);
430 lpwSource
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwSourceSize
);
431 MultiByteToWideChar(CP_ACP
, 0, lpSource
, -1, lpwSource
, dwSourceSize
);
433 dwExeNameSize
= (strlen(lpExeName
)+1) * sizeof(WCHAR
);
434 lpwExeName
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwExeNameSize
);
435 MultiByteToWideChar(CP_ACP
, 0, lpExeName
, -1, lpwExeName
, dwExeNameSize
);
437 lpwTargetBuffer
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, TargetBufferLength
* sizeof(WCHAR
));
439 dwResult
= GetConsoleAliasW(lpwSource
, lpwTargetBuffer
, TargetBufferLength
* sizeof(WCHAR
), lpwExeName
);
441 HeapFree(GetProcessHeap(), 0, lpwSource
);
442 HeapFree(GetProcessHeap(), 0, lpwExeName
);
445 dwResult
= WideCharToMultiByte(CP_ACP
, 0, lpwTargetBuffer
, dwResult
/ sizeof(WCHAR
), lpTargetBuffer
, TargetBufferLength
, NULL
, NULL
);
447 HeapFree(GetProcessHeap(), 0, lpwTargetBuffer
);
458 GetConsoleAliasExesW(LPWSTR lpExeNameBuffer
,
459 DWORD ExeNameBufferLength
)
461 CSR_API_MESSAGE Request
;
462 PCSR_CAPTURE_BUFFER CaptureBuffer
;
466 DPRINT("GetConsoleAliasExesW entered\n");
468 CaptureBuffer
= CsrAllocateCaptureBuffer(1, ExeNameBufferLength
);
471 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
475 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_ALIASES_EXES
, CSR_CONSOLE
);
476 CsrAllocateMessagePointer(CaptureBuffer
,
478 (PVOID
*)&Request
.Data
.GetConsoleAliasesExes
.ExeNames
);
479 Request
.Data
.GetConsoleAliasesExes
.Length
= ExeNameBufferLength
;
481 Status
= CsrClientCallServer(&Request
,
484 sizeof(CSR_API_MESSAGE
));
486 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
488 SetLastErrorByStatus(Status
);
489 CsrFreeCaptureBuffer(CaptureBuffer
);
493 memcpy(lpExeNameBuffer
,
494 Request
.Data
.GetConsoleAliasesExes
.ExeNames
,
495 Request
.Data
.GetConsoleAliasesExes
.BytesWritten
);
497 CsrFreeCaptureBuffer(CaptureBuffer
);
498 return Request
.Data
.GetConsoleAliasesExes
.BytesWritten
;
507 GetConsoleAliasExesA(LPSTR lpExeNameBuffer
,
508 DWORD ExeNameBufferLength
)
510 LPWSTR lpwExeNameBuffer
;
513 DPRINT("GetConsoleAliasExesA entered\n");
515 lpwExeNameBuffer
= HeapAlloc(GetProcessHeap(), 0, ExeNameBufferLength
* sizeof(WCHAR
));
517 dwResult
= GetConsoleAliasExesW(lpwExeNameBuffer
, ExeNameBufferLength
* sizeof(WCHAR
));
520 dwResult
= WideCharToMultiByte(CP_ACP
, 0, lpwExeNameBuffer
, dwResult
/ sizeof(WCHAR
), lpExeNameBuffer
, ExeNameBufferLength
, NULL
, NULL
);
522 HeapFree(GetProcessHeap(), 0, lpwExeNameBuffer
);
531 GetConsoleAliasExesLengthW(VOID
)
533 CSR_API_MESSAGE Request
;
537 DPRINT("GetConsoleAliasExesLengthW entered\n");
539 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_ALIASES_EXES_LENGTH
, CSR_CONSOLE
);
540 Request
.Data
.GetConsoleAliasesExesLength
.Length
= 0;
543 Status
= CsrClientCallServer(&Request
,
546 sizeof(CSR_API_MESSAGE
));
548 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
550 SetLastErrorByStatus(Status
);
554 return Request
.Data
.GetConsoleAliasesExesLength
.Length
;
562 GetConsoleAliasExesLengthA(VOID
)
566 DPRINT("GetConsoleAliasExesLengthA entered\n");
568 dwLength
= GetConsoleAliasExesLengthW();
571 dwLength
/= sizeof(WCHAR
);
582 GetConsoleAliasesW(LPWSTR AliasBuffer
,
583 DWORD AliasBufferLength
,
586 CSR_API_MESSAGE Request
;
591 DPRINT("GetConsoleAliasesW entered\n");
593 dwLength
= GetConsoleAliasesLengthW(ExeName
);
594 if (!dwLength
|| dwLength
> AliasBufferLength
)
597 CsrRequest
= MAKE_CSR_API(GET_ALL_CONSOLE_ALIASES
, CSR_CONSOLE
);
598 Request
.Data
.GetAllConsoleAlias
.AliasBuffer
= AliasBuffer
;
599 Request
.Data
.GetAllConsoleAlias
.AliasBufferLength
= AliasBufferLength
;
600 Request
.Data
.GetAllConsoleAlias
.lpExeName
= ExeName
;
602 Status
= CsrClientCallServer(&Request
,
605 sizeof(CSR_API_MESSAGE
));
607 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
609 SetLastErrorByStatus(Status
);
613 return Request
.Data
.GetAllConsoleAlias
.BytesWritten
/ sizeof(WCHAR
);
622 GetConsoleAliasesA(LPSTR AliasBuffer
,
623 DWORD AliasBufferLength
,
627 LPWSTR lpwExeName
= NULL
;
628 LPWSTR lpwAliasBuffer
;
630 DPRINT("GetConsoleAliasesA entered\n");
633 BasepAnsiStringToHeapUnicodeString(ExeName
, (LPWSTR
*) &lpwExeName
);
635 lpwAliasBuffer
= HeapAlloc(GetProcessHeap(), 0, AliasBufferLength
* sizeof(WCHAR
));
637 dwRetVal
= GetConsoleAliasesW(lpwAliasBuffer
, AliasBufferLength
, lpwExeName
);
640 RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR
*) lpwExeName
);
643 dwRetVal
= WideCharToMultiByte(CP_ACP
, 0, lpwAliasBuffer
, dwRetVal
, AliasBuffer
, AliasBufferLength
, NULL
, NULL
);
645 HeapFree(GetProcessHeap(), 0, lpwAliasBuffer
);
655 GetConsoleAliasesLengthW(LPWSTR lpExeName
)
657 CSR_API_MESSAGE Request
;
661 DPRINT("GetConsoleAliasesLengthW entered\n");
663 CsrRequest
= MAKE_CSR_API(GET_ALL_CONSOLE_ALIASES_LENGTH
, CSR_CONSOLE
);
664 Request
.Data
.GetAllConsoleAliasesLength
.lpExeName
= lpExeName
;
665 Request
.Data
.GetAllConsoleAliasesLength
.Length
= 0;
667 Status
= CsrClientCallServer(&Request
,
670 sizeof(CSR_API_MESSAGE
));
672 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
674 SetLastErrorByStatus(Status
);
678 return Request
.Data
.GetAllConsoleAliasesLength
.Length
;
687 GetConsoleAliasesLengthA(LPSTR lpExeName
)
690 LPWSTR lpExeNameW
= NULL
;
693 BasepAnsiStringToHeapUnicodeString(lpExeName
, (LPWSTR
*) &lpExeNameW
);
695 dwRetVal
= GetConsoleAliasesLengthW(lpExeNameW
);
697 dwRetVal
/= sizeof(WCHAR
);
701 RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR
*) lpExeNameW
);
708 * @unimplemented (Undocumented)
712 GetConsoleCommandHistoryW(DWORD Unknown0
,
716 DPRINT1("GetConsoleCommandHistoryW(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
);
717 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
723 * @unimplemented (Undocumented)
727 GetConsoleCommandHistoryA(DWORD Unknown0
,
731 DPRINT1("GetConsoleCommandHistoryA(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
);
732 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
738 * @unimplemented (Undocumented)
742 GetConsoleCommandHistoryLengthW(DWORD Unknown0
)
744 DPRINT1("GetConsoleCommandHistoryLengthW(0x%x) UNIMPLEMENTED!\n", Unknown0
);
745 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
751 * @unimplemented (Undocumented)
755 GetConsoleCommandHistoryLengthA(DWORD Unknown0
)
757 DPRINT1("GetConsoleCommandHistoryLengthA(0x%x) UNIMPLEMENTED!\n", Unknown0
);
758 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
767 GetConsoleDisplayMode(LPDWORD lpdwMode
)
769 * FUNCTION: Get the console display mode
771 * lpdwMode - Address of variable that receives the current value
773 * STATUS: Undocumented
776 DPRINT1("GetConsoleDisplayMode(0x%x) UNIMPLEMENTED!\n", lpdwMode
);
777 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
783 * @unimplemented (Undocumented)
787 GetConsoleFontInfo(DWORD Unknown0
,
792 DPRINT1("GetConsoleFontInfo(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
793 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
803 GetConsoleFontSize(HANDLE hConsoleOutput
,
806 COORD Empty
= {0, 0};
807 DPRINT1("GetConsoleFontSize(0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, nFont
);
808 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
814 * @implemented (Undocumented)
818 GetConsoleHardwareState(HANDLE hConsole
,
822 CSR_API_MESSAGE Request
;
826 CsrRequest
= MAKE_CSR_API(SETGET_CONSOLE_HW_STATE
, CSR_CONSOLE
);
827 Request
.Data
.ConsoleHardwareStateRequest
.ConsoleHandle
= hConsole
;
828 Request
.Data
.ConsoleHardwareStateRequest
.SetGet
= CONSOLE_HARDWARE_STATE_GET
;
830 Status
= CsrClientCallServer(&Request
,
833 sizeof(CSR_API_MESSAGE
));
834 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
836 SetLastErrorByStatus(Status
);
840 *State
= Request
.Data
.ConsoleHardwareStateRequest
.State
;
846 * @implemented (Undocumented)
850 GetConsoleInputWaitHandle(VOID
)
852 CSR_API_MESSAGE Request
;
856 CsrRequest
= MAKE_CSR_API(GET_INPUT_WAIT_HANDLE
, CSR_CONSOLE
);
858 Status
= CsrClientCallServer(&Request
,
861 sizeof(CSR_API_MESSAGE
));
862 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
864 SetLastErrorByStatus(Status
);
868 return Request
.Data
.GetConsoleInputWaitHandle
.InputWaitHandle
;
877 GetCurrentConsoleFont(HANDLE hConsoleOutput
,
879 PCONSOLE_FONT_INFO lpConsoleCurrentFont
)
881 DPRINT1("GetCurrentConsoleFont(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bMaximumWindow
, lpConsoleCurrentFont
);
882 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
888 * @unimplemented (Undocumented)
892 GetNumberOfConsoleFonts(VOID
)
894 DPRINT1("GetNumberOfConsoleFonts() UNIMPLEMENTED!\n");
895 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
896 return 1; /* FIXME: call csrss.exe */
901 * @unimplemented (Undocumented)
905 InvalidateConsoleDIBits(DWORD Unknown0
,
908 DPRINT1("InvalidateConsoleDIBits(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
909 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
915 * @unimplemented (Undocumented)
919 OpenConsoleW(LPCWSTR wsName
,
920 DWORD dwDesiredAccess
,
924 CSR_API_MESSAGE Request
;
926 NTSTATUS Status
= STATUS_SUCCESS
;
928 if (0 == _wcsicmp(wsName
, L
"CONIN$"))
930 CsrRequest
= MAKE_CSR_API(GET_INPUT_HANDLE
, CSR_NATIVE
);
932 else if (0 == _wcsicmp(wsName
, L
"CONOUT$"))
934 CsrRequest
= MAKE_CSR_API(GET_OUTPUT_HANDLE
, CSR_NATIVE
);
938 SetLastError(ERROR_INVALID_PARAMETER
);
939 return(INVALID_HANDLE_VALUE
);
942 if (dwDesiredAccess
& ~(GENERIC_READ
|GENERIC_WRITE
))
944 SetLastError(ERROR_INVALID_PARAMETER
);
945 return(INVALID_HANDLE_VALUE
);
948 if (dwShareMode
& ~(FILE_SHARE_READ
|FILE_SHARE_WRITE
))
950 SetLastError(ERROR_INVALID_PARAMETER
);
951 return(INVALID_HANDLE_VALUE
);
954 /* Structures for GET_INPUT_HANDLE and GET_OUTPUT_HANDLE requests are identical */
955 Request
.Data
.GetInputHandleRequest
.Access
= dwDesiredAccess
;
956 Request
.Data
.GetInputHandleRequest
.Inheritable
= bInheritHandle
;
958 Status
= CsrClientCallServer(&Request
,
961 sizeof(CSR_API_MESSAGE
));
962 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
964 SetLastErrorByStatus(Status
);
965 return INVALID_HANDLE_VALUE
;
968 return Request
.Data
.GetInputHandleRequest
.InputHandle
;
973 * @unimplemented (Undocumented)
977 SetConsoleCommandHistoryMode(DWORD dwMode
)
979 DPRINT1("SetConsoleCommandHistoryMode(0x%x) UNIMPLEMENTED!\n", dwMode
);
980 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
986 * @unimplemented (Undocumented)
990 SetConsoleCursor(DWORD Unknown0
,
993 DPRINT1("SetConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
994 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1004 SetConsoleDisplayMode(HANDLE hOut
,
1008 * FUNCTION: Set the console display mode.
1010 * hOut - Standard output handle.
1011 * dwNewMode - New mode.
1012 * lpdwOldMode - Address of a variable that receives the old mode.
1015 DPRINT1("SetConsoleDisplayMode(0x%x, 0x%x, 0x%p) UNIMPLEMENTED!\n", hOut
, dwNewMode
, lpdwOldMode
);
1016 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1022 * @unimplemented (Undocumented)
1026 SetConsoleFont(DWORD Unknown0
,
1029 DPRINT1("SetConsoleFont(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1030 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1036 * @implemented (Undocumented)
1040 SetConsoleHardwareState(HANDLE hConsole
,
1044 CSR_API_MESSAGE Request
;
1048 CsrRequest
= MAKE_CSR_API(SETGET_CONSOLE_HW_STATE
, CSR_CONSOLE
);
1049 Request
.Data
.ConsoleHardwareStateRequest
.ConsoleHandle
= hConsole
;
1050 Request
.Data
.ConsoleHardwareStateRequest
.SetGet
= CONSOLE_HARDWARE_STATE_SET
;
1051 Request
.Data
.ConsoleHardwareStateRequest
.State
= State
;
1053 Status
= CsrClientCallServer(&Request
,
1056 sizeof(CSR_API_MESSAGE
));
1057 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1059 SetLastErrorByStatus(Status
);
1068 * @unimplemented (Undocumented)
1072 SetConsoleKeyShortcuts(DWORD Unknown0
,
1077 DPRINT1("SetConsoleKeyShortcuts(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
1078 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1084 * @unimplemented (Undocumented)
1088 SetConsoleMaximumWindowSize(DWORD Unknown0
,
1091 DPRINT1("SetConsoleMaximumWindowSize(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1092 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1098 * @unimplemented (Undocumented)
1102 SetConsoleMenuClose(DWORD Unknown0
)
1104 DPRINT1("SetConsoleMenuClose(0x%x) UNIMPLEMENTED!\n", Unknown0
);
1105 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1111 * @unimplemented (Undocumented)
1115 SetConsoleNumberOfCommandsA(DWORD Unknown0
,
1118 DPRINT1("SetConsoleNumberOfCommandsA(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1119 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1125 * @unimplemented (Undocumented)
1129 SetConsoleNumberOfCommandsW(DWORD Unknown0
,
1132 DPRINT1("SetConsoleNumberOfCommandsW(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1133 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1139 * @unimplemented (Undocumented)
1143 SetConsolePalette(DWORD Unknown0
,
1147 DPRINT1("SetConsolePalette(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
);
1148 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1154 * @unimplemented (Undocumented)
1158 SetLastConsoleEventActive(VOID
)
1160 DPRINT1("SetLastConsoleEventActive() UNIMPLEMENTED!\n");
1161 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1167 * @unimplemented (Undocumented)
1171 ShowConsoleCursor(DWORD Unknown0
,
1174 DPRINT1("ShowConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1175 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1181 * FUNCTION: Checks whether the given handle is a valid console handle.
1183 * Handle - Handle to be checked
1185 * TRUE: Handle is a valid console handle
1186 * FALSE: Handle is not a valid console handle.
1187 * STATUS: Officially undocumented
1193 VerifyConsoleIoHandle(HANDLE Handle
)
1195 CSR_API_MESSAGE Request
;
1199 CsrRequest
= MAKE_CSR_API(VERIFY_HANDLE
, CSR_NATIVE
);
1200 Request
.Data
.VerifyHandleRequest
.Handle
= Handle
;
1202 Status
= CsrClientCallServer(&Request
,
1205 sizeof(CSR_API_MESSAGE
));
1206 if (!NT_SUCCESS(Status
))
1208 SetLastErrorByStatus(Status
);
1212 return (BOOL
)NT_SUCCESS(Request
.Status
);
1221 WriteConsoleInputVDMA(DWORD Unknown0
,
1226 DPRINT1("WriteConsoleInputVDMA(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
1227 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1237 WriteConsoleInputVDMW(DWORD Unknown0
,
1242 DPRINT1("WriteConsoleInputVDMW(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
1243 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1249 * @implemented (Undocumented)
1253 CloseConsoleHandle(HANDLE Handle
)
1255 CSR_API_MESSAGE Request
;
1259 CsrRequest
= MAKE_CSR_API(CLOSE_HANDLE
, CSR_NATIVE
);
1260 Request
.Data
.CloseHandleRequest
.Handle
= Handle
;
1262 Status
= CsrClientCallServer(&Request
,
1265 sizeof(CSR_API_MESSAGE
));
1266 if (!NT_SUCCESS(Status
))
1268 SetLastErrorByStatus(Status
);
1280 GetStdHandle(DWORD nStdHandle
)
1282 * FUNCTION: Get a handle for the standard input, standard output
1283 * and a standard error device.
1285 * nStdHandle - Specifies the device for which to return the handle.
1286 * RETURNS: If the function succeeds, the return value is the handle
1287 * of the specified device. Otherwise the value is INVALID_HANDLE_VALUE.
1290 PRTL_USER_PROCESS_PARAMETERS Ppb
;
1292 Ppb
= NtCurrentPeb()->ProcessParameters
;
1295 case STD_INPUT_HANDLE
:
1296 return Ppb
->StandardInput
;
1298 case STD_OUTPUT_HANDLE
:
1299 return Ppb
->StandardOutput
;
1301 case STD_ERROR_HANDLE
:
1302 return Ppb
->StandardError
;
1305 SetLastError (ERROR_INVALID_PARAMETER
);
1306 return INVALID_HANDLE_VALUE
;
1315 SetStdHandle(DWORD nStdHandle
,
1318 * FUNCTION: Set the handle for the standard input, standard output or
1319 * the standard error device.
1321 * nStdHandle - Specifies the handle to be set.
1322 * hHandle - The handle to set.
1323 * RETURNS: TRUE if the function succeeds, FALSE otherwise.
1326 PRTL_USER_PROCESS_PARAMETERS Ppb
;
1328 /* no need to check if hHandle == INVALID_HANDLE_VALUE */
1330 Ppb
= NtCurrentPeb()->ProcessParameters
;
1334 case STD_INPUT_HANDLE
:
1335 Ppb
->StandardInput
= hHandle
;
1338 case STD_OUTPUT_HANDLE
:
1339 Ppb
->StandardOutput
= hHandle
;
1342 case STD_ERROR_HANDLE
:
1343 Ppb
->StandardError
= hHandle
;
1347 /* windows for whatever reason sets the last error to ERROR_INVALID_HANDLE here */
1348 SetLastError(ERROR_INVALID_HANDLE
);
1355 IntWriteConsole(HANDLE hConsoleOutput
,
1357 DWORD nNumberOfCharsToWrite
,
1358 LPDWORD lpNumberOfCharsWritten
,
1362 PCSR_API_MESSAGE Request
;
1366 ULONG SizeBytes
, CharSize
;
1369 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
1370 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
1372 max(sizeof(CSR_API_MESSAGE
),
1373 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE
) + min(nNumberOfCharsToWrite
,
1374 CSRSS_MAX_WRITE_CONSOLE
/ CharSize
) * CharSize
));
1375 if (Request
== NULL
)
1377 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1381 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE
, CSR_CONSOLE
);
1383 while (nNumberOfCharsToWrite
> 0)
1385 Request
->Data
.WriteConsoleRequest
.ConsoleHandle
= hConsoleOutput
;
1386 Request
->Data
.WriteConsoleRequest
.Unicode
= bUnicode
;
1388 nChars
= (USHORT
)min(nNumberOfCharsToWrite
, CSRSS_MAX_WRITE_CONSOLE
/ CharSize
);
1389 Request
->Data
.WriteConsoleRequest
.NrCharactersToWrite
= nChars
;
1391 SizeBytes
= nChars
* CharSize
;
1393 memcpy(Request
->Data
.WriteConsoleRequest
.Buffer
, lpBuffer
, SizeBytes
);
1395 Status
= CsrClientCallServer(Request
,
1398 max(sizeof(CSR_API_MESSAGE
),
1399 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE
) + SizeBytes
));
1401 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
1403 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1404 SetLastErrorByStatus(Status
);
1408 nNumberOfCharsToWrite
-= nChars
;
1409 lpBuffer
= (PVOID
)((ULONG_PTR
)lpBuffer
+ (ULONG_PTR
)SizeBytes
);
1410 Written
+= Request
->Data
.WriteConsoleRequest
.NrCharactersWritten
;
1413 if (lpNumberOfCharsWritten
!= NULL
)
1415 *lpNumberOfCharsWritten
= Written
;
1417 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1423 /*--------------------------------------------------------------
1430 WriteConsoleA(HANDLE hConsoleOutput
,
1431 CONST VOID
*lpBuffer
,
1432 DWORD nNumberOfCharsToWrite
,
1433 LPDWORD lpNumberOfCharsWritten
,
1436 return IntWriteConsole(hConsoleOutput
,
1438 nNumberOfCharsToWrite
,
1439 lpNumberOfCharsWritten
,
1445 /*--------------------------------------------------------------
1452 WriteConsoleW(HANDLE hConsoleOutput
,
1453 CONST VOID
*lpBuffer
,
1454 DWORD nNumberOfCharsToWrite
,
1455 LPDWORD lpNumberOfCharsWritten
,
1458 return IntWriteConsole(hConsoleOutput
,
1460 nNumberOfCharsToWrite
,
1461 lpNumberOfCharsWritten
,
1469 IntReadConsole(HANDLE hConsoleInput
,
1471 DWORD nNumberOfCharsToRead
,
1472 LPDWORD lpNumberOfCharsRead
,
1473 PCONSOLE_READCONSOLE_CONTROL lpReserved
,
1476 PCSR_API_MESSAGE Request
;
1479 ULONG CharSize
, CharsRead
= 0;
1481 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
1482 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
1484 max(sizeof(CSR_API_MESSAGE
),
1485 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE
) + min(nNumberOfCharsToRead
,
1486 CSRSS_MAX_READ_CONSOLE
/ CharSize
) * CharSize
));
1487 if (Request
== NULL
)
1489 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1493 Request
->Status
= STATUS_SUCCESS
;
1494 CsrRequest
= MAKE_CSR_API(READ_CONSOLE
, CSR_CONSOLE
);
1498 if (Request
->Status
== STATUS_PENDING
)
1500 Status
= NtWaitForSingleObject(Request
->Data
.ReadConsoleRequest
.EventHandle
,
1503 if (!NT_SUCCESS(Status
))
1505 DPRINT1("Wait for console input failed!\n");
1510 Request
->Data
.ReadConsoleRequest
.ConsoleHandle
= hConsoleInput
;
1511 Request
->Data
.ReadConsoleRequest
.Unicode
= bUnicode
;
1512 Request
->Data
.ReadConsoleRequest
.NrCharactersToRead
= (WORD
)min(nNumberOfCharsToRead
, CSRSS_MAX_READ_CONSOLE
/ CharSize
);
1513 Request
->Data
.ReadConsoleRequest
.nCharsCanBeDeleted
= (WORD
)CharsRead
;
1515 Status
= CsrClientCallServer(Request
,
1518 max(sizeof(CSR_API_MESSAGE
),
1519 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE
)
1520 + Request
->Data
.ReadConsoleRequest
.NrCharactersToRead
* CharSize
));
1522 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
1524 DPRINT1("CSR returned error in ReadConsole\n");
1525 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1526 SetLastErrorByStatus(Status
);
1530 nNumberOfCharsToRead
-= Request
->Data
.ReadConsoleRequest
.NrCharactersRead
;
1531 memcpy((PVOID
)((ULONG_PTR
)lpBuffer
+ (ULONG_PTR
)(CharsRead
* CharSize
)),
1532 Request
->Data
.ReadConsoleRequest
.Buffer
,
1533 Request
->Data
.ReadConsoleRequest
.NrCharactersRead
* CharSize
);
1534 CharsRead
+= Request
->Data
.ReadConsoleRequest
.NrCharactersRead
;
1536 if (Request
->Status
== STATUS_NOTIFY_CLEANUP
)
1541 nNumberOfCharsToRead
++;
1543 Request
->Status
= STATUS_PENDING
;
1546 while (Request
->Status
== STATUS_PENDING
&& nNumberOfCharsToRead
> 0);
1548 if (lpNumberOfCharsRead
!= NULL
)
1550 *lpNumberOfCharsRead
= CharsRead
;
1553 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1559 /*--------------------------------------------------------------
1566 ReadConsoleA(HANDLE hConsoleInput
,
1568 DWORD nNumberOfCharsToRead
,
1569 LPDWORD lpNumberOfCharsRead
,
1570 PCONSOLE_READCONSOLE_CONTROL pInputControl
)
1572 return IntReadConsole(hConsoleInput
,
1574 nNumberOfCharsToRead
,
1575 lpNumberOfCharsRead
,
1581 /*--------------------------------------------------------------
1588 ReadConsoleW(HANDLE hConsoleInput
,
1590 DWORD nNumberOfCharsToRead
,
1591 LPDWORD lpNumberOfCharsRead
,
1592 PCONSOLE_READCONSOLE_CONTROL pInputControl
)
1594 return IntReadConsole(hConsoleInput
,
1596 nNumberOfCharsToRead
,
1597 lpNumberOfCharsRead
,
1603 /*--------------------------------------------------------------
1612 CSR_API_MESSAGE Request
;
1617 if (NtCurrentPeb()->ProcessParameters
->ConsoleHandle
)
1619 DPRINT("AllocConsole: Allocate duplicate console to the same Process\n");
1620 SetLastErrorByStatus (STATUS_OBJECT_NAME_EXISTS
);
1624 Request
.Data
.AllocConsoleRequest
.CtrlDispatcher
= ConsoleControlDispatcher
;
1625 Request
.Data
.AllocConsoleRequest
.ConsoleNeeded
= TRUE
;
1627 CsrRequest
= MAKE_CSR_API(ALLOC_CONSOLE
, CSR_CONSOLE
);
1629 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
1630 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1632 SetLastErrorByStatus(Status
);
1636 NtCurrentPeb()->ProcessParameters
->ConsoleHandle
= Request
.Data
.AllocConsoleRequest
.Console
;
1638 SetStdHandle(STD_INPUT_HANDLE
, Request
.Data
.AllocConsoleRequest
.InputHandle
);
1639 SetStdHandle(STD_OUTPUT_HANDLE
, Request
.Data
.AllocConsoleRequest
.OutputHandle
);
1641 hStdError
= DuplicateConsoleHandle(Request
.Data
.AllocConsoleRequest
.OutputHandle
,
1644 DUPLICATE_SAME_ACCESS
);
1646 SetStdHandle(STD_ERROR_HANDLE
, hStdError
);
1651 /*--------------------------------------------------------------
1660 // AG: I'm not sure if this is correct (what happens to std handles?)
1661 // but I just tried to reverse what AllocConsole() does...
1663 CSR_API_MESSAGE Request
;
1667 CsrRequest
= MAKE_CSR_API(FREE_CONSOLE
, CSR_CONSOLE
);
1669 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
1670 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1672 SetLastErrorByStatus(Status
);
1676 NtCurrentPeb()->ProcessParameters
->ConsoleHandle
= NULL
;
1681 /*--------------------------------------------------------------
1682 * GetConsoleScreenBufferInfo
1688 GetConsoleScreenBufferInfo(HANDLE hConsoleOutput
,
1689 PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
)
1691 CSR_API_MESSAGE Request
;
1695 CsrRequest
= MAKE_CSR_API(SCREEN_BUFFER_INFO
, CSR_CONSOLE
);
1696 Request
.Data
.ScreenBufferInfoRequest
.ConsoleHandle
= hConsoleOutput
;
1698 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
1699 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1701 SetLastErrorByStatus(Status
);
1704 *lpConsoleScreenBufferInfo
= Request
.Data
.ScreenBufferInfoRequest
.Info
;
1709 /*--------------------------------------------------------------
1710 * SetConsoleCursorPosition
1716 SetConsoleCursorPosition(HANDLE hConsoleOutput
,
1717 COORD dwCursorPosition
)
1719 CSR_API_MESSAGE Request
;
1723 CsrRequest
= MAKE_CSR_API(SET_CURSOR
, CSR_CONSOLE
);
1724 Request
.Data
.SetCursorRequest
.ConsoleHandle
= hConsoleOutput
;
1725 Request
.Data
.SetCursorRequest
.Position
= dwCursorPosition
;
1727 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
1728 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1730 SetLastErrorByStatus(Status
);
1740 IntFillConsoleOutputCharacter(HANDLE hConsoleOutput
,
1744 LPDWORD lpNumberOfCharsWritten
,
1747 CSR_API_MESSAGE Request
;
1751 CsrRequest
= MAKE_CSR_API(FILL_OUTPUT
, CSR_CONSOLE
);
1752 Request
.Data
.FillOutputRequest
.ConsoleHandle
= hConsoleOutput
;
1753 Request
.Data
.FillOutputRequest
.Unicode
= bUnicode
;
1756 Request
.Data
.FillOutputRequest
.Char
.UnicodeChar
= *((WCHAR
*)cCharacter
);
1758 Request
.Data
.FillOutputRequest
.Char
.AsciiChar
= *((CHAR
*)cCharacter
);
1760 Request
.Data
.FillOutputRequest
.Position
= dwWriteCoord
;
1761 Request
.Data
.FillOutputRequest
.Length
= (WORD
)nLength
;
1763 Status
= CsrClientCallServer(&Request
,
1766 sizeof(CSR_API_MESSAGE
));
1768 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1770 SetLastErrorByStatus(Status
);
1774 if(lpNumberOfCharsWritten
!= NULL
)
1776 *lpNumberOfCharsWritten
= Request
.Data
.FillOutputRequest
.NrCharactersWritten
;
1782 /*--------------------------------------------------------------
1783 * FillConsoleOutputCharacterA
1789 FillConsoleOutputCharacterA(HANDLE hConsoleOutput
,
1793 LPDWORD lpNumberOfCharsWritten
)
1795 return IntFillConsoleOutputCharacter(hConsoleOutput
,
1799 lpNumberOfCharsWritten
,
1804 /*--------------------------------------------------------------
1805 * FillConsoleOutputCharacterW
1811 FillConsoleOutputCharacterW(HANDLE hConsoleOutput
,
1815 LPDWORD lpNumberOfCharsWritten
)
1817 return IntFillConsoleOutputCharacter(hConsoleOutput
,
1821 lpNumberOfCharsWritten
,
1828 IntPeekConsoleInput(HANDLE hConsoleInput
,
1829 PINPUT_RECORD lpBuffer
,
1831 LPDWORD lpNumberOfEventsRead
,
1834 CSR_API_MESSAGE Request
;
1836 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1840 if (lpBuffer
== NULL
)
1842 SetLastError(ERROR_INVALID_PARAMETER
);
1846 Size
= nLength
* sizeof(INPUT_RECORD
);
1848 /* Allocate a Capture Buffer */
1849 DPRINT("IntPeekConsoleInput: %lx %p\n", Size
, lpNumberOfEventsRead
);
1850 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
1852 /* Allocate space in the Buffer */
1853 CsrCaptureMessageBuffer(CaptureBuffer
,
1856 (PVOID
*)&Request
.Data
.PeekConsoleInputRequest
.InputRecord
);
1858 /* Set up the data to send to the Console Server */
1859 CsrRequest
= MAKE_CSR_API(PEEK_CONSOLE_INPUT
, CSR_CONSOLE
);
1860 Request
.Data
.PeekConsoleInputRequest
.ConsoleHandle
= hConsoleInput
;
1861 Request
.Data
.PeekConsoleInputRequest
.Unicode
= bUnicode
;
1862 Request
.Data
.PeekConsoleInputRequest
.Length
= nLength
;
1864 /* Call the server */
1865 Status
= CsrClientCallServer(&Request
,
1868 sizeof(CSR_API_MESSAGE
));
1869 DPRINT("Server returned: %x\n", Request
.Status
);
1871 /* Check for success*/
1872 if (NT_SUCCESS(Request
.Status
))
1874 /* Return the number of events read */
1875 DPRINT("Events read: %lx\n", Request
.Data
.PeekConsoleInputRequest
.Length
);
1876 *lpNumberOfEventsRead
= Request
.Data
.PeekConsoleInputRequest
.Length
;
1878 /* Copy into the buffer */
1879 DPRINT("Copying to buffer\n");
1880 RtlCopyMemory(lpBuffer
,
1881 Request
.Data
.PeekConsoleInputRequest
.InputRecord
,
1882 sizeof(INPUT_RECORD
) * *lpNumberOfEventsRead
);
1887 *lpNumberOfEventsRead
= 0;
1888 SetLastErrorByStatus(Request
.Status
);
1891 /* Release the capture buffer */
1892 CsrFreeCaptureBuffer(CaptureBuffer
);
1894 /* Return TRUE or FALSE */
1895 return NT_SUCCESS(Request
.Status
);
1898 /*--------------------------------------------------------------
1905 PeekConsoleInputA(HANDLE hConsoleInput
,
1906 PINPUT_RECORD lpBuffer
,
1908 LPDWORD lpNumberOfEventsRead
)
1910 return IntPeekConsoleInput(hConsoleInput
,
1913 lpNumberOfEventsRead
,
1918 /*--------------------------------------------------------------
1925 PeekConsoleInputW(HANDLE hConsoleInput
,
1926 PINPUT_RECORD lpBuffer
,
1928 LPDWORD lpNumberOfEventsRead
)
1930 return IntPeekConsoleInput(hConsoleInput
,
1932 lpNumberOfEventsRead
,
1939 IntReadConsoleInput(HANDLE hConsoleInput
,
1940 PINPUT_RECORD lpBuffer
,
1942 LPDWORD lpNumberOfEventsRead
,
1945 CSR_API_MESSAGE Request
;
1950 CsrRequest
= MAKE_CSR_API(READ_INPUT
, CSR_CONSOLE
);
1955 Request
.Data
.ReadInputRequest
.ConsoleHandle
= hConsoleInput
;
1956 Request
.Data
.ReadInputRequest
.Unicode
= bUnicode
;
1958 Status
= CsrClientCallServer(&Request
,
1961 sizeof(CSR_API_MESSAGE
));
1962 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1966 /* we couldn't read a single record, fail */
1967 SetLastErrorByStatus(Status
);
1972 /* FIXME - fail gracefully in case we already read at least one record? */
1976 else if (Status
== STATUS_PENDING
)
1980 Status
= NtWaitForSingleObject(Request
.Data
.ReadInputRequest
.Event
, FALSE
, 0);
1981 if (!NT_SUCCESS(Status
))
1983 SetLastErrorByStatus(Status
);
1989 /* nothing more to read (waiting for more input??), let's just bail */
1995 lpBuffer
[Read
++] = Request
.Data
.ReadInputRequest
.Input
;
1998 if (!Request
.Data
.ReadInputRequest
.MoreEvents
)
2000 /* nothing more to read, bail */
2006 if (lpNumberOfEventsRead
!= NULL
)
2008 *lpNumberOfEventsRead
= Read
;
2015 /*--------------------------------------------------------------
2022 ReadConsoleInputA(HANDLE hConsoleInput
,
2023 PINPUT_RECORD lpBuffer
,
2025 LPDWORD lpNumberOfEventsRead
)
2027 return IntReadConsoleInput(hConsoleInput
,
2030 lpNumberOfEventsRead
,
2035 /*--------------------------------------------------------------
2042 ReadConsoleInputW(HANDLE hConsoleInput
,
2043 PINPUT_RECORD lpBuffer
,
2045 LPDWORD lpNumberOfEventsRead
)
2047 return IntReadConsoleInput(hConsoleInput
,
2050 lpNumberOfEventsRead
,
2057 IntWriteConsoleInput(HANDLE hConsoleInput
,
2058 PINPUT_RECORD lpBuffer
,
2060 LPDWORD lpNumberOfEventsWritten
,
2063 CSR_API_MESSAGE Request
;
2065 PCSR_CAPTURE_BUFFER CaptureBuffer
;
2069 if (lpBuffer
== NULL
)
2071 SetLastError(ERROR_INVALID_PARAMETER
);
2075 Size
= nLength
* sizeof(INPUT_RECORD
);
2077 /* Allocate a Capture Buffer */
2078 DPRINT("IntWriteConsoleInput: %lx %p\n", Size
, lpNumberOfEventsWritten
);
2079 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
2081 /* Allocate space in the Buffer */
2082 CsrCaptureMessageBuffer(CaptureBuffer
,
2085 (PVOID
*)&Request
.Data
.WriteConsoleInputRequest
.InputRecord
);
2087 /* Set up the data to send to the Console Server */
2088 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_INPUT
, CSR_CONSOLE
);
2089 Request
.Data
.WriteConsoleInputRequest
.ConsoleHandle
= hConsoleInput
;
2090 Request
.Data
.WriteConsoleInputRequest
.Unicode
= bUnicode
;
2091 Request
.Data
.WriteConsoleInputRequest
.Length
= nLength
;
2093 /* Call the server */
2094 Status
= CsrClientCallServer(&Request
,
2097 sizeof(CSR_API_MESSAGE
));
2098 DPRINT("Server returned: %x\n", Request
.Status
);
2100 /* Check for success*/
2101 if (NT_SUCCESS(Request
.Status
))
2103 /* Return the number of events read */
2104 DPRINT("Events read: %lx\n", Request
.Data
.WriteConsoleInputRequest
.Length
);
2105 *lpNumberOfEventsWritten
= Request
.Data
.WriteConsoleInputRequest
.Length
;
2110 *lpNumberOfEventsWritten
= 0;
2111 SetLastErrorByStatus(Request
.Status
);
2114 /* Release the capture buffer */
2115 CsrFreeCaptureBuffer(CaptureBuffer
);
2117 /* Return TRUE or FALSE */
2118 return NT_SUCCESS(Request
.Status
);
2122 /*--------------------------------------------------------------
2123 * WriteConsoleInputA
2129 WriteConsoleInputA(HANDLE hConsoleInput
,
2130 CONST INPUT_RECORD
*lpBuffer
,
2132 LPDWORD lpNumberOfEventsWritten
)
2134 return IntWriteConsoleInput(hConsoleInput
,
2135 (PINPUT_RECORD
)lpBuffer
,
2137 lpNumberOfEventsWritten
,
2142 /*--------------------------------------------------------------
2143 * WriteConsoleInputW
2149 WriteConsoleInputW(HANDLE hConsoleInput
,
2150 CONST INPUT_RECORD
*lpBuffer
,
2152 LPDWORD lpNumberOfEventsWritten
)
2154 return IntWriteConsoleInput(hConsoleInput
,
2155 (PINPUT_RECORD
)lpBuffer
,
2157 lpNumberOfEventsWritten
,
2164 IntReadConsoleOutput(HANDLE hConsoleOutput
,
2165 PCHAR_INFO lpBuffer
,
2167 COORD dwBufferCoord
,
2168 PSMALL_RECT lpReadRegion
,
2171 CSR_API_MESSAGE Request
;
2173 PCSR_CAPTURE_BUFFER CaptureBuffer
;
2175 DWORD Size
, SizeX
, SizeY
;
2177 if (lpBuffer
== NULL
)
2179 SetLastError(ERROR_INVALID_PARAMETER
);
2183 Size
= dwBufferSize
.X
* dwBufferSize
.Y
* sizeof(CHAR_INFO
);
2185 /* Allocate a Capture Buffer */
2186 DPRINT("IntReadConsoleOutput: %lx %p\n", Size
, lpReadRegion
);
2187 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
2189 /* Allocate space in the Buffer */
2190 CsrCaptureMessageBuffer(CaptureBuffer
,
2193 (PVOID
*)&Request
.Data
.ReadConsoleOutputRequest
.CharInfo
);
2195 /* Set up the data to send to the Console Server */
2196 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT
, CSR_CONSOLE
);
2197 Request
.Data
.ReadConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
2198 Request
.Data
.ReadConsoleOutputRequest
.Unicode
= bUnicode
;
2199 Request
.Data
.ReadConsoleOutputRequest
.BufferSize
= dwBufferSize
;
2200 Request
.Data
.ReadConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
2201 Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
= *lpReadRegion
;
2203 /* Call the server */
2204 Status
= CsrClientCallServer(&Request
,
2207 sizeof(CSR_API_MESSAGE
));
2208 DPRINT("Server returned: %x\n", Request
.Status
);
2210 /* Check for success*/
2211 if (NT_SUCCESS(Request
.Status
))
2213 /* Copy into the buffer */
2214 DPRINT("Copying to buffer\n");
2215 SizeX
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Right
-
2216 Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Left
+ 1;
2217 SizeY
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Bottom
-
2218 Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Top
+ 1;
2219 RtlCopyMemory(lpBuffer
,
2220 Request
.Data
.ReadConsoleOutputRequest
.CharInfo
,
2221 sizeof(CHAR_INFO
) * SizeX
* SizeY
);
2226 SetLastErrorByStatus(Request
.Status
);
2229 /* Return the read region */
2230 DPRINT("read region: %lx\n", Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
);
2231 *lpReadRegion
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
;
2233 /* Release the capture buffer */
2234 CsrFreeCaptureBuffer(CaptureBuffer
);
2236 /* Return TRUE or FALSE */
2237 return NT_SUCCESS(Request
.Status
);
2240 /*--------------------------------------------------------------
2241 * ReadConsoleOutputA
2247 ReadConsoleOutputA(HANDLE hConsoleOutput
,
2248 PCHAR_INFO lpBuffer
,
2250 COORD dwBufferCoord
,
2251 PSMALL_RECT lpReadRegion
)
2253 return IntReadConsoleOutput(hConsoleOutput
,
2262 /*--------------------------------------------------------------
2263 * ReadConsoleOutputW
2269 ReadConsoleOutputW(HANDLE hConsoleOutput
,
2270 PCHAR_INFO lpBuffer
,
2272 COORD dwBufferCoord
,
2273 PSMALL_RECT lpReadRegion
)
2275 return IntReadConsoleOutput(hConsoleOutput
,
2286 IntWriteConsoleOutput(HANDLE hConsoleOutput
,
2287 CONST CHAR_INFO
*lpBuffer
,
2289 COORD dwBufferCoord
,
2290 PSMALL_RECT lpWriteRegion
,
2293 CSR_API_MESSAGE Request
;
2295 PCSR_CAPTURE_BUFFER CaptureBuffer
;
2299 Size
= dwBufferSize
.Y
* dwBufferSize
.X
* sizeof(CHAR_INFO
);
2301 /* Allocate a Capture Buffer */
2302 DPRINT("IntWriteConsoleOutput: %lx %p\n", Size
, lpWriteRegion
);
2303 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
2305 /* Allocate space in the Buffer */
2306 CsrCaptureMessageBuffer(CaptureBuffer
,
2309 (PVOID
*)&Request
.Data
.WriteConsoleOutputRequest
.CharInfo
);
2311 /* Copy from the buffer */
2312 RtlCopyMemory(Request
.Data
.WriteConsoleOutputRequest
.CharInfo
, lpBuffer
, Size
);
2314 /* Set up the data to send to the Console Server */
2315 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT
, CSR_CONSOLE
);
2316 Request
.Data
.WriteConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
2317 Request
.Data
.WriteConsoleOutputRequest
.Unicode
= bUnicode
;
2318 Request
.Data
.WriteConsoleOutputRequest
.BufferSize
= dwBufferSize
;
2319 Request
.Data
.WriteConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
2320 Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
= *lpWriteRegion
;
2322 /* Call the server */
2323 Status
= CsrClientCallServer(&Request
,
2326 sizeof(CSR_API_MESSAGE
));
2327 DPRINT("Server returned: %x\n", Request
.Status
);
2329 /* Check for success*/
2330 if (!NT_SUCCESS(Request
.Status
))
2333 SetLastErrorByStatus(Request
.Status
);
2336 /* Return the read region */
2337 DPRINT("read region: %lx\n", Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
);
2338 *lpWriteRegion
= Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
;
2340 /* Release the capture buffer */
2341 CsrFreeCaptureBuffer(CaptureBuffer
);
2343 /* Return TRUE or FALSE */
2344 return NT_SUCCESS(Request
.Status
);
2347 /*--------------------------------------------------------------
2348 * WriteConsoleOutputA
2354 WriteConsoleOutputA(HANDLE hConsoleOutput
,
2355 CONST CHAR_INFO
*lpBuffer
,
2357 COORD dwBufferCoord
,
2358 PSMALL_RECT lpWriteRegion
)
2360 return IntWriteConsoleOutput(hConsoleOutput
,
2369 /*--------------------------------------------------------------
2370 * WriteConsoleOutputW
2376 WriteConsoleOutputW(HANDLE hConsoleOutput
,
2377 CONST CHAR_INFO
*lpBuffer
,
2379 COORD dwBufferCoord
,
2380 PSMALL_RECT lpWriteRegion
)
2382 return IntWriteConsoleOutput(hConsoleOutput
,
2393 IntReadConsoleOutputCharacter(HANDLE hConsoleOutput
,
2397 LPDWORD lpNumberOfCharsRead
,
2400 PCSR_API_MESSAGE Request
;
2403 ULONG nChars
, SizeBytes
, CharSize
;
2404 DWORD CharsRead
= 0;
2406 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
2408 nChars
= min(nLength
, CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR
) / CharSize
;
2409 SizeBytes
= nChars
* CharSize
;
2411 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
2412 max(sizeof(CSR_API_MESSAGE
),
2413 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR
)
2414 + min (nChars
, CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR
/ CharSize
) * CharSize
));
2415 if (Request
== NULL
)
2417 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2421 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT_CHAR
, CSR_CONSOLE
);
2422 Request
->Data
.ReadConsoleOutputCharRequest
.ReadCoord
= dwReadCoord
;
2428 Request
->Data
.ReadConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
2429 Request
->Data
.ReadConsoleOutputCharRequest
.Unicode
= bUnicode
;
2430 Request
->Data
.ReadConsoleOutputCharRequest
.NumCharsToRead
= min(nLength
, nChars
);
2431 SizeBytes
= Request
->Data
.ReadConsoleOutputCharRequest
.NumCharsToRead
* CharSize
;
2433 Status
= CsrClientCallServer(Request
,
2436 max(sizeof(CSR_API_MESSAGE
),
2437 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR
) + SizeBytes
));
2438 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Request
->Status
))
2440 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2441 SetLastErrorByStatus(Status
);
2445 BytesRead
= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
* CharSize
;
2446 memcpy(lpCharacter
, Request
->Data
.ReadConsoleOutputCharRequest
.String
, BytesRead
);
2447 lpCharacter
= (PVOID
)((ULONG_PTR
)lpCharacter
+ (ULONG_PTR
)BytesRead
);
2448 CharsRead
+= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
;
2449 nLength
-= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
;
2451 Request
->Data
.ReadConsoleOutputCharRequest
.ReadCoord
= Request
->Data
.ReadConsoleOutputCharRequest
.EndCoord
;
2454 if (lpNumberOfCharsRead
!= NULL
)
2456 *lpNumberOfCharsRead
= CharsRead
;
2459 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2465 /*--------------------------------------------------------------
2466 * ReadConsoleOutputCharacterA
2472 ReadConsoleOutputCharacterA(HANDLE hConsoleOutput
,
2476 LPDWORD lpNumberOfCharsRead
)
2478 return IntReadConsoleOutputCharacter(hConsoleOutput
,
2482 lpNumberOfCharsRead
,
2487 /*--------------------------------------------------------------
2488 * ReadConsoleOutputCharacterW
2494 ReadConsoleOutputCharacterW(HANDLE hConsoleOutput
,
2498 LPDWORD lpNumberOfCharsRead
)
2500 return IntReadConsoleOutputCharacter(hConsoleOutput
,
2504 lpNumberOfCharsRead
,
2509 /*--------------------------------------------------------------
2510 * ReadConsoleOutputAttribute
2516 ReadConsoleOutputAttribute(HANDLE hConsoleOutput
,
2520 LPDWORD lpNumberOfAttrsRead
)
2522 PCSR_API_MESSAGE Request
;
2527 if (lpNumberOfAttrsRead
!= NULL
)
2528 *lpNumberOfAttrsRead
= nLength
;
2530 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
2532 max(sizeof(CSR_API_MESSAGE
),
2533 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB
)
2534 + min (nLength
, CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
)) * sizeof(WORD
)));
2535 if (Request
== NULL
)
2537 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2541 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2543 while (nLength
!= 0)
2545 Request
->Data
.ReadConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2546 Request
->Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= dwReadCoord
;
2548 if (nLength
> CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
))
2549 Size
= CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WCHAR
);
2553 Request
->Data
.ReadConsoleOutputAttribRequest
.NumAttrsToRead
= Size
;
2555 Status
= CsrClientCallServer(Request
,
2558 max(sizeof(CSR_API_MESSAGE
),
2559 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB
) + Size
* sizeof(WORD
)));
2560 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Request
->Status
))
2562 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2563 SetLastErrorByStatus(Status
);
2567 memcpy(lpAttribute
, Request
->Data
.ReadConsoleOutputAttribRequest
.Attribute
, Size
* sizeof(WORD
));
2568 lpAttribute
+= Size
;
2570 Request
->Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= Request
->Data
.ReadConsoleOutputAttribRequest
.EndCoord
;
2573 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2581 IntWriteConsoleOutputCharacter(HANDLE hConsoleOutput
,
2585 LPDWORD lpNumberOfCharsWritten
,
2588 PCSR_API_MESSAGE Request
;
2591 ULONG SizeBytes
, CharSize
, nChars
;
2594 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
2596 nChars
= min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
/ CharSize
);
2597 SizeBytes
= nChars
* CharSize
;
2599 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
2600 max(sizeof(CSR_API_MESSAGE
),
2601 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR
)
2602 + min (nChars
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
/ CharSize
) * CharSize
));
2603 if (Request
== NULL
)
2605 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2609 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT_CHAR
, CSR_CONSOLE
);
2610 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= dwWriteCoord
;
2616 Request
->Data
.WriteConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
2617 Request
->Data
.WriteConsoleOutputCharRequest
.Unicode
= bUnicode
;
2618 Request
->Data
.WriteConsoleOutputCharRequest
.Length
= (WORD
)min(nLength
, nChars
);
2619 BytesWrite
= Request
->Data
.WriteConsoleOutputCharRequest
.Length
* CharSize
;
2621 memcpy(Request
->Data
.WriteConsoleOutputCharRequest
.String
, lpCharacter
, BytesWrite
);
2623 Status
= CsrClientCallServer(Request
,
2626 max(sizeof(CSR_API_MESSAGE
),
2627 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR
) + BytesWrite
));
2629 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
2631 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2632 SetLastErrorByStatus(Status
);
2636 nLength
-= Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
;
2637 lpCharacter
= (PVOID
)((ULONG_PTR
)lpCharacter
+ (ULONG_PTR
)(Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
* CharSize
));
2638 Written
+= Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
;
2640 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= Request
->Data
.WriteConsoleOutputCharRequest
.EndCoord
;
2643 if (lpNumberOfCharsWritten
!= NULL
)
2645 *lpNumberOfCharsWritten
= Written
;
2648 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2654 /*--------------------------------------------------------------
2655 * WriteConsoleOutputCharacterA
2661 WriteConsoleOutputCharacterA(HANDLE hConsoleOutput
,
2665 LPDWORD lpNumberOfCharsWritten
)
2667 return IntWriteConsoleOutputCharacter(hConsoleOutput
,
2671 lpNumberOfCharsWritten
,
2676 /*--------------------------------------------------------------
2677 * WriteConsoleOutputCharacterW
2683 WriteConsoleOutputCharacterW(HANDLE hConsoleOutput
,
2684 LPCWSTR lpCharacter
,
2687 LPDWORD lpNumberOfCharsWritten
)
2689 return IntWriteConsoleOutputCharacter(hConsoleOutput
,
2693 lpNumberOfCharsWritten
,
2698 /*--------------------------------------------------------------
2699 * WriteConsoleOutputAttribute
2705 WriteConsoleOutputAttribute(HANDLE hConsoleOutput
,
2706 CONST WORD
*lpAttribute
,
2709 LPDWORD lpNumberOfAttrsWritten
)
2711 PCSR_API_MESSAGE Request
;
2716 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
2718 max(sizeof(CSR_API_MESSAGE
),
2719 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB
)
2720 + min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
)) * sizeof(WORD
)));
2721 if (Request
== NULL
)
2723 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2727 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2728 Request
->Data
.WriteConsoleOutputAttribRequest
.Coord
= dwWriteCoord
;
2730 if (lpNumberOfAttrsWritten
)
2731 *lpNumberOfAttrsWritten
= nLength
;
2734 Size
= (WORD
)min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
));
2735 Request
->Data
.WriteConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2736 Request
->Data
.WriteConsoleOutputAttribRequest
.Length
= Size
;
2737 memcpy(Request
->Data
.WriteConsoleOutputAttribRequest
.Attribute
, lpAttribute
, Size
* sizeof(WORD
));
2739 Status
= CsrClientCallServer(Request
,
2742 max(sizeof(CSR_API_MESSAGE
),
2743 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB
) + Size
* sizeof(WORD
)));
2745 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
2747 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2748 SetLastErrorByStatus (Status
);
2752 lpAttribute
+= Size
;
2753 Request
->Data
.WriteConsoleOutputAttribRequest
.Coord
= Request
->Data
.WriteConsoleOutputAttribRequest
.EndCoord
;
2756 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2762 /*--------------------------------------------------------------
2763 * FillConsoleOutputAttribute
2769 FillConsoleOutputAttribute(HANDLE hConsoleOutput
,
2773 LPDWORD lpNumberOfAttrsWritten
)
2775 CSR_API_MESSAGE Request
;
2779 CsrRequest
= MAKE_CSR_API(FILL_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2780 Request
.Data
.FillOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2781 Request
.Data
.FillOutputAttribRequest
.Attribute
= (CHAR
)wAttribute
;
2782 Request
.Data
.FillOutputAttribRequest
.Coord
= dwWriteCoord
;
2783 Request
.Data
.FillOutputAttribRequest
.Length
= (WORD
)nLength
;
2785 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
2786 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2788 SetLastErrorByStatus ( Status
);
2792 if (lpNumberOfAttrsWritten
)
2793 *lpNumberOfAttrsWritten
= nLength
;
2799 /*--------------------------------------------------------------
2806 GetConsoleMode(HANDLE hConsoleHandle
,
2809 CSR_API_MESSAGE Request
;
2813 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_MODE
, CSR_CONSOLE
);
2814 Request
.Data
.GetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
2816 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2817 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2819 SetLastErrorByStatus ( Status
);
2822 *lpMode
= Request
.Data
.GetConsoleModeRequest
.ConsoleMode
;
2828 /*--------------------------------------------------------------
2829 * GetNumberOfConsoleInputEvents
2835 GetNumberOfConsoleInputEvents(HANDLE hConsoleInput
,
2836 LPDWORD lpNumberOfEvents
)
2838 CSR_API_MESSAGE Request
;
2842 if (lpNumberOfEvents
== NULL
)
2844 SetLastError(ERROR_INVALID_PARAMETER
);
2848 CsrRequest
= MAKE_CSR_API(GET_NUM_INPUT_EVENTS
, CSR_CONSOLE
);
2849 Request
.Data
.GetNumInputEventsRequest
.ConsoleHandle
= hConsoleInput
;
2851 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
2852 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2854 SetLastErrorByStatus(Status
);
2858 *lpNumberOfEvents
= Request
.Data
.GetNumInputEventsRequest
.NumInputEvents
;
2864 /*--------------------------------------------------------------
2865 * GetLargestConsoleWindowSize
2871 GetLargestConsoleWindowSize(HANDLE hConsoleOutput
)
2873 COORD Coord
= {80,25};
2874 DPRINT1("GetLargestConsoleWindowSize(0x%x) UNIMPLEMENTED!\n", hConsoleOutput
);
2875 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2880 /*--------------------------------------------------------------
2881 * GetConsoleCursorInfo
2887 GetConsoleCursorInfo(HANDLE hConsoleOutput
,
2888 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
)
2890 CSR_API_MESSAGE Request
;
2894 if (!lpConsoleCursorInfo
)
2896 SetLastError(ERROR_INVALID_ACCESS
);
2900 CsrRequest
= MAKE_CSR_API(GET_CURSOR_INFO
, CSR_CONSOLE
);
2901 Request
.Data
.GetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
2903 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2905 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2907 SetLastErrorByStatus(Status
);
2910 *lpConsoleCursorInfo
= Request
.Data
.GetCursorInfoRequest
.Info
;
2916 /*--------------------------------------------------------------
2917 * GetNumberOfConsoleMouseButtons
2923 GetNumberOfConsoleMouseButtons(LPDWORD lpNumberOfMouseButtons
)
2925 DPRINT1("GetNumberOfConsoleMouseButtons(0x%x) UNIMPLEMENTED!\n", lpNumberOfMouseButtons
);
2926 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2931 /*--------------------------------------------------------------
2938 SetConsoleMode(HANDLE hConsoleHandle
,
2941 CSR_API_MESSAGE Request
;
2945 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_MODE
, CSR_CONSOLE
);
2946 Request
.Data
.SetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
2947 Request
.Data
.SetConsoleModeRequest
.Mode
= dwMode
;
2949 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
2950 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2952 SetLastErrorByStatus ( Status
);
2960 /*--------------------------------------------------------------
2961 * SetConsoleActiveScreenBuffer
2967 SetConsoleActiveScreenBuffer(HANDLE hConsoleOutput
)
2969 CSR_API_MESSAGE Request
;
2973 CsrRequest
= MAKE_CSR_API(SET_SCREEN_BUFFER
, CSR_CONSOLE
);
2974 Request
.Data
.SetScreenBufferRequest
.OutputHandle
= hConsoleOutput
;
2976 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
2977 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2979 SetLastErrorByStatus(Status
);
2987 /*--------------------------------------------------------------
2988 * FlushConsoleInputBuffer
2994 FlushConsoleInputBuffer(HANDLE hConsoleInput
)
2996 CSR_API_MESSAGE Request
;
3000 CsrRequest
= MAKE_CSR_API(FLUSH_INPUT_BUFFER
, CSR_CONSOLE
);
3001 Request
.Data
.FlushInputBufferRequest
.ConsoleInput
= hConsoleInput
;
3003 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3004 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3006 SetLastErrorByStatus(Status
);
3014 /*--------------------------------------------------------------
3015 * SetConsoleScreenBufferSize
3021 SetConsoleScreenBufferSize(HANDLE hConsoleOutput
,
3024 DPRINT1("SetConsoleScreenBufferSize(0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, dwSize
);
3025 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3029 /*--------------------------------------------------------------
3030 * SetConsoleCursorInfo
3036 SetConsoleCursorInfo(HANDLE hConsoleOutput
,
3037 CONST CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
)
3039 CSR_API_MESSAGE Request
;
3043 CsrRequest
= MAKE_CSR_API(SET_CURSOR_INFO
, CSR_CONSOLE
);
3044 Request
.Data
.SetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
3045 Request
.Data
.SetCursorInfoRequest
.Info
= *lpConsoleCursorInfo
;
3047 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3048 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3050 SetLastErrorByStatus(Status
);
3060 IntScrollConsoleScreenBuffer(HANDLE hConsoleOutput
,
3061 const SMALL_RECT
*lpScrollRectangle
,
3062 const SMALL_RECT
*lpClipRectangle
,
3063 COORD dwDestinationOrigin
,
3064 const CHAR_INFO
*lpFill
,
3067 CSR_API_MESSAGE Request
;
3071 CsrRequest
= MAKE_CSR_API(SCROLL_CONSOLE_SCREEN_BUFFER
, CSR_CONSOLE
);
3072 Request
.Data
.ScrollConsoleScreenBufferRequest
.ConsoleHandle
= hConsoleOutput
;
3073 Request
.Data
.ScrollConsoleScreenBufferRequest
.Unicode
= bUnicode
;
3074 Request
.Data
.ScrollConsoleScreenBufferRequest
.ScrollRectangle
= *lpScrollRectangle
;
3076 if (lpClipRectangle
!= NULL
)
3078 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= TRUE
;
3079 Request
.Data
.ScrollConsoleScreenBufferRequest
.ClipRectangle
= *lpClipRectangle
;
3083 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= FALSE
;
3086 Request
.Data
.ScrollConsoleScreenBufferRequest
.DestinationOrigin
= dwDestinationOrigin
;
3087 Request
.Data
.ScrollConsoleScreenBufferRequest
.Fill
= *lpFill
;
3089 Status
= CsrClientCallServer(&Request
,
3092 sizeof(CSR_API_MESSAGE
));
3094 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3096 SetLastErrorByStatus(Status
);
3104 /*--------------------------------------------------------------
3105 * ScrollConsoleScreenBufferA
3111 ScrollConsoleScreenBufferA(HANDLE hConsoleOutput
,
3112 CONST SMALL_RECT
*lpScrollRectangle
,
3113 CONST SMALL_RECT
*lpClipRectangle
,
3114 COORD dwDestinationOrigin
,
3115 CONST CHAR_INFO
*lpFill
)
3117 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
3118 (PSMALL_RECT
)lpScrollRectangle
,
3119 (PSMALL_RECT
)lpClipRectangle
,
3120 dwDestinationOrigin
,
3126 /*--------------------------------------------------------------
3127 * ScrollConsoleScreenBufferW
3133 ScrollConsoleScreenBufferW(HANDLE hConsoleOutput
,
3134 CONST SMALL_RECT
*lpScrollRectangle
,
3135 CONST SMALL_RECT
*lpClipRectangle
,
3136 COORD dwDestinationOrigin
,
3137 CONST CHAR_INFO
*lpFill
)
3139 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
3142 dwDestinationOrigin
,
3148 /*--------------------------------------------------------------
3149 * SetConsoleWindowInfo
3155 SetConsoleWindowInfo(HANDLE hConsoleOutput
,
3157 CONST SMALL_RECT
*lpConsoleWindow
)
3159 DPRINT1("SetConsoleWindowInfo(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bAbsolute
, lpConsoleWindow
);
3160 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3165 /*--------------------------------------------------------------
3166 * SetConsoleTextAttribute
3172 SetConsoleTextAttribute(HANDLE hConsoleOutput
,
3175 CSR_API_MESSAGE Request
;
3179 CsrRequest
= MAKE_CSR_API(SET_ATTRIB
, CSR_CONSOLE
);
3180 Request
.Data
.SetAttribRequest
.ConsoleHandle
= hConsoleOutput
;
3181 Request
.Data
.SetAttribRequest
.Attrib
= wAttributes
;
3183 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3184 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3186 SetLastErrorByStatus(Status
);
3196 AddConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
3198 if (HandlerRoutine
== NULL
)
3200 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= TRUE
;
3206 if (CtrlHandlers
== NULL
)
3208 CtrlHandlers
= RtlAllocateHeap(RtlGetProcessHeap(),
3210 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
3214 CtrlHandlers
= RtlReAllocateHeap(RtlGetProcessHeap(),
3216 (PVOID
)CtrlHandlers
,
3217 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
3220 if (CtrlHandlers
== NULL
)
3223 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3227 CtrlHandlers
[NrCtrlHandlers
- 1] = HandlerRoutine
;
3235 RemoveConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
3239 if (HandlerRoutine
== NULL
)
3241 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= FALSE
;
3246 for (i
= 0; i
< NrCtrlHandlers
; i
++)
3248 if ( ((void*)(CtrlHandlers
[i
])) == (void*)HandlerRoutine
)
3251 memmove(CtrlHandlers
+ i
,
3252 CtrlHandlers
+ i
+ 1,
3253 (NrCtrlHandlers
- i
) * sizeof(PHANDLER_ROUTINE
));
3255 CtrlHandlers
= RtlReAllocateHeap(RtlGetProcessHeap(),
3257 (PVOID
)CtrlHandlers
,
3258 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
3264 SetLastError(ERROR_INVALID_PARAMETER
);
3274 SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
,
3279 RtlEnterCriticalSection(&DllLock
);
3282 Ret
= AddConsoleCtrlHandler(HandlerRoutine
);
3286 Ret
= RemoveConsoleCtrlHandler(HandlerRoutine
);
3289 RtlLeaveCriticalSection(&DllLock
);
3294 /*--------------------------------------------------------------
3295 * GenerateConsoleCtrlEvent
3301 GenerateConsoleCtrlEvent(DWORD dwCtrlEvent
,
3302 DWORD dwProcessGroupId
)
3304 CSR_API_MESSAGE Request
;
3308 if (dwCtrlEvent
!= CTRL_C_EVENT
&& dwCtrlEvent
!= CTRL_BREAK_EVENT
)
3310 SetLastError(ERROR_INVALID_PARAMETER
);
3314 CsrRequest
= MAKE_CSR_API(GENERATE_CTRL_EVENT
, CSR_CONSOLE
);
3315 Request
.Data
.GenerateCtrlEvent
.Event
= dwCtrlEvent
;
3316 Request
.Data
.GenerateCtrlEvent
.ProcessGroup
= dwProcessGroupId
;
3318 Status
= CsrClientCallServer(&Request
,
3321 sizeof(CSR_API_MESSAGE
));
3322 if(!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= Request
.Status
)))
3324 SetLastErrorByStatus(Status
);
3332 /*--------------------------------------------------------------
3339 GetConsoleTitleW(LPWSTR lpConsoleTitle
,
3342 PCSR_API_MESSAGE Request
;
3346 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
3348 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_TITLE
) + CSRSS_MAX_TITLE_LENGTH
* sizeof(WCHAR
));
3349 if (Request
== NULL
)
3351 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3355 CsrRequest
= MAKE_CSR_API(GET_TITLE
, CSR_CONSOLE
);
3357 Status
= CsrClientCallServer(Request
,
3360 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_TITLE
) + CSRSS_MAX_TITLE_LENGTH
* sizeof(WCHAR
));
3361 if (!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= Request
->Status
)))
3363 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3364 SetLastErrorByStatus(Status
);
3368 if (nSize
* sizeof(WCHAR
) <= Request
->Data
.GetTitleRequest
.Length
)
3374 nSize
= Request
->Data
.GetTitleRequest
.Length
/ sizeof (WCHAR
);
3376 memcpy(lpConsoleTitle
, Request
->Data
.GetTitleRequest
.Title
, nSize
* sizeof(WCHAR
));
3377 lpConsoleTitle
[nSize
] = L
'\0';
3379 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3385 /*--------------------------------------------------------------
3394 GetConsoleTitleA(LPSTR lpConsoleTitle
,
3397 WCHAR WideTitle
[CSRSS_MAX_TITLE_LENGTH
+ 1];
3398 DWORD nWideTitle
= CSRSS_MAX_TITLE_LENGTH
+ 1;
3401 if (!lpConsoleTitle
|| !nSize
) return 0;
3402 nWideTitle
= GetConsoleTitleW((LPWSTR
) WideTitle
, nWideTitle
);
3403 if (!nWideTitle
) return 0;
3405 if ((nWritten
= WideCharToMultiByte(CP_ACP
, // ANSI code page
3406 0, // performance and mapping flags
3407 (LPWSTR
) WideTitle
, // address of wide-character string
3408 nWideTitle
, // number of characters in string
3409 lpConsoleTitle
, // address of buffer for new string
3410 nSize
- 1, // size of buffer
3414 lpConsoleTitle
[nWritten
] = '\0';
3422 /*--------------------------------------------------------------
3429 SetConsoleTitleW(LPCWSTR lpConsoleTitle
)
3431 PCSR_API_MESSAGE Request
;
3436 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
3437 max(sizeof(CSR_API_MESSAGE
),
3438 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) +
3439 min(wcslen(lpConsoleTitle
), CSRSS_MAX_TITLE_LENGTH
) * sizeof(WCHAR
)));
3440 if (Request
== NULL
)
3442 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3446 CsrRequest
= MAKE_CSR_API(SET_TITLE
, CSR_CONSOLE
);
3448 for (c
= 0; lpConsoleTitle
[c
] && c
< CSRSS_MAX_TITLE_LENGTH
; c
++)
3449 Request
->Data
.SetTitleRequest
.Title
[c
] = lpConsoleTitle
[c
];
3451 Request
->Data
.SetTitleRequest
.Length
= c
* sizeof(WCHAR
);
3452 Status
= CsrClientCallServer(Request
,
3455 max(sizeof(CSR_API_MESSAGE
),
3456 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) + c
* sizeof(WCHAR
)));
3457 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
3459 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3460 SetLastErrorByStatus(Status
);
3464 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3470 /*--------------------------------------------------------------
3479 SetConsoleTitleA(LPCSTR lpConsoleTitle
)
3481 PCSR_API_MESSAGE Request
;
3486 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
3488 max(sizeof(CSR_API_MESSAGE
),
3489 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) +
3490 min(strlen(lpConsoleTitle
), CSRSS_MAX_TITLE_LENGTH
) * sizeof(WCHAR
)));
3491 if (Request
== NULL
)
3493 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3497 CsrRequest
= MAKE_CSR_API(SET_TITLE
, CSR_CONSOLE
);
3499 for (c
= 0; lpConsoleTitle
[c
] && c
< CSRSS_MAX_TITLE_LENGTH
; c
++)
3500 Request
->Data
.SetTitleRequest
.Title
[c
] = lpConsoleTitle
[c
];
3502 Request
->Data
.SetTitleRequest
.Length
= c
* sizeof(WCHAR
);
3503 Status
= CsrClientCallServer(Request
,
3506 max(sizeof(CSR_API_MESSAGE
),
3507 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) + c
* sizeof(WCHAR
)));
3508 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
3510 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3511 SetLastErrorByStatus(Status
);
3515 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3521 /*--------------------------------------------------------------
3522 * CreateConsoleScreenBuffer
3528 CreateConsoleScreenBuffer(DWORD dwDesiredAccess
,
3530 CONST SECURITY_ATTRIBUTES
*lpSecurityAttributes
,
3532 LPVOID lpScreenBufferData
)
3534 CSR_API_MESSAGE Request
;
3538 if (dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
)
3539 || dwShareMode
& ~(FILE_SHARE_READ
| FILE_SHARE_WRITE
)
3540 || dwFlags
!= CONSOLE_TEXTMODE_BUFFER
)
3542 SetLastError(ERROR_INVALID_PARAMETER
);
3543 return INVALID_HANDLE_VALUE
;
3546 Request
.Data
.CreateScreenBufferRequest
.Access
= dwDesiredAccess
;
3547 Request
.Data
.CreateScreenBufferRequest
.ShareMode
= dwShareMode
;
3548 Request
.Data
.CreateScreenBufferRequest
.Inheritable
=
3549 lpSecurityAttributes
? lpSecurityAttributes
->bInheritHandle
: FALSE
;
3551 CsrRequest
= MAKE_CSR_API(CREATE_SCREEN_BUFFER
, CSR_CONSOLE
);
3552 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3553 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3555 SetLastErrorByStatus(Status
);
3556 return INVALID_HANDLE_VALUE
;
3558 return Request
.Data
.CreateScreenBufferRequest
.OutputHandle
;
3562 /*--------------------------------------------------------------
3571 CSR_API_MESSAGE Request
;
3575 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_CP
, CSR_CONSOLE
);
3576 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3577 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3579 SetLastErrorByStatus (Status
);
3583 return Request
.Data
.GetConsoleCodePage
.CodePage
;
3587 /*--------------------------------------------------------------
3594 SetConsoleCP(UINT wCodePageID
)
3596 CSR_API_MESSAGE Request
;
3600 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_CP
, CSR_CONSOLE
);
3601 Request
.Data
.SetConsoleCodePage
.CodePage
= wCodePageID
;
3603 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3604 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3606 SetLastErrorByStatus(Status
);
3609 return NT_SUCCESS(Status
);
3613 /*--------------------------------------------------------------
3614 * GetConsoleOutputCP
3620 GetConsoleOutputCP(VOID
)
3622 CSR_API_MESSAGE Request
;
3626 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_OUTPUT_CP
, CSR_CONSOLE
);
3627 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3628 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3630 SetLastErrorByStatus (Status
);
3634 return Request
.Data
.GetConsoleOutputCodePage
.CodePage
;
3638 /*--------------------------------------------------------------
3639 * SetConsoleOutputCP
3645 SetConsoleOutputCP(UINT wCodePageID
)
3647 CSR_API_MESSAGE Request
;
3651 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_OUTPUT_CP
, CSR_CONSOLE
);
3652 Request
.Data
.SetConsoleOutputCodePage
.CodePage
= wCodePageID
;
3653 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3654 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3656 SetLastErrorByStatus(Status
);
3659 return NT_SUCCESS(Status
);
3663 /*--------------------------------------------------------------
3664 * GetConsoleProcessList
3670 GetConsoleProcessList(LPDWORD lpdwProcessList
,
3671 DWORD dwProcessCount
)
3673 PCSR_API_MESSAGE Request
;
3678 if (lpdwProcessList
== NULL
|| dwProcessCount
== 0)
3680 SetLastError(ERROR_INVALID_PARAMETER
);
3684 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
3686 max(sizeof(CSR_API_MESSAGE
),
3687 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST
)
3688 + min (dwProcessCount
, CSRSS_MAX_GET_PROCESS_LIST
/ sizeof(DWORD
)) * sizeof(DWORD
)));
3689 if (Request
== NULL
)
3691 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3695 CsrRequest
= MAKE_CSR_API(GET_PROCESS_LIST
, CSR_CONSOLE
);
3696 Request
->Data
.GetProcessListRequest
.nMaxIds
= min (dwProcessCount
, CSRSS_MAX_GET_PROCESS_LIST
/ sizeof(DWORD
));
3698 Status
= CsrClientCallServer(Request
,
3701 max(sizeof(CSR_API_MESSAGE
),
3702 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST
)
3703 + Request
->Data
.GetProcessListRequest
.nMaxIds
* sizeof(DWORD
)));
3704 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
3706 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3707 SetLastErrorByStatus (Status
);
3712 nProcesses
= Request
->Data
.GetProcessListRequest
.nProcessIdsCopied
;
3713 if (dwProcessCount
>= nProcesses
)
3715 memcpy(lpdwProcessList
, Request
->Data
.GetProcessListRequest
.ProcessId
, nProcesses
* sizeof(DWORD
));
3719 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3726 /*--------------------------------------------------------------
3727 * GetConsoleSelectionInfo
3733 GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo
)
3735 DPRINT1("GetConsoleSelectionInfo(0x%x) UNIMPLEMENTED!\n", lpConsoleSelectionInfo
);
3736 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3742 /*--------------------------------------------------------------
3749 AttachConsole(DWORD dwProcessId
)
3751 DPRINT1("AttachConsole(0x%x) UNIMPLEMENTED!\n", dwProcessId
);
3752 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3756 /*--------------------------------------------------------------
3763 GetConsoleWindow(VOID
)
3765 CSR_API_MESSAGE Request
;
3769 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_WINDOW
, CSR_CONSOLE
);
3770 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3771 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3773 SetLastErrorByStatus(Status
);
3777 return Request
.Data
.GetConsoleWindowRequest
.WindowHandle
;
3781 /*--------------------------------------------------------------
3788 SetConsoleIcon(HICON hicon
)
3790 CSR_API_MESSAGE Request
;
3794 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_ICON
, CSR_CONSOLE
);
3795 Request
.Data
.SetConsoleIconRequest
.WindowIcon
= hicon
;
3797 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3798 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3800 SetLastErrorByStatus(Status
);
3804 return NT_SUCCESS(Status
);
3808 /******************************************************************************
3809 * \name SetConsoleInputExeNameW
3810 * \brief Sets the console input file name from a unicode string.
3811 * \param lpInputExeName Pointer to a unicode string with the name.
3812 * \return TRUE if successful, FALSE if unsuccsedful.
3813 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
3814 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
3818 SetConsoleInputExeNameW(LPCWSTR lpInputExeName
)
3823 || (lenName
= lstrlenW(lpInputExeName
)) == 0
3824 || lenName
> INPUTEXENAME_BUFLEN
- 1)
3826 /* Fail if string is empty or too long */
3827 SetLastError(ERROR_INVALID_PARAMETER
);
3831 RtlEnterCriticalSection(&ConsoleLock
);
3834 RtlCopyMemory(InputExeName
, lpInputExeName
, lenName
* sizeof(WCHAR
));
3835 InputExeName
[lenName
] = L
'\0';
3839 RtlLeaveCriticalSection(&ConsoleLock
);
3847 /******************************************************************************
3848 * \name SetConsoleInputExeNameA
3849 * \brief Sets the console input file name from an ansi string.
3850 * \param lpInputExeName Pointer to an ansi string with the name.
3851 * \return TRUE if successful, FALSE if unsuccsedful.
3852 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
3853 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
3857 SetConsoleInputExeNameA(LPCSTR lpInputExeName
)
3859 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
3860 ANSI_STRING InputExeNameA
;
3861 UNICODE_STRING InputExeNameU
;
3865 RtlInitAnsiString(&InputExeNameA
, lpInputExeName
);
3867 if(InputExeNameA
.Length
== 0 ||
3868 InputExeNameA
.Length
> INPUTEXENAME_BUFLEN
- 1)
3870 /* Fail if string is empty or too long */
3871 SetLastError(ERROR_INVALID_PARAMETER
);
3875 InputExeNameU
.Buffer
= Buffer
;
3876 InputExeNameU
.MaximumLength
= sizeof(Buffer
);
3877 InputExeNameU
.Length
= 0;
3878 Status
= RtlAnsiStringToUnicodeString(&InputExeNameU
, &InputExeNameA
, FALSE
);
3879 if(NT_SUCCESS(Status
))
3881 Ret
= SetConsoleInputExeNameW(InputExeNameU
.Buffer
);
3885 SetLastErrorByStatus(Status
);
3893 /******************************************************************************
3894 * \name GetConsoleInputExeNameW
3895 * \brief Retrieves the console input file name as unicode string.
3896 * \param nBufferLength Length of the buffer in WCHARs.
3897 * Specify 0 to recieve the needed buffer length.
3898 * \param lpBuffer Pointer to a buffer that recieves the string.
3899 * \return Needed buffer size if \p nBufferLength is 0.
3900 * Otherwise 1 if successful, 2 if buffer is too small.
3901 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
3902 * is not big enough.
3906 GetConsoleInputExeNameW(DWORD nBufferLength
, LPWSTR lpBuffer
)
3908 int lenName
= lstrlenW(InputExeName
);
3910 if (nBufferLength
== 0)
3912 /* Buffer size is requested, return it */
3916 if(lenName
+ 1 > nBufferLength
)
3918 /* Buffer is not large enough! */
3919 SetLastError(ERROR_BUFFER_OVERFLOW
);
3923 RtlEnterCriticalSection(&ConsoleLock
);
3926 RtlCopyMemory(lpBuffer
, InputExeName
, lenName
* sizeof(WCHAR
));
3927 lpBuffer
[lenName
] = '\0';
3931 RtlLeaveCriticalSection(&ConsoleLock
);
3935 /* Success, return 1 */
3940 /******************************************************************************
3941 * \name GetConsoleInputExeNameA
3942 * \brief Retrieves the console input file name as ansi string.
3943 * \param nBufferLength Length of the buffer in CHARs.
3944 * \param lpBuffer Pointer to a buffer that recieves the string.
3945 * \return 1 if successful, 2 if buffer is too small.
3946 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
3947 * is not big enough. The buffer recieves as much characters as fit.
3951 GetConsoleInputExeNameA(DWORD nBufferLength
, LPSTR lpBuffer
)
3953 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
3955 UNICODE_STRING BufferU
;
3956 ANSI_STRING BufferA
;
3958 /* Get the unicode name */
3959 Ret
= GetConsoleInputExeNameW(sizeof(Buffer
) / sizeof(Buffer
[0]), Buffer
);
3961 /* Initialize strings for conversion */
3962 RtlInitUnicodeString(&BufferU
, Buffer
);
3964 BufferA
.MaximumLength
= nBufferLength
;
3965 BufferA
.Buffer
= lpBuffer
;
3967 /* Convert unicode name to ansi, copying as much chars as fit */
3968 RtlUnicodeStringToAnsiString(&BufferA
, &BufferU
, FALSE
);
3970 /* Error handling */
3971 if(nBufferLength
<= BufferU
.Length
/ sizeof(WCHAR
))
3973 SetLastError(ERROR_BUFFER_OVERFLOW
);
3981 /*--------------------------------------------------------------
3982 * GetConsoleHistoryInfo
3988 GetConsoleHistoryInfo(PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo
)
3990 DPRINT1("GetConsoleHistoryInfo(0x%p) UNIMPLEMENTED!\n", lpConsoleHistoryInfo
);
3991 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3996 /*--------------------------------------------------------------
3997 * SetConsoleHistoryInfo
4003 SetConsoleHistoryInfo(IN PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo
)
4005 DPRINT1("SetConsoleHistoryInfo(0x%p) UNIMPLEMENTED!\n", lpConsoleHistoryInfo
);
4006 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4011 /*--------------------------------------------------------------
4012 * GetConsoleOriginalTitleW
4018 GetConsoleOriginalTitleW(OUT LPWSTR lpConsoleTitle
,
4021 DPRINT1("GetConsoleOriginalTitleW(0x%p, 0x%x) UNIMPLEMENTED!\n", lpConsoleTitle
, nSize
);
4022 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4027 /*--------------------------------------------------------------
4028 * GetConsoleOriginalTitleA
4034 GetConsoleOriginalTitleA(OUT LPSTR lpConsoleTitle
,
4037 DPRINT1("GetConsoleOriginalTitleA(0x%p, 0x%x) UNIMPLEMENTED!\n", lpConsoleTitle
, nSize
);
4038 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4043 /*--------------------------------------------------------------
4044 * GetConsoleScreenBufferInfoEx
4050 GetConsoleScreenBufferInfoEx(IN HANDLE hConsoleOutput
,
4051 OUT PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx
)
4053 DPRINT1("GetConsoleScreenBufferInfoEx(0x%p, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput
, lpConsoleScreenBufferInfoEx
);
4054 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4059 /*--------------------------------------------------------------
4060 * SetConsoleScreenBufferInfoEx
4066 SetConsoleScreenBufferInfoEx(IN HANDLE hConsoleOutput
,
4067 IN PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx
)
4069 DPRINT1("SetConsoleScreenBufferInfoEx(0x%p, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput
, lpConsoleScreenBufferInfoEx
);
4070 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4075 /*--------------------------------------------------------------
4076 * GetCurrentConsoleFontEx
4082 GetCurrentConsoleFontEx(IN HANDLE hConsoleOutput
,
4083 IN BOOL bMaximumWindow
,
4084 OUT PCONSOLE_FONT_INFOEX lpConsoleCurrentFontEx
)
4086 DPRINT1("GetCurrentConsoleFontEx(0x%p, 0x%x, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput
, bMaximumWindow
, lpConsoleCurrentFontEx
);
4087 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);