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 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_ALIAS
, CSR_CONSOLE
);
357 ExeLength
= wcslen(lpExeName
) + 1;
358 SourceLength
= wcslen(lpSource
) + 1;
360 Size
= (ExeLength
+ SourceLength
) * sizeof(WCHAR
);
362 RequestLength
= Size
+ sizeof(CSR_API_MESSAGE
);
363 Request
= RtlAllocateHeap(GetProcessHeap(), 0, RequestLength
);
365 CaptureBuffer
= CsrAllocateCaptureBuffer(1, TargetBufferLength
);
368 RtlFreeHeap(GetProcessHeap(), 0, Request
);
372 Request
->Data
.GetConsoleAlias
.TargetBuffer
= NULL
;
374 CsrCaptureMessageBuffer(CaptureBuffer
,
377 (PVOID
*)&Request
->Data
.GetConsoleAlias
.TargetBuffer
);
379 Request
->Data
.GetConsoleAlias
.TargetBufferLength
= TargetBufferLength
;
381 Ptr
= (LPWSTR
)((ULONG_PTR
)Request
+ sizeof(CSR_API_MESSAGE
));
382 wcscpy(Ptr
, lpSource
);
384 wcscpy(Ptr
, lpExeName
);
386 Request
->Data
.GetConsoleAlias
.ExeLength
= ExeLength
;
387 Request
->Data
.GetConsoleAlias
.SourceLength
= SourceLength
;
389 Status
= CsrClientCallServer(Request
,
392 sizeof(CSR_API_MESSAGE
) + Size
);
394 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
396 RtlFreeHeap(GetProcessHeap(), 0, Request
);
397 CsrFreeCaptureBuffer(CaptureBuffer
);
398 SetLastErrorByStatus(Status
);
402 wcscpy(lpTargetBuffer
, Request
->Data
.GetConsoleAlias
.TargetBuffer
);
403 RtlFreeHeap(GetProcessHeap(), 0, Request
);
404 CsrFreeCaptureBuffer(CaptureBuffer
);
406 return Request
->Data
.GetConsoleAlias
.BytesWritten
;
415 GetConsoleAliasA(LPSTR lpSource
,
416 LPSTR lpTargetBuffer
,
417 DWORD TargetBufferLength
,
422 LPWSTR lpwTargetBuffer
;
427 DPRINT("GetConsoleAliasA entered\n");
429 if (lpTargetBuffer
== NULL
)
431 SetLastError(ERROR_INVALID_PARAMETER
);
435 dwSourceSize
= (strlen(lpSource
)+1) * sizeof(WCHAR
);
436 lpwSource
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwSourceSize
);
437 if (lpwSource
== NULL
)
439 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
442 MultiByteToWideChar(CP_ACP
, 0, lpSource
, -1, lpwSource
, dwSourceSize
);
444 dwExeNameSize
= (strlen(lpExeName
)+1) * sizeof(WCHAR
);
445 lpwExeName
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwExeNameSize
);
446 if (lpwExeName
== NULL
)
448 HeapFree(GetProcessHeap(), 0, lpwSource
);
449 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
452 MultiByteToWideChar(CP_ACP
, 0, lpExeName
, -1, lpwExeName
, dwExeNameSize
);
454 lpwTargetBuffer
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, TargetBufferLength
* sizeof(WCHAR
));
455 if (lpwTargetBuffer
== NULL
)
457 HeapFree(GetProcessHeap(), 0, lpwSource
);
458 HeapFree(GetProcessHeap(), 0, lpwExeName
);
459 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
463 dwResult
= GetConsoleAliasW(lpwSource
, lpwTargetBuffer
, TargetBufferLength
* sizeof(WCHAR
), lpwExeName
);
465 HeapFree(GetProcessHeap(), 0, lpwSource
);
466 HeapFree(GetProcessHeap(), 0, lpwExeName
);
469 dwResult
= WideCharToMultiByte(CP_ACP
, 0, lpwTargetBuffer
, dwResult
/ sizeof(WCHAR
), lpTargetBuffer
, TargetBufferLength
, NULL
, NULL
);
471 HeapFree(GetProcessHeap(), 0, lpwTargetBuffer
);
482 GetConsoleAliasExesW(LPWSTR lpExeNameBuffer
,
483 DWORD ExeNameBufferLength
)
485 CSR_API_MESSAGE Request
;
486 PCSR_CAPTURE_BUFFER CaptureBuffer
;
490 DPRINT("GetConsoleAliasExesW entered\n");
492 CaptureBuffer
= CsrAllocateCaptureBuffer(1, ExeNameBufferLength
);
495 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
499 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_ALIASES_EXES
, CSR_CONSOLE
);
500 CsrAllocateMessagePointer(CaptureBuffer
,
502 (PVOID
*)&Request
.Data
.GetConsoleAliasesExes
.ExeNames
);
503 Request
.Data
.GetConsoleAliasesExes
.Length
= ExeNameBufferLength
;
505 Status
= CsrClientCallServer(&Request
,
508 sizeof(CSR_API_MESSAGE
));
510 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
512 SetLastErrorByStatus(Status
);
513 CsrFreeCaptureBuffer(CaptureBuffer
);
517 memcpy(lpExeNameBuffer
,
518 Request
.Data
.GetConsoleAliasesExes
.ExeNames
,
519 Request
.Data
.GetConsoleAliasesExes
.BytesWritten
);
521 CsrFreeCaptureBuffer(CaptureBuffer
);
522 return Request
.Data
.GetConsoleAliasesExes
.BytesWritten
;
531 GetConsoleAliasExesA(LPSTR lpExeNameBuffer
,
532 DWORD ExeNameBufferLength
)
534 LPWSTR lpwExeNameBuffer
;
537 DPRINT("GetConsoleAliasExesA entered\n");
539 lpwExeNameBuffer
= HeapAlloc(GetProcessHeap(), 0, ExeNameBufferLength
* sizeof(WCHAR
));
541 dwResult
= GetConsoleAliasExesW(lpwExeNameBuffer
, ExeNameBufferLength
* sizeof(WCHAR
));
544 dwResult
= WideCharToMultiByte(CP_ACP
, 0, lpwExeNameBuffer
, dwResult
/ sizeof(WCHAR
), lpExeNameBuffer
, ExeNameBufferLength
, NULL
, NULL
);
546 HeapFree(GetProcessHeap(), 0, lpwExeNameBuffer
);
555 GetConsoleAliasExesLengthW(VOID
)
557 CSR_API_MESSAGE Request
;
561 DPRINT("GetConsoleAliasExesLengthW entered\n");
563 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_ALIASES_EXES_LENGTH
, CSR_CONSOLE
);
564 Request
.Data
.GetConsoleAliasesExesLength
.Length
= 0;
567 Status
= CsrClientCallServer(&Request
,
570 sizeof(CSR_API_MESSAGE
));
572 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
574 SetLastErrorByStatus(Status
);
578 return Request
.Data
.GetConsoleAliasesExesLength
.Length
;
586 GetConsoleAliasExesLengthA(VOID
)
590 DPRINT("GetConsoleAliasExesLengthA entered\n");
592 dwLength
= GetConsoleAliasExesLengthW();
595 dwLength
/= sizeof(WCHAR
);
606 GetConsoleAliasesW(LPWSTR AliasBuffer
,
607 DWORD AliasBufferLength
,
610 CSR_API_MESSAGE Request
;
615 DPRINT("GetConsoleAliasesW entered\n");
617 dwLength
= GetConsoleAliasesLengthW(ExeName
);
618 if (!dwLength
|| dwLength
> AliasBufferLength
)
621 CsrRequest
= MAKE_CSR_API(GET_ALL_CONSOLE_ALIASES
, CSR_CONSOLE
);
622 Request
.Data
.GetAllConsoleAlias
.AliasBuffer
= AliasBuffer
;
623 Request
.Data
.GetAllConsoleAlias
.AliasBufferLength
= AliasBufferLength
;
624 Request
.Data
.GetAllConsoleAlias
.lpExeName
= ExeName
;
626 Status
= CsrClientCallServer(&Request
,
629 sizeof(CSR_API_MESSAGE
));
631 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
633 SetLastErrorByStatus(Status
);
637 return Request
.Data
.GetAllConsoleAlias
.BytesWritten
/ sizeof(WCHAR
);
646 GetConsoleAliasesA(LPSTR AliasBuffer
,
647 DWORD AliasBufferLength
,
651 LPWSTR lpwExeName
= NULL
;
652 LPWSTR lpwAliasBuffer
;
654 DPRINT("GetConsoleAliasesA entered\n");
657 BasepAnsiStringToHeapUnicodeString(ExeName
, (LPWSTR
*) &lpwExeName
);
659 lpwAliasBuffer
= HeapAlloc(GetProcessHeap(), 0, AliasBufferLength
* sizeof(WCHAR
));
661 dwRetVal
= GetConsoleAliasesW(lpwAliasBuffer
, AliasBufferLength
, lpwExeName
);
664 RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR
*) lpwExeName
);
667 dwRetVal
= WideCharToMultiByte(CP_ACP
, 0, lpwAliasBuffer
, dwRetVal
, AliasBuffer
, AliasBufferLength
, NULL
, NULL
);
669 HeapFree(GetProcessHeap(), 0, lpwAliasBuffer
);
679 GetConsoleAliasesLengthW(LPWSTR lpExeName
)
681 CSR_API_MESSAGE Request
;
685 DPRINT("GetConsoleAliasesLengthW entered\n");
687 CsrRequest
= MAKE_CSR_API(GET_ALL_CONSOLE_ALIASES_LENGTH
, CSR_CONSOLE
);
688 Request
.Data
.GetAllConsoleAliasesLength
.lpExeName
= lpExeName
;
689 Request
.Data
.GetAllConsoleAliasesLength
.Length
= 0;
691 Status
= CsrClientCallServer(&Request
,
694 sizeof(CSR_API_MESSAGE
));
696 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
698 SetLastErrorByStatus(Status
);
702 return Request
.Data
.GetAllConsoleAliasesLength
.Length
;
711 GetConsoleAliasesLengthA(LPSTR lpExeName
)
714 LPWSTR lpExeNameW
= NULL
;
717 BasepAnsiStringToHeapUnicodeString(lpExeName
, (LPWSTR
*) &lpExeNameW
);
719 dwRetVal
= GetConsoleAliasesLengthW(lpExeNameW
);
721 dwRetVal
/= sizeof(WCHAR
);
725 RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR
*) lpExeNameW
);
732 * @unimplemented (Undocumented)
736 GetConsoleCommandHistoryW(DWORD Unknown0
,
740 DPRINT1("GetConsoleCommandHistoryW(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
);
741 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
747 * @unimplemented (Undocumented)
751 GetConsoleCommandHistoryA(DWORD Unknown0
,
755 DPRINT1("GetConsoleCommandHistoryA(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
);
756 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
762 * @unimplemented (Undocumented)
766 GetConsoleCommandHistoryLengthW(DWORD Unknown0
)
768 DPRINT1("GetConsoleCommandHistoryLengthW(0x%x) UNIMPLEMENTED!\n", Unknown0
);
769 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
775 * @unimplemented (Undocumented)
779 GetConsoleCommandHistoryLengthA(DWORD Unknown0
)
781 DPRINT1("GetConsoleCommandHistoryLengthA(0x%x) UNIMPLEMENTED!\n", Unknown0
);
782 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
791 GetConsoleDisplayMode(LPDWORD lpdwMode
)
793 * FUNCTION: Get the console display mode
795 * lpdwMode - Address of variable that receives the current value
797 * STATUS: Undocumented
800 DPRINT1("GetConsoleDisplayMode(0x%x) UNIMPLEMENTED!\n", lpdwMode
);
801 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
807 * @unimplemented (Undocumented)
811 GetConsoleFontInfo(DWORD Unknown0
,
816 DPRINT1("GetConsoleFontInfo(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
817 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
827 GetConsoleFontSize(HANDLE hConsoleOutput
,
830 COORD Empty
= {0, 0};
831 DPRINT1("GetConsoleFontSize(0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, nFont
);
832 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
838 * @implemented (Undocumented)
842 GetConsoleHardwareState(HANDLE hConsole
,
846 CSR_API_MESSAGE Request
;
850 CsrRequest
= MAKE_CSR_API(SETGET_CONSOLE_HW_STATE
, CSR_CONSOLE
);
851 Request
.Data
.ConsoleHardwareStateRequest
.ConsoleHandle
= hConsole
;
852 Request
.Data
.ConsoleHardwareStateRequest
.SetGet
= CONSOLE_HARDWARE_STATE_GET
;
854 Status
= CsrClientCallServer(&Request
,
857 sizeof(CSR_API_MESSAGE
));
858 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
860 SetLastErrorByStatus(Status
);
864 *State
= Request
.Data
.ConsoleHardwareStateRequest
.State
;
870 * @implemented (Undocumented)
874 GetConsoleInputWaitHandle(VOID
)
876 CSR_API_MESSAGE Request
;
880 CsrRequest
= MAKE_CSR_API(GET_INPUT_WAIT_HANDLE
, CSR_CONSOLE
);
882 Status
= CsrClientCallServer(&Request
,
885 sizeof(CSR_API_MESSAGE
));
886 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
888 SetLastErrorByStatus(Status
);
892 return Request
.Data
.GetConsoleInputWaitHandle
.InputWaitHandle
;
901 GetCurrentConsoleFont(HANDLE hConsoleOutput
,
903 PCONSOLE_FONT_INFO lpConsoleCurrentFont
)
905 DPRINT1("GetCurrentConsoleFont(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bMaximumWindow
, lpConsoleCurrentFont
);
906 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
912 * @unimplemented (Undocumented)
916 GetNumberOfConsoleFonts(VOID
)
918 DPRINT1("GetNumberOfConsoleFonts() UNIMPLEMENTED!\n");
919 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
920 return 1; /* FIXME: call csrss.exe */
925 * @unimplemented (Undocumented)
929 InvalidateConsoleDIBits(DWORD Unknown0
,
932 DPRINT1("InvalidateConsoleDIBits(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
933 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
939 * @unimplemented (Undocumented)
943 OpenConsoleW(LPCWSTR wsName
,
944 DWORD dwDesiredAccess
,
948 CSR_API_MESSAGE Request
;
950 NTSTATUS Status
= STATUS_SUCCESS
;
952 if (0 == _wcsicmp(wsName
, L
"CONIN$"))
954 CsrRequest
= MAKE_CSR_API(GET_INPUT_HANDLE
, CSR_NATIVE
);
956 else if (0 == _wcsicmp(wsName
, L
"CONOUT$"))
958 CsrRequest
= MAKE_CSR_API(GET_OUTPUT_HANDLE
, CSR_NATIVE
);
962 SetLastError(ERROR_INVALID_PARAMETER
);
963 return(INVALID_HANDLE_VALUE
);
966 if (dwDesiredAccess
& ~(GENERIC_READ
|GENERIC_WRITE
))
968 SetLastError(ERROR_INVALID_PARAMETER
);
969 return(INVALID_HANDLE_VALUE
);
972 if (dwShareMode
& ~(FILE_SHARE_READ
|FILE_SHARE_WRITE
))
974 SetLastError(ERROR_INVALID_PARAMETER
);
975 return(INVALID_HANDLE_VALUE
);
978 /* Structures for GET_INPUT_HANDLE and GET_OUTPUT_HANDLE requests are identical */
979 Request
.Data
.GetInputHandleRequest
.Access
= dwDesiredAccess
;
980 Request
.Data
.GetInputHandleRequest
.Inheritable
= bInheritHandle
;
982 Status
= CsrClientCallServer(&Request
,
985 sizeof(CSR_API_MESSAGE
));
986 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
988 SetLastErrorByStatus(Status
);
989 return INVALID_HANDLE_VALUE
;
992 return Request
.Data
.GetInputHandleRequest
.InputHandle
;
997 * @unimplemented (Undocumented)
1001 SetConsoleCommandHistoryMode(DWORD dwMode
)
1003 DPRINT1("SetConsoleCommandHistoryMode(0x%x) UNIMPLEMENTED!\n", dwMode
);
1004 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1010 * @unimplemented (Undocumented)
1014 SetConsoleCursor(DWORD Unknown0
,
1017 DPRINT1("SetConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1018 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1028 SetConsoleDisplayMode(HANDLE hOut
,
1032 * FUNCTION: Set the console display mode.
1034 * hOut - Standard output handle.
1035 * dwNewMode - New mode.
1036 * lpdwOldMode - Address of a variable that receives the old mode.
1039 DPRINT1("SetConsoleDisplayMode(0x%x, 0x%x, 0x%p) UNIMPLEMENTED!\n", hOut
, dwNewMode
, lpdwOldMode
);
1040 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1046 * @unimplemented (Undocumented)
1050 SetConsoleFont(DWORD Unknown0
,
1053 DPRINT1("SetConsoleFont(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1054 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1060 * @implemented (Undocumented)
1064 SetConsoleHardwareState(HANDLE hConsole
,
1068 CSR_API_MESSAGE Request
;
1072 CsrRequest
= MAKE_CSR_API(SETGET_CONSOLE_HW_STATE
, CSR_CONSOLE
);
1073 Request
.Data
.ConsoleHardwareStateRequest
.ConsoleHandle
= hConsole
;
1074 Request
.Data
.ConsoleHardwareStateRequest
.SetGet
= CONSOLE_HARDWARE_STATE_SET
;
1075 Request
.Data
.ConsoleHardwareStateRequest
.State
= State
;
1077 Status
= CsrClientCallServer(&Request
,
1080 sizeof(CSR_API_MESSAGE
));
1081 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1083 SetLastErrorByStatus(Status
);
1092 * @unimplemented (Undocumented)
1096 SetConsoleKeyShortcuts(DWORD Unknown0
,
1101 DPRINT1("SetConsoleKeyShortcuts(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
1102 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1108 * @unimplemented (Undocumented)
1112 SetConsoleMaximumWindowSize(DWORD Unknown0
,
1115 DPRINT1("SetConsoleMaximumWindowSize(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1116 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1122 * @unimplemented (Undocumented)
1126 SetConsoleMenuClose(DWORD Unknown0
)
1128 DPRINT1("SetConsoleMenuClose(0x%x) UNIMPLEMENTED!\n", Unknown0
);
1129 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1135 * @unimplemented (Undocumented)
1139 SetConsoleNumberOfCommandsA(DWORD Unknown0
,
1142 DPRINT1("SetConsoleNumberOfCommandsA(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1143 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1149 * @unimplemented (Undocumented)
1153 SetConsoleNumberOfCommandsW(DWORD Unknown0
,
1156 DPRINT1("SetConsoleNumberOfCommandsW(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1157 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1163 * @unimplemented (Undocumented)
1167 SetConsolePalette(DWORD Unknown0
,
1171 DPRINT1("SetConsolePalette(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
);
1172 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1178 * @unimplemented (Undocumented)
1182 SetLastConsoleEventActive(VOID
)
1184 DPRINT1("SetLastConsoleEventActive() UNIMPLEMENTED!\n");
1185 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1191 * @unimplemented (Undocumented)
1195 ShowConsoleCursor(DWORD Unknown0
,
1198 DPRINT1("ShowConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
1199 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1205 * FUNCTION: Checks whether the given handle is a valid console handle.
1207 * Handle - Handle to be checked
1209 * TRUE: Handle is a valid console handle
1210 * FALSE: Handle is not a valid console handle.
1211 * STATUS: Officially undocumented
1217 VerifyConsoleIoHandle(HANDLE Handle
)
1219 CSR_API_MESSAGE Request
;
1223 CsrRequest
= MAKE_CSR_API(VERIFY_HANDLE
, CSR_NATIVE
);
1224 Request
.Data
.VerifyHandleRequest
.Handle
= Handle
;
1226 Status
= CsrClientCallServer(&Request
,
1229 sizeof(CSR_API_MESSAGE
));
1230 if (!NT_SUCCESS(Status
))
1232 SetLastErrorByStatus(Status
);
1236 return (BOOL
)NT_SUCCESS(Request
.Status
);
1245 WriteConsoleInputVDMA(DWORD Unknown0
,
1250 DPRINT1("WriteConsoleInputVDMA(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
1251 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1261 WriteConsoleInputVDMW(DWORD Unknown0
,
1266 DPRINT1("WriteConsoleInputVDMW(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
1267 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1273 * @implemented (Undocumented)
1277 CloseConsoleHandle(HANDLE Handle
)
1279 CSR_API_MESSAGE Request
;
1283 CsrRequest
= MAKE_CSR_API(CLOSE_HANDLE
, CSR_NATIVE
);
1284 Request
.Data
.CloseHandleRequest
.Handle
= Handle
;
1286 Status
= CsrClientCallServer(&Request
,
1289 sizeof(CSR_API_MESSAGE
));
1290 if (!NT_SUCCESS(Status
))
1292 SetLastErrorByStatus(Status
);
1304 GetStdHandle(DWORD nStdHandle
)
1306 * FUNCTION: Get a handle for the standard input, standard output
1307 * and a standard error device.
1309 * nStdHandle - Specifies the device for which to return the handle.
1310 * RETURNS: If the function succeeds, the return value is the handle
1311 * of the specified device. Otherwise the value is INVALID_HANDLE_VALUE.
1314 PRTL_USER_PROCESS_PARAMETERS Ppb
;
1316 Ppb
= NtCurrentPeb()->ProcessParameters
;
1319 case STD_INPUT_HANDLE
:
1320 return Ppb
->StandardInput
;
1322 case STD_OUTPUT_HANDLE
:
1323 return Ppb
->StandardOutput
;
1325 case STD_ERROR_HANDLE
:
1326 return Ppb
->StandardError
;
1329 SetLastError (ERROR_INVALID_PARAMETER
);
1330 return INVALID_HANDLE_VALUE
;
1339 SetStdHandle(DWORD nStdHandle
,
1342 * FUNCTION: Set the handle for the standard input, standard output or
1343 * the standard error device.
1345 * nStdHandle - Specifies the handle to be set.
1346 * hHandle - The handle to set.
1347 * RETURNS: TRUE if the function succeeds, FALSE otherwise.
1350 PRTL_USER_PROCESS_PARAMETERS Ppb
;
1352 /* no need to check if hHandle == INVALID_HANDLE_VALUE */
1354 Ppb
= NtCurrentPeb()->ProcessParameters
;
1358 case STD_INPUT_HANDLE
:
1359 Ppb
->StandardInput
= hHandle
;
1362 case STD_OUTPUT_HANDLE
:
1363 Ppb
->StandardOutput
= hHandle
;
1366 case STD_ERROR_HANDLE
:
1367 Ppb
->StandardError
= hHandle
;
1371 /* windows for whatever reason sets the last error to ERROR_INVALID_HANDLE here */
1372 SetLastError(ERROR_INVALID_HANDLE
);
1379 IntWriteConsole(HANDLE hConsoleOutput
,
1381 DWORD nNumberOfCharsToWrite
,
1382 LPDWORD lpNumberOfCharsWritten
,
1386 PCSR_API_MESSAGE Request
;
1390 ULONG SizeBytes
, CharSize
;
1393 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
1394 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
1396 max(sizeof(CSR_API_MESSAGE
),
1397 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE
) + min(nNumberOfCharsToWrite
,
1398 CSRSS_MAX_WRITE_CONSOLE
/ CharSize
) * CharSize
));
1399 if (Request
== NULL
)
1401 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1405 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE
, CSR_CONSOLE
);
1407 while (nNumberOfCharsToWrite
> 0)
1409 Request
->Data
.WriteConsoleRequest
.ConsoleHandle
= hConsoleOutput
;
1410 Request
->Data
.WriteConsoleRequest
.Unicode
= bUnicode
;
1412 nChars
= (USHORT
)min(nNumberOfCharsToWrite
, CSRSS_MAX_WRITE_CONSOLE
/ CharSize
);
1413 Request
->Data
.WriteConsoleRequest
.NrCharactersToWrite
= nChars
;
1415 SizeBytes
= nChars
* CharSize
;
1417 memcpy(Request
->Data
.WriteConsoleRequest
.Buffer
, lpBuffer
, SizeBytes
);
1419 Status
= CsrClientCallServer(Request
,
1422 max(sizeof(CSR_API_MESSAGE
),
1423 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE
) + SizeBytes
));
1425 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
1427 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1428 SetLastErrorByStatus(Status
);
1432 nNumberOfCharsToWrite
-= nChars
;
1433 lpBuffer
= (PVOID
)((ULONG_PTR
)lpBuffer
+ (ULONG_PTR
)SizeBytes
);
1434 Written
+= Request
->Data
.WriteConsoleRequest
.NrCharactersWritten
;
1437 if (lpNumberOfCharsWritten
!= NULL
)
1439 *lpNumberOfCharsWritten
= Written
;
1441 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1447 /*--------------------------------------------------------------
1454 WriteConsoleA(HANDLE hConsoleOutput
,
1455 CONST VOID
*lpBuffer
,
1456 DWORD nNumberOfCharsToWrite
,
1457 LPDWORD lpNumberOfCharsWritten
,
1460 return IntWriteConsole(hConsoleOutput
,
1462 nNumberOfCharsToWrite
,
1463 lpNumberOfCharsWritten
,
1469 /*--------------------------------------------------------------
1476 WriteConsoleW(HANDLE hConsoleOutput
,
1477 CONST VOID
*lpBuffer
,
1478 DWORD nNumberOfCharsToWrite
,
1479 LPDWORD lpNumberOfCharsWritten
,
1482 return IntWriteConsole(hConsoleOutput
,
1484 nNumberOfCharsToWrite
,
1485 lpNumberOfCharsWritten
,
1493 IntReadConsole(HANDLE hConsoleInput
,
1495 DWORD nNumberOfCharsToRead
,
1496 LPDWORD lpNumberOfCharsRead
,
1497 PCONSOLE_READCONSOLE_CONTROL lpReserved
,
1500 PCSR_API_MESSAGE Request
;
1503 ULONG CharSize
, CharsRead
= 0;
1505 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
1506 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
1508 max(sizeof(CSR_API_MESSAGE
),
1509 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE
) + min(nNumberOfCharsToRead
,
1510 CSRSS_MAX_READ_CONSOLE
/ CharSize
) * CharSize
));
1511 if (Request
== NULL
)
1513 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1517 Request
->Status
= STATUS_SUCCESS
;
1518 CsrRequest
= MAKE_CSR_API(READ_CONSOLE
, CSR_CONSOLE
);
1522 if (Request
->Status
== STATUS_PENDING
)
1524 Status
= NtWaitForSingleObject(Request
->Data
.ReadConsoleRequest
.EventHandle
,
1527 if (!NT_SUCCESS(Status
))
1529 DPRINT1("Wait for console input failed!\n");
1534 Request
->Data
.ReadConsoleRequest
.ConsoleHandle
= hConsoleInput
;
1535 Request
->Data
.ReadConsoleRequest
.Unicode
= bUnicode
;
1536 Request
->Data
.ReadConsoleRequest
.NrCharactersToRead
= (WORD
)min(nNumberOfCharsToRead
, CSRSS_MAX_READ_CONSOLE
/ CharSize
);
1537 Request
->Data
.ReadConsoleRequest
.nCharsCanBeDeleted
= (WORD
)CharsRead
;
1539 Status
= CsrClientCallServer(Request
,
1542 max(sizeof(CSR_API_MESSAGE
),
1543 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE
)
1544 + Request
->Data
.ReadConsoleRequest
.NrCharactersToRead
* CharSize
));
1546 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
1548 DPRINT1("CSR returned error in ReadConsole\n");
1549 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1550 SetLastErrorByStatus(Status
);
1554 nNumberOfCharsToRead
-= Request
->Data
.ReadConsoleRequest
.NrCharactersRead
;
1555 memcpy((PVOID
)((ULONG_PTR
)lpBuffer
+ (ULONG_PTR
)(CharsRead
* CharSize
)),
1556 Request
->Data
.ReadConsoleRequest
.Buffer
,
1557 Request
->Data
.ReadConsoleRequest
.NrCharactersRead
* CharSize
);
1558 CharsRead
+= Request
->Data
.ReadConsoleRequest
.NrCharactersRead
;
1560 if (Request
->Status
== STATUS_NOTIFY_CLEANUP
)
1565 nNumberOfCharsToRead
++;
1567 Request
->Status
= STATUS_PENDING
;
1570 while (Request
->Status
== STATUS_PENDING
&& nNumberOfCharsToRead
> 0);
1572 if (lpNumberOfCharsRead
!= NULL
)
1574 *lpNumberOfCharsRead
= CharsRead
;
1577 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1583 /*--------------------------------------------------------------
1590 ReadConsoleA(HANDLE hConsoleInput
,
1592 DWORD nNumberOfCharsToRead
,
1593 LPDWORD lpNumberOfCharsRead
,
1594 PCONSOLE_READCONSOLE_CONTROL pInputControl
)
1596 return IntReadConsole(hConsoleInput
,
1598 nNumberOfCharsToRead
,
1599 lpNumberOfCharsRead
,
1605 /*--------------------------------------------------------------
1612 ReadConsoleW(HANDLE hConsoleInput
,
1614 DWORD nNumberOfCharsToRead
,
1615 LPDWORD lpNumberOfCharsRead
,
1616 PCONSOLE_READCONSOLE_CONTROL pInputControl
)
1618 return IntReadConsole(hConsoleInput
,
1620 nNumberOfCharsToRead
,
1621 lpNumberOfCharsRead
,
1627 /*--------------------------------------------------------------
1636 CSR_API_MESSAGE Request
;
1641 if (NtCurrentPeb()->ProcessParameters
->ConsoleHandle
)
1643 DPRINT("AllocConsole: Allocate duplicate console to the same Process\n");
1644 SetLastErrorByStatus (STATUS_OBJECT_NAME_EXISTS
);
1648 Request
.Data
.AllocConsoleRequest
.CtrlDispatcher
= ConsoleControlDispatcher
;
1649 Request
.Data
.AllocConsoleRequest
.ConsoleNeeded
= TRUE
;
1651 CsrRequest
= MAKE_CSR_API(ALLOC_CONSOLE
, CSR_CONSOLE
);
1653 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
1654 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1656 SetLastErrorByStatus(Status
);
1660 NtCurrentPeb()->ProcessParameters
->ConsoleHandle
= Request
.Data
.AllocConsoleRequest
.Console
;
1662 SetStdHandle(STD_INPUT_HANDLE
, Request
.Data
.AllocConsoleRequest
.InputHandle
);
1663 SetStdHandle(STD_OUTPUT_HANDLE
, Request
.Data
.AllocConsoleRequest
.OutputHandle
);
1665 hStdError
= DuplicateConsoleHandle(Request
.Data
.AllocConsoleRequest
.OutputHandle
,
1668 DUPLICATE_SAME_ACCESS
);
1670 SetStdHandle(STD_ERROR_HANDLE
, hStdError
);
1675 /*--------------------------------------------------------------
1684 // AG: I'm not sure if this is correct (what happens to std handles?)
1685 // but I just tried to reverse what AllocConsole() does...
1687 CSR_API_MESSAGE Request
;
1691 CsrRequest
= MAKE_CSR_API(FREE_CONSOLE
, CSR_CONSOLE
);
1693 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
1694 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1696 SetLastErrorByStatus(Status
);
1700 NtCurrentPeb()->ProcessParameters
->ConsoleHandle
= NULL
;
1705 /*--------------------------------------------------------------
1706 * GetConsoleScreenBufferInfo
1712 GetConsoleScreenBufferInfo(HANDLE hConsoleOutput
,
1713 PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
)
1715 CSR_API_MESSAGE Request
;
1719 CsrRequest
= MAKE_CSR_API(SCREEN_BUFFER_INFO
, CSR_CONSOLE
);
1720 Request
.Data
.ScreenBufferInfoRequest
.ConsoleHandle
= hConsoleOutput
;
1722 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
1723 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1725 SetLastErrorByStatus(Status
);
1728 *lpConsoleScreenBufferInfo
= Request
.Data
.ScreenBufferInfoRequest
.Info
;
1733 /*--------------------------------------------------------------
1734 * SetConsoleCursorPosition
1740 SetConsoleCursorPosition(HANDLE hConsoleOutput
,
1741 COORD dwCursorPosition
)
1743 CSR_API_MESSAGE Request
;
1747 CsrRequest
= MAKE_CSR_API(SET_CURSOR
, CSR_CONSOLE
);
1748 Request
.Data
.SetCursorRequest
.ConsoleHandle
= hConsoleOutput
;
1749 Request
.Data
.SetCursorRequest
.Position
= dwCursorPosition
;
1751 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
1752 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1754 SetLastErrorByStatus(Status
);
1764 IntFillConsoleOutputCharacter(HANDLE hConsoleOutput
,
1768 LPDWORD lpNumberOfCharsWritten
,
1771 CSR_API_MESSAGE Request
;
1775 CsrRequest
= MAKE_CSR_API(FILL_OUTPUT
, CSR_CONSOLE
);
1776 Request
.Data
.FillOutputRequest
.ConsoleHandle
= hConsoleOutput
;
1777 Request
.Data
.FillOutputRequest
.Unicode
= bUnicode
;
1780 Request
.Data
.FillOutputRequest
.Char
.UnicodeChar
= *((WCHAR
*)cCharacter
);
1782 Request
.Data
.FillOutputRequest
.Char
.AsciiChar
= *((CHAR
*)cCharacter
);
1784 Request
.Data
.FillOutputRequest
.Position
= dwWriteCoord
;
1785 Request
.Data
.FillOutputRequest
.Length
= (WORD
)nLength
;
1787 Status
= CsrClientCallServer(&Request
,
1790 sizeof(CSR_API_MESSAGE
));
1792 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1794 SetLastErrorByStatus(Status
);
1798 if(lpNumberOfCharsWritten
!= NULL
)
1800 *lpNumberOfCharsWritten
= Request
.Data
.FillOutputRequest
.NrCharactersWritten
;
1806 /*--------------------------------------------------------------
1807 * FillConsoleOutputCharacterA
1813 FillConsoleOutputCharacterA(HANDLE hConsoleOutput
,
1817 LPDWORD lpNumberOfCharsWritten
)
1819 return IntFillConsoleOutputCharacter(hConsoleOutput
,
1823 lpNumberOfCharsWritten
,
1828 /*--------------------------------------------------------------
1829 * FillConsoleOutputCharacterW
1835 FillConsoleOutputCharacterW(HANDLE hConsoleOutput
,
1839 LPDWORD lpNumberOfCharsWritten
)
1841 return IntFillConsoleOutputCharacter(hConsoleOutput
,
1845 lpNumberOfCharsWritten
,
1852 IntPeekConsoleInput(HANDLE hConsoleInput
,
1853 PINPUT_RECORD lpBuffer
,
1855 LPDWORD lpNumberOfEventsRead
,
1858 CSR_API_MESSAGE Request
;
1860 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1864 if (lpBuffer
== NULL
)
1866 SetLastError(ERROR_INVALID_PARAMETER
);
1870 Size
= nLength
* sizeof(INPUT_RECORD
);
1872 /* Allocate a Capture Buffer */
1873 DPRINT("IntPeekConsoleInput: %lx %p\n", Size
, lpNumberOfEventsRead
);
1874 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
1876 /* Allocate space in the Buffer */
1877 CsrCaptureMessageBuffer(CaptureBuffer
,
1880 (PVOID
*)&Request
.Data
.PeekConsoleInputRequest
.InputRecord
);
1882 /* Set up the data to send to the Console Server */
1883 CsrRequest
= MAKE_CSR_API(PEEK_CONSOLE_INPUT
, CSR_CONSOLE
);
1884 Request
.Data
.PeekConsoleInputRequest
.ConsoleHandle
= hConsoleInput
;
1885 Request
.Data
.PeekConsoleInputRequest
.Unicode
= bUnicode
;
1886 Request
.Data
.PeekConsoleInputRequest
.Length
= nLength
;
1888 /* Call the server */
1889 Status
= CsrClientCallServer(&Request
,
1892 sizeof(CSR_API_MESSAGE
));
1893 DPRINT("Server returned: %x\n", Request
.Status
);
1895 /* Check for success*/
1896 if (NT_SUCCESS(Request
.Status
))
1898 /* Return the number of events read */
1899 DPRINT("Events read: %lx\n", Request
.Data
.PeekConsoleInputRequest
.Length
);
1900 *lpNumberOfEventsRead
= Request
.Data
.PeekConsoleInputRequest
.Length
;
1902 /* Copy into the buffer */
1903 DPRINT("Copying to buffer\n");
1904 RtlCopyMemory(lpBuffer
,
1905 Request
.Data
.PeekConsoleInputRequest
.InputRecord
,
1906 sizeof(INPUT_RECORD
) * *lpNumberOfEventsRead
);
1911 *lpNumberOfEventsRead
= 0;
1912 SetLastErrorByStatus(Request
.Status
);
1915 /* Release the capture buffer */
1916 CsrFreeCaptureBuffer(CaptureBuffer
);
1918 /* Return TRUE or FALSE */
1919 return NT_SUCCESS(Request
.Status
);
1922 /*--------------------------------------------------------------
1929 PeekConsoleInputA(HANDLE hConsoleInput
,
1930 PINPUT_RECORD lpBuffer
,
1932 LPDWORD lpNumberOfEventsRead
)
1934 return IntPeekConsoleInput(hConsoleInput
,
1937 lpNumberOfEventsRead
,
1942 /*--------------------------------------------------------------
1949 PeekConsoleInputW(HANDLE hConsoleInput
,
1950 PINPUT_RECORD lpBuffer
,
1952 LPDWORD lpNumberOfEventsRead
)
1954 return IntPeekConsoleInput(hConsoleInput
,
1956 lpNumberOfEventsRead
,
1963 IntReadConsoleInput(HANDLE hConsoleInput
,
1964 PINPUT_RECORD lpBuffer
,
1966 LPDWORD lpNumberOfEventsRead
,
1969 CSR_API_MESSAGE Request
;
1974 CsrRequest
= MAKE_CSR_API(READ_INPUT
, CSR_CONSOLE
);
1979 Request
.Data
.ReadInputRequest
.ConsoleHandle
= hConsoleInput
;
1980 Request
.Data
.ReadInputRequest
.Unicode
= bUnicode
;
1982 Status
= CsrClientCallServer(&Request
,
1985 sizeof(CSR_API_MESSAGE
));
1986 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1990 /* we couldn't read a single record, fail */
1991 SetLastErrorByStatus(Status
);
1996 /* FIXME - fail gracefully in case we already read at least one record? */
2000 else if (Status
== STATUS_PENDING
)
2004 Status
= NtWaitForSingleObject(Request
.Data
.ReadInputRequest
.Event
, FALSE
, 0);
2005 if (!NT_SUCCESS(Status
))
2007 SetLastErrorByStatus(Status
);
2013 /* nothing more to read (waiting for more input??), let's just bail */
2019 lpBuffer
[Read
++] = Request
.Data
.ReadInputRequest
.Input
;
2022 if (!Request
.Data
.ReadInputRequest
.MoreEvents
)
2024 /* nothing more to read, bail */
2030 if (lpNumberOfEventsRead
!= NULL
)
2032 *lpNumberOfEventsRead
= Read
;
2039 /*--------------------------------------------------------------
2046 ReadConsoleInputA(HANDLE hConsoleInput
,
2047 PINPUT_RECORD lpBuffer
,
2049 LPDWORD lpNumberOfEventsRead
)
2051 return IntReadConsoleInput(hConsoleInput
,
2054 lpNumberOfEventsRead
,
2059 /*--------------------------------------------------------------
2066 ReadConsoleInputW(HANDLE hConsoleInput
,
2067 PINPUT_RECORD lpBuffer
,
2069 LPDWORD lpNumberOfEventsRead
)
2071 return IntReadConsoleInput(hConsoleInput
,
2074 lpNumberOfEventsRead
,
2081 IntWriteConsoleInput(HANDLE hConsoleInput
,
2082 PINPUT_RECORD lpBuffer
,
2084 LPDWORD lpNumberOfEventsWritten
,
2087 CSR_API_MESSAGE Request
;
2089 PCSR_CAPTURE_BUFFER CaptureBuffer
;
2093 if (lpBuffer
== NULL
)
2095 SetLastError(ERROR_INVALID_PARAMETER
);
2099 Size
= nLength
* sizeof(INPUT_RECORD
);
2101 /* Allocate a Capture Buffer */
2102 DPRINT("IntWriteConsoleInput: %lx %p\n", Size
, lpNumberOfEventsWritten
);
2103 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
2105 /* Allocate space in the Buffer */
2106 CsrCaptureMessageBuffer(CaptureBuffer
,
2109 (PVOID
*)&Request
.Data
.WriteConsoleInputRequest
.InputRecord
);
2111 /* Set up the data to send to the Console Server */
2112 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_INPUT
, CSR_CONSOLE
);
2113 Request
.Data
.WriteConsoleInputRequest
.ConsoleHandle
= hConsoleInput
;
2114 Request
.Data
.WriteConsoleInputRequest
.Unicode
= bUnicode
;
2115 Request
.Data
.WriteConsoleInputRequest
.Length
= nLength
;
2117 /* Call the server */
2118 Status
= CsrClientCallServer(&Request
,
2121 sizeof(CSR_API_MESSAGE
));
2122 DPRINT("Server returned: %x\n", Request
.Status
);
2124 /* Check for success*/
2125 if (NT_SUCCESS(Request
.Status
))
2127 /* Return the number of events read */
2128 DPRINT("Events read: %lx\n", Request
.Data
.WriteConsoleInputRequest
.Length
);
2129 *lpNumberOfEventsWritten
= Request
.Data
.WriteConsoleInputRequest
.Length
;
2134 *lpNumberOfEventsWritten
= 0;
2135 SetLastErrorByStatus(Request
.Status
);
2138 /* Release the capture buffer */
2139 CsrFreeCaptureBuffer(CaptureBuffer
);
2141 /* Return TRUE or FALSE */
2142 return NT_SUCCESS(Request
.Status
);
2146 /*--------------------------------------------------------------
2147 * WriteConsoleInputA
2153 WriteConsoleInputA(HANDLE hConsoleInput
,
2154 CONST INPUT_RECORD
*lpBuffer
,
2156 LPDWORD lpNumberOfEventsWritten
)
2158 return IntWriteConsoleInput(hConsoleInput
,
2159 (PINPUT_RECORD
)lpBuffer
,
2161 lpNumberOfEventsWritten
,
2166 /*--------------------------------------------------------------
2167 * WriteConsoleInputW
2173 WriteConsoleInputW(HANDLE hConsoleInput
,
2174 CONST INPUT_RECORD
*lpBuffer
,
2176 LPDWORD lpNumberOfEventsWritten
)
2178 return IntWriteConsoleInput(hConsoleInput
,
2179 (PINPUT_RECORD
)lpBuffer
,
2181 lpNumberOfEventsWritten
,
2188 IntReadConsoleOutput(HANDLE hConsoleOutput
,
2189 PCHAR_INFO lpBuffer
,
2191 COORD dwBufferCoord
,
2192 PSMALL_RECT lpReadRegion
,
2195 CSR_API_MESSAGE Request
;
2197 PCSR_CAPTURE_BUFFER CaptureBuffer
;
2199 DWORD Size
, SizeX
, SizeY
;
2201 if (lpBuffer
== NULL
)
2203 SetLastError(ERROR_INVALID_PARAMETER
);
2207 Size
= dwBufferSize
.X
* dwBufferSize
.Y
* sizeof(CHAR_INFO
);
2209 /* Allocate a Capture Buffer */
2210 DPRINT("IntReadConsoleOutput: %lx %p\n", Size
, lpReadRegion
);
2211 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
2213 /* Allocate space in the Buffer */
2214 CsrCaptureMessageBuffer(CaptureBuffer
,
2217 (PVOID
*)&Request
.Data
.ReadConsoleOutputRequest
.CharInfo
);
2219 /* Set up the data to send to the Console Server */
2220 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT
, CSR_CONSOLE
);
2221 Request
.Data
.ReadConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
2222 Request
.Data
.ReadConsoleOutputRequest
.Unicode
= bUnicode
;
2223 Request
.Data
.ReadConsoleOutputRequest
.BufferSize
= dwBufferSize
;
2224 Request
.Data
.ReadConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
2225 Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
= *lpReadRegion
;
2227 /* Call the server */
2228 Status
= CsrClientCallServer(&Request
,
2231 sizeof(CSR_API_MESSAGE
));
2232 DPRINT("Server returned: %x\n", Request
.Status
);
2234 /* Check for success*/
2235 if (NT_SUCCESS(Request
.Status
))
2237 /* Copy into the buffer */
2238 DPRINT("Copying to buffer\n");
2239 SizeX
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Right
-
2240 Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Left
+ 1;
2241 SizeY
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Bottom
-
2242 Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Top
+ 1;
2243 RtlCopyMemory(lpBuffer
,
2244 Request
.Data
.ReadConsoleOutputRequest
.CharInfo
,
2245 sizeof(CHAR_INFO
) * SizeX
* SizeY
);
2250 SetLastErrorByStatus(Request
.Status
);
2253 /* Return the read region */
2254 DPRINT("read region: %lx\n", Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
);
2255 *lpReadRegion
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
;
2257 /* Release the capture buffer */
2258 CsrFreeCaptureBuffer(CaptureBuffer
);
2260 /* Return TRUE or FALSE */
2261 return NT_SUCCESS(Request
.Status
);
2264 /*--------------------------------------------------------------
2265 * ReadConsoleOutputA
2271 ReadConsoleOutputA(HANDLE hConsoleOutput
,
2272 PCHAR_INFO lpBuffer
,
2274 COORD dwBufferCoord
,
2275 PSMALL_RECT lpReadRegion
)
2277 return IntReadConsoleOutput(hConsoleOutput
,
2286 /*--------------------------------------------------------------
2287 * ReadConsoleOutputW
2293 ReadConsoleOutputW(HANDLE hConsoleOutput
,
2294 PCHAR_INFO lpBuffer
,
2296 COORD dwBufferCoord
,
2297 PSMALL_RECT lpReadRegion
)
2299 return IntReadConsoleOutput(hConsoleOutput
,
2310 IntWriteConsoleOutput(HANDLE hConsoleOutput
,
2311 CONST CHAR_INFO
*lpBuffer
,
2313 COORD dwBufferCoord
,
2314 PSMALL_RECT lpWriteRegion
,
2317 CSR_API_MESSAGE Request
;
2319 PCSR_CAPTURE_BUFFER CaptureBuffer
;
2323 Size
= dwBufferSize
.Y
* dwBufferSize
.X
* sizeof(CHAR_INFO
);
2325 /* Allocate a Capture Buffer */
2326 DPRINT("IntWriteConsoleOutput: %lx %p\n", Size
, lpWriteRegion
);
2327 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
2329 /* Allocate space in the Buffer */
2330 CsrCaptureMessageBuffer(CaptureBuffer
,
2333 (PVOID
*)&Request
.Data
.WriteConsoleOutputRequest
.CharInfo
);
2335 /* Copy from the buffer */
2336 RtlCopyMemory(Request
.Data
.WriteConsoleOutputRequest
.CharInfo
, lpBuffer
, Size
);
2338 /* Set up the data to send to the Console Server */
2339 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT
, CSR_CONSOLE
);
2340 Request
.Data
.WriteConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
2341 Request
.Data
.WriteConsoleOutputRequest
.Unicode
= bUnicode
;
2342 Request
.Data
.WriteConsoleOutputRequest
.BufferSize
= dwBufferSize
;
2343 Request
.Data
.WriteConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
2344 Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
= *lpWriteRegion
;
2346 /* Call the server */
2347 Status
= CsrClientCallServer(&Request
,
2350 sizeof(CSR_API_MESSAGE
));
2351 DPRINT("Server returned: %x\n", Request
.Status
);
2353 /* Check for success*/
2354 if (!NT_SUCCESS(Request
.Status
))
2357 SetLastErrorByStatus(Request
.Status
);
2360 /* Return the read region */
2361 DPRINT("read region: %lx\n", Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
);
2362 *lpWriteRegion
= Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
;
2364 /* Release the capture buffer */
2365 CsrFreeCaptureBuffer(CaptureBuffer
);
2367 /* Return TRUE or FALSE */
2368 return NT_SUCCESS(Request
.Status
);
2371 /*--------------------------------------------------------------
2372 * WriteConsoleOutputA
2378 WriteConsoleOutputA(HANDLE hConsoleOutput
,
2379 CONST CHAR_INFO
*lpBuffer
,
2381 COORD dwBufferCoord
,
2382 PSMALL_RECT lpWriteRegion
)
2384 return IntWriteConsoleOutput(hConsoleOutput
,
2393 /*--------------------------------------------------------------
2394 * WriteConsoleOutputW
2400 WriteConsoleOutputW(HANDLE hConsoleOutput
,
2401 CONST CHAR_INFO
*lpBuffer
,
2403 COORD dwBufferCoord
,
2404 PSMALL_RECT lpWriteRegion
)
2406 return IntWriteConsoleOutput(hConsoleOutput
,
2417 IntReadConsoleOutputCharacter(HANDLE hConsoleOutput
,
2421 LPDWORD lpNumberOfCharsRead
,
2424 PCSR_API_MESSAGE Request
;
2427 ULONG nChars
, SizeBytes
, CharSize
;
2428 DWORD CharsRead
= 0;
2430 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
2432 nChars
= min(nLength
, CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR
) / CharSize
;
2433 SizeBytes
= nChars
* CharSize
;
2435 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
2436 max(sizeof(CSR_API_MESSAGE
),
2437 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR
)
2438 + min (nChars
, CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR
/ CharSize
) * CharSize
));
2439 if (Request
== NULL
)
2441 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2445 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT_CHAR
, CSR_CONSOLE
);
2446 Request
->Data
.ReadConsoleOutputCharRequest
.ReadCoord
= dwReadCoord
;
2452 Request
->Data
.ReadConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
2453 Request
->Data
.ReadConsoleOutputCharRequest
.Unicode
= bUnicode
;
2454 Request
->Data
.ReadConsoleOutputCharRequest
.NumCharsToRead
= min(nLength
, nChars
);
2455 SizeBytes
= Request
->Data
.ReadConsoleOutputCharRequest
.NumCharsToRead
* CharSize
;
2457 Status
= CsrClientCallServer(Request
,
2460 max(sizeof(CSR_API_MESSAGE
),
2461 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR
) + SizeBytes
));
2462 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Request
->Status
))
2464 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2465 SetLastErrorByStatus(Status
);
2469 BytesRead
= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
* CharSize
;
2470 memcpy(lpCharacter
, Request
->Data
.ReadConsoleOutputCharRequest
.String
, BytesRead
);
2471 lpCharacter
= (PVOID
)((ULONG_PTR
)lpCharacter
+ (ULONG_PTR
)BytesRead
);
2472 CharsRead
+= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
;
2473 nLength
-= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
;
2475 Request
->Data
.ReadConsoleOutputCharRequest
.ReadCoord
= Request
->Data
.ReadConsoleOutputCharRequest
.EndCoord
;
2478 if (lpNumberOfCharsRead
!= NULL
)
2480 *lpNumberOfCharsRead
= CharsRead
;
2483 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2489 /*--------------------------------------------------------------
2490 * ReadConsoleOutputCharacterA
2496 ReadConsoleOutputCharacterA(HANDLE hConsoleOutput
,
2500 LPDWORD lpNumberOfCharsRead
)
2502 return IntReadConsoleOutputCharacter(hConsoleOutput
,
2506 lpNumberOfCharsRead
,
2511 /*--------------------------------------------------------------
2512 * ReadConsoleOutputCharacterW
2518 ReadConsoleOutputCharacterW(HANDLE hConsoleOutput
,
2522 LPDWORD lpNumberOfCharsRead
)
2524 return IntReadConsoleOutputCharacter(hConsoleOutput
,
2528 lpNumberOfCharsRead
,
2533 /*--------------------------------------------------------------
2534 * ReadConsoleOutputAttribute
2540 ReadConsoleOutputAttribute(HANDLE hConsoleOutput
,
2544 LPDWORD lpNumberOfAttrsRead
)
2546 PCSR_API_MESSAGE Request
;
2551 if (lpNumberOfAttrsRead
!= NULL
)
2552 *lpNumberOfAttrsRead
= nLength
;
2554 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
2556 max(sizeof(CSR_API_MESSAGE
),
2557 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB
)
2558 + min (nLength
, CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
)) * sizeof(WORD
)));
2559 if (Request
== NULL
)
2561 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2565 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2567 while (nLength
!= 0)
2569 Request
->Data
.ReadConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2570 Request
->Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= dwReadCoord
;
2572 if (nLength
> CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
))
2573 Size
= CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WCHAR
);
2577 Request
->Data
.ReadConsoleOutputAttribRequest
.NumAttrsToRead
= Size
;
2579 Status
= CsrClientCallServer(Request
,
2582 max(sizeof(CSR_API_MESSAGE
),
2583 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB
) + Size
* sizeof(WORD
)));
2584 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Request
->Status
))
2586 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2587 SetLastErrorByStatus(Status
);
2591 memcpy(lpAttribute
, Request
->Data
.ReadConsoleOutputAttribRequest
.Attribute
, Size
* sizeof(WORD
));
2592 lpAttribute
+= Size
;
2594 Request
->Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= Request
->Data
.ReadConsoleOutputAttribRequest
.EndCoord
;
2597 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2605 IntWriteConsoleOutputCharacter(HANDLE hConsoleOutput
,
2609 LPDWORD lpNumberOfCharsWritten
,
2612 PCSR_API_MESSAGE Request
;
2615 ULONG SizeBytes
, CharSize
, nChars
;
2618 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
2620 nChars
= min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
/ CharSize
);
2621 SizeBytes
= nChars
* CharSize
;
2623 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
2624 max(sizeof(CSR_API_MESSAGE
),
2625 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR
)
2626 + min (nChars
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
/ CharSize
) * CharSize
));
2627 if (Request
== NULL
)
2629 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2633 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT_CHAR
, CSR_CONSOLE
);
2634 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= dwWriteCoord
;
2640 Request
->Data
.WriteConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
2641 Request
->Data
.WriteConsoleOutputCharRequest
.Unicode
= bUnicode
;
2642 Request
->Data
.WriteConsoleOutputCharRequest
.Length
= (WORD
)min(nLength
, nChars
);
2643 BytesWrite
= Request
->Data
.WriteConsoleOutputCharRequest
.Length
* CharSize
;
2645 memcpy(Request
->Data
.WriteConsoleOutputCharRequest
.String
, lpCharacter
, BytesWrite
);
2647 Status
= CsrClientCallServer(Request
,
2650 max(sizeof(CSR_API_MESSAGE
),
2651 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR
) + BytesWrite
));
2653 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
2655 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2656 SetLastErrorByStatus(Status
);
2660 nLength
-= Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
;
2661 lpCharacter
= (PVOID
)((ULONG_PTR
)lpCharacter
+ (ULONG_PTR
)(Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
* CharSize
));
2662 Written
+= Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
;
2664 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= Request
->Data
.WriteConsoleOutputCharRequest
.EndCoord
;
2667 if (lpNumberOfCharsWritten
!= NULL
)
2669 *lpNumberOfCharsWritten
= Written
;
2672 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2678 /*--------------------------------------------------------------
2679 * WriteConsoleOutputCharacterA
2685 WriteConsoleOutputCharacterA(HANDLE hConsoleOutput
,
2689 LPDWORD lpNumberOfCharsWritten
)
2691 return IntWriteConsoleOutputCharacter(hConsoleOutput
,
2695 lpNumberOfCharsWritten
,
2700 /*--------------------------------------------------------------
2701 * WriteConsoleOutputCharacterW
2707 WriteConsoleOutputCharacterW(HANDLE hConsoleOutput
,
2708 LPCWSTR lpCharacter
,
2711 LPDWORD lpNumberOfCharsWritten
)
2713 return IntWriteConsoleOutputCharacter(hConsoleOutput
,
2717 lpNumberOfCharsWritten
,
2722 /*--------------------------------------------------------------
2723 * WriteConsoleOutputAttribute
2729 WriteConsoleOutputAttribute(HANDLE hConsoleOutput
,
2730 CONST WORD
*lpAttribute
,
2733 LPDWORD lpNumberOfAttrsWritten
)
2735 PCSR_API_MESSAGE Request
;
2740 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
2742 max(sizeof(CSR_API_MESSAGE
),
2743 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB
)
2744 + min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
)) * sizeof(WORD
)));
2745 if (Request
== NULL
)
2747 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2751 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2752 Request
->Data
.WriteConsoleOutputAttribRequest
.Coord
= dwWriteCoord
;
2754 if (lpNumberOfAttrsWritten
)
2755 *lpNumberOfAttrsWritten
= nLength
;
2758 Size
= (WORD
)min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
));
2759 Request
->Data
.WriteConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2760 Request
->Data
.WriteConsoleOutputAttribRequest
.Length
= Size
;
2761 memcpy(Request
->Data
.WriteConsoleOutputAttribRequest
.Attribute
, lpAttribute
, Size
* sizeof(WORD
));
2763 Status
= CsrClientCallServer(Request
,
2766 max(sizeof(CSR_API_MESSAGE
),
2767 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB
) + Size
* sizeof(WORD
)));
2769 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
2771 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2772 SetLastErrorByStatus (Status
);
2776 lpAttribute
+= Size
;
2777 Request
->Data
.WriteConsoleOutputAttribRequest
.Coord
= Request
->Data
.WriteConsoleOutputAttribRequest
.EndCoord
;
2780 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2786 /*--------------------------------------------------------------
2787 * FillConsoleOutputAttribute
2793 FillConsoleOutputAttribute(HANDLE hConsoleOutput
,
2797 LPDWORD lpNumberOfAttrsWritten
)
2799 CSR_API_MESSAGE Request
;
2803 CsrRequest
= MAKE_CSR_API(FILL_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2804 Request
.Data
.FillOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2805 Request
.Data
.FillOutputAttribRequest
.Attribute
= (CHAR
)wAttribute
;
2806 Request
.Data
.FillOutputAttribRequest
.Coord
= dwWriteCoord
;
2807 Request
.Data
.FillOutputAttribRequest
.Length
= (WORD
)nLength
;
2809 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
2810 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2812 SetLastErrorByStatus ( Status
);
2816 if (lpNumberOfAttrsWritten
)
2817 *lpNumberOfAttrsWritten
= nLength
;
2823 /*--------------------------------------------------------------
2830 GetConsoleMode(HANDLE hConsoleHandle
,
2833 CSR_API_MESSAGE Request
;
2837 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_MODE
, CSR_CONSOLE
);
2838 Request
.Data
.GetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
2840 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2841 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2843 SetLastErrorByStatus ( Status
);
2846 *lpMode
= Request
.Data
.GetConsoleModeRequest
.ConsoleMode
;
2852 /*--------------------------------------------------------------
2853 * GetNumberOfConsoleInputEvents
2859 GetNumberOfConsoleInputEvents(HANDLE hConsoleInput
,
2860 LPDWORD lpNumberOfEvents
)
2862 CSR_API_MESSAGE Request
;
2866 if (lpNumberOfEvents
== NULL
)
2868 SetLastError(ERROR_INVALID_PARAMETER
);
2872 CsrRequest
= MAKE_CSR_API(GET_NUM_INPUT_EVENTS
, CSR_CONSOLE
);
2873 Request
.Data
.GetNumInputEventsRequest
.ConsoleHandle
= hConsoleInput
;
2875 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
2876 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2878 SetLastErrorByStatus(Status
);
2882 *lpNumberOfEvents
= Request
.Data
.GetNumInputEventsRequest
.NumInputEvents
;
2888 /*--------------------------------------------------------------
2889 * GetLargestConsoleWindowSize
2895 GetLargestConsoleWindowSize(HANDLE hConsoleOutput
)
2897 COORD Coord
= {80,25};
2898 DPRINT1("GetLargestConsoleWindowSize(0x%x) UNIMPLEMENTED!\n", hConsoleOutput
);
2899 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2904 /*--------------------------------------------------------------
2905 * GetConsoleCursorInfo
2911 GetConsoleCursorInfo(HANDLE hConsoleOutput
,
2912 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
)
2914 CSR_API_MESSAGE Request
;
2918 if (!lpConsoleCursorInfo
)
2920 if (!hConsoleOutput
)
2921 SetLastError(ERROR_INVALID_HANDLE
);
2923 SetLastError(ERROR_INVALID_ACCESS
);
2928 CsrRequest
= MAKE_CSR_API(GET_CURSOR_INFO
, CSR_CONSOLE
);
2929 Request
.Data
.GetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
2931 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
2933 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2935 SetLastErrorByStatus(Status
);
2938 *lpConsoleCursorInfo
= Request
.Data
.GetCursorInfoRequest
.Info
;
2944 /*--------------------------------------------------------------
2945 * GetNumberOfConsoleMouseButtons
2951 GetNumberOfConsoleMouseButtons(LPDWORD lpNumberOfMouseButtons
)
2953 DPRINT1("GetNumberOfConsoleMouseButtons(0x%x) UNIMPLEMENTED!\n", lpNumberOfMouseButtons
);
2954 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2959 /*--------------------------------------------------------------
2966 SetConsoleMode(HANDLE hConsoleHandle
,
2969 CSR_API_MESSAGE Request
;
2973 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_MODE
, CSR_CONSOLE
);
2974 Request
.Data
.SetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
2975 Request
.Data
.SetConsoleModeRequest
.Mode
= dwMode
;
2977 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
2978 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2980 SetLastErrorByStatus ( Status
);
2988 /*--------------------------------------------------------------
2989 * SetConsoleActiveScreenBuffer
2995 SetConsoleActiveScreenBuffer(HANDLE hConsoleOutput
)
2997 CSR_API_MESSAGE Request
;
3001 CsrRequest
= MAKE_CSR_API(SET_SCREEN_BUFFER
, CSR_CONSOLE
);
3002 Request
.Data
.SetScreenBufferRequest
.OutputHandle
= hConsoleOutput
;
3004 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3005 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3007 SetLastErrorByStatus(Status
);
3015 /*--------------------------------------------------------------
3016 * FlushConsoleInputBuffer
3022 FlushConsoleInputBuffer(HANDLE hConsoleInput
)
3024 CSR_API_MESSAGE Request
;
3028 CsrRequest
= MAKE_CSR_API(FLUSH_INPUT_BUFFER
, CSR_CONSOLE
);
3029 Request
.Data
.FlushInputBufferRequest
.ConsoleInput
= hConsoleInput
;
3031 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3032 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3034 SetLastErrorByStatus(Status
);
3042 /*--------------------------------------------------------------
3043 * SetConsoleScreenBufferSize
3049 SetConsoleScreenBufferSize(HANDLE hConsoleOutput
,
3052 DPRINT1("SetConsoleScreenBufferSize(0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, dwSize
);
3053 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3057 /*--------------------------------------------------------------
3058 * SetConsoleCursorInfo
3064 SetConsoleCursorInfo(HANDLE hConsoleOutput
,
3065 CONST CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
)
3067 CSR_API_MESSAGE Request
;
3071 CsrRequest
= MAKE_CSR_API(SET_CURSOR_INFO
, CSR_CONSOLE
);
3072 Request
.Data
.SetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
3073 Request
.Data
.SetCursorInfoRequest
.Info
= *lpConsoleCursorInfo
;
3075 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3076 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3078 SetLastErrorByStatus(Status
);
3088 IntScrollConsoleScreenBuffer(HANDLE hConsoleOutput
,
3089 const SMALL_RECT
*lpScrollRectangle
,
3090 const SMALL_RECT
*lpClipRectangle
,
3091 COORD dwDestinationOrigin
,
3092 const CHAR_INFO
*lpFill
,
3095 CSR_API_MESSAGE Request
;
3099 CsrRequest
= MAKE_CSR_API(SCROLL_CONSOLE_SCREEN_BUFFER
, CSR_CONSOLE
);
3100 Request
.Data
.ScrollConsoleScreenBufferRequest
.ConsoleHandle
= hConsoleOutput
;
3101 Request
.Data
.ScrollConsoleScreenBufferRequest
.Unicode
= bUnicode
;
3102 Request
.Data
.ScrollConsoleScreenBufferRequest
.ScrollRectangle
= *lpScrollRectangle
;
3104 if (lpClipRectangle
!= NULL
)
3106 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= TRUE
;
3107 Request
.Data
.ScrollConsoleScreenBufferRequest
.ClipRectangle
= *lpClipRectangle
;
3111 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= FALSE
;
3114 Request
.Data
.ScrollConsoleScreenBufferRequest
.DestinationOrigin
= dwDestinationOrigin
;
3115 Request
.Data
.ScrollConsoleScreenBufferRequest
.Fill
= *lpFill
;
3117 Status
= CsrClientCallServer(&Request
,
3120 sizeof(CSR_API_MESSAGE
));
3122 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3124 SetLastErrorByStatus(Status
);
3132 /*--------------------------------------------------------------
3133 * ScrollConsoleScreenBufferA
3139 ScrollConsoleScreenBufferA(HANDLE hConsoleOutput
,
3140 CONST SMALL_RECT
*lpScrollRectangle
,
3141 CONST SMALL_RECT
*lpClipRectangle
,
3142 COORD dwDestinationOrigin
,
3143 CONST CHAR_INFO
*lpFill
)
3145 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
3146 (PSMALL_RECT
)lpScrollRectangle
,
3147 (PSMALL_RECT
)lpClipRectangle
,
3148 dwDestinationOrigin
,
3154 /*--------------------------------------------------------------
3155 * ScrollConsoleScreenBufferW
3161 ScrollConsoleScreenBufferW(HANDLE hConsoleOutput
,
3162 CONST SMALL_RECT
*lpScrollRectangle
,
3163 CONST SMALL_RECT
*lpClipRectangle
,
3164 COORD dwDestinationOrigin
,
3165 CONST CHAR_INFO
*lpFill
)
3167 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
3170 dwDestinationOrigin
,
3176 /*--------------------------------------------------------------
3177 * SetConsoleWindowInfo
3183 SetConsoleWindowInfo(HANDLE hConsoleOutput
,
3185 CONST SMALL_RECT
*lpConsoleWindow
)
3187 DPRINT1("SetConsoleWindowInfo(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bAbsolute
, lpConsoleWindow
);
3188 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3193 /*--------------------------------------------------------------
3194 * SetConsoleTextAttribute
3200 SetConsoleTextAttribute(HANDLE hConsoleOutput
,
3203 CSR_API_MESSAGE Request
;
3207 CsrRequest
= MAKE_CSR_API(SET_ATTRIB
, CSR_CONSOLE
);
3208 Request
.Data
.SetAttribRequest
.ConsoleHandle
= hConsoleOutput
;
3209 Request
.Data
.SetAttribRequest
.Attrib
= wAttributes
;
3211 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3212 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3214 SetLastErrorByStatus(Status
);
3224 AddConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
3226 if (HandlerRoutine
== NULL
)
3228 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= TRUE
;
3234 if (CtrlHandlers
== NULL
)
3236 CtrlHandlers
= RtlAllocateHeap(RtlGetProcessHeap(),
3238 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
3242 CtrlHandlers
= RtlReAllocateHeap(RtlGetProcessHeap(),
3244 (PVOID
)CtrlHandlers
,
3245 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
3248 if (CtrlHandlers
== NULL
)
3251 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3255 CtrlHandlers
[NrCtrlHandlers
- 1] = HandlerRoutine
;
3263 RemoveConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
3267 if (HandlerRoutine
== NULL
)
3269 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= FALSE
;
3274 for (i
= 0; i
< NrCtrlHandlers
; i
++)
3276 if ( ((void*)(CtrlHandlers
[i
])) == (void*)HandlerRoutine
)
3279 memmove(CtrlHandlers
+ i
,
3280 CtrlHandlers
+ i
+ 1,
3281 (NrCtrlHandlers
- i
) * sizeof(PHANDLER_ROUTINE
));
3283 CtrlHandlers
= RtlReAllocateHeap(RtlGetProcessHeap(),
3285 (PVOID
)CtrlHandlers
,
3286 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
3292 SetLastError(ERROR_INVALID_PARAMETER
);
3302 SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
,
3307 RtlEnterCriticalSection(&DllLock
);
3310 Ret
= AddConsoleCtrlHandler(HandlerRoutine
);
3314 Ret
= RemoveConsoleCtrlHandler(HandlerRoutine
);
3317 RtlLeaveCriticalSection(&DllLock
);
3322 /*--------------------------------------------------------------
3323 * GenerateConsoleCtrlEvent
3329 GenerateConsoleCtrlEvent(DWORD dwCtrlEvent
,
3330 DWORD dwProcessGroupId
)
3332 CSR_API_MESSAGE Request
;
3336 if (dwCtrlEvent
!= CTRL_C_EVENT
&& dwCtrlEvent
!= CTRL_BREAK_EVENT
)
3338 SetLastError(ERROR_INVALID_PARAMETER
);
3342 CsrRequest
= MAKE_CSR_API(GENERATE_CTRL_EVENT
, CSR_CONSOLE
);
3343 Request
.Data
.GenerateCtrlEvent
.Event
= dwCtrlEvent
;
3344 Request
.Data
.GenerateCtrlEvent
.ProcessGroup
= dwProcessGroupId
;
3346 Status
= CsrClientCallServer(&Request
,
3349 sizeof(CSR_API_MESSAGE
));
3350 if(!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= Request
.Status
)))
3352 SetLastErrorByStatus(Status
);
3360 /*--------------------------------------------------------------
3367 GetConsoleTitleW(LPWSTR lpConsoleTitle
,
3370 PCSR_API_MESSAGE Request
;
3374 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
3376 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_TITLE
) + CSRSS_MAX_TITLE_LENGTH
* sizeof(WCHAR
));
3377 if (Request
== NULL
)
3379 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3383 CsrRequest
= MAKE_CSR_API(GET_TITLE
, CSR_CONSOLE
);
3385 Status
= CsrClientCallServer(Request
,
3388 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_TITLE
) + CSRSS_MAX_TITLE_LENGTH
* sizeof(WCHAR
));
3389 if (!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= Request
->Status
)))
3391 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3392 SetLastErrorByStatus(Status
);
3396 if (nSize
* sizeof(WCHAR
) <= Request
->Data
.GetTitleRequest
.Length
)
3402 nSize
= Request
->Data
.GetTitleRequest
.Length
/ sizeof (WCHAR
);
3404 memcpy(lpConsoleTitle
, Request
->Data
.GetTitleRequest
.Title
, nSize
* sizeof(WCHAR
));
3405 lpConsoleTitle
[nSize
] = L
'\0';
3407 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3413 /*--------------------------------------------------------------
3422 GetConsoleTitleA(LPSTR lpConsoleTitle
,
3425 WCHAR WideTitle
[CSRSS_MAX_TITLE_LENGTH
+ 1];
3426 DWORD nWideTitle
= CSRSS_MAX_TITLE_LENGTH
+ 1;
3429 if (!lpConsoleTitle
|| !nSize
) return 0;
3430 nWideTitle
= GetConsoleTitleW((LPWSTR
) WideTitle
, nWideTitle
);
3431 if (!nWideTitle
) return 0;
3433 if ((nWritten
= WideCharToMultiByte(CP_ACP
, // ANSI code page
3434 0, // performance and mapping flags
3435 (LPWSTR
) WideTitle
, // address of wide-character string
3436 nWideTitle
, // number of characters in string
3437 lpConsoleTitle
, // address of buffer for new string
3438 nSize
- 1, // size of buffer
3442 lpConsoleTitle
[nWritten
] = '\0';
3450 /*--------------------------------------------------------------
3457 SetConsoleTitleW(LPCWSTR lpConsoleTitle
)
3459 PCSR_API_MESSAGE Request
;
3464 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
3465 max(sizeof(CSR_API_MESSAGE
),
3466 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) +
3467 min(wcslen(lpConsoleTitle
), CSRSS_MAX_TITLE_LENGTH
) * sizeof(WCHAR
)));
3468 if (Request
== NULL
)
3470 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3474 CsrRequest
= MAKE_CSR_API(SET_TITLE
, CSR_CONSOLE
);
3476 for (c
= 0; lpConsoleTitle
[c
] && c
< CSRSS_MAX_TITLE_LENGTH
; c
++)
3477 Request
->Data
.SetTitleRequest
.Title
[c
] = lpConsoleTitle
[c
];
3479 Request
->Data
.SetTitleRequest
.Length
= c
* sizeof(WCHAR
);
3480 Status
= CsrClientCallServer(Request
,
3483 max(sizeof(CSR_API_MESSAGE
),
3484 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) + c
* sizeof(WCHAR
)));
3485 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
3487 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3488 SetLastErrorByStatus(Status
);
3492 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3498 /*--------------------------------------------------------------
3507 SetConsoleTitleA(LPCSTR lpConsoleTitle
)
3509 PCSR_API_MESSAGE Request
;
3514 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
3516 max(sizeof(CSR_API_MESSAGE
),
3517 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) +
3518 min(strlen(lpConsoleTitle
), CSRSS_MAX_TITLE_LENGTH
) * sizeof(WCHAR
)));
3519 if (Request
== NULL
)
3521 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3525 CsrRequest
= MAKE_CSR_API(SET_TITLE
, CSR_CONSOLE
);
3527 for (c
= 0; lpConsoleTitle
[c
] && c
< CSRSS_MAX_TITLE_LENGTH
; c
++)
3528 Request
->Data
.SetTitleRequest
.Title
[c
] = lpConsoleTitle
[c
];
3530 Request
->Data
.SetTitleRequest
.Length
= c
* sizeof(WCHAR
);
3531 Status
= CsrClientCallServer(Request
,
3534 max(sizeof(CSR_API_MESSAGE
),
3535 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) + c
* sizeof(WCHAR
)));
3536 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
3538 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3539 SetLastErrorByStatus(Status
);
3543 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3549 /*--------------------------------------------------------------
3550 * CreateConsoleScreenBuffer
3556 CreateConsoleScreenBuffer(DWORD dwDesiredAccess
,
3558 CONST SECURITY_ATTRIBUTES
*lpSecurityAttributes
,
3560 LPVOID lpScreenBufferData
)
3562 CSR_API_MESSAGE Request
;
3566 if (dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
)
3567 || dwShareMode
& ~(FILE_SHARE_READ
| FILE_SHARE_WRITE
)
3568 || dwFlags
!= CONSOLE_TEXTMODE_BUFFER
)
3570 SetLastError(ERROR_INVALID_PARAMETER
);
3571 return INVALID_HANDLE_VALUE
;
3574 Request
.Data
.CreateScreenBufferRequest
.Access
= dwDesiredAccess
;
3575 Request
.Data
.CreateScreenBufferRequest
.ShareMode
= dwShareMode
;
3576 Request
.Data
.CreateScreenBufferRequest
.Inheritable
=
3577 lpSecurityAttributes
? lpSecurityAttributes
->bInheritHandle
: FALSE
;
3579 CsrRequest
= MAKE_CSR_API(CREATE_SCREEN_BUFFER
, CSR_CONSOLE
);
3580 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3581 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3583 SetLastErrorByStatus(Status
);
3584 return INVALID_HANDLE_VALUE
;
3586 return Request
.Data
.CreateScreenBufferRequest
.OutputHandle
;
3590 /*--------------------------------------------------------------
3599 CSR_API_MESSAGE Request
;
3603 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_CP
, CSR_CONSOLE
);
3604 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3605 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3607 SetLastErrorByStatus (Status
);
3611 return Request
.Data
.GetConsoleCodePage
.CodePage
;
3615 /*--------------------------------------------------------------
3622 SetConsoleCP(UINT wCodePageID
)
3624 CSR_API_MESSAGE Request
;
3628 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_CP
, CSR_CONSOLE
);
3629 Request
.Data
.SetConsoleCodePage
.CodePage
= wCodePageID
;
3631 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3632 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3634 SetLastErrorByStatus(Status
);
3637 return NT_SUCCESS(Status
);
3641 /*--------------------------------------------------------------
3642 * GetConsoleOutputCP
3648 GetConsoleOutputCP(VOID
)
3650 CSR_API_MESSAGE Request
;
3654 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_OUTPUT_CP
, CSR_CONSOLE
);
3655 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3656 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3658 SetLastErrorByStatus (Status
);
3662 return Request
.Data
.GetConsoleOutputCodePage
.CodePage
;
3666 /*--------------------------------------------------------------
3667 * SetConsoleOutputCP
3673 SetConsoleOutputCP(UINT wCodePageID
)
3675 CSR_API_MESSAGE Request
;
3679 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_OUTPUT_CP
, CSR_CONSOLE
);
3680 Request
.Data
.SetConsoleOutputCodePage
.CodePage
= wCodePageID
;
3681 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3682 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3684 SetLastErrorByStatus(Status
);
3687 return NT_SUCCESS(Status
);
3691 /*--------------------------------------------------------------
3692 * GetConsoleProcessList
3698 GetConsoleProcessList(LPDWORD lpdwProcessList
,
3699 DWORD dwProcessCount
)
3701 PCSR_API_MESSAGE Request
;
3706 if (lpdwProcessList
== NULL
|| dwProcessCount
== 0)
3708 SetLastError(ERROR_INVALID_PARAMETER
);
3712 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
3714 max(sizeof(CSR_API_MESSAGE
),
3715 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST
)
3716 + min (dwProcessCount
, CSRSS_MAX_GET_PROCESS_LIST
/ sizeof(DWORD
)) * sizeof(DWORD
)));
3717 if (Request
== NULL
)
3719 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3723 CsrRequest
= MAKE_CSR_API(GET_PROCESS_LIST
, CSR_CONSOLE
);
3724 Request
->Data
.GetProcessListRequest
.nMaxIds
= min (dwProcessCount
, CSRSS_MAX_GET_PROCESS_LIST
/ sizeof(DWORD
));
3726 Status
= CsrClientCallServer(Request
,
3729 max(sizeof(CSR_API_MESSAGE
),
3730 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST
)
3731 + Request
->Data
.GetProcessListRequest
.nMaxIds
* sizeof(DWORD
)));
3732 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
3734 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3735 SetLastErrorByStatus (Status
);
3740 nProcesses
= Request
->Data
.GetProcessListRequest
.nProcessIdsCopied
;
3741 if (dwProcessCount
>= nProcesses
)
3743 memcpy(lpdwProcessList
, Request
->Data
.GetProcessListRequest
.ProcessId
, nProcesses
* sizeof(DWORD
));
3747 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3754 /*--------------------------------------------------------------
3755 * GetConsoleSelectionInfo
3761 GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo
)
3763 DPRINT1("GetConsoleSelectionInfo(0x%x) UNIMPLEMENTED!\n", lpConsoleSelectionInfo
);
3764 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3770 /*--------------------------------------------------------------
3777 AttachConsole(DWORD dwProcessId
)
3779 DPRINT1("AttachConsole(0x%x) UNIMPLEMENTED!\n", dwProcessId
);
3783 /*--------------------------------------------------------------
3790 GetConsoleWindow(VOID
)
3792 CSR_API_MESSAGE Request
;
3796 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_WINDOW
, CSR_CONSOLE
);
3797 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3798 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3800 SetLastErrorByStatus(Status
);
3804 return Request
.Data
.GetConsoleWindowRequest
.WindowHandle
;
3808 /*--------------------------------------------------------------
3815 SetConsoleIcon(HICON hicon
)
3817 CSR_API_MESSAGE Request
;
3821 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_ICON
, CSR_CONSOLE
);
3822 Request
.Data
.SetConsoleIconRequest
.WindowIcon
= hicon
;
3824 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
3825 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3827 SetLastErrorByStatus(Status
);
3831 return NT_SUCCESS(Status
);
3835 /******************************************************************************
3836 * \name SetConsoleInputExeNameW
3837 * \brief Sets the console input file name from a unicode string.
3838 * \param lpInputExeName Pointer to a unicode string with the name.
3839 * \return TRUE if successful, FALSE if unsuccsedful.
3840 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
3841 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
3845 SetConsoleInputExeNameW(LPCWSTR lpInputExeName
)
3850 || (lenName
= lstrlenW(lpInputExeName
)) == 0
3851 || lenName
> INPUTEXENAME_BUFLEN
- 1)
3853 /* Fail if string is empty or too long */
3854 SetLastError(ERROR_INVALID_PARAMETER
);
3858 RtlEnterCriticalSection(&ConsoleLock
);
3861 RtlCopyMemory(InputExeName
, lpInputExeName
, lenName
* sizeof(WCHAR
));
3862 InputExeName
[lenName
] = L
'\0';
3866 RtlLeaveCriticalSection(&ConsoleLock
);
3874 /******************************************************************************
3875 * \name SetConsoleInputExeNameA
3876 * \brief Sets the console input file name from an ansi string.
3877 * \param lpInputExeName Pointer to an ansi string with the name.
3878 * \return TRUE if successful, FALSE if unsuccsedful.
3879 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
3880 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
3884 SetConsoleInputExeNameA(LPCSTR lpInputExeName
)
3886 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
3887 ANSI_STRING InputExeNameA
;
3888 UNICODE_STRING InputExeNameU
;
3892 RtlInitAnsiString(&InputExeNameA
, lpInputExeName
);
3894 if(InputExeNameA
.Length
== 0 ||
3895 InputExeNameA
.Length
> INPUTEXENAME_BUFLEN
- 1)
3897 /* Fail if string is empty or too long */
3898 SetLastError(ERROR_INVALID_PARAMETER
);
3902 InputExeNameU
.Buffer
= Buffer
;
3903 InputExeNameU
.MaximumLength
= sizeof(Buffer
);
3904 InputExeNameU
.Length
= 0;
3905 Status
= RtlAnsiStringToUnicodeString(&InputExeNameU
, &InputExeNameA
, FALSE
);
3906 if(NT_SUCCESS(Status
))
3908 Ret
= SetConsoleInputExeNameW(InputExeNameU
.Buffer
);
3912 SetLastErrorByStatus(Status
);
3920 /******************************************************************************
3921 * \name GetConsoleInputExeNameW
3922 * \brief Retrieves the console input file name as unicode string.
3923 * \param nBufferLength Length of the buffer in WCHARs.
3924 * Specify 0 to recieve the needed buffer length.
3925 * \param lpBuffer Pointer to a buffer that recieves the string.
3926 * \return Needed buffer size if \p nBufferLength is 0.
3927 * Otherwise 1 if successful, 2 if buffer is too small.
3928 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
3929 * is not big enough.
3933 GetConsoleInputExeNameW(DWORD nBufferLength
, LPWSTR lpBuffer
)
3935 int lenName
= lstrlenW(InputExeName
);
3937 if (nBufferLength
== 0)
3939 /* Buffer size is requested, return it */
3943 if(lenName
+ 1 > nBufferLength
)
3945 /* Buffer is not large enough! */
3946 SetLastError(ERROR_BUFFER_OVERFLOW
);
3950 RtlEnterCriticalSection(&ConsoleLock
);
3953 RtlCopyMemory(lpBuffer
, InputExeName
, lenName
* sizeof(WCHAR
));
3954 lpBuffer
[lenName
] = '\0';
3958 RtlLeaveCriticalSection(&ConsoleLock
);
3962 /* Success, return 1 */
3967 /******************************************************************************
3968 * \name GetConsoleInputExeNameA
3969 * \brief Retrieves the console input file name as ansi string.
3970 * \param nBufferLength Length of the buffer in CHARs.
3971 * \param lpBuffer Pointer to a buffer that recieves the string.
3972 * \return 1 if successful, 2 if buffer is too small.
3973 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
3974 * is not big enough. The buffer recieves as much characters as fit.
3978 GetConsoleInputExeNameA(DWORD nBufferLength
, LPSTR lpBuffer
)
3980 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
3982 UNICODE_STRING BufferU
;
3983 ANSI_STRING BufferA
;
3985 /* Get the unicode name */
3986 Ret
= GetConsoleInputExeNameW(sizeof(Buffer
) / sizeof(Buffer
[0]), Buffer
);
3988 /* Initialize strings for conversion */
3989 RtlInitUnicodeString(&BufferU
, Buffer
);
3991 BufferA
.MaximumLength
= nBufferLength
;
3992 BufferA
.Buffer
= lpBuffer
;
3994 /* Convert unicode name to ansi, copying as much chars as fit */
3995 RtlUnicodeStringToAnsiString(&BufferA
, &BufferU
, FALSE
);
3997 /* Error handling */
3998 if(nBufferLength
<= BufferU
.Length
/ sizeof(WCHAR
))
4000 SetLastError(ERROR_BUFFER_OVERFLOW
);
4008 /*--------------------------------------------------------------
4009 * GetConsoleHistoryInfo
4015 GetConsoleHistoryInfo(PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo
)
4017 DPRINT1("GetConsoleHistoryInfo(0x%p) UNIMPLEMENTED!\n", lpConsoleHistoryInfo
);
4018 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4023 /*--------------------------------------------------------------
4024 * SetConsoleHistoryInfo
4030 SetConsoleHistoryInfo(IN PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo
)
4032 DPRINT1("SetConsoleHistoryInfo(0x%p) UNIMPLEMENTED!\n", lpConsoleHistoryInfo
);
4033 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4038 /*--------------------------------------------------------------
4039 * GetConsoleOriginalTitleW
4045 GetConsoleOriginalTitleW(OUT LPWSTR lpConsoleTitle
,
4048 DPRINT1("GetConsoleOriginalTitleW(0x%p, 0x%x) UNIMPLEMENTED!\n", lpConsoleTitle
, nSize
);
4049 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4054 /*--------------------------------------------------------------
4055 * GetConsoleOriginalTitleA
4061 GetConsoleOriginalTitleA(OUT LPSTR lpConsoleTitle
,
4064 DPRINT1("GetConsoleOriginalTitleA(0x%p, 0x%x) UNIMPLEMENTED!\n", lpConsoleTitle
, nSize
);
4065 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4070 /*--------------------------------------------------------------
4071 * GetConsoleScreenBufferInfoEx
4077 GetConsoleScreenBufferInfoEx(IN HANDLE hConsoleOutput
,
4078 OUT PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx
)
4080 DPRINT1("GetConsoleScreenBufferInfoEx(0x%p, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput
, lpConsoleScreenBufferInfoEx
);
4081 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4086 /*--------------------------------------------------------------
4087 * SetConsoleScreenBufferInfoEx
4093 SetConsoleScreenBufferInfoEx(IN HANDLE hConsoleOutput
,
4094 IN PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx
)
4096 DPRINT1("SetConsoleScreenBufferInfoEx(0x%p, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput
, lpConsoleScreenBufferInfoEx
);
4097 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
4102 /*--------------------------------------------------------------
4103 * GetCurrentConsoleFontEx
4109 GetCurrentConsoleFontEx(IN HANDLE hConsoleOutput
,
4110 IN BOOL bMaximumWindow
,
4111 OUT PCONSOLE_FONT_INFOEX lpConsoleCurrentFontEx
)
4113 DPRINT1("GetCurrentConsoleFontEx(0x%p, 0x%x, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput
, bMaximumWindow
, lpConsoleCurrentFontEx
);
4114 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);