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 if (!hConsoleOutput
)
2897 SetLastError(ERROR_INVALID_HANDLE
);
2899 SetLastError(ERROR_INVALID_ACCESS
);
2904 CsrRequest
= MAKE_CSR_API(GET_CURSOR_INFO
, CSR_CONSOLE
);
2905 Request
.Data
.GetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
2907 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
2909 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2911 SetLastErrorByStatus(Status
);
2914 *lpConsoleCursorInfo
= Request
.Data
.GetCursorInfoRequest
.Info
;
2920 /*--------------------------------------------------------------
2921 * GetNumberOfConsoleMouseButtons
2927 GetNumberOfConsoleMouseButtons(LPDWORD lpNumberOfMouseButtons
)
2929 DPRINT1("GetNumberOfConsoleMouseButtons(0x%x) UNIMPLEMENTED!\n", lpNumberOfMouseButtons
);
2930 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2935 /*--------------------------------------------------------------
2942 SetConsoleMode(HANDLE hConsoleHandle
,
2945 CSR_API_MESSAGE Request
;
2949 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_MODE
, CSR_CONSOLE
);
2950 Request
.Data
.SetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
2951 Request
.Data
.SetConsoleModeRequest
.Mode
= dwMode
;
2953 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
2954 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2956 SetLastErrorByStatus ( Status
);
2964 /*--------------------------------------------------------------
2965 * SetConsoleActiveScreenBuffer
2971 SetConsoleActiveScreenBuffer(HANDLE hConsoleOutput
)
2973 CSR_API_MESSAGE Request
;
2977 CsrRequest
= MAKE_CSR_API(SET_SCREEN_BUFFER
, CSR_CONSOLE
);
2978 Request
.Data
.SetScreenBufferRequest
.OutputHandle
= hConsoleOutput
;
2980 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
2981 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2983 SetLastErrorByStatus(Status
);
2991 /*--------------------------------------------------------------
2992 * FlushConsoleInputBuffer
2998 FlushConsoleInputBuffer(HANDLE hConsoleInput
)
3000 CSR_API_MESSAGE Request
;
3004 CsrRequest
= MAKE_CSR_API(FLUSH_INPUT_BUFFER
, CSR_CONSOLE
);
3005 Request
.Data
.FlushInputBufferRequest
.ConsoleInput
= hConsoleInput
;
3007 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3008 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3010 SetLastErrorByStatus(Status
);
3018 /*--------------------------------------------------------------
3019 * SetConsoleScreenBufferSize
3025 SetConsoleScreenBufferSize(HANDLE hConsoleOutput
,
3028 DPRINT1("SetConsoleScreenBufferSize(0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, dwSize
);
3029 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3033 /*--------------------------------------------------------------
3034 * SetConsoleCursorInfo
3040 SetConsoleCursorInfo(HANDLE hConsoleOutput
,
3041 CONST CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
)
3043 CSR_API_MESSAGE Request
;
3047 CsrRequest
= MAKE_CSR_API(SET_CURSOR_INFO
, CSR_CONSOLE
);
3048 Request
.Data
.SetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
3049 Request
.Data
.SetCursorInfoRequest
.Info
= *lpConsoleCursorInfo
;
3051 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3052 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3054 SetLastErrorByStatus(Status
);
3064 IntScrollConsoleScreenBuffer(HANDLE hConsoleOutput
,
3065 const SMALL_RECT
*lpScrollRectangle
,
3066 const SMALL_RECT
*lpClipRectangle
,
3067 COORD dwDestinationOrigin
,
3068 const CHAR_INFO
*lpFill
,
3071 CSR_API_MESSAGE Request
;
3075 CsrRequest
= MAKE_CSR_API(SCROLL_CONSOLE_SCREEN_BUFFER
, CSR_CONSOLE
);
3076 Request
.Data
.ScrollConsoleScreenBufferRequest
.ConsoleHandle
= hConsoleOutput
;
3077 Request
.Data
.ScrollConsoleScreenBufferRequest
.Unicode
= bUnicode
;
3078 Request
.Data
.ScrollConsoleScreenBufferRequest
.ScrollRectangle
= *lpScrollRectangle
;
3080 if (lpClipRectangle
!= NULL
)
3082 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= TRUE
;
3083 Request
.Data
.ScrollConsoleScreenBufferRequest
.ClipRectangle
= *lpClipRectangle
;
3087 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= FALSE
;
3090 Request
.Data
.ScrollConsoleScreenBufferRequest
.DestinationOrigin
= dwDestinationOrigin
;
3091 Request
.Data
.ScrollConsoleScreenBufferRequest
.Fill
= *lpFill
;
3093 Status
= CsrClientCallServer(&Request
,
3096 sizeof(CSR_API_MESSAGE
));
3098 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3100 SetLastErrorByStatus(Status
);
3108 /*--------------------------------------------------------------
3109 * ScrollConsoleScreenBufferA
3115 ScrollConsoleScreenBufferA(HANDLE hConsoleOutput
,
3116 CONST SMALL_RECT
*lpScrollRectangle
,
3117 CONST SMALL_RECT
*lpClipRectangle
,
3118 COORD dwDestinationOrigin
,
3119 CONST CHAR_INFO
*lpFill
)
3121 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
3122 (PSMALL_RECT
)lpScrollRectangle
,
3123 (PSMALL_RECT
)lpClipRectangle
,
3124 dwDestinationOrigin
,
3130 /*--------------------------------------------------------------
3131 * ScrollConsoleScreenBufferW
3137 ScrollConsoleScreenBufferW(HANDLE hConsoleOutput
,
3138 CONST SMALL_RECT
*lpScrollRectangle
,
3139 CONST SMALL_RECT
*lpClipRectangle
,
3140 COORD dwDestinationOrigin
,
3141 CONST CHAR_INFO
*lpFill
)
3143 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
3146 dwDestinationOrigin
,
3152 /*--------------------------------------------------------------
3153 * SetConsoleWindowInfo
3159 SetConsoleWindowInfo(HANDLE hConsoleOutput
,
3161 CONST SMALL_RECT
*lpConsoleWindow
)
3163 DPRINT1("SetConsoleWindowInfo(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bAbsolute
, lpConsoleWindow
);
3164 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3169 /*--------------------------------------------------------------
3170 * SetConsoleTextAttribute
3176 SetConsoleTextAttribute(HANDLE hConsoleOutput
,
3179 CSR_API_MESSAGE Request
;
3183 CsrRequest
= MAKE_CSR_API(SET_ATTRIB
, CSR_CONSOLE
);
3184 Request
.Data
.SetAttribRequest
.ConsoleHandle
= hConsoleOutput
;
3185 Request
.Data
.SetAttribRequest
.Attrib
= wAttributes
;
3187 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3188 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3190 SetLastErrorByStatus(Status
);
3200 AddConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
3202 if (HandlerRoutine
== NULL
)
3204 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= TRUE
;
3210 if (CtrlHandlers
== NULL
)
3212 CtrlHandlers
= RtlAllocateHeap(RtlGetProcessHeap(),
3214 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
3218 CtrlHandlers
= RtlReAllocateHeap(RtlGetProcessHeap(),
3220 (PVOID
)CtrlHandlers
,
3221 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
3224 if (CtrlHandlers
== NULL
)
3227 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3231 CtrlHandlers
[NrCtrlHandlers
- 1] = HandlerRoutine
;
3239 RemoveConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
3243 if (HandlerRoutine
== NULL
)
3245 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= FALSE
;
3250 for (i
= 0; i
< NrCtrlHandlers
; i
++)
3252 if ( ((void*)(CtrlHandlers
[i
])) == (void*)HandlerRoutine
)
3255 memmove(CtrlHandlers
+ i
,
3256 CtrlHandlers
+ i
+ 1,
3257 (NrCtrlHandlers
- i
) * sizeof(PHANDLER_ROUTINE
));
3259 CtrlHandlers
= RtlReAllocateHeap(RtlGetProcessHeap(),
3261 (PVOID
)CtrlHandlers
,
3262 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
3268 SetLastError(ERROR_INVALID_PARAMETER
);
3278 SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
,
3283 RtlEnterCriticalSection(&DllLock
);
3286 Ret
= AddConsoleCtrlHandler(HandlerRoutine
);
3290 Ret
= RemoveConsoleCtrlHandler(HandlerRoutine
);
3293 RtlLeaveCriticalSection(&DllLock
);
3298 /*--------------------------------------------------------------
3299 * GenerateConsoleCtrlEvent
3305 GenerateConsoleCtrlEvent(DWORD dwCtrlEvent
,
3306 DWORD dwProcessGroupId
)
3308 CSR_API_MESSAGE Request
;
3312 if (dwCtrlEvent
!= CTRL_C_EVENT
&& dwCtrlEvent
!= CTRL_BREAK_EVENT
)
3314 SetLastError(ERROR_INVALID_PARAMETER
);
3318 CsrRequest
= MAKE_CSR_API(GENERATE_CTRL_EVENT
, CSR_CONSOLE
);
3319 Request
.Data
.GenerateCtrlEvent
.Event
= dwCtrlEvent
;
3320 Request
.Data
.GenerateCtrlEvent
.ProcessGroup
= dwProcessGroupId
;
3322 Status
= CsrClientCallServer(&Request
,
3325 sizeof(CSR_API_MESSAGE
));
3326 if(!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= Request
.Status
)))
3328 SetLastErrorByStatus(Status
);
3336 /*--------------------------------------------------------------
3343 GetConsoleTitleW(LPWSTR lpConsoleTitle
,
3346 PCSR_API_MESSAGE Request
;
3350 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
3352 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_TITLE
) + CSRSS_MAX_TITLE_LENGTH
* sizeof(WCHAR
));
3353 if (Request
== NULL
)
3355 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3359 CsrRequest
= MAKE_CSR_API(GET_TITLE
, CSR_CONSOLE
);
3361 Status
= CsrClientCallServer(Request
,
3364 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_TITLE
) + CSRSS_MAX_TITLE_LENGTH
* sizeof(WCHAR
));
3365 if (!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= Request
->Status
)))
3367 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3368 SetLastErrorByStatus(Status
);
3372 if (nSize
* sizeof(WCHAR
) <= Request
->Data
.GetTitleRequest
.Length
)
3378 nSize
= Request
->Data
.GetTitleRequest
.Length
/ sizeof (WCHAR
);
3380 memcpy(lpConsoleTitle
, Request
->Data
.GetTitleRequest
.Title
, nSize
* sizeof(WCHAR
));
3381 lpConsoleTitle
[nSize
] = L
'\0';
3383 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3389 /*--------------------------------------------------------------
3398 GetConsoleTitleA(LPSTR lpConsoleTitle
,
3401 WCHAR WideTitle
[CSRSS_MAX_TITLE_LENGTH
+ 1];
3402 DWORD nWideTitle
= CSRSS_MAX_TITLE_LENGTH
+ 1;
3405 if (!lpConsoleTitle
|| !nSize
) return 0;
3406 nWideTitle
= GetConsoleTitleW((LPWSTR
) WideTitle
, nWideTitle
);
3407 if (!nWideTitle
) return 0;
3409 if ((nWritten
= WideCharToMultiByte(CP_ACP
, // ANSI code page
3410 0, // performance and mapping flags
3411 (LPWSTR
) WideTitle
, // address of wide-character string
3412 nWideTitle
, // number of characters in string
3413 lpConsoleTitle
, // address of buffer for new string
3414 nSize
- 1, // size of buffer
3418 lpConsoleTitle
[nWritten
] = '\0';
3426 /*--------------------------------------------------------------
3433 SetConsoleTitleW(LPCWSTR lpConsoleTitle
)
3435 PCSR_API_MESSAGE Request
;
3440 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
3441 max(sizeof(CSR_API_MESSAGE
),
3442 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) +
3443 min(wcslen(lpConsoleTitle
), CSRSS_MAX_TITLE_LENGTH
) * sizeof(WCHAR
)));
3444 if (Request
== NULL
)
3446 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3450 CsrRequest
= MAKE_CSR_API(SET_TITLE
, CSR_CONSOLE
);
3452 for (c
= 0; lpConsoleTitle
[c
] && c
< CSRSS_MAX_TITLE_LENGTH
; c
++)
3453 Request
->Data
.SetTitleRequest
.Title
[c
] = lpConsoleTitle
[c
];
3455 Request
->Data
.SetTitleRequest
.Length
= c
* sizeof(WCHAR
);
3456 Status
= CsrClientCallServer(Request
,
3459 max(sizeof(CSR_API_MESSAGE
),
3460 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) + c
* sizeof(WCHAR
)));
3461 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
3463 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3464 SetLastErrorByStatus(Status
);
3468 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3474 /*--------------------------------------------------------------
3483 SetConsoleTitleA(LPCSTR lpConsoleTitle
)
3485 PCSR_API_MESSAGE Request
;
3490 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
3492 max(sizeof(CSR_API_MESSAGE
),
3493 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) +
3494 min(strlen(lpConsoleTitle
), CSRSS_MAX_TITLE_LENGTH
) * sizeof(WCHAR
)));
3495 if (Request
== NULL
)
3497 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3501 CsrRequest
= MAKE_CSR_API(SET_TITLE
, CSR_CONSOLE
);
3503 for (c
= 0; lpConsoleTitle
[c
] && c
< CSRSS_MAX_TITLE_LENGTH
; c
++)
3504 Request
->Data
.SetTitleRequest
.Title
[c
] = lpConsoleTitle
[c
];
3506 Request
->Data
.SetTitleRequest
.Length
= c
* sizeof(WCHAR
);
3507 Status
= CsrClientCallServer(Request
,
3510 max(sizeof(CSR_API_MESSAGE
),
3511 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) + c
* sizeof(WCHAR
)));
3512 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
3514 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3515 SetLastErrorByStatus(Status
);
3519 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3525 /*--------------------------------------------------------------
3526 * CreateConsoleScreenBuffer
3532 CreateConsoleScreenBuffer(DWORD dwDesiredAccess
,
3534 CONST SECURITY_ATTRIBUTES
*lpSecurityAttributes
,
3536 LPVOID lpScreenBufferData
)
3538 CSR_API_MESSAGE Request
;
3542 if (dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
)
3543 || dwShareMode
& ~(FILE_SHARE_READ
| FILE_SHARE_WRITE
)
3544 || dwFlags
!= CONSOLE_TEXTMODE_BUFFER
)
3546 SetLastError(ERROR_INVALID_PARAMETER
);
3547 return INVALID_HANDLE_VALUE
;
3550 Request
.Data
.CreateScreenBufferRequest
.Access
= dwDesiredAccess
;
3551 Request
.Data
.CreateScreenBufferRequest
.ShareMode
= dwShareMode
;
3552 Request
.Data
.CreateScreenBufferRequest
.Inheritable
=
3553 lpSecurityAttributes
? lpSecurityAttributes
->bInheritHandle
: FALSE
;
3555 CsrRequest
= MAKE_CSR_API(CREATE_SCREEN_BUFFER
, CSR_CONSOLE
);
3556 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3557 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3559 SetLastErrorByStatus(Status
);
3560 return INVALID_HANDLE_VALUE
;
3562 return Request
.Data
.CreateScreenBufferRequest
.OutputHandle
;
3566 /*--------------------------------------------------------------
3575 CSR_API_MESSAGE Request
;
3579 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_CP
, CSR_CONSOLE
);
3580 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3581 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3583 SetLastErrorByStatus (Status
);
3587 return Request
.Data
.GetConsoleCodePage
.CodePage
;
3591 /*--------------------------------------------------------------
3598 SetConsoleCP(UINT wCodePageID
)
3600 CSR_API_MESSAGE Request
;
3604 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_CP
, CSR_CONSOLE
);
3605 Request
.Data
.SetConsoleCodePage
.CodePage
= wCodePageID
;
3607 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3608 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3610 SetLastErrorByStatus(Status
);
3613 return NT_SUCCESS(Status
);
3617 /*--------------------------------------------------------------
3618 * GetConsoleOutputCP
3624 GetConsoleOutputCP(VOID
)
3626 CSR_API_MESSAGE Request
;
3630 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_OUTPUT_CP
, CSR_CONSOLE
);
3631 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3632 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3634 SetLastErrorByStatus (Status
);
3638 return Request
.Data
.GetConsoleOutputCodePage
.CodePage
;
3642 /*--------------------------------------------------------------
3643 * SetConsoleOutputCP
3649 SetConsoleOutputCP(UINT wCodePageID
)
3651 CSR_API_MESSAGE Request
;
3655 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_OUTPUT_CP
, CSR_CONSOLE
);
3656 Request
.Data
.SetConsoleOutputCodePage
.CodePage
= wCodePageID
;
3657 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3658 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3660 SetLastErrorByStatus(Status
);
3663 return NT_SUCCESS(Status
);
3667 /*--------------------------------------------------------------
3668 * GetConsoleProcessList
3674 GetConsoleProcessList(LPDWORD lpdwProcessList
,
3675 DWORD dwProcessCount
)
3677 PCSR_API_MESSAGE Request
;
3682 if (lpdwProcessList
== NULL
|| dwProcessCount
== 0)
3684 SetLastError(ERROR_INVALID_PARAMETER
);
3688 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
3690 max(sizeof(CSR_API_MESSAGE
),
3691 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST
)
3692 + min (dwProcessCount
, CSRSS_MAX_GET_PROCESS_LIST
/ sizeof(DWORD
)) * sizeof(DWORD
)));
3693 if (Request
== NULL
)
3695 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3699 CsrRequest
= MAKE_CSR_API(GET_PROCESS_LIST
, CSR_CONSOLE
);
3700 Request
->Data
.GetProcessListRequest
.nMaxIds
= min (dwProcessCount
, CSRSS_MAX_GET_PROCESS_LIST
/ sizeof(DWORD
));
3702 Status
= CsrClientCallServer(Request
,
3705 max(sizeof(CSR_API_MESSAGE
),
3706 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST
)
3707 + Request
->Data
.GetProcessListRequest
.nMaxIds
* sizeof(DWORD
)));
3708 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
3710 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3711 SetLastErrorByStatus (Status
);
3716 nProcesses
= Request
->Data
.GetProcessListRequest
.nProcessIdsCopied
;
3717 if (dwProcessCount
>= nProcesses
)
3719 memcpy(lpdwProcessList
, Request
->Data
.GetProcessListRequest
.ProcessId
, nProcesses
* sizeof(DWORD
));
3723 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3730 /*--------------------------------------------------------------
3731 * GetConsoleSelectionInfo
3737 GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo
)
3739 DPRINT1("GetConsoleSelectionInfo(0x%x) UNIMPLEMENTED!\n", lpConsoleSelectionInfo
);
3740 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3746 /*--------------------------------------------------------------
3753 AttachConsole(DWORD dwProcessId
)
3755 DPRINT1("AttachConsole(0x%x) UNIMPLEMENTED!\n", dwProcessId
);
3759 /*--------------------------------------------------------------
3766 GetConsoleWindow(VOID
)
3768 CSR_API_MESSAGE Request
;
3772 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_WINDOW
, CSR_CONSOLE
);
3773 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3774 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3776 SetLastErrorByStatus(Status
);
3780 return Request
.Data
.GetConsoleWindowRequest
.WindowHandle
;
3784 /*--------------------------------------------------------------
3791 SetConsoleIcon(HICON hicon
)
3793 CSR_API_MESSAGE Request
;
3797 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_ICON
, CSR_CONSOLE
);
3798 Request
.Data
.SetConsoleIconRequest
.WindowIcon
= hicon
;
3800 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3801 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3803 SetLastErrorByStatus(Status
);
3807 return NT_SUCCESS(Status
);
3811 /******************************************************************************
3812 * \name SetConsoleInputExeNameW
3813 * \brief Sets the console input file name from a unicode string.
3814 * \param lpInputExeName Pointer to a unicode string with the name.
3815 * \return TRUE if successful, FALSE if unsuccsedful.
3816 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
3817 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
3821 SetConsoleInputExeNameW(LPCWSTR lpInputExeName
)
3826 || (lenName
= lstrlenW(lpInputExeName
)) == 0
3827 || lenName
> INPUTEXENAME_BUFLEN
- 1)
3829 /* Fail if string is empty or too long */
3830 SetLastError(ERROR_INVALID_PARAMETER
);
3834 RtlEnterCriticalSection(&ConsoleLock
);
3837 RtlCopyMemory(InputExeName
, lpInputExeName
, lenName
* sizeof(WCHAR
));
3838 InputExeName
[lenName
] = L
'\0';
3842 RtlLeaveCriticalSection(&ConsoleLock
);
3850 /******************************************************************************
3851 * \name SetConsoleInputExeNameA
3852 * \brief Sets the console input file name from an ansi string.
3853 * \param lpInputExeName Pointer to an ansi string with the name.
3854 * \return TRUE if successful, FALSE if unsuccsedful.
3855 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
3856 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
3860 SetConsoleInputExeNameA(LPCSTR lpInputExeName
)
3862 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
3863 ANSI_STRING InputExeNameA
;
3864 UNICODE_STRING InputExeNameU
;
3868 RtlInitAnsiString(&InputExeNameA
, lpInputExeName
);
3870 if(InputExeNameA
.Length
== 0 ||
3871 InputExeNameA
.Length
> INPUTEXENAME_BUFLEN
- 1)
3873 /* Fail if string is empty or too long */
3874 SetLastError(ERROR_INVALID_PARAMETER
);
3878 InputExeNameU
.Buffer
= Buffer
;
3879 InputExeNameU
.MaximumLength
= sizeof(Buffer
);
3880 InputExeNameU
.Length
= 0;
3881 Status
= RtlAnsiStringToUnicodeString(&InputExeNameU
, &InputExeNameA
, FALSE
);
3882 if(NT_SUCCESS(Status
))
3884 Ret
= SetConsoleInputExeNameW(InputExeNameU
.Buffer
);
3888 SetLastErrorByStatus(Status
);
3896 /******************************************************************************
3897 * \name GetConsoleInputExeNameW
3898 * \brief Retrieves the console input file name as unicode string.
3899 * \param nBufferLength Length of the buffer in WCHARs.
3900 * Specify 0 to recieve the needed buffer length.
3901 * \param lpBuffer Pointer to a buffer that recieves the string.
3902 * \return Needed buffer size if \p nBufferLength is 0.
3903 * Otherwise 1 if successful, 2 if buffer is too small.
3904 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
3905 * is not big enough.
3909 GetConsoleInputExeNameW(DWORD nBufferLength
, LPWSTR lpBuffer
)
3911 int lenName
= lstrlenW(InputExeName
);
3913 if (nBufferLength
== 0)
3915 /* Buffer size is requested, return it */
3919 if(lenName
+ 1 > nBufferLength
)
3921 /* Buffer is not large enough! */
3922 SetLastError(ERROR_BUFFER_OVERFLOW
);
3926 RtlEnterCriticalSection(&ConsoleLock
);
3929 RtlCopyMemory(lpBuffer
, InputExeName
, lenName
* sizeof(WCHAR
));
3930 lpBuffer
[lenName
] = '\0';
3934 RtlLeaveCriticalSection(&ConsoleLock
);
3938 /* Success, return 1 */
3943 /******************************************************************************
3944 * \name GetConsoleInputExeNameA
3945 * \brief Retrieves the console input file name as ansi string.
3946 * \param nBufferLength Length of the buffer in CHARs.
3947 * \param lpBuffer Pointer to a buffer that recieves the string.
3948 * \return 1 if successful, 2 if buffer is too small.
3949 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
3950 * is not big enough. The buffer recieves as much characters as fit.
3954 GetConsoleInputExeNameA(DWORD nBufferLength
, LPSTR lpBuffer
)
3956 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
3958 UNICODE_STRING BufferU
;
3959 ANSI_STRING BufferA
;
3961 /* Get the unicode name */
3962 Ret
= GetConsoleInputExeNameW(sizeof(Buffer
) / sizeof(Buffer
[0]), Buffer
);
3964 /* Initialize strings for conversion */
3965 RtlInitUnicodeString(&BufferU
, Buffer
);
3967 BufferA
.MaximumLength
= nBufferLength
;
3968 BufferA
.Buffer
= lpBuffer
;
3970 /* Convert unicode name to ansi, copying as much chars as fit */
3971 RtlUnicodeStringToAnsiString(&BufferA
, &BufferU
, FALSE
);
3973 /* Error handling */
3974 if(nBufferLength
<= BufferU
.Length
/ sizeof(WCHAR
))
3976 SetLastError(ERROR_BUFFER_OVERFLOW
);
3984 /*--------------------------------------------------------------
3985 * GetConsoleHistoryInfo
3991 GetConsoleHistoryInfo(PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo
)
3993 DPRINT1("GetConsoleHistoryInfo(0x%p) UNIMPLEMENTED!\n", lpConsoleHistoryInfo
);
3994 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3999 /*--------------------------------------------------------------
4000 * SetConsoleHistoryInfo
4006 SetConsoleHistoryInfo(IN PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo
)
4008 DPRINT1("SetConsoleHistoryInfo(0x%p) UNIMPLEMENTED!\n", lpConsoleHistoryInfo
);
4009 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4014 /*--------------------------------------------------------------
4015 * GetConsoleOriginalTitleW
4021 GetConsoleOriginalTitleW(OUT LPWSTR lpConsoleTitle
,
4024 DPRINT1("GetConsoleOriginalTitleW(0x%p, 0x%x) UNIMPLEMENTED!\n", lpConsoleTitle
, nSize
);
4025 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4030 /*--------------------------------------------------------------
4031 * GetConsoleOriginalTitleA
4037 GetConsoleOriginalTitleA(OUT LPSTR lpConsoleTitle
,
4040 DPRINT1("GetConsoleOriginalTitleA(0x%p, 0x%x) UNIMPLEMENTED!\n", lpConsoleTitle
, nSize
);
4041 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4046 /*--------------------------------------------------------------
4047 * GetConsoleScreenBufferInfoEx
4053 GetConsoleScreenBufferInfoEx(IN HANDLE hConsoleOutput
,
4054 OUT PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx
)
4056 DPRINT1("GetConsoleScreenBufferInfoEx(0x%p, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput
, lpConsoleScreenBufferInfoEx
);
4057 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4062 /*--------------------------------------------------------------
4063 * SetConsoleScreenBufferInfoEx
4069 SetConsoleScreenBufferInfoEx(IN HANDLE hConsoleOutput
,
4070 IN PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx
)
4072 DPRINT1("SetConsoleScreenBufferInfoEx(0x%p, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput
, lpConsoleScreenBufferInfoEx
);
4073 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4078 /*--------------------------------------------------------------
4079 * GetCurrentConsoleFontEx
4085 GetCurrentConsoleFontEx(IN HANDLE hConsoleOutput
,
4086 IN BOOL bMaximumWindow
,
4087 OUT PCONSOLE_FONT_INFOEX lpConsoleCurrentFontEx
)
4089 DPRINT1("GetCurrentConsoleFontEx(0x%p, 0x%x, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput
, bMaximumWindow
, lpConsoleCurrentFontEx
);
4090 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);