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 (0 == _wcsicmp(wsName
, L
"CONIN$"))
998 CsrRequest
= MAKE_CSR_API(GET_INPUT_HANDLE
, CSR_NATIVE
);
1000 else if (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
;
1026 Status
= CsrClientCallServer(&Request
,
1029 sizeof(CSR_API_MESSAGE
));
1030 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1032 SetLastErrorByStatus(Status
);
1033 return INVALID_HANDLE_VALUE
;
1036 return Request
.Data
.GetInputHandleRequest
.InputHandle
;
1041 * @unimplemented (Undocumented)
1045 SetConsoleCommandHistoryMode(DWORD dwMode
)
1047 DPRINT1("SetConsoleCommandHistoryMode(0x%x) UNIMPLEMENTED!\n", dwMode
);
1048 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1054 * @unimplemented (Undocumented)
1058 SetConsoleCursor(DWORD Unknown0
,
1061 DPRINT1("SetConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1062 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1072 SetConsoleDisplayMode(HANDLE hOut
,
1076 * FUNCTION: Set the console display mode.
1078 * hOut - Standard output handle.
1079 * dwNewMode - New mode.
1080 * lpdwOldMode - Address of a variable that receives the old mode.
1083 DPRINT1("SetConsoleDisplayMode(0x%x, 0x%x, 0x%p) UNIMPLEMENTED!\n", hOut
, dwNewMode
, lpdwOldMode
);
1084 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1090 * @unimplemented (Undocumented)
1094 SetConsoleFont(DWORD Unknown0
,
1097 DPRINT1("SetConsoleFont(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1098 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1104 * @implemented (Undocumented)
1108 SetConsoleHardwareState(HANDLE hConsole
,
1112 CSR_API_MESSAGE Request
;
1116 CsrRequest
= MAKE_CSR_API(SETGET_CONSOLE_HW_STATE
, CSR_CONSOLE
);
1117 Request
.Data
.ConsoleHardwareStateRequest
.ConsoleHandle
= hConsole
;
1118 Request
.Data
.ConsoleHardwareStateRequest
.SetGet
= CONSOLE_HARDWARE_STATE_SET
;
1119 Request
.Data
.ConsoleHardwareStateRequest
.State
= State
;
1121 Status
= CsrClientCallServer(&Request
,
1124 sizeof(CSR_API_MESSAGE
));
1125 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1127 SetLastErrorByStatus(Status
);
1136 * @unimplemented (Undocumented)
1140 SetConsoleKeyShortcuts(DWORD Unknown0
,
1145 DPRINT1("SetConsoleKeyShortcuts(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
1146 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1152 * @unimplemented (Undocumented)
1156 SetConsoleMaximumWindowSize(DWORD Unknown0
,
1159 DPRINT1("SetConsoleMaximumWindowSize(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1160 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1166 * @unimplemented (Undocumented)
1170 SetConsoleMenuClose(DWORD Unknown0
)
1172 DPRINT1("SetConsoleMenuClose(0x%x) UNIMPLEMENTED!\n", Unknown0
);
1173 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1179 * @unimplemented (Undocumented)
1183 SetConsoleNumberOfCommandsA(DWORD Unknown0
,
1186 DPRINT1("SetConsoleNumberOfCommandsA(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1187 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1193 * @unimplemented (Undocumented)
1197 SetConsoleNumberOfCommandsW(DWORD Unknown0
,
1200 DPRINT1("SetConsoleNumberOfCommandsW(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1201 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1207 * @unimplemented (Undocumented)
1211 SetConsolePalette(DWORD Unknown0
,
1215 DPRINT1("SetConsolePalette(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
);
1216 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1222 * @unimplemented (Undocumented)
1226 SetLastConsoleEventActive(VOID
)
1228 DPRINT1("SetLastConsoleEventActive() UNIMPLEMENTED!\n");
1229 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1235 * @unimplemented (Undocumented)
1239 ShowConsoleCursor(DWORD Unknown0
,
1242 DPRINT1("ShowConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1243 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1249 * FUNCTION: Checks whether the given handle is a valid console handle.
1251 * Handle - Handle to be checked
1253 * TRUE: Handle is a valid console handle
1254 * FALSE: Handle is not a valid console handle.
1255 * STATUS: Officially undocumented
1261 VerifyConsoleIoHandle(HANDLE Handle
)
1263 CSR_API_MESSAGE Request
;
1267 CsrRequest
= MAKE_CSR_API(VERIFY_HANDLE
, CSR_NATIVE
);
1268 Request
.Data
.VerifyHandleRequest
.Handle
= Handle
;
1270 Status
= CsrClientCallServer(&Request
,
1273 sizeof(CSR_API_MESSAGE
));
1274 if (!NT_SUCCESS(Status
))
1276 SetLastErrorByStatus(Status
);
1280 return (BOOL
)NT_SUCCESS(Request
.Status
);
1289 WriteConsoleInputVDMA(DWORD Unknown0
,
1294 DPRINT1("WriteConsoleInputVDMA(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
1295 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1305 WriteConsoleInputVDMW(DWORD Unknown0
,
1310 DPRINT1("WriteConsoleInputVDMW(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
1311 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1317 * @implemented (Undocumented)
1321 CloseConsoleHandle(HANDLE Handle
)
1323 CSR_API_MESSAGE Request
;
1327 CsrRequest
= MAKE_CSR_API(CLOSE_HANDLE
, CSR_NATIVE
);
1328 Request
.Data
.CloseHandleRequest
.Handle
= Handle
;
1330 Status
= CsrClientCallServer(&Request
,
1333 sizeof(CSR_API_MESSAGE
));
1334 if (!NT_SUCCESS(Status
))
1336 SetLastErrorByStatus(Status
);
1348 GetStdHandle(DWORD nStdHandle
)
1350 * FUNCTION: Get a handle for the standard input, standard output
1351 * and a standard error device.
1353 * nStdHandle - Specifies the device for which to return the handle.
1354 * RETURNS: If the function succeeds, the return value is the handle
1355 * of the specified device. Otherwise the value is INVALID_HANDLE_VALUE.
1358 PRTL_USER_PROCESS_PARAMETERS Ppb
;
1360 Ppb
= NtCurrentPeb()->ProcessParameters
;
1363 case STD_INPUT_HANDLE
:
1364 return Ppb
->StandardInput
;
1366 case STD_OUTPUT_HANDLE
:
1367 return Ppb
->StandardOutput
;
1369 case STD_ERROR_HANDLE
:
1370 return Ppb
->StandardError
;
1373 SetLastError (ERROR_INVALID_PARAMETER
);
1374 return INVALID_HANDLE_VALUE
;
1383 SetStdHandle(DWORD nStdHandle
,
1386 * FUNCTION: Set the handle for the standard input, standard output or
1387 * the standard error device.
1389 * nStdHandle - Specifies the handle to be set.
1390 * hHandle - The handle to set.
1391 * RETURNS: TRUE if the function succeeds, FALSE otherwise.
1394 PRTL_USER_PROCESS_PARAMETERS Ppb
;
1396 /* no need to check if hHandle == INVALID_HANDLE_VALUE */
1398 Ppb
= NtCurrentPeb()->ProcessParameters
;
1402 case STD_INPUT_HANDLE
:
1403 Ppb
->StandardInput
= hHandle
;
1406 case STD_OUTPUT_HANDLE
:
1407 Ppb
->StandardOutput
= hHandle
;
1410 case STD_ERROR_HANDLE
:
1411 Ppb
->StandardError
= hHandle
;
1415 /* windows for whatever reason sets the last error to ERROR_INVALID_HANDLE here */
1416 SetLastError(ERROR_INVALID_HANDLE
);
1423 IntWriteConsole(HANDLE hConsoleOutput
,
1425 DWORD nNumberOfCharsToWrite
,
1426 LPDWORD lpNumberOfCharsWritten
,
1430 PCSR_API_MESSAGE Request
;
1434 ULONG SizeBytes
, CharSize
;
1437 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
1438 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
1440 max(sizeof(CSR_API_MESSAGE
),
1441 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE
) + min(nNumberOfCharsToWrite
,
1442 CSRSS_MAX_WRITE_CONSOLE
/ CharSize
) * CharSize
));
1443 if (Request
== NULL
)
1445 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1449 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE
, CSR_CONSOLE
);
1451 while (nNumberOfCharsToWrite
> 0)
1453 Request
->Data
.WriteConsoleRequest
.ConsoleHandle
= hConsoleOutput
;
1454 Request
->Data
.WriteConsoleRequest
.Unicode
= bUnicode
;
1456 nChars
= (USHORT
)min(nNumberOfCharsToWrite
, CSRSS_MAX_WRITE_CONSOLE
/ CharSize
);
1457 Request
->Data
.WriteConsoleRequest
.NrCharactersToWrite
= nChars
;
1459 SizeBytes
= nChars
* CharSize
;
1461 memcpy(Request
->Data
.WriteConsoleRequest
.Buffer
, lpBuffer
, SizeBytes
);
1463 Status
= CsrClientCallServer(Request
,
1466 max(sizeof(CSR_API_MESSAGE
),
1467 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE
) + SizeBytes
));
1469 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
1471 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1472 SetLastErrorByStatus(Status
);
1476 nNumberOfCharsToWrite
-= nChars
;
1477 lpBuffer
= (PVOID
)((ULONG_PTR
)lpBuffer
+ (ULONG_PTR
)SizeBytes
);
1478 Written
+= Request
->Data
.WriteConsoleRequest
.NrCharactersWritten
;
1481 if (lpNumberOfCharsWritten
!= NULL
)
1483 *lpNumberOfCharsWritten
= Written
;
1485 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1491 /*--------------------------------------------------------------
1498 WriteConsoleA(HANDLE hConsoleOutput
,
1499 CONST VOID
*lpBuffer
,
1500 DWORD nNumberOfCharsToWrite
,
1501 LPDWORD lpNumberOfCharsWritten
,
1504 return IntWriteConsole(hConsoleOutput
,
1506 nNumberOfCharsToWrite
,
1507 lpNumberOfCharsWritten
,
1513 /*--------------------------------------------------------------
1520 WriteConsoleW(HANDLE hConsoleOutput
,
1521 CONST VOID
*lpBuffer
,
1522 DWORD nNumberOfCharsToWrite
,
1523 LPDWORD lpNumberOfCharsWritten
,
1526 return IntWriteConsole(hConsoleOutput
,
1528 nNumberOfCharsToWrite
,
1529 lpNumberOfCharsWritten
,
1537 IntReadConsole(HANDLE hConsoleInput
,
1539 DWORD nNumberOfCharsToRead
,
1540 LPDWORD lpNumberOfCharsRead
,
1541 PCONSOLE_READCONSOLE_CONTROL lpReserved
,
1544 PCSR_API_MESSAGE Request
;
1547 ULONG CharSize
, CharsRead
= 0;
1549 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
1550 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
1552 max(sizeof(CSR_API_MESSAGE
),
1553 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE
) + min(nNumberOfCharsToRead
,
1554 CSRSS_MAX_READ_CONSOLE
/ CharSize
) * CharSize
));
1555 if (Request
== NULL
)
1557 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1561 Request
->Status
= STATUS_SUCCESS
;
1562 CsrRequest
= MAKE_CSR_API(READ_CONSOLE
, CSR_CONSOLE
);
1566 if (Request
->Status
== STATUS_PENDING
)
1568 Status
= NtWaitForSingleObject(Request
->Data
.ReadConsoleRequest
.EventHandle
,
1571 if (!NT_SUCCESS(Status
))
1573 DPRINT1("Wait for console input failed!\n");
1578 Request
->Data
.ReadConsoleRequest
.ConsoleHandle
= hConsoleInput
;
1579 Request
->Data
.ReadConsoleRequest
.Unicode
= bUnicode
;
1580 Request
->Data
.ReadConsoleRequest
.NrCharactersToRead
= (WORD
)min(nNumberOfCharsToRead
, CSRSS_MAX_READ_CONSOLE
/ CharSize
);
1581 Request
->Data
.ReadConsoleRequest
.nCharsCanBeDeleted
= (WORD
)CharsRead
;
1583 Status
= CsrClientCallServer(Request
,
1586 max(sizeof(CSR_API_MESSAGE
),
1587 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE
)
1588 + Request
->Data
.ReadConsoleRequest
.NrCharactersToRead
* CharSize
));
1590 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
1592 DPRINT1("CSR returned error in ReadConsole\n");
1593 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1594 SetLastErrorByStatus(Status
);
1598 nNumberOfCharsToRead
-= Request
->Data
.ReadConsoleRequest
.NrCharactersRead
;
1599 memcpy((PVOID
)((ULONG_PTR
)lpBuffer
+ (ULONG_PTR
)(CharsRead
* CharSize
)),
1600 Request
->Data
.ReadConsoleRequest
.Buffer
,
1601 Request
->Data
.ReadConsoleRequest
.NrCharactersRead
* CharSize
);
1602 CharsRead
+= Request
->Data
.ReadConsoleRequest
.NrCharactersRead
;
1604 if (Request
->Status
== STATUS_NOTIFY_CLEANUP
)
1609 nNumberOfCharsToRead
++;
1611 Request
->Status
= STATUS_PENDING
;
1614 while (Request
->Status
== STATUS_PENDING
&& nNumberOfCharsToRead
> 0);
1616 if (lpNumberOfCharsRead
!= NULL
)
1618 *lpNumberOfCharsRead
= CharsRead
;
1621 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1627 /*--------------------------------------------------------------
1634 ReadConsoleA(HANDLE hConsoleInput
,
1636 DWORD nNumberOfCharsToRead
,
1637 LPDWORD lpNumberOfCharsRead
,
1638 PCONSOLE_READCONSOLE_CONTROL pInputControl
)
1640 return IntReadConsole(hConsoleInput
,
1642 nNumberOfCharsToRead
,
1643 lpNumberOfCharsRead
,
1649 /*--------------------------------------------------------------
1656 ReadConsoleW(HANDLE hConsoleInput
,
1658 DWORD nNumberOfCharsToRead
,
1659 LPDWORD lpNumberOfCharsRead
,
1660 PCONSOLE_READCONSOLE_CONTROL pInputControl
)
1662 return IntReadConsole(hConsoleInput
,
1664 nNumberOfCharsToRead
,
1665 lpNumberOfCharsRead
,
1671 /*--------------------------------------------------------------
1680 CSR_API_MESSAGE Request
;
1685 if (NtCurrentPeb()->ProcessParameters
->ConsoleHandle
)
1687 DPRINT("AllocConsole: Allocate duplicate console to the same Process\n");
1688 SetLastErrorByStatus (STATUS_OBJECT_NAME_EXISTS
);
1692 Request
.Data
.AllocConsoleRequest
.CtrlDispatcher
= ConsoleControlDispatcher
;
1693 Request
.Data
.AllocConsoleRequest
.ConsoleNeeded
= TRUE
;
1695 CsrRequest
= MAKE_CSR_API(ALLOC_CONSOLE
, CSR_CONSOLE
);
1697 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
1698 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1700 SetLastErrorByStatus(Status
);
1704 NtCurrentPeb()->ProcessParameters
->ConsoleHandle
= Request
.Data
.AllocConsoleRequest
.Console
;
1706 SetStdHandle(STD_INPUT_HANDLE
, Request
.Data
.AllocConsoleRequest
.InputHandle
);
1707 SetStdHandle(STD_OUTPUT_HANDLE
, Request
.Data
.AllocConsoleRequest
.OutputHandle
);
1709 hStdError
= DuplicateConsoleHandle(Request
.Data
.AllocConsoleRequest
.OutputHandle
,
1712 DUPLICATE_SAME_ACCESS
);
1714 SetStdHandle(STD_ERROR_HANDLE
, hStdError
);
1719 /*--------------------------------------------------------------
1728 // AG: I'm not sure if this is correct (what happens to std handles?)
1729 // but I just tried to reverse what AllocConsole() does...
1731 CSR_API_MESSAGE Request
;
1735 CsrRequest
= MAKE_CSR_API(FREE_CONSOLE
, CSR_CONSOLE
);
1737 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
1738 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1740 SetLastErrorByStatus(Status
);
1744 NtCurrentPeb()->ProcessParameters
->ConsoleHandle
= NULL
;
1749 /*--------------------------------------------------------------
1750 * GetConsoleScreenBufferInfo
1756 GetConsoleScreenBufferInfo(HANDLE hConsoleOutput
,
1757 PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
)
1759 CSR_API_MESSAGE Request
;
1763 CsrRequest
= MAKE_CSR_API(SCREEN_BUFFER_INFO
, CSR_CONSOLE
);
1764 Request
.Data
.ScreenBufferInfoRequest
.ConsoleHandle
= hConsoleOutput
;
1766 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
1767 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1769 SetLastErrorByStatus(Status
);
1772 *lpConsoleScreenBufferInfo
= Request
.Data
.ScreenBufferInfoRequest
.Info
;
1777 /*--------------------------------------------------------------
1778 * SetConsoleCursorPosition
1784 SetConsoleCursorPosition(HANDLE hConsoleOutput
,
1785 COORD dwCursorPosition
)
1787 CSR_API_MESSAGE Request
;
1791 CsrRequest
= MAKE_CSR_API(SET_CURSOR
, CSR_CONSOLE
);
1792 Request
.Data
.SetCursorRequest
.ConsoleHandle
= hConsoleOutput
;
1793 Request
.Data
.SetCursorRequest
.Position
= dwCursorPosition
;
1795 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
1796 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1798 SetLastErrorByStatus(Status
);
1808 IntFillConsoleOutputCharacter(HANDLE hConsoleOutput
,
1812 LPDWORD lpNumberOfCharsWritten
,
1815 CSR_API_MESSAGE Request
;
1819 CsrRequest
= MAKE_CSR_API(FILL_OUTPUT
, CSR_CONSOLE
);
1820 Request
.Data
.FillOutputRequest
.ConsoleHandle
= hConsoleOutput
;
1821 Request
.Data
.FillOutputRequest
.Unicode
= bUnicode
;
1824 Request
.Data
.FillOutputRequest
.Char
.UnicodeChar
= *((WCHAR
*)cCharacter
);
1826 Request
.Data
.FillOutputRequest
.Char
.AsciiChar
= *((CHAR
*)cCharacter
);
1828 Request
.Data
.FillOutputRequest
.Position
= dwWriteCoord
;
1829 Request
.Data
.FillOutputRequest
.Length
= (WORD
)nLength
;
1831 Status
= CsrClientCallServer(&Request
,
1834 sizeof(CSR_API_MESSAGE
));
1836 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1838 SetLastErrorByStatus(Status
);
1842 if(lpNumberOfCharsWritten
!= NULL
)
1844 *lpNumberOfCharsWritten
= Request
.Data
.FillOutputRequest
.NrCharactersWritten
;
1850 /*--------------------------------------------------------------
1851 * FillConsoleOutputCharacterA
1857 FillConsoleOutputCharacterA(HANDLE hConsoleOutput
,
1861 LPDWORD lpNumberOfCharsWritten
)
1863 return IntFillConsoleOutputCharacter(hConsoleOutput
,
1867 lpNumberOfCharsWritten
,
1872 /*--------------------------------------------------------------
1873 * FillConsoleOutputCharacterW
1879 FillConsoleOutputCharacterW(HANDLE hConsoleOutput
,
1883 LPDWORD lpNumberOfCharsWritten
)
1885 return IntFillConsoleOutputCharacter(hConsoleOutput
,
1889 lpNumberOfCharsWritten
,
1896 IntPeekConsoleInput(HANDLE hConsoleInput
,
1897 PINPUT_RECORD lpBuffer
,
1899 LPDWORD lpNumberOfEventsRead
,
1902 CSR_API_MESSAGE Request
;
1904 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1908 if (lpBuffer
== NULL
)
1910 SetLastError(ERROR_INVALID_PARAMETER
);
1914 Size
= nLength
* sizeof(INPUT_RECORD
);
1916 /* Allocate a Capture Buffer */
1917 DPRINT("IntPeekConsoleInput: %lx %p\n", Size
, lpNumberOfEventsRead
);
1918 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
1920 /* Allocate space in the Buffer */
1921 CsrCaptureMessageBuffer(CaptureBuffer
,
1924 (PVOID
*)&Request
.Data
.PeekConsoleInputRequest
.InputRecord
);
1926 /* Set up the data to send to the Console Server */
1927 CsrRequest
= MAKE_CSR_API(PEEK_CONSOLE_INPUT
, CSR_CONSOLE
);
1928 Request
.Data
.PeekConsoleInputRequest
.ConsoleHandle
= hConsoleInput
;
1929 Request
.Data
.PeekConsoleInputRequest
.Unicode
= bUnicode
;
1930 Request
.Data
.PeekConsoleInputRequest
.Length
= nLength
;
1932 /* Call the server */
1933 Status
= CsrClientCallServer(&Request
,
1936 sizeof(CSR_API_MESSAGE
));
1937 DPRINT("Server returned: %x\n", Request
.Status
);
1939 /* Check for success*/
1940 if (NT_SUCCESS(Request
.Status
))
1942 /* Return the number of events read */
1943 DPRINT("Events read: %lx\n", Request
.Data
.PeekConsoleInputRequest
.Length
);
1944 *lpNumberOfEventsRead
= Request
.Data
.PeekConsoleInputRequest
.Length
;
1946 /* Copy into the buffer */
1947 DPRINT("Copying to buffer\n");
1948 RtlCopyMemory(lpBuffer
,
1949 Request
.Data
.PeekConsoleInputRequest
.InputRecord
,
1950 sizeof(INPUT_RECORD
) * *lpNumberOfEventsRead
);
1955 *lpNumberOfEventsRead
= 0;
1956 SetLastErrorByStatus(Request
.Status
);
1959 /* Release the capture buffer */
1960 CsrFreeCaptureBuffer(CaptureBuffer
);
1962 /* Return TRUE or FALSE */
1963 return NT_SUCCESS(Request
.Status
);
1966 /*--------------------------------------------------------------
1973 PeekConsoleInputA(HANDLE hConsoleInput
,
1974 PINPUT_RECORD lpBuffer
,
1976 LPDWORD lpNumberOfEventsRead
)
1978 return IntPeekConsoleInput(hConsoleInput
,
1981 lpNumberOfEventsRead
,
1986 /*--------------------------------------------------------------
1993 PeekConsoleInputW(HANDLE hConsoleInput
,
1994 PINPUT_RECORD lpBuffer
,
1996 LPDWORD lpNumberOfEventsRead
)
1998 return IntPeekConsoleInput(hConsoleInput
,
2000 lpNumberOfEventsRead
,
2007 IntReadConsoleInput(HANDLE hConsoleInput
,
2008 PINPUT_RECORD lpBuffer
,
2010 LPDWORD lpNumberOfEventsRead
,
2013 CSR_API_MESSAGE Request
;
2018 CsrRequest
= MAKE_CSR_API(READ_INPUT
, CSR_CONSOLE
);
2023 Request
.Data
.ReadInputRequest
.ConsoleHandle
= hConsoleInput
;
2024 Request
.Data
.ReadInputRequest
.Unicode
= bUnicode
;
2026 Status
= CsrClientCallServer(&Request
,
2029 sizeof(CSR_API_MESSAGE
));
2030 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2034 /* we couldn't read a single record, fail */
2035 SetLastErrorByStatus(Status
);
2040 /* FIXME - fail gracefully in case we already read at least one record? */
2044 else if (Status
== STATUS_PENDING
)
2048 Status
= NtWaitForSingleObject(Request
.Data
.ReadInputRequest
.Event
, FALSE
, 0);
2049 if (!NT_SUCCESS(Status
))
2051 SetLastErrorByStatus(Status
);
2057 /* nothing more to read (waiting for more input??), let's just bail */
2063 lpBuffer
[Read
++] = Request
.Data
.ReadInputRequest
.Input
;
2066 if (!Request
.Data
.ReadInputRequest
.MoreEvents
)
2068 /* nothing more to read, bail */
2074 if (lpNumberOfEventsRead
!= NULL
)
2076 *lpNumberOfEventsRead
= Read
;
2083 /*--------------------------------------------------------------
2090 ReadConsoleInputA(HANDLE hConsoleInput
,
2091 PINPUT_RECORD lpBuffer
,
2093 LPDWORD lpNumberOfEventsRead
)
2095 return IntReadConsoleInput(hConsoleInput
,
2098 lpNumberOfEventsRead
,
2103 /*--------------------------------------------------------------
2110 ReadConsoleInputW(HANDLE hConsoleInput
,
2111 PINPUT_RECORD lpBuffer
,
2113 LPDWORD lpNumberOfEventsRead
)
2115 return IntReadConsoleInput(hConsoleInput
,
2118 lpNumberOfEventsRead
,
2125 IntWriteConsoleInput(HANDLE hConsoleInput
,
2126 PINPUT_RECORD lpBuffer
,
2128 LPDWORD lpNumberOfEventsWritten
,
2131 CSR_API_MESSAGE Request
;
2133 PCSR_CAPTURE_BUFFER CaptureBuffer
;
2137 if (lpBuffer
== NULL
)
2139 SetLastError(ERROR_INVALID_PARAMETER
);
2143 Size
= nLength
* sizeof(INPUT_RECORD
);
2145 /* Allocate a Capture Buffer */
2146 DPRINT("IntWriteConsoleInput: %lx %p\n", Size
, lpNumberOfEventsWritten
);
2147 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
2149 /* Allocate space in the Buffer */
2150 CsrCaptureMessageBuffer(CaptureBuffer
,
2153 (PVOID
*)&Request
.Data
.WriteConsoleInputRequest
.InputRecord
);
2155 /* Set up the data to send to the Console Server */
2156 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_INPUT
, CSR_CONSOLE
);
2157 Request
.Data
.WriteConsoleInputRequest
.ConsoleHandle
= hConsoleInput
;
2158 Request
.Data
.WriteConsoleInputRequest
.Unicode
= bUnicode
;
2159 Request
.Data
.WriteConsoleInputRequest
.Length
= nLength
;
2161 /* Call the server */
2162 Status
= CsrClientCallServer(&Request
,
2165 sizeof(CSR_API_MESSAGE
));
2166 DPRINT("Server returned: %x\n", Request
.Status
);
2168 /* Check for success*/
2169 if (NT_SUCCESS(Request
.Status
))
2171 /* Return the number of events read */
2172 DPRINT("Events read: %lx\n", Request
.Data
.WriteConsoleInputRequest
.Length
);
2173 *lpNumberOfEventsWritten
= Request
.Data
.WriteConsoleInputRequest
.Length
;
2178 *lpNumberOfEventsWritten
= 0;
2179 SetLastErrorByStatus(Request
.Status
);
2182 /* Release the capture buffer */
2183 CsrFreeCaptureBuffer(CaptureBuffer
);
2185 /* Return TRUE or FALSE */
2186 return NT_SUCCESS(Request
.Status
);
2190 /*--------------------------------------------------------------
2191 * WriteConsoleInputA
2197 WriteConsoleInputA(HANDLE hConsoleInput
,
2198 CONST INPUT_RECORD
*lpBuffer
,
2200 LPDWORD lpNumberOfEventsWritten
)
2202 return IntWriteConsoleInput(hConsoleInput
,
2203 (PINPUT_RECORD
)lpBuffer
,
2205 lpNumberOfEventsWritten
,
2210 /*--------------------------------------------------------------
2211 * WriteConsoleInputW
2217 WriteConsoleInputW(HANDLE hConsoleInput
,
2218 CONST INPUT_RECORD
*lpBuffer
,
2220 LPDWORD lpNumberOfEventsWritten
)
2222 return IntWriteConsoleInput(hConsoleInput
,
2223 (PINPUT_RECORD
)lpBuffer
,
2225 lpNumberOfEventsWritten
,
2232 IntReadConsoleOutput(HANDLE hConsoleOutput
,
2233 PCHAR_INFO lpBuffer
,
2235 COORD dwBufferCoord
,
2236 PSMALL_RECT lpReadRegion
,
2239 CSR_API_MESSAGE Request
;
2241 PCSR_CAPTURE_BUFFER CaptureBuffer
;
2243 DWORD Size
, SizeX
, SizeY
;
2245 if (lpBuffer
== NULL
)
2247 SetLastError(ERROR_INVALID_PARAMETER
);
2251 Size
= dwBufferSize
.X
* dwBufferSize
.Y
* sizeof(CHAR_INFO
);
2253 /* Allocate a Capture Buffer */
2254 DPRINT("IntReadConsoleOutput: %lx %p\n", Size
, lpReadRegion
);
2255 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
2257 /* Allocate space in the Buffer */
2258 CsrCaptureMessageBuffer(CaptureBuffer
,
2261 (PVOID
*)&Request
.Data
.ReadConsoleOutputRequest
.CharInfo
);
2263 /* Set up the data to send to the Console Server */
2264 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT
, CSR_CONSOLE
);
2265 Request
.Data
.ReadConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
2266 Request
.Data
.ReadConsoleOutputRequest
.Unicode
= bUnicode
;
2267 Request
.Data
.ReadConsoleOutputRequest
.BufferSize
= dwBufferSize
;
2268 Request
.Data
.ReadConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
2269 Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
= *lpReadRegion
;
2271 /* Call the server */
2272 Status
= CsrClientCallServer(&Request
,
2275 sizeof(CSR_API_MESSAGE
));
2276 DPRINT("Server returned: %x\n", Request
.Status
);
2278 /* Check for success*/
2279 if (NT_SUCCESS(Request
.Status
))
2281 /* Copy into the buffer */
2282 DPRINT("Copying to buffer\n");
2283 SizeX
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Right
-
2284 Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Left
+ 1;
2285 SizeY
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Bottom
-
2286 Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Top
+ 1;
2287 RtlCopyMemory(lpBuffer
,
2288 Request
.Data
.ReadConsoleOutputRequest
.CharInfo
,
2289 sizeof(CHAR_INFO
) * SizeX
* SizeY
);
2294 SetLastErrorByStatus(Request
.Status
);
2297 /* Return the read region */
2298 DPRINT("read region: %lx\n", Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
);
2299 *lpReadRegion
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
;
2301 /* Release the capture buffer */
2302 CsrFreeCaptureBuffer(CaptureBuffer
);
2304 /* Return TRUE or FALSE */
2305 return NT_SUCCESS(Request
.Status
);
2308 /*--------------------------------------------------------------
2309 * ReadConsoleOutputA
2315 ReadConsoleOutputA(HANDLE hConsoleOutput
,
2316 PCHAR_INFO lpBuffer
,
2318 COORD dwBufferCoord
,
2319 PSMALL_RECT lpReadRegion
)
2321 return IntReadConsoleOutput(hConsoleOutput
,
2330 /*--------------------------------------------------------------
2331 * ReadConsoleOutputW
2337 ReadConsoleOutputW(HANDLE hConsoleOutput
,
2338 PCHAR_INFO lpBuffer
,
2340 COORD dwBufferCoord
,
2341 PSMALL_RECT lpReadRegion
)
2343 return IntReadConsoleOutput(hConsoleOutput
,
2354 IntWriteConsoleOutput(HANDLE hConsoleOutput
,
2355 CONST CHAR_INFO
*lpBuffer
,
2357 COORD dwBufferCoord
,
2358 PSMALL_RECT lpWriteRegion
,
2361 CSR_API_MESSAGE Request
;
2363 PCSR_CAPTURE_BUFFER CaptureBuffer
;
2367 Size
= dwBufferSize
.Y
* dwBufferSize
.X
* sizeof(CHAR_INFO
);
2369 /* Allocate a Capture Buffer */
2370 DPRINT("IntWriteConsoleOutput: %lx %p\n", Size
, lpWriteRegion
);
2371 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
2373 /* Allocate space in the Buffer */
2374 CsrCaptureMessageBuffer(CaptureBuffer
,
2377 (PVOID
*)&Request
.Data
.WriteConsoleOutputRequest
.CharInfo
);
2379 /* Copy from the buffer */
2380 RtlCopyMemory(Request
.Data
.WriteConsoleOutputRequest
.CharInfo
, lpBuffer
, Size
);
2382 /* Set up the data to send to the Console Server */
2383 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT
, CSR_CONSOLE
);
2384 Request
.Data
.WriteConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
2385 Request
.Data
.WriteConsoleOutputRequest
.Unicode
= bUnicode
;
2386 Request
.Data
.WriteConsoleOutputRequest
.BufferSize
= dwBufferSize
;
2387 Request
.Data
.WriteConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
2388 Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
= *lpWriteRegion
;
2390 /* Call the server */
2391 Status
= CsrClientCallServer(&Request
,
2394 sizeof(CSR_API_MESSAGE
));
2395 DPRINT("Server returned: %x\n", Request
.Status
);
2397 /* Check for success*/
2398 if (!NT_SUCCESS(Request
.Status
))
2401 SetLastErrorByStatus(Request
.Status
);
2404 /* Return the read region */
2405 DPRINT("read region: %lx\n", Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
);
2406 *lpWriteRegion
= Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
;
2408 /* Release the capture buffer */
2409 CsrFreeCaptureBuffer(CaptureBuffer
);
2411 /* Return TRUE or FALSE */
2412 return NT_SUCCESS(Request
.Status
);
2415 /*--------------------------------------------------------------
2416 * WriteConsoleOutputA
2422 WriteConsoleOutputA(HANDLE hConsoleOutput
,
2423 CONST CHAR_INFO
*lpBuffer
,
2425 COORD dwBufferCoord
,
2426 PSMALL_RECT lpWriteRegion
)
2428 return IntWriteConsoleOutput(hConsoleOutput
,
2437 /*--------------------------------------------------------------
2438 * WriteConsoleOutputW
2444 WriteConsoleOutputW(HANDLE hConsoleOutput
,
2445 CONST CHAR_INFO
*lpBuffer
,
2447 COORD dwBufferCoord
,
2448 PSMALL_RECT lpWriteRegion
)
2450 return IntWriteConsoleOutput(hConsoleOutput
,
2461 IntReadConsoleOutputCharacter(HANDLE hConsoleOutput
,
2465 LPDWORD lpNumberOfCharsRead
,
2468 PCSR_API_MESSAGE Request
;
2471 ULONG nChars
, SizeBytes
, CharSize
;
2472 DWORD CharsRead
= 0;
2474 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
2476 nChars
= min(nLength
, CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR
) / CharSize
;
2477 SizeBytes
= nChars
* CharSize
;
2479 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
2480 max(sizeof(CSR_API_MESSAGE
),
2481 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR
)
2482 + min (nChars
, CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR
/ CharSize
) * CharSize
));
2483 if (Request
== NULL
)
2485 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2489 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT_CHAR
, CSR_CONSOLE
);
2490 Request
->Data
.ReadConsoleOutputCharRequest
.ReadCoord
= dwReadCoord
;
2496 Request
->Data
.ReadConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
2497 Request
->Data
.ReadConsoleOutputCharRequest
.Unicode
= bUnicode
;
2498 Request
->Data
.ReadConsoleOutputCharRequest
.NumCharsToRead
= min(nLength
, nChars
);
2499 SizeBytes
= Request
->Data
.ReadConsoleOutputCharRequest
.NumCharsToRead
* CharSize
;
2501 Status
= CsrClientCallServer(Request
,
2504 max(sizeof(CSR_API_MESSAGE
),
2505 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR
) + SizeBytes
));
2506 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Request
->Status
))
2508 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2509 SetLastErrorByStatus(Status
);
2513 BytesRead
= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
* CharSize
;
2514 memcpy(lpCharacter
, Request
->Data
.ReadConsoleOutputCharRequest
.String
, BytesRead
);
2515 lpCharacter
= (PVOID
)((ULONG_PTR
)lpCharacter
+ (ULONG_PTR
)BytesRead
);
2516 CharsRead
+= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
;
2517 nLength
-= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
;
2519 Request
->Data
.ReadConsoleOutputCharRequest
.ReadCoord
= Request
->Data
.ReadConsoleOutputCharRequest
.EndCoord
;
2522 if (lpNumberOfCharsRead
!= NULL
)
2524 *lpNumberOfCharsRead
= CharsRead
;
2527 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2533 /*--------------------------------------------------------------
2534 * ReadConsoleOutputCharacterA
2540 ReadConsoleOutputCharacterA(HANDLE hConsoleOutput
,
2544 LPDWORD lpNumberOfCharsRead
)
2546 return IntReadConsoleOutputCharacter(hConsoleOutput
,
2550 lpNumberOfCharsRead
,
2555 /*--------------------------------------------------------------
2556 * ReadConsoleOutputCharacterW
2562 ReadConsoleOutputCharacterW(HANDLE hConsoleOutput
,
2566 LPDWORD lpNumberOfCharsRead
)
2568 return IntReadConsoleOutputCharacter(hConsoleOutput
,
2572 lpNumberOfCharsRead
,
2577 /*--------------------------------------------------------------
2578 * ReadConsoleOutputAttribute
2584 ReadConsoleOutputAttribute(HANDLE hConsoleOutput
,
2588 LPDWORD lpNumberOfAttrsRead
)
2590 PCSR_API_MESSAGE Request
;
2595 if (lpNumberOfAttrsRead
!= NULL
)
2596 *lpNumberOfAttrsRead
= nLength
;
2598 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
2600 max(sizeof(CSR_API_MESSAGE
),
2601 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB
)
2602 + min (nLength
, CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
)) * sizeof(WORD
)));
2603 if (Request
== NULL
)
2605 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2609 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2611 while (nLength
!= 0)
2613 Request
->Data
.ReadConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2614 Request
->Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= dwReadCoord
;
2616 if (nLength
> CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
))
2617 Size
= CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WCHAR
);
2621 Request
->Data
.ReadConsoleOutputAttribRequest
.NumAttrsToRead
= Size
;
2623 Status
= CsrClientCallServer(Request
,
2626 max(sizeof(CSR_API_MESSAGE
),
2627 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB
) + Size
* sizeof(WORD
)));
2628 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Request
->Status
))
2630 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2631 SetLastErrorByStatus(Status
);
2635 memcpy(lpAttribute
, Request
->Data
.ReadConsoleOutputAttribRequest
.Attribute
, Size
* sizeof(WORD
));
2636 lpAttribute
+= Size
;
2638 Request
->Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= Request
->Data
.ReadConsoleOutputAttribRequest
.EndCoord
;
2641 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2649 IntWriteConsoleOutputCharacter(HANDLE hConsoleOutput
,
2653 LPDWORD lpNumberOfCharsWritten
,
2656 PCSR_API_MESSAGE Request
;
2659 ULONG SizeBytes
, CharSize
, nChars
;
2662 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
2664 nChars
= min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
/ CharSize
);
2665 SizeBytes
= nChars
* CharSize
;
2667 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
2668 max(sizeof(CSR_API_MESSAGE
),
2669 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR
)
2670 + min (nChars
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
/ CharSize
) * CharSize
));
2671 if (Request
== NULL
)
2673 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2677 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT_CHAR
, CSR_CONSOLE
);
2678 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= dwWriteCoord
;
2684 Request
->Data
.WriteConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
2685 Request
->Data
.WriteConsoleOutputCharRequest
.Unicode
= bUnicode
;
2686 Request
->Data
.WriteConsoleOutputCharRequest
.Length
= (WORD
)min(nLength
, nChars
);
2687 BytesWrite
= Request
->Data
.WriteConsoleOutputCharRequest
.Length
* CharSize
;
2689 memcpy(Request
->Data
.WriteConsoleOutputCharRequest
.String
, lpCharacter
, BytesWrite
);
2691 Status
= CsrClientCallServer(Request
,
2694 max(sizeof(CSR_API_MESSAGE
),
2695 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR
) + BytesWrite
));
2697 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
2699 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2700 SetLastErrorByStatus(Status
);
2704 nLength
-= Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
;
2705 lpCharacter
= (PVOID
)((ULONG_PTR
)lpCharacter
+ (ULONG_PTR
)(Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
* CharSize
));
2706 Written
+= Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
;
2708 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= Request
->Data
.WriteConsoleOutputCharRequest
.EndCoord
;
2711 if (lpNumberOfCharsWritten
!= NULL
)
2713 *lpNumberOfCharsWritten
= Written
;
2716 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2722 /*--------------------------------------------------------------
2723 * WriteConsoleOutputCharacterA
2729 WriteConsoleOutputCharacterA(HANDLE hConsoleOutput
,
2733 LPDWORD lpNumberOfCharsWritten
)
2735 return IntWriteConsoleOutputCharacter(hConsoleOutput
,
2739 lpNumberOfCharsWritten
,
2744 /*--------------------------------------------------------------
2745 * WriteConsoleOutputCharacterW
2751 WriteConsoleOutputCharacterW(HANDLE hConsoleOutput
,
2752 LPCWSTR lpCharacter
,
2755 LPDWORD lpNumberOfCharsWritten
)
2757 return IntWriteConsoleOutputCharacter(hConsoleOutput
,
2761 lpNumberOfCharsWritten
,
2766 /*--------------------------------------------------------------
2767 * WriteConsoleOutputAttribute
2773 WriteConsoleOutputAttribute(HANDLE hConsoleOutput
,
2774 CONST WORD
*lpAttribute
,
2777 LPDWORD lpNumberOfAttrsWritten
)
2779 PCSR_API_MESSAGE Request
;
2784 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
2786 max(sizeof(CSR_API_MESSAGE
),
2787 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB
)
2788 + min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
)) * sizeof(WORD
)));
2789 if (Request
== NULL
)
2791 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2795 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2796 Request
->Data
.WriteConsoleOutputAttribRequest
.Coord
= dwWriteCoord
;
2798 if (lpNumberOfAttrsWritten
)
2799 *lpNumberOfAttrsWritten
= nLength
;
2802 Size
= (WORD
)min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
));
2803 Request
->Data
.WriteConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2804 Request
->Data
.WriteConsoleOutputAttribRequest
.Length
= Size
;
2805 memcpy(Request
->Data
.WriteConsoleOutputAttribRequest
.Attribute
, lpAttribute
, Size
* sizeof(WORD
));
2807 Status
= CsrClientCallServer(Request
,
2810 max(sizeof(CSR_API_MESSAGE
),
2811 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB
) + Size
* sizeof(WORD
)));
2813 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
2815 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2816 SetLastErrorByStatus (Status
);
2820 lpAttribute
+= Size
;
2821 Request
->Data
.WriteConsoleOutputAttribRequest
.Coord
= Request
->Data
.WriteConsoleOutputAttribRequest
.EndCoord
;
2824 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2830 /*--------------------------------------------------------------
2831 * FillConsoleOutputAttribute
2837 FillConsoleOutputAttribute(HANDLE hConsoleOutput
,
2841 LPDWORD lpNumberOfAttrsWritten
)
2843 CSR_API_MESSAGE Request
;
2847 CsrRequest
= MAKE_CSR_API(FILL_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2848 Request
.Data
.FillOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2849 Request
.Data
.FillOutputAttribRequest
.Attribute
= (CHAR
)wAttribute
;
2850 Request
.Data
.FillOutputAttribRequest
.Coord
= dwWriteCoord
;
2851 Request
.Data
.FillOutputAttribRequest
.Length
= (WORD
)nLength
;
2853 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
2854 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2856 SetLastErrorByStatus ( Status
);
2860 if (lpNumberOfAttrsWritten
)
2861 *lpNumberOfAttrsWritten
= nLength
;
2867 /*--------------------------------------------------------------
2874 GetConsoleMode(HANDLE hConsoleHandle
,
2877 CSR_API_MESSAGE Request
;
2881 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_MODE
, CSR_CONSOLE
);
2882 Request
.Data
.GetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
2884 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2885 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2887 SetLastErrorByStatus ( Status
);
2890 *lpMode
= Request
.Data
.GetConsoleModeRequest
.ConsoleMode
;
2896 /*--------------------------------------------------------------
2897 * GetNumberOfConsoleInputEvents
2903 GetNumberOfConsoleInputEvents(HANDLE hConsoleInput
,
2904 LPDWORD lpNumberOfEvents
)
2906 CSR_API_MESSAGE Request
;
2910 if (lpNumberOfEvents
== NULL
)
2912 SetLastError(ERROR_INVALID_PARAMETER
);
2916 CsrRequest
= MAKE_CSR_API(GET_NUM_INPUT_EVENTS
, CSR_CONSOLE
);
2917 Request
.Data
.GetNumInputEventsRequest
.ConsoleHandle
= hConsoleInput
;
2919 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
2920 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2922 SetLastErrorByStatus(Status
);
2926 *lpNumberOfEvents
= Request
.Data
.GetNumInputEventsRequest
.NumInputEvents
;
2932 /*--------------------------------------------------------------
2933 * GetLargestConsoleWindowSize
2939 GetLargestConsoleWindowSize(HANDLE hConsoleOutput
)
2941 COORD Coord
= {80,25};
2942 DPRINT1("GetLargestConsoleWindowSize(0x%x) UNIMPLEMENTED!\n", hConsoleOutput
);
2943 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2948 /*--------------------------------------------------------------
2949 * GetConsoleCursorInfo
2955 GetConsoleCursorInfo(HANDLE hConsoleOutput
,
2956 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
)
2958 CSR_API_MESSAGE Request
;
2962 if (!lpConsoleCursorInfo
)
2964 if (!hConsoleOutput
)
2965 SetLastError(ERROR_INVALID_HANDLE
);
2967 SetLastError(ERROR_INVALID_ACCESS
);
2972 CsrRequest
= MAKE_CSR_API(GET_CURSOR_INFO
, CSR_CONSOLE
);
2973 Request
.Data
.GetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
2975 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
2977 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2979 SetLastErrorByStatus(Status
);
2982 *lpConsoleCursorInfo
= Request
.Data
.GetCursorInfoRequest
.Info
;
2988 /*--------------------------------------------------------------
2989 * GetNumberOfConsoleMouseButtons
2995 GetNumberOfConsoleMouseButtons(LPDWORD lpNumberOfMouseButtons
)
2997 DPRINT1("GetNumberOfConsoleMouseButtons(0x%x) UNIMPLEMENTED!\n", lpNumberOfMouseButtons
);
2998 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3003 /*--------------------------------------------------------------
3010 SetConsoleMode(HANDLE hConsoleHandle
,
3013 CSR_API_MESSAGE Request
;
3017 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_MODE
, CSR_CONSOLE
);
3018 Request
.Data
.SetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
3019 Request
.Data
.SetConsoleModeRequest
.Mode
= dwMode
;
3021 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3022 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3024 SetLastErrorByStatus ( Status
);
3032 /*--------------------------------------------------------------
3033 * SetConsoleActiveScreenBuffer
3039 SetConsoleActiveScreenBuffer(HANDLE hConsoleOutput
)
3041 CSR_API_MESSAGE Request
;
3045 CsrRequest
= MAKE_CSR_API(SET_SCREEN_BUFFER
, CSR_CONSOLE
);
3046 Request
.Data
.SetScreenBufferRequest
.OutputHandle
= hConsoleOutput
;
3048 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3049 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3051 SetLastErrorByStatus(Status
);
3059 /*--------------------------------------------------------------
3060 * FlushConsoleInputBuffer
3066 FlushConsoleInputBuffer(HANDLE hConsoleInput
)
3068 CSR_API_MESSAGE Request
;
3072 CsrRequest
= MAKE_CSR_API(FLUSH_INPUT_BUFFER
, CSR_CONSOLE
);
3073 Request
.Data
.FlushInputBufferRequest
.ConsoleInput
= hConsoleInput
;
3075 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3076 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3078 SetLastErrorByStatus(Status
);
3086 /*--------------------------------------------------------------
3087 * SetConsoleScreenBufferSize
3093 SetConsoleScreenBufferSize(HANDLE hConsoleOutput
,
3096 DPRINT1("SetConsoleScreenBufferSize(0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, dwSize
);
3097 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3101 /*--------------------------------------------------------------
3102 * SetConsoleCursorInfo
3108 SetConsoleCursorInfo(HANDLE hConsoleOutput
,
3109 CONST CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
)
3111 CSR_API_MESSAGE Request
;
3115 CsrRequest
= MAKE_CSR_API(SET_CURSOR_INFO
, CSR_CONSOLE
);
3116 Request
.Data
.SetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
3117 Request
.Data
.SetCursorInfoRequest
.Info
= *lpConsoleCursorInfo
;
3119 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3120 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3122 SetLastErrorByStatus(Status
);
3132 IntScrollConsoleScreenBuffer(HANDLE hConsoleOutput
,
3133 const SMALL_RECT
*lpScrollRectangle
,
3134 const SMALL_RECT
*lpClipRectangle
,
3135 COORD dwDestinationOrigin
,
3136 const CHAR_INFO
*lpFill
,
3139 CSR_API_MESSAGE Request
;
3143 CsrRequest
= MAKE_CSR_API(SCROLL_CONSOLE_SCREEN_BUFFER
, CSR_CONSOLE
);
3144 Request
.Data
.ScrollConsoleScreenBufferRequest
.ConsoleHandle
= hConsoleOutput
;
3145 Request
.Data
.ScrollConsoleScreenBufferRequest
.Unicode
= bUnicode
;
3146 Request
.Data
.ScrollConsoleScreenBufferRequest
.ScrollRectangle
= *lpScrollRectangle
;
3148 if (lpClipRectangle
!= NULL
)
3150 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= TRUE
;
3151 Request
.Data
.ScrollConsoleScreenBufferRequest
.ClipRectangle
= *lpClipRectangle
;
3155 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= FALSE
;
3158 Request
.Data
.ScrollConsoleScreenBufferRequest
.DestinationOrigin
= dwDestinationOrigin
;
3159 Request
.Data
.ScrollConsoleScreenBufferRequest
.Fill
= *lpFill
;
3161 Status
= CsrClientCallServer(&Request
,
3164 sizeof(CSR_API_MESSAGE
));
3166 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3168 SetLastErrorByStatus(Status
);
3176 /*--------------------------------------------------------------
3177 * ScrollConsoleScreenBufferA
3183 ScrollConsoleScreenBufferA(HANDLE hConsoleOutput
,
3184 CONST SMALL_RECT
*lpScrollRectangle
,
3185 CONST SMALL_RECT
*lpClipRectangle
,
3186 COORD dwDestinationOrigin
,
3187 CONST CHAR_INFO
*lpFill
)
3189 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
3190 (PSMALL_RECT
)lpScrollRectangle
,
3191 (PSMALL_RECT
)lpClipRectangle
,
3192 dwDestinationOrigin
,
3198 /*--------------------------------------------------------------
3199 * ScrollConsoleScreenBufferW
3205 ScrollConsoleScreenBufferW(HANDLE hConsoleOutput
,
3206 CONST SMALL_RECT
*lpScrollRectangle
,
3207 CONST SMALL_RECT
*lpClipRectangle
,
3208 COORD dwDestinationOrigin
,
3209 CONST CHAR_INFO
*lpFill
)
3211 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
3214 dwDestinationOrigin
,
3220 /*--------------------------------------------------------------
3221 * SetConsoleWindowInfo
3227 SetConsoleWindowInfo(HANDLE hConsoleOutput
,
3229 CONST SMALL_RECT
*lpConsoleWindow
)
3231 DPRINT1("SetConsoleWindowInfo(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bAbsolute
, lpConsoleWindow
);
3232 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3237 /*--------------------------------------------------------------
3238 * SetConsoleTextAttribute
3244 SetConsoleTextAttribute(HANDLE hConsoleOutput
,
3247 CSR_API_MESSAGE Request
;
3251 CsrRequest
= MAKE_CSR_API(SET_ATTRIB
, CSR_CONSOLE
);
3252 Request
.Data
.SetAttribRequest
.ConsoleHandle
= hConsoleOutput
;
3253 Request
.Data
.SetAttribRequest
.Attrib
= wAttributes
;
3255 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3256 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3258 SetLastErrorByStatus(Status
);
3268 AddConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
3270 PHANDLER_ROUTINE
* NewCtrlHandlers
= NULL
;
3272 if (HandlerRoutine
== NULL
)
3274 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= TRUE
;
3278 if (NrCtrlHandlers
== NrAllocatedHandlers
)
3280 NewCtrlHandlers
= RtlAllocateHeap(RtlGetProcessHeap(),
3282 (NrCtrlHandlers
+ 4) * sizeof(PHANDLER_ROUTINE
));
3283 if (NewCtrlHandlers
== NULL
)
3285 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3289 memmove(NewCtrlHandlers
, CtrlHandlers
, sizeof(PHANDLER_ROUTINE
) * NrCtrlHandlers
);
3291 if (NrAllocatedHandlers
> 1) RtlFreeHeap(RtlGetProcessHeap(), 0, CtrlHandlers
);
3293 CtrlHandlers
= NewCtrlHandlers
;
3294 NrAllocatedHandlers
+= 4;
3297 ASSERT(NrCtrlHandlers
< NrAllocatedHandlers
);
3299 CtrlHandlers
[NrCtrlHandlers
++] = HandlerRoutine
;
3306 RemoveConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
3310 if (HandlerRoutine
== NULL
)
3312 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= FALSE
;
3316 for (i
= 0; i
< NrCtrlHandlers
; i
++)
3318 if (CtrlHandlers
[i
] == HandlerRoutine
)
3320 if (i
< (NrCtrlHandlers
- 1))
3322 memmove(&CtrlHandlers
[i
],
3324 (NrCtrlHandlers
- i
+ 1) * sizeof(PHANDLER_ROUTINE
));
3332 SetLastError(ERROR_INVALID_PARAMETER
);
3342 SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
,
3347 RtlEnterCriticalSection(&DllLock
);
3350 Ret
= AddConsoleCtrlHandler(HandlerRoutine
);
3354 Ret
= RemoveConsoleCtrlHandler(HandlerRoutine
);
3357 RtlLeaveCriticalSection(&DllLock
);
3362 /*--------------------------------------------------------------
3363 * GenerateConsoleCtrlEvent
3369 GenerateConsoleCtrlEvent(DWORD dwCtrlEvent
,
3370 DWORD dwProcessGroupId
)
3372 CSR_API_MESSAGE Request
;
3376 if (dwCtrlEvent
!= CTRL_C_EVENT
&& dwCtrlEvent
!= CTRL_BREAK_EVENT
)
3378 SetLastError(ERROR_INVALID_PARAMETER
);
3382 CsrRequest
= MAKE_CSR_API(GENERATE_CTRL_EVENT
, CSR_CONSOLE
);
3383 Request
.Data
.GenerateCtrlEvent
.Event
= dwCtrlEvent
;
3384 Request
.Data
.GenerateCtrlEvent
.ProcessGroup
= dwProcessGroupId
;
3386 Status
= CsrClientCallServer(&Request
,
3389 sizeof(CSR_API_MESSAGE
));
3390 if(!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= Request
.Status
)))
3392 SetLastErrorByStatus(Status
);
3400 /*--------------------------------------------------------------
3407 GetConsoleTitleW(LPWSTR lpConsoleTitle
,
3410 PCSR_API_MESSAGE Request
;
3414 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
3416 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_TITLE
) + CSRSS_MAX_TITLE_LENGTH
* sizeof(WCHAR
));
3417 if (Request
== NULL
)
3419 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3423 CsrRequest
= MAKE_CSR_API(GET_TITLE
, CSR_CONSOLE
);
3425 Status
= CsrClientCallServer(Request
,
3428 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_TITLE
) + CSRSS_MAX_TITLE_LENGTH
* sizeof(WCHAR
));
3429 if (!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= Request
->Status
)))
3431 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3432 SetLastErrorByStatus(Status
);
3436 if (nSize
* sizeof(WCHAR
) <= Request
->Data
.GetTitleRequest
.Length
)
3442 nSize
= Request
->Data
.GetTitleRequest
.Length
/ sizeof (WCHAR
);
3444 memcpy(lpConsoleTitle
, Request
->Data
.GetTitleRequest
.Title
, nSize
* sizeof(WCHAR
));
3445 lpConsoleTitle
[nSize
] = L
'\0';
3447 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3453 /*--------------------------------------------------------------
3462 GetConsoleTitleA(LPSTR lpConsoleTitle
,
3465 WCHAR WideTitle
[CSRSS_MAX_TITLE_LENGTH
+ 1];
3466 DWORD nWideTitle
= CSRSS_MAX_TITLE_LENGTH
+ 1;
3469 if (!lpConsoleTitle
|| !nSize
) return 0;
3470 nWideTitle
= GetConsoleTitleW((LPWSTR
) WideTitle
, nWideTitle
);
3471 if (!nWideTitle
) return 0;
3473 if ((nWritten
= WideCharToMultiByte(CP_ACP
, // ANSI code page
3474 0, // performance and mapping flags
3475 (LPWSTR
) WideTitle
, // address of wide-character string
3476 nWideTitle
, // number of characters in string
3477 lpConsoleTitle
, // address of buffer for new string
3478 nSize
- 1, // size of buffer
3482 lpConsoleTitle
[nWritten
] = '\0';
3490 /*--------------------------------------------------------------
3497 SetConsoleTitleW(LPCWSTR lpConsoleTitle
)
3499 PCSR_API_MESSAGE Request
;
3504 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
3505 max(sizeof(CSR_API_MESSAGE
),
3506 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) +
3507 min(wcslen(lpConsoleTitle
), CSRSS_MAX_TITLE_LENGTH
) * sizeof(WCHAR
)));
3508 if (Request
== NULL
)
3510 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3514 CsrRequest
= MAKE_CSR_API(SET_TITLE
, CSR_CONSOLE
);
3516 for (c
= 0; lpConsoleTitle
[c
] && c
< CSRSS_MAX_TITLE_LENGTH
; c
++)
3517 Request
->Data
.SetTitleRequest
.Title
[c
] = lpConsoleTitle
[c
];
3519 Request
->Data
.SetTitleRequest
.Length
= c
* sizeof(WCHAR
);
3520 Status
= CsrClientCallServer(Request
,
3523 max(sizeof(CSR_API_MESSAGE
),
3524 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) + c
* sizeof(WCHAR
)));
3525 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
3527 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3528 SetLastErrorByStatus(Status
);
3532 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3538 /*--------------------------------------------------------------
3547 SetConsoleTitleA(LPCSTR lpConsoleTitle
)
3549 PCSR_API_MESSAGE Request
;
3554 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
3556 max(sizeof(CSR_API_MESSAGE
),
3557 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) +
3558 min(strlen(lpConsoleTitle
), CSRSS_MAX_TITLE_LENGTH
) * sizeof(WCHAR
)));
3559 if (Request
== NULL
)
3561 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3565 CsrRequest
= MAKE_CSR_API(SET_TITLE
, CSR_CONSOLE
);
3567 for (c
= 0; lpConsoleTitle
[c
] && c
< CSRSS_MAX_TITLE_LENGTH
; c
++)
3568 Request
->Data
.SetTitleRequest
.Title
[c
] = lpConsoleTitle
[c
];
3570 Request
->Data
.SetTitleRequest
.Length
= c
* sizeof(WCHAR
);
3571 Status
= CsrClientCallServer(Request
,
3574 max(sizeof(CSR_API_MESSAGE
),
3575 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) + c
* sizeof(WCHAR
)));
3576 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
3578 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3579 SetLastErrorByStatus(Status
);
3583 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3589 /*--------------------------------------------------------------
3590 * CreateConsoleScreenBuffer
3596 CreateConsoleScreenBuffer(DWORD dwDesiredAccess
,
3598 CONST SECURITY_ATTRIBUTES
*lpSecurityAttributes
,
3600 LPVOID lpScreenBufferData
)
3602 CSR_API_MESSAGE Request
;
3606 if (dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
)
3607 || dwShareMode
& ~(FILE_SHARE_READ
| FILE_SHARE_WRITE
)
3608 || dwFlags
!= CONSOLE_TEXTMODE_BUFFER
)
3610 SetLastError(ERROR_INVALID_PARAMETER
);
3611 return INVALID_HANDLE_VALUE
;
3614 Request
.Data
.CreateScreenBufferRequest
.Access
= dwDesiredAccess
;
3615 Request
.Data
.CreateScreenBufferRequest
.ShareMode
= dwShareMode
;
3616 Request
.Data
.CreateScreenBufferRequest
.Inheritable
=
3617 lpSecurityAttributes
? lpSecurityAttributes
->bInheritHandle
: FALSE
;
3619 CsrRequest
= MAKE_CSR_API(CREATE_SCREEN_BUFFER
, CSR_CONSOLE
);
3620 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3621 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3623 SetLastErrorByStatus(Status
);
3624 return INVALID_HANDLE_VALUE
;
3626 return Request
.Data
.CreateScreenBufferRequest
.OutputHandle
;
3630 /*--------------------------------------------------------------
3639 CSR_API_MESSAGE Request
;
3643 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_CP
, CSR_CONSOLE
);
3644 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3645 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3647 SetLastErrorByStatus (Status
);
3651 return Request
.Data
.GetConsoleCodePage
.CodePage
;
3655 /*--------------------------------------------------------------
3662 SetConsoleCP(UINT wCodePageID
)
3664 CSR_API_MESSAGE Request
;
3668 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_CP
, CSR_CONSOLE
);
3669 Request
.Data
.SetConsoleCodePage
.CodePage
= wCodePageID
;
3671 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3672 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3674 SetLastErrorByStatus(Status
);
3677 return NT_SUCCESS(Status
);
3681 /*--------------------------------------------------------------
3682 * GetConsoleOutputCP
3688 GetConsoleOutputCP(VOID
)
3690 CSR_API_MESSAGE Request
;
3694 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_OUTPUT_CP
, CSR_CONSOLE
);
3695 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3696 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3698 SetLastErrorByStatus (Status
);
3702 return Request
.Data
.GetConsoleOutputCodePage
.CodePage
;
3706 /*--------------------------------------------------------------
3707 * SetConsoleOutputCP
3713 SetConsoleOutputCP(UINT wCodePageID
)
3715 CSR_API_MESSAGE Request
;
3719 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_OUTPUT_CP
, CSR_CONSOLE
);
3720 Request
.Data
.SetConsoleOutputCodePage
.CodePage
= wCodePageID
;
3721 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3722 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3724 SetLastErrorByStatus(Status
);
3727 return NT_SUCCESS(Status
);
3731 /*--------------------------------------------------------------
3732 * GetConsoleProcessList
3738 GetConsoleProcessList(LPDWORD lpdwProcessList
,
3739 DWORD dwProcessCount
)
3741 PCSR_API_MESSAGE Request
;
3746 if (lpdwProcessList
== NULL
|| dwProcessCount
== 0)
3748 SetLastError(ERROR_INVALID_PARAMETER
);
3752 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
3754 max(sizeof(CSR_API_MESSAGE
),
3755 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST
)
3756 + min (dwProcessCount
, CSRSS_MAX_GET_PROCESS_LIST
/ sizeof(DWORD
)) * sizeof(DWORD
)));
3757 if (Request
== NULL
)
3759 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3763 CsrRequest
= MAKE_CSR_API(GET_PROCESS_LIST
, CSR_CONSOLE
);
3764 Request
->Data
.GetProcessListRequest
.nMaxIds
= min (dwProcessCount
, CSRSS_MAX_GET_PROCESS_LIST
/ sizeof(DWORD
));
3766 Status
= CsrClientCallServer(Request
,
3769 max(sizeof(CSR_API_MESSAGE
),
3770 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST
)
3771 + Request
->Data
.GetProcessListRequest
.nMaxIds
* sizeof(DWORD
)));
3772 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
3774 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3775 SetLastErrorByStatus (Status
);
3780 nProcesses
= Request
->Data
.GetProcessListRequest
.nProcessIdsCopied
;
3781 if (dwProcessCount
>= nProcesses
)
3783 memcpy(lpdwProcessList
, Request
->Data
.GetProcessListRequest
.ProcessId
, nProcesses
* sizeof(DWORD
));
3787 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3794 /*--------------------------------------------------------------
3795 * GetConsoleSelectionInfo
3801 GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo
)
3803 DPRINT1("GetConsoleSelectionInfo(0x%x) UNIMPLEMENTED!\n", lpConsoleSelectionInfo
);
3804 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3810 /*--------------------------------------------------------------
3817 AttachConsole(DWORD dwProcessId
)
3819 DPRINT1("AttachConsole(0x%x) UNIMPLEMENTED!\n", dwProcessId
);
3823 /*--------------------------------------------------------------
3830 GetConsoleWindow(VOID
)
3832 CSR_API_MESSAGE Request
;
3836 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_WINDOW
, CSR_CONSOLE
);
3837 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3838 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3840 SetLastErrorByStatus(Status
);
3844 return Request
.Data
.GetConsoleWindowRequest
.WindowHandle
;
3848 /*--------------------------------------------------------------
3855 SetConsoleIcon(HICON hicon
)
3857 CSR_API_MESSAGE Request
;
3861 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_ICON
, CSR_CONSOLE
);
3862 Request
.Data
.SetConsoleIconRequest
.WindowIcon
= hicon
;
3864 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3865 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3867 SetLastErrorByStatus(Status
);
3871 return NT_SUCCESS(Status
);
3875 /******************************************************************************
3876 * \name SetConsoleInputExeNameW
3877 * \brief Sets the console input file name from a unicode string.
3878 * \param lpInputExeName Pointer to a unicode string with the name.
3879 * \return TRUE if successful, FALSE if unsuccsedful.
3880 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
3881 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
3885 SetConsoleInputExeNameW(LPCWSTR lpInputExeName
)
3890 || (lenName
= lstrlenW(lpInputExeName
)) == 0
3891 || lenName
> INPUTEXENAME_BUFLEN
- 1)
3893 /* Fail if string is empty or too long */
3894 SetLastError(ERROR_INVALID_PARAMETER
);
3898 RtlEnterCriticalSection(&ConsoleLock
);
3901 RtlCopyMemory(InputExeName
, lpInputExeName
, lenName
* sizeof(WCHAR
));
3902 InputExeName
[lenName
] = L
'\0';
3906 RtlLeaveCriticalSection(&ConsoleLock
);
3914 /******************************************************************************
3915 * \name SetConsoleInputExeNameA
3916 * \brief Sets the console input file name from an ansi string.
3917 * \param lpInputExeName Pointer to an ansi string with the name.
3918 * \return TRUE if successful, FALSE if unsuccsedful.
3919 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
3920 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
3924 SetConsoleInputExeNameA(LPCSTR lpInputExeName
)
3926 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
3927 ANSI_STRING InputExeNameA
;
3928 UNICODE_STRING InputExeNameU
;
3932 RtlInitAnsiString(&InputExeNameA
, lpInputExeName
);
3934 if(InputExeNameA
.Length
== 0 ||
3935 InputExeNameA
.Length
> INPUTEXENAME_BUFLEN
- 1)
3937 /* Fail if string is empty or too long */
3938 SetLastError(ERROR_INVALID_PARAMETER
);
3942 InputExeNameU
.Buffer
= Buffer
;
3943 InputExeNameU
.MaximumLength
= sizeof(Buffer
);
3944 InputExeNameU
.Length
= 0;
3945 Status
= RtlAnsiStringToUnicodeString(&InputExeNameU
, &InputExeNameA
, FALSE
);
3946 if(NT_SUCCESS(Status
))
3948 Ret
= SetConsoleInputExeNameW(InputExeNameU
.Buffer
);
3952 SetLastErrorByStatus(Status
);
3960 /******************************************************************************
3961 * \name GetConsoleInputExeNameW
3962 * \brief Retrieves the console input file name as unicode string.
3963 * \param nBufferLength Length of the buffer in WCHARs.
3964 * Specify 0 to recieve the needed buffer length.
3965 * \param lpBuffer Pointer to a buffer that recieves the string.
3966 * \return Needed buffer size if \p nBufferLength is 0.
3967 * Otherwise 1 if successful, 2 if buffer is too small.
3968 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
3969 * is not big enough.
3973 GetConsoleInputExeNameW(DWORD nBufferLength
, LPWSTR lpBuffer
)
3975 int lenName
= lstrlenW(InputExeName
);
3977 if (nBufferLength
== 0)
3979 /* Buffer size is requested, return it */
3983 if(lenName
+ 1 > nBufferLength
)
3985 /* Buffer is not large enough! */
3986 SetLastError(ERROR_BUFFER_OVERFLOW
);
3990 RtlEnterCriticalSection(&ConsoleLock
);
3993 RtlCopyMemory(lpBuffer
, InputExeName
, lenName
* sizeof(WCHAR
));
3994 lpBuffer
[lenName
] = '\0';
3998 RtlLeaveCriticalSection(&ConsoleLock
);
4002 /* Success, return 1 */
4007 /******************************************************************************
4008 * \name GetConsoleInputExeNameA
4009 * \brief Retrieves the console input file name as ansi string.
4010 * \param nBufferLength Length of the buffer in CHARs.
4011 * \param lpBuffer Pointer to a buffer that recieves the string.
4012 * \return 1 if successful, 2 if buffer is too small.
4013 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
4014 * is not big enough. The buffer recieves as much characters as fit.
4018 GetConsoleInputExeNameA(DWORD nBufferLength
, LPSTR lpBuffer
)
4020 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
4022 UNICODE_STRING BufferU
;
4023 ANSI_STRING BufferA
;
4025 /* Get the unicode name */
4026 Ret
= GetConsoleInputExeNameW(sizeof(Buffer
) / sizeof(Buffer
[0]), Buffer
);
4028 /* Initialize strings for conversion */
4029 RtlInitUnicodeString(&BufferU
, Buffer
);
4031 BufferA
.MaximumLength
= nBufferLength
;
4032 BufferA
.Buffer
= lpBuffer
;
4034 /* Convert unicode name to ansi, copying as much chars as fit */
4035 RtlUnicodeStringToAnsiString(&BufferA
, &BufferU
, FALSE
);
4037 /* Error handling */
4038 if(nBufferLength
<= BufferU
.Length
/ sizeof(WCHAR
))
4040 SetLastError(ERROR_BUFFER_OVERFLOW
);
4048 /*--------------------------------------------------------------
4049 * GetConsoleHistoryInfo
4055 GetConsoleHistoryInfo(PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo
)
4057 DPRINT1("GetConsoleHistoryInfo(0x%p) UNIMPLEMENTED!\n", lpConsoleHistoryInfo
);
4058 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4063 /*--------------------------------------------------------------
4064 * SetConsoleHistoryInfo
4070 SetConsoleHistoryInfo(IN PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo
)
4072 DPRINT1("SetConsoleHistoryInfo(0x%p) UNIMPLEMENTED!\n", lpConsoleHistoryInfo
);
4073 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4078 /*--------------------------------------------------------------
4079 * GetConsoleOriginalTitleW
4085 GetConsoleOriginalTitleW(OUT LPWSTR lpConsoleTitle
,
4088 DPRINT1("GetConsoleOriginalTitleW(0x%p, 0x%x) UNIMPLEMENTED!\n", lpConsoleTitle
, nSize
);
4089 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4094 /*--------------------------------------------------------------
4095 * GetConsoleOriginalTitleA
4101 GetConsoleOriginalTitleA(OUT LPSTR lpConsoleTitle
,
4104 DPRINT1("GetConsoleOriginalTitleA(0x%p, 0x%x) UNIMPLEMENTED!\n", lpConsoleTitle
, nSize
);
4105 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4110 /*--------------------------------------------------------------
4111 * GetConsoleScreenBufferInfoEx
4117 GetConsoleScreenBufferInfoEx(IN HANDLE hConsoleOutput
,
4118 OUT PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx
)
4120 DPRINT1("GetConsoleScreenBufferInfoEx(0x%p, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput
, lpConsoleScreenBufferInfoEx
);
4121 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4126 /*--------------------------------------------------------------
4127 * SetConsoleScreenBufferInfoEx
4133 SetConsoleScreenBufferInfoEx(IN HANDLE hConsoleOutput
,
4134 IN PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx
)
4136 DPRINT1("SetConsoleScreenBufferInfoEx(0x%p, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput
, lpConsoleScreenBufferInfoEx
);
4137 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4142 /*--------------------------------------------------------------
4143 * GetCurrentConsoleFontEx
4149 GetCurrentConsoleFontEx(IN HANDLE hConsoleOutput
,
4150 IN BOOL bMaximumWindow
,
4151 OUT PCONSOLE_FONT_INFOEX lpConsoleCurrentFontEx
)
4153 DPRINT1("GetCurrentConsoleFontEx(0x%p, 0x%x, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput
, bMaximumWindow
, lpConsoleCurrentFontEx
);
4154 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);