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 BOOL WINAPI
DefaultConsoleCtrlHandler(DWORD Event
);
23 extern __declspec(noreturn
) VOID CALLBACK
ConsoleControlDispatcher(DWORD CodeAndFlag
);
24 extern RTL_CRITICAL_SECTION ConsoleLock
;
25 extern BOOL ConsoleInitialized
;
26 extern BOOL WINAPI
IsDebuggerPresent(VOID
);
28 /* GLOBALS *******************************************************************/
30 static PHANDLER_ROUTINE
* CtrlHandlers
= NULL
;
31 static ULONG NrCtrlHandlers
= 0;
32 #define INPUTEXENAME_BUFLEN 256
33 static WCHAR InputExeName
[INPUTEXENAME_BUFLEN
] = L
"";
35 /* Default Console Control Handler *******************************************/
39 DefaultConsoleCtrlHandler(DWORD Event
)
44 DPRINT("Ctrl-C Event\n");
47 case CTRL_BREAK_EVENT
:
48 DPRINT("Ctrl-Break Event\n");
51 case CTRL_SHUTDOWN_EVENT
:
52 DPRINT("Ctrl Shutdown Event\n");
55 case CTRL_CLOSE_EVENT
:
56 DPRINT("Ctrl Close Event\n");
59 case CTRL_LOGOFF_EVENT
:
60 DPRINT("Ctrl Logoff Event\n");
72 ConsoleControlDispatcher(DWORD CodeAndFlag
)
75 DWORD nCode
= CodeAndFlag
& MAXLONG
;
78 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST
);
83 case CTRL_BREAK_EVENT
:
85 if(IsDebuggerPresent())
87 EXCEPTION_RECORD erException
;
88 erException
.ExceptionCode
=
89 (nCode
== CTRL_C_EVENT
? DBG_CONTROL_C
: DBG_CONTROL_BREAK
);
90 erException
.ExceptionFlags
= 0;
91 erException
.ExceptionRecord
= NULL
;
92 erException
.ExceptionAddress
= &DefaultConsoleCtrlHandler
;
93 erException
.NumberParameters
= 0;
94 RtlRaiseException(&erException
);
97 if (!ConsoleInitialized
) ExitThread(0);
98 RtlEnterCriticalSection(&ConsoleLock
);
100 if (!(nCode
== CTRL_C_EVENT
&&
101 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
& 1))
103 for(i
= NrCtrlHandlers
; i
> 0; -- i
)
104 if(CtrlHandlers
[i
- 1](nCode
)) break;
106 RtlLeaveCriticalSection(&ConsoleLock
);
110 case CTRL_CLOSE_EVENT
:
111 case CTRL_LOGOFF_EVENT
:
112 case CTRL_SHUTDOWN_EVENT
:
115 default: ExitThread(0);
118 if (!ConsoleInitialized
) ExitThread(0);
119 RtlEnterCriticalSection(&ConsoleLock
);
121 if (!(nCode
== CTRL_C_EVENT
&&
122 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
& 1))
127 if (i
== 1 && (CodeAndFlag
& MINLONG
) &&
128 (nCode
== CTRL_LOGOFF_EVENT
|| nCode
== CTRL_SHUTDOWN_EVENT
))
131 if (CtrlHandlers
[i
- 1](nCode
))
135 case CTRL_CLOSE_EVENT
:
136 case CTRL_LOGOFF_EVENT
:
137 case CTRL_SHUTDOWN_EVENT
:
138 nExitCode
= CodeAndFlag
;
145 RtlLeaveCriticalSection(&ConsoleLock
);
146 ExitThread(nExitCode
);
150 /* FUNCTIONS *****************************************************************/
157 AddConsoleAliasA(LPCSTR lpSource
,
161 LPWSTR lpSourceW
= NULL
;
162 LPWSTR lpTargetW
= NULL
;
163 LPWSTR lpExeNameW
= NULL
;
167 BasepAnsiStringToHeapUnicodeString(lpSource
, (LPWSTR
*) &lpSourceW
);
169 BasepAnsiStringToHeapUnicodeString(lpTarget
, (LPWSTR
*) &lpTargetW
);
171 BasepAnsiStringToHeapUnicodeString(lpExeName
, (LPWSTR
*) &lpExeNameW
);
173 bRetVal
= AddConsoleAliasW(lpSourceW
, lpTargetW
, lpExeNameW
);
177 RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR
*) lpSourceW
);
179 RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR
*) lpTargetW
);
181 RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR
*) lpExeNameW
);
192 AddConsoleAliasW(LPCWSTR lpSource
,
196 PCSR_API_MESSAGE Request
;
200 ULONG TargetLength
= 0;
206 DPRINT("AddConsoleAliasW enterd with lpSource %S lpTarget %S lpExeName %S\n", lpSource
, lpTarget
, lpExeName
);
208 ExeLength
= wcslen(lpExeName
) + 1;
209 SourceLength
= wcslen(lpSource
)+ 1;
211 TargetLength
= wcslen(lpTarget
) + 1;
213 Size
= (ExeLength
+ SourceLength
+ TargetLength
) * sizeof(WCHAR
);
214 RequestLength
= sizeof(CSR_API_MESSAGE
) + Size
;
216 Request
= RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY
, RequestLength
);
217 Ptr
= (WCHAR
*)(((ULONG_PTR
)Request
) + sizeof(CSR_API_MESSAGE
));
219 wcscpy(Ptr
, lpSource
);
220 Request
->Data
.AddConsoleAlias
.SourceLength
= SourceLength
;
221 Ptr
= (WCHAR
*)(((ULONG_PTR
)Request
) + sizeof(CSR_API_MESSAGE
) + SourceLength
* sizeof(WCHAR
));
223 wcscpy(Ptr
, lpExeName
);
224 Request
->Data
.AddConsoleAlias
.ExeLength
= ExeLength
;
225 Ptr
= (WCHAR
*)(((ULONG_PTR
)Request
) + sizeof(CSR_API_MESSAGE
) + (ExeLength
+ SourceLength
)* sizeof(WCHAR
));
227 if (lpTarget
) /* target can be optional */
228 wcscpy(Ptr
, lpTarget
);
230 Request
->Data
.AddConsoleAlias
.TargetLength
= TargetLength
;
232 CsrRequest
= MAKE_CSR_API(ADD_CONSOLE_ALIAS
, CSR_CONSOLE
);
233 Status
= CsrClientCallServer(Request
,
238 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
240 SetLastErrorByStatus(Status
);
241 RtlFreeHeap(GetProcessHeap(), 0, Request
);
245 RtlFreeHeap(GetProcessHeap(), 0, Request
);
251 * @unimplemented (Undocumented)
255 ConsoleMenuControl(HANDLE hConsole
,
259 DPRINT1("ConsoleMenuControl(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsole
, Unknown1
, Unknown2
);
260 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
270 DuplicateConsoleHandle(HANDLE hConsole
,
271 DWORD dwDesiredAccess
,
275 CSR_API_MESSAGE Request
;
279 if (dwOptions
& ~(DUPLICATE_CLOSE_SOURCE
| DUPLICATE_SAME_ACCESS
)
280 || (!(dwOptions
& DUPLICATE_SAME_ACCESS
)
281 && dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
)))
283 SetLastError (ERROR_INVALID_PARAMETER
);
284 return INVALID_HANDLE_VALUE
;
287 CsrRequest
= MAKE_CSR_API(DUPLICATE_HANDLE
, CSR_NATIVE
);
288 Request
.Data
.DuplicateHandleRequest
.Handle
= hConsole
;
289 Request
.Data
.DuplicateHandleRequest
.Access
= dwDesiredAccess
;
290 Request
.Data
.DuplicateHandleRequest
.Inheritable
= bInheritHandle
;
291 Request
.Data
.DuplicateHandleRequest
.Options
= dwOptions
;
293 Status
= CsrClientCallServer(&Request
,
296 sizeof(CSR_API_MESSAGE
));
297 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
=Request
.Status
))
299 SetLastErrorByStatus(Status
);
300 return INVALID_HANDLE_VALUE
;
303 return Request
.Data
.DuplicateHandleRequest
.Handle
;
308 * @unimplemented (Undocumented)
312 ExpungeConsoleCommandHistoryW(DWORD Unknown0
)
314 DPRINT1("ExpungeConsoleCommandHistoryW(0x%x) UNIMPLEMENTED!\n", Unknown0
);
315 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
321 * @unimplemented (Undocumented)
325 ExpungeConsoleCommandHistoryA (DWORD Unknown0
)
327 DPRINT1("ExpungeConsoleCommandHistoryW(0x%x) UNIMPLEMENTED!\n", Unknown0
);
328 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
338 GetConsoleAliasW(LPWSTR lpSource
,
339 LPWSTR lpTargetBuffer
,
340 DWORD TargetBufferLength
,
343 PCSR_API_MESSAGE Request
;
344 PCSR_CAPTURE_BUFFER CaptureBuffer
;
353 DPRINT("GetConsoleAliasW entered lpSource %S lpExeName %S\n", lpSource
, lpExeName
);
355 if (lpTargetBuffer
== NULL
)
357 SetLastError(ERROR_INVALID_PARAMETER
);
361 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_ALIAS
, CSR_CONSOLE
);
363 ExeLength
= wcslen(lpExeName
) + 1;
364 SourceLength
= wcslen(lpSource
) + 1;
366 Size
= (ExeLength
+ SourceLength
) * sizeof(WCHAR
);
368 RequestLength
= Size
+ sizeof(CSR_API_MESSAGE
);
369 Request
= RtlAllocateHeap(GetProcessHeap(), 0, RequestLength
);
372 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
376 CaptureBuffer
= CsrAllocateCaptureBuffer(1, TargetBufferLength
);
379 RtlFreeHeap(GetProcessHeap(), 0, Request
);
380 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
384 Request
->Data
.GetConsoleAlias
.TargetBuffer
= NULL
;
386 CsrCaptureMessageBuffer(CaptureBuffer
,
389 (PVOID
*)&Request
->Data
.GetConsoleAlias
.TargetBuffer
);
391 Request
->Data
.GetConsoleAlias
.TargetBufferLength
= TargetBufferLength
;
393 Ptr
= (LPWSTR
)((ULONG_PTR
)Request
+ sizeof(CSR_API_MESSAGE
));
394 wcscpy(Ptr
, lpSource
);
396 wcscpy(Ptr
, lpExeName
);
398 Request
->Data
.GetConsoleAlias
.ExeLength
= ExeLength
;
399 Request
->Data
.GetConsoleAlias
.SourceLength
= SourceLength
;
401 Status
= CsrClientCallServer(Request
,
404 sizeof(CSR_API_MESSAGE
) + Size
);
406 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
408 RtlFreeHeap(GetProcessHeap(), 0, Request
);
409 CsrFreeCaptureBuffer(CaptureBuffer
);
410 SetLastErrorByStatus(Status
);
414 wcscpy(lpTargetBuffer
, Request
->Data
.GetConsoleAlias
.TargetBuffer
);
415 RtlFreeHeap(GetProcessHeap(), 0, Request
);
416 CsrFreeCaptureBuffer(CaptureBuffer
);
418 return Request
->Data
.GetConsoleAlias
.BytesWritten
;
427 GetConsoleAliasA(LPSTR lpSource
,
428 LPSTR lpTargetBuffer
,
429 DWORD TargetBufferLength
,
434 LPWSTR lpwTargetBuffer
;
439 DPRINT("GetConsoleAliasA entered\n");
441 if (lpTargetBuffer
== NULL
)
443 SetLastError(ERROR_INVALID_PARAMETER
);
447 dwSourceSize
= (strlen(lpSource
)+1) * sizeof(WCHAR
);
448 lpwSource
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwSourceSize
);
449 if (lpwSource
== NULL
)
451 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
454 MultiByteToWideChar(CP_ACP
, 0, lpSource
, -1, lpwSource
, dwSourceSize
);
456 dwExeNameSize
= (strlen(lpExeName
)+1) * sizeof(WCHAR
);
457 lpwExeName
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwExeNameSize
);
458 if (lpwExeName
== NULL
)
460 HeapFree(GetProcessHeap(), 0, lpwSource
);
461 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
464 MultiByteToWideChar(CP_ACP
, 0, lpExeName
, -1, lpwExeName
, dwExeNameSize
);
466 lpwTargetBuffer
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, TargetBufferLength
* sizeof(WCHAR
));
467 if (lpwTargetBuffer
== NULL
)
469 HeapFree(GetProcessHeap(), 0, lpwSource
);
470 HeapFree(GetProcessHeap(), 0, lpwExeName
);
471 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
475 dwResult
= GetConsoleAliasW(lpwSource
, lpwTargetBuffer
, TargetBufferLength
* sizeof(WCHAR
), lpwExeName
);
477 HeapFree(GetProcessHeap(), 0, lpwSource
);
478 HeapFree(GetProcessHeap(), 0, lpwExeName
);
481 dwResult
= WideCharToMultiByte(CP_ACP
, 0, lpwTargetBuffer
, dwResult
/ sizeof(WCHAR
), lpTargetBuffer
, TargetBufferLength
, NULL
, NULL
);
483 HeapFree(GetProcessHeap(), 0, lpwTargetBuffer
);
494 GetConsoleAliasExesW(LPWSTR lpExeNameBuffer
,
495 DWORD ExeNameBufferLength
)
497 CSR_API_MESSAGE Request
;
498 PCSR_CAPTURE_BUFFER CaptureBuffer
;
502 DPRINT("GetConsoleAliasExesW entered\n");
504 CaptureBuffer
= CsrAllocateCaptureBuffer(1, ExeNameBufferLength
);
507 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
511 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_ALIASES_EXES
, CSR_CONSOLE
);
512 CsrAllocateMessagePointer(CaptureBuffer
,
514 (PVOID
*)&Request
.Data
.GetConsoleAliasesExes
.ExeNames
);
515 Request
.Data
.GetConsoleAliasesExes
.Length
= ExeNameBufferLength
;
517 Status
= CsrClientCallServer(&Request
,
520 sizeof(CSR_API_MESSAGE
));
522 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
524 SetLastErrorByStatus(Status
);
525 CsrFreeCaptureBuffer(CaptureBuffer
);
529 memcpy(lpExeNameBuffer
,
530 Request
.Data
.GetConsoleAliasesExes
.ExeNames
,
531 Request
.Data
.GetConsoleAliasesExes
.BytesWritten
);
533 CsrFreeCaptureBuffer(CaptureBuffer
);
534 return Request
.Data
.GetConsoleAliasesExes
.BytesWritten
;
543 GetConsoleAliasExesA(LPSTR lpExeNameBuffer
,
544 DWORD ExeNameBufferLength
)
546 LPWSTR lpwExeNameBuffer
;
549 DPRINT("GetConsoleAliasExesA entered\n");
551 lpwExeNameBuffer
= HeapAlloc(GetProcessHeap(), 0, ExeNameBufferLength
* sizeof(WCHAR
));
553 dwResult
= GetConsoleAliasExesW(lpwExeNameBuffer
, ExeNameBufferLength
* sizeof(WCHAR
));
556 dwResult
= WideCharToMultiByte(CP_ACP
, 0, lpwExeNameBuffer
, dwResult
/ sizeof(WCHAR
), lpExeNameBuffer
, ExeNameBufferLength
, NULL
, NULL
);
558 HeapFree(GetProcessHeap(), 0, lpwExeNameBuffer
);
567 GetConsoleAliasExesLengthW(VOID
)
569 CSR_API_MESSAGE Request
;
573 DPRINT("GetConsoleAliasExesLengthW entered\n");
575 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_ALIASES_EXES_LENGTH
, CSR_CONSOLE
);
576 Request
.Data
.GetConsoleAliasesExesLength
.Length
= 0;
579 Status
= CsrClientCallServer(&Request
,
582 sizeof(CSR_API_MESSAGE
));
584 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
586 SetLastErrorByStatus(Status
);
590 return Request
.Data
.GetConsoleAliasesExesLength
.Length
;
598 GetConsoleAliasExesLengthA(VOID
)
602 DPRINT("GetConsoleAliasExesLengthA entered\n");
604 dwLength
= GetConsoleAliasExesLengthW();
607 dwLength
/= sizeof(WCHAR
);
618 GetConsoleAliasesW(LPWSTR AliasBuffer
,
619 DWORD AliasBufferLength
,
622 CSR_API_MESSAGE Request
;
627 DPRINT("GetConsoleAliasesW entered\n");
629 dwLength
= GetConsoleAliasesLengthW(ExeName
);
630 if (!dwLength
|| dwLength
> AliasBufferLength
)
633 CsrRequest
= MAKE_CSR_API(GET_ALL_CONSOLE_ALIASES
, CSR_CONSOLE
);
634 Request
.Data
.GetAllConsoleAlias
.AliasBuffer
= AliasBuffer
;
635 Request
.Data
.GetAllConsoleAlias
.AliasBufferLength
= AliasBufferLength
;
636 Request
.Data
.GetAllConsoleAlias
.lpExeName
= ExeName
;
638 Status
= CsrClientCallServer(&Request
,
641 sizeof(CSR_API_MESSAGE
));
643 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
645 SetLastErrorByStatus(Status
);
649 return Request
.Data
.GetAllConsoleAlias
.BytesWritten
/ sizeof(WCHAR
);
658 GetConsoleAliasesA(LPSTR AliasBuffer
,
659 DWORD AliasBufferLength
,
663 LPWSTR lpwExeName
= NULL
;
664 LPWSTR lpwAliasBuffer
;
666 DPRINT("GetConsoleAliasesA entered\n");
669 BasepAnsiStringToHeapUnicodeString(ExeName
, (LPWSTR
*) &lpwExeName
);
671 lpwAliasBuffer
= HeapAlloc(GetProcessHeap(), 0, AliasBufferLength
* sizeof(WCHAR
));
673 dwRetVal
= GetConsoleAliasesW(lpwAliasBuffer
, AliasBufferLength
, lpwExeName
);
676 RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR
*) lpwExeName
);
679 dwRetVal
= WideCharToMultiByte(CP_ACP
, 0, lpwAliasBuffer
, dwRetVal
, AliasBuffer
, AliasBufferLength
, NULL
, NULL
);
681 HeapFree(GetProcessHeap(), 0, lpwAliasBuffer
);
691 GetConsoleAliasesLengthW(LPWSTR lpExeName
)
693 CSR_API_MESSAGE Request
;
697 DPRINT("GetConsoleAliasesLengthW entered\n");
699 CsrRequest
= MAKE_CSR_API(GET_ALL_CONSOLE_ALIASES_LENGTH
, CSR_CONSOLE
);
700 Request
.Data
.GetAllConsoleAliasesLength
.lpExeName
= lpExeName
;
701 Request
.Data
.GetAllConsoleAliasesLength
.Length
= 0;
703 Status
= CsrClientCallServer(&Request
,
706 sizeof(CSR_API_MESSAGE
));
708 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
710 SetLastErrorByStatus(Status
);
714 return Request
.Data
.GetAllConsoleAliasesLength
.Length
;
723 GetConsoleAliasesLengthA(LPSTR lpExeName
)
726 LPWSTR lpExeNameW
= NULL
;
729 BasepAnsiStringToHeapUnicodeString(lpExeName
, (LPWSTR
*) &lpExeNameW
);
731 dwRetVal
= GetConsoleAliasesLengthW(lpExeNameW
);
733 dwRetVal
/= sizeof(WCHAR
);
737 RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR
*) lpExeNameW
);
744 * @unimplemented (Undocumented)
748 GetConsoleCommandHistoryW(DWORD Unknown0
,
752 DPRINT1("GetConsoleCommandHistoryW(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
);
753 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
759 * @unimplemented (Undocumented)
763 GetConsoleCommandHistoryA(DWORD Unknown0
,
767 DPRINT1("GetConsoleCommandHistoryA(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
);
768 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
774 * @unimplemented (Undocumented)
778 GetConsoleCommandHistoryLengthW(DWORD Unknown0
)
780 DPRINT1("GetConsoleCommandHistoryLengthW(0x%x) UNIMPLEMENTED!\n", Unknown0
);
781 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
787 * @unimplemented (Undocumented)
791 GetConsoleCommandHistoryLengthA(DWORD Unknown0
)
793 DPRINT1("GetConsoleCommandHistoryLengthA(0x%x) UNIMPLEMENTED!\n", Unknown0
);
794 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
803 GetConsoleDisplayMode(LPDWORD lpdwMode
)
805 * FUNCTION: Get the console display mode
807 * lpdwMode - Address of variable that receives the current value
809 * STATUS: Undocumented
812 DPRINT1("GetConsoleDisplayMode(0x%x) UNIMPLEMENTED!\n", lpdwMode
);
813 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
819 * @unimplemented (Undocumented)
823 GetConsoleFontInfo(DWORD Unknown0
,
828 DPRINT1("GetConsoleFontInfo(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
829 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
839 GetConsoleFontSize(HANDLE hConsoleOutput
,
842 COORD Empty
= {0, 0};
843 DPRINT1("GetConsoleFontSize(0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, nFont
);
844 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
850 * @implemented (Undocumented)
854 GetConsoleHardwareState(HANDLE hConsole
,
858 CSR_API_MESSAGE Request
;
862 CsrRequest
= MAKE_CSR_API(SETGET_CONSOLE_HW_STATE
, CSR_CONSOLE
);
863 Request
.Data
.ConsoleHardwareStateRequest
.ConsoleHandle
= hConsole
;
864 Request
.Data
.ConsoleHardwareStateRequest
.SetGet
= CONSOLE_HARDWARE_STATE_GET
;
866 Status
= CsrClientCallServer(&Request
,
869 sizeof(CSR_API_MESSAGE
));
870 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
872 SetLastErrorByStatus(Status
);
876 *State
= Request
.Data
.ConsoleHardwareStateRequest
.State
;
882 * @implemented (Undocumented)
886 GetConsoleInputWaitHandle(VOID
)
888 CSR_API_MESSAGE Request
;
892 CsrRequest
= MAKE_CSR_API(GET_INPUT_WAIT_HANDLE
, CSR_CONSOLE
);
894 Status
= CsrClientCallServer(&Request
,
897 sizeof(CSR_API_MESSAGE
));
898 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
900 SetLastErrorByStatus(Status
);
904 return Request
.Data
.GetConsoleInputWaitHandle
.InputWaitHandle
;
913 GetCurrentConsoleFont(HANDLE hConsoleOutput
,
915 PCONSOLE_FONT_INFO lpConsoleCurrentFont
)
917 DPRINT1("GetCurrentConsoleFont(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bMaximumWindow
, lpConsoleCurrentFont
);
918 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
924 * @unimplemented (Undocumented)
928 GetNumberOfConsoleFonts(VOID
)
930 DPRINT1("GetNumberOfConsoleFonts() UNIMPLEMENTED!\n");
931 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
932 return 1; /* FIXME: call csrss.exe */
937 * @unimplemented (Undocumented)
941 InvalidateConsoleDIBits(DWORD Unknown0
,
944 DPRINT1("InvalidateConsoleDIBits(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
945 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
951 * @unimplemented (Undocumented)
955 OpenConsoleW(LPCWSTR wsName
,
956 DWORD dwDesiredAccess
,
960 CSR_API_MESSAGE Request
;
962 NTSTATUS Status
= STATUS_SUCCESS
;
964 if (0 == _wcsicmp(wsName
, L
"CONIN$"))
966 CsrRequest
= MAKE_CSR_API(GET_INPUT_HANDLE
, CSR_NATIVE
);
968 else if (0 == _wcsicmp(wsName
, L
"CONOUT$"))
970 CsrRequest
= MAKE_CSR_API(GET_OUTPUT_HANDLE
, CSR_NATIVE
);
974 SetLastError(ERROR_INVALID_PARAMETER
);
975 return(INVALID_HANDLE_VALUE
);
978 if (dwDesiredAccess
& ~(GENERIC_READ
|GENERIC_WRITE
))
980 SetLastError(ERROR_INVALID_PARAMETER
);
981 return(INVALID_HANDLE_VALUE
);
984 if (dwShareMode
& ~(FILE_SHARE_READ
|FILE_SHARE_WRITE
))
986 SetLastError(ERROR_INVALID_PARAMETER
);
987 return(INVALID_HANDLE_VALUE
);
990 /* Structures for GET_INPUT_HANDLE and GET_OUTPUT_HANDLE requests are identical */
991 Request
.Data
.GetInputHandleRequest
.Access
= dwDesiredAccess
;
992 Request
.Data
.GetInputHandleRequest
.Inheritable
= bInheritHandle
;
994 Status
= CsrClientCallServer(&Request
,
997 sizeof(CSR_API_MESSAGE
));
998 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1000 SetLastErrorByStatus(Status
);
1001 return INVALID_HANDLE_VALUE
;
1004 return Request
.Data
.GetInputHandleRequest
.InputHandle
;
1009 * @unimplemented (Undocumented)
1013 SetConsoleCommandHistoryMode(DWORD dwMode
)
1015 DPRINT1("SetConsoleCommandHistoryMode(0x%x) UNIMPLEMENTED!\n", dwMode
);
1016 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1022 * @unimplemented (Undocumented)
1026 SetConsoleCursor(DWORD Unknown0
,
1029 DPRINT1("SetConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1030 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1040 SetConsoleDisplayMode(HANDLE hOut
,
1044 * FUNCTION: Set the console display mode.
1046 * hOut - Standard output handle.
1047 * dwNewMode - New mode.
1048 * lpdwOldMode - Address of a variable that receives the old mode.
1051 DPRINT1("SetConsoleDisplayMode(0x%x, 0x%x, 0x%p) UNIMPLEMENTED!\n", hOut
, dwNewMode
, lpdwOldMode
);
1052 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1058 * @unimplemented (Undocumented)
1062 SetConsoleFont(DWORD Unknown0
,
1065 DPRINT1("SetConsoleFont(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1066 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1072 * @implemented (Undocumented)
1076 SetConsoleHardwareState(HANDLE hConsole
,
1080 CSR_API_MESSAGE Request
;
1084 CsrRequest
= MAKE_CSR_API(SETGET_CONSOLE_HW_STATE
, CSR_CONSOLE
);
1085 Request
.Data
.ConsoleHardwareStateRequest
.ConsoleHandle
= hConsole
;
1086 Request
.Data
.ConsoleHardwareStateRequest
.SetGet
= CONSOLE_HARDWARE_STATE_SET
;
1087 Request
.Data
.ConsoleHardwareStateRequest
.State
= State
;
1089 Status
= CsrClientCallServer(&Request
,
1092 sizeof(CSR_API_MESSAGE
));
1093 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1095 SetLastErrorByStatus(Status
);
1104 * @unimplemented (Undocumented)
1108 SetConsoleKeyShortcuts(DWORD Unknown0
,
1113 DPRINT1("SetConsoleKeyShortcuts(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
1114 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1120 * @unimplemented (Undocumented)
1124 SetConsoleMaximumWindowSize(DWORD Unknown0
,
1127 DPRINT1("SetConsoleMaximumWindowSize(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1128 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1134 * @unimplemented (Undocumented)
1138 SetConsoleMenuClose(DWORD Unknown0
)
1140 DPRINT1("SetConsoleMenuClose(0x%x) UNIMPLEMENTED!\n", Unknown0
);
1141 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1147 * @unimplemented (Undocumented)
1151 SetConsoleNumberOfCommandsA(DWORD Unknown0
,
1154 DPRINT1("SetConsoleNumberOfCommandsA(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1155 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1161 * @unimplemented (Undocumented)
1165 SetConsoleNumberOfCommandsW(DWORD Unknown0
,
1168 DPRINT1("SetConsoleNumberOfCommandsW(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1169 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1175 * @unimplemented (Undocumented)
1179 SetConsolePalette(DWORD Unknown0
,
1183 DPRINT1("SetConsolePalette(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
);
1184 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1190 * @unimplemented (Undocumented)
1194 SetLastConsoleEventActive(VOID
)
1196 DPRINT1("SetLastConsoleEventActive() UNIMPLEMENTED!\n");
1197 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1203 * @unimplemented (Undocumented)
1207 ShowConsoleCursor(DWORD Unknown0
,
1210 DPRINT1("ShowConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1211 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1217 * FUNCTION: Checks whether the given handle is a valid console handle.
1219 * Handle - Handle to be checked
1221 * TRUE: Handle is a valid console handle
1222 * FALSE: Handle is not a valid console handle.
1223 * STATUS: Officially undocumented
1229 VerifyConsoleIoHandle(HANDLE Handle
)
1231 CSR_API_MESSAGE Request
;
1235 CsrRequest
= MAKE_CSR_API(VERIFY_HANDLE
, CSR_NATIVE
);
1236 Request
.Data
.VerifyHandleRequest
.Handle
= Handle
;
1238 Status
= CsrClientCallServer(&Request
,
1241 sizeof(CSR_API_MESSAGE
));
1242 if (!NT_SUCCESS(Status
))
1244 SetLastErrorByStatus(Status
);
1248 return (BOOL
)NT_SUCCESS(Request
.Status
);
1257 WriteConsoleInputVDMA(DWORD Unknown0
,
1262 DPRINT1("WriteConsoleInputVDMA(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
1263 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1273 WriteConsoleInputVDMW(DWORD Unknown0
,
1278 DPRINT1("WriteConsoleInputVDMW(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
1279 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1285 * @implemented (Undocumented)
1289 CloseConsoleHandle(HANDLE Handle
)
1291 CSR_API_MESSAGE Request
;
1295 CsrRequest
= MAKE_CSR_API(CLOSE_HANDLE
, CSR_NATIVE
);
1296 Request
.Data
.CloseHandleRequest
.Handle
= Handle
;
1298 Status
= CsrClientCallServer(&Request
,
1301 sizeof(CSR_API_MESSAGE
));
1302 if (!NT_SUCCESS(Status
))
1304 SetLastErrorByStatus(Status
);
1316 GetStdHandle(DWORD nStdHandle
)
1318 * FUNCTION: Get a handle for the standard input, standard output
1319 * and a standard error device.
1321 * nStdHandle - Specifies the device for which to return the handle.
1322 * RETURNS: If the function succeeds, the return value is the handle
1323 * of the specified device. Otherwise the value is INVALID_HANDLE_VALUE.
1326 PRTL_USER_PROCESS_PARAMETERS Ppb
;
1328 Ppb
= NtCurrentPeb()->ProcessParameters
;
1331 case STD_INPUT_HANDLE
:
1332 return Ppb
->StandardInput
;
1334 case STD_OUTPUT_HANDLE
:
1335 return Ppb
->StandardOutput
;
1337 case STD_ERROR_HANDLE
:
1338 return Ppb
->StandardError
;
1341 SetLastError (ERROR_INVALID_PARAMETER
);
1342 return INVALID_HANDLE_VALUE
;
1351 SetStdHandle(DWORD nStdHandle
,
1354 * FUNCTION: Set the handle for the standard input, standard output or
1355 * the standard error device.
1357 * nStdHandle - Specifies the handle to be set.
1358 * hHandle - The handle to set.
1359 * RETURNS: TRUE if the function succeeds, FALSE otherwise.
1362 PRTL_USER_PROCESS_PARAMETERS Ppb
;
1364 /* no need to check if hHandle == INVALID_HANDLE_VALUE */
1366 Ppb
= NtCurrentPeb()->ProcessParameters
;
1370 case STD_INPUT_HANDLE
:
1371 Ppb
->StandardInput
= hHandle
;
1374 case STD_OUTPUT_HANDLE
:
1375 Ppb
->StandardOutput
= hHandle
;
1378 case STD_ERROR_HANDLE
:
1379 Ppb
->StandardError
= hHandle
;
1383 /* windows for whatever reason sets the last error to ERROR_INVALID_HANDLE here */
1384 SetLastError(ERROR_INVALID_HANDLE
);
1391 IntWriteConsole(HANDLE hConsoleOutput
,
1393 DWORD nNumberOfCharsToWrite
,
1394 LPDWORD lpNumberOfCharsWritten
,
1398 PCSR_API_MESSAGE Request
;
1402 ULONG SizeBytes
, CharSize
;
1405 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
1406 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
1408 max(sizeof(CSR_API_MESSAGE
),
1409 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE
) + min(nNumberOfCharsToWrite
,
1410 CSRSS_MAX_WRITE_CONSOLE
/ CharSize
) * CharSize
));
1411 if (Request
== NULL
)
1413 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1417 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE
, CSR_CONSOLE
);
1419 while (nNumberOfCharsToWrite
> 0)
1421 Request
->Data
.WriteConsoleRequest
.ConsoleHandle
= hConsoleOutput
;
1422 Request
->Data
.WriteConsoleRequest
.Unicode
= bUnicode
;
1424 nChars
= (USHORT
)min(nNumberOfCharsToWrite
, CSRSS_MAX_WRITE_CONSOLE
/ CharSize
);
1425 Request
->Data
.WriteConsoleRequest
.NrCharactersToWrite
= nChars
;
1427 SizeBytes
= nChars
* CharSize
;
1429 memcpy(Request
->Data
.WriteConsoleRequest
.Buffer
, lpBuffer
, SizeBytes
);
1431 Status
= CsrClientCallServer(Request
,
1434 max(sizeof(CSR_API_MESSAGE
),
1435 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE
) + SizeBytes
));
1437 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
1439 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1440 SetLastErrorByStatus(Status
);
1444 nNumberOfCharsToWrite
-= nChars
;
1445 lpBuffer
= (PVOID
)((ULONG_PTR
)lpBuffer
+ (ULONG_PTR
)SizeBytes
);
1446 Written
+= Request
->Data
.WriteConsoleRequest
.NrCharactersWritten
;
1449 if (lpNumberOfCharsWritten
!= NULL
)
1451 *lpNumberOfCharsWritten
= Written
;
1453 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1459 /*--------------------------------------------------------------
1466 WriteConsoleA(HANDLE hConsoleOutput
,
1467 CONST VOID
*lpBuffer
,
1468 DWORD nNumberOfCharsToWrite
,
1469 LPDWORD lpNumberOfCharsWritten
,
1472 return IntWriteConsole(hConsoleOutput
,
1474 nNumberOfCharsToWrite
,
1475 lpNumberOfCharsWritten
,
1481 /*--------------------------------------------------------------
1488 WriteConsoleW(HANDLE hConsoleOutput
,
1489 CONST VOID
*lpBuffer
,
1490 DWORD nNumberOfCharsToWrite
,
1491 LPDWORD lpNumberOfCharsWritten
,
1494 return IntWriteConsole(hConsoleOutput
,
1496 nNumberOfCharsToWrite
,
1497 lpNumberOfCharsWritten
,
1505 IntReadConsole(HANDLE hConsoleInput
,
1507 DWORD nNumberOfCharsToRead
,
1508 LPDWORD lpNumberOfCharsRead
,
1509 PCONSOLE_READCONSOLE_CONTROL lpReserved
,
1512 PCSR_API_MESSAGE Request
;
1515 ULONG CharSize
, CharsRead
= 0;
1517 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
1518 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
1520 max(sizeof(CSR_API_MESSAGE
),
1521 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE
) + min(nNumberOfCharsToRead
,
1522 CSRSS_MAX_READ_CONSOLE
/ CharSize
) * CharSize
));
1523 if (Request
== NULL
)
1525 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1529 Request
->Status
= STATUS_SUCCESS
;
1530 CsrRequest
= MAKE_CSR_API(READ_CONSOLE
, CSR_CONSOLE
);
1534 if (Request
->Status
== STATUS_PENDING
)
1536 Status
= NtWaitForSingleObject(Request
->Data
.ReadConsoleRequest
.EventHandle
,
1539 if (!NT_SUCCESS(Status
))
1541 DPRINT1("Wait for console input failed!\n");
1546 Request
->Data
.ReadConsoleRequest
.ConsoleHandle
= hConsoleInput
;
1547 Request
->Data
.ReadConsoleRequest
.Unicode
= bUnicode
;
1548 Request
->Data
.ReadConsoleRequest
.NrCharactersToRead
= (WORD
)min(nNumberOfCharsToRead
, CSRSS_MAX_READ_CONSOLE
/ CharSize
);
1549 Request
->Data
.ReadConsoleRequest
.nCharsCanBeDeleted
= (WORD
)CharsRead
;
1551 Status
= CsrClientCallServer(Request
,
1554 max(sizeof(CSR_API_MESSAGE
),
1555 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE
)
1556 + Request
->Data
.ReadConsoleRequest
.NrCharactersToRead
* CharSize
));
1558 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
1560 DPRINT1("CSR returned error in ReadConsole\n");
1561 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1562 SetLastErrorByStatus(Status
);
1566 nNumberOfCharsToRead
-= Request
->Data
.ReadConsoleRequest
.NrCharactersRead
;
1567 memcpy((PVOID
)((ULONG_PTR
)lpBuffer
+ (ULONG_PTR
)(CharsRead
* CharSize
)),
1568 Request
->Data
.ReadConsoleRequest
.Buffer
,
1569 Request
->Data
.ReadConsoleRequest
.NrCharactersRead
* CharSize
);
1570 CharsRead
+= Request
->Data
.ReadConsoleRequest
.NrCharactersRead
;
1572 if (Request
->Status
== STATUS_NOTIFY_CLEANUP
)
1577 nNumberOfCharsToRead
++;
1579 Request
->Status
= STATUS_PENDING
;
1582 while (Request
->Status
== STATUS_PENDING
&& nNumberOfCharsToRead
> 0);
1584 if (lpNumberOfCharsRead
!= NULL
)
1586 *lpNumberOfCharsRead
= CharsRead
;
1589 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1595 /*--------------------------------------------------------------
1602 ReadConsoleA(HANDLE hConsoleInput
,
1604 DWORD nNumberOfCharsToRead
,
1605 LPDWORD lpNumberOfCharsRead
,
1606 PCONSOLE_READCONSOLE_CONTROL pInputControl
)
1608 return IntReadConsole(hConsoleInput
,
1610 nNumberOfCharsToRead
,
1611 lpNumberOfCharsRead
,
1617 /*--------------------------------------------------------------
1624 ReadConsoleW(HANDLE hConsoleInput
,
1626 DWORD nNumberOfCharsToRead
,
1627 LPDWORD lpNumberOfCharsRead
,
1628 PCONSOLE_READCONSOLE_CONTROL pInputControl
)
1630 return IntReadConsole(hConsoleInput
,
1632 nNumberOfCharsToRead
,
1633 lpNumberOfCharsRead
,
1639 /*--------------------------------------------------------------
1648 CSR_API_MESSAGE Request
;
1653 if (NtCurrentPeb()->ProcessParameters
->ConsoleHandle
)
1655 DPRINT("AllocConsole: Allocate duplicate console to the same Process\n");
1656 SetLastErrorByStatus (STATUS_OBJECT_NAME_EXISTS
);
1660 Request
.Data
.AllocConsoleRequest
.CtrlDispatcher
= ConsoleControlDispatcher
;
1661 Request
.Data
.AllocConsoleRequest
.ConsoleNeeded
= TRUE
;
1663 CsrRequest
= MAKE_CSR_API(ALLOC_CONSOLE
, CSR_CONSOLE
);
1665 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
1666 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1668 SetLastErrorByStatus(Status
);
1672 NtCurrentPeb()->ProcessParameters
->ConsoleHandle
= Request
.Data
.AllocConsoleRequest
.Console
;
1674 SetStdHandle(STD_INPUT_HANDLE
, Request
.Data
.AllocConsoleRequest
.InputHandle
);
1675 SetStdHandle(STD_OUTPUT_HANDLE
, Request
.Data
.AllocConsoleRequest
.OutputHandle
);
1677 hStdError
= DuplicateConsoleHandle(Request
.Data
.AllocConsoleRequest
.OutputHandle
,
1680 DUPLICATE_SAME_ACCESS
);
1682 SetStdHandle(STD_ERROR_HANDLE
, hStdError
);
1687 /*--------------------------------------------------------------
1696 // AG: I'm not sure if this is correct (what happens to std handles?)
1697 // but I just tried to reverse what AllocConsole() does...
1699 CSR_API_MESSAGE Request
;
1703 CsrRequest
= MAKE_CSR_API(FREE_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
= NULL
;
1717 /*--------------------------------------------------------------
1718 * GetConsoleScreenBufferInfo
1724 GetConsoleScreenBufferInfo(HANDLE hConsoleOutput
,
1725 PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
)
1727 CSR_API_MESSAGE Request
;
1731 CsrRequest
= MAKE_CSR_API(SCREEN_BUFFER_INFO
, CSR_CONSOLE
);
1732 Request
.Data
.ScreenBufferInfoRequest
.ConsoleHandle
= hConsoleOutput
;
1734 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
1735 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1737 SetLastErrorByStatus(Status
);
1740 *lpConsoleScreenBufferInfo
= Request
.Data
.ScreenBufferInfoRequest
.Info
;
1745 /*--------------------------------------------------------------
1746 * SetConsoleCursorPosition
1752 SetConsoleCursorPosition(HANDLE hConsoleOutput
,
1753 COORD dwCursorPosition
)
1755 CSR_API_MESSAGE Request
;
1759 CsrRequest
= MAKE_CSR_API(SET_CURSOR
, CSR_CONSOLE
);
1760 Request
.Data
.SetCursorRequest
.ConsoleHandle
= hConsoleOutput
;
1761 Request
.Data
.SetCursorRequest
.Position
= dwCursorPosition
;
1763 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
1764 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1766 SetLastErrorByStatus(Status
);
1776 IntFillConsoleOutputCharacter(HANDLE hConsoleOutput
,
1780 LPDWORD lpNumberOfCharsWritten
,
1783 CSR_API_MESSAGE Request
;
1787 CsrRequest
= MAKE_CSR_API(FILL_OUTPUT
, CSR_CONSOLE
);
1788 Request
.Data
.FillOutputRequest
.ConsoleHandle
= hConsoleOutput
;
1789 Request
.Data
.FillOutputRequest
.Unicode
= bUnicode
;
1792 Request
.Data
.FillOutputRequest
.Char
.UnicodeChar
= *((WCHAR
*)cCharacter
);
1794 Request
.Data
.FillOutputRequest
.Char
.AsciiChar
= *((CHAR
*)cCharacter
);
1796 Request
.Data
.FillOutputRequest
.Position
= dwWriteCoord
;
1797 Request
.Data
.FillOutputRequest
.Length
= (WORD
)nLength
;
1799 Status
= CsrClientCallServer(&Request
,
1802 sizeof(CSR_API_MESSAGE
));
1804 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1806 SetLastErrorByStatus(Status
);
1810 if(lpNumberOfCharsWritten
!= NULL
)
1812 *lpNumberOfCharsWritten
= Request
.Data
.FillOutputRequest
.NrCharactersWritten
;
1818 /*--------------------------------------------------------------
1819 * FillConsoleOutputCharacterA
1825 FillConsoleOutputCharacterA(HANDLE hConsoleOutput
,
1829 LPDWORD lpNumberOfCharsWritten
)
1831 return IntFillConsoleOutputCharacter(hConsoleOutput
,
1835 lpNumberOfCharsWritten
,
1840 /*--------------------------------------------------------------
1841 * FillConsoleOutputCharacterW
1847 FillConsoleOutputCharacterW(HANDLE hConsoleOutput
,
1851 LPDWORD lpNumberOfCharsWritten
)
1853 return IntFillConsoleOutputCharacter(hConsoleOutput
,
1857 lpNumberOfCharsWritten
,
1864 IntPeekConsoleInput(HANDLE hConsoleInput
,
1865 PINPUT_RECORD lpBuffer
,
1867 LPDWORD lpNumberOfEventsRead
,
1870 CSR_API_MESSAGE Request
;
1872 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1876 if (lpBuffer
== NULL
)
1878 SetLastError(ERROR_INVALID_PARAMETER
);
1882 Size
= nLength
* sizeof(INPUT_RECORD
);
1884 /* Allocate a Capture Buffer */
1885 DPRINT("IntPeekConsoleInput: %lx %p\n", Size
, lpNumberOfEventsRead
);
1886 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
1888 /* Allocate space in the Buffer */
1889 CsrCaptureMessageBuffer(CaptureBuffer
,
1892 (PVOID
*)&Request
.Data
.PeekConsoleInputRequest
.InputRecord
);
1894 /* Set up the data to send to the Console Server */
1895 CsrRequest
= MAKE_CSR_API(PEEK_CONSOLE_INPUT
, CSR_CONSOLE
);
1896 Request
.Data
.PeekConsoleInputRequest
.ConsoleHandle
= hConsoleInput
;
1897 Request
.Data
.PeekConsoleInputRequest
.Unicode
= bUnicode
;
1898 Request
.Data
.PeekConsoleInputRequest
.Length
= nLength
;
1900 /* Call the server */
1901 Status
= CsrClientCallServer(&Request
,
1904 sizeof(CSR_API_MESSAGE
));
1905 DPRINT("Server returned: %x\n", Request
.Status
);
1907 /* Check for success*/
1908 if (NT_SUCCESS(Request
.Status
))
1910 /* Return the number of events read */
1911 DPRINT("Events read: %lx\n", Request
.Data
.PeekConsoleInputRequest
.Length
);
1912 *lpNumberOfEventsRead
= Request
.Data
.PeekConsoleInputRequest
.Length
;
1914 /* Copy into the buffer */
1915 DPRINT("Copying to buffer\n");
1916 RtlCopyMemory(lpBuffer
,
1917 Request
.Data
.PeekConsoleInputRequest
.InputRecord
,
1918 sizeof(INPUT_RECORD
) * *lpNumberOfEventsRead
);
1923 *lpNumberOfEventsRead
= 0;
1924 SetLastErrorByStatus(Request
.Status
);
1927 /* Release the capture buffer */
1928 CsrFreeCaptureBuffer(CaptureBuffer
);
1930 /* Return TRUE or FALSE */
1931 return NT_SUCCESS(Request
.Status
);
1934 /*--------------------------------------------------------------
1941 PeekConsoleInputA(HANDLE hConsoleInput
,
1942 PINPUT_RECORD lpBuffer
,
1944 LPDWORD lpNumberOfEventsRead
)
1946 return IntPeekConsoleInput(hConsoleInput
,
1949 lpNumberOfEventsRead
,
1954 /*--------------------------------------------------------------
1961 PeekConsoleInputW(HANDLE hConsoleInput
,
1962 PINPUT_RECORD lpBuffer
,
1964 LPDWORD lpNumberOfEventsRead
)
1966 return IntPeekConsoleInput(hConsoleInput
,
1968 lpNumberOfEventsRead
,
1975 IntReadConsoleInput(HANDLE hConsoleInput
,
1976 PINPUT_RECORD lpBuffer
,
1978 LPDWORD lpNumberOfEventsRead
,
1981 CSR_API_MESSAGE Request
;
1986 CsrRequest
= MAKE_CSR_API(READ_INPUT
, CSR_CONSOLE
);
1991 Request
.Data
.ReadInputRequest
.ConsoleHandle
= hConsoleInput
;
1992 Request
.Data
.ReadInputRequest
.Unicode
= bUnicode
;
1994 Status
= CsrClientCallServer(&Request
,
1997 sizeof(CSR_API_MESSAGE
));
1998 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2002 /* we couldn't read a single record, fail */
2003 SetLastErrorByStatus(Status
);
2008 /* FIXME - fail gracefully in case we already read at least one record? */
2012 else if (Status
== STATUS_PENDING
)
2016 Status
= NtWaitForSingleObject(Request
.Data
.ReadInputRequest
.Event
, FALSE
, 0);
2017 if (!NT_SUCCESS(Status
))
2019 SetLastErrorByStatus(Status
);
2025 /* nothing more to read (waiting for more input??), let's just bail */
2031 lpBuffer
[Read
++] = Request
.Data
.ReadInputRequest
.Input
;
2034 if (!Request
.Data
.ReadInputRequest
.MoreEvents
)
2036 /* nothing more to read, bail */
2042 if (lpNumberOfEventsRead
!= NULL
)
2044 *lpNumberOfEventsRead
= Read
;
2051 /*--------------------------------------------------------------
2058 ReadConsoleInputA(HANDLE hConsoleInput
,
2059 PINPUT_RECORD lpBuffer
,
2061 LPDWORD lpNumberOfEventsRead
)
2063 return IntReadConsoleInput(hConsoleInput
,
2066 lpNumberOfEventsRead
,
2071 /*--------------------------------------------------------------
2078 ReadConsoleInputW(HANDLE hConsoleInput
,
2079 PINPUT_RECORD lpBuffer
,
2081 LPDWORD lpNumberOfEventsRead
)
2083 return IntReadConsoleInput(hConsoleInput
,
2086 lpNumberOfEventsRead
,
2093 IntWriteConsoleInput(HANDLE hConsoleInput
,
2094 PINPUT_RECORD lpBuffer
,
2096 LPDWORD lpNumberOfEventsWritten
,
2099 CSR_API_MESSAGE Request
;
2101 PCSR_CAPTURE_BUFFER CaptureBuffer
;
2105 if (lpBuffer
== NULL
)
2107 SetLastError(ERROR_INVALID_PARAMETER
);
2111 Size
= nLength
* sizeof(INPUT_RECORD
);
2113 /* Allocate a Capture Buffer */
2114 DPRINT("IntWriteConsoleInput: %lx %p\n", Size
, lpNumberOfEventsWritten
);
2115 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
2117 /* Allocate space in the Buffer */
2118 CsrCaptureMessageBuffer(CaptureBuffer
,
2121 (PVOID
*)&Request
.Data
.WriteConsoleInputRequest
.InputRecord
);
2123 /* Set up the data to send to the Console Server */
2124 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_INPUT
, CSR_CONSOLE
);
2125 Request
.Data
.WriteConsoleInputRequest
.ConsoleHandle
= hConsoleInput
;
2126 Request
.Data
.WriteConsoleInputRequest
.Unicode
= bUnicode
;
2127 Request
.Data
.WriteConsoleInputRequest
.Length
= nLength
;
2129 /* Call the server */
2130 Status
= CsrClientCallServer(&Request
,
2133 sizeof(CSR_API_MESSAGE
));
2134 DPRINT("Server returned: %x\n", Request
.Status
);
2136 /* Check for success*/
2137 if (NT_SUCCESS(Request
.Status
))
2139 /* Return the number of events read */
2140 DPRINT("Events read: %lx\n", Request
.Data
.WriteConsoleInputRequest
.Length
);
2141 *lpNumberOfEventsWritten
= Request
.Data
.WriteConsoleInputRequest
.Length
;
2146 *lpNumberOfEventsWritten
= 0;
2147 SetLastErrorByStatus(Request
.Status
);
2150 /* Release the capture buffer */
2151 CsrFreeCaptureBuffer(CaptureBuffer
);
2153 /* Return TRUE or FALSE */
2154 return NT_SUCCESS(Request
.Status
);
2158 /*--------------------------------------------------------------
2159 * WriteConsoleInputA
2165 WriteConsoleInputA(HANDLE hConsoleInput
,
2166 CONST INPUT_RECORD
*lpBuffer
,
2168 LPDWORD lpNumberOfEventsWritten
)
2170 return IntWriteConsoleInput(hConsoleInput
,
2171 (PINPUT_RECORD
)lpBuffer
,
2173 lpNumberOfEventsWritten
,
2178 /*--------------------------------------------------------------
2179 * WriteConsoleInputW
2185 WriteConsoleInputW(HANDLE hConsoleInput
,
2186 CONST INPUT_RECORD
*lpBuffer
,
2188 LPDWORD lpNumberOfEventsWritten
)
2190 return IntWriteConsoleInput(hConsoleInput
,
2191 (PINPUT_RECORD
)lpBuffer
,
2193 lpNumberOfEventsWritten
,
2200 IntReadConsoleOutput(HANDLE hConsoleOutput
,
2201 PCHAR_INFO lpBuffer
,
2203 COORD dwBufferCoord
,
2204 PSMALL_RECT lpReadRegion
,
2207 CSR_API_MESSAGE Request
;
2209 PCSR_CAPTURE_BUFFER CaptureBuffer
;
2211 DWORD Size
, SizeX
, SizeY
;
2213 if (lpBuffer
== NULL
)
2215 SetLastError(ERROR_INVALID_PARAMETER
);
2219 Size
= dwBufferSize
.X
* dwBufferSize
.Y
* sizeof(CHAR_INFO
);
2221 /* Allocate a Capture Buffer */
2222 DPRINT("IntReadConsoleOutput: %lx %p\n", Size
, lpReadRegion
);
2223 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
2225 /* Allocate space in the Buffer */
2226 CsrCaptureMessageBuffer(CaptureBuffer
,
2229 (PVOID
*)&Request
.Data
.ReadConsoleOutputRequest
.CharInfo
);
2231 /* Set up the data to send to the Console Server */
2232 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT
, CSR_CONSOLE
);
2233 Request
.Data
.ReadConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
2234 Request
.Data
.ReadConsoleOutputRequest
.Unicode
= bUnicode
;
2235 Request
.Data
.ReadConsoleOutputRequest
.BufferSize
= dwBufferSize
;
2236 Request
.Data
.ReadConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
2237 Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
= *lpReadRegion
;
2239 /* Call the server */
2240 Status
= CsrClientCallServer(&Request
,
2243 sizeof(CSR_API_MESSAGE
));
2244 DPRINT("Server returned: %x\n", Request
.Status
);
2246 /* Check for success*/
2247 if (NT_SUCCESS(Request
.Status
))
2249 /* Copy into the buffer */
2250 DPRINT("Copying to buffer\n");
2251 SizeX
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Right
-
2252 Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Left
+ 1;
2253 SizeY
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Bottom
-
2254 Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Top
+ 1;
2255 RtlCopyMemory(lpBuffer
,
2256 Request
.Data
.ReadConsoleOutputRequest
.CharInfo
,
2257 sizeof(CHAR_INFO
) * SizeX
* SizeY
);
2262 SetLastErrorByStatus(Request
.Status
);
2265 /* Return the read region */
2266 DPRINT("read region: %lx\n", Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
);
2267 *lpReadRegion
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
;
2269 /* Release the capture buffer */
2270 CsrFreeCaptureBuffer(CaptureBuffer
);
2272 /* Return TRUE or FALSE */
2273 return NT_SUCCESS(Request
.Status
);
2276 /*--------------------------------------------------------------
2277 * ReadConsoleOutputA
2283 ReadConsoleOutputA(HANDLE hConsoleOutput
,
2284 PCHAR_INFO lpBuffer
,
2286 COORD dwBufferCoord
,
2287 PSMALL_RECT lpReadRegion
)
2289 return IntReadConsoleOutput(hConsoleOutput
,
2298 /*--------------------------------------------------------------
2299 * ReadConsoleOutputW
2305 ReadConsoleOutputW(HANDLE hConsoleOutput
,
2306 PCHAR_INFO lpBuffer
,
2308 COORD dwBufferCoord
,
2309 PSMALL_RECT lpReadRegion
)
2311 return IntReadConsoleOutput(hConsoleOutput
,
2322 IntWriteConsoleOutput(HANDLE hConsoleOutput
,
2323 CONST CHAR_INFO
*lpBuffer
,
2325 COORD dwBufferCoord
,
2326 PSMALL_RECT lpWriteRegion
,
2329 CSR_API_MESSAGE Request
;
2331 PCSR_CAPTURE_BUFFER CaptureBuffer
;
2335 Size
= dwBufferSize
.Y
* dwBufferSize
.X
* sizeof(CHAR_INFO
);
2337 /* Allocate a Capture Buffer */
2338 DPRINT("IntWriteConsoleOutput: %lx %p\n", Size
, lpWriteRegion
);
2339 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
2341 /* Allocate space in the Buffer */
2342 CsrCaptureMessageBuffer(CaptureBuffer
,
2345 (PVOID
*)&Request
.Data
.WriteConsoleOutputRequest
.CharInfo
);
2347 /* Copy from the buffer */
2348 RtlCopyMemory(Request
.Data
.WriteConsoleOutputRequest
.CharInfo
, lpBuffer
, Size
);
2350 /* Set up the data to send to the Console Server */
2351 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT
, CSR_CONSOLE
);
2352 Request
.Data
.WriteConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
2353 Request
.Data
.WriteConsoleOutputRequest
.Unicode
= bUnicode
;
2354 Request
.Data
.WriteConsoleOutputRequest
.BufferSize
= dwBufferSize
;
2355 Request
.Data
.WriteConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
2356 Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
= *lpWriteRegion
;
2358 /* Call the server */
2359 Status
= CsrClientCallServer(&Request
,
2362 sizeof(CSR_API_MESSAGE
));
2363 DPRINT("Server returned: %x\n", Request
.Status
);
2365 /* Check for success*/
2366 if (!NT_SUCCESS(Request
.Status
))
2369 SetLastErrorByStatus(Request
.Status
);
2372 /* Return the read region */
2373 DPRINT("read region: %lx\n", Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
);
2374 *lpWriteRegion
= Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
;
2376 /* Release the capture buffer */
2377 CsrFreeCaptureBuffer(CaptureBuffer
);
2379 /* Return TRUE or FALSE */
2380 return NT_SUCCESS(Request
.Status
);
2383 /*--------------------------------------------------------------
2384 * WriteConsoleOutputA
2390 WriteConsoleOutputA(HANDLE hConsoleOutput
,
2391 CONST CHAR_INFO
*lpBuffer
,
2393 COORD dwBufferCoord
,
2394 PSMALL_RECT lpWriteRegion
)
2396 return IntWriteConsoleOutput(hConsoleOutput
,
2405 /*--------------------------------------------------------------
2406 * WriteConsoleOutputW
2412 WriteConsoleOutputW(HANDLE hConsoleOutput
,
2413 CONST CHAR_INFO
*lpBuffer
,
2415 COORD dwBufferCoord
,
2416 PSMALL_RECT lpWriteRegion
)
2418 return IntWriteConsoleOutput(hConsoleOutput
,
2429 IntReadConsoleOutputCharacter(HANDLE hConsoleOutput
,
2433 LPDWORD lpNumberOfCharsRead
,
2436 PCSR_API_MESSAGE Request
;
2439 ULONG nChars
, SizeBytes
, CharSize
;
2440 DWORD CharsRead
= 0;
2442 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
2444 nChars
= min(nLength
, CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR
) / CharSize
;
2445 SizeBytes
= nChars
* CharSize
;
2447 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
2448 max(sizeof(CSR_API_MESSAGE
),
2449 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR
)
2450 + min (nChars
, CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR
/ CharSize
) * CharSize
));
2451 if (Request
== NULL
)
2453 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2457 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT_CHAR
, CSR_CONSOLE
);
2458 Request
->Data
.ReadConsoleOutputCharRequest
.ReadCoord
= dwReadCoord
;
2464 Request
->Data
.ReadConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
2465 Request
->Data
.ReadConsoleOutputCharRequest
.Unicode
= bUnicode
;
2466 Request
->Data
.ReadConsoleOutputCharRequest
.NumCharsToRead
= min(nLength
, nChars
);
2467 SizeBytes
= Request
->Data
.ReadConsoleOutputCharRequest
.NumCharsToRead
* CharSize
;
2469 Status
= CsrClientCallServer(Request
,
2472 max(sizeof(CSR_API_MESSAGE
),
2473 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR
) + SizeBytes
));
2474 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Request
->Status
))
2476 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2477 SetLastErrorByStatus(Status
);
2481 BytesRead
= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
* CharSize
;
2482 memcpy(lpCharacter
, Request
->Data
.ReadConsoleOutputCharRequest
.String
, BytesRead
);
2483 lpCharacter
= (PVOID
)((ULONG_PTR
)lpCharacter
+ (ULONG_PTR
)BytesRead
);
2484 CharsRead
+= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
;
2485 nLength
-= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
;
2487 Request
->Data
.ReadConsoleOutputCharRequest
.ReadCoord
= Request
->Data
.ReadConsoleOutputCharRequest
.EndCoord
;
2490 if (lpNumberOfCharsRead
!= NULL
)
2492 *lpNumberOfCharsRead
= CharsRead
;
2495 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2501 /*--------------------------------------------------------------
2502 * ReadConsoleOutputCharacterA
2508 ReadConsoleOutputCharacterA(HANDLE hConsoleOutput
,
2512 LPDWORD lpNumberOfCharsRead
)
2514 return IntReadConsoleOutputCharacter(hConsoleOutput
,
2518 lpNumberOfCharsRead
,
2523 /*--------------------------------------------------------------
2524 * ReadConsoleOutputCharacterW
2530 ReadConsoleOutputCharacterW(HANDLE hConsoleOutput
,
2534 LPDWORD lpNumberOfCharsRead
)
2536 return IntReadConsoleOutputCharacter(hConsoleOutput
,
2540 lpNumberOfCharsRead
,
2545 /*--------------------------------------------------------------
2546 * ReadConsoleOutputAttribute
2552 ReadConsoleOutputAttribute(HANDLE hConsoleOutput
,
2556 LPDWORD lpNumberOfAttrsRead
)
2558 PCSR_API_MESSAGE Request
;
2563 if (lpNumberOfAttrsRead
!= NULL
)
2564 *lpNumberOfAttrsRead
= nLength
;
2566 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
2568 max(sizeof(CSR_API_MESSAGE
),
2569 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB
)
2570 + min (nLength
, CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
)) * sizeof(WORD
)));
2571 if (Request
== NULL
)
2573 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2577 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2579 while (nLength
!= 0)
2581 Request
->Data
.ReadConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2582 Request
->Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= dwReadCoord
;
2584 if (nLength
> CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
))
2585 Size
= CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WCHAR
);
2589 Request
->Data
.ReadConsoleOutputAttribRequest
.NumAttrsToRead
= Size
;
2591 Status
= CsrClientCallServer(Request
,
2594 max(sizeof(CSR_API_MESSAGE
),
2595 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB
) + Size
* sizeof(WORD
)));
2596 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Request
->Status
))
2598 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2599 SetLastErrorByStatus(Status
);
2603 memcpy(lpAttribute
, Request
->Data
.ReadConsoleOutputAttribRequest
.Attribute
, Size
* sizeof(WORD
));
2604 lpAttribute
+= Size
;
2606 Request
->Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= Request
->Data
.ReadConsoleOutputAttribRequest
.EndCoord
;
2609 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2617 IntWriteConsoleOutputCharacter(HANDLE hConsoleOutput
,
2621 LPDWORD lpNumberOfCharsWritten
,
2624 PCSR_API_MESSAGE Request
;
2627 ULONG SizeBytes
, CharSize
, nChars
;
2630 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
2632 nChars
= min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
/ CharSize
);
2633 SizeBytes
= nChars
* CharSize
;
2635 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
2636 max(sizeof(CSR_API_MESSAGE
),
2637 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR
)
2638 + min (nChars
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
/ CharSize
) * CharSize
));
2639 if (Request
== NULL
)
2641 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2645 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT_CHAR
, CSR_CONSOLE
);
2646 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= dwWriteCoord
;
2652 Request
->Data
.WriteConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
2653 Request
->Data
.WriteConsoleOutputCharRequest
.Unicode
= bUnicode
;
2654 Request
->Data
.WriteConsoleOutputCharRequest
.Length
= (WORD
)min(nLength
, nChars
);
2655 BytesWrite
= Request
->Data
.WriteConsoleOutputCharRequest
.Length
* CharSize
;
2657 memcpy(Request
->Data
.WriteConsoleOutputCharRequest
.String
, lpCharacter
, BytesWrite
);
2659 Status
= CsrClientCallServer(Request
,
2662 max(sizeof(CSR_API_MESSAGE
),
2663 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR
) + BytesWrite
));
2665 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
2667 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2668 SetLastErrorByStatus(Status
);
2672 nLength
-= Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
;
2673 lpCharacter
= (PVOID
)((ULONG_PTR
)lpCharacter
+ (ULONG_PTR
)(Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
* CharSize
));
2674 Written
+= Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
;
2676 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= Request
->Data
.WriteConsoleOutputCharRequest
.EndCoord
;
2679 if (lpNumberOfCharsWritten
!= NULL
)
2681 *lpNumberOfCharsWritten
= Written
;
2684 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2690 /*--------------------------------------------------------------
2691 * WriteConsoleOutputCharacterA
2697 WriteConsoleOutputCharacterA(HANDLE hConsoleOutput
,
2701 LPDWORD lpNumberOfCharsWritten
)
2703 return IntWriteConsoleOutputCharacter(hConsoleOutput
,
2707 lpNumberOfCharsWritten
,
2712 /*--------------------------------------------------------------
2713 * WriteConsoleOutputCharacterW
2719 WriteConsoleOutputCharacterW(HANDLE hConsoleOutput
,
2720 LPCWSTR lpCharacter
,
2723 LPDWORD lpNumberOfCharsWritten
)
2725 return IntWriteConsoleOutputCharacter(hConsoleOutput
,
2729 lpNumberOfCharsWritten
,
2734 /*--------------------------------------------------------------
2735 * WriteConsoleOutputAttribute
2741 WriteConsoleOutputAttribute(HANDLE hConsoleOutput
,
2742 CONST WORD
*lpAttribute
,
2745 LPDWORD lpNumberOfAttrsWritten
)
2747 PCSR_API_MESSAGE Request
;
2752 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
2754 max(sizeof(CSR_API_MESSAGE
),
2755 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB
)
2756 + min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
)) * sizeof(WORD
)));
2757 if (Request
== NULL
)
2759 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2763 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2764 Request
->Data
.WriteConsoleOutputAttribRequest
.Coord
= dwWriteCoord
;
2766 if (lpNumberOfAttrsWritten
)
2767 *lpNumberOfAttrsWritten
= nLength
;
2770 Size
= (WORD
)min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
));
2771 Request
->Data
.WriteConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2772 Request
->Data
.WriteConsoleOutputAttribRequest
.Length
= Size
;
2773 memcpy(Request
->Data
.WriteConsoleOutputAttribRequest
.Attribute
, lpAttribute
, Size
* sizeof(WORD
));
2775 Status
= CsrClientCallServer(Request
,
2778 max(sizeof(CSR_API_MESSAGE
),
2779 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB
) + Size
* sizeof(WORD
)));
2781 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
2783 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2784 SetLastErrorByStatus (Status
);
2788 lpAttribute
+= Size
;
2789 Request
->Data
.WriteConsoleOutputAttribRequest
.Coord
= Request
->Data
.WriteConsoleOutputAttribRequest
.EndCoord
;
2792 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2798 /*--------------------------------------------------------------
2799 * FillConsoleOutputAttribute
2805 FillConsoleOutputAttribute(HANDLE hConsoleOutput
,
2809 LPDWORD lpNumberOfAttrsWritten
)
2811 CSR_API_MESSAGE Request
;
2815 CsrRequest
= MAKE_CSR_API(FILL_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2816 Request
.Data
.FillOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2817 Request
.Data
.FillOutputAttribRequest
.Attribute
= (CHAR
)wAttribute
;
2818 Request
.Data
.FillOutputAttribRequest
.Coord
= dwWriteCoord
;
2819 Request
.Data
.FillOutputAttribRequest
.Length
= (WORD
)nLength
;
2821 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
2822 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2824 SetLastErrorByStatus ( Status
);
2828 if (lpNumberOfAttrsWritten
)
2829 *lpNumberOfAttrsWritten
= nLength
;
2835 /*--------------------------------------------------------------
2842 GetConsoleMode(HANDLE hConsoleHandle
,
2845 CSR_API_MESSAGE Request
;
2849 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_MODE
, CSR_CONSOLE
);
2850 Request
.Data
.GetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
2852 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2853 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2855 SetLastErrorByStatus ( Status
);
2858 *lpMode
= Request
.Data
.GetConsoleModeRequest
.ConsoleMode
;
2864 /*--------------------------------------------------------------
2865 * GetNumberOfConsoleInputEvents
2871 GetNumberOfConsoleInputEvents(HANDLE hConsoleInput
,
2872 LPDWORD lpNumberOfEvents
)
2874 CSR_API_MESSAGE Request
;
2878 if (lpNumberOfEvents
== NULL
)
2880 SetLastError(ERROR_INVALID_PARAMETER
);
2884 CsrRequest
= MAKE_CSR_API(GET_NUM_INPUT_EVENTS
, CSR_CONSOLE
);
2885 Request
.Data
.GetNumInputEventsRequest
.ConsoleHandle
= hConsoleInput
;
2887 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
2888 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2890 SetLastErrorByStatus(Status
);
2894 *lpNumberOfEvents
= Request
.Data
.GetNumInputEventsRequest
.NumInputEvents
;
2900 /*--------------------------------------------------------------
2901 * GetLargestConsoleWindowSize
2907 GetLargestConsoleWindowSize(HANDLE hConsoleOutput
)
2909 COORD Coord
= {80,25};
2910 DPRINT1("GetLargestConsoleWindowSize(0x%x) UNIMPLEMENTED!\n", hConsoleOutput
);
2911 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2916 /*--------------------------------------------------------------
2917 * GetConsoleCursorInfo
2923 GetConsoleCursorInfo(HANDLE hConsoleOutput
,
2924 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
)
2926 CSR_API_MESSAGE Request
;
2930 if (!lpConsoleCursorInfo
)
2932 if (!hConsoleOutput
)
2933 SetLastError(ERROR_INVALID_HANDLE
);
2935 SetLastError(ERROR_INVALID_ACCESS
);
2940 CsrRequest
= MAKE_CSR_API(GET_CURSOR_INFO
, CSR_CONSOLE
);
2941 Request
.Data
.GetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
2943 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
2945 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2947 SetLastErrorByStatus(Status
);
2950 *lpConsoleCursorInfo
= Request
.Data
.GetCursorInfoRequest
.Info
;
2956 /*--------------------------------------------------------------
2957 * GetNumberOfConsoleMouseButtons
2963 GetNumberOfConsoleMouseButtons(LPDWORD lpNumberOfMouseButtons
)
2965 DPRINT1("GetNumberOfConsoleMouseButtons(0x%x) UNIMPLEMENTED!\n", lpNumberOfMouseButtons
);
2966 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2971 /*--------------------------------------------------------------
2978 SetConsoleMode(HANDLE hConsoleHandle
,
2981 CSR_API_MESSAGE Request
;
2985 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_MODE
, CSR_CONSOLE
);
2986 Request
.Data
.SetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
2987 Request
.Data
.SetConsoleModeRequest
.Mode
= dwMode
;
2989 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
2990 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2992 SetLastErrorByStatus ( Status
);
3000 /*--------------------------------------------------------------
3001 * SetConsoleActiveScreenBuffer
3007 SetConsoleActiveScreenBuffer(HANDLE hConsoleOutput
)
3009 CSR_API_MESSAGE Request
;
3013 CsrRequest
= MAKE_CSR_API(SET_SCREEN_BUFFER
, CSR_CONSOLE
);
3014 Request
.Data
.SetScreenBufferRequest
.OutputHandle
= hConsoleOutput
;
3016 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3017 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3019 SetLastErrorByStatus(Status
);
3027 /*--------------------------------------------------------------
3028 * FlushConsoleInputBuffer
3034 FlushConsoleInputBuffer(HANDLE hConsoleInput
)
3036 CSR_API_MESSAGE Request
;
3040 CsrRequest
= MAKE_CSR_API(FLUSH_INPUT_BUFFER
, CSR_CONSOLE
);
3041 Request
.Data
.FlushInputBufferRequest
.ConsoleInput
= hConsoleInput
;
3043 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3044 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3046 SetLastErrorByStatus(Status
);
3054 /*--------------------------------------------------------------
3055 * SetConsoleScreenBufferSize
3061 SetConsoleScreenBufferSize(HANDLE hConsoleOutput
,
3064 DPRINT1("SetConsoleScreenBufferSize(0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, dwSize
);
3065 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3069 /*--------------------------------------------------------------
3070 * SetConsoleCursorInfo
3076 SetConsoleCursorInfo(HANDLE hConsoleOutput
,
3077 CONST CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
)
3079 CSR_API_MESSAGE Request
;
3083 CsrRequest
= MAKE_CSR_API(SET_CURSOR_INFO
, CSR_CONSOLE
);
3084 Request
.Data
.SetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
3085 Request
.Data
.SetCursorInfoRequest
.Info
= *lpConsoleCursorInfo
;
3087 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3088 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3090 SetLastErrorByStatus(Status
);
3100 IntScrollConsoleScreenBuffer(HANDLE hConsoleOutput
,
3101 const SMALL_RECT
*lpScrollRectangle
,
3102 const SMALL_RECT
*lpClipRectangle
,
3103 COORD dwDestinationOrigin
,
3104 const CHAR_INFO
*lpFill
,
3107 CSR_API_MESSAGE Request
;
3111 CsrRequest
= MAKE_CSR_API(SCROLL_CONSOLE_SCREEN_BUFFER
, CSR_CONSOLE
);
3112 Request
.Data
.ScrollConsoleScreenBufferRequest
.ConsoleHandle
= hConsoleOutput
;
3113 Request
.Data
.ScrollConsoleScreenBufferRequest
.Unicode
= bUnicode
;
3114 Request
.Data
.ScrollConsoleScreenBufferRequest
.ScrollRectangle
= *lpScrollRectangle
;
3116 if (lpClipRectangle
!= NULL
)
3118 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= TRUE
;
3119 Request
.Data
.ScrollConsoleScreenBufferRequest
.ClipRectangle
= *lpClipRectangle
;
3123 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= FALSE
;
3126 Request
.Data
.ScrollConsoleScreenBufferRequest
.DestinationOrigin
= dwDestinationOrigin
;
3127 Request
.Data
.ScrollConsoleScreenBufferRequest
.Fill
= *lpFill
;
3129 Status
= CsrClientCallServer(&Request
,
3132 sizeof(CSR_API_MESSAGE
));
3134 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3136 SetLastErrorByStatus(Status
);
3144 /*--------------------------------------------------------------
3145 * ScrollConsoleScreenBufferA
3151 ScrollConsoleScreenBufferA(HANDLE hConsoleOutput
,
3152 CONST SMALL_RECT
*lpScrollRectangle
,
3153 CONST SMALL_RECT
*lpClipRectangle
,
3154 COORD dwDestinationOrigin
,
3155 CONST CHAR_INFO
*lpFill
)
3157 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
3158 (PSMALL_RECT
)lpScrollRectangle
,
3159 (PSMALL_RECT
)lpClipRectangle
,
3160 dwDestinationOrigin
,
3166 /*--------------------------------------------------------------
3167 * ScrollConsoleScreenBufferW
3173 ScrollConsoleScreenBufferW(HANDLE hConsoleOutput
,
3174 CONST SMALL_RECT
*lpScrollRectangle
,
3175 CONST SMALL_RECT
*lpClipRectangle
,
3176 COORD dwDestinationOrigin
,
3177 CONST CHAR_INFO
*lpFill
)
3179 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
3182 dwDestinationOrigin
,
3188 /*--------------------------------------------------------------
3189 * SetConsoleWindowInfo
3195 SetConsoleWindowInfo(HANDLE hConsoleOutput
,
3197 CONST SMALL_RECT
*lpConsoleWindow
)
3199 DPRINT1("SetConsoleWindowInfo(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bAbsolute
, lpConsoleWindow
);
3200 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3205 /*--------------------------------------------------------------
3206 * SetConsoleTextAttribute
3212 SetConsoleTextAttribute(HANDLE hConsoleOutput
,
3215 CSR_API_MESSAGE Request
;
3219 CsrRequest
= MAKE_CSR_API(SET_ATTRIB
, CSR_CONSOLE
);
3220 Request
.Data
.SetAttribRequest
.ConsoleHandle
= hConsoleOutput
;
3221 Request
.Data
.SetAttribRequest
.Attrib
= wAttributes
;
3223 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3224 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3226 SetLastErrorByStatus(Status
);
3236 AddConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
3238 if (HandlerRoutine
== NULL
)
3240 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= TRUE
;
3246 if (CtrlHandlers
== NULL
)
3248 CtrlHandlers
= RtlAllocateHeap(RtlGetProcessHeap(),
3250 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
3254 CtrlHandlers
= RtlReAllocateHeap(RtlGetProcessHeap(),
3256 (PVOID
)CtrlHandlers
,
3257 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
3260 if (CtrlHandlers
== NULL
)
3263 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3267 CtrlHandlers
[NrCtrlHandlers
- 1] = HandlerRoutine
;
3275 RemoveConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
3279 if (HandlerRoutine
== NULL
)
3281 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= FALSE
;
3286 for (i
= 0; i
< NrCtrlHandlers
; i
++)
3288 if ( ((void*)(CtrlHandlers
[i
])) == (void*)HandlerRoutine
)
3291 memmove(CtrlHandlers
+ i
,
3292 CtrlHandlers
+ i
+ 1,
3293 (NrCtrlHandlers
- i
) * sizeof(PHANDLER_ROUTINE
));
3295 CtrlHandlers
= RtlReAllocateHeap(RtlGetProcessHeap(),
3297 (PVOID
)CtrlHandlers
,
3298 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
3304 SetLastError(ERROR_INVALID_PARAMETER
);
3314 SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
,
3319 RtlEnterCriticalSection(&DllLock
);
3322 Ret
= AddConsoleCtrlHandler(HandlerRoutine
);
3326 Ret
= RemoveConsoleCtrlHandler(HandlerRoutine
);
3329 RtlLeaveCriticalSection(&DllLock
);
3334 /*--------------------------------------------------------------
3335 * GenerateConsoleCtrlEvent
3341 GenerateConsoleCtrlEvent(DWORD dwCtrlEvent
,
3342 DWORD dwProcessGroupId
)
3344 CSR_API_MESSAGE Request
;
3348 if (dwCtrlEvent
!= CTRL_C_EVENT
&& dwCtrlEvent
!= CTRL_BREAK_EVENT
)
3350 SetLastError(ERROR_INVALID_PARAMETER
);
3354 CsrRequest
= MAKE_CSR_API(GENERATE_CTRL_EVENT
, CSR_CONSOLE
);
3355 Request
.Data
.GenerateCtrlEvent
.Event
= dwCtrlEvent
;
3356 Request
.Data
.GenerateCtrlEvent
.ProcessGroup
= dwProcessGroupId
;
3358 Status
= CsrClientCallServer(&Request
,
3361 sizeof(CSR_API_MESSAGE
));
3362 if(!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= Request
.Status
)))
3364 SetLastErrorByStatus(Status
);
3372 /*--------------------------------------------------------------
3379 GetConsoleTitleW(LPWSTR lpConsoleTitle
,
3382 PCSR_API_MESSAGE Request
;
3386 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
3388 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_TITLE
) + CSRSS_MAX_TITLE_LENGTH
* sizeof(WCHAR
));
3389 if (Request
== NULL
)
3391 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3395 CsrRequest
= MAKE_CSR_API(GET_TITLE
, CSR_CONSOLE
);
3397 Status
= CsrClientCallServer(Request
,
3400 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_TITLE
) + CSRSS_MAX_TITLE_LENGTH
* sizeof(WCHAR
));
3401 if (!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= Request
->Status
)))
3403 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3404 SetLastErrorByStatus(Status
);
3408 if (nSize
* sizeof(WCHAR
) <= Request
->Data
.GetTitleRequest
.Length
)
3414 nSize
= Request
->Data
.GetTitleRequest
.Length
/ sizeof (WCHAR
);
3416 memcpy(lpConsoleTitle
, Request
->Data
.GetTitleRequest
.Title
, nSize
* sizeof(WCHAR
));
3417 lpConsoleTitle
[nSize
] = L
'\0';
3419 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3425 /*--------------------------------------------------------------
3434 GetConsoleTitleA(LPSTR lpConsoleTitle
,
3437 WCHAR WideTitle
[CSRSS_MAX_TITLE_LENGTH
+ 1];
3438 DWORD nWideTitle
= CSRSS_MAX_TITLE_LENGTH
+ 1;
3441 if (!lpConsoleTitle
|| !nSize
) return 0;
3442 nWideTitle
= GetConsoleTitleW((LPWSTR
) WideTitle
, nWideTitle
);
3443 if (!nWideTitle
) return 0;
3445 if ((nWritten
= WideCharToMultiByte(CP_ACP
, // ANSI code page
3446 0, // performance and mapping flags
3447 (LPWSTR
) WideTitle
, // address of wide-character string
3448 nWideTitle
, // number of characters in string
3449 lpConsoleTitle
, // address of buffer for new string
3450 nSize
- 1, // size of buffer
3454 lpConsoleTitle
[nWritten
] = '\0';
3462 /*--------------------------------------------------------------
3469 SetConsoleTitleW(LPCWSTR lpConsoleTitle
)
3471 PCSR_API_MESSAGE Request
;
3476 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
3477 max(sizeof(CSR_API_MESSAGE
),
3478 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) +
3479 min(wcslen(lpConsoleTitle
), CSRSS_MAX_TITLE_LENGTH
) * sizeof(WCHAR
)));
3480 if (Request
== NULL
)
3482 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3486 CsrRequest
= MAKE_CSR_API(SET_TITLE
, CSR_CONSOLE
);
3488 for (c
= 0; lpConsoleTitle
[c
] && c
< CSRSS_MAX_TITLE_LENGTH
; c
++)
3489 Request
->Data
.SetTitleRequest
.Title
[c
] = lpConsoleTitle
[c
];
3491 Request
->Data
.SetTitleRequest
.Length
= c
* sizeof(WCHAR
);
3492 Status
= CsrClientCallServer(Request
,
3495 max(sizeof(CSR_API_MESSAGE
),
3496 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) + c
* sizeof(WCHAR
)));
3497 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
3499 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3500 SetLastErrorByStatus(Status
);
3504 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3510 /*--------------------------------------------------------------
3519 SetConsoleTitleA(LPCSTR lpConsoleTitle
)
3521 PCSR_API_MESSAGE Request
;
3526 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
3528 max(sizeof(CSR_API_MESSAGE
),
3529 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) +
3530 min(strlen(lpConsoleTitle
), CSRSS_MAX_TITLE_LENGTH
) * sizeof(WCHAR
)));
3531 if (Request
== NULL
)
3533 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3537 CsrRequest
= MAKE_CSR_API(SET_TITLE
, CSR_CONSOLE
);
3539 for (c
= 0; lpConsoleTitle
[c
] && c
< CSRSS_MAX_TITLE_LENGTH
; c
++)
3540 Request
->Data
.SetTitleRequest
.Title
[c
] = lpConsoleTitle
[c
];
3542 Request
->Data
.SetTitleRequest
.Length
= c
* sizeof(WCHAR
);
3543 Status
= CsrClientCallServer(Request
,
3546 max(sizeof(CSR_API_MESSAGE
),
3547 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) + c
* sizeof(WCHAR
)));
3548 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
3550 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3551 SetLastErrorByStatus(Status
);
3555 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3561 /*--------------------------------------------------------------
3562 * CreateConsoleScreenBuffer
3568 CreateConsoleScreenBuffer(DWORD dwDesiredAccess
,
3570 CONST SECURITY_ATTRIBUTES
*lpSecurityAttributes
,
3572 LPVOID lpScreenBufferData
)
3574 CSR_API_MESSAGE Request
;
3578 if (dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
)
3579 || dwShareMode
& ~(FILE_SHARE_READ
| FILE_SHARE_WRITE
)
3580 || dwFlags
!= CONSOLE_TEXTMODE_BUFFER
)
3582 SetLastError(ERROR_INVALID_PARAMETER
);
3583 return INVALID_HANDLE_VALUE
;
3586 Request
.Data
.CreateScreenBufferRequest
.Access
= dwDesiredAccess
;
3587 Request
.Data
.CreateScreenBufferRequest
.ShareMode
= dwShareMode
;
3588 Request
.Data
.CreateScreenBufferRequest
.Inheritable
=
3589 lpSecurityAttributes
? lpSecurityAttributes
->bInheritHandle
: FALSE
;
3591 CsrRequest
= MAKE_CSR_API(CREATE_SCREEN_BUFFER
, CSR_CONSOLE
);
3592 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3593 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3595 SetLastErrorByStatus(Status
);
3596 return INVALID_HANDLE_VALUE
;
3598 return Request
.Data
.CreateScreenBufferRequest
.OutputHandle
;
3602 /*--------------------------------------------------------------
3611 CSR_API_MESSAGE Request
;
3615 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_CP
, CSR_CONSOLE
);
3616 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3617 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3619 SetLastErrorByStatus (Status
);
3623 return Request
.Data
.GetConsoleCodePage
.CodePage
;
3627 /*--------------------------------------------------------------
3634 SetConsoleCP(UINT wCodePageID
)
3636 CSR_API_MESSAGE Request
;
3640 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_CP
, CSR_CONSOLE
);
3641 Request
.Data
.SetConsoleCodePage
.CodePage
= wCodePageID
;
3643 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3644 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3646 SetLastErrorByStatus(Status
);
3649 return NT_SUCCESS(Status
);
3653 /*--------------------------------------------------------------
3654 * GetConsoleOutputCP
3660 GetConsoleOutputCP(VOID
)
3662 CSR_API_MESSAGE Request
;
3666 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_OUTPUT_CP
, CSR_CONSOLE
);
3667 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3668 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3670 SetLastErrorByStatus (Status
);
3674 return Request
.Data
.GetConsoleOutputCodePage
.CodePage
;
3678 /*--------------------------------------------------------------
3679 * SetConsoleOutputCP
3685 SetConsoleOutputCP(UINT wCodePageID
)
3687 CSR_API_MESSAGE Request
;
3691 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_OUTPUT_CP
, CSR_CONSOLE
);
3692 Request
.Data
.SetConsoleOutputCodePage
.CodePage
= wCodePageID
;
3693 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3694 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3696 SetLastErrorByStatus(Status
);
3699 return NT_SUCCESS(Status
);
3703 /*--------------------------------------------------------------
3704 * GetConsoleProcessList
3710 GetConsoleProcessList(LPDWORD lpdwProcessList
,
3711 DWORD dwProcessCount
)
3713 PCSR_API_MESSAGE Request
;
3718 if (lpdwProcessList
== NULL
|| dwProcessCount
== 0)
3720 SetLastError(ERROR_INVALID_PARAMETER
);
3724 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
3726 max(sizeof(CSR_API_MESSAGE
),
3727 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST
)
3728 + min (dwProcessCount
, CSRSS_MAX_GET_PROCESS_LIST
/ sizeof(DWORD
)) * sizeof(DWORD
)));
3729 if (Request
== NULL
)
3731 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3735 CsrRequest
= MAKE_CSR_API(GET_PROCESS_LIST
, CSR_CONSOLE
);
3736 Request
->Data
.GetProcessListRequest
.nMaxIds
= min (dwProcessCount
, CSRSS_MAX_GET_PROCESS_LIST
/ sizeof(DWORD
));
3738 Status
= CsrClientCallServer(Request
,
3741 max(sizeof(CSR_API_MESSAGE
),
3742 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST
)
3743 + Request
->Data
.GetProcessListRequest
.nMaxIds
* sizeof(DWORD
)));
3744 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
3746 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3747 SetLastErrorByStatus (Status
);
3752 nProcesses
= Request
->Data
.GetProcessListRequest
.nProcessIdsCopied
;
3753 if (dwProcessCount
>= nProcesses
)
3755 memcpy(lpdwProcessList
, Request
->Data
.GetProcessListRequest
.ProcessId
, nProcesses
* sizeof(DWORD
));
3759 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3766 /*--------------------------------------------------------------
3767 * GetConsoleSelectionInfo
3773 GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo
)
3775 DPRINT1("GetConsoleSelectionInfo(0x%x) UNIMPLEMENTED!\n", lpConsoleSelectionInfo
);
3776 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3782 /*--------------------------------------------------------------
3789 AttachConsole(DWORD dwProcessId
)
3791 DPRINT1("AttachConsole(0x%x) UNIMPLEMENTED!\n", dwProcessId
);
3795 /*--------------------------------------------------------------
3802 GetConsoleWindow(VOID
)
3804 CSR_API_MESSAGE Request
;
3808 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_WINDOW
, CSR_CONSOLE
);
3809 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3810 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3812 SetLastErrorByStatus(Status
);
3816 return Request
.Data
.GetConsoleWindowRequest
.WindowHandle
;
3820 /*--------------------------------------------------------------
3827 SetConsoleIcon(HICON hicon
)
3829 CSR_API_MESSAGE Request
;
3833 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_ICON
, CSR_CONSOLE
);
3834 Request
.Data
.SetConsoleIconRequest
.WindowIcon
= hicon
;
3836 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3837 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3839 SetLastErrorByStatus(Status
);
3843 return NT_SUCCESS(Status
);
3847 /******************************************************************************
3848 * \name SetConsoleInputExeNameW
3849 * \brief Sets the console input file name from a unicode string.
3850 * \param lpInputExeName Pointer to a unicode string with the name.
3851 * \return TRUE if successful, FALSE if unsuccsedful.
3852 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
3853 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
3857 SetConsoleInputExeNameW(LPCWSTR lpInputExeName
)
3862 || (lenName
= lstrlenW(lpInputExeName
)) == 0
3863 || lenName
> INPUTEXENAME_BUFLEN
- 1)
3865 /* Fail if string is empty or too long */
3866 SetLastError(ERROR_INVALID_PARAMETER
);
3870 RtlEnterCriticalSection(&ConsoleLock
);
3873 RtlCopyMemory(InputExeName
, lpInputExeName
, lenName
* sizeof(WCHAR
));
3874 InputExeName
[lenName
] = L
'\0';
3878 RtlLeaveCriticalSection(&ConsoleLock
);
3886 /******************************************************************************
3887 * \name SetConsoleInputExeNameA
3888 * \brief Sets the console input file name from an ansi string.
3889 * \param lpInputExeName Pointer to an ansi string with the name.
3890 * \return TRUE if successful, FALSE if unsuccsedful.
3891 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
3892 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
3896 SetConsoleInputExeNameA(LPCSTR lpInputExeName
)
3898 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
3899 ANSI_STRING InputExeNameA
;
3900 UNICODE_STRING InputExeNameU
;
3904 RtlInitAnsiString(&InputExeNameA
, lpInputExeName
);
3906 if(InputExeNameA
.Length
== 0 ||
3907 InputExeNameA
.Length
> INPUTEXENAME_BUFLEN
- 1)
3909 /* Fail if string is empty or too long */
3910 SetLastError(ERROR_INVALID_PARAMETER
);
3914 InputExeNameU
.Buffer
= Buffer
;
3915 InputExeNameU
.MaximumLength
= sizeof(Buffer
);
3916 InputExeNameU
.Length
= 0;
3917 Status
= RtlAnsiStringToUnicodeString(&InputExeNameU
, &InputExeNameA
, FALSE
);
3918 if(NT_SUCCESS(Status
))
3920 Ret
= SetConsoleInputExeNameW(InputExeNameU
.Buffer
);
3924 SetLastErrorByStatus(Status
);
3932 /******************************************************************************
3933 * \name GetConsoleInputExeNameW
3934 * \brief Retrieves the console input file name as unicode string.
3935 * \param nBufferLength Length of the buffer in WCHARs.
3936 * Specify 0 to recieve the needed buffer length.
3937 * \param lpBuffer Pointer to a buffer that recieves the string.
3938 * \return Needed buffer size if \p nBufferLength is 0.
3939 * Otherwise 1 if successful, 2 if buffer is too small.
3940 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
3941 * is not big enough.
3945 GetConsoleInputExeNameW(DWORD nBufferLength
, LPWSTR lpBuffer
)
3947 int lenName
= lstrlenW(InputExeName
);
3949 if (nBufferLength
== 0)
3951 /* Buffer size is requested, return it */
3955 if(lenName
+ 1 > nBufferLength
)
3957 /* Buffer is not large enough! */
3958 SetLastError(ERROR_BUFFER_OVERFLOW
);
3962 RtlEnterCriticalSection(&ConsoleLock
);
3965 RtlCopyMemory(lpBuffer
, InputExeName
, lenName
* sizeof(WCHAR
));
3966 lpBuffer
[lenName
] = '\0';
3970 RtlLeaveCriticalSection(&ConsoleLock
);
3974 /* Success, return 1 */
3979 /******************************************************************************
3980 * \name GetConsoleInputExeNameA
3981 * \brief Retrieves the console input file name as ansi string.
3982 * \param nBufferLength Length of the buffer in CHARs.
3983 * \param lpBuffer Pointer to a buffer that recieves the string.
3984 * \return 1 if successful, 2 if buffer is too small.
3985 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
3986 * is not big enough. The buffer recieves as much characters as fit.
3990 GetConsoleInputExeNameA(DWORD nBufferLength
, LPSTR lpBuffer
)
3992 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
3994 UNICODE_STRING BufferU
;
3995 ANSI_STRING BufferA
;
3997 /* Get the unicode name */
3998 Ret
= GetConsoleInputExeNameW(sizeof(Buffer
) / sizeof(Buffer
[0]), Buffer
);
4000 /* Initialize strings for conversion */
4001 RtlInitUnicodeString(&BufferU
, Buffer
);
4003 BufferA
.MaximumLength
= nBufferLength
;
4004 BufferA
.Buffer
= lpBuffer
;
4006 /* Convert unicode name to ansi, copying as much chars as fit */
4007 RtlUnicodeStringToAnsiString(&BufferA
, &BufferU
, FALSE
);
4009 /* Error handling */
4010 if(nBufferLength
<= BufferU
.Length
/ sizeof(WCHAR
))
4012 SetLastError(ERROR_BUFFER_OVERFLOW
);
4020 /*--------------------------------------------------------------
4021 * GetConsoleHistoryInfo
4027 GetConsoleHistoryInfo(PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo
)
4029 DPRINT1("GetConsoleHistoryInfo(0x%p) UNIMPLEMENTED!\n", lpConsoleHistoryInfo
);
4030 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4035 /*--------------------------------------------------------------
4036 * SetConsoleHistoryInfo
4042 SetConsoleHistoryInfo(IN PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo
)
4044 DPRINT1("SetConsoleHistoryInfo(0x%p) UNIMPLEMENTED!\n", lpConsoleHistoryInfo
);
4045 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4050 /*--------------------------------------------------------------
4051 * GetConsoleOriginalTitleW
4057 GetConsoleOriginalTitleW(OUT LPWSTR lpConsoleTitle
,
4060 DPRINT1("GetConsoleOriginalTitleW(0x%p, 0x%x) UNIMPLEMENTED!\n", lpConsoleTitle
, nSize
);
4061 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4066 /*--------------------------------------------------------------
4067 * GetConsoleOriginalTitleA
4073 GetConsoleOriginalTitleA(OUT LPSTR lpConsoleTitle
,
4076 DPRINT1("GetConsoleOriginalTitleA(0x%p, 0x%x) UNIMPLEMENTED!\n", lpConsoleTitle
, nSize
);
4077 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4082 /*--------------------------------------------------------------
4083 * GetConsoleScreenBufferInfoEx
4089 GetConsoleScreenBufferInfoEx(IN HANDLE hConsoleOutput
,
4090 OUT PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx
)
4092 DPRINT1("GetConsoleScreenBufferInfoEx(0x%p, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput
, lpConsoleScreenBufferInfoEx
);
4093 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4098 /*--------------------------------------------------------------
4099 * SetConsoleScreenBufferInfoEx
4105 SetConsoleScreenBufferInfoEx(IN HANDLE hConsoleOutput
,
4106 IN PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx
)
4108 DPRINT1("SetConsoleScreenBufferInfoEx(0x%p, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput
, lpConsoleScreenBufferInfoEx
);
4109 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4114 /*--------------------------------------------------------------
4115 * GetCurrentConsoleFontEx
4121 GetCurrentConsoleFontEx(IN HANDLE hConsoleOutput
,
4122 IN BOOL bMaximumWindow
,
4123 OUT PCONSOLE_FONT_INFOEX lpConsoleCurrentFontEx
)
4125 DPRINT1("GetCurrentConsoleFontEx(0x%p, 0x%x, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput
, bMaximumWindow
, lpConsoleCurrentFontEx
);
4126 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);