2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: dll/win32/kernel32/client/console/console.c
5 * PURPOSE: Win32 server console functions
6 * PROGRAMMER: James Tabor
7 * <jimtabor@adsl-64-217-116-74.dsl.hstntx.swbell.net>
10 * 19990204 EA SetConsoleTitleA
14 /* INCLUDES *******************************************************************/
21 extern RTL_CRITICAL_SECTION ConsoleLock
;
22 extern BOOL ConsoleInitialized
;
23 extern BOOL WINAPI
IsDebuggerPresent(VOID
);
25 /* GLOBALS ********************************************************************/
27 PHANDLER_ROUTINE InitialHandler
[1];
28 PHANDLER_ROUTINE
* CtrlHandlers
;
30 ULONG NrAllocatedHandlers
;
32 HANDLE InputWaitHandle
= INVALID_HANDLE_VALUE
;
34 #define INPUTEXENAME_BUFLEN 256
35 static WCHAR InputExeName
[INPUTEXENAME_BUFLEN
];
37 /* Default Console Control Handler ********************************************/
41 DefaultConsoleCtrlHandler(DWORD Event
)
43 DPRINT("Default handler called: %lx\n", Event
);
47 DPRINT("Ctrl-C Event\n");
50 case CTRL_BREAK_EVENT
:
51 DPRINT("Ctrl-Break Event\n");
54 case CTRL_CLOSE_EVENT
:
55 DPRINT("Ctrl Close Event\n");
58 case CTRL_LOGOFF_EVENT
:
59 DPRINT("Ctrl Logoff Event\n");
62 case CTRL_SHUTDOWN_EVENT
:
63 DPRINT("Ctrl Shutdown Event\n");
67 ExitProcess(CONTROL_C_EXIT
);
73 ConsoleControlDispatcher(IN LPVOID lpThreadParameter
)
76 DWORD CodeAndFlag
= PtrToUlong(lpThreadParameter
);
77 DWORD nCode
= CodeAndFlag
& MAXLONG
;
79 EXCEPTION_RECORD erException
;
81 DPRINT1("Console Dispatcher Active: %lx %lx\n", CodeAndFlag
, nCode
);
82 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST
);
87 case CTRL_BREAK_EVENT
:
89 if (IsDebuggerPresent())
91 erException
.ExceptionCode
= (nCode
== CTRL_C_EVENT
?
92 DBG_CONTROL_C
: DBG_CONTROL_BREAK
);
93 erException
.ExceptionFlags
= 0;
94 erException
.ExceptionRecord
= NULL
;
95 erException
.ExceptionAddress
= DefaultConsoleCtrlHandler
;
96 erException
.NumberParameters
= 0;
100 RtlRaiseException(&erException
);
102 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
104 RtlEnterCriticalSection(&ConsoleLock
);
106 if ((nCode
!= CTRL_C_EVENT
) ||
107 (NtCurrentPeb()->ProcessParameters
->ConsoleFlags
!= 1))
109 for (i
= NrCtrlHandlers
; i
> 0; i
--)
111 if (CtrlHandlers
[i
- 1](nCode
)) break;
115 RtlLeaveCriticalSection(&ConsoleLock
);
124 case CTRL_CLOSE_EVENT
:
125 case CTRL_LOGOFF_EVENT
:
126 case CTRL_SHUTDOWN_EVENT
:
134 ExitProcess(CONTROL_C_EXIT
);
142 ASSERT(ConsoleInitialized
);
144 RtlEnterCriticalSection(&ConsoleLock
);
146 if ((nCode
!= CTRL_C_EVENT
) || (NtCurrentPeb()->ProcessParameters
->ConsoleFlags
!= 1))
148 for (i
= NrCtrlHandlers
; i
> 0; i
--)
151 (CodeAndFlag
& MINLONG
) &&
152 ((nCode
== CTRL_LOGOFF_EVENT
) || (nCode
== CTRL_SHUTDOWN_EVENT
)))
154 DPRINT("Skipping system/service apps\n");
158 if (CtrlHandlers
[i
- 1](nCode
))
162 case CTRL_CLOSE_EVENT
:
163 case CTRL_LOGOFF_EVENT
:
164 case CTRL_SHUTDOWN_EVENT
:
166 nExitCode
= CodeAndFlag
;
174 RtlLeaveCriticalSection(&ConsoleLock
);
175 ExitThread(nExitCode
);
176 return STATUS_SUCCESS
;
181 InitConsoleCtrlHandling(VOID
)
183 /* Initialize Console Ctrl Handler */
184 NrAllocatedHandlers
= NrCtrlHandlers
= 1;
185 CtrlHandlers
= InitialHandler
;
186 CtrlHandlers
[0] = DefaultConsoleCtrlHandler
;
190 /* FUNCTIONS ******************************************************************/
193 * @unimplemented (Undocumented)
197 ConsoleMenuControl(HANDLE hConsole
,
201 DPRINT1("ConsoleMenuControl(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsole
, Unknown1
, Unknown2
);
202 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
212 DuplicateConsoleHandle(HANDLE hConsole
,
213 DWORD dwDesiredAccess
,
218 CONSOLE_API_MESSAGE ApiMessage
;
219 PCONSOLE_DUPLICATEHANDLE DuplicateHandleRequest
= &ApiMessage
.Data
.DuplicateHandleRequest
;
221 if ( (dwOptions
& ~(DUPLICATE_CLOSE_SOURCE
| DUPLICATE_SAME_ACCESS
)) ||
222 (!(dwOptions
& DUPLICATE_SAME_ACCESS
) &&
223 (dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
))) )
225 SetLastError (ERROR_INVALID_PARAMETER
);
226 return INVALID_HANDLE_VALUE
;
229 DuplicateHandleRequest
->ConsoleHandle
= hConsole
;
230 DuplicateHandleRequest
->Access
= dwDesiredAccess
;
231 DuplicateHandleRequest
->Inheritable
= bInheritHandle
;
232 DuplicateHandleRequest
->Options
= dwOptions
;
234 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
236 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepDuplicateHandle
),
237 sizeof(CONSOLE_DUPLICATEHANDLE
));
238 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
240 BaseSetLastNTError(Status
);
241 return INVALID_HANDLE_VALUE
;
244 return DuplicateHandleRequest
->ConsoleHandle
;
253 GetConsoleDisplayMode(LPDWORD lpdwMode
)
255 * FUNCTION: Get the console display mode
257 * lpdwMode - Address of variable that receives the current value
259 * STATUS: Undocumented
262 DPRINT1("GetConsoleDisplayMode(0x%x) UNIMPLEMENTED!\n", lpdwMode
);
263 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
269 * @unimplemented (Undocumented)
273 GetConsoleFontInfo(DWORD Unknown0
,
278 DPRINT1("GetConsoleFontInfo(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
279 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
289 GetConsoleFontSize(HANDLE hConsoleOutput
,
292 COORD Empty
= {0, 0};
293 DPRINT1("GetConsoleFontSize(0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, nFont
);
294 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
300 * @implemented (Undocumented)
304 GetConsoleHardwareState(HANDLE hConsoleOutput
,
309 CONSOLE_API_MESSAGE ApiMessage
;
310 PCONSOLE_GETSETHWSTATE HardwareStateRequest
= &ApiMessage
.Data
.HardwareStateRequest
;
312 HardwareStateRequest
->OutputHandle
= hConsoleOutput
;
314 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
316 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetHardwareState
),
317 sizeof(CONSOLE_GETSETHWSTATE
));
318 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
320 BaseSetLastNTError(Status
);
324 *State
= HardwareStateRequest
->State
;
330 * @implemented (Undocumented)
334 GetConsoleInputWaitHandle(VOID
)
338 CONSOLE_API_MESSAGE ApiMessage
;
340 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
342 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, GET_INPUT_WAIT_HANDLE
),
343 sizeof(CSRSS_GET_INPUT_WAIT_HANDLE
));
344 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
346 BaseSetLastNTError(Status
);
350 return ApiMessage
.Data
.GetConsoleInputWaitHandle
.InputWaitHandle
;
353 return InputWaitHandle
;
362 GetCurrentConsoleFont(HANDLE hConsoleOutput
,
364 PCONSOLE_FONT_INFO lpConsoleCurrentFont
)
366 DPRINT1("GetCurrentConsoleFont(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bMaximumWindow
, lpConsoleCurrentFont
);
367 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
373 * @unimplemented (Undocumented)
377 GetNumberOfConsoleFonts(VOID
)
379 DPRINT1("GetNumberOfConsoleFonts() UNIMPLEMENTED!\n");
380 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
386 * @unimplemented (Undocumented)
390 InvalidateConsoleDIBits(DWORD Unknown0
,
393 DPRINT1("InvalidateConsoleDIBits(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
394 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
400 * @unimplemented (Undocumented)
404 OpenConsoleW(LPCWSTR wsName
,
405 DWORD dwDesiredAccess
,
409 NTSTATUS Status
= STATUS_SUCCESS
;
410 CONSOLE_API_MESSAGE ApiMessage
;
411 PCONSOLE_OPENCONSOLE OpenConsoleRequest
= &ApiMessage
.Data
.OpenConsoleRequest
;
412 CONSOLE_HANDLE_TYPE HandleType
;
414 if (wsName
&& 0 == _wcsicmp(wsName
, L
"CONIN$"))
416 HandleType
= HANDLE_INPUT
;
418 else if (wsName
&& 0 == _wcsicmp(wsName
, L
"CONOUT$"))
420 HandleType
= HANDLE_OUTPUT
;
424 SetLastError(ERROR_INVALID_PARAMETER
);
425 return INVALID_HANDLE_VALUE
;
428 if (dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
))
430 SetLastError(ERROR_INVALID_PARAMETER
);
431 return INVALID_HANDLE_VALUE
;
434 if (dwShareMode
& ~(FILE_SHARE_READ
| FILE_SHARE_WRITE
))
436 SetLastError(ERROR_INVALID_PARAMETER
);
437 return INVALID_HANDLE_VALUE
;
440 OpenConsoleRequest
->HandleType
= HandleType
;
441 OpenConsoleRequest
->Access
= dwDesiredAccess
;
442 OpenConsoleRequest
->Inheritable
= bInheritHandle
;
443 OpenConsoleRequest
->ShareMode
= dwShareMode
;
445 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
447 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepOpenConsole
),
448 sizeof(CONSOLE_OPENCONSOLE
));
449 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
451 BaseSetLastNTError(Status
);
452 return INVALID_HANDLE_VALUE
;
455 return OpenConsoleRequest
->ConsoleHandle
;
460 * @unimplemented (Undocumented)
464 SetConsoleCursor(DWORD Unknown0
,
467 DPRINT1("SetConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
468 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
478 SetConsoleDisplayMode(HANDLE hOut
,
482 * FUNCTION: Set the console display mode.
484 * hOut - Standard output handle.
485 * dwNewMode - New mode.
486 * lpdwOldMode - Address of a variable that receives the old mode.
489 DPRINT1("SetConsoleDisplayMode(0x%x, 0x%x, 0x%p) UNIMPLEMENTED!\n", hOut
, dwNewMode
, lpdwOldMode
);
490 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
496 * @unimplemented (Undocumented)
500 SetConsoleFont(DWORD Unknown0
,
503 DPRINT1("SetConsoleFont(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
504 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
510 * @implemented (Undocumented)
514 SetConsoleHardwareState(HANDLE hConsoleOutput
,
519 CONSOLE_API_MESSAGE ApiMessage
;
520 PCONSOLE_GETSETHWSTATE HardwareStateRequest
= &ApiMessage
.Data
.HardwareStateRequest
;
522 HardwareStateRequest
->OutputHandle
= hConsoleOutput
;
523 HardwareStateRequest
->State
= State
;
525 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
527 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetHardwareState
),
528 sizeof(CONSOLE_GETSETHWSTATE
));
529 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
531 BaseSetLastNTError(Status
);
540 * @unimplemented (Undocumented)
544 SetConsoleKeyShortcuts(DWORD Unknown0
,
549 DPRINT1("SetConsoleKeyShortcuts(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
550 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
556 * @unimplemented (Undocumented)
560 SetConsoleMaximumWindowSize(DWORD Unknown0
,
563 DPRINT1("SetConsoleMaximumWindowSize(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
564 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
570 * @unimplemented (Undocumented)
574 SetConsoleMenuClose(DWORD Unknown0
)
576 DPRINT1("SetConsoleMenuClose(0x%x) UNIMPLEMENTED!\n", Unknown0
);
577 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
583 * @unimplemented (Undocumented)
587 SetConsolePalette(DWORD Unknown0
,
591 DPRINT1("SetConsolePalette(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
);
592 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
597 * @unimplemented (Undocumented)
601 ShowConsoleCursor(DWORD Unknown0
,
604 DPRINT1("ShowConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
605 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
611 * FUNCTION: Checks whether the given handle is a valid console handle.
614 * Handle - Handle to be checked
617 * TRUE: Handle is a valid console handle
618 * FALSE: Handle is not a valid console handle.
620 * STATUS: Officially undocumented
626 VerifyConsoleIoHandle(HANDLE Handle
)
629 CONSOLE_API_MESSAGE ApiMessage
;
631 ApiMessage
.Data
.VerifyHandleRequest
.ConsoleHandle
= Handle
;
633 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
635 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepVerifyIoHandle
),
636 sizeof(CONSOLE_VERIFYHANDLE
));
637 if (!NT_SUCCESS(Status
))
639 BaseSetLastNTError(Status
);
643 return (BOOL
)NT_SUCCESS(ApiMessage
.Status
);
652 WriteConsoleInputVDMA(DWORD Unknown0
,
657 DPRINT1("WriteConsoleInputVDMA(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
658 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
668 WriteConsoleInputVDMW(DWORD Unknown0
,
673 DPRINT1("WriteConsoleInputVDMW(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
674 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
680 * @implemented (Undocumented)
684 CloseConsoleHandle(HANDLE Handle
)
687 CONSOLE_API_MESSAGE ApiMessage
;
689 ApiMessage
.Data
.CloseHandleRequest
.ConsoleHandle
= Handle
;
691 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
693 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepCloseHandle
),
694 sizeof(CONSOLE_CLOSEHANDLE
));
695 if (!NT_SUCCESS(Status
))
697 BaseSetLastNTError(Status
);
710 GetStdHandle(DWORD nStdHandle
)
712 * FUNCTION: Get a handle for the standard input, standard output
713 * and a standard error device.
716 * nStdHandle - Specifies the device for which to return the handle.
718 * RETURNS: If the function succeeds, the return value is the handle
719 * of the specified device. Otherwise the value is INVALID_HANDLE_VALUE.
722 PRTL_USER_PROCESS_PARAMETERS Ppb
;
724 Ppb
= NtCurrentPeb()->ProcessParameters
;
727 case STD_INPUT_HANDLE
:
728 return Ppb
->StandardInput
;
730 case STD_OUTPUT_HANDLE
:
731 return Ppb
->StandardOutput
;
733 case STD_ERROR_HANDLE
:
734 return Ppb
->StandardError
;
737 SetLastError(ERROR_INVALID_PARAMETER
);
738 return INVALID_HANDLE_VALUE
;
747 SetStdHandle(DWORD nStdHandle
,
750 * FUNCTION: Set the handle for the standard input, standard output or
751 * the standard error device.
754 * nStdHandle - Specifies the handle to be set.
755 * hHandle - The handle to set.
757 * RETURNS: TRUE if the function succeeds, FALSE otherwise.
760 PRTL_USER_PROCESS_PARAMETERS Ppb
;
762 /* no need to check if hHandle == INVALID_HANDLE_VALUE */
764 Ppb
= NtCurrentPeb()->ProcessParameters
;
768 case STD_INPUT_HANDLE
:
769 Ppb
->StandardInput
= hHandle
;
772 case STD_OUTPUT_HANDLE
:
773 Ppb
->StandardOutput
= hHandle
;
776 case STD_ERROR_HANDLE
:
777 Ppb
->StandardError
= hHandle
;
781 /* windows for whatever reason sets the last error to ERROR_INVALID_HANDLE here */
782 SetLastError(ERROR_INVALID_HANDLE
);
787 /*--------------------------------------------------------------
797 CONSOLE_API_MESSAGE ApiMessage
;
798 PCONSOLE_ALLOCCONSOLE AllocConsoleRequest
= &ApiMessage
.Data
.AllocConsoleRequest
;
801 DPRINT1("AllocConsole called !!!!\n");
803 if (NtCurrentPeb()->ProcessParameters
->ConsoleHandle
)
805 DPRINT("AllocConsole: Allocate duplicate console to the same Process\n");
806 BaseSetLastNTError (STATUS_OBJECT_NAME_EXISTS
);
812 AllocConsoleRequest
->ShowCmd
= si
.wShowWindow
;
813 AllocConsoleRequest
->Console
= NULL
;
814 AllocConsoleRequest
->CtrlDispatcher
= ConsoleControlDispatcher
;
816 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
818 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepAlloc
),
819 sizeof(CONSOLE_ALLOCCONSOLE
));
820 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
822 BaseSetLastNTError(Status
);
826 NtCurrentPeb()->ProcessParameters
->ConsoleHandle
= AllocConsoleRequest
->Console
;
828 SetStdHandle(STD_INPUT_HANDLE
, AllocConsoleRequest
->InputHandle
);
829 SetStdHandle(STD_OUTPUT_HANDLE
, AllocConsoleRequest
->OutputHandle
);
830 SetStdHandle(STD_ERROR_HANDLE
, AllocConsoleRequest
->ErrorHandle
);
832 /* Initialize Console Ctrl Handler */
833 InitConsoleCtrlHandling();
835 InputWaitHandle
= AllocConsoleRequest
->InputWaitHandle
;
841 /*--------------------------------------------------------------
850 // AG: I'm not sure if this is correct (what happens to std handles?)
851 // but I just tried to reverse what AllocConsole() does...
854 CONSOLE_API_MESSAGE ApiMessage
;
856 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
858 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepFree
),
859 sizeof(CONSOLE_FREECONSOLE
));
860 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
862 BaseSetLastNTError(Status
);
866 NtCurrentPeb()->ProcessParameters
->ConsoleHandle
= NULL
;
868 CloseHandle(InputWaitHandle
);
869 InputWaitHandle
= INVALID_HANDLE_VALUE
;
875 /*--------------------------------------------------------------
876 * GetConsoleScreenBufferInfo
882 GetConsoleScreenBufferInfo(HANDLE hConsoleOutput
,
883 PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
)
886 CONSOLE_API_MESSAGE ApiMessage
;
888 if (lpConsoleScreenBufferInfo
== NULL
)
890 SetLastError(ERROR_INVALID_PARAMETER
);
894 ApiMessage
.Data
.ScreenBufferInfoRequest
.OutputHandle
= hConsoleOutput
;
896 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
898 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetScreenBufferInfo
),
899 sizeof(CONSOLE_GETSCREENBUFFERINFO
));
900 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
902 BaseSetLastNTError(Status
);
906 *lpConsoleScreenBufferInfo
= ApiMessage
.Data
.ScreenBufferInfoRequest
.Info
;
912 /*--------------------------------------------------------------
913 * SetConsoleCursorPosition
919 SetConsoleCursorPosition(HANDLE hConsoleOutput
,
920 COORD dwCursorPosition
)
923 CONSOLE_API_MESSAGE ApiMessage
;
925 ApiMessage
.Data
.SetCursorPositionRequest
.OutputHandle
= hConsoleOutput
;
926 ApiMessage
.Data
.SetCursorPositionRequest
.Position
= dwCursorPosition
;
928 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
930 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetCursorPosition
),
931 sizeof(CONSOLE_SETCURSORPOSITION
));
932 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
934 BaseSetLastNTError(Status
);
942 /*--------------------------------------------------------------
949 GetConsoleMode(HANDLE hConsoleHandle
,
953 CONSOLE_API_MESSAGE ApiMessage
;
954 PCONSOLE_GETSETCONSOLEMODE ConsoleModeRequest
= &ApiMessage
.Data
.ConsoleModeRequest
;
956 ConsoleModeRequest
->ConsoleHandle
= hConsoleHandle
;
958 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
960 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetMode
),
961 sizeof(CONSOLE_GETSETCONSOLEMODE
));
962 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
964 BaseSetLastNTError(Status
);
968 *lpMode
= ConsoleModeRequest
->ConsoleMode
;
974 /*--------------------------------------------------------------
975 * GetNumberOfConsoleInputEvents
981 GetNumberOfConsoleInputEvents(HANDLE hConsoleInput
,
982 LPDWORD lpNumberOfEvents
)
985 CONSOLE_API_MESSAGE ApiMessage
;
987 if (lpNumberOfEvents
== NULL
)
989 SetLastError(ERROR_INVALID_PARAMETER
);
993 ApiMessage
.Data
.GetNumInputEventsRequest
.InputHandle
= hConsoleInput
;
995 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
997 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetNumberOfInputEvents
),
998 sizeof(CONSOLE_GETNUMINPUTEVENTS
));
999 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1001 BaseSetLastNTError(Status
);
1005 *lpNumberOfEvents
= ApiMessage
.Data
.GetNumInputEventsRequest
.NumInputEvents
;
1011 /*--------------------------------------------------------------
1012 * GetLargestConsoleWindowSize
1018 GetLargestConsoleWindowSize(HANDLE hConsoleOutput
)
1020 COORD Coord
= {80,25};
1021 DPRINT1("GetLargestConsoleWindowSize(0x%x) UNIMPLEMENTED!\n", hConsoleOutput
);
1022 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1027 /*--------------------------------------------------------------
1028 * GetConsoleCursorInfo
1034 GetConsoleCursorInfo(HANDLE hConsoleOutput
,
1035 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
)
1038 CONSOLE_API_MESSAGE ApiMessage
;
1040 if (!lpConsoleCursorInfo
)
1042 if (!hConsoleOutput
)
1043 SetLastError(ERROR_INVALID_HANDLE
);
1045 SetLastError(ERROR_INVALID_ACCESS
);
1050 ApiMessage
.Data
.CursorInfoRequest
.OutputHandle
= hConsoleOutput
;
1052 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1054 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetCursorInfo
),
1055 sizeof(CONSOLE_GETSETCURSORINFO
));
1056 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1058 BaseSetLastNTError(Status
);
1062 *lpConsoleCursorInfo
= ApiMessage
.Data
.CursorInfoRequest
.Info
;
1068 /*--------------------------------------------------------------
1069 * GetNumberOfConsoleMouseButtons
1075 GetNumberOfConsoleMouseButtons(LPDWORD lpNumberOfMouseButtons
)
1077 DPRINT1("GetNumberOfConsoleMouseButtons(0x%x) UNIMPLEMENTED!\n", lpNumberOfMouseButtons
);
1078 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1083 /*--------------------------------------------------------------
1090 SetConsoleMode(HANDLE hConsoleHandle
,
1094 CONSOLE_API_MESSAGE ApiMessage
;
1095 PCONSOLE_GETSETCONSOLEMODE ConsoleModeRequest
= &ApiMessage
.Data
.ConsoleModeRequest
;
1097 ConsoleModeRequest
->ConsoleHandle
= hConsoleHandle
;
1098 ConsoleModeRequest
->ConsoleMode
= dwMode
;
1100 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1102 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetMode
),
1103 sizeof(CONSOLE_GETSETCONSOLEMODE
));
1104 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1106 BaseSetLastNTError(Status
);
1114 /*--------------------------------------------------------------
1115 * SetConsoleActiveScreenBuffer
1121 SetConsoleActiveScreenBuffer(HANDLE hConsoleOutput
)
1124 CONSOLE_API_MESSAGE ApiMessage
;
1126 ApiMessage
.Data
.SetScreenBufferRequest
.OutputHandle
= hConsoleOutput
;
1128 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1130 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetActiveScreenBuffer
),
1131 sizeof(CONSOLE_SETACTIVESCREENBUFFER
));
1132 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1134 BaseSetLastNTError(Status
);
1142 /*--------------------------------------------------------------
1143 * FlushConsoleInputBuffer
1149 FlushConsoleInputBuffer(HANDLE hConsoleInput
)
1152 CONSOLE_API_MESSAGE ApiMessage
;
1154 ApiMessage
.Data
.FlushInputBufferRequest
.InputHandle
= hConsoleInput
;
1156 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1158 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepFlushInputBuffer
),
1159 sizeof(CONSOLE_FLUSHINPUTBUFFER
));
1160 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1162 BaseSetLastNTError(Status
);
1170 /*--------------------------------------------------------------
1171 * SetConsoleScreenBufferSize
1177 SetConsoleScreenBufferSize(HANDLE hConsoleOutput
,
1181 CONSOLE_API_MESSAGE ApiMessage
;
1183 ApiMessage
.Data
.SetScreenBufferSizeRequest
.OutputHandle
= hConsoleOutput
;
1184 ApiMessage
.Data
.SetScreenBufferSizeRequest
.Size
= dwSize
;
1186 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1188 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetScreenBufferSize
),
1189 sizeof(CONSOLE_SETSCREENBUFFERSIZE
));
1190 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1192 BaseSetLastNTError(Status
);
1200 /*--------------------------------------------------------------
1201 * SetConsoleCursorInfo
1207 SetConsoleCursorInfo(HANDLE hConsoleOutput
,
1208 CONST CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
)
1211 CONSOLE_API_MESSAGE ApiMessage
;
1213 ApiMessage
.Data
.CursorInfoRequest
.OutputHandle
= hConsoleOutput
;
1214 ApiMessage
.Data
.CursorInfoRequest
.Info
= *lpConsoleCursorInfo
;
1216 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1218 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetCursorInfo
),
1219 sizeof(CONSOLE_GETSETCURSORINFO
));
1220 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1222 BaseSetLastNTError(Status
);
1232 IntScrollConsoleScreenBuffer(HANDLE hConsoleOutput
,
1233 const SMALL_RECT
*lpScrollRectangle
,
1234 const SMALL_RECT
*lpClipRectangle
,
1235 COORD dwDestinationOrigin
,
1236 const CHAR_INFO
*lpFill
,
1240 CONSOLE_API_MESSAGE ApiMessage
;
1241 PCONSOLE_SCROLLSCREENBUFFER ScrollScreenBufferRequest
= &ApiMessage
.Data
.ScrollScreenBufferRequest
;
1243 ScrollScreenBufferRequest
->OutputHandle
= hConsoleOutput
;
1244 ScrollScreenBufferRequest
->Unicode
= bUnicode
;
1245 ScrollScreenBufferRequest
->ScrollRectangle
= *lpScrollRectangle
;
1247 if (lpClipRectangle
!= NULL
)
1249 ScrollScreenBufferRequest
->UseClipRectangle
= TRUE
;
1250 ScrollScreenBufferRequest
->ClipRectangle
= *lpClipRectangle
;
1254 ScrollScreenBufferRequest
->UseClipRectangle
= FALSE
;
1257 ScrollScreenBufferRequest
->DestinationOrigin
= dwDestinationOrigin
;
1258 ScrollScreenBufferRequest
->Fill
= *lpFill
;
1260 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1262 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepScrollScreenBuffer
),
1263 sizeof(CONSOLE_SCROLLSCREENBUFFER
));
1265 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1267 BaseSetLastNTError(Status
);
1275 /*--------------------------------------------------------------
1276 * ScrollConsoleScreenBufferA
1282 ScrollConsoleScreenBufferA(HANDLE hConsoleOutput
,
1283 CONST SMALL_RECT
*lpScrollRectangle
,
1284 CONST SMALL_RECT
*lpClipRectangle
,
1285 COORD dwDestinationOrigin
,
1286 CONST CHAR_INFO
*lpFill
)
1288 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
1289 (PSMALL_RECT
)lpScrollRectangle
,
1290 (PSMALL_RECT
)lpClipRectangle
,
1291 dwDestinationOrigin
,
1297 /*--------------------------------------------------------------
1298 * ScrollConsoleScreenBufferW
1304 ScrollConsoleScreenBufferW(HANDLE hConsoleOutput
,
1305 CONST SMALL_RECT
*lpScrollRectangle
,
1306 CONST SMALL_RECT
*lpClipRectangle
,
1307 COORD dwDestinationOrigin
,
1308 CONST CHAR_INFO
*lpFill
)
1310 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
1313 dwDestinationOrigin
,
1319 /*--------------------------------------------------------------
1320 * SetConsoleWindowInfo
1326 SetConsoleWindowInfo(HANDLE hConsoleOutput
,
1328 CONST SMALL_RECT
*lpConsoleWindow
)
1330 DPRINT1("SetConsoleWindowInfo(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bAbsolute
, lpConsoleWindow
);
1331 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1336 /*--------------------------------------------------------------
1337 * SetConsoleTextAttribute
1343 SetConsoleTextAttribute(HANDLE hConsoleOutput
,
1347 CONSOLE_API_MESSAGE ApiMessage
;
1349 ApiMessage
.Data
.SetTextAttribRequest
.OutputHandle
= hConsoleOutput
;
1350 ApiMessage
.Data
.SetTextAttribRequest
.Attrib
= wAttributes
;
1352 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1354 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetTextAttribute
),
1355 sizeof(CONSOLE_SETTEXTATTRIB
));
1356 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1358 BaseSetLastNTError(Status
);
1368 AddConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
1370 PHANDLER_ROUTINE
* NewCtrlHandlers
= NULL
;
1372 if (HandlerRoutine
== NULL
)
1374 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= TRUE
;
1378 if (NrCtrlHandlers
== NrAllocatedHandlers
)
1380 NewCtrlHandlers
= RtlAllocateHeap(RtlGetProcessHeap(),
1382 (NrCtrlHandlers
+ 4) * sizeof(PHANDLER_ROUTINE
));
1383 if (NewCtrlHandlers
== NULL
)
1385 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1389 memmove(NewCtrlHandlers
, CtrlHandlers
, sizeof(PHANDLER_ROUTINE
) * NrCtrlHandlers
);
1391 if (NrAllocatedHandlers
> 1) RtlFreeHeap(RtlGetProcessHeap(), 0, CtrlHandlers
);
1393 CtrlHandlers
= NewCtrlHandlers
;
1394 NrAllocatedHandlers
+= 4;
1397 ASSERT(NrCtrlHandlers
< NrAllocatedHandlers
);
1399 CtrlHandlers
[NrCtrlHandlers
++] = HandlerRoutine
;
1406 RemoveConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
1410 if (HandlerRoutine
== NULL
)
1412 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= FALSE
;
1416 for (i
= 0; i
< NrCtrlHandlers
; i
++)
1418 if (CtrlHandlers
[i
] == HandlerRoutine
)
1420 if (i
< (NrCtrlHandlers
- 1))
1422 memmove(&CtrlHandlers
[i
],
1424 (NrCtrlHandlers
- i
+ 1) * sizeof(PHANDLER_ROUTINE
));
1432 SetLastError(ERROR_INVALID_PARAMETER
);
1442 SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
,
1447 RtlEnterCriticalSection(&BaseDllDirectoryLock
);
1450 Ret
= AddConsoleCtrlHandler(HandlerRoutine
);
1454 Ret
= RemoveConsoleCtrlHandler(HandlerRoutine
);
1457 RtlLeaveCriticalSection(&BaseDllDirectoryLock
);
1462 /*--------------------------------------------------------------
1463 * GenerateConsoleCtrlEvent
1469 GenerateConsoleCtrlEvent(DWORD dwCtrlEvent
,
1470 DWORD dwProcessGroupId
)
1473 CONSOLE_API_MESSAGE ApiMessage
;
1475 if (dwCtrlEvent
!= CTRL_C_EVENT
&& dwCtrlEvent
!= CTRL_BREAK_EVENT
)
1477 SetLastError(ERROR_INVALID_PARAMETER
);
1481 ApiMessage
.Data
.GenerateCtrlEventRequest
.Event
= dwCtrlEvent
;
1482 ApiMessage
.Data
.GenerateCtrlEventRequest
.ProcessGroup
= dwProcessGroupId
;
1484 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1486 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGenerateCtrlEvent
),
1487 sizeof(CONSOLE_GENERATECTRLEVENT
));
1488 if(!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= ApiMessage
.Status
)))
1490 BaseSetLastNTError(Status
);
1499 IntGetConsoleTitle(LPVOID lpConsoleTitle
, DWORD nSize
, BOOL bUnicode
)
1502 CONSOLE_API_MESSAGE ApiMessage
;
1503 PCONSOLE_GETSETCONSOLETITLE TitleRequest
= &ApiMessage
.Data
.TitleRequest
;
1504 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1509 TitleRequest
->Length
= nSize
* (bUnicode
? 1 : sizeof(WCHAR
));
1510 CaptureBuffer
= CsrAllocateCaptureBuffer(1, TitleRequest
->Length
);
1511 if (CaptureBuffer
== NULL
)
1513 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
1514 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1518 CsrAllocateMessagePointer(CaptureBuffer
,
1519 TitleRequest
->Length
,
1520 (PVOID
*)&TitleRequest
->Title
);
1522 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1524 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetTitle
),
1525 sizeof(CONSOLE_GETSETCONSOLETITLE
));
1526 if (!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= ApiMessage
.Status
)))
1528 CsrFreeCaptureBuffer(CaptureBuffer
);
1529 BaseSetLastNTError(Status
);
1535 if (nSize
>= sizeof(WCHAR
))
1536 wcscpy((LPWSTR
)lpConsoleTitle
, TitleRequest
->Title
);
1540 if (nSize
< TitleRequest
->Length
/ sizeof(WCHAR
) ||
1541 !WideCharToMultiByte(CP_ACP
, // ANSI code page
1542 0, // performance and mapping flags
1543 TitleRequest
->Title
, // address of wide-character string
1544 -1, // number of characters in string
1545 (LPSTR
)lpConsoleTitle
, // address of buffer for new string
1546 nSize
, // size of buffer
1550 /* Yes, if the buffer isn't big enough, it returns 0... Bad API */
1551 *(LPSTR
)lpConsoleTitle
= '\0';
1552 TitleRequest
->Length
= 0;
1555 CsrFreeCaptureBuffer(CaptureBuffer
);
1557 return TitleRequest
->Length
/ sizeof(WCHAR
);
1561 /*--------------------------------------------------------------
1568 GetConsoleTitleW(LPWSTR lpConsoleTitle
,
1571 return IntGetConsoleTitle(lpConsoleTitle
, nSize
, TRUE
);
1575 /*--------------------------------------------------------------
1582 GetConsoleTitleA(LPSTR lpConsoleTitle
,
1585 return IntGetConsoleTitle(lpConsoleTitle
, nSize
, FALSE
);
1589 /*--------------------------------------------------------------
1596 SetConsoleTitleW(LPCWSTR lpConsoleTitle
)
1599 CONSOLE_API_MESSAGE ApiMessage
;
1600 PCONSOLE_GETSETCONSOLETITLE TitleRequest
= &ApiMessage
.Data
.TitleRequest
;
1601 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1603 TitleRequest
->Length
= wcslen(lpConsoleTitle
) * sizeof(WCHAR
);
1605 CaptureBuffer
= CsrAllocateCaptureBuffer(1, TitleRequest
->Length
);
1606 if (CaptureBuffer
== NULL
)
1608 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
1609 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1613 CsrCaptureMessageBuffer(CaptureBuffer
,
1614 (PVOID
)lpConsoleTitle
,
1615 TitleRequest
->Length
,
1616 (PVOID
*)&TitleRequest
->Title
);
1618 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1620 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetTitle
),
1621 sizeof(CONSOLE_GETSETCONSOLETITLE
));
1623 CsrFreeCaptureBuffer(CaptureBuffer
);
1625 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1627 BaseSetLastNTError(Status
);
1635 /*--------------------------------------------------------------
1642 SetConsoleTitleA(LPCSTR lpConsoleTitle
)
1644 ULONG Length
= strlen(lpConsoleTitle
) + 1;
1645 LPWSTR WideTitle
= HeapAlloc(GetProcessHeap(), 0, Length
* sizeof(WCHAR
));
1649 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1652 MultiByteToWideChar(CP_ACP
, 0, lpConsoleTitle
, -1, WideTitle
, Length
);
1653 Ret
= SetConsoleTitleW(WideTitle
);
1654 HeapFree(GetProcessHeap(), 0, WideTitle
);
1659 /*--------------------------------------------------------------
1660 * CreateConsoleScreenBuffer
1666 CreateConsoleScreenBuffer(DWORD dwDesiredAccess
,
1668 CONST SECURITY_ATTRIBUTES
*lpSecurityAttributes
,
1670 LPVOID lpScreenBufferData
)
1673 CONSOLE_API_MESSAGE ApiMessage
;
1675 if ( (dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
)) ||
1676 (dwShareMode
& ~(FILE_SHARE_READ
| FILE_SHARE_WRITE
)) ||
1677 (dwFlags
!= CONSOLE_TEXTMODE_BUFFER
) )
1679 SetLastError(ERROR_INVALID_PARAMETER
);
1680 return INVALID_HANDLE_VALUE
;
1683 ApiMessage
.Data
.CreateScreenBufferRequest
.Access
= dwDesiredAccess
;
1684 ApiMessage
.Data
.CreateScreenBufferRequest
.ShareMode
= dwShareMode
;
1685 ApiMessage
.Data
.CreateScreenBufferRequest
.Inheritable
=
1686 (lpSecurityAttributes
? lpSecurityAttributes
->bInheritHandle
: FALSE
);
1688 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1690 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepCreateScreenBuffer
),
1691 sizeof(CONSOLE_CREATESCREENBUFFER
));
1692 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1694 BaseSetLastNTError(Status
);
1695 return INVALID_HANDLE_VALUE
;
1698 return ApiMessage
.Data
.CreateScreenBufferRequest
.OutputHandle
;
1702 /*--------------------------------------------------------------
1712 CONSOLE_API_MESSAGE ApiMessage
;
1714 /* Get the Input Code Page */
1715 ApiMessage
.Data
.ConsoleCPRequest
.InputCP
= TRUE
;
1717 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1719 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetCP
),
1720 sizeof(CONSOLE_GETSETINPUTOUTPUTCP
));
1721 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1723 BaseSetLastNTError(Status
);
1727 return ApiMessage
.Data
.ConsoleCPRequest
.CodePage
;
1731 /*--------------------------------------------------------------
1738 SetConsoleCP(UINT wCodePageID
)
1741 CONSOLE_API_MESSAGE ApiMessage
;
1743 /* Set the Input Code Page */
1744 ApiMessage
.Data
.ConsoleCPRequest
.InputCP
= TRUE
;
1745 ApiMessage
.Data
.ConsoleCPRequest
.CodePage
= wCodePageID
;
1747 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1749 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetCP
),
1750 sizeof(CONSOLE_GETSETINPUTOUTPUTCP
));
1751 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1753 BaseSetLastNTError(Status
);
1756 return NT_SUCCESS(Status
);
1760 /*--------------------------------------------------------------
1761 * GetConsoleOutputCP
1767 GetConsoleOutputCP(VOID
)
1770 CONSOLE_API_MESSAGE ApiMessage
;
1772 /* Get the Output Code Page */
1773 ApiMessage
.Data
.ConsoleCPRequest
.InputCP
= FALSE
;
1775 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1777 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetCP
),
1778 sizeof(CONSOLE_GETSETINPUTOUTPUTCP
));
1779 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1781 BaseSetLastNTError (Status
);
1785 return ApiMessage
.Data
.ConsoleCPRequest
.CodePage
;
1789 /*--------------------------------------------------------------
1790 * SetConsoleOutputCP
1796 SetConsoleOutputCP(UINT wCodePageID
)
1799 CONSOLE_API_MESSAGE ApiMessage
;
1801 /* Set the Output Code Page */
1802 ApiMessage
.Data
.ConsoleCPRequest
.InputCP
= FALSE
;
1803 ApiMessage
.Data
.ConsoleCPRequest
.CodePage
= wCodePageID
;
1805 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1807 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetCP
),
1808 sizeof(CONSOLE_GETSETINPUTOUTPUTCP
));
1809 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1811 BaseSetLastNTError(Status
);
1814 return NT_SUCCESS(Status
);
1818 /*--------------------------------------------------------------
1819 * GetConsoleProcessList
1825 GetConsoleProcessList(LPDWORD lpdwProcessList
,
1826 DWORD dwProcessCount
)
1829 CONSOLE_API_MESSAGE ApiMessage
;
1830 PCONSOLE_GETPROCESSLIST GetProcessListRequest
= &ApiMessage
.Data
.GetProcessListRequest
;
1831 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1834 if (lpdwProcessList
== NULL
|| dwProcessCount
== 0)
1836 SetLastError(ERROR_INVALID_PARAMETER
);
1840 CaptureBuffer
= CsrAllocateCaptureBuffer(1, dwProcessCount
* sizeof(DWORD
));
1841 if (CaptureBuffer
== NULL
)
1843 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
1844 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1848 GetProcessListRequest
->nMaxIds
= dwProcessCount
;
1850 CsrAllocateMessagePointer(CaptureBuffer
,
1851 dwProcessCount
* sizeof(DWORD
),
1852 (PVOID
*)&GetProcessListRequest
->pProcessIds
);
1854 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1856 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetProcessList
),
1857 sizeof(CONSOLE_GETPROCESSLIST
));
1858 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1860 BaseSetLastNTError (Status
);
1865 nProcesses
= GetProcessListRequest
->nProcessIdsTotal
;
1866 if (dwProcessCount
>= nProcesses
)
1868 memcpy(lpdwProcessList
, GetProcessListRequest
->pProcessIds
, nProcesses
* sizeof(DWORD
));
1872 CsrFreeCaptureBuffer(CaptureBuffer
);
1877 /*--------------------------------------------------------------
1878 * GetConsoleSelectionInfo
1884 GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo
)
1887 CONSOLE_API_MESSAGE ApiMessage
;
1889 if (lpConsoleSelectionInfo
== NULL
)
1891 SetLastError(ERROR_INVALID_PARAMETER
);
1895 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1897 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetSelectionInfo
),
1898 sizeof(CONSOLE_GETSELECTIONINFO
));
1899 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1901 BaseSetLastNTError(Status
);
1905 *lpConsoleSelectionInfo
= ApiMessage
.Data
.GetSelectionInfoRequest
.Info
;
1910 /*--------------------------------------------------------------
1917 AttachConsole(DWORD dwProcessId
)
1919 DPRINT1("AttachConsole(0x%x) UNIMPLEMENTED!\n", dwProcessId
);
1924 /*--------------------------------------------------------------
1931 GetConsoleWindow(VOID
)
1934 CONSOLE_API_MESSAGE ApiMessage
;
1936 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1938 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetConsoleWindow
),
1939 sizeof(CONSOLE_GETWINDOW
));
1940 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1942 BaseSetLastNTError(Status
);
1946 return ApiMessage
.Data
.GetWindowRequest
.WindowHandle
;
1950 /*--------------------------------------------------------------
1957 SetConsoleIcon(HICON hicon
)
1960 CONSOLE_API_MESSAGE ApiMessage
;
1962 ApiMessage
.Data
.SetIconRequest
.WindowIcon
= hicon
;
1964 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1966 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetIcon
),
1967 sizeof(CONSOLE_SETICON
));
1968 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1970 BaseSetLastNTError(Status
);
1974 return NT_SUCCESS(Status
);
1978 /******************************************************************************
1979 * \name SetConsoleInputExeNameW
1980 * \brief Sets the console input file name from a unicode string.
1981 * \param lpInputExeName Pointer to a unicode string with the name.
1982 * \return TRUE if successful, FALSE if unsuccsedful.
1983 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
1984 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
1988 SetConsoleInputExeNameW(LPCWSTR lpInputExeName
)
1993 || (lenName
= lstrlenW(lpInputExeName
)) == 0
1994 || lenName
> INPUTEXENAME_BUFLEN
- 1)
1996 /* Fail if string is empty or too long */
1997 SetLastError(ERROR_INVALID_PARAMETER
);
2001 RtlEnterCriticalSection(&ConsoleLock
);
2004 RtlCopyMemory(InputExeName
, lpInputExeName
, lenName
* sizeof(WCHAR
));
2005 InputExeName
[lenName
] = L
'\0';
2009 RtlLeaveCriticalSection(&ConsoleLock
);
2017 /******************************************************************************
2018 * \name SetConsoleInputExeNameA
2019 * \brief Sets the console input file name from an ansi string.
2020 * \param lpInputExeName Pointer to an ansi string with the name.
2021 * \return TRUE if successful, FALSE if unsuccsedful.
2022 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
2023 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
2027 SetConsoleInputExeNameA(LPCSTR lpInputExeName
)
2029 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
2030 ANSI_STRING InputExeNameA
;
2031 UNICODE_STRING InputExeNameU
;
2035 RtlInitAnsiString(&InputExeNameA
, lpInputExeName
);
2037 if(InputExeNameA
.Length
== 0 ||
2038 InputExeNameA
.Length
> INPUTEXENAME_BUFLEN
- 1)
2040 /* Fail if string is empty or too long */
2041 SetLastError(ERROR_INVALID_PARAMETER
);
2045 InputExeNameU
.Buffer
= Buffer
;
2046 InputExeNameU
.MaximumLength
= sizeof(Buffer
);
2047 InputExeNameU
.Length
= 0;
2048 Status
= RtlAnsiStringToUnicodeString(&InputExeNameU
, &InputExeNameA
, FALSE
);
2049 if(NT_SUCCESS(Status
))
2051 Ret
= SetConsoleInputExeNameW(InputExeNameU
.Buffer
);
2055 BaseSetLastNTError(Status
);
2063 /******************************************************************************
2064 * \name GetConsoleInputExeNameW
2065 * \brief Retrieves the console input file name as unicode string.
2066 * \param nBufferLength Length of the buffer in WCHARs.
2067 * Specify 0 to recieve the needed buffer length.
2068 * \param lpBuffer Pointer to a buffer that recieves the string.
2069 * \return Needed buffer size if \p nBufferLength is 0.
2070 * Otherwise 1 if successful, 2 if buffer is too small.
2071 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
2072 * is not big enough.
2076 GetConsoleInputExeNameW(DWORD nBufferLength
, LPWSTR lpBuffer
)
2078 int lenName
= lstrlenW(InputExeName
);
2080 if (nBufferLength
== 0)
2082 /* Buffer size is requested, return it */
2086 if(lenName
+ 1 > nBufferLength
)
2088 /* Buffer is not large enough! */
2089 SetLastError(ERROR_BUFFER_OVERFLOW
);
2093 RtlEnterCriticalSection(&ConsoleLock
);
2096 RtlCopyMemory(lpBuffer
, InputExeName
, lenName
* sizeof(WCHAR
));
2097 lpBuffer
[lenName
] = '\0';
2101 RtlLeaveCriticalSection(&ConsoleLock
);
2105 /* Success, return 1 */
2110 /******************************************************************************
2111 * \name GetConsoleInputExeNameA
2112 * \brief Retrieves the console input file name as ansi string.
2113 * \param nBufferLength Length of the buffer in CHARs.
2114 * \param lpBuffer Pointer to a buffer that recieves the string.
2115 * \return 1 if successful, 2 if buffer is too small.
2116 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
2117 * is not big enough. The buffer recieves as much characters as fit.
2121 GetConsoleInputExeNameA(DWORD nBufferLength
, LPSTR lpBuffer
)
2123 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
2125 UNICODE_STRING BufferU
;
2126 ANSI_STRING BufferA
;
2128 /* Get the unicode name */
2129 Ret
= GetConsoleInputExeNameW(sizeof(Buffer
) / sizeof(Buffer
[0]), Buffer
);
2131 /* Initialize strings for conversion */
2132 RtlInitUnicodeString(&BufferU
, Buffer
);
2134 BufferA
.MaximumLength
= nBufferLength
;
2135 BufferA
.Buffer
= lpBuffer
;
2137 /* Convert unicode name to ansi, copying as much chars as fit */
2138 RtlUnicodeStringToAnsiString(&BufferA
, &BufferU
, FALSE
);
2140 /* Error handling */
2141 if(nBufferLength
<= BufferU
.Length
/ sizeof(WCHAR
))
2143 SetLastError(ERROR_BUFFER_OVERFLOW
);
2152 GetConsoleCharType(HANDLE hConsole
, COORD Coord
, PDWORD Type
)
2160 GetConsoleCursorMode(HANDLE hConsole
, PBOOL pUnknown1
, PBOOL pUnknown2
)
2168 GetConsoleNlsMode(HANDLE hConsole
, LPDWORD lpMode
)
2176 SetConsoleCursorMode(HANDLE hConsole
, BOOL Unknown1
, BOOL Unknown2
)
2184 SetConsoleLocalEUDC(DWORD Unknown1
, DWORD Unknown2
, DWORD Unknown3
, DWORD Unknown4
)
2192 SetConsoleNlsMode(HANDLE hConsole
, DWORD dwMode
)
2200 RegisterConsoleIME(HWND hWnd
, LPDWORD ThreadId
)
2208 RegisterConsoleOS2(BOOL bUnknown
)
2216 SetConsoleOS2OemFormat(BOOL bUnknown
)
2224 UnregisterConsoleIME(VOID
)
2234 BOOL WINAPI
GetConsoleKeyboardLayoutNameA(LPSTR name
)
2243 BOOL WINAPI
GetConsoleKeyboardLayoutNameW(LPWSTR name
)
2254 SetLastConsoleEventActive(VOID
)