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
)
42 DPRINT("Default handler called: %lx\n", Event
);
46 DPRINT("Ctrl-C Event\n");
49 case CTRL_BREAK_EVENT
:
50 DPRINT("Ctrl-Break Event\n");
53 case CTRL_SHUTDOWN_EVENT
:
54 DPRINT("Ctrl Shutdown Event\n");
57 case CTRL_CLOSE_EVENT
:
58 DPRINT("Ctrl Close Event\n");
61 case CTRL_LOGOFF_EVENT
:
62 DPRINT("Ctrl Logoff Event\n");
66 ExitProcess(CONTROL_C_EXIT
);
73 ConsoleControlDispatcher(DWORD CodeAndFlag
)
76 DWORD nCode
= CodeAndFlag
& MAXLONG
;
78 EXCEPTION_RECORD erException
;
80 DPRINT("Console Dispatcher Active: %lx %lx\n", CodeAndFlag
, nCode
);
81 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST
);
86 case CTRL_BREAK_EVENT
:
88 if (IsDebuggerPresent())
90 erException
.ExceptionCode
= (nCode
== CTRL_C_EVENT
?
91 DBG_CONTROL_C
: DBG_CONTROL_BREAK
);
92 erException
.ExceptionFlags
= 0;
93 erException
.ExceptionRecord
= NULL
;
94 erException
.ExceptionAddress
= DefaultConsoleCtrlHandler
;
95 erException
.NumberParameters
= 0;
99 RtlRaiseException(&erException
);
101 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
103 RtlEnterCriticalSection(&ConsoleLock
);
105 if ((nCode
!= CTRL_C_EVENT
) ||
106 (NtCurrentPeb()->ProcessParameters
->ConsoleFlags
!= 1))
108 for (i
= NrCtrlHandlers
; i
> 0; i
--)
110 if (CtrlHandlers
[i
- 1](nCode
)) break;
114 RtlLeaveCriticalSection(&ConsoleLock
);
124 case CTRL_CLOSE_EVENT
:
125 case CTRL_LOGOFF_EVENT
:
126 case CTRL_SHUTDOWN_EVENT
:
136 ExitProcess(CONTROL_C_EXIT
);
145 ASSERT(ConsoleInitialized
);
147 RtlEnterCriticalSection(&ConsoleLock
);
149 if ((nCode
!= CTRL_C_EVENT
) || (NtCurrentPeb()->ProcessParameters
->ConsoleFlags
!= 1))
151 for (i
= NrCtrlHandlers
; i
> 0; i
--)
154 (CodeAndFlag
& MINLONG
) &&
155 ((nCode
== CTRL_LOGOFF_EVENT
) || (nCode
== CTRL_SHUTDOWN_EVENT
)))
157 DPRINT("Skipping system/service apps\n");
161 if (CtrlHandlers
[i
- 1](nCode
))
165 case CTRL_CLOSE_EVENT
:
166 case CTRL_LOGOFF_EVENT
:
167 case CTRL_SHUTDOWN_EVENT
:
169 nExitCode
= CodeAndFlag
;
177 RtlLeaveCriticalSection(&ConsoleLock
);
178 ExitThread(nExitCode
);
182 /* FUNCTIONS *****************************************************************/
189 AddConsoleAliasA(LPCSTR lpSource
,
193 LPWSTR lpSourceW
= NULL
;
194 LPWSTR lpTargetW
= NULL
;
195 LPWSTR lpExeNameW
= NULL
;
199 BasepAnsiStringToHeapUnicodeString(lpSource
, (LPWSTR
*) &lpSourceW
);
201 BasepAnsiStringToHeapUnicodeString(lpTarget
, (LPWSTR
*) &lpTargetW
);
203 BasepAnsiStringToHeapUnicodeString(lpExeName
, (LPWSTR
*) &lpExeNameW
);
205 bRetVal
= AddConsoleAliasW(lpSourceW
, lpTargetW
, lpExeNameW
);
209 RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR
*) lpSourceW
);
211 RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR
*) lpTargetW
);
213 RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR
*) lpExeNameW
);
224 AddConsoleAliasW(LPCWSTR lpSource
,
228 PCSR_API_MESSAGE Request
;
232 ULONG TargetLength
= 0;
238 DPRINT("AddConsoleAliasW enterd with lpSource %S lpTarget %S lpExeName %S\n", lpSource
, lpTarget
, lpExeName
);
240 ExeLength
= wcslen(lpExeName
) + 1;
241 SourceLength
= wcslen(lpSource
)+ 1;
243 TargetLength
= wcslen(lpTarget
) + 1;
245 Size
= (ExeLength
+ SourceLength
+ TargetLength
) * sizeof(WCHAR
);
246 RequestLength
= sizeof(CSR_API_MESSAGE
) + Size
;
248 Request
= RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY
, RequestLength
);
249 Ptr
= (WCHAR
*)(((ULONG_PTR
)Request
) + sizeof(CSR_API_MESSAGE
));
251 wcscpy(Ptr
, lpSource
);
252 Request
->Data
.AddConsoleAlias
.SourceLength
= SourceLength
;
253 Ptr
= (WCHAR
*)(((ULONG_PTR
)Request
) + sizeof(CSR_API_MESSAGE
) + SourceLength
* sizeof(WCHAR
));
255 wcscpy(Ptr
, lpExeName
);
256 Request
->Data
.AddConsoleAlias
.ExeLength
= ExeLength
;
257 Ptr
= (WCHAR
*)(((ULONG_PTR
)Request
) + sizeof(CSR_API_MESSAGE
) + (ExeLength
+ SourceLength
)* sizeof(WCHAR
));
259 if (lpTarget
) /* target can be optional */
260 wcscpy(Ptr
, lpTarget
);
262 Request
->Data
.AddConsoleAlias
.TargetLength
= TargetLength
;
264 CsrRequest
= MAKE_CSR_API(ADD_CONSOLE_ALIAS
, CSR_CONSOLE
);
265 Status
= CsrClientCallServer(Request
,
270 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
272 SetLastErrorByStatus(Status
);
273 RtlFreeHeap(GetProcessHeap(), 0, Request
);
277 RtlFreeHeap(GetProcessHeap(), 0, Request
);
283 * @unimplemented (Undocumented)
287 ConsoleMenuControl(HANDLE hConsole
,
291 DPRINT1("ConsoleMenuControl(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsole
, Unknown1
, Unknown2
);
292 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
302 DuplicateConsoleHandle(HANDLE hConsole
,
303 DWORD dwDesiredAccess
,
307 CSR_API_MESSAGE Request
;
311 if (dwOptions
& ~(DUPLICATE_CLOSE_SOURCE
| DUPLICATE_SAME_ACCESS
)
312 || (!(dwOptions
& DUPLICATE_SAME_ACCESS
)
313 && dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
)))
315 SetLastError (ERROR_INVALID_PARAMETER
);
316 return INVALID_HANDLE_VALUE
;
319 CsrRequest
= MAKE_CSR_API(DUPLICATE_HANDLE
, CSR_NATIVE
);
320 Request
.Data
.DuplicateHandleRequest
.Handle
= hConsole
;
321 Request
.Data
.DuplicateHandleRequest
.Access
= dwDesiredAccess
;
322 Request
.Data
.DuplicateHandleRequest
.Inheritable
= bInheritHandle
;
323 Request
.Data
.DuplicateHandleRequest
.Options
= dwOptions
;
325 Status
= CsrClientCallServer(&Request
,
328 sizeof(CSR_API_MESSAGE
));
329 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
=Request
.Status
))
331 SetLastErrorByStatus(Status
);
332 return INVALID_HANDLE_VALUE
;
335 return Request
.Data
.DuplicateHandleRequest
.Handle
;
340 * @unimplemented (Undocumented)
344 ExpungeConsoleCommandHistoryW(DWORD Unknown0
)
346 DPRINT1("ExpungeConsoleCommandHistoryW(0x%x) UNIMPLEMENTED!\n", Unknown0
);
347 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
353 * @unimplemented (Undocumented)
357 ExpungeConsoleCommandHistoryA (DWORD Unknown0
)
359 DPRINT1("ExpungeConsoleCommandHistoryW(0x%x) UNIMPLEMENTED!\n", Unknown0
);
360 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
370 GetConsoleAliasW(LPWSTR lpSource
,
371 LPWSTR lpTargetBuffer
,
372 DWORD TargetBufferLength
,
375 PCSR_API_MESSAGE Request
;
376 PCSR_CAPTURE_BUFFER CaptureBuffer
;
385 DPRINT("GetConsoleAliasW entered lpSource %S lpExeName %S\n", lpSource
, lpExeName
);
387 if (lpTargetBuffer
== NULL
)
389 SetLastError(ERROR_INVALID_PARAMETER
);
393 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_ALIAS
, CSR_CONSOLE
);
395 ExeLength
= wcslen(lpExeName
) + 1;
396 SourceLength
= wcslen(lpSource
) + 1;
398 Size
= (ExeLength
+ SourceLength
) * sizeof(WCHAR
);
400 RequestLength
= Size
+ sizeof(CSR_API_MESSAGE
);
401 Request
= RtlAllocateHeap(GetProcessHeap(), 0, RequestLength
);
404 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
408 CaptureBuffer
= CsrAllocateCaptureBuffer(1, TargetBufferLength
);
411 RtlFreeHeap(GetProcessHeap(), 0, Request
);
412 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
416 Request
->Data
.GetConsoleAlias
.TargetBuffer
= NULL
;
418 CsrCaptureMessageBuffer(CaptureBuffer
,
421 (PVOID
*)&Request
->Data
.GetConsoleAlias
.TargetBuffer
);
423 Request
->Data
.GetConsoleAlias
.TargetBufferLength
= TargetBufferLength
;
425 Ptr
= (LPWSTR
)((ULONG_PTR
)Request
+ sizeof(CSR_API_MESSAGE
));
426 wcscpy(Ptr
, lpSource
);
428 wcscpy(Ptr
, lpExeName
);
430 Request
->Data
.GetConsoleAlias
.ExeLength
= ExeLength
;
431 Request
->Data
.GetConsoleAlias
.SourceLength
= SourceLength
;
433 Status
= CsrClientCallServer(Request
,
436 sizeof(CSR_API_MESSAGE
) + Size
);
438 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
440 RtlFreeHeap(GetProcessHeap(), 0, Request
);
441 CsrFreeCaptureBuffer(CaptureBuffer
);
442 SetLastErrorByStatus(Status
);
446 wcscpy(lpTargetBuffer
, Request
->Data
.GetConsoleAlias
.TargetBuffer
);
447 RtlFreeHeap(GetProcessHeap(), 0, Request
);
448 CsrFreeCaptureBuffer(CaptureBuffer
);
450 return Request
->Data
.GetConsoleAlias
.BytesWritten
;
459 GetConsoleAliasA(LPSTR lpSource
,
460 LPSTR lpTargetBuffer
,
461 DWORD TargetBufferLength
,
466 LPWSTR lpwTargetBuffer
;
471 DPRINT("GetConsoleAliasA entered\n");
473 if (lpTargetBuffer
== NULL
)
475 SetLastError(ERROR_INVALID_PARAMETER
);
479 dwSourceSize
= (strlen(lpSource
)+1) * sizeof(WCHAR
);
480 lpwSource
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwSourceSize
);
481 if (lpwSource
== NULL
)
483 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
486 MultiByteToWideChar(CP_ACP
, 0, lpSource
, -1, lpwSource
, dwSourceSize
);
488 dwExeNameSize
= (strlen(lpExeName
)+1) * sizeof(WCHAR
);
489 lpwExeName
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwExeNameSize
);
490 if (lpwExeName
== NULL
)
492 HeapFree(GetProcessHeap(), 0, lpwSource
);
493 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
496 MultiByteToWideChar(CP_ACP
, 0, lpExeName
, -1, lpwExeName
, dwExeNameSize
);
498 lpwTargetBuffer
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, TargetBufferLength
* sizeof(WCHAR
));
499 if (lpwTargetBuffer
== NULL
)
501 HeapFree(GetProcessHeap(), 0, lpwSource
);
502 HeapFree(GetProcessHeap(), 0, lpwExeName
);
503 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
507 dwResult
= GetConsoleAliasW(lpwSource
, lpwTargetBuffer
, TargetBufferLength
* sizeof(WCHAR
), lpwExeName
);
509 HeapFree(GetProcessHeap(), 0, lpwSource
);
510 HeapFree(GetProcessHeap(), 0, lpwExeName
);
513 dwResult
= WideCharToMultiByte(CP_ACP
, 0, lpwTargetBuffer
, dwResult
/ sizeof(WCHAR
), lpTargetBuffer
, TargetBufferLength
, NULL
, NULL
);
515 HeapFree(GetProcessHeap(), 0, lpwTargetBuffer
);
526 GetConsoleAliasExesW(LPWSTR lpExeNameBuffer
,
527 DWORD ExeNameBufferLength
)
529 CSR_API_MESSAGE Request
;
530 PCSR_CAPTURE_BUFFER CaptureBuffer
;
534 DPRINT("GetConsoleAliasExesW entered\n");
536 CaptureBuffer
= CsrAllocateCaptureBuffer(1, ExeNameBufferLength
);
539 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
543 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_ALIASES_EXES
, CSR_CONSOLE
);
544 CsrAllocateMessagePointer(CaptureBuffer
,
546 (PVOID
*)&Request
.Data
.GetConsoleAliasesExes
.ExeNames
);
547 Request
.Data
.GetConsoleAliasesExes
.Length
= ExeNameBufferLength
;
549 Status
= CsrClientCallServer(&Request
,
552 sizeof(CSR_API_MESSAGE
));
554 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
556 SetLastErrorByStatus(Status
);
557 CsrFreeCaptureBuffer(CaptureBuffer
);
561 memcpy(lpExeNameBuffer
,
562 Request
.Data
.GetConsoleAliasesExes
.ExeNames
,
563 Request
.Data
.GetConsoleAliasesExes
.BytesWritten
);
565 CsrFreeCaptureBuffer(CaptureBuffer
);
566 return Request
.Data
.GetConsoleAliasesExes
.BytesWritten
;
575 GetConsoleAliasExesA(LPSTR lpExeNameBuffer
,
576 DWORD ExeNameBufferLength
)
578 LPWSTR lpwExeNameBuffer
;
581 DPRINT("GetConsoleAliasExesA entered\n");
583 lpwExeNameBuffer
= HeapAlloc(GetProcessHeap(), 0, ExeNameBufferLength
* sizeof(WCHAR
));
585 dwResult
= GetConsoleAliasExesW(lpwExeNameBuffer
, ExeNameBufferLength
* sizeof(WCHAR
));
588 dwResult
= WideCharToMultiByte(CP_ACP
, 0, lpwExeNameBuffer
, dwResult
/ sizeof(WCHAR
), lpExeNameBuffer
, ExeNameBufferLength
, NULL
, NULL
);
590 HeapFree(GetProcessHeap(), 0, lpwExeNameBuffer
);
599 GetConsoleAliasExesLengthW(VOID
)
601 CSR_API_MESSAGE Request
;
605 DPRINT("GetConsoleAliasExesLengthW entered\n");
607 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_ALIASES_EXES_LENGTH
, CSR_CONSOLE
);
608 Request
.Data
.GetConsoleAliasesExesLength
.Length
= 0;
611 Status
= CsrClientCallServer(&Request
,
614 sizeof(CSR_API_MESSAGE
));
616 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
618 SetLastErrorByStatus(Status
);
622 return Request
.Data
.GetConsoleAliasesExesLength
.Length
;
630 GetConsoleAliasExesLengthA(VOID
)
634 DPRINT("GetConsoleAliasExesLengthA entered\n");
636 dwLength
= GetConsoleAliasExesLengthW();
639 dwLength
/= sizeof(WCHAR
);
650 GetConsoleAliasesW(LPWSTR AliasBuffer
,
651 DWORD AliasBufferLength
,
654 CSR_API_MESSAGE Request
;
659 DPRINT("GetConsoleAliasesW entered\n");
661 dwLength
= GetConsoleAliasesLengthW(ExeName
);
662 if (!dwLength
|| dwLength
> AliasBufferLength
)
665 CsrRequest
= MAKE_CSR_API(GET_ALL_CONSOLE_ALIASES
, CSR_CONSOLE
);
666 Request
.Data
.GetAllConsoleAlias
.AliasBuffer
= AliasBuffer
;
667 Request
.Data
.GetAllConsoleAlias
.AliasBufferLength
= AliasBufferLength
;
668 Request
.Data
.GetAllConsoleAlias
.lpExeName
= ExeName
;
670 Status
= CsrClientCallServer(&Request
,
673 sizeof(CSR_API_MESSAGE
));
675 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
677 SetLastErrorByStatus(Status
);
681 return Request
.Data
.GetAllConsoleAlias
.BytesWritten
/ sizeof(WCHAR
);
690 GetConsoleAliasesA(LPSTR AliasBuffer
,
691 DWORD AliasBufferLength
,
695 LPWSTR lpwExeName
= NULL
;
696 LPWSTR lpwAliasBuffer
;
698 DPRINT("GetConsoleAliasesA entered\n");
701 BasepAnsiStringToHeapUnicodeString(ExeName
, (LPWSTR
*) &lpwExeName
);
703 lpwAliasBuffer
= HeapAlloc(GetProcessHeap(), 0, AliasBufferLength
* sizeof(WCHAR
));
705 dwRetVal
= GetConsoleAliasesW(lpwAliasBuffer
, AliasBufferLength
, lpwExeName
);
708 RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR
*) lpwExeName
);
711 dwRetVal
= WideCharToMultiByte(CP_ACP
, 0, lpwAliasBuffer
, dwRetVal
, AliasBuffer
, AliasBufferLength
, NULL
, NULL
);
713 HeapFree(GetProcessHeap(), 0, lpwAliasBuffer
);
723 GetConsoleAliasesLengthW(LPWSTR lpExeName
)
725 CSR_API_MESSAGE Request
;
729 DPRINT("GetConsoleAliasesLengthW entered\n");
731 CsrRequest
= MAKE_CSR_API(GET_ALL_CONSOLE_ALIASES_LENGTH
, CSR_CONSOLE
);
732 Request
.Data
.GetAllConsoleAliasesLength
.lpExeName
= lpExeName
;
733 Request
.Data
.GetAllConsoleAliasesLength
.Length
= 0;
735 Status
= CsrClientCallServer(&Request
,
738 sizeof(CSR_API_MESSAGE
));
740 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
742 SetLastErrorByStatus(Status
);
746 return Request
.Data
.GetAllConsoleAliasesLength
.Length
;
755 GetConsoleAliasesLengthA(LPSTR lpExeName
)
758 LPWSTR lpExeNameW
= NULL
;
761 BasepAnsiStringToHeapUnicodeString(lpExeName
, (LPWSTR
*) &lpExeNameW
);
763 dwRetVal
= GetConsoleAliasesLengthW(lpExeNameW
);
765 dwRetVal
/= sizeof(WCHAR
);
769 RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR
*) lpExeNameW
);
776 * @unimplemented (Undocumented)
780 GetConsoleCommandHistoryW(DWORD Unknown0
,
784 DPRINT1("GetConsoleCommandHistoryW(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
);
785 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
791 * @unimplemented (Undocumented)
795 GetConsoleCommandHistoryA(DWORD Unknown0
,
799 DPRINT1("GetConsoleCommandHistoryA(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
);
800 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
806 * @unimplemented (Undocumented)
810 GetConsoleCommandHistoryLengthW(DWORD Unknown0
)
812 DPRINT1("GetConsoleCommandHistoryLengthW(0x%x) UNIMPLEMENTED!\n", Unknown0
);
813 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
819 * @unimplemented (Undocumented)
823 GetConsoleCommandHistoryLengthA(DWORD Unknown0
)
825 DPRINT1("GetConsoleCommandHistoryLengthA(0x%x) UNIMPLEMENTED!\n", Unknown0
);
826 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
835 GetConsoleDisplayMode(LPDWORD lpdwMode
)
837 * FUNCTION: Get the console display mode
839 * lpdwMode - Address of variable that receives the current value
841 * STATUS: Undocumented
844 DPRINT1("GetConsoleDisplayMode(0x%x) UNIMPLEMENTED!\n", lpdwMode
);
845 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
851 * @unimplemented (Undocumented)
855 GetConsoleFontInfo(DWORD Unknown0
,
860 DPRINT1("GetConsoleFontInfo(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
861 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
871 GetConsoleFontSize(HANDLE hConsoleOutput
,
874 COORD Empty
= {0, 0};
875 DPRINT1("GetConsoleFontSize(0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, nFont
);
876 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
882 * @implemented (Undocumented)
886 GetConsoleHardwareState(HANDLE hConsole
,
890 CSR_API_MESSAGE Request
;
894 CsrRequest
= MAKE_CSR_API(SETGET_CONSOLE_HW_STATE
, CSR_CONSOLE
);
895 Request
.Data
.ConsoleHardwareStateRequest
.ConsoleHandle
= hConsole
;
896 Request
.Data
.ConsoleHardwareStateRequest
.SetGet
= CONSOLE_HARDWARE_STATE_GET
;
898 Status
= CsrClientCallServer(&Request
,
901 sizeof(CSR_API_MESSAGE
));
902 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
904 SetLastErrorByStatus(Status
);
908 *State
= Request
.Data
.ConsoleHardwareStateRequest
.State
;
914 * @implemented (Undocumented)
918 GetConsoleInputWaitHandle(VOID
)
920 CSR_API_MESSAGE Request
;
924 CsrRequest
= MAKE_CSR_API(GET_INPUT_WAIT_HANDLE
, CSR_CONSOLE
);
926 Status
= CsrClientCallServer(&Request
,
929 sizeof(CSR_API_MESSAGE
));
930 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
932 SetLastErrorByStatus(Status
);
936 return Request
.Data
.GetConsoleInputWaitHandle
.InputWaitHandle
;
945 GetCurrentConsoleFont(HANDLE hConsoleOutput
,
947 PCONSOLE_FONT_INFO lpConsoleCurrentFont
)
949 DPRINT1("GetCurrentConsoleFont(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bMaximumWindow
, lpConsoleCurrentFont
);
950 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
956 * @unimplemented (Undocumented)
960 GetNumberOfConsoleFonts(VOID
)
962 DPRINT1("GetNumberOfConsoleFonts() UNIMPLEMENTED!\n");
963 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
964 return 1; /* FIXME: call csrss.exe */
969 * @unimplemented (Undocumented)
973 InvalidateConsoleDIBits(DWORD Unknown0
,
976 DPRINT1("InvalidateConsoleDIBits(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
977 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
983 * @unimplemented (Undocumented)
987 OpenConsoleW(LPCWSTR wsName
,
988 DWORD dwDesiredAccess
,
992 CSR_API_MESSAGE Request
;
994 NTSTATUS Status
= STATUS_SUCCESS
;
996 if (wsName
&& 0 == _wcsicmp(wsName
, L
"CONIN$"))
998 CsrRequest
= MAKE_CSR_API(GET_INPUT_HANDLE
, CSR_NATIVE
);
1000 else if (wsName
&& 0 == _wcsicmp(wsName
, L
"CONOUT$"))
1002 CsrRequest
= MAKE_CSR_API(GET_OUTPUT_HANDLE
, CSR_NATIVE
);
1006 SetLastError(ERROR_INVALID_PARAMETER
);
1007 return(INVALID_HANDLE_VALUE
);
1010 if (dwDesiredAccess
& ~(GENERIC_READ
|GENERIC_WRITE
))
1012 SetLastError(ERROR_INVALID_PARAMETER
);
1013 return(INVALID_HANDLE_VALUE
);
1016 if (dwShareMode
& ~(FILE_SHARE_READ
|FILE_SHARE_WRITE
))
1018 SetLastError(ERROR_INVALID_PARAMETER
);
1019 return(INVALID_HANDLE_VALUE
);
1022 /* Structures for GET_INPUT_HANDLE and GET_OUTPUT_HANDLE requests are identical */
1023 Request
.Data
.GetInputHandleRequest
.Access
= dwDesiredAccess
;
1024 Request
.Data
.GetInputHandleRequest
.Inheritable
= bInheritHandle
;
1025 Request
.Data
.GetInputHandleRequest
.ShareMode
= dwShareMode
;
1027 Status
= CsrClientCallServer(&Request
,
1030 sizeof(CSR_API_MESSAGE
));
1031 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1033 SetLastErrorByStatus(Status
);
1034 return INVALID_HANDLE_VALUE
;
1037 return Request
.Data
.GetInputHandleRequest
.Handle
;
1042 * @unimplemented (Undocumented)
1046 SetConsoleCommandHistoryMode(DWORD dwMode
)
1048 DPRINT1("SetConsoleCommandHistoryMode(0x%x) UNIMPLEMENTED!\n", dwMode
);
1049 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1055 * @unimplemented (Undocumented)
1059 SetConsoleCursor(DWORD Unknown0
,
1062 DPRINT1("SetConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1063 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1073 SetConsoleDisplayMode(HANDLE hOut
,
1077 * FUNCTION: Set the console display mode.
1079 * hOut - Standard output handle.
1080 * dwNewMode - New mode.
1081 * lpdwOldMode - Address of a variable that receives the old mode.
1084 DPRINT1("SetConsoleDisplayMode(0x%x, 0x%x, 0x%p) UNIMPLEMENTED!\n", hOut
, dwNewMode
, lpdwOldMode
);
1085 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1091 * @unimplemented (Undocumented)
1095 SetConsoleFont(DWORD Unknown0
,
1098 DPRINT1("SetConsoleFont(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1099 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1105 * @implemented (Undocumented)
1109 SetConsoleHardwareState(HANDLE hConsole
,
1113 CSR_API_MESSAGE Request
;
1117 CsrRequest
= MAKE_CSR_API(SETGET_CONSOLE_HW_STATE
, CSR_CONSOLE
);
1118 Request
.Data
.ConsoleHardwareStateRequest
.ConsoleHandle
= hConsole
;
1119 Request
.Data
.ConsoleHardwareStateRequest
.SetGet
= CONSOLE_HARDWARE_STATE_SET
;
1120 Request
.Data
.ConsoleHardwareStateRequest
.State
= State
;
1122 Status
= CsrClientCallServer(&Request
,
1125 sizeof(CSR_API_MESSAGE
));
1126 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1128 SetLastErrorByStatus(Status
);
1137 * @unimplemented (Undocumented)
1141 SetConsoleKeyShortcuts(DWORD Unknown0
,
1146 DPRINT1("SetConsoleKeyShortcuts(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
1147 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1153 * @unimplemented (Undocumented)
1157 SetConsoleMaximumWindowSize(DWORD Unknown0
,
1160 DPRINT1("SetConsoleMaximumWindowSize(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1161 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1167 * @unimplemented (Undocumented)
1171 SetConsoleMenuClose(DWORD Unknown0
)
1173 DPRINT1("SetConsoleMenuClose(0x%x) UNIMPLEMENTED!\n", Unknown0
);
1174 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1180 * @unimplemented (Undocumented)
1184 SetConsoleNumberOfCommandsA(DWORD Unknown0
,
1187 DPRINT1("SetConsoleNumberOfCommandsA(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1188 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1194 * @unimplemented (Undocumented)
1198 SetConsoleNumberOfCommandsW(DWORD Unknown0
,
1201 DPRINT1("SetConsoleNumberOfCommandsW(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1202 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1208 * @unimplemented (Undocumented)
1212 SetConsolePalette(DWORD Unknown0
,
1216 DPRINT1("SetConsolePalette(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
);
1217 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1223 * @unimplemented (Undocumented)
1227 SetLastConsoleEventActive(VOID
)
1229 DPRINT1("SetLastConsoleEventActive() UNIMPLEMENTED!\n");
1230 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1236 * @unimplemented (Undocumented)
1240 ShowConsoleCursor(DWORD Unknown0
,
1243 DPRINT1("ShowConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1244 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1250 * FUNCTION: Checks whether the given handle is a valid console handle.
1252 * Handle - Handle to be checked
1254 * TRUE: Handle is a valid console handle
1255 * FALSE: Handle is not a valid console handle.
1256 * STATUS: Officially undocumented
1262 VerifyConsoleIoHandle(HANDLE Handle
)
1264 CSR_API_MESSAGE Request
;
1268 CsrRequest
= MAKE_CSR_API(VERIFY_HANDLE
, CSR_NATIVE
);
1269 Request
.Data
.VerifyHandleRequest
.Handle
= Handle
;
1271 Status
= CsrClientCallServer(&Request
,
1274 sizeof(CSR_API_MESSAGE
));
1275 if (!NT_SUCCESS(Status
))
1277 SetLastErrorByStatus(Status
);
1281 return (BOOL
)NT_SUCCESS(Request
.Status
);
1290 WriteConsoleInputVDMA(DWORD Unknown0
,
1295 DPRINT1("WriteConsoleInputVDMA(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
1296 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1306 WriteConsoleInputVDMW(DWORD Unknown0
,
1311 DPRINT1("WriteConsoleInputVDMW(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
1312 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1318 * @implemented (Undocumented)
1322 CloseConsoleHandle(HANDLE Handle
)
1324 CSR_API_MESSAGE Request
;
1328 CsrRequest
= MAKE_CSR_API(CLOSE_HANDLE
, CSR_NATIVE
);
1329 Request
.Data
.CloseHandleRequest
.Handle
= Handle
;
1331 Status
= CsrClientCallServer(&Request
,
1334 sizeof(CSR_API_MESSAGE
));
1335 if (!NT_SUCCESS(Status
))
1337 SetLastErrorByStatus(Status
);
1349 GetStdHandle(DWORD nStdHandle
)
1351 * FUNCTION: Get a handle for the standard input, standard output
1352 * and a standard error device.
1354 * nStdHandle - Specifies the device for which to return the handle.
1355 * RETURNS: If the function succeeds, the return value is the handle
1356 * of the specified device. Otherwise the value is INVALID_HANDLE_VALUE.
1359 PRTL_USER_PROCESS_PARAMETERS Ppb
;
1361 Ppb
= NtCurrentPeb()->ProcessParameters
;
1364 case STD_INPUT_HANDLE
:
1365 return Ppb
->StandardInput
;
1367 case STD_OUTPUT_HANDLE
:
1368 return Ppb
->StandardOutput
;
1370 case STD_ERROR_HANDLE
:
1371 return Ppb
->StandardError
;
1374 SetLastError (ERROR_INVALID_PARAMETER
);
1375 return INVALID_HANDLE_VALUE
;
1384 SetStdHandle(DWORD nStdHandle
,
1387 * FUNCTION: Set the handle for the standard input, standard output or
1388 * the standard error device.
1390 * nStdHandle - Specifies the handle to be set.
1391 * hHandle - The handle to set.
1392 * RETURNS: TRUE if the function succeeds, FALSE otherwise.
1395 PRTL_USER_PROCESS_PARAMETERS Ppb
;
1397 /* no need to check if hHandle == INVALID_HANDLE_VALUE */
1399 Ppb
= NtCurrentPeb()->ProcessParameters
;
1403 case STD_INPUT_HANDLE
:
1404 Ppb
->StandardInput
= hHandle
;
1407 case STD_OUTPUT_HANDLE
:
1408 Ppb
->StandardOutput
= hHandle
;
1411 case STD_ERROR_HANDLE
:
1412 Ppb
->StandardError
= hHandle
;
1416 /* windows for whatever reason sets the last error to ERROR_INVALID_HANDLE here */
1417 SetLastError(ERROR_INVALID_HANDLE
);
1424 IntWriteConsole(HANDLE hConsoleOutput
,
1426 DWORD nNumberOfCharsToWrite
,
1427 LPDWORD lpNumberOfCharsWritten
,
1431 PCSR_API_MESSAGE Request
;
1435 ULONG SizeBytes
, CharSize
;
1438 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
1439 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
1441 max(sizeof(CSR_API_MESSAGE
),
1442 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE
) + min(nNumberOfCharsToWrite
,
1443 CSRSS_MAX_WRITE_CONSOLE
/ CharSize
) * CharSize
));
1444 if (Request
== NULL
)
1446 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1450 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE
, CSR_CONSOLE
);
1452 while (nNumberOfCharsToWrite
> 0)
1454 Request
->Data
.WriteConsoleRequest
.ConsoleHandle
= hConsoleOutput
;
1455 Request
->Data
.WriteConsoleRequest
.Unicode
= bUnicode
;
1457 nChars
= (USHORT
)min(nNumberOfCharsToWrite
, CSRSS_MAX_WRITE_CONSOLE
/ CharSize
);
1458 Request
->Data
.WriteConsoleRequest
.NrCharactersToWrite
= nChars
;
1460 SizeBytes
= nChars
* CharSize
;
1462 memcpy(Request
->Data
.WriteConsoleRequest
.Buffer
, lpBuffer
, SizeBytes
);
1464 Status
= CsrClientCallServer(Request
,
1467 max(sizeof(CSR_API_MESSAGE
),
1468 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE
) + SizeBytes
));
1470 if (Status
== STATUS_PENDING
)
1472 WaitForSingleObject(Request
->Data
.WriteConsoleRequest
.UnpauseEvent
, INFINITE
);
1473 CloseHandle(Request
->Data
.WriteConsoleRequest
.UnpauseEvent
);
1476 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
1478 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1479 SetLastErrorByStatus(Status
);
1483 nNumberOfCharsToWrite
-= nChars
;
1484 lpBuffer
= (PVOID
)((ULONG_PTR
)lpBuffer
+ (ULONG_PTR
)SizeBytes
);
1485 Written
+= Request
->Data
.WriteConsoleRequest
.NrCharactersWritten
;
1488 if (lpNumberOfCharsWritten
!= NULL
)
1490 *lpNumberOfCharsWritten
= Written
;
1492 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1498 /*--------------------------------------------------------------
1505 WriteConsoleA(HANDLE hConsoleOutput
,
1506 CONST VOID
*lpBuffer
,
1507 DWORD nNumberOfCharsToWrite
,
1508 LPDWORD lpNumberOfCharsWritten
,
1511 return IntWriteConsole(hConsoleOutput
,
1513 nNumberOfCharsToWrite
,
1514 lpNumberOfCharsWritten
,
1520 /*--------------------------------------------------------------
1527 WriteConsoleW(HANDLE hConsoleOutput
,
1528 CONST VOID
*lpBuffer
,
1529 DWORD nNumberOfCharsToWrite
,
1530 LPDWORD lpNumberOfCharsWritten
,
1533 return IntWriteConsole(hConsoleOutput
,
1535 nNumberOfCharsToWrite
,
1536 lpNumberOfCharsWritten
,
1544 IntReadConsole(HANDLE hConsoleInput
,
1546 DWORD nNumberOfCharsToRead
,
1547 LPDWORD lpNumberOfCharsRead
,
1548 PCONSOLE_READCONSOLE_CONTROL lpReserved
,
1551 PCSR_API_MESSAGE Request
;
1554 ULONG CharSize
, CharsRead
= 0;
1556 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
1557 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
1559 max(sizeof(CSR_API_MESSAGE
),
1560 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE
) + min(nNumberOfCharsToRead
,
1561 CSRSS_MAX_READ_CONSOLE
/ CharSize
) * CharSize
));
1562 if (Request
== NULL
)
1564 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1568 Request
->Status
= STATUS_SUCCESS
;
1569 CsrRequest
= MAKE_CSR_API(READ_CONSOLE
, CSR_CONSOLE
);
1573 if (Request
->Status
== STATUS_PENDING
)
1575 Status
= NtWaitForSingleObject(Request
->Data
.ReadConsoleRequest
.EventHandle
,
1578 if (!NT_SUCCESS(Status
))
1580 DPRINT1("Wait for console input failed!\n");
1585 Request
->Data
.ReadConsoleRequest
.ConsoleHandle
= hConsoleInput
;
1586 Request
->Data
.ReadConsoleRequest
.Unicode
= bUnicode
;
1587 Request
->Data
.ReadConsoleRequest
.NrCharactersToRead
= (WORD
)min(nNumberOfCharsToRead
, CSRSS_MAX_READ_CONSOLE
/ CharSize
);
1588 Request
->Data
.ReadConsoleRequest
.nCharsCanBeDeleted
= (WORD
)CharsRead
;
1590 Status
= CsrClientCallServer(Request
,
1593 max(sizeof(CSR_API_MESSAGE
),
1594 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE
)
1595 + Request
->Data
.ReadConsoleRequest
.NrCharactersToRead
* CharSize
));
1597 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
1599 DPRINT1("CSR returned error in ReadConsole\n");
1600 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1601 SetLastErrorByStatus(Status
);
1605 nNumberOfCharsToRead
-= Request
->Data
.ReadConsoleRequest
.NrCharactersRead
;
1606 memcpy((PVOID
)((ULONG_PTR
)lpBuffer
+ (ULONG_PTR
)(CharsRead
* CharSize
)),
1607 Request
->Data
.ReadConsoleRequest
.Buffer
,
1608 Request
->Data
.ReadConsoleRequest
.NrCharactersRead
* CharSize
);
1609 CharsRead
+= Request
->Data
.ReadConsoleRequest
.NrCharactersRead
;
1611 if (Request
->Status
== STATUS_NOTIFY_CLEANUP
)
1616 nNumberOfCharsToRead
++;
1618 Request
->Status
= STATUS_PENDING
;
1621 while (Request
->Status
== STATUS_PENDING
&& nNumberOfCharsToRead
> 0);
1623 if (lpNumberOfCharsRead
!= NULL
)
1625 *lpNumberOfCharsRead
= CharsRead
;
1628 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1634 /*--------------------------------------------------------------
1641 ReadConsoleA(HANDLE hConsoleInput
,
1643 DWORD nNumberOfCharsToRead
,
1644 LPDWORD lpNumberOfCharsRead
,
1645 PCONSOLE_READCONSOLE_CONTROL pInputControl
)
1647 return IntReadConsole(hConsoleInput
,
1649 nNumberOfCharsToRead
,
1650 lpNumberOfCharsRead
,
1656 /*--------------------------------------------------------------
1663 ReadConsoleW(HANDLE hConsoleInput
,
1665 DWORD nNumberOfCharsToRead
,
1666 LPDWORD lpNumberOfCharsRead
,
1667 PCONSOLE_READCONSOLE_CONTROL pInputControl
)
1669 return IntReadConsole(hConsoleInput
,
1671 nNumberOfCharsToRead
,
1672 lpNumberOfCharsRead
,
1678 /*--------------------------------------------------------------
1687 CSR_API_MESSAGE Request
;
1692 if (NtCurrentPeb()->ProcessParameters
->ConsoleHandle
)
1694 DPRINT("AllocConsole: Allocate duplicate console to the same Process\n");
1695 SetLastErrorByStatus (STATUS_OBJECT_NAME_EXISTS
);
1699 Request
.Data
.AllocConsoleRequest
.CtrlDispatcher
= ConsoleControlDispatcher
;
1700 Request
.Data
.AllocConsoleRequest
.ConsoleNeeded
= TRUE
;
1701 Request
.Data
.AllocConsoleRequest
.Visible
= TRUE
;
1703 CsrRequest
= MAKE_CSR_API(ALLOC_CONSOLE
, CSR_CONSOLE
);
1705 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
1706 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1708 SetLastErrorByStatus(Status
);
1712 NtCurrentPeb()->ProcessParameters
->ConsoleHandle
= Request
.Data
.AllocConsoleRequest
.Console
;
1714 SetStdHandle(STD_INPUT_HANDLE
, Request
.Data
.AllocConsoleRequest
.InputHandle
);
1715 SetStdHandle(STD_OUTPUT_HANDLE
, Request
.Data
.AllocConsoleRequest
.OutputHandle
);
1717 hStdError
= DuplicateConsoleHandle(Request
.Data
.AllocConsoleRequest
.OutputHandle
,
1720 DUPLICATE_SAME_ACCESS
);
1722 SetStdHandle(STD_ERROR_HANDLE
, hStdError
);
1727 /*--------------------------------------------------------------
1736 // AG: I'm not sure if this is correct (what happens to std handles?)
1737 // but I just tried to reverse what AllocConsole() does...
1739 CSR_API_MESSAGE Request
;
1743 CsrRequest
= MAKE_CSR_API(FREE_CONSOLE
, CSR_CONSOLE
);
1745 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
1746 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1748 SetLastErrorByStatus(Status
);
1752 NtCurrentPeb()->ProcessParameters
->ConsoleHandle
= NULL
;
1757 /*--------------------------------------------------------------
1758 * GetConsoleScreenBufferInfo
1764 GetConsoleScreenBufferInfo(HANDLE hConsoleOutput
,
1765 PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
)
1767 CSR_API_MESSAGE Request
;
1771 CsrRequest
= MAKE_CSR_API(SCREEN_BUFFER_INFO
, CSR_CONSOLE
);
1772 Request
.Data
.ScreenBufferInfoRequest
.ConsoleHandle
= hConsoleOutput
;
1774 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
1775 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1777 SetLastErrorByStatus(Status
);
1780 *lpConsoleScreenBufferInfo
= Request
.Data
.ScreenBufferInfoRequest
.Info
;
1785 /*--------------------------------------------------------------
1786 * SetConsoleCursorPosition
1792 SetConsoleCursorPosition(HANDLE hConsoleOutput
,
1793 COORD dwCursorPosition
)
1795 CSR_API_MESSAGE Request
;
1799 CsrRequest
= MAKE_CSR_API(SET_CURSOR
, CSR_CONSOLE
);
1800 Request
.Data
.SetCursorRequest
.ConsoleHandle
= hConsoleOutput
;
1801 Request
.Data
.SetCursorRequest
.Position
= dwCursorPosition
;
1803 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
1804 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1806 SetLastErrorByStatus(Status
);
1816 IntFillConsoleOutputCharacter(HANDLE hConsoleOutput
,
1820 LPDWORD lpNumberOfCharsWritten
,
1823 CSR_API_MESSAGE Request
;
1827 CsrRequest
= MAKE_CSR_API(FILL_OUTPUT
, CSR_CONSOLE
);
1828 Request
.Data
.FillOutputRequest
.ConsoleHandle
= hConsoleOutput
;
1829 Request
.Data
.FillOutputRequest
.Unicode
= bUnicode
;
1832 Request
.Data
.FillOutputRequest
.Char
.UnicodeChar
= *((WCHAR
*)cCharacter
);
1834 Request
.Data
.FillOutputRequest
.Char
.AsciiChar
= *((CHAR
*)cCharacter
);
1836 Request
.Data
.FillOutputRequest
.Position
= dwWriteCoord
;
1837 Request
.Data
.FillOutputRequest
.Length
= (WORD
)nLength
;
1839 Status
= CsrClientCallServer(&Request
,
1842 sizeof(CSR_API_MESSAGE
));
1844 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1846 SetLastErrorByStatus(Status
);
1850 if(lpNumberOfCharsWritten
!= NULL
)
1852 *lpNumberOfCharsWritten
= Request
.Data
.FillOutputRequest
.NrCharactersWritten
;
1858 /*--------------------------------------------------------------
1859 * FillConsoleOutputCharacterA
1865 FillConsoleOutputCharacterA(HANDLE hConsoleOutput
,
1869 LPDWORD lpNumberOfCharsWritten
)
1871 return IntFillConsoleOutputCharacter(hConsoleOutput
,
1875 lpNumberOfCharsWritten
,
1880 /*--------------------------------------------------------------
1881 * FillConsoleOutputCharacterW
1887 FillConsoleOutputCharacterW(HANDLE hConsoleOutput
,
1891 LPDWORD lpNumberOfCharsWritten
)
1893 return IntFillConsoleOutputCharacter(hConsoleOutput
,
1897 lpNumberOfCharsWritten
,
1904 IntPeekConsoleInput(HANDLE hConsoleInput
,
1905 PINPUT_RECORD lpBuffer
,
1907 LPDWORD lpNumberOfEventsRead
,
1910 CSR_API_MESSAGE Request
;
1912 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1916 if (lpBuffer
== NULL
)
1918 SetLastError(ERROR_INVALID_PARAMETER
);
1922 Size
= nLength
* sizeof(INPUT_RECORD
);
1924 /* Allocate a Capture Buffer */
1925 DPRINT("IntPeekConsoleInput: %lx %p\n", Size
, lpNumberOfEventsRead
);
1926 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
1928 /* Allocate space in the Buffer */
1929 CsrCaptureMessageBuffer(CaptureBuffer
,
1932 (PVOID
*)&Request
.Data
.PeekConsoleInputRequest
.InputRecord
);
1934 /* Set up the data to send to the Console Server */
1935 CsrRequest
= MAKE_CSR_API(PEEK_CONSOLE_INPUT
, CSR_CONSOLE
);
1936 Request
.Data
.PeekConsoleInputRequest
.ConsoleHandle
= hConsoleInput
;
1937 Request
.Data
.PeekConsoleInputRequest
.Unicode
= bUnicode
;
1938 Request
.Data
.PeekConsoleInputRequest
.Length
= nLength
;
1940 /* Call the server */
1941 Status
= CsrClientCallServer(&Request
,
1944 sizeof(CSR_API_MESSAGE
));
1945 DPRINT("Server returned: %x\n", Request
.Status
);
1947 /* Check for success*/
1948 if (NT_SUCCESS(Request
.Status
))
1950 /* Return the number of events read */
1951 DPRINT("Events read: %lx\n", Request
.Data
.PeekConsoleInputRequest
.Length
);
1952 *lpNumberOfEventsRead
= Request
.Data
.PeekConsoleInputRequest
.Length
;
1954 /* Copy into the buffer */
1955 DPRINT("Copying to buffer\n");
1956 RtlCopyMemory(lpBuffer
,
1957 Request
.Data
.PeekConsoleInputRequest
.InputRecord
,
1958 sizeof(INPUT_RECORD
) * *lpNumberOfEventsRead
);
1963 *lpNumberOfEventsRead
= 0;
1964 SetLastErrorByStatus(Request
.Status
);
1967 /* Release the capture buffer */
1968 CsrFreeCaptureBuffer(CaptureBuffer
);
1970 /* Return TRUE or FALSE */
1971 return NT_SUCCESS(Request
.Status
);
1974 /*--------------------------------------------------------------
1981 PeekConsoleInputA(HANDLE hConsoleInput
,
1982 PINPUT_RECORD lpBuffer
,
1984 LPDWORD lpNumberOfEventsRead
)
1986 return IntPeekConsoleInput(hConsoleInput
,
1989 lpNumberOfEventsRead
,
1994 /*--------------------------------------------------------------
2001 PeekConsoleInputW(HANDLE hConsoleInput
,
2002 PINPUT_RECORD lpBuffer
,
2004 LPDWORD lpNumberOfEventsRead
)
2006 return IntPeekConsoleInput(hConsoleInput
,
2008 lpNumberOfEventsRead
,
2015 IntReadConsoleInput(HANDLE hConsoleInput
,
2016 PINPUT_RECORD lpBuffer
,
2018 LPDWORD lpNumberOfEventsRead
,
2021 CSR_API_MESSAGE Request
;
2026 CsrRequest
= MAKE_CSR_API(READ_INPUT
, CSR_CONSOLE
);
2031 Request
.Data
.ReadInputRequest
.ConsoleHandle
= hConsoleInput
;
2032 Request
.Data
.ReadInputRequest
.Unicode
= bUnicode
;
2034 Status
= CsrClientCallServer(&Request
,
2037 sizeof(CSR_API_MESSAGE
));
2038 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2042 /* we couldn't read a single record, fail */
2043 SetLastErrorByStatus(Status
);
2048 /* FIXME - fail gracefully in case we already read at least one record? */
2052 else if (Status
== STATUS_PENDING
)
2056 Status
= NtWaitForSingleObject(Request
.Data
.ReadInputRequest
.Event
, FALSE
, 0);
2057 if (!NT_SUCCESS(Status
))
2059 SetLastErrorByStatus(Status
);
2065 /* nothing more to read (waiting for more input??), let's just bail */
2071 lpBuffer
[Read
++] = Request
.Data
.ReadInputRequest
.Input
;
2074 if (!Request
.Data
.ReadInputRequest
.MoreEvents
)
2076 /* nothing more to read, bail */
2082 if (lpNumberOfEventsRead
!= NULL
)
2084 *lpNumberOfEventsRead
= Read
;
2091 /*--------------------------------------------------------------
2098 ReadConsoleInputA(HANDLE hConsoleInput
,
2099 PINPUT_RECORD lpBuffer
,
2101 LPDWORD lpNumberOfEventsRead
)
2103 return IntReadConsoleInput(hConsoleInput
,
2106 lpNumberOfEventsRead
,
2111 /*--------------------------------------------------------------
2118 ReadConsoleInputW(HANDLE hConsoleInput
,
2119 PINPUT_RECORD lpBuffer
,
2121 LPDWORD lpNumberOfEventsRead
)
2123 return IntReadConsoleInput(hConsoleInput
,
2126 lpNumberOfEventsRead
,
2133 IntWriteConsoleInput(HANDLE hConsoleInput
,
2134 PINPUT_RECORD lpBuffer
,
2136 LPDWORD lpNumberOfEventsWritten
,
2139 CSR_API_MESSAGE Request
;
2141 PCSR_CAPTURE_BUFFER CaptureBuffer
;
2145 if (lpBuffer
== NULL
)
2147 SetLastError(ERROR_INVALID_PARAMETER
);
2151 Size
= nLength
* sizeof(INPUT_RECORD
);
2153 /* Allocate a Capture Buffer */
2154 DPRINT("IntWriteConsoleInput: %lx %p\n", Size
, lpNumberOfEventsWritten
);
2155 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
2157 /* Allocate space in the Buffer */
2158 CsrCaptureMessageBuffer(CaptureBuffer
,
2161 (PVOID
*)&Request
.Data
.WriteConsoleInputRequest
.InputRecord
);
2163 /* Set up the data to send to the Console Server */
2164 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_INPUT
, CSR_CONSOLE
);
2165 Request
.Data
.WriteConsoleInputRequest
.ConsoleHandle
= hConsoleInput
;
2166 Request
.Data
.WriteConsoleInputRequest
.Unicode
= bUnicode
;
2167 Request
.Data
.WriteConsoleInputRequest
.Length
= nLength
;
2169 /* Call the server */
2170 Status
= CsrClientCallServer(&Request
,
2173 sizeof(CSR_API_MESSAGE
));
2174 DPRINT("Server returned: %x\n", Request
.Status
);
2176 /* Check for success*/
2177 if (NT_SUCCESS(Request
.Status
))
2179 /* Return the number of events read */
2180 DPRINT("Events read: %lx\n", Request
.Data
.WriteConsoleInputRequest
.Length
);
2181 *lpNumberOfEventsWritten
= Request
.Data
.WriteConsoleInputRequest
.Length
;
2186 *lpNumberOfEventsWritten
= 0;
2187 SetLastErrorByStatus(Request
.Status
);
2190 /* Release the capture buffer */
2191 CsrFreeCaptureBuffer(CaptureBuffer
);
2193 /* Return TRUE or FALSE */
2194 return NT_SUCCESS(Request
.Status
);
2198 /*--------------------------------------------------------------
2199 * WriteConsoleInputA
2205 WriteConsoleInputA(HANDLE hConsoleInput
,
2206 CONST INPUT_RECORD
*lpBuffer
,
2208 LPDWORD lpNumberOfEventsWritten
)
2210 return IntWriteConsoleInput(hConsoleInput
,
2211 (PINPUT_RECORD
)lpBuffer
,
2213 lpNumberOfEventsWritten
,
2218 /*--------------------------------------------------------------
2219 * WriteConsoleInputW
2225 WriteConsoleInputW(HANDLE hConsoleInput
,
2226 CONST INPUT_RECORD
*lpBuffer
,
2228 LPDWORD lpNumberOfEventsWritten
)
2230 return IntWriteConsoleInput(hConsoleInput
,
2231 (PINPUT_RECORD
)lpBuffer
,
2233 lpNumberOfEventsWritten
,
2240 IntReadConsoleOutput(HANDLE hConsoleOutput
,
2241 PCHAR_INFO lpBuffer
,
2243 COORD dwBufferCoord
,
2244 PSMALL_RECT lpReadRegion
,
2247 CSR_API_MESSAGE Request
;
2249 PCSR_CAPTURE_BUFFER CaptureBuffer
;
2251 DWORD Size
, SizeX
, SizeY
;
2253 if (lpBuffer
== NULL
)
2255 SetLastError(ERROR_INVALID_PARAMETER
);
2259 Size
= dwBufferSize
.X
* dwBufferSize
.Y
* sizeof(CHAR_INFO
);
2261 /* Allocate a Capture Buffer */
2262 DPRINT("IntReadConsoleOutput: %lx %p\n", Size
, lpReadRegion
);
2263 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
2265 /* Allocate space in the Buffer */
2266 CsrCaptureMessageBuffer(CaptureBuffer
,
2269 (PVOID
*)&Request
.Data
.ReadConsoleOutputRequest
.CharInfo
);
2271 /* Set up the data to send to the Console Server */
2272 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT
, CSR_CONSOLE
);
2273 Request
.Data
.ReadConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
2274 Request
.Data
.ReadConsoleOutputRequest
.Unicode
= bUnicode
;
2275 Request
.Data
.ReadConsoleOutputRequest
.BufferSize
= dwBufferSize
;
2276 Request
.Data
.ReadConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
2277 Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
= *lpReadRegion
;
2279 /* Call the server */
2280 Status
= CsrClientCallServer(&Request
,
2283 sizeof(CSR_API_MESSAGE
));
2284 DPRINT("Server returned: %x\n", Request
.Status
);
2286 /* Check for success*/
2287 if (NT_SUCCESS(Request
.Status
))
2289 /* Copy into the buffer */
2290 DPRINT("Copying to buffer\n");
2291 SizeX
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Right
-
2292 Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Left
+ 1;
2293 SizeY
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Bottom
-
2294 Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Top
+ 1;
2295 RtlCopyMemory(lpBuffer
,
2296 Request
.Data
.ReadConsoleOutputRequest
.CharInfo
,
2297 sizeof(CHAR_INFO
) * SizeX
* SizeY
);
2302 SetLastErrorByStatus(Request
.Status
);
2305 /* Return the read region */
2306 DPRINT("read region: %lx\n", Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
);
2307 *lpReadRegion
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
;
2309 /* Release the capture buffer */
2310 CsrFreeCaptureBuffer(CaptureBuffer
);
2312 /* Return TRUE or FALSE */
2313 return NT_SUCCESS(Request
.Status
);
2316 /*--------------------------------------------------------------
2317 * ReadConsoleOutputA
2323 ReadConsoleOutputA(HANDLE hConsoleOutput
,
2324 PCHAR_INFO lpBuffer
,
2326 COORD dwBufferCoord
,
2327 PSMALL_RECT lpReadRegion
)
2329 return IntReadConsoleOutput(hConsoleOutput
,
2338 /*--------------------------------------------------------------
2339 * ReadConsoleOutputW
2345 ReadConsoleOutputW(HANDLE hConsoleOutput
,
2346 PCHAR_INFO lpBuffer
,
2348 COORD dwBufferCoord
,
2349 PSMALL_RECT lpReadRegion
)
2351 return IntReadConsoleOutput(hConsoleOutput
,
2362 IntWriteConsoleOutput(HANDLE hConsoleOutput
,
2363 CONST CHAR_INFO
*lpBuffer
,
2365 COORD dwBufferCoord
,
2366 PSMALL_RECT lpWriteRegion
,
2369 CSR_API_MESSAGE Request
;
2371 PCSR_CAPTURE_BUFFER CaptureBuffer
;
2375 Size
= dwBufferSize
.Y
* dwBufferSize
.X
* sizeof(CHAR_INFO
);
2377 /* Allocate a Capture Buffer */
2378 DPRINT("IntWriteConsoleOutput: %lx %p\n", Size
, lpWriteRegion
);
2379 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
2381 /* Allocate space in the Buffer */
2382 CsrCaptureMessageBuffer(CaptureBuffer
,
2385 (PVOID
*)&Request
.Data
.WriteConsoleOutputRequest
.CharInfo
);
2387 /* Copy from the buffer */
2388 RtlCopyMemory(Request
.Data
.WriteConsoleOutputRequest
.CharInfo
, lpBuffer
, Size
);
2390 /* Set up the data to send to the Console Server */
2391 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT
, CSR_CONSOLE
);
2392 Request
.Data
.WriteConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
2393 Request
.Data
.WriteConsoleOutputRequest
.Unicode
= bUnicode
;
2394 Request
.Data
.WriteConsoleOutputRequest
.BufferSize
= dwBufferSize
;
2395 Request
.Data
.WriteConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
2396 Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
= *lpWriteRegion
;
2398 /* Call the server */
2399 Status
= CsrClientCallServer(&Request
,
2402 sizeof(CSR_API_MESSAGE
));
2403 DPRINT("Server returned: %x\n", Request
.Status
);
2405 /* Check for success*/
2406 if (!NT_SUCCESS(Request
.Status
))
2409 SetLastErrorByStatus(Request
.Status
);
2412 /* Return the read region */
2413 DPRINT("read region: %lx\n", Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
);
2414 *lpWriteRegion
= Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
;
2416 /* Release the capture buffer */
2417 CsrFreeCaptureBuffer(CaptureBuffer
);
2419 /* Return TRUE or FALSE */
2420 return NT_SUCCESS(Request
.Status
);
2423 /*--------------------------------------------------------------
2424 * WriteConsoleOutputA
2430 WriteConsoleOutputA(HANDLE hConsoleOutput
,
2431 CONST CHAR_INFO
*lpBuffer
,
2433 COORD dwBufferCoord
,
2434 PSMALL_RECT lpWriteRegion
)
2436 return IntWriteConsoleOutput(hConsoleOutput
,
2445 /*--------------------------------------------------------------
2446 * WriteConsoleOutputW
2452 WriteConsoleOutputW(HANDLE hConsoleOutput
,
2453 CONST CHAR_INFO
*lpBuffer
,
2455 COORD dwBufferCoord
,
2456 PSMALL_RECT lpWriteRegion
)
2458 return IntWriteConsoleOutput(hConsoleOutput
,
2469 IntReadConsoleOutputCharacter(HANDLE hConsoleOutput
,
2473 LPDWORD lpNumberOfCharsRead
,
2476 PCSR_API_MESSAGE Request
;
2479 ULONG nChars
, SizeBytes
, CharSize
;
2480 DWORD CharsRead
= 0;
2482 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
2484 nChars
= min(nLength
, CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR
) / CharSize
;
2485 SizeBytes
= nChars
* CharSize
;
2487 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
2488 max(sizeof(CSR_API_MESSAGE
),
2489 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR
)
2490 + min (nChars
, CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR
/ CharSize
) * CharSize
));
2491 if (Request
== NULL
)
2493 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2497 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT_CHAR
, CSR_CONSOLE
);
2498 Request
->Data
.ReadConsoleOutputCharRequest
.ReadCoord
= dwReadCoord
;
2504 Request
->Data
.ReadConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
2505 Request
->Data
.ReadConsoleOutputCharRequest
.Unicode
= bUnicode
;
2506 Request
->Data
.ReadConsoleOutputCharRequest
.NumCharsToRead
= min(nLength
, nChars
);
2507 SizeBytes
= Request
->Data
.ReadConsoleOutputCharRequest
.NumCharsToRead
* CharSize
;
2509 Status
= CsrClientCallServer(Request
,
2512 max(sizeof(CSR_API_MESSAGE
),
2513 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR
) + SizeBytes
));
2514 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Request
->Status
))
2516 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2517 SetLastErrorByStatus(Status
);
2521 BytesRead
= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
* CharSize
;
2522 memcpy(lpCharacter
, Request
->Data
.ReadConsoleOutputCharRequest
.String
, BytesRead
);
2523 lpCharacter
= (PVOID
)((ULONG_PTR
)lpCharacter
+ (ULONG_PTR
)BytesRead
);
2524 CharsRead
+= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
;
2525 nLength
-= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
;
2527 Request
->Data
.ReadConsoleOutputCharRequest
.ReadCoord
= Request
->Data
.ReadConsoleOutputCharRequest
.EndCoord
;
2530 if (lpNumberOfCharsRead
!= NULL
)
2532 *lpNumberOfCharsRead
= CharsRead
;
2535 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2541 /*--------------------------------------------------------------
2542 * ReadConsoleOutputCharacterA
2548 ReadConsoleOutputCharacterA(HANDLE hConsoleOutput
,
2552 LPDWORD lpNumberOfCharsRead
)
2554 return IntReadConsoleOutputCharacter(hConsoleOutput
,
2558 lpNumberOfCharsRead
,
2563 /*--------------------------------------------------------------
2564 * ReadConsoleOutputCharacterW
2570 ReadConsoleOutputCharacterW(HANDLE hConsoleOutput
,
2574 LPDWORD lpNumberOfCharsRead
)
2576 return IntReadConsoleOutputCharacter(hConsoleOutput
,
2580 lpNumberOfCharsRead
,
2585 /*--------------------------------------------------------------
2586 * ReadConsoleOutputAttribute
2592 ReadConsoleOutputAttribute(HANDLE hConsoleOutput
,
2596 LPDWORD lpNumberOfAttrsRead
)
2598 PCSR_API_MESSAGE Request
;
2603 if (lpNumberOfAttrsRead
!= NULL
)
2604 *lpNumberOfAttrsRead
= nLength
;
2606 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
2608 max(sizeof(CSR_API_MESSAGE
),
2609 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB
)
2610 + min (nLength
, CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
)) * sizeof(WORD
)));
2611 if (Request
== NULL
)
2613 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2617 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2619 while (nLength
!= 0)
2621 Request
->Data
.ReadConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2622 Request
->Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= dwReadCoord
;
2624 if (nLength
> CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
))
2625 Size
= CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WCHAR
);
2629 Request
->Data
.ReadConsoleOutputAttribRequest
.NumAttrsToRead
= Size
;
2631 Status
= CsrClientCallServer(Request
,
2634 max(sizeof(CSR_API_MESSAGE
),
2635 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB
) + Size
* sizeof(WORD
)));
2636 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Request
->Status
))
2638 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2639 SetLastErrorByStatus(Status
);
2643 memcpy(lpAttribute
, Request
->Data
.ReadConsoleOutputAttribRequest
.Attribute
, Size
* sizeof(WORD
));
2644 lpAttribute
+= Size
;
2646 Request
->Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= Request
->Data
.ReadConsoleOutputAttribRequest
.EndCoord
;
2649 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2657 IntWriteConsoleOutputCharacter(HANDLE hConsoleOutput
,
2661 LPDWORD lpNumberOfCharsWritten
,
2664 PCSR_API_MESSAGE Request
;
2667 ULONG SizeBytes
, CharSize
, nChars
;
2670 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
2672 nChars
= min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
/ CharSize
);
2673 SizeBytes
= nChars
* CharSize
;
2675 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
2676 max(sizeof(CSR_API_MESSAGE
),
2677 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR
)
2678 + min (nChars
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
/ CharSize
) * CharSize
));
2679 if (Request
== NULL
)
2681 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2685 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT_CHAR
, CSR_CONSOLE
);
2686 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= dwWriteCoord
;
2692 Request
->Data
.WriteConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
2693 Request
->Data
.WriteConsoleOutputCharRequest
.Unicode
= bUnicode
;
2694 Request
->Data
.WriteConsoleOutputCharRequest
.Length
= (WORD
)min(nLength
, nChars
);
2695 BytesWrite
= Request
->Data
.WriteConsoleOutputCharRequest
.Length
* CharSize
;
2697 memcpy(Request
->Data
.WriteConsoleOutputCharRequest
.String
, lpCharacter
, BytesWrite
);
2699 Status
= CsrClientCallServer(Request
,
2702 max(sizeof(CSR_API_MESSAGE
),
2703 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR
) + BytesWrite
));
2705 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
2707 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2708 SetLastErrorByStatus(Status
);
2712 nLength
-= Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
;
2713 lpCharacter
= (PVOID
)((ULONG_PTR
)lpCharacter
+ (ULONG_PTR
)(Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
* CharSize
));
2714 Written
+= Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
;
2716 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= Request
->Data
.WriteConsoleOutputCharRequest
.EndCoord
;
2719 if (lpNumberOfCharsWritten
!= NULL
)
2721 *lpNumberOfCharsWritten
= Written
;
2724 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2730 /*--------------------------------------------------------------
2731 * WriteConsoleOutputCharacterA
2737 WriteConsoleOutputCharacterA(HANDLE hConsoleOutput
,
2741 LPDWORD lpNumberOfCharsWritten
)
2743 return IntWriteConsoleOutputCharacter(hConsoleOutput
,
2747 lpNumberOfCharsWritten
,
2752 /*--------------------------------------------------------------
2753 * WriteConsoleOutputCharacterW
2759 WriteConsoleOutputCharacterW(HANDLE hConsoleOutput
,
2760 LPCWSTR lpCharacter
,
2763 LPDWORD lpNumberOfCharsWritten
)
2765 return IntWriteConsoleOutputCharacter(hConsoleOutput
,
2769 lpNumberOfCharsWritten
,
2774 /*--------------------------------------------------------------
2775 * WriteConsoleOutputAttribute
2781 WriteConsoleOutputAttribute(HANDLE hConsoleOutput
,
2782 CONST WORD
*lpAttribute
,
2785 LPDWORD lpNumberOfAttrsWritten
)
2787 PCSR_API_MESSAGE Request
;
2792 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
2794 max(sizeof(CSR_API_MESSAGE
),
2795 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB
)
2796 + min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
)) * sizeof(WORD
)));
2797 if (Request
== NULL
)
2799 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2803 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2804 Request
->Data
.WriteConsoleOutputAttribRequest
.Coord
= dwWriteCoord
;
2806 if (lpNumberOfAttrsWritten
)
2807 *lpNumberOfAttrsWritten
= nLength
;
2810 Size
= (WORD
)min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
));
2811 Request
->Data
.WriteConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2812 Request
->Data
.WriteConsoleOutputAttribRequest
.Length
= Size
;
2813 memcpy(Request
->Data
.WriteConsoleOutputAttribRequest
.Attribute
, lpAttribute
, Size
* sizeof(WORD
));
2815 Status
= CsrClientCallServer(Request
,
2818 max(sizeof(CSR_API_MESSAGE
),
2819 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB
) + Size
* sizeof(WORD
)));
2821 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
2823 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2824 SetLastErrorByStatus (Status
);
2828 lpAttribute
+= Size
;
2829 Request
->Data
.WriteConsoleOutputAttribRequest
.Coord
= Request
->Data
.WriteConsoleOutputAttribRequest
.EndCoord
;
2832 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2838 /*--------------------------------------------------------------
2839 * FillConsoleOutputAttribute
2845 FillConsoleOutputAttribute(HANDLE hConsoleOutput
,
2849 LPDWORD lpNumberOfAttrsWritten
)
2851 CSR_API_MESSAGE Request
;
2855 CsrRequest
= MAKE_CSR_API(FILL_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2856 Request
.Data
.FillOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2857 Request
.Data
.FillOutputAttribRequest
.Attribute
= (CHAR
)wAttribute
;
2858 Request
.Data
.FillOutputAttribRequest
.Coord
= dwWriteCoord
;
2859 Request
.Data
.FillOutputAttribRequest
.Length
= (WORD
)nLength
;
2861 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
2862 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2864 SetLastErrorByStatus ( Status
);
2868 if (lpNumberOfAttrsWritten
)
2869 *lpNumberOfAttrsWritten
= nLength
;
2875 /*--------------------------------------------------------------
2882 GetConsoleMode(HANDLE hConsoleHandle
,
2885 CSR_API_MESSAGE Request
;
2889 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_MODE
, CSR_CONSOLE
);
2890 Request
.Data
.GetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
2892 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2893 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2895 SetLastErrorByStatus ( Status
);
2898 *lpMode
= Request
.Data
.GetConsoleModeRequest
.ConsoleMode
;
2904 /*--------------------------------------------------------------
2905 * GetNumberOfConsoleInputEvents
2911 GetNumberOfConsoleInputEvents(HANDLE hConsoleInput
,
2912 LPDWORD lpNumberOfEvents
)
2914 CSR_API_MESSAGE Request
;
2918 if (lpNumberOfEvents
== NULL
)
2920 SetLastError(ERROR_INVALID_PARAMETER
);
2924 CsrRequest
= MAKE_CSR_API(GET_NUM_INPUT_EVENTS
, CSR_CONSOLE
);
2925 Request
.Data
.GetNumInputEventsRequest
.ConsoleHandle
= hConsoleInput
;
2927 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
2928 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2930 SetLastErrorByStatus(Status
);
2934 *lpNumberOfEvents
= Request
.Data
.GetNumInputEventsRequest
.NumInputEvents
;
2940 /*--------------------------------------------------------------
2941 * GetLargestConsoleWindowSize
2947 GetLargestConsoleWindowSize(HANDLE hConsoleOutput
)
2949 COORD Coord
= {80,25};
2950 DPRINT1("GetLargestConsoleWindowSize(0x%x) UNIMPLEMENTED!\n", hConsoleOutput
);
2951 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2956 /*--------------------------------------------------------------
2957 * GetConsoleCursorInfo
2963 GetConsoleCursorInfo(HANDLE hConsoleOutput
,
2964 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
)
2966 CSR_API_MESSAGE Request
;
2970 if (!lpConsoleCursorInfo
)
2972 if (!hConsoleOutput
)
2973 SetLastError(ERROR_INVALID_HANDLE
);
2975 SetLastError(ERROR_INVALID_ACCESS
);
2980 CsrRequest
= MAKE_CSR_API(GET_CURSOR_INFO
, CSR_CONSOLE
);
2981 Request
.Data
.GetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
2983 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
2985 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2987 SetLastErrorByStatus(Status
);
2990 *lpConsoleCursorInfo
= Request
.Data
.GetCursorInfoRequest
.Info
;
2996 /*--------------------------------------------------------------
2997 * GetNumberOfConsoleMouseButtons
3003 GetNumberOfConsoleMouseButtons(LPDWORD lpNumberOfMouseButtons
)
3005 DPRINT1("GetNumberOfConsoleMouseButtons(0x%x) UNIMPLEMENTED!\n", lpNumberOfMouseButtons
);
3006 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3011 /*--------------------------------------------------------------
3018 SetConsoleMode(HANDLE hConsoleHandle
,
3021 CSR_API_MESSAGE Request
;
3025 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_MODE
, CSR_CONSOLE
);
3026 Request
.Data
.SetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
3027 Request
.Data
.SetConsoleModeRequest
.Mode
= dwMode
;
3029 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3030 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3032 SetLastErrorByStatus ( Status
);
3040 /*--------------------------------------------------------------
3041 * SetConsoleActiveScreenBuffer
3047 SetConsoleActiveScreenBuffer(HANDLE hConsoleOutput
)
3049 CSR_API_MESSAGE Request
;
3053 CsrRequest
= MAKE_CSR_API(SET_SCREEN_BUFFER
, CSR_CONSOLE
);
3054 Request
.Data
.SetScreenBufferRequest
.OutputHandle
= hConsoleOutput
;
3056 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3057 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3059 SetLastErrorByStatus(Status
);
3067 /*--------------------------------------------------------------
3068 * FlushConsoleInputBuffer
3074 FlushConsoleInputBuffer(HANDLE hConsoleInput
)
3076 CSR_API_MESSAGE Request
;
3080 CsrRequest
= MAKE_CSR_API(FLUSH_INPUT_BUFFER
, CSR_CONSOLE
);
3081 Request
.Data
.FlushInputBufferRequest
.ConsoleInput
= hConsoleInput
;
3083 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3084 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3086 SetLastErrorByStatus(Status
);
3094 /*--------------------------------------------------------------
3095 * SetConsoleScreenBufferSize
3101 SetConsoleScreenBufferSize(HANDLE hConsoleOutput
,
3104 CSR_API_MESSAGE Request
;
3108 CsrRequest
= MAKE_CSR_API(SET_SCREEN_BUFFER_SIZE
, CSR_CONSOLE
);
3109 Request
.Data
.SetScreenBufferSize
.OutputHandle
= hConsoleOutput
;
3110 Request
.Data
.SetScreenBufferSize
.Size
= dwSize
;
3112 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3113 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3115 SetLastErrorByStatus(Status
);
3122 /*--------------------------------------------------------------
3123 * SetConsoleCursorInfo
3129 SetConsoleCursorInfo(HANDLE hConsoleOutput
,
3130 CONST CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
)
3132 CSR_API_MESSAGE Request
;
3136 CsrRequest
= MAKE_CSR_API(SET_CURSOR_INFO
, CSR_CONSOLE
);
3137 Request
.Data
.SetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
3138 Request
.Data
.SetCursorInfoRequest
.Info
= *lpConsoleCursorInfo
;
3140 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3141 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3143 SetLastErrorByStatus(Status
);
3153 IntScrollConsoleScreenBuffer(HANDLE hConsoleOutput
,
3154 const SMALL_RECT
*lpScrollRectangle
,
3155 const SMALL_RECT
*lpClipRectangle
,
3156 COORD dwDestinationOrigin
,
3157 const CHAR_INFO
*lpFill
,
3160 CSR_API_MESSAGE Request
;
3164 CsrRequest
= MAKE_CSR_API(SCROLL_CONSOLE_SCREEN_BUFFER
, CSR_CONSOLE
);
3165 Request
.Data
.ScrollConsoleScreenBufferRequest
.ConsoleHandle
= hConsoleOutput
;
3166 Request
.Data
.ScrollConsoleScreenBufferRequest
.Unicode
= bUnicode
;
3167 Request
.Data
.ScrollConsoleScreenBufferRequest
.ScrollRectangle
= *lpScrollRectangle
;
3169 if (lpClipRectangle
!= NULL
)
3171 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= TRUE
;
3172 Request
.Data
.ScrollConsoleScreenBufferRequest
.ClipRectangle
= *lpClipRectangle
;
3176 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= FALSE
;
3179 Request
.Data
.ScrollConsoleScreenBufferRequest
.DestinationOrigin
= dwDestinationOrigin
;
3180 Request
.Data
.ScrollConsoleScreenBufferRequest
.Fill
= *lpFill
;
3182 Status
= CsrClientCallServer(&Request
,
3185 sizeof(CSR_API_MESSAGE
));
3187 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3189 SetLastErrorByStatus(Status
);
3197 /*--------------------------------------------------------------
3198 * ScrollConsoleScreenBufferA
3204 ScrollConsoleScreenBufferA(HANDLE hConsoleOutput
,
3205 CONST SMALL_RECT
*lpScrollRectangle
,
3206 CONST SMALL_RECT
*lpClipRectangle
,
3207 COORD dwDestinationOrigin
,
3208 CONST CHAR_INFO
*lpFill
)
3210 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
3211 (PSMALL_RECT
)lpScrollRectangle
,
3212 (PSMALL_RECT
)lpClipRectangle
,
3213 dwDestinationOrigin
,
3219 /*--------------------------------------------------------------
3220 * ScrollConsoleScreenBufferW
3226 ScrollConsoleScreenBufferW(HANDLE hConsoleOutput
,
3227 CONST SMALL_RECT
*lpScrollRectangle
,
3228 CONST SMALL_RECT
*lpClipRectangle
,
3229 COORD dwDestinationOrigin
,
3230 CONST CHAR_INFO
*lpFill
)
3232 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
3235 dwDestinationOrigin
,
3241 /*--------------------------------------------------------------
3242 * SetConsoleWindowInfo
3248 SetConsoleWindowInfo(HANDLE hConsoleOutput
,
3250 CONST SMALL_RECT
*lpConsoleWindow
)
3252 DPRINT1("SetConsoleWindowInfo(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bAbsolute
, lpConsoleWindow
);
3253 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3258 /*--------------------------------------------------------------
3259 * SetConsoleTextAttribute
3265 SetConsoleTextAttribute(HANDLE hConsoleOutput
,
3268 CSR_API_MESSAGE Request
;
3272 CsrRequest
= MAKE_CSR_API(SET_ATTRIB
, CSR_CONSOLE
);
3273 Request
.Data
.SetAttribRequest
.ConsoleHandle
= hConsoleOutput
;
3274 Request
.Data
.SetAttribRequest
.Attrib
= wAttributes
;
3276 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3277 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3279 SetLastErrorByStatus(Status
);
3289 AddConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
3291 PHANDLER_ROUTINE
* NewCtrlHandlers
= NULL
;
3293 if (HandlerRoutine
== NULL
)
3295 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= TRUE
;
3299 if (NrCtrlHandlers
== NrAllocatedHandlers
)
3301 NewCtrlHandlers
= RtlAllocateHeap(RtlGetProcessHeap(),
3303 (NrCtrlHandlers
+ 4) * sizeof(PHANDLER_ROUTINE
));
3304 if (NewCtrlHandlers
== NULL
)
3306 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3310 memmove(NewCtrlHandlers
, CtrlHandlers
, sizeof(PHANDLER_ROUTINE
) * NrCtrlHandlers
);
3312 if (NrAllocatedHandlers
> 1) RtlFreeHeap(RtlGetProcessHeap(), 0, CtrlHandlers
);
3314 CtrlHandlers
= NewCtrlHandlers
;
3315 NrAllocatedHandlers
+= 4;
3318 ASSERT(NrCtrlHandlers
< NrAllocatedHandlers
);
3320 CtrlHandlers
[NrCtrlHandlers
++] = HandlerRoutine
;
3327 RemoveConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
3331 if (HandlerRoutine
== NULL
)
3333 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= FALSE
;
3337 for (i
= 0; i
< NrCtrlHandlers
; i
++)
3339 if (CtrlHandlers
[i
] == HandlerRoutine
)
3341 if (i
< (NrCtrlHandlers
- 1))
3343 memmove(&CtrlHandlers
[i
],
3345 (NrCtrlHandlers
- i
+ 1) * sizeof(PHANDLER_ROUTINE
));
3353 SetLastError(ERROR_INVALID_PARAMETER
);
3363 SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
,
3368 RtlEnterCriticalSection(&DllLock
);
3371 Ret
= AddConsoleCtrlHandler(HandlerRoutine
);
3375 Ret
= RemoveConsoleCtrlHandler(HandlerRoutine
);
3378 RtlLeaveCriticalSection(&DllLock
);
3383 /*--------------------------------------------------------------
3384 * GenerateConsoleCtrlEvent
3390 GenerateConsoleCtrlEvent(DWORD dwCtrlEvent
,
3391 DWORD dwProcessGroupId
)
3393 CSR_API_MESSAGE Request
;
3397 if (dwCtrlEvent
!= CTRL_C_EVENT
&& dwCtrlEvent
!= CTRL_BREAK_EVENT
)
3399 SetLastError(ERROR_INVALID_PARAMETER
);
3403 CsrRequest
= MAKE_CSR_API(GENERATE_CTRL_EVENT
, CSR_CONSOLE
);
3404 Request
.Data
.GenerateCtrlEvent
.Event
= dwCtrlEvent
;
3405 Request
.Data
.GenerateCtrlEvent
.ProcessGroup
= dwProcessGroupId
;
3407 Status
= CsrClientCallServer(&Request
,
3410 sizeof(CSR_API_MESSAGE
));
3411 if(!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= Request
.Status
)))
3413 SetLastErrorByStatus(Status
);
3422 IntGetConsoleTitle(LPVOID lpConsoleTitle
, DWORD nSize
, BOOL bUnicode
)
3424 CSR_API_MESSAGE Request
;
3425 PCSR_CAPTURE_BUFFER CaptureBuffer
;
3426 ULONG CsrRequest
= MAKE_CSR_API(GET_TITLE
, CSR_CONSOLE
);
3432 Request
.Data
.GetTitleRequest
.Length
= nSize
* (bUnicode
? 1 : sizeof(WCHAR
));
3433 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Request
.Data
.GetTitleRequest
.Length
);
3434 if (CaptureBuffer
== NULL
)
3436 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3440 CsrAllocateMessagePointer(CaptureBuffer
,
3441 Request
.Data
.GetTitleRequest
.Length
,
3442 (PVOID
*)&Request
.Data
.GetTitleRequest
.Title
);
3444 Status
= CsrClientCallServer(&Request
, CaptureBuffer
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3445 if (!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= Request
.Status
)))
3447 CsrFreeCaptureBuffer(CaptureBuffer
);
3448 SetLastErrorByStatus(Status
);
3454 if (nSize
>= sizeof(WCHAR
))
3455 wcscpy((LPWSTR
)lpConsoleTitle
, Request
.Data
.GetTitleRequest
.Title
);
3459 if (nSize
< Request
.Data
.GetTitleRequest
.Length
/ sizeof(WCHAR
) ||
3460 !WideCharToMultiByte(CP_ACP
, // ANSI code page
3461 0, // performance and mapping flags
3462 Request
.Data
.GetTitleRequest
.Title
, // address of wide-character string
3463 -1, // number of characters in string
3464 (LPSTR
)lpConsoleTitle
, // address of buffer for new string
3465 nSize
, // size of buffer
3469 /* Yes, if the buffer isn't big enough, it returns 0... Bad API */
3470 *(LPSTR
)lpConsoleTitle
= '\0';
3471 Request
.Data
.GetTitleRequest
.Length
= 0;
3474 CsrFreeCaptureBuffer(CaptureBuffer
);
3476 return Request
.Data
.GetTitleRequest
.Length
/ sizeof(WCHAR
);
3479 /*--------------------------------------------------------------
3486 GetConsoleTitleW(LPWSTR lpConsoleTitle
,
3489 return IntGetConsoleTitle(lpConsoleTitle
, nSize
, TRUE
);
3492 /*--------------------------------------------------------------
3501 GetConsoleTitleA(LPSTR lpConsoleTitle
,
3504 return IntGetConsoleTitle(lpConsoleTitle
, nSize
, FALSE
);
3508 /*--------------------------------------------------------------
3515 SetConsoleTitleW(LPCWSTR lpConsoleTitle
)
3517 CSR_API_MESSAGE Request
;
3518 PCSR_CAPTURE_BUFFER CaptureBuffer
;
3519 ULONG CsrRequest
= MAKE_CSR_API(SET_TITLE
, CSR_CONSOLE
);
3522 Request
.Data
.SetTitleRequest
.Length
= wcslen(lpConsoleTitle
) * sizeof(WCHAR
);
3524 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Request
.Data
.SetTitleRequest
.Length
);
3525 if (CaptureBuffer
== NULL
)
3527 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3531 CsrCaptureMessageBuffer(CaptureBuffer
,
3532 (PVOID
)lpConsoleTitle
,
3533 Request
.Data
.SetTitleRequest
.Length
,
3534 (PVOID
*)&Request
.Data
.SetTitleRequest
.Title
);
3536 Status
= CsrClientCallServer(&Request
, CaptureBuffer
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3537 CsrFreeCaptureBuffer(CaptureBuffer
);
3538 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3540 SetLastErrorByStatus(Status
);
3548 /*--------------------------------------------------------------
3557 SetConsoleTitleA(LPCSTR lpConsoleTitle
)
3559 ULONG Length
= strlen(lpConsoleTitle
) + 1;
3560 LPWSTR WideTitle
= HeapAlloc(GetProcessHeap(), 0, Length
* sizeof(WCHAR
));
3564 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3567 MultiByteToWideChar(CP_ACP
, 0, lpConsoleTitle
, -1, WideTitle
, Length
);
3568 Ret
= SetConsoleTitleW(WideTitle
);
3569 HeapFree(GetProcessHeap(), 0, WideTitle
);
3574 /*--------------------------------------------------------------
3575 * CreateConsoleScreenBuffer
3581 CreateConsoleScreenBuffer(DWORD dwDesiredAccess
,
3583 CONST SECURITY_ATTRIBUTES
*lpSecurityAttributes
,
3585 LPVOID lpScreenBufferData
)
3587 CSR_API_MESSAGE Request
;
3591 if (dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
)
3592 || dwShareMode
& ~(FILE_SHARE_READ
| FILE_SHARE_WRITE
)
3593 || dwFlags
!= CONSOLE_TEXTMODE_BUFFER
)
3595 SetLastError(ERROR_INVALID_PARAMETER
);
3596 return INVALID_HANDLE_VALUE
;
3599 Request
.Data
.CreateScreenBufferRequest
.Access
= dwDesiredAccess
;
3600 Request
.Data
.CreateScreenBufferRequest
.ShareMode
= dwShareMode
;
3601 Request
.Data
.CreateScreenBufferRequest
.Inheritable
=
3602 lpSecurityAttributes
? lpSecurityAttributes
->bInheritHandle
: FALSE
;
3604 CsrRequest
= MAKE_CSR_API(CREATE_SCREEN_BUFFER
, CSR_CONSOLE
);
3605 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3606 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3608 SetLastErrorByStatus(Status
);
3609 return INVALID_HANDLE_VALUE
;
3611 return Request
.Data
.CreateScreenBufferRequest
.OutputHandle
;
3615 /*--------------------------------------------------------------
3624 CSR_API_MESSAGE Request
;
3628 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_CP
, CSR_CONSOLE
);
3629 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3630 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3632 SetLastErrorByStatus (Status
);
3636 return Request
.Data
.GetConsoleCodePage
.CodePage
;
3640 /*--------------------------------------------------------------
3647 SetConsoleCP(UINT wCodePageID
)
3649 CSR_API_MESSAGE Request
;
3653 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_CP
, CSR_CONSOLE
);
3654 Request
.Data
.SetConsoleCodePage
.CodePage
= wCodePageID
;
3656 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3657 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3659 SetLastErrorByStatus(Status
);
3662 return NT_SUCCESS(Status
);
3666 /*--------------------------------------------------------------
3667 * GetConsoleOutputCP
3673 GetConsoleOutputCP(VOID
)
3675 CSR_API_MESSAGE Request
;
3679 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_OUTPUT_CP
, CSR_CONSOLE
);
3680 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3681 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3683 SetLastErrorByStatus (Status
);
3687 return Request
.Data
.GetConsoleOutputCodePage
.CodePage
;
3691 /*--------------------------------------------------------------
3692 * SetConsoleOutputCP
3698 SetConsoleOutputCP(UINT wCodePageID
)
3700 CSR_API_MESSAGE Request
;
3704 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_OUTPUT_CP
, CSR_CONSOLE
);
3705 Request
.Data
.SetConsoleOutputCodePage
.CodePage
= wCodePageID
;
3706 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3707 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3709 SetLastErrorByStatus(Status
);
3712 return NT_SUCCESS(Status
);
3716 /*--------------------------------------------------------------
3717 * GetConsoleProcessList
3723 GetConsoleProcessList(LPDWORD lpdwProcessList
,
3724 DWORD dwProcessCount
)
3726 PCSR_CAPTURE_BUFFER CaptureBuffer
;
3727 CSR_API_MESSAGE Request
;
3732 if (lpdwProcessList
== NULL
|| dwProcessCount
== 0)
3734 SetLastError(ERROR_INVALID_PARAMETER
);
3738 CaptureBuffer
= CsrAllocateCaptureBuffer(1, dwProcessCount
* sizeof(DWORD
));
3739 if (CaptureBuffer
== NULL
)
3741 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3745 CsrRequest
= MAKE_CSR_API(GET_PROCESS_LIST
, CSR_CONSOLE
);
3746 Request
.Data
.GetProcessListRequest
.nMaxIds
= dwProcessCount
;
3747 CsrAllocateMessagePointer(CaptureBuffer
,
3748 dwProcessCount
* sizeof(DWORD
),
3749 (PVOID
*)&Request
.Data
.GetProcessListRequest
.ProcessId
);
3751 Status
= CsrClientCallServer(&Request
,
3754 sizeof(CSR_API_MESSAGE
));
3755 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3757 SetLastErrorByStatus (Status
);
3762 nProcesses
= Request
.Data
.GetProcessListRequest
.nProcessIdsTotal
;
3763 if (dwProcessCount
>= nProcesses
)
3765 memcpy(lpdwProcessList
, Request
.Data
.GetProcessListRequest
.ProcessId
, nProcesses
* sizeof(DWORD
));
3769 CsrFreeCaptureBuffer(CaptureBuffer
);
3775 /*--------------------------------------------------------------
3776 * GetConsoleSelectionInfo
3782 GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo
)
3784 CSR_API_MESSAGE Request
;
3785 ULONG CsrRequest
= MAKE_CSR_API(GET_CONSOLE_SELECTION_INFO
, CSR_CONSOLE
);
3786 NTSTATUS Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3787 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3789 SetLastErrorByStatus(Status
);
3793 *lpConsoleSelectionInfo
= Request
.Data
.GetConsoleSelectionInfo
.Info
;
3799 /*--------------------------------------------------------------
3806 AttachConsole(DWORD dwProcessId
)
3808 DPRINT1("AttachConsole(0x%x) UNIMPLEMENTED!\n", dwProcessId
);
3812 /*--------------------------------------------------------------
3819 GetConsoleWindow(VOID
)
3821 CSR_API_MESSAGE Request
;
3825 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_WINDOW
, CSR_CONSOLE
);
3826 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3827 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3829 SetLastErrorByStatus(Status
);
3833 return Request
.Data
.GetConsoleWindowRequest
.WindowHandle
;
3837 /*--------------------------------------------------------------
3844 SetConsoleIcon(HICON hicon
)
3846 CSR_API_MESSAGE Request
;
3850 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_ICON
, CSR_CONSOLE
);
3851 Request
.Data
.SetConsoleIconRequest
.WindowIcon
= hicon
;
3853 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3854 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3856 SetLastErrorByStatus(Status
);
3860 return NT_SUCCESS(Status
);
3864 /******************************************************************************
3865 * \name SetConsoleInputExeNameW
3866 * \brief Sets the console input file name from a unicode string.
3867 * \param lpInputExeName Pointer to a unicode string with the name.
3868 * \return TRUE if successful, FALSE if unsuccsedful.
3869 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
3870 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
3874 SetConsoleInputExeNameW(LPCWSTR lpInputExeName
)
3879 || (lenName
= lstrlenW(lpInputExeName
)) == 0
3880 || lenName
> INPUTEXENAME_BUFLEN
- 1)
3882 /* Fail if string is empty or too long */
3883 SetLastError(ERROR_INVALID_PARAMETER
);
3887 RtlEnterCriticalSection(&ConsoleLock
);
3890 RtlCopyMemory(InputExeName
, lpInputExeName
, lenName
* sizeof(WCHAR
));
3891 InputExeName
[lenName
] = L
'\0';
3895 RtlLeaveCriticalSection(&ConsoleLock
);
3903 /******************************************************************************
3904 * \name SetConsoleInputExeNameA
3905 * \brief Sets the console input file name from an ansi string.
3906 * \param lpInputExeName Pointer to an ansi string with the name.
3907 * \return TRUE if successful, FALSE if unsuccsedful.
3908 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
3909 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
3913 SetConsoleInputExeNameA(LPCSTR lpInputExeName
)
3915 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
3916 ANSI_STRING InputExeNameA
;
3917 UNICODE_STRING InputExeNameU
;
3921 RtlInitAnsiString(&InputExeNameA
, lpInputExeName
);
3923 if(InputExeNameA
.Length
== 0 ||
3924 InputExeNameA
.Length
> INPUTEXENAME_BUFLEN
- 1)
3926 /* Fail if string is empty or too long */
3927 SetLastError(ERROR_INVALID_PARAMETER
);
3931 InputExeNameU
.Buffer
= Buffer
;
3932 InputExeNameU
.MaximumLength
= sizeof(Buffer
);
3933 InputExeNameU
.Length
= 0;
3934 Status
= RtlAnsiStringToUnicodeString(&InputExeNameU
, &InputExeNameA
, FALSE
);
3935 if(NT_SUCCESS(Status
))
3937 Ret
= SetConsoleInputExeNameW(InputExeNameU
.Buffer
);
3941 SetLastErrorByStatus(Status
);
3949 /******************************************************************************
3950 * \name GetConsoleInputExeNameW
3951 * \brief Retrieves the console input file name as unicode string.
3952 * \param nBufferLength Length of the buffer in WCHARs.
3953 * Specify 0 to recieve the needed buffer length.
3954 * \param lpBuffer Pointer to a buffer that recieves the string.
3955 * \return Needed buffer size if \p nBufferLength is 0.
3956 * Otherwise 1 if successful, 2 if buffer is too small.
3957 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
3958 * is not big enough.
3962 GetConsoleInputExeNameW(DWORD nBufferLength
, LPWSTR lpBuffer
)
3964 int lenName
= lstrlenW(InputExeName
);
3966 if (nBufferLength
== 0)
3968 /* Buffer size is requested, return it */
3972 if(lenName
+ 1 > nBufferLength
)
3974 /* Buffer is not large enough! */
3975 SetLastError(ERROR_BUFFER_OVERFLOW
);
3979 RtlEnterCriticalSection(&ConsoleLock
);
3982 RtlCopyMemory(lpBuffer
, InputExeName
, lenName
* sizeof(WCHAR
));
3983 lpBuffer
[lenName
] = '\0';
3987 RtlLeaveCriticalSection(&ConsoleLock
);
3991 /* Success, return 1 */
3996 /******************************************************************************
3997 * \name GetConsoleInputExeNameA
3998 * \brief Retrieves the console input file name as ansi string.
3999 * \param nBufferLength Length of the buffer in CHARs.
4000 * \param lpBuffer Pointer to a buffer that recieves the string.
4001 * \return 1 if successful, 2 if buffer is too small.
4002 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
4003 * is not big enough. The buffer recieves as much characters as fit.
4007 GetConsoleInputExeNameA(DWORD nBufferLength
, LPSTR lpBuffer
)
4009 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
4011 UNICODE_STRING BufferU
;
4012 ANSI_STRING BufferA
;
4014 /* Get the unicode name */
4015 Ret
= GetConsoleInputExeNameW(sizeof(Buffer
) / sizeof(Buffer
[0]), Buffer
);
4017 /* Initialize strings for conversion */
4018 RtlInitUnicodeString(&BufferU
, Buffer
);
4020 BufferA
.MaximumLength
= nBufferLength
;
4021 BufferA
.Buffer
= lpBuffer
;
4023 /* Convert unicode name to ansi, copying as much chars as fit */
4024 RtlUnicodeStringToAnsiString(&BufferA
, &BufferU
, FALSE
);
4026 /* Error handling */
4027 if(nBufferLength
<= BufferU
.Length
/ sizeof(WCHAR
))
4029 SetLastError(ERROR_BUFFER_OVERFLOW
);
4037 /*--------------------------------------------------------------
4038 * GetConsoleHistoryInfo
4044 GetConsoleHistoryInfo(PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo
)
4046 DPRINT1("GetConsoleHistoryInfo(0x%p) UNIMPLEMENTED!\n", lpConsoleHistoryInfo
);
4047 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4052 /*--------------------------------------------------------------
4053 * SetConsoleHistoryInfo
4059 SetConsoleHistoryInfo(IN PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo
)
4061 DPRINT1("SetConsoleHistoryInfo(0x%p) UNIMPLEMENTED!\n", lpConsoleHistoryInfo
);
4062 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4067 /*--------------------------------------------------------------
4068 * GetConsoleOriginalTitleW
4074 GetConsoleOriginalTitleW(OUT LPWSTR lpConsoleTitle
,
4077 DPRINT1("GetConsoleOriginalTitleW(0x%p, 0x%x) UNIMPLEMENTED!\n", lpConsoleTitle
, nSize
);
4078 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4083 /*--------------------------------------------------------------
4084 * GetConsoleOriginalTitleA
4090 GetConsoleOriginalTitleA(OUT LPSTR lpConsoleTitle
,
4093 DPRINT1("GetConsoleOriginalTitleA(0x%p, 0x%x) UNIMPLEMENTED!\n", lpConsoleTitle
, nSize
);
4094 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4099 /*--------------------------------------------------------------
4100 * GetConsoleScreenBufferInfoEx
4106 GetConsoleScreenBufferInfoEx(IN HANDLE hConsoleOutput
,
4107 OUT PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx
)
4109 DPRINT1("GetConsoleScreenBufferInfoEx(0x%p, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput
, lpConsoleScreenBufferInfoEx
);
4110 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4115 /*--------------------------------------------------------------
4116 * SetConsoleScreenBufferInfoEx
4122 SetConsoleScreenBufferInfoEx(IN HANDLE hConsoleOutput
,
4123 IN PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx
)
4125 DPRINT1("SetConsoleScreenBufferInfoEx(0x%p, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput
, lpConsoleScreenBufferInfoEx
);
4126 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4131 /*--------------------------------------------------------------
4132 * GetCurrentConsoleFontEx
4138 GetCurrentConsoleFontEx(IN HANDLE hConsoleOutput
,
4139 IN BOOL bMaximumWindow
,
4140 OUT PCONSOLE_FONT_INFOEX lpConsoleCurrentFontEx
)
4142 DPRINT1("GetCurrentConsoleFontEx(0x%p, 0x%x, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput
, bMaximumWindow
, lpConsoleCurrentFontEx
);
4143 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);