3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: dll/win32/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 RTL_CRITICAL_SECTION ConsoleLock
;
23 extern BOOL ConsoleInitialized
;
24 extern BOOL WINAPI
IsDebuggerPresent(VOID
);
26 /* GLOBALS *******************************************************************/
28 PHANDLER_ROUTINE InitialHandler
[1];
29 PHANDLER_ROUTINE
* CtrlHandlers
;
31 ULONG NrAllocatedHandlers
;
33 #define INPUTEXENAME_BUFLEN 256
34 static WCHAR InputExeName
[INPUTEXENAME_BUFLEN
] = L
"";
36 /* Default Console Control Handler *******************************************/
40 DefaultConsoleCtrlHandler(DWORD Event
)
45 DPRINT("Ctrl-C Event\n");
48 case CTRL_BREAK_EVENT
:
49 DPRINT("Ctrl-Break Event\n");
52 case CTRL_SHUTDOWN_EVENT
:
53 DPRINT1("Ctrl Shutdown Event\n");
56 case CTRL_CLOSE_EVENT
:
57 DPRINT("Ctrl Close Event\n");
60 case CTRL_LOGOFF_EVENT
:
61 DPRINT1("Ctrl Logoff Event\n");
65 ExitProcess(CONTROL_C_EXIT
);
72 ConsoleControlDispatcher(DWORD CodeAndFlag
)
75 DWORD nCode
= CodeAndFlag
& MAXLONG
;
77 EXCEPTION_RECORD erException
;
79 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST
);
84 case CTRL_BREAK_EVENT
:
86 if (IsDebuggerPresent())
88 erException
.ExceptionCode
= (nCode
== CTRL_C_EVENT
?
89 DBG_CONTROL_C
: DBG_CONTROL_BREAK
);
90 erException
.ExceptionFlags
= 0;
91 erException
.ExceptionRecord
= NULL
;
92 erException
.ExceptionAddress
= DefaultConsoleCtrlHandler
;
93 erException
.NumberParameters
= 0;
97 RtlRaiseException(&erException
);
99 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
101 RtlEnterCriticalSection(&ConsoleLock
);
103 if ((nCode
!= CTRL_C_EVENT
) ||
104 (NtCurrentPeb()->ProcessParameters
->ConsoleFlags
!= 1))
106 for (i
= NrCtrlHandlers
; i
> 0; i
--)
108 if (CtrlHandlers
[i
- 1](nCode
)) break;
112 RtlLeaveCriticalSection(&ConsoleLock
);
122 case CTRL_CLOSE_EVENT
:
123 case CTRL_LOGOFF_EVENT
:
124 case CTRL_SHUTDOWN_EVENT
:
134 ExitProcess(CONTROL_C_EXIT
);
143 ASSERT(ConsoleInitialized
);
145 RtlEnterCriticalSection(&ConsoleLock
);
147 if ((nCode
!= CTRL_C_EVENT
) || (NtCurrentPeb()->ProcessParameters
->ConsoleFlags
!= 1))
149 for (i
= NrCtrlHandlers
; i
> 0; i
--)
152 (CodeAndFlag
& MINLONG
) &&
153 ((nCode
== CTRL_LOGOFF_EVENT
) || (nCode
== CTRL_SHUTDOWN_EVENT
)))
158 if (CtrlHandlers
[i
- 1](nCode
))
162 case CTRL_CLOSE_EVENT
:
163 case CTRL_LOGOFF_EVENT
:
164 case CTRL_SHUTDOWN_EVENT
:
166 nExitCode
= CodeAndFlag
;
174 RtlLeaveCriticalSection(&ConsoleLock
);
176 ExitThread(nExitCode
);
180 /* FUNCTIONS *****************************************************************/
187 AddConsoleAliasA(LPCSTR lpSource
,
191 LPWSTR lpSourceW
= NULL
;
192 LPWSTR lpTargetW
= NULL
;
193 LPWSTR lpExeNameW
= NULL
;
197 BasepAnsiStringToHeapUnicodeString(lpSource
, (LPWSTR
*) &lpSourceW
);
199 BasepAnsiStringToHeapUnicodeString(lpTarget
, (LPWSTR
*) &lpTargetW
);
201 BasepAnsiStringToHeapUnicodeString(lpExeName
, (LPWSTR
*) &lpExeNameW
);
203 bRetVal
= AddConsoleAliasW(lpSourceW
, lpTargetW
, lpExeNameW
);
207 RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR
*) lpSourceW
);
209 RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR
*) lpTargetW
);
211 RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR
*) lpExeNameW
);
222 AddConsoleAliasW(LPCWSTR lpSource
,
226 PCSR_API_MESSAGE Request
;
230 ULONG TargetLength
= 0;
236 DPRINT("AddConsoleAliasW enterd with lpSource %S lpTarget %S lpExeName %S\n", lpSource
, lpTarget
, lpExeName
);
238 ExeLength
= wcslen(lpExeName
) + 1;
239 SourceLength
= wcslen(lpSource
)+ 1;
241 TargetLength
= wcslen(lpTarget
) + 1;
243 Size
= (ExeLength
+ SourceLength
+ TargetLength
) * sizeof(WCHAR
);
244 RequestLength
= sizeof(CSR_API_MESSAGE
) + Size
;
246 Request
= RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY
, RequestLength
);
247 Ptr
= (WCHAR
*)(((ULONG_PTR
)Request
) + sizeof(CSR_API_MESSAGE
));
249 wcscpy(Ptr
, lpSource
);
250 Request
->Data
.AddConsoleAlias
.SourceLength
= SourceLength
;
251 Ptr
= (WCHAR
*)(((ULONG_PTR
)Request
) + sizeof(CSR_API_MESSAGE
) + SourceLength
* sizeof(WCHAR
));
253 wcscpy(Ptr
, lpExeName
);
254 Request
->Data
.AddConsoleAlias
.ExeLength
= ExeLength
;
255 Ptr
= (WCHAR
*)(((ULONG_PTR
)Request
) + sizeof(CSR_API_MESSAGE
) + (ExeLength
+ SourceLength
)* sizeof(WCHAR
));
257 if (lpTarget
) /* target can be optional */
258 wcscpy(Ptr
, lpTarget
);
260 Request
->Data
.AddConsoleAlias
.TargetLength
= TargetLength
;
262 CsrRequest
= MAKE_CSR_API(ADD_CONSOLE_ALIAS
, CSR_CONSOLE
);
263 Status
= CsrClientCallServer(Request
,
268 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
270 SetLastErrorByStatus(Status
);
271 RtlFreeHeap(GetProcessHeap(), 0, Request
);
275 RtlFreeHeap(GetProcessHeap(), 0, Request
);
281 * @unimplemented (Undocumented)
285 ConsoleMenuControl(HANDLE hConsole
,
289 DPRINT1("ConsoleMenuControl(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsole
, Unknown1
, Unknown2
);
290 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
300 DuplicateConsoleHandle(HANDLE hConsole
,
301 DWORD dwDesiredAccess
,
305 CSR_API_MESSAGE Request
;
309 if (dwOptions
& ~(DUPLICATE_CLOSE_SOURCE
| DUPLICATE_SAME_ACCESS
)
310 || (!(dwOptions
& DUPLICATE_SAME_ACCESS
)
311 && dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
)))
313 SetLastError (ERROR_INVALID_PARAMETER
);
314 return INVALID_HANDLE_VALUE
;
317 CsrRequest
= MAKE_CSR_API(DUPLICATE_HANDLE
, CSR_NATIVE
);
318 Request
.Data
.DuplicateHandleRequest
.Handle
= hConsole
;
319 Request
.Data
.DuplicateHandleRequest
.Access
= dwDesiredAccess
;
320 Request
.Data
.DuplicateHandleRequest
.Inheritable
= bInheritHandle
;
321 Request
.Data
.DuplicateHandleRequest
.Options
= dwOptions
;
323 Status
= CsrClientCallServer(&Request
,
326 sizeof(CSR_API_MESSAGE
));
327 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
=Request
.Status
))
329 SetLastErrorByStatus(Status
);
330 return INVALID_HANDLE_VALUE
;
333 return Request
.Data
.DuplicateHandleRequest
.Handle
;
338 * @unimplemented (Undocumented)
342 ExpungeConsoleCommandHistoryW(DWORD Unknown0
)
344 DPRINT1("ExpungeConsoleCommandHistoryW(0x%x) UNIMPLEMENTED!\n", Unknown0
);
345 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
351 * @unimplemented (Undocumented)
355 ExpungeConsoleCommandHistoryA (DWORD Unknown0
)
357 DPRINT1("ExpungeConsoleCommandHistoryW(0x%x) UNIMPLEMENTED!\n", Unknown0
);
358 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
368 GetConsoleAliasW(LPWSTR lpSource
,
369 LPWSTR lpTargetBuffer
,
370 DWORD TargetBufferLength
,
373 PCSR_API_MESSAGE Request
;
374 PCSR_CAPTURE_BUFFER CaptureBuffer
;
383 DPRINT("GetConsoleAliasW entered lpSource %S lpExeName %S\n", lpSource
, lpExeName
);
385 if (lpTargetBuffer
== NULL
)
387 SetLastError(ERROR_INVALID_PARAMETER
);
391 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_ALIAS
, CSR_CONSOLE
);
393 ExeLength
= wcslen(lpExeName
) + 1;
394 SourceLength
= wcslen(lpSource
) + 1;
396 Size
= (ExeLength
+ SourceLength
) * sizeof(WCHAR
);
398 RequestLength
= Size
+ sizeof(CSR_API_MESSAGE
);
399 Request
= RtlAllocateHeap(GetProcessHeap(), 0, RequestLength
);
402 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
406 CaptureBuffer
= CsrAllocateCaptureBuffer(1, TargetBufferLength
);
409 RtlFreeHeap(GetProcessHeap(), 0, Request
);
410 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
414 Request
->Data
.GetConsoleAlias
.TargetBuffer
= NULL
;
416 CsrCaptureMessageBuffer(CaptureBuffer
,
419 (PVOID
*)&Request
->Data
.GetConsoleAlias
.TargetBuffer
);
421 Request
->Data
.GetConsoleAlias
.TargetBufferLength
= TargetBufferLength
;
423 Ptr
= (LPWSTR
)((ULONG_PTR
)Request
+ sizeof(CSR_API_MESSAGE
));
424 wcscpy(Ptr
, lpSource
);
426 wcscpy(Ptr
, lpExeName
);
428 Request
->Data
.GetConsoleAlias
.ExeLength
= ExeLength
;
429 Request
->Data
.GetConsoleAlias
.SourceLength
= SourceLength
;
431 Status
= CsrClientCallServer(Request
,
434 sizeof(CSR_API_MESSAGE
) + Size
);
436 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
438 RtlFreeHeap(GetProcessHeap(), 0, Request
);
439 CsrFreeCaptureBuffer(CaptureBuffer
);
440 SetLastErrorByStatus(Status
);
444 wcscpy(lpTargetBuffer
, Request
->Data
.GetConsoleAlias
.TargetBuffer
);
445 RtlFreeHeap(GetProcessHeap(), 0, Request
);
446 CsrFreeCaptureBuffer(CaptureBuffer
);
448 return Request
->Data
.GetConsoleAlias
.BytesWritten
;
457 GetConsoleAliasA(LPSTR lpSource
,
458 LPSTR lpTargetBuffer
,
459 DWORD TargetBufferLength
,
464 LPWSTR lpwTargetBuffer
;
469 DPRINT("GetConsoleAliasA entered\n");
471 if (lpTargetBuffer
== NULL
)
473 SetLastError(ERROR_INVALID_PARAMETER
);
477 dwSourceSize
= (strlen(lpSource
)+1) * sizeof(WCHAR
);
478 lpwSource
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwSourceSize
);
479 if (lpwSource
== NULL
)
481 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
484 MultiByteToWideChar(CP_ACP
, 0, lpSource
, -1, lpwSource
, dwSourceSize
);
486 dwExeNameSize
= (strlen(lpExeName
)+1) * sizeof(WCHAR
);
487 lpwExeName
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwExeNameSize
);
488 if (lpwExeName
== NULL
)
490 HeapFree(GetProcessHeap(), 0, lpwSource
);
491 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
494 MultiByteToWideChar(CP_ACP
, 0, lpExeName
, -1, lpwExeName
, dwExeNameSize
);
496 lpwTargetBuffer
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, TargetBufferLength
* sizeof(WCHAR
));
497 if (lpwTargetBuffer
== NULL
)
499 HeapFree(GetProcessHeap(), 0, lpwSource
);
500 HeapFree(GetProcessHeap(), 0, lpwExeName
);
501 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
505 dwResult
= GetConsoleAliasW(lpwSource
, lpwTargetBuffer
, TargetBufferLength
* sizeof(WCHAR
), lpwExeName
);
507 HeapFree(GetProcessHeap(), 0, lpwSource
);
508 HeapFree(GetProcessHeap(), 0, lpwExeName
);
511 dwResult
= WideCharToMultiByte(CP_ACP
, 0, lpwTargetBuffer
, dwResult
/ sizeof(WCHAR
), lpTargetBuffer
, TargetBufferLength
, NULL
, NULL
);
513 HeapFree(GetProcessHeap(), 0, lpwTargetBuffer
);
524 GetConsoleAliasExesW(LPWSTR lpExeNameBuffer
,
525 DWORD ExeNameBufferLength
)
527 CSR_API_MESSAGE Request
;
528 PCSR_CAPTURE_BUFFER CaptureBuffer
;
532 DPRINT("GetConsoleAliasExesW entered\n");
534 CaptureBuffer
= CsrAllocateCaptureBuffer(1, ExeNameBufferLength
);
537 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
541 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_ALIASES_EXES
, CSR_CONSOLE
);
542 CsrAllocateMessagePointer(CaptureBuffer
,
544 (PVOID
*)&Request
.Data
.GetConsoleAliasesExes
.ExeNames
);
545 Request
.Data
.GetConsoleAliasesExes
.Length
= ExeNameBufferLength
;
547 Status
= CsrClientCallServer(&Request
,
550 sizeof(CSR_API_MESSAGE
));
552 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
554 SetLastErrorByStatus(Status
);
555 CsrFreeCaptureBuffer(CaptureBuffer
);
559 memcpy(lpExeNameBuffer
,
560 Request
.Data
.GetConsoleAliasesExes
.ExeNames
,
561 Request
.Data
.GetConsoleAliasesExes
.BytesWritten
);
563 CsrFreeCaptureBuffer(CaptureBuffer
);
564 return Request
.Data
.GetConsoleAliasesExes
.BytesWritten
;
573 GetConsoleAliasExesA(LPSTR lpExeNameBuffer
,
574 DWORD ExeNameBufferLength
)
576 LPWSTR lpwExeNameBuffer
;
579 DPRINT("GetConsoleAliasExesA entered\n");
581 lpwExeNameBuffer
= HeapAlloc(GetProcessHeap(), 0, ExeNameBufferLength
* sizeof(WCHAR
));
583 dwResult
= GetConsoleAliasExesW(lpwExeNameBuffer
, ExeNameBufferLength
* sizeof(WCHAR
));
586 dwResult
= WideCharToMultiByte(CP_ACP
, 0, lpwExeNameBuffer
, dwResult
/ sizeof(WCHAR
), lpExeNameBuffer
, ExeNameBufferLength
, NULL
, NULL
);
588 HeapFree(GetProcessHeap(), 0, lpwExeNameBuffer
);
597 GetConsoleAliasExesLengthW(VOID
)
599 CSR_API_MESSAGE Request
;
603 DPRINT("GetConsoleAliasExesLengthW entered\n");
605 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_ALIASES_EXES_LENGTH
, CSR_CONSOLE
);
606 Request
.Data
.GetConsoleAliasesExesLength
.Length
= 0;
609 Status
= CsrClientCallServer(&Request
,
612 sizeof(CSR_API_MESSAGE
));
614 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
616 SetLastErrorByStatus(Status
);
620 return Request
.Data
.GetConsoleAliasesExesLength
.Length
;
628 GetConsoleAliasExesLengthA(VOID
)
632 DPRINT("GetConsoleAliasExesLengthA entered\n");
634 dwLength
= GetConsoleAliasExesLengthW();
637 dwLength
/= sizeof(WCHAR
);
648 GetConsoleAliasesW(LPWSTR AliasBuffer
,
649 DWORD AliasBufferLength
,
652 CSR_API_MESSAGE Request
;
657 DPRINT("GetConsoleAliasesW entered\n");
659 dwLength
= GetConsoleAliasesLengthW(ExeName
);
660 if (!dwLength
|| dwLength
> AliasBufferLength
)
663 CsrRequest
= MAKE_CSR_API(GET_ALL_CONSOLE_ALIASES
, CSR_CONSOLE
);
664 Request
.Data
.GetAllConsoleAlias
.AliasBuffer
= AliasBuffer
;
665 Request
.Data
.GetAllConsoleAlias
.AliasBufferLength
= AliasBufferLength
;
666 Request
.Data
.GetAllConsoleAlias
.lpExeName
= ExeName
;
668 Status
= CsrClientCallServer(&Request
,
671 sizeof(CSR_API_MESSAGE
));
673 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
675 SetLastErrorByStatus(Status
);
679 return Request
.Data
.GetAllConsoleAlias
.BytesWritten
/ sizeof(WCHAR
);
688 GetConsoleAliasesA(LPSTR AliasBuffer
,
689 DWORD AliasBufferLength
,
693 LPWSTR lpwExeName
= NULL
;
694 LPWSTR lpwAliasBuffer
;
696 DPRINT("GetConsoleAliasesA entered\n");
699 BasepAnsiStringToHeapUnicodeString(ExeName
, (LPWSTR
*) &lpwExeName
);
701 lpwAliasBuffer
= HeapAlloc(GetProcessHeap(), 0, AliasBufferLength
* sizeof(WCHAR
));
703 dwRetVal
= GetConsoleAliasesW(lpwAliasBuffer
, AliasBufferLength
, lpwExeName
);
706 RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR
*) lpwExeName
);
709 dwRetVal
= WideCharToMultiByte(CP_ACP
, 0, lpwAliasBuffer
, dwRetVal
, AliasBuffer
, AliasBufferLength
, NULL
, NULL
);
711 HeapFree(GetProcessHeap(), 0, lpwAliasBuffer
);
721 GetConsoleAliasesLengthW(LPWSTR lpExeName
)
723 CSR_API_MESSAGE Request
;
727 DPRINT("GetConsoleAliasesLengthW entered\n");
729 CsrRequest
= MAKE_CSR_API(GET_ALL_CONSOLE_ALIASES_LENGTH
, CSR_CONSOLE
);
730 Request
.Data
.GetAllConsoleAliasesLength
.lpExeName
= lpExeName
;
731 Request
.Data
.GetAllConsoleAliasesLength
.Length
= 0;
733 Status
= CsrClientCallServer(&Request
,
736 sizeof(CSR_API_MESSAGE
));
738 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
740 SetLastErrorByStatus(Status
);
744 return Request
.Data
.GetAllConsoleAliasesLength
.Length
;
753 GetConsoleAliasesLengthA(LPSTR lpExeName
)
756 LPWSTR lpExeNameW
= NULL
;
759 BasepAnsiStringToHeapUnicodeString(lpExeName
, (LPWSTR
*) &lpExeNameW
);
761 dwRetVal
= GetConsoleAliasesLengthW(lpExeNameW
);
763 dwRetVal
/= sizeof(WCHAR
);
767 RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR
*) lpExeNameW
);
774 * @unimplemented (Undocumented)
778 GetConsoleCommandHistoryW(DWORD Unknown0
,
782 DPRINT1("GetConsoleCommandHistoryW(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
);
783 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
789 * @unimplemented (Undocumented)
793 GetConsoleCommandHistoryA(DWORD Unknown0
,
797 DPRINT1("GetConsoleCommandHistoryA(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
);
798 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
804 * @unimplemented (Undocumented)
808 GetConsoleCommandHistoryLengthW(DWORD Unknown0
)
810 DPRINT1("GetConsoleCommandHistoryLengthW(0x%x) UNIMPLEMENTED!\n", Unknown0
);
811 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
817 * @unimplemented (Undocumented)
821 GetConsoleCommandHistoryLengthA(DWORD Unknown0
)
823 DPRINT1("GetConsoleCommandHistoryLengthA(0x%x) UNIMPLEMENTED!\n", Unknown0
);
824 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
833 GetConsoleDisplayMode(LPDWORD lpdwMode
)
835 * FUNCTION: Get the console display mode
837 * lpdwMode - Address of variable that receives the current value
839 * STATUS: Undocumented
842 DPRINT1("GetConsoleDisplayMode(0x%x) UNIMPLEMENTED!\n", lpdwMode
);
843 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
849 * @unimplemented (Undocumented)
853 GetConsoleFontInfo(DWORD Unknown0
,
858 DPRINT1("GetConsoleFontInfo(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
859 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
869 GetConsoleFontSize(HANDLE hConsoleOutput
,
872 COORD Empty
= {0, 0};
873 DPRINT1("GetConsoleFontSize(0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, nFont
);
874 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
880 * @implemented (Undocumented)
884 GetConsoleHardwareState(HANDLE hConsole
,
888 CSR_API_MESSAGE Request
;
892 CsrRequest
= MAKE_CSR_API(SETGET_CONSOLE_HW_STATE
, CSR_CONSOLE
);
893 Request
.Data
.ConsoleHardwareStateRequest
.ConsoleHandle
= hConsole
;
894 Request
.Data
.ConsoleHardwareStateRequest
.SetGet
= CONSOLE_HARDWARE_STATE_GET
;
896 Status
= CsrClientCallServer(&Request
,
899 sizeof(CSR_API_MESSAGE
));
900 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
902 SetLastErrorByStatus(Status
);
906 *State
= Request
.Data
.ConsoleHardwareStateRequest
.State
;
912 * @implemented (Undocumented)
916 GetConsoleInputWaitHandle(VOID
)
918 CSR_API_MESSAGE Request
;
922 CsrRequest
= MAKE_CSR_API(GET_INPUT_WAIT_HANDLE
, CSR_CONSOLE
);
924 Status
= CsrClientCallServer(&Request
,
927 sizeof(CSR_API_MESSAGE
));
928 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
930 SetLastErrorByStatus(Status
);
934 return Request
.Data
.GetConsoleInputWaitHandle
.InputWaitHandle
;
943 GetCurrentConsoleFont(HANDLE hConsoleOutput
,
945 PCONSOLE_FONT_INFO lpConsoleCurrentFont
)
947 DPRINT1("GetCurrentConsoleFont(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bMaximumWindow
, lpConsoleCurrentFont
);
948 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
954 * @unimplemented (Undocumented)
958 GetNumberOfConsoleFonts(VOID
)
960 DPRINT1("GetNumberOfConsoleFonts() UNIMPLEMENTED!\n");
961 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
962 return 1; /* FIXME: call csrss.exe */
967 * @unimplemented (Undocumented)
971 InvalidateConsoleDIBits(DWORD Unknown0
,
974 DPRINT1("InvalidateConsoleDIBits(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
975 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
981 * @unimplemented (Undocumented)
985 OpenConsoleW(LPCWSTR wsName
,
986 DWORD dwDesiredAccess
,
990 CSR_API_MESSAGE Request
;
992 NTSTATUS Status
= STATUS_SUCCESS
;
994 if (0 == _wcsicmp(wsName
, L
"CONIN$"))
996 CsrRequest
= MAKE_CSR_API(GET_INPUT_HANDLE
, CSR_NATIVE
);
998 else if (0 == _wcsicmp(wsName
, L
"CONOUT$"))
1000 CsrRequest
= MAKE_CSR_API(GET_OUTPUT_HANDLE
, CSR_NATIVE
);
1004 SetLastError(ERROR_INVALID_PARAMETER
);
1005 return(INVALID_HANDLE_VALUE
);
1008 if (dwDesiredAccess
& ~(GENERIC_READ
|GENERIC_WRITE
))
1010 SetLastError(ERROR_INVALID_PARAMETER
);
1011 return(INVALID_HANDLE_VALUE
);
1014 if (dwShareMode
& ~(FILE_SHARE_READ
|FILE_SHARE_WRITE
))
1016 SetLastError(ERROR_INVALID_PARAMETER
);
1017 return(INVALID_HANDLE_VALUE
);
1020 /* Structures for GET_INPUT_HANDLE and GET_OUTPUT_HANDLE requests are identical */
1021 Request
.Data
.GetInputHandleRequest
.Access
= dwDesiredAccess
;
1022 Request
.Data
.GetInputHandleRequest
.Inheritable
= bInheritHandle
;
1024 Status
= CsrClientCallServer(&Request
,
1027 sizeof(CSR_API_MESSAGE
));
1028 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1030 SetLastErrorByStatus(Status
);
1031 return INVALID_HANDLE_VALUE
;
1034 return Request
.Data
.GetInputHandleRequest
.InputHandle
;
1039 * @unimplemented (Undocumented)
1043 SetConsoleCommandHistoryMode(DWORD dwMode
)
1045 DPRINT1("SetConsoleCommandHistoryMode(0x%x) UNIMPLEMENTED!\n", dwMode
);
1046 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1052 * @unimplemented (Undocumented)
1056 SetConsoleCursor(DWORD Unknown0
,
1059 DPRINT1("SetConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1060 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1070 SetConsoleDisplayMode(HANDLE hOut
,
1074 * FUNCTION: Set the console display mode.
1076 * hOut - Standard output handle.
1077 * dwNewMode - New mode.
1078 * lpdwOldMode - Address of a variable that receives the old mode.
1081 DPRINT1("SetConsoleDisplayMode(0x%x, 0x%x, 0x%p) UNIMPLEMENTED!\n", hOut
, dwNewMode
, lpdwOldMode
);
1082 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1088 * @unimplemented (Undocumented)
1092 SetConsoleFont(DWORD Unknown0
,
1095 DPRINT1("SetConsoleFont(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1096 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1102 * @implemented (Undocumented)
1106 SetConsoleHardwareState(HANDLE hConsole
,
1110 CSR_API_MESSAGE Request
;
1114 CsrRequest
= MAKE_CSR_API(SETGET_CONSOLE_HW_STATE
, CSR_CONSOLE
);
1115 Request
.Data
.ConsoleHardwareStateRequest
.ConsoleHandle
= hConsole
;
1116 Request
.Data
.ConsoleHardwareStateRequest
.SetGet
= CONSOLE_HARDWARE_STATE_SET
;
1117 Request
.Data
.ConsoleHardwareStateRequest
.State
= State
;
1119 Status
= CsrClientCallServer(&Request
,
1122 sizeof(CSR_API_MESSAGE
));
1123 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1125 SetLastErrorByStatus(Status
);
1134 * @unimplemented (Undocumented)
1138 SetConsoleKeyShortcuts(DWORD Unknown0
,
1143 DPRINT1("SetConsoleKeyShortcuts(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
1144 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1150 * @unimplemented (Undocumented)
1154 SetConsoleMaximumWindowSize(DWORD Unknown0
,
1157 DPRINT1("SetConsoleMaximumWindowSize(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1158 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1164 * @unimplemented (Undocumented)
1168 SetConsoleMenuClose(DWORD Unknown0
)
1170 DPRINT1("SetConsoleMenuClose(0x%x) UNIMPLEMENTED!\n", Unknown0
);
1171 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1177 * @unimplemented (Undocumented)
1181 SetConsoleNumberOfCommandsA(DWORD Unknown0
,
1184 DPRINT1("SetConsoleNumberOfCommandsA(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1185 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1191 * @unimplemented (Undocumented)
1195 SetConsoleNumberOfCommandsW(DWORD Unknown0
,
1198 DPRINT1("SetConsoleNumberOfCommandsW(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1199 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1205 * @unimplemented (Undocumented)
1209 SetConsolePalette(DWORD Unknown0
,
1213 DPRINT1("SetConsolePalette(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
);
1214 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1220 * @unimplemented (Undocumented)
1224 SetLastConsoleEventActive(VOID
)
1226 DPRINT1("SetLastConsoleEventActive() UNIMPLEMENTED!\n");
1227 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1233 * @unimplemented (Undocumented)
1237 ShowConsoleCursor(DWORD Unknown0
,
1240 DPRINT1("ShowConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1241 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1247 * FUNCTION: Checks whether the given handle is a valid console handle.
1249 * Handle - Handle to be checked
1251 * TRUE: Handle is a valid console handle
1252 * FALSE: Handle is not a valid console handle.
1253 * STATUS: Officially undocumented
1259 VerifyConsoleIoHandle(HANDLE Handle
)
1261 CSR_API_MESSAGE Request
;
1265 CsrRequest
= MAKE_CSR_API(VERIFY_HANDLE
, CSR_NATIVE
);
1266 Request
.Data
.VerifyHandleRequest
.Handle
= Handle
;
1268 Status
= CsrClientCallServer(&Request
,
1271 sizeof(CSR_API_MESSAGE
));
1272 if (!NT_SUCCESS(Status
))
1274 SetLastErrorByStatus(Status
);
1278 return (BOOL
)NT_SUCCESS(Request
.Status
);
1287 WriteConsoleInputVDMA(DWORD Unknown0
,
1292 DPRINT1("WriteConsoleInputVDMA(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
1293 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1303 WriteConsoleInputVDMW(DWORD Unknown0
,
1308 DPRINT1("WriteConsoleInputVDMW(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
1309 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1315 * @implemented (Undocumented)
1319 CloseConsoleHandle(HANDLE Handle
)
1321 CSR_API_MESSAGE Request
;
1325 CsrRequest
= MAKE_CSR_API(CLOSE_HANDLE
, CSR_NATIVE
);
1326 Request
.Data
.CloseHandleRequest
.Handle
= Handle
;
1328 Status
= CsrClientCallServer(&Request
,
1331 sizeof(CSR_API_MESSAGE
));
1332 if (!NT_SUCCESS(Status
))
1334 SetLastErrorByStatus(Status
);
1346 GetStdHandle(DWORD nStdHandle
)
1348 * FUNCTION: Get a handle for the standard input, standard output
1349 * and a standard error device.
1351 * nStdHandle - Specifies the device for which to return the handle.
1352 * RETURNS: If the function succeeds, the return value is the handle
1353 * of the specified device. Otherwise the value is INVALID_HANDLE_VALUE.
1356 PRTL_USER_PROCESS_PARAMETERS Ppb
;
1358 Ppb
= NtCurrentPeb()->ProcessParameters
;
1361 case STD_INPUT_HANDLE
:
1362 return Ppb
->StandardInput
;
1364 case STD_OUTPUT_HANDLE
:
1365 return Ppb
->StandardOutput
;
1367 case STD_ERROR_HANDLE
:
1368 return Ppb
->StandardError
;
1371 SetLastError (ERROR_INVALID_PARAMETER
);
1372 return INVALID_HANDLE_VALUE
;
1381 SetStdHandle(DWORD nStdHandle
,
1384 * FUNCTION: Set the handle for the standard input, standard output or
1385 * the standard error device.
1387 * nStdHandle - Specifies the handle to be set.
1388 * hHandle - The handle to set.
1389 * RETURNS: TRUE if the function succeeds, FALSE otherwise.
1392 PRTL_USER_PROCESS_PARAMETERS Ppb
;
1394 /* no need to check if hHandle == INVALID_HANDLE_VALUE */
1396 Ppb
= NtCurrentPeb()->ProcessParameters
;
1400 case STD_INPUT_HANDLE
:
1401 Ppb
->StandardInput
= hHandle
;
1404 case STD_OUTPUT_HANDLE
:
1405 Ppb
->StandardOutput
= hHandle
;
1408 case STD_ERROR_HANDLE
:
1409 Ppb
->StandardError
= hHandle
;
1413 /* windows for whatever reason sets the last error to ERROR_INVALID_HANDLE here */
1414 SetLastError(ERROR_INVALID_HANDLE
);
1421 IntWriteConsole(HANDLE hConsoleOutput
,
1423 DWORD nNumberOfCharsToWrite
,
1424 LPDWORD lpNumberOfCharsWritten
,
1428 PCSR_API_MESSAGE Request
;
1432 ULONG SizeBytes
, CharSize
;
1435 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
1436 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
1438 max(sizeof(CSR_API_MESSAGE
),
1439 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE
) + min(nNumberOfCharsToWrite
,
1440 CSRSS_MAX_WRITE_CONSOLE
/ CharSize
) * CharSize
));
1441 if (Request
== NULL
)
1443 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1447 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE
, CSR_CONSOLE
);
1449 while (nNumberOfCharsToWrite
> 0)
1451 Request
->Data
.WriteConsoleRequest
.ConsoleHandle
= hConsoleOutput
;
1452 Request
->Data
.WriteConsoleRequest
.Unicode
= bUnicode
;
1454 nChars
= (USHORT
)min(nNumberOfCharsToWrite
, CSRSS_MAX_WRITE_CONSOLE
/ CharSize
);
1455 Request
->Data
.WriteConsoleRequest
.NrCharactersToWrite
= nChars
;
1457 SizeBytes
= nChars
* CharSize
;
1459 memcpy(Request
->Data
.WriteConsoleRequest
.Buffer
, lpBuffer
, SizeBytes
);
1461 Status
= CsrClientCallServer(Request
,
1464 max(sizeof(CSR_API_MESSAGE
),
1465 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE
) + SizeBytes
));
1467 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
1469 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1470 SetLastErrorByStatus(Status
);
1474 nNumberOfCharsToWrite
-= nChars
;
1475 lpBuffer
= (PVOID
)((ULONG_PTR
)lpBuffer
+ (ULONG_PTR
)SizeBytes
);
1476 Written
+= Request
->Data
.WriteConsoleRequest
.NrCharactersWritten
;
1479 if (lpNumberOfCharsWritten
!= NULL
)
1481 *lpNumberOfCharsWritten
= Written
;
1483 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1489 /*--------------------------------------------------------------
1496 WriteConsoleA(HANDLE hConsoleOutput
,
1497 CONST VOID
*lpBuffer
,
1498 DWORD nNumberOfCharsToWrite
,
1499 LPDWORD lpNumberOfCharsWritten
,
1502 return IntWriteConsole(hConsoleOutput
,
1504 nNumberOfCharsToWrite
,
1505 lpNumberOfCharsWritten
,
1511 /*--------------------------------------------------------------
1518 WriteConsoleW(HANDLE hConsoleOutput
,
1519 CONST VOID
*lpBuffer
,
1520 DWORD nNumberOfCharsToWrite
,
1521 LPDWORD lpNumberOfCharsWritten
,
1524 return IntWriteConsole(hConsoleOutput
,
1526 nNumberOfCharsToWrite
,
1527 lpNumberOfCharsWritten
,
1535 IntReadConsole(HANDLE hConsoleInput
,
1537 DWORD nNumberOfCharsToRead
,
1538 LPDWORD lpNumberOfCharsRead
,
1539 PCONSOLE_READCONSOLE_CONTROL lpReserved
,
1542 PCSR_API_MESSAGE Request
;
1545 ULONG CharSize
, CharsRead
= 0;
1547 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
1548 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
1550 max(sizeof(CSR_API_MESSAGE
),
1551 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE
) + min(nNumberOfCharsToRead
,
1552 CSRSS_MAX_READ_CONSOLE
/ CharSize
) * CharSize
));
1553 if (Request
== NULL
)
1555 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1559 Request
->Status
= STATUS_SUCCESS
;
1560 CsrRequest
= MAKE_CSR_API(READ_CONSOLE
, CSR_CONSOLE
);
1564 if (Request
->Status
== STATUS_PENDING
)
1566 Status
= NtWaitForSingleObject(Request
->Data
.ReadConsoleRequest
.EventHandle
,
1569 if (!NT_SUCCESS(Status
))
1571 DPRINT1("Wait for console input failed!\n");
1576 Request
->Data
.ReadConsoleRequest
.ConsoleHandle
= hConsoleInput
;
1577 Request
->Data
.ReadConsoleRequest
.Unicode
= bUnicode
;
1578 Request
->Data
.ReadConsoleRequest
.NrCharactersToRead
= (WORD
)min(nNumberOfCharsToRead
, CSRSS_MAX_READ_CONSOLE
/ CharSize
);
1579 Request
->Data
.ReadConsoleRequest
.nCharsCanBeDeleted
= (WORD
)CharsRead
;
1581 Status
= CsrClientCallServer(Request
,
1584 max(sizeof(CSR_API_MESSAGE
),
1585 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE
)
1586 + Request
->Data
.ReadConsoleRequest
.NrCharactersToRead
* CharSize
));
1588 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
1590 DPRINT1("CSR returned error in ReadConsole\n");
1591 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1592 SetLastErrorByStatus(Status
);
1596 nNumberOfCharsToRead
-= Request
->Data
.ReadConsoleRequest
.NrCharactersRead
;
1597 memcpy((PVOID
)((ULONG_PTR
)lpBuffer
+ (ULONG_PTR
)(CharsRead
* CharSize
)),
1598 Request
->Data
.ReadConsoleRequest
.Buffer
,
1599 Request
->Data
.ReadConsoleRequest
.NrCharactersRead
* CharSize
);
1600 CharsRead
+= Request
->Data
.ReadConsoleRequest
.NrCharactersRead
;
1602 if (Request
->Status
== STATUS_NOTIFY_CLEANUP
)
1607 nNumberOfCharsToRead
++;
1609 Request
->Status
= STATUS_PENDING
;
1612 while (Request
->Status
== STATUS_PENDING
&& nNumberOfCharsToRead
> 0);
1614 if (lpNumberOfCharsRead
!= NULL
)
1616 *lpNumberOfCharsRead
= CharsRead
;
1619 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1625 /*--------------------------------------------------------------
1632 ReadConsoleA(HANDLE hConsoleInput
,
1634 DWORD nNumberOfCharsToRead
,
1635 LPDWORD lpNumberOfCharsRead
,
1636 PCONSOLE_READCONSOLE_CONTROL pInputControl
)
1638 return IntReadConsole(hConsoleInput
,
1640 nNumberOfCharsToRead
,
1641 lpNumberOfCharsRead
,
1647 /*--------------------------------------------------------------
1654 ReadConsoleW(HANDLE hConsoleInput
,
1656 DWORD nNumberOfCharsToRead
,
1657 LPDWORD lpNumberOfCharsRead
,
1658 PCONSOLE_READCONSOLE_CONTROL pInputControl
)
1660 return IntReadConsole(hConsoleInput
,
1662 nNumberOfCharsToRead
,
1663 lpNumberOfCharsRead
,
1669 /*--------------------------------------------------------------
1678 CSR_API_MESSAGE Request
;
1683 if (NtCurrentPeb()->ProcessParameters
->ConsoleHandle
)
1685 DPRINT("AllocConsole: Allocate duplicate console to the same Process\n");
1686 SetLastErrorByStatus (STATUS_OBJECT_NAME_EXISTS
);
1690 Request
.Data
.AllocConsoleRequest
.CtrlDispatcher
= ConsoleControlDispatcher
;
1691 Request
.Data
.AllocConsoleRequest
.ConsoleNeeded
= TRUE
;
1693 CsrRequest
= MAKE_CSR_API(ALLOC_CONSOLE
, CSR_CONSOLE
);
1695 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
1696 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1698 SetLastErrorByStatus(Status
);
1702 NtCurrentPeb()->ProcessParameters
->ConsoleHandle
= Request
.Data
.AllocConsoleRequest
.Console
;
1704 SetStdHandle(STD_INPUT_HANDLE
, Request
.Data
.AllocConsoleRequest
.InputHandle
);
1705 SetStdHandle(STD_OUTPUT_HANDLE
, Request
.Data
.AllocConsoleRequest
.OutputHandle
);
1707 hStdError
= DuplicateConsoleHandle(Request
.Data
.AllocConsoleRequest
.OutputHandle
,
1710 DUPLICATE_SAME_ACCESS
);
1712 SetStdHandle(STD_ERROR_HANDLE
, hStdError
);
1717 /*--------------------------------------------------------------
1726 // AG: I'm not sure if this is correct (what happens to std handles?)
1727 // but I just tried to reverse what AllocConsole() does...
1729 CSR_API_MESSAGE Request
;
1733 CsrRequest
= MAKE_CSR_API(FREE_CONSOLE
, CSR_CONSOLE
);
1735 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
1736 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1738 SetLastErrorByStatus(Status
);
1742 NtCurrentPeb()->ProcessParameters
->ConsoleHandle
= NULL
;
1747 /*--------------------------------------------------------------
1748 * GetConsoleScreenBufferInfo
1754 GetConsoleScreenBufferInfo(HANDLE hConsoleOutput
,
1755 PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
)
1757 CSR_API_MESSAGE Request
;
1761 CsrRequest
= MAKE_CSR_API(SCREEN_BUFFER_INFO
, CSR_CONSOLE
);
1762 Request
.Data
.ScreenBufferInfoRequest
.ConsoleHandle
= hConsoleOutput
;
1764 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
1765 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1767 SetLastErrorByStatus(Status
);
1770 *lpConsoleScreenBufferInfo
= Request
.Data
.ScreenBufferInfoRequest
.Info
;
1775 /*--------------------------------------------------------------
1776 * SetConsoleCursorPosition
1782 SetConsoleCursorPosition(HANDLE hConsoleOutput
,
1783 COORD dwCursorPosition
)
1785 CSR_API_MESSAGE Request
;
1789 CsrRequest
= MAKE_CSR_API(SET_CURSOR
, CSR_CONSOLE
);
1790 Request
.Data
.SetCursorRequest
.ConsoleHandle
= hConsoleOutput
;
1791 Request
.Data
.SetCursorRequest
.Position
= dwCursorPosition
;
1793 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
1794 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1796 SetLastErrorByStatus(Status
);
1806 IntFillConsoleOutputCharacter(HANDLE hConsoleOutput
,
1810 LPDWORD lpNumberOfCharsWritten
,
1813 CSR_API_MESSAGE Request
;
1817 CsrRequest
= MAKE_CSR_API(FILL_OUTPUT
, CSR_CONSOLE
);
1818 Request
.Data
.FillOutputRequest
.ConsoleHandle
= hConsoleOutput
;
1819 Request
.Data
.FillOutputRequest
.Unicode
= bUnicode
;
1822 Request
.Data
.FillOutputRequest
.Char
.UnicodeChar
= *((WCHAR
*)cCharacter
);
1824 Request
.Data
.FillOutputRequest
.Char
.AsciiChar
= *((CHAR
*)cCharacter
);
1826 Request
.Data
.FillOutputRequest
.Position
= dwWriteCoord
;
1827 Request
.Data
.FillOutputRequest
.Length
= (WORD
)nLength
;
1829 Status
= CsrClientCallServer(&Request
,
1832 sizeof(CSR_API_MESSAGE
));
1834 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1836 SetLastErrorByStatus(Status
);
1840 if(lpNumberOfCharsWritten
!= NULL
)
1842 *lpNumberOfCharsWritten
= Request
.Data
.FillOutputRequest
.NrCharactersWritten
;
1848 /*--------------------------------------------------------------
1849 * FillConsoleOutputCharacterA
1855 FillConsoleOutputCharacterA(HANDLE hConsoleOutput
,
1859 LPDWORD lpNumberOfCharsWritten
)
1861 return IntFillConsoleOutputCharacter(hConsoleOutput
,
1865 lpNumberOfCharsWritten
,
1870 /*--------------------------------------------------------------
1871 * FillConsoleOutputCharacterW
1877 FillConsoleOutputCharacterW(HANDLE hConsoleOutput
,
1881 LPDWORD lpNumberOfCharsWritten
)
1883 return IntFillConsoleOutputCharacter(hConsoleOutput
,
1887 lpNumberOfCharsWritten
,
1894 IntPeekConsoleInput(HANDLE hConsoleInput
,
1895 PINPUT_RECORD lpBuffer
,
1897 LPDWORD lpNumberOfEventsRead
,
1900 CSR_API_MESSAGE Request
;
1902 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1906 if (lpBuffer
== NULL
)
1908 SetLastError(ERROR_INVALID_PARAMETER
);
1912 Size
= nLength
* sizeof(INPUT_RECORD
);
1914 /* Allocate a Capture Buffer */
1915 DPRINT("IntPeekConsoleInput: %lx %p\n", Size
, lpNumberOfEventsRead
);
1916 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
1918 /* Allocate space in the Buffer */
1919 CsrCaptureMessageBuffer(CaptureBuffer
,
1922 (PVOID
*)&Request
.Data
.PeekConsoleInputRequest
.InputRecord
);
1924 /* Set up the data to send to the Console Server */
1925 CsrRequest
= MAKE_CSR_API(PEEK_CONSOLE_INPUT
, CSR_CONSOLE
);
1926 Request
.Data
.PeekConsoleInputRequest
.ConsoleHandle
= hConsoleInput
;
1927 Request
.Data
.PeekConsoleInputRequest
.Unicode
= bUnicode
;
1928 Request
.Data
.PeekConsoleInputRequest
.Length
= nLength
;
1930 /* Call the server */
1931 Status
= CsrClientCallServer(&Request
,
1934 sizeof(CSR_API_MESSAGE
));
1935 DPRINT("Server returned: %x\n", Request
.Status
);
1937 /* Check for success*/
1938 if (NT_SUCCESS(Request
.Status
))
1940 /* Return the number of events read */
1941 DPRINT("Events read: %lx\n", Request
.Data
.PeekConsoleInputRequest
.Length
);
1942 *lpNumberOfEventsRead
= Request
.Data
.PeekConsoleInputRequest
.Length
;
1944 /* Copy into the buffer */
1945 DPRINT("Copying to buffer\n");
1946 RtlCopyMemory(lpBuffer
,
1947 Request
.Data
.PeekConsoleInputRequest
.InputRecord
,
1948 sizeof(INPUT_RECORD
) * *lpNumberOfEventsRead
);
1953 *lpNumberOfEventsRead
= 0;
1954 SetLastErrorByStatus(Request
.Status
);
1957 /* Release the capture buffer */
1958 CsrFreeCaptureBuffer(CaptureBuffer
);
1960 /* Return TRUE or FALSE */
1961 return NT_SUCCESS(Request
.Status
);
1964 /*--------------------------------------------------------------
1971 PeekConsoleInputA(HANDLE hConsoleInput
,
1972 PINPUT_RECORD lpBuffer
,
1974 LPDWORD lpNumberOfEventsRead
)
1976 return IntPeekConsoleInput(hConsoleInput
,
1979 lpNumberOfEventsRead
,
1984 /*--------------------------------------------------------------
1991 PeekConsoleInputW(HANDLE hConsoleInput
,
1992 PINPUT_RECORD lpBuffer
,
1994 LPDWORD lpNumberOfEventsRead
)
1996 return IntPeekConsoleInput(hConsoleInput
,
1998 lpNumberOfEventsRead
,
2005 IntReadConsoleInput(HANDLE hConsoleInput
,
2006 PINPUT_RECORD lpBuffer
,
2008 LPDWORD lpNumberOfEventsRead
,
2011 CSR_API_MESSAGE Request
;
2016 CsrRequest
= MAKE_CSR_API(READ_INPUT
, CSR_CONSOLE
);
2021 Request
.Data
.ReadInputRequest
.ConsoleHandle
= hConsoleInput
;
2022 Request
.Data
.ReadInputRequest
.Unicode
= bUnicode
;
2024 Status
= CsrClientCallServer(&Request
,
2027 sizeof(CSR_API_MESSAGE
));
2028 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2032 /* we couldn't read a single record, fail */
2033 SetLastErrorByStatus(Status
);
2038 /* FIXME - fail gracefully in case we already read at least one record? */
2042 else if (Status
== STATUS_PENDING
)
2046 Status
= NtWaitForSingleObject(Request
.Data
.ReadInputRequest
.Event
, FALSE
, 0);
2047 if (!NT_SUCCESS(Status
))
2049 SetLastErrorByStatus(Status
);
2055 /* nothing more to read (waiting for more input??), let's just bail */
2061 lpBuffer
[Read
++] = Request
.Data
.ReadInputRequest
.Input
;
2064 if (!Request
.Data
.ReadInputRequest
.MoreEvents
)
2066 /* nothing more to read, bail */
2072 if (lpNumberOfEventsRead
!= NULL
)
2074 *lpNumberOfEventsRead
= Read
;
2081 /*--------------------------------------------------------------
2088 ReadConsoleInputA(HANDLE hConsoleInput
,
2089 PINPUT_RECORD lpBuffer
,
2091 LPDWORD lpNumberOfEventsRead
)
2093 return IntReadConsoleInput(hConsoleInput
,
2096 lpNumberOfEventsRead
,
2101 /*--------------------------------------------------------------
2108 ReadConsoleInputW(HANDLE hConsoleInput
,
2109 PINPUT_RECORD lpBuffer
,
2111 LPDWORD lpNumberOfEventsRead
)
2113 return IntReadConsoleInput(hConsoleInput
,
2116 lpNumberOfEventsRead
,
2123 IntWriteConsoleInput(HANDLE hConsoleInput
,
2124 PINPUT_RECORD lpBuffer
,
2126 LPDWORD lpNumberOfEventsWritten
,
2129 CSR_API_MESSAGE Request
;
2131 PCSR_CAPTURE_BUFFER CaptureBuffer
;
2135 if (lpBuffer
== NULL
)
2137 SetLastError(ERROR_INVALID_PARAMETER
);
2141 Size
= nLength
* sizeof(INPUT_RECORD
);
2143 /* Allocate a Capture Buffer */
2144 DPRINT("IntWriteConsoleInput: %lx %p\n", Size
, lpNumberOfEventsWritten
);
2145 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
2147 /* Allocate space in the Buffer */
2148 CsrCaptureMessageBuffer(CaptureBuffer
,
2151 (PVOID
*)&Request
.Data
.WriteConsoleInputRequest
.InputRecord
);
2153 /* Set up the data to send to the Console Server */
2154 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_INPUT
, CSR_CONSOLE
);
2155 Request
.Data
.WriteConsoleInputRequest
.ConsoleHandle
= hConsoleInput
;
2156 Request
.Data
.WriteConsoleInputRequest
.Unicode
= bUnicode
;
2157 Request
.Data
.WriteConsoleInputRequest
.Length
= nLength
;
2159 /* Call the server */
2160 Status
= CsrClientCallServer(&Request
,
2163 sizeof(CSR_API_MESSAGE
));
2164 DPRINT("Server returned: %x\n", Request
.Status
);
2166 /* Check for success*/
2167 if (NT_SUCCESS(Request
.Status
))
2169 /* Return the number of events read */
2170 DPRINT("Events read: %lx\n", Request
.Data
.WriteConsoleInputRequest
.Length
);
2171 *lpNumberOfEventsWritten
= Request
.Data
.WriteConsoleInputRequest
.Length
;
2176 *lpNumberOfEventsWritten
= 0;
2177 SetLastErrorByStatus(Request
.Status
);
2180 /* Release the capture buffer */
2181 CsrFreeCaptureBuffer(CaptureBuffer
);
2183 /* Return TRUE or FALSE */
2184 return NT_SUCCESS(Request
.Status
);
2188 /*--------------------------------------------------------------
2189 * WriteConsoleInputA
2195 WriteConsoleInputA(HANDLE hConsoleInput
,
2196 CONST INPUT_RECORD
*lpBuffer
,
2198 LPDWORD lpNumberOfEventsWritten
)
2200 return IntWriteConsoleInput(hConsoleInput
,
2201 (PINPUT_RECORD
)lpBuffer
,
2203 lpNumberOfEventsWritten
,
2208 /*--------------------------------------------------------------
2209 * WriteConsoleInputW
2215 WriteConsoleInputW(HANDLE hConsoleInput
,
2216 CONST INPUT_RECORD
*lpBuffer
,
2218 LPDWORD lpNumberOfEventsWritten
)
2220 return IntWriteConsoleInput(hConsoleInput
,
2221 (PINPUT_RECORD
)lpBuffer
,
2223 lpNumberOfEventsWritten
,
2230 IntReadConsoleOutput(HANDLE hConsoleOutput
,
2231 PCHAR_INFO lpBuffer
,
2233 COORD dwBufferCoord
,
2234 PSMALL_RECT lpReadRegion
,
2237 CSR_API_MESSAGE Request
;
2239 PCSR_CAPTURE_BUFFER CaptureBuffer
;
2241 DWORD Size
, SizeX
, SizeY
;
2243 if (lpBuffer
== NULL
)
2245 SetLastError(ERROR_INVALID_PARAMETER
);
2249 Size
= dwBufferSize
.X
* dwBufferSize
.Y
* sizeof(CHAR_INFO
);
2251 /* Allocate a Capture Buffer */
2252 DPRINT("IntReadConsoleOutput: %lx %p\n", Size
, lpReadRegion
);
2253 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
2255 /* Allocate space in the Buffer */
2256 CsrCaptureMessageBuffer(CaptureBuffer
,
2259 (PVOID
*)&Request
.Data
.ReadConsoleOutputRequest
.CharInfo
);
2261 /* Set up the data to send to the Console Server */
2262 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT
, CSR_CONSOLE
);
2263 Request
.Data
.ReadConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
2264 Request
.Data
.ReadConsoleOutputRequest
.Unicode
= bUnicode
;
2265 Request
.Data
.ReadConsoleOutputRequest
.BufferSize
= dwBufferSize
;
2266 Request
.Data
.ReadConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
2267 Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
= *lpReadRegion
;
2269 /* Call the server */
2270 Status
= CsrClientCallServer(&Request
,
2273 sizeof(CSR_API_MESSAGE
));
2274 DPRINT("Server returned: %x\n", Request
.Status
);
2276 /* Check for success*/
2277 if (NT_SUCCESS(Request
.Status
))
2279 /* Copy into the buffer */
2280 DPRINT("Copying to buffer\n");
2281 SizeX
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Right
-
2282 Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Left
+ 1;
2283 SizeY
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Bottom
-
2284 Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Top
+ 1;
2285 RtlCopyMemory(lpBuffer
,
2286 Request
.Data
.ReadConsoleOutputRequest
.CharInfo
,
2287 sizeof(CHAR_INFO
) * SizeX
* SizeY
);
2292 SetLastErrorByStatus(Request
.Status
);
2295 /* Return the read region */
2296 DPRINT("read region: %lx\n", Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
);
2297 *lpReadRegion
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
;
2299 /* Release the capture buffer */
2300 CsrFreeCaptureBuffer(CaptureBuffer
);
2302 /* Return TRUE or FALSE */
2303 return NT_SUCCESS(Request
.Status
);
2306 /*--------------------------------------------------------------
2307 * ReadConsoleOutputA
2313 ReadConsoleOutputA(HANDLE hConsoleOutput
,
2314 PCHAR_INFO lpBuffer
,
2316 COORD dwBufferCoord
,
2317 PSMALL_RECT lpReadRegion
)
2319 return IntReadConsoleOutput(hConsoleOutput
,
2328 /*--------------------------------------------------------------
2329 * ReadConsoleOutputW
2335 ReadConsoleOutputW(HANDLE hConsoleOutput
,
2336 PCHAR_INFO lpBuffer
,
2338 COORD dwBufferCoord
,
2339 PSMALL_RECT lpReadRegion
)
2341 return IntReadConsoleOutput(hConsoleOutput
,
2352 IntWriteConsoleOutput(HANDLE hConsoleOutput
,
2353 CONST CHAR_INFO
*lpBuffer
,
2355 COORD dwBufferCoord
,
2356 PSMALL_RECT lpWriteRegion
,
2359 CSR_API_MESSAGE Request
;
2361 PCSR_CAPTURE_BUFFER CaptureBuffer
;
2365 Size
= dwBufferSize
.Y
* dwBufferSize
.X
* sizeof(CHAR_INFO
);
2367 /* Allocate a Capture Buffer */
2368 DPRINT("IntWriteConsoleOutput: %lx %p\n", Size
, lpWriteRegion
);
2369 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
2371 /* Allocate space in the Buffer */
2372 CsrCaptureMessageBuffer(CaptureBuffer
,
2375 (PVOID
*)&Request
.Data
.WriteConsoleOutputRequest
.CharInfo
);
2377 /* Copy from the buffer */
2378 RtlCopyMemory(Request
.Data
.WriteConsoleOutputRequest
.CharInfo
, lpBuffer
, Size
);
2380 /* Set up the data to send to the Console Server */
2381 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT
, CSR_CONSOLE
);
2382 Request
.Data
.WriteConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
2383 Request
.Data
.WriteConsoleOutputRequest
.Unicode
= bUnicode
;
2384 Request
.Data
.WriteConsoleOutputRequest
.BufferSize
= dwBufferSize
;
2385 Request
.Data
.WriteConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
2386 Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
= *lpWriteRegion
;
2388 /* Call the server */
2389 Status
= CsrClientCallServer(&Request
,
2392 sizeof(CSR_API_MESSAGE
));
2393 DPRINT("Server returned: %x\n", Request
.Status
);
2395 /* Check for success*/
2396 if (!NT_SUCCESS(Request
.Status
))
2399 SetLastErrorByStatus(Request
.Status
);
2402 /* Return the read region */
2403 DPRINT("read region: %lx\n", Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
);
2404 *lpWriteRegion
= Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
;
2406 /* Release the capture buffer */
2407 CsrFreeCaptureBuffer(CaptureBuffer
);
2409 /* Return TRUE or FALSE */
2410 return NT_SUCCESS(Request
.Status
);
2413 /*--------------------------------------------------------------
2414 * WriteConsoleOutputA
2420 WriteConsoleOutputA(HANDLE hConsoleOutput
,
2421 CONST CHAR_INFO
*lpBuffer
,
2423 COORD dwBufferCoord
,
2424 PSMALL_RECT lpWriteRegion
)
2426 return IntWriteConsoleOutput(hConsoleOutput
,
2435 /*--------------------------------------------------------------
2436 * WriteConsoleOutputW
2442 WriteConsoleOutputW(HANDLE hConsoleOutput
,
2443 CONST CHAR_INFO
*lpBuffer
,
2445 COORD dwBufferCoord
,
2446 PSMALL_RECT lpWriteRegion
)
2448 return IntWriteConsoleOutput(hConsoleOutput
,
2459 IntReadConsoleOutputCharacter(HANDLE hConsoleOutput
,
2463 LPDWORD lpNumberOfCharsRead
,
2466 PCSR_API_MESSAGE Request
;
2469 ULONG nChars
, SizeBytes
, CharSize
;
2470 DWORD CharsRead
= 0;
2472 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
2474 nChars
= min(nLength
, CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR
) / CharSize
;
2475 SizeBytes
= nChars
* CharSize
;
2477 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
2478 max(sizeof(CSR_API_MESSAGE
),
2479 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR
)
2480 + min (nChars
, CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR
/ CharSize
) * CharSize
));
2481 if (Request
== NULL
)
2483 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2487 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT_CHAR
, CSR_CONSOLE
);
2488 Request
->Data
.ReadConsoleOutputCharRequest
.ReadCoord
= dwReadCoord
;
2494 Request
->Data
.ReadConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
2495 Request
->Data
.ReadConsoleOutputCharRequest
.Unicode
= bUnicode
;
2496 Request
->Data
.ReadConsoleOutputCharRequest
.NumCharsToRead
= min(nLength
, nChars
);
2497 SizeBytes
= Request
->Data
.ReadConsoleOutputCharRequest
.NumCharsToRead
* CharSize
;
2499 Status
= CsrClientCallServer(Request
,
2502 max(sizeof(CSR_API_MESSAGE
),
2503 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR
) + SizeBytes
));
2504 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Request
->Status
))
2506 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2507 SetLastErrorByStatus(Status
);
2511 BytesRead
= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
* CharSize
;
2512 memcpy(lpCharacter
, Request
->Data
.ReadConsoleOutputCharRequest
.String
, BytesRead
);
2513 lpCharacter
= (PVOID
)((ULONG_PTR
)lpCharacter
+ (ULONG_PTR
)BytesRead
);
2514 CharsRead
+= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
;
2515 nLength
-= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
;
2517 Request
->Data
.ReadConsoleOutputCharRequest
.ReadCoord
= Request
->Data
.ReadConsoleOutputCharRequest
.EndCoord
;
2520 if (lpNumberOfCharsRead
!= NULL
)
2522 *lpNumberOfCharsRead
= CharsRead
;
2525 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2531 /*--------------------------------------------------------------
2532 * ReadConsoleOutputCharacterA
2538 ReadConsoleOutputCharacterA(HANDLE hConsoleOutput
,
2542 LPDWORD lpNumberOfCharsRead
)
2544 return IntReadConsoleOutputCharacter(hConsoleOutput
,
2548 lpNumberOfCharsRead
,
2553 /*--------------------------------------------------------------
2554 * ReadConsoleOutputCharacterW
2560 ReadConsoleOutputCharacterW(HANDLE hConsoleOutput
,
2564 LPDWORD lpNumberOfCharsRead
)
2566 return IntReadConsoleOutputCharacter(hConsoleOutput
,
2570 lpNumberOfCharsRead
,
2575 /*--------------------------------------------------------------
2576 * ReadConsoleOutputAttribute
2582 ReadConsoleOutputAttribute(HANDLE hConsoleOutput
,
2586 LPDWORD lpNumberOfAttrsRead
)
2588 PCSR_API_MESSAGE Request
;
2593 if (lpNumberOfAttrsRead
!= NULL
)
2594 *lpNumberOfAttrsRead
= nLength
;
2596 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
2598 max(sizeof(CSR_API_MESSAGE
),
2599 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB
)
2600 + min (nLength
, CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
)) * sizeof(WORD
)));
2601 if (Request
== NULL
)
2603 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2607 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2609 while (nLength
!= 0)
2611 Request
->Data
.ReadConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2612 Request
->Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= dwReadCoord
;
2614 if (nLength
> CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
))
2615 Size
= CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WCHAR
);
2619 Request
->Data
.ReadConsoleOutputAttribRequest
.NumAttrsToRead
= Size
;
2621 Status
= CsrClientCallServer(Request
,
2624 max(sizeof(CSR_API_MESSAGE
),
2625 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB
) + Size
* sizeof(WORD
)));
2626 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Request
->Status
))
2628 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2629 SetLastErrorByStatus(Status
);
2633 memcpy(lpAttribute
, Request
->Data
.ReadConsoleOutputAttribRequest
.Attribute
, Size
* sizeof(WORD
));
2634 lpAttribute
+= Size
;
2636 Request
->Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= Request
->Data
.ReadConsoleOutputAttribRequest
.EndCoord
;
2639 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2647 IntWriteConsoleOutputCharacter(HANDLE hConsoleOutput
,
2651 LPDWORD lpNumberOfCharsWritten
,
2654 PCSR_API_MESSAGE Request
;
2657 ULONG SizeBytes
, CharSize
, nChars
;
2660 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
2662 nChars
= min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
/ CharSize
);
2663 SizeBytes
= nChars
* CharSize
;
2665 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
2666 max(sizeof(CSR_API_MESSAGE
),
2667 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR
)
2668 + min (nChars
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
/ CharSize
) * CharSize
));
2669 if (Request
== NULL
)
2671 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2675 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT_CHAR
, CSR_CONSOLE
);
2676 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= dwWriteCoord
;
2682 Request
->Data
.WriteConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
2683 Request
->Data
.WriteConsoleOutputCharRequest
.Unicode
= bUnicode
;
2684 Request
->Data
.WriteConsoleOutputCharRequest
.Length
= (WORD
)min(nLength
, nChars
);
2685 BytesWrite
= Request
->Data
.WriteConsoleOutputCharRequest
.Length
* CharSize
;
2687 memcpy(Request
->Data
.WriteConsoleOutputCharRequest
.String
, lpCharacter
, BytesWrite
);
2689 Status
= CsrClientCallServer(Request
,
2692 max(sizeof(CSR_API_MESSAGE
),
2693 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR
) + BytesWrite
));
2695 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
2697 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2698 SetLastErrorByStatus(Status
);
2702 nLength
-= Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
;
2703 lpCharacter
= (PVOID
)((ULONG_PTR
)lpCharacter
+ (ULONG_PTR
)(Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
* CharSize
));
2704 Written
+= Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
;
2706 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= Request
->Data
.WriteConsoleOutputCharRequest
.EndCoord
;
2709 if (lpNumberOfCharsWritten
!= NULL
)
2711 *lpNumberOfCharsWritten
= Written
;
2714 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2720 /*--------------------------------------------------------------
2721 * WriteConsoleOutputCharacterA
2727 WriteConsoleOutputCharacterA(HANDLE hConsoleOutput
,
2731 LPDWORD lpNumberOfCharsWritten
)
2733 return IntWriteConsoleOutputCharacter(hConsoleOutput
,
2737 lpNumberOfCharsWritten
,
2742 /*--------------------------------------------------------------
2743 * WriteConsoleOutputCharacterW
2749 WriteConsoleOutputCharacterW(HANDLE hConsoleOutput
,
2750 LPCWSTR lpCharacter
,
2753 LPDWORD lpNumberOfCharsWritten
)
2755 return IntWriteConsoleOutputCharacter(hConsoleOutput
,
2759 lpNumberOfCharsWritten
,
2764 /*--------------------------------------------------------------
2765 * WriteConsoleOutputAttribute
2771 WriteConsoleOutputAttribute(HANDLE hConsoleOutput
,
2772 CONST WORD
*lpAttribute
,
2775 LPDWORD lpNumberOfAttrsWritten
)
2777 PCSR_API_MESSAGE Request
;
2782 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
2784 max(sizeof(CSR_API_MESSAGE
),
2785 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB
)
2786 + min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
)) * sizeof(WORD
)));
2787 if (Request
== NULL
)
2789 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2793 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2794 Request
->Data
.WriteConsoleOutputAttribRequest
.Coord
= dwWriteCoord
;
2796 if (lpNumberOfAttrsWritten
)
2797 *lpNumberOfAttrsWritten
= nLength
;
2800 Size
= (WORD
)min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
));
2801 Request
->Data
.WriteConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2802 Request
->Data
.WriteConsoleOutputAttribRequest
.Length
= Size
;
2803 memcpy(Request
->Data
.WriteConsoleOutputAttribRequest
.Attribute
, lpAttribute
, Size
* sizeof(WORD
));
2805 Status
= CsrClientCallServer(Request
,
2808 max(sizeof(CSR_API_MESSAGE
),
2809 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB
) + Size
* sizeof(WORD
)));
2811 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
2813 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2814 SetLastErrorByStatus (Status
);
2818 lpAttribute
+= Size
;
2819 Request
->Data
.WriteConsoleOutputAttribRequest
.Coord
= Request
->Data
.WriteConsoleOutputAttribRequest
.EndCoord
;
2822 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2828 /*--------------------------------------------------------------
2829 * FillConsoleOutputAttribute
2835 FillConsoleOutputAttribute(HANDLE hConsoleOutput
,
2839 LPDWORD lpNumberOfAttrsWritten
)
2841 CSR_API_MESSAGE Request
;
2845 CsrRequest
= MAKE_CSR_API(FILL_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2846 Request
.Data
.FillOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2847 Request
.Data
.FillOutputAttribRequest
.Attribute
= (CHAR
)wAttribute
;
2848 Request
.Data
.FillOutputAttribRequest
.Coord
= dwWriteCoord
;
2849 Request
.Data
.FillOutputAttribRequest
.Length
= (WORD
)nLength
;
2851 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
2852 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2854 SetLastErrorByStatus ( Status
);
2858 if (lpNumberOfAttrsWritten
)
2859 *lpNumberOfAttrsWritten
= nLength
;
2865 /*--------------------------------------------------------------
2872 GetConsoleMode(HANDLE hConsoleHandle
,
2875 CSR_API_MESSAGE Request
;
2879 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_MODE
, CSR_CONSOLE
);
2880 Request
.Data
.GetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
2882 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2883 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2885 SetLastErrorByStatus ( Status
);
2888 *lpMode
= Request
.Data
.GetConsoleModeRequest
.ConsoleMode
;
2894 /*--------------------------------------------------------------
2895 * GetNumberOfConsoleInputEvents
2901 GetNumberOfConsoleInputEvents(HANDLE hConsoleInput
,
2902 LPDWORD lpNumberOfEvents
)
2904 CSR_API_MESSAGE Request
;
2908 if (lpNumberOfEvents
== NULL
)
2910 SetLastError(ERROR_INVALID_PARAMETER
);
2914 CsrRequest
= MAKE_CSR_API(GET_NUM_INPUT_EVENTS
, CSR_CONSOLE
);
2915 Request
.Data
.GetNumInputEventsRequest
.ConsoleHandle
= hConsoleInput
;
2917 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
2918 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2920 SetLastErrorByStatus(Status
);
2924 *lpNumberOfEvents
= Request
.Data
.GetNumInputEventsRequest
.NumInputEvents
;
2930 /*--------------------------------------------------------------
2931 * GetLargestConsoleWindowSize
2937 GetLargestConsoleWindowSize(HANDLE hConsoleOutput
)
2939 COORD Coord
= {80,25};
2940 DPRINT1("GetLargestConsoleWindowSize(0x%x) UNIMPLEMENTED!\n", hConsoleOutput
);
2941 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2946 /*--------------------------------------------------------------
2947 * GetConsoleCursorInfo
2953 GetConsoleCursorInfo(HANDLE hConsoleOutput
,
2954 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
)
2956 CSR_API_MESSAGE Request
;
2960 if (!lpConsoleCursorInfo
)
2962 if (!hConsoleOutput
)
2963 SetLastError(ERROR_INVALID_HANDLE
);
2965 SetLastError(ERROR_INVALID_ACCESS
);
2970 CsrRequest
= MAKE_CSR_API(GET_CURSOR_INFO
, CSR_CONSOLE
);
2971 Request
.Data
.GetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
2973 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
2975 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2977 SetLastErrorByStatus(Status
);
2980 *lpConsoleCursorInfo
= Request
.Data
.GetCursorInfoRequest
.Info
;
2986 /*--------------------------------------------------------------
2987 * GetNumberOfConsoleMouseButtons
2993 GetNumberOfConsoleMouseButtons(LPDWORD lpNumberOfMouseButtons
)
2995 DPRINT1("GetNumberOfConsoleMouseButtons(0x%x) UNIMPLEMENTED!\n", lpNumberOfMouseButtons
);
2996 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3001 /*--------------------------------------------------------------
3008 SetConsoleMode(HANDLE hConsoleHandle
,
3011 CSR_API_MESSAGE Request
;
3015 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_MODE
, CSR_CONSOLE
);
3016 Request
.Data
.SetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
3017 Request
.Data
.SetConsoleModeRequest
.Mode
= dwMode
;
3019 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3020 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3022 SetLastErrorByStatus ( Status
);
3030 /*--------------------------------------------------------------
3031 * SetConsoleActiveScreenBuffer
3037 SetConsoleActiveScreenBuffer(HANDLE hConsoleOutput
)
3039 CSR_API_MESSAGE Request
;
3043 CsrRequest
= MAKE_CSR_API(SET_SCREEN_BUFFER
, CSR_CONSOLE
);
3044 Request
.Data
.SetScreenBufferRequest
.OutputHandle
= hConsoleOutput
;
3046 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3047 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3049 SetLastErrorByStatus(Status
);
3057 /*--------------------------------------------------------------
3058 * FlushConsoleInputBuffer
3064 FlushConsoleInputBuffer(HANDLE hConsoleInput
)
3066 CSR_API_MESSAGE Request
;
3070 CsrRequest
= MAKE_CSR_API(FLUSH_INPUT_BUFFER
, CSR_CONSOLE
);
3071 Request
.Data
.FlushInputBufferRequest
.ConsoleInput
= hConsoleInput
;
3073 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3074 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3076 SetLastErrorByStatus(Status
);
3084 /*--------------------------------------------------------------
3085 * SetConsoleScreenBufferSize
3091 SetConsoleScreenBufferSize(HANDLE hConsoleOutput
,
3094 DPRINT1("SetConsoleScreenBufferSize(0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, dwSize
);
3095 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3099 /*--------------------------------------------------------------
3100 * SetConsoleCursorInfo
3106 SetConsoleCursorInfo(HANDLE hConsoleOutput
,
3107 CONST CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
)
3109 CSR_API_MESSAGE Request
;
3113 CsrRequest
= MAKE_CSR_API(SET_CURSOR_INFO
, CSR_CONSOLE
);
3114 Request
.Data
.SetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
3115 Request
.Data
.SetCursorInfoRequest
.Info
= *lpConsoleCursorInfo
;
3117 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3118 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3120 SetLastErrorByStatus(Status
);
3130 IntScrollConsoleScreenBuffer(HANDLE hConsoleOutput
,
3131 const SMALL_RECT
*lpScrollRectangle
,
3132 const SMALL_RECT
*lpClipRectangle
,
3133 COORD dwDestinationOrigin
,
3134 const CHAR_INFO
*lpFill
,
3137 CSR_API_MESSAGE Request
;
3141 CsrRequest
= MAKE_CSR_API(SCROLL_CONSOLE_SCREEN_BUFFER
, CSR_CONSOLE
);
3142 Request
.Data
.ScrollConsoleScreenBufferRequest
.ConsoleHandle
= hConsoleOutput
;
3143 Request
.Data
.ScrollConsoleScreenBufferRequest
.Unicode
= bUnicode
;
3144 Request
.Data
.ScrollConsoleScreenBufferRequest
.ScrollRectangle
= *lpScrollRectangle
;
3146 if (lpClipRectangle
!= NULL
)
3148 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= TRUE
;
3149 Request
.Data
.ScrollConsoleScreenBufferRequest
.ClipRectangle
= *lpClipRectangle
;
3153 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= FALSE
;
3156 Request
.Data
.ScrollConsoleScreenBufferRequest
.DestinationOrigin
= dwDestinationOrigin
;
3157 Request
.Data
.ScrollConsoleScreenBufferRequest
.Fill
= *lpFill
;
3159 Status
= CsrClientCallServer(&Request
,
3162 sizeof(CSR_API_MESSAGE
));
3164 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3166 SetLastErrorByStatus(Status
);
3174 /*--------------------------------------------------------------
3175 * ScrollConsoleScreenBufferA
3181 ScrollConsoleScreenBufferA(HANDLE hConsoleOutput
,
3182 CONST SMALL_RECT
*lpScrollRectangle
,
3183 CONST SMALL_RECT
*lpClipRectangle
,
3184 COORD dwDestinationOrigin
,
3185 CONST CHAR_INFO
*lpFill
)
3187 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
3188 (PSMALL_RECT
)lpScrollRectangle
,
3189 (PSMALL_RECT
)lpClipRectangle
,
3190 dwDestinationOrigin
,
3196 /*--------------------------------------------------------------
3197 * ScrollConsoleScreenBufferW
3203 ScrollConsoleScreenBufferW(HANDLE hConsoleOutput
,
3204 CONST SMALL_RECT
*lpScrollRectangle
,
3205 CONST SMALL_RECT
*lpClipRectangle
,
3206 COORD dwDestinationOrigin
,
3207 CONST CHAR_INFO
*lpFill
)
3209 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
3212 dwDestinationOrigin
,
3218 /*--------------------------------------------------------------
3219 * SetConsoleWindowInfo
3225 SetConsoleWindowInfo(HANDLE hConsoleOutput
,
3227 CONST SMALL_RECT
*lpConsoleWindow
)
3229 DPRINT1("SetConsoleWindowInfo(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bAbsolute
, lpConsoleWindow
);
3230 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3235 /*--------------------------------------------------------------
3236 * SetConsoleTextAttribute
3242 SetConsoleTextAttribute(HANDLE hConsoleOutput
,
3245 CSR_API_MESSAGE Request
;
3249 CsrRequest
= MAKE_CSR_API(SET_ATTRIB
, CSR_CONSOLE
);
3250 Request
.Data
.SetAttribRequest
.ConsoleHandle
= hConsoleOutput
;
3251 Request
.Data
.SetAttribRequest
.Attrib
= wAttributes
;
3253 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3254 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3256 SetLastErrorByStatus(Status
);
3266 AddConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
3268 PHANDLER_ROUTINE
* NewCtrlHandlers
= NULL
;
3270 if (HandlerRoutine
== NULL
)
3272 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= TRUE
;
3276 if (NrCtrlHandlers
== NrAllocatedHandlers
)
3278 NewCtrlHandlers
= RtlAllocateHeap(RtlGetProcessHeap(),
3280 (NrCtrlHandlers
+ 4) * sizeof(PHANDLER_ROUTINE
));
3281 if (NewCtrlHandlers
== NULL
)
3283 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3287 memmove(NewCtrlHandlers
, CtrlHandlers
, sizeof(PHANDLER_ROUTINE
) * NrCtrlHandlers
);
3289 if (NrAllocatedHandlers
> 1) RtlFreeHeap(RtlGetProcessHeap(), 0, CtrlHandlers
);
3291 CtrlHandlers
= NewCtrlHandlers
;
3292 NrAllocatedHandlers
+= 4;
3295 ASSERT(NrCtrlHandlers
< NrAllocatedHandlers
);
3297 CtrlHandlers
[NrCtrlHandlers
++] = HandlerRoutine
;
3304 RemoveConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
3308 if (HandlerRoutine
== NULL
)
3310 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= FALSE
;
3314 for (i
= 0; i
< NrCtrlHandlers
; i
++)
3316 if (CtrlHandlers
[i
] == HandlerRoutine
)
3318 if (i
< (NrCtrlHandlers
- 1))
3320 memmove(&CtrlHandlers
[i
],
3322 (NrCtrlHandlers
- i
+ 1) * sizeof(PHANDLER_ROUTINE
));
3330 SetLastError(ERROR_INVALID_PARAMETER
);
3340 SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
,
3345 RtlEnterCriticalSection(&DllLock
);
3348 Ret
= AddConsoleCtrlHandler(HandlerRoutine
);
3352 Ret
= RemoveConsoleCtrlHandler(HandlerRoutine
);
3355 RtlLeaveCriticalSection(&DllLock
);
3360 /*--------------------------------------------------------------
3361 * GenerateConsoleCtrlEvent
3367 GenerateConsoleCtrlEvent(DWORD dwCtrlEvent
,
3368 DWORD dwProcessGroupId
)
3370 CSR_API_MESSAGE Request
;
3374 if (dwCtrlEvent
!= CTRL_C_EVENT
&& dwCtrlEvent
!= CTRL_BREAK_EVENT
)
3376 SetLastError(ERROR_INVALID_PARAMETER
);
3380 CsrRequest
= MAKE_CSR_API(GENERATE_CTRL_EVENT
, CSR_CONSOLE
);
3381 Request
.Data
.GenerateCtrlEvent
.Event
= dwCtrlEvent
;
3382 Request
.Data
.GenerateCtrlEvent
.ProcessGroup
= dwProcessGroupId
;
3384 Status
= CsrClientCallServer(&Request
,
3387 sizeof(CSR_API_MESSAGE
));
3388 if(!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= Request
.Status
)))
3390 SetLastErrorByStatus(Status
);
3398 /*--------------------------------------------------------------
3405 GetConsoleTitleW(LPWSTR lpConsoleTitle
,
3408 PCSR_API_MESSAGE Request
;
3412 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
3414 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_TITLE
) + CSRSS_MAX_TITLE_LENGTH
* sizeof(WCHAR
));
3415 if (Request
== NULL
)
3417 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3421 CsrRequest
= MAKE_CSR_API(GET_TITLE
, CSR_CONSOLE
);
3423 Status
= CsrClientCallServer(Request
,
3426 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_TITLE
) + CSRSS_MAX_TITLE_LENGTH
* sizeof(WCHAR
));
3427 if (!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= Request
->Status
)))
3429 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3430 SetLastErrorByStatus(Status
);
3434 if (nSize
* sizeof(WCHAR
) <= Request
->Data
.GetTitleRequest
.Length
)
3440 nSize
= Request
->Data
.GetTitleRequest
.Length
/ sizeof (WCHAR
);
3442 memcpy(lpConsoleTitle
, Request
->Data
.GetTitleRequest
.Title
, nSize
* sizeof(WCHAR
));
3443 lpConsoleTitle
[nSize
] = L
'\0';
3445 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3451 /*--------------------------------------------------------------
3460 GetConsoleTitleA(LPSTR lpConsoleTitle
,
3463 WCHAR WideTitle
[CSRSS_MAX_TITLE_LENGTH
+ 1];
3464 DWORD nWideTitle
= CSRSS_MAX_TITLE_LENGTH
+ 1;
3467 if (!lpConsoleTitle
|| !nSize
) return 0;
3468 nWideTitle
= GetConsoleTitleW((LPWSTR
) WideTitle
, nWideTitle
);
3469 if (!nWideTitle
) return 0;
3471 if ((nWritten
= WideCharToMultiByte(CP_ACP
, // ANSI code page
3472 0, // performance and mapping flags
3473 (LPWSTR
) WideTitle
, // address of wide-character string
3474 nWideTitle
, // number of characters in string
3475 lpConsoleTitle
, // address of buffer for new string
3476 nSize
- 1, // size of buffer
3480 lpConsoleTitle
[nWritten
] = '\0';
3488 /*--------------------------------------------------------------
3495 SetConsoleTitleW(LPCWSTR lpConsoleTitle
)
3497 PCSR_API_MESSAGE Request
;
3502 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
3503 max(sizeof(CSR_API_MESSAGE
),
3504 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) +
3505 min(wcslen(lpConsoleTitle
), CSRSS_MAX_TITLE_LENGTH
) * sizeof(WCHAR
)));
3506 if (Request
== NULL
)
3508 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3512 CsrRequest
= MAKE_CSR_API(SET_TITLE
, CSR_CONSOLE
);
3514 for (c
= 0; lpConsoleTitle
[c
] && c
< CSRSS_MAX_TITLE_LENGTH
; c
++)
3515 Request
->Data
.SetTitleRequest
.Title
[c
] = lpConsoleTitle
[c
];
3517 Request
->Data
.SetTitleRequest
.Length
= c
* sizeof(WCHAR
);
3518 Status
= CsrClientCallServer(Request
,
3521 max(sizeof(CSR_API_MESSAGE
),
3522 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) + c
* sizeof(WCHAR
)));
3523 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
3525 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3526 SetLastErrorByStatus(Status
);
3530 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3536 /*--------------------------------------------------------------
3545 SetConsoleTitleA(LPCSTR lpConsoleTitle
)
3547 PCSR_API_MESSAGE Request
;
3552 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
3554 max(sizeof(CSR_API_MESSAGE
),
3555 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) +
3556 min(strlen(lpConsoleTitle
), CSRSS_MAX_TITLE_LENGTH
) * sizeof(WCHAR
)));
3557 if (Request
== NULL
)
3559 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3563 CsrRequest
= MAKE_CSR_API(SET_TITLE
, CSR_CONSOLE
);
3565 for (c
= 0; lpConsoleTitle
[c
] && c
< CSRSS_MAX_TITLE_LENGTH
; c
++)
3566 Request
->Data
.SetTitleRequest
.Title
[c
] = lpConsoleTitle
[c
];
3568 Request
->Data
.SetTitleRequest
.Length
= c
* sizeof(WCHAR
);
3569 Status
= CsrClientCallServer(Request
,
3572 max(sizeof(CSR_API_MESSAGE
),
3573 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) + c
* sizeof(WCHAR
)));
3574 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
3576 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3577 SetLastErrorByStatus(Status
);
3581 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3587 /*--------------------------------------------------------------
3588 * CreateConsoleScreenBuffer
3594 CreateConsoleScreenBuffer(DWORD dwDesiredAccess
,
3596 CONST SECURITY_ATTRIBUTES
*lpSecurityAttributes
,
3598 LPVOID lpScreenBufferData
)
3600 CSR_API_MESSAGE Request
;
3604 if (dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
)
3605 || dwShareMode
& ~(FILE_SHARE_READ
| FILE_SHARE_WRITE
)
3606 || dwFlags
!= CONSOLE_TEXTMODE_BUFFER
)
3608 SetLastError(ERROR_INVALID_PARAMETER
);
3609 return INVALID_HANDLE_VALUE
;
3612 Request
.Data
.CreateScreenBufferRequest
.Access
= dwDesiredAccess
;
3613 Request
.Data
.CreateScreenBufferRequest
.ShareMode
= dwShareMode
;
3614 Request
.Data
.CreateScreenBufferRequest
.Inheritable
=
3615 lpSecurityAttributes
? lpSecurityAttributes
->bInheritHandle
: FALSE
;
3617 CsrRequest
= MAKE_CSR_API(CREATE_SCREEN_BUFFER
, CSR_CONSOLE
);
3618 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3619 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3621 SetLastErrorByStatus(Status
);
3622 return INVALID_HANDLE_VALUE
;
3624 return Request
.Data
.CreateScreenBufferRequest
.OutputHandle
;
3628 /*--------------------------------------------------------------
3637 CSR_API_MESSAGE Request
;
3641 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_CP
, CSR_CONSOLE
);
3642 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3643 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3645 SetLastErrorByStatus (Status
);
3649 return Request
.Data
.GetConsoleCodePage
.CodePage
;
3653 /*--------------------------------------------------------------
3660 SetConsoleCP(UINT wCodePageID
)
3662 CSR_API_MESSAGE Request
;
3666 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_CP
, CSR_CONSOLE
);
3667 Request
.Data
.SetConsoleCodePage
.CodePage
= wCodePageID
;
3669 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3670 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3672 SetLastErrorByStatus(Status
);
3675 return NT_SUCCESS(Status
);
3679 /*--------------------------------------------------------------
3680 * GetConsoleOutputCP
3686 GetConsoleOutputCP(VOID
)
3688 CSR_API_MESSAGE Request
;
3692 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_OUTPUT_CP
, CSR_CONSOLE
);
3693 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3694 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3696 SetLastErrorByStatus (Status
);
3700 return Request
.Data
.GetConsoleOutputCodePage
.CodePage
;
3704 /*--------------------------------------------------------------
3705 * SetConsoleOutputCP
3711 SetConsoleOutputCP(UINT wCodePageID
)
3713 CSR_API_MESSAGE Request
;
3717 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_OUTPUT_CP
, CSR_CONSOLE
);
3718 Request
.Data
.SetConsoleOutputCodePage
.CodePage
= wCodePageID
;
3719 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3720 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3722 SetLastErrorByStatus(Status
);
3725 return NT_SUCCESS(Status
);
3729 /*--------------------------------------------------------------
3730 * GetConsoleProcessList
3736 GetConsoleProcessList(LPDWORD lpdwProcessList
,
3737 DWORD dwProcessCount
)
3739 PCSR_API_MESSAGE Request
;
3744 if (lpdwProcessList
== NULL
|| dwProcessCount
== 0)
3746 SetLastError(ERROR_INVALID_PARAMETER
);
3750 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
3752 max(sizeof(CSR_API_MESSAGE
),
3753 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST
)
3754 + min (dwProcessCount
, CSRSS_MAX_GET_PROCESS_LIST
/ sizeof(DWORD
)) * sizeof(DWORD
)));
3755 if (Request
== NULL
)
3757 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3761 CsrRequest
= MAKE_CSR_API(GET_PROCESS_LIST
, CSR_CONSOLE
);
3762 Request
->Data
.GetProcessListRequest
.nMaxIds
= min (dwProcessCount
, CSRSS_MAX_GET_PROCESS_LIST
/ sizeof(DWORD
));
3764 Status
= CsrClientCallServer(Request
,
3767 max(sizeof(CSR_API_MESSAGE
),
3768 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST
)
3769 + Request
->Data
.GetProcessListRequest
.nMaxIds
* sizeof(DWORD
)));
3770 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
3772 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3773 SetLastErrorByStatus (Status
);
3778 nProcesses
= Request
->Data
.GetProcessListRequest
.nProcessIdsCopied
;
3779 if (dwProcessCount
>= nProcesses
)
3781 memcpy(lpdwProcessList
, Request
->Data
.GetProcessListRequest
.ProcessId
, nProcesses
* sizeof(DWORD
));
3785 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3792 /*--------------------------------------------------------------
3793 * GetConsoleSelectionInfo
3799 GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo
)
3801 DPRINT1("GetConsoleSelectionInfo(0x%x) UNIMPLEMENTED!\n", lpConsoleSelectionInfo
);
3802 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3808 /*--------------------------------------------------------------
3815 AttachConsole(DWORD dwProcessId
)
3817 DPRINT1("AttachConsole(0x%x) UNIMPLEMENTED!\n", dwProcessId
);
3821 /*--------------------------------------------------------------
3828 GetConsoleWindow(VOID
)
3830 CSR_API_MESSAGE Request
;
3834 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_WINDOW
, CSR_CONSOLE
);
3835 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3836 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3838 SetLastErrorByStatus(Status
);
3842 return Request
.Data
.GetConsoleWindowRequest
.WindowHandle
;
3846 /*--------------------------------------------------------------
3853 SetConsoleIcon(HICON hicon
)
3855 CSR_API_MESSAGE Request
;
3859 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_ICON
, CSR_CONSOLE
);
3860 Request
.Data
.SetConsoleIconRequest
.WindowIcon
= hicon
;
3862 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3863 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3865 SetLastErrorByStatus(Status
);
3869 return NT_SUCCESS(Status
);
3873 /******************************************************************************
3874 * \name SetConsoleInputExeNameW
3875 * \brief Sets the console input file name from a unicode string.
3876 * \param lpInputExeName Pointer to a unicode string with the name.
3877 * \return TRUE if successful, FALSE if unsuccsedful.
3878 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
3879 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
3883 SetConsoleInputExeNameW(LPCWSTR lpInputExeName
)
3888 || (lenName
= lstrlenW(lpInputExeName
)) == 0
3889 || lenName
> INPUTEXENAME_BUFLEN
- 1)
3891 /* Fail if string is empty or too long */
3892 SetLastError(ERROR_INVALID_PARAMETER
);
3896 RtlEnterCriticalSection(&ConsoleLock
);
3899 RtlCopyMemory(InputExeName
, lpInputExeName
, lenName
* sizeof(WCHAR
));
3900 InputExeName
[lenName
] = L
'\0';
3904 RtlLeaveCriticalSection(&ConsoleLock
);
3912 /******************************************************************************
3913 * \name SetConsoleInputExeNameA
3914 * \brief Sets the console input file name from an ansi string.
3915 * \param lpInputExeName Pointer to an ansi string with the name.
3916 * \return TRUE if successful, FALSE if unsuccsedful.
3917 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
3918 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
3922 SetConsoleInputExeNameA(LPCSTR lpInputExeName
)
3924 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
3925 ANSI_STRING InputExeNameA
;
3926 UNICODE_STRING InputExeNameU
;
3930 RtlInitAnsiString(&InputExeNameA
, lpInputExeName
);
3932 if(InputExeNameA
.Length
== 0 ||
3933 InputExeNameA
.Length
> INPUTEXENAME_BUFLEN
- 1)
3935 /* Fail if string is empty or too long */
3936 SetLastError(ERROR_INVALID_PARAMETER
);
3940 InputExeNameU
.Buffer
= Buffer
;
3941 InputExeNameU
.MaximumLength
= sizeof(Buffer
);
3942 InputExeNameU
.Length
= 0;
3943 Status
= RtlAnsiStringToUnicodeString(&InputExeNameU
, &InputExeNameA
, FALSE
);
3944 if(NT_SUCCESS(Status
))
3946 Ret
= SetConsoleInputExeNameW(InputExeNameU
.Buffer
);
3950 SetLastErrorByStatus(Status
);
3958 /******************************************************************************
3959 * \name GetConsoleInputExeNameW
3960 * \brief Retrieves the console input file name as unicode string.
3961 * \param nBufferLength Length of the buffer in WCHARs.
3962 * Specify 0 to recieve the needed buffer length.
3963 * \param lpBuffer Pointer to a buffer that recieves the string.
3964 * \return Needed buffer size if \p nBufferLength is 0.
3965 * Otherwise 1 if successful, 2 if buffer is too small.
3966 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
3967 * is not big enough.
3971 GetConsoleInputExeNameW(DWORD nBufferLength
, LPWSTR lpBuffer
)
3973 int lenName
= lstrlenW(InputExeName
);
3975 if (nBufferLength
== 0)
3977 /* Buffer size is requested, return it */
3981 if(lenName
+ 1 > nBufferLength
)
3983 /* Buffer is not large enough! */
3984 SetLastError(ERROR_BUFFER_OVERFLOW
);
3988 RtlEnterCriticalSection(&ConsoleLock
);
3991 RtlCopyMemory(lpBuffer
, InputExeName
, lenName
* sizeof(WCHAR
));
3992 lpBuffer
[lenName
] = '\0';
3996 RtlLeaveCriticalSection(&ConsoleLock
);
4000 /* Success, return 1 */
4005 /******************************************************************************
4006 * \name GetConsoleInputExeNameA
4007 * \brief Retrieves the console input file name as ansi string.
4008 * \param nBufferLength Length of the buffer in CHARs.
4009 * \param lpBuffer Pointer to a buffer that recieves the string.
4010 * \return 1 if successful, 2 if buffer is too small.
4011 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
4012 * is not big enough. The buffer recieves as much characters as fit.
4016 GetConsoleInputExeNameA(DWORD nBufferLength
, LPSTR lpBuffer
)
4018 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
4020 UNICODE_STRING BufferU
;
4021 ANSI_STRING BufferA
;
4023 /* Get the unicode name */
4024 Ret
= GetConsoleInputExeNameW(sizeof(Buffer
) / sizeof(Buffer
[0]), Buffer
);
4026 /* Initialize strings for conversion */
4027 RtlInitUnicodeString(&BufferU
, Buffer
);
4029 BufferA
.MaximumLength
= nBufferLength
;
4030 BufferA
.Buffer
= lpBuffer
;
4032 /* Convert unicode name to ansi, copying as much chars as fit */
4033 RtlUnicodeStringToAnsiString(&BufferA
, &BufferU
, FALSE
);
4035 /* Error handling */
4036 if(nBufferLength
<= BufferU
.Length
/ sizeof(WCHAR
))
4038 SetLastError(ERROR_BUFFER_OVERFLOW
);
4046 /*--------------------------------------------------------------
4047 * GetConsoleHistoryInfo
4053 GetConsoleHistoryInfo(PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo
)
4055 DPRINT1("GetConsoleHistoryInfo(0x%p) UNIMPLEMENTED!\n", lpConsoleHistoryInfo
);
4056 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4061 /*--------------------------------------------------------------
4062 * SetConsoleHistoryInfo
4068 SetConsoleHistoryInfo(IN PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo
)
4070 DPRINT1("SetConsoleHistoryInfo(0x%p) UNIMPLEMENTED!\n", lpConsoleHistoryInfo
);
4071 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4076 /*--------------------------------------------------------------
4077 * GetConsoleOriginalTitleW
4083 GetConsoleOriginalTitleW(OUT LPWSTR lpConsoleTitle
,
4086 DPRINT1("GetConsoleOriginalTitleW(0x%p, 0x%x) UNIMPLEMENTED!\n", lpConsoleTitle
, nSize
);
4087 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4092 /*--------------------------------------------------------------
4093 * GetConsoleOriginalTitleA
4099 GetConsoleOriginalTitleA(OUT LPSTR lpConsoleTitle
,
4102 DPRINT1("GetConsoleOriginalTitleA(0x%p, 0x%x) UNIMPLEMENTED!\n", lpConsoleTitle
, nSize
);
4103 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4108 /*--------------------------------------------------------------
4109 * GetConsoleScreenBufferInfoEx
4115 GetConsoleScreenBufferInfoEx(IN HANDLE hConsoleOutput
,
4116 OUT PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx
)
4118 DPRINT1("GetConsoleScreenBufferInfoEx(0x%p, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput
, lpConsoleScreenBufferInfoEx
);
4119 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4124 /*--------------------------------------------------------------
4125 * SetConsoleScreenBufferInfoEx
4131 SetConsoleScreenBufferInfoEx(IN HANDLE hConsoleOutput
,
4132 IN PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx
)
4134 DPRINT1("SetConsoleScreenBufferInfoEx(0x%p, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput
, lpConsoleScreenBufferInfoEx
);
4135 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4140 /*--------------------------------------------------------------
4141 * GetCurrentConsoleFontEx
4147 GetCurrentConsoleFontEx(IN HANDLE hConsoleOutput
,
4148 IN BOOL bMaximumWindow
,
4149 OUT PCONSOLE_FONT_INFOEX lpConsoleCurrentFontEx
)
4151 DPRINT1("GetCurrentConsoleFontEx(0x%p, 0x%x, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput
, bMaximumWindow
, lpConsoleCurrentFontEx
);
4152 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);