2012-11-15 16:29:21 +00:00
|
|
|
/*
|
1999-03-06 10:57:02 +00:00
|
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
|
|
* PROJECT: ReactOS system libraries
|
2012-11-15 16:29:21 +00:00
|
|
|
* FILE: dll/win32/kernel32/client/console/console.c
|
1999-03-06 10:57:02 +00:00
|
|
|
* PURPOSE: Win32 server console functions
|
2005-05-09 01:46:57 +00:00
|
|
|
* PROGRAMMER: James Tabor
|
2012-11-15 16:29:21 +00:00
|
|
|
* <jimtabor@adsl-64-217-116-74.dsl.hstntx.swbell.net>
|
1999-03-06 10:57:02 +00:00
|
|
|
* UPDATE HISTORY:
|
2009-01-30 14:25:00 +00:00
|
|
|
* 199901?? ?? Created
|
|
|
|
* 19990204 EA SetConsoleTitleA
|
2012-11-15 16:29:21 +00:00
|
|
|
* 19990306 EA Stubs
|
1999-03-06 10:57:02 +00:00
|
|
|
*/
|
1999-12-26 15:50:53 +00:00
|
|
|
|
2012-11-15 16:29:21 +00:00
|
|
|
/* INCLUDES *******************************************************************/
|
1999-12-26 15:50:53 +00:00
|
|
|
|
2003-01-15 21:24:36 +00:00
|
|
|
#include <k32.h>
|
2000-03-22 18:36:00 +00:00
|
|
|
|
2012-11-15 16:29:21 +00:00
|
|
|
// #define NDEBUG
|
2007-09-02 19:42:22 +00:00
|
|
|
#include <debug.h>
|
1999-03-30 21:58:05 +00:00
|
|
|
|
2005-01-03 23:02:15 +00:00
|
|
|
extern RTL_CRITICAL_SECTION ConsoleLock;
|
2008-07-30 15:00:57 +00:00
|
|
|
extern BOOL ConsoleInitialized;
|
2003-08-16 17:37:51 +00:00
|
|
|
extern BOOL WINAPI IsDebuggerPresent(VOID);
|
2003-08-13 06:53:54 +00:00
|
|
|
|
2012-11-15 16:29:21 +00:00
|
|
|
/* GLOBALS ********************************************************************/
|
2001-04-04 22:21:32 +00:00
|
|
|
|
2010-03-09 20:13:19 +00:00
|
|
|
PHANDLER_ROUTINE InitialHandler[1];
|
|
|
|
PHANDLER_ROUTINE* CtrlHandlers;
|
|
|
|
ULONG NrCtrlHandlers;
|
|
|
|
ULONG NrAllocatedHandlers;
|
|
|
|
|
2009-01-19 17:08:47 +00:00
|
|
|
#define INPUTEXENAME_BUFLEN 256
|
2011-11-11 12:22:05 +00:00
|
|
|
static WCHAR InputExeName[INPUTEXENAME_BUFLEN];
|
2001-04-04 22:21:32 +00:00
|
|
|
|
2012-11-15 16:29:21 +00:00
|
|
|
/* Default Console Control Handler ********************************************/
|
2003-08-09 04:13:24 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
DefaultConsoleCtrlHandler(DWORD Event)
|
|
|
|
{
|
2010-03-10 06:50:15 +00:00
|
|
|
DPRINT("Default handler called: %lx\n", Event);
|
2009-01-30 14:25:00 +00:00
|
|
|
switch(Event)
|
|
|
|
{
|
|
|
|
case CTRL_C_EVENT:
|
|
|
|
DPRINT("Ctrl-C Event\n");
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CTRL_BREAK_EVENT:
|
|
|
|
DPRINT("Ctrl-Break Event\n");
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CTRL_SHUTDOWN_EVENT:
|
2010-03-10 06:50:15 +00:00
|
|
|
DPRINT("Ctrl Shutdown Event\n");
|
2009-01-30 14:25:00 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case CTRL_CLOSE_EVENT:
|
|
|
|
DPRINT("Ctrl Close Event\n");
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CTRL_LOGOFF_EVENT:
|
2010-03-10 06:50:15 +00:00
|
|
|
DPRINT("Ctrl Logoff Event\n");
|
2009-01-30 14:25:00 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2010-03-09 20:13:19 +00:00
|
|
|
ExitProcess(CONTROL_C_EXIT);
|
2009-01-30 14:25:00 +00:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
__declspec(noreturn)
|
|
|
|
VOID
|
|
|
|
CALLBACK
|
|
|
|
ConsoleControlDispatcher(DWORD CodeAndFlag)
|
|
|
|
{
|
|
|
|
DWORD nExitCode = 0;
|
|
|
|
DWORD nCode = CodeAndFlag & MAXLONG;
|
|
|
|
UINT i;
|
2010-03-09 20:13:19 +00:00
|
|
|
EXCEPTION_RECORD erException;
|
2010-03-10 03:32:17 +00:00
|
|
|
|
2010-03-10 06:50:15 +00:00
|
|
|
DPRINT("Console Dispatcher Active: %lx %lx\n", CodeAndFlag, nCode);
|
2009-01-30 14:25:00 +00:00
|
|
|
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
|
|
|
|
|
|
|
|
switch(nCode)
|
|
|
|
{
|
|
|
|
case CTRL_C_EVENT:
|
|
|
|
case CTRL_BREAK_EVENT:
|
|
|
|
{
|
2010-03-09 20:13:19 +00:00
|
|
|
if (IsDebuggerPresent())
|
2009-01-30 14:25:00 +00:00
|
|
|
{
|
2010-03-09 20:13:19 +00:00
|
|
|
erException.ExceptionCode = (nCode == CTRL_C_EVENT ?
|
|
|
|
DBG_CONTROL_C : DBG_CONTROL_BREAK);
|
2009-01-30 14:25:00 +00:00
|
|
|
erException.ExceptionFlags = 0;
|
|
|
|
erException.ExceptionRecord = NULL;
|
2010-03-09 20:13:19 +00:00
|
|
|
erException.ExceptionAddress = DefaultConsoleCtrlHandler;
|
2009-01-30 14:25:00 +00:00
|
|
|
erException.NumberParameters = 0;
|
2010-03-09 20:13:19 +00:00
|
|
|
|
|
|
|
_SEH2_TRY
|
|
|
|
{
|
|
|
|
RtlRaiseException(&erException);
|
|
|
|
}
|
|
|
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
|
|
|
{
|
|
|
|
RtlEnterCriticalSection(&ConsoleLock);
|
|
|
|
|
|
|
|
if ((nCode != CTRL_C_EVENT) ||
|
|
|
|
(NtCurrentPeb()->ProcessParameters->ConsoleFlags != 1))
|
|
|
|
{
|
|
|
|
for (i = NrCtrlHandlers; i > 0; i--)
|
|
|
|
{
|
|
|
|
if (CtrlHandlers[i - 1](nCode)) break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
RtlLeaveCriticalSection(&ConsoleLock);
|
|
|
|
}
|
|
|
|
_SEH2_END;
|
|
|
|
|
|
|
|
ExitThread(0);
|
2009-01-30 14:25:00 +00:00
|
|
|
}
|
2010-03-09 20:13:19 +00:00
|
|
|
|
|
|
|
break;
|
2009-01-30 14:25:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
case CTRL_CLOSE_EVENT:
|
|
|
|
case CTRL_LOGOFF_EVENT:
|
|
|
|
case CTRL_SHUTDOWN_EVENT:
|
|
|
|
break;
|
2010-03-09 20:13:19 +00:00
|
|
|
|
|
|
|
case 3:
|
|
|
|
|
|
|
|
ExitThread(0);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 4:
|
|
|
|
|
|
|
|
ExitProcess(CONTROL_C_EXIT);
|
|
|
|
break;
|
2009-01-30 14:25:00 +00:00
|
|
|
|
2010-03-09 20:13:19 +00:00
|
|
|
default:
|
|
|
|
|
|
|
|
ASSERT(FALSE);
|
|
|
|
break;
|
2009-01-30 14:25:00 +00:00
|
|
|
}
|
2010-03-09 20:13:19 +00:00
|
|
|
|
|
|
|
ASSERT(ConsoleInitialized);
|
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
RtlEnterCriticalSection(&ConsoleLock);
|
2010-03-09 20:13:19 +00:00
|
|
|
nExitCode = 0;
|
|
|
|
if ((nCode != CTRL_C_EVENT) || (NtCurrentPeb()->ProcessParameters->ConsoleFlags != 1))
|
2009-01-30 14:25:00 +00:00
|
|
|
{
|
2010-03-09 20:13:19 +00:00
|
|
|
for (i = NrCtrlHandlers; i > 0; i--)
|
2009-01-30 14:25:00 +00:00
|
|
|
{
|
2010-03-09 20:13:19 +00:00
|
|
|
if ((i == 1) &&
|
|
|
|
(CodeAndFlag & MINLONG) &&
|
|
|
|
((nCode == CTRL_LOGOFF_EVENT) || (nCode == CTRL_SHUTDOWN_EVENT)))
|
|
|
|
{
|
2010-03-10 06:50:15 +00:00
|
|
|
DPRINT("Skipping system/service apps\n");
|
2009-01-30 14:25:00 +00:00
|
|
|
break;
|
2010-03-09 20:13:19 +00:00
|
|
|
}
|
2009-01-30 14:25:00 +00:00
|
|
|
|
|
|
|
if (CtrlHandlers[i - 1](nCode))
|
|
|
|
{
|
|
|
|
switch(nCode)
|
|
|
|
{
|
|
|
|
case CTRL_CLOSE_EVENT:
|
|
|
|
case CTRL_LOGOFF_EVENT:
|
|
|
|
case CTRL_SHUTDOWN_EVENT:
|
2010-03-09 20:13:19 +00:00
|
|
|
case 3:
|
2009-01-30 14:25:00 +00:00
|
|
|
nExitCode = CodeAndFlag;
|
2010-03-09 20:13:19 +00:00
|
|
|
break;
|
2009-01-30 14:25:00 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2010-03-09 20:13:19 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
RtlLeaveCriticalSection(&ConsoleLock);
|
|
|
|
ExitThread(nExitCode);
|
2003-08-16 17:37:51 +00:00
|
|
|
}
|
|
|
|
|
2010-06-05 00:45:08 +00:00
|
|
|
/* Get the size needed to copy a string to a capture buffer, including alignment */
|
|
|
|
static ULONG
|
|
|
|
IntStringSize(LPCVOID String,
|
|
|
|
BOOL Unicode)
|
|
|
|
{
|
|
|
|
ULONG Size = (Unicode ? wcslen(String) : strlen(String)) * sizeof(WCHAR);
|
|
|
|
return (Size + 3) & -4;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Copy a string to a capture buffer */
|
|
|
|
static VOID
|
|
|
|
IntCaptureMessageString(PCSR_CAPTURE_BUFFER CaptureBuffer,
|
|
|
|
LPCVOID String,
|
|
|
|
BOOL Unicode,
|
|
|
|
PUNICODE_STRING RequestString)
|
|
|
|
{
|
|
|
|
ULONG Size;
|
|
|
|
if (Unicode)
|
|
|
|
{
|
|
|
|
Size = wcslen(String) * sizeof(WCHAR);
|
|
|
|
CsrCaptureMessageBuffer(CaptureBuffer, (PVOID)String, Size, (PVOID *)&RequestString->Buffer);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Size = strlen(String);
|
|
|
|
CsrAllocateMessagePointer(CaptureBuffer, Size * sizeof(WCHAR), (PVOID *)&RequestString->Buffer);
|
|
|
|
Size = MultiByteToWideChar(CP_ACP, 0, String, Size, RequestString->Buffer, Size * sizeof(WCHAR))
|
|
|
|
* sizeof(WCHAR);
|
|
|
|
}
|
|
|
|
RequestString->Length = RequestString->MaximumLength = Size;
|
|
|
|
}
|
2003-08-16 17:37:51 +00:00
|
|
|
|
2012-11-15 16:51:29 +00:00
|
|
|
/* FUNCTIONS ******************************************************************/
|
2003-07-10 18:50:51 +00:00
|
|
|
|
|
|
|
/*
|
2009-01-30 14:25:00 +00:00
|
|
|
* @unimplemented (Undocumented)
|
2003-07-10 18:50:51 +00:00
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
ConsoleMenuControl(HANDLE hConsole,
|
|
|
|
DWORD Unknown1,
|
|
|
|
DWORD Unknown2)
|
2001-03-31 01:17:30 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
DPRINT1("ConsoleMenuControl(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsole, Unknown1, Unknown2);
|
|
|
|
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
|
|
return FALSE;
|
2001-03-31 01:17:30 +00:00
|
|
|
}
|
|
|
|
|
2003-07-10 18:50:51 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
HANDLE
|
|
|
|
WINAPI
|
|
|
|
DuplicateConsoleHandle(HANDLE hConsole,
|
|
|
|
DWORD dwDesiredAccess,
|
|
|
|
BOOL bInheritHandle,
|
|
|
|
DWORD dwOptions)
|
2001-03-31 01:17:30 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
|
|
|
NTSTATUS Status;
|
2003-03-09 21:37:18 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
if (dwOptions & ~(DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)
|
|
|
|
|| (!(dwOptions & DUPLICATE_SAME_ACCESS)
|
|
|
|
&& dwDesiredAccess & ~(GENERIC_READ | GENERIC_WRITE)))
|
2003-03-09 21:37:18 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
SetLastError (ERROR_INVALID_PARAMETER);
|
|
|
|
return INVALID_HANDLE_VALUE;
|
2003-03-09 21:37:18 +00:00
|
|
|
}
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
Request.Data.DuplicateHandleRequest.Handle = hConsole;
|
|
|
|
Request.Data.DuplicateHandleRequest.Access = dwDesiredAccess;
|
|
|
|
Request.Data.DuplicateHandleRequest.Inheritable = bInheritHandle;
|
|
|
|
Request.Data.DuplicateHandleRequest.Options = dwOptions;
|
|
|
|
|
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
2012-10-17 23:10:40 +00:00
|
|
|
CSR_CREATE_API_NUMBER(CSR_NATIVE, DUPLICATE_HANDLE),
|
2009-01-30 14:25:00 +00:00
|
|
|
sizeof(CSR_API_MESSAGE));
|
|
|
|
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status=Request.Status))
|
2003-03-09 21:37:18 +00:00
|
|
|
{
|
2011-07-23 18:54:29 +00:00
|
|
|
BaseSetLastNTError(Status);
|
2009-01-30 14:25:00 +00:00
|
|
|
return INVALID_HANDLE_VALUE;
|
2003-03-09 21:37:18 +00:00
|
|
|
}
|
2009-01-30 14:25:00 +00:00
|
|
|
|
|
|
|
return Request.Data.DuplicateHandleRequest.Handle;
|
2001-03-31 01:17:30 +00:00
|
|
|
}
|
|
|
|
|
2003-07-10 18:50:51 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* @unimplemented
|
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
INT
|
|
|
|
WINAPI
|
|
|
|
GetConsoleDisplayMode(LPDWORD lpdwMode)
|
2001-04-04 22:21:32 +00:00
|
|
|
/*
|
|
|
|
* FUNCTION: Get the console display mode
|
|
|
|
* ARGUMENTS:
|
|
|
|
* lpdwMode - Address of variable that receives the current value
|
|
|
|
* of display mode
|
|
|
|
* STATUS: Undocumented
|
|
|
|
*/
|
2001-03-31 01:17:30 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
DPRINT1("GetConsoleDisplayMode(0x%x) UNIMPLEMENTED!\n", lpdwMode);
|
|
|
|
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
|
|
return 0;
|
2001-03-31 01:17:30 +00:00
|
|
|
}
|
|
|
|
|
2003-07-10 18:50:51 +00:00
|
|
|
|
|
|
|
/*
|
2009-01-30 14:25:00 +00:00
|
|
|
* @unimplemented (Undocumented)
|
2003-07-10 18:50:51 +00:00
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
DWORD
|
|
|
|
WINAPI
|
|
|
|
GetConsoleFontInfo(DWORD Unknown0,
|
|
|
|
DWORD Unknown1,
|
|
|
|
DWORD Unknown2,
|
|
|
|
DWORD Unknown3)
|
2001-03-31 01:17:30 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
DPRINT1("GetConsoleFontInfo(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1, Unknown2, Unknown3);
|
|
|
|
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
|
|
return 0;
|
2001-03-31 01:17:30 +00:00
|
|
|
}
|
|
|
|
|
2003-07-10 18:50:51 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* @unimplemented
|
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
COORD
|
|
|
|
WINAPI
|
2002-08-22 15:21:57 +00:00
|
|
|
GetConsoleFontSize(HANDLE hConsoleOutput,
|
2009-01-30 14:25:00 +00:00
|
|
|
DWORD nFont)
|
2001-03-31 01:17:30 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
COORD Empty = {0, 0};
|
|
|
|
DPRINT1("GetConsoleFontSize(0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput, nFont);
|
|
|
|
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
|
|
return Empty;
|
2001-03-31 01:17:30 +00:00
|
|
|
}
|
|
|
|
|
2003-07-10 18:50:51 +00:00
|
|
|
|
|
|
|
/*
|
2009-01-30 14:25:00 +00:00
|
|
|
* @implemented (Undocumented)
|
2003-07-10 18:50:51 +00:00
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
DWORD
|
|
|
|
WINAPI
|
|
|
|
GetConsoleHardwareState(HANDLE hConsole,
|
|
|
|
DWORD Flags,
|
|
|
|
PDWORD State)
|
2001-03-31 01:17:30 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
|
|
|
NTSTATUS Status;
|
2009-01-07 10:23:29 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
Request.Data.ConsoleHardwareStateRequest.ConsoleHandle = hConsole;
|
|
|
|
Request.Data.ConsoleHardwareStateRequest.SetGet = CONSOLE_HARDWARE_STATE_GET;
|
2003-06-19 19:38:26 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
2012-10-17 23:10:40 +00:00
|
|
|
CSR_CREATE_API_NUMBER(CSR_CONSOLE, SETGET_CONSOLE_HW_STATE),
|
2009-01-30 14:25:00 +00:00
|
|
|
sizeof(CSR_API_MESSAGE));
|
|
|
|
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
|
|
|
{
|
2011-07-23 18:54:29 +00:00
|
|
|
BaseSetLastNTError(Status);
|
2009-01-30 14:25:00 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2003-06-19 19:38:26 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
*State = Request.Data.ConsoleHardwareStateRequest.State;
|
|
|
|
return TRUE;
|
2001-03-31 01:17:30 +00:00
|
|
|
}
|
|
|
|
|
2003-07-10 18:50:51 +00:00
|
|
|
|
|
|
|
/*
|
2009-01-30 14:25:00 +00:00
|
|
|
* @implemented (Undocumented)
|
2003-07-10 18:50:51 +00:00
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
HANDLE
|
|
|
|
WINAPI
|
|
|
|
GetConsoleInputWaitHandle(VOID)
|
2001-03-31 01:17:30 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
|
|
|
NTSTATUS Status;
|
2009-01-07 10:23:29 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
2012-10-17 23:10:40 +00:00
|
|
|
CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_INPUT_WAIT_HANDLE),
|
2009-01-30 14:25:00 +00:00
|
|
|
sizeof(CSR_API_MESSAGE));
|
|
|
|
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
2004-11-14 18:47:10 +00:00
|
|
|
{
|
2011-07-23 18:54:29 +00:00
|
|
|
BaseSetLastNTError(Status);
|
2009-01-30 14:25:00 +00:00
|
|
|
return 0;
|
2004-11-14 18:47:10 +00:00
|
|
|
}
|
2009-01-30 14:25:00 +00:00
|
|
|
|
|
|
|
return Request.Data.GetConsoleInputWaitHandle.InputWaitHandle;
|
2001-03-31 01:17:30 +00:00
|
|
|
}
|
|
|
|
|
2003-07-10 18:50:51 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* @unimplemented
|
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
INT
|
|
|
|
WINAPI
|
2002-08-22 15:21:57 +00:00
|
|
|
GetCurrentConsoleFont(HANDLE hConsoleOutput,
|
2009-01-30 14:25:00 +00:00
|
|
|
BOOL bMaximumWindow,
|
|
|
|
PCONSOLE_FONT_INFO lpConsoleCurrentFont)
|
2001-03-31 01:17:30 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
DPRINT1("GetCurrentConsoleFont(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput, bMaximumWindow, lpConsoleCurrentFont);
|
|
|
|
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
|
|
return 0;
|
2001-03-31 01:17:30 +00:00
|
|
|
}
|
|
|
|
|
2003-07-10 18:50:51 +00:00
|
|
|
|
|
|
|
/*
|
2009-01-30 14:25:00 +00:00
|
|
|
* @unimplemented (Undocumented)
|
2003-07-10 18:50:51 +00:00
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
ULONG
|
|
|
|
WINAPI
|
|
|
|
GetNumberOfConsoleFonts(VOID)
|
2001-03-31 01:17:30 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
DPRINT1("GetNumberOfConsoleFonts() UNIMPLEMENTED!\n");
|
|
|
|
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
|
|
return 1; /* FIXME: call csrss.exe */
|
2001-03-31 01:17:30 +00:00
|
|
|
}
|
|
|
|
|
2003-07-10 18:50:51 +00:00
|
|
|
|
|
|
|
/*
|
2009-01-30 14:25:00 +00:00
|
|
|
* @unimplemented (Undocumented)
|
2003-07-10 18:50:51 +00:00
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
DWORD
|
|
|
|
WINAPI
|
|
|
|
InvalidateConsoleDIBits(DWORD Unknown0,
|
|
|
|
DWORD Unknown1)
|
2001-03-31 01:17:30 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
DPRINT1("InvalidateConsoleDIBits(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1);
|
|
|
|
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
|
|
return 0;
|
2001-03-31 01:17:30 +00:00
|
|
|
}
|
|
|
|
|
2003-07-10 18:50:51 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
/*
|
|
|
|
* @unimplemented (Undocumented)
|
|
|
|
*/
|
|
|
|
HANDLE
|
|
|
|
WINAPI
|
|
|
|
OpenConsoleW(LPCWSTR wsName,
|
|
|
|
DWORD dwDesiredAccess,
|
|
|
|
BOOL bInheritHandle,
|
|
|
|
DWORD dwShareMode)
|
|
|
|
{
|
|
|
|
CSR_API_MESSAGE Request;
|
|
|
|
ULONG CsrRequest;
|
|
|
|
NTSTATUS Status = STATUS_SUCCESS;
|
|
|
|
|
2010-05-16 07:03:03 +00:00
|
|
|
if (wsName && 0 == _wcsicmp(wsName, L"CONIN$"))
|
2009-01-30 14:25:00 +00:00
|
|
|
{
|
2012-10-17 23:10:40 +00:00
|
|
|
CsrRequest = CSR_CREATE_API_NUMBER(CSR_NATIVE, GET_INPUT_HANDLE);
|
2009-01-30 14:25:00 +00:00
|
|
|
}
|
2010-05-16 07:03:03 +00:00
|
|
|
else if (wsName && 0 == _wcsicmp(wsName, L"CONOUT$"))
|
2009-01-30 14:25:00 +00:00
|
|
|
{
|
2012-10-17 23:10:40 +00:00
|
|
|
CsrRequest = CSR_CREATE_API_NUMBER(CSR_NATIVE, GET_OUTPUT_HANDLE);
|
2009-01-30 14:25:00 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
|
|
return(INVALID_HANDLE_VALUE);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (dwDesiredAccess & ~(GENERIC_READ|GENERIC_WRITE))
|
|
|
|
{
|
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
|
|
return(INVALID_HANDLE_VALUE);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (dwShareMode & ~(FILE_SHARE_READ|FILE_SHARE_WRITE))
|
|
|
|
{
|
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
|
|
return(INVALID_HANDLE_VALUE);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Structures for GET_INPUT_HANDLE and GET_OUTPUT_HANDLE requests are identical */
|
|
|
|
Request.Data.GetInputHandleRequest.Access = dwDesiredAccess;
|
|
|
|
Request.Data.GetInputHandleRequest.Inheritable = bInheritHandle;
|
2010-05-23 09:10:02 +00:00
|
|
|
Request.Data.GetInputHandleRequest.ShareMode = dwShareMode;
|
2009-01-07 10:23:29 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
|
|
|
CsrRequest,
|
|
|
|
sizeof(CSR_API_MESSAGE));
|
|
|
|
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
|
|
|
{
|
2011-07-23 18:54:29 +00:00
|
|
|
BaseSetLastNTError(Status);
|
2009-01-30 14:25:00 +00:00
|
|
|
return INVALID_HANDLE_VALUE;
|
|
|
|
}
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2010-05-23 09:10:02 +00:00
|
|
|
return Request.Data.GetInputHandleRequest.Handle;
|
2001-03-31 01:17:30 +00:00
|
|
|
}
|
|
|
|
|
2003-07-10 18:50:51 +00:00
|
|
|
|
|
|
|
/*
|
2009-01-30 14:25:00 +00:00
|
|
|
* @unimplemented (Undocumented)
|
2003-07-10 18:50:51 +00:00
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
SetConsoleCursor(DWORD Unknown0,
|
|
|
|
DWORD Unknown1)
|
2001-03-31 01:17:30 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
DPRINT1("SetConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1);
|
|
|
|
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
|
|
return FALSE;
|
2001-03-31 01:17:30 +00:00
|
|
|
}
|
|
|
|
|
2003-07-10 18:50:51 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* @unimplemented
|
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
SetConsoleDisplayMode(HANDLE hOut,
|
|
|
|
DWORD dwNewMode,
|
|
|
|
PCOORD lpdwOldMode)
|
2001-04-04 22:21:32 +00:00
|
|
|
/*
|
|
|
|
* FUNCTION: Set the console display mode.
|
|
|
|
* ARGUMENTS:
|
|
|
|
* hOut - Standard output handle.
|
|
|
|
* dwNewMode - New mode.
|
|
|
|
* lpdwOldMode - Address of a variable that receives the old mode.
|
|
|
|
*/
|
2001-03-31 01:17:30 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
DPRINT1("SetConsoleDisplayMode(0x%x, 0x%x, 0x%p) UNIMPLEMENTED!\n", hOut, dwNewMode, lpdwOldMode);
|
|
|
|
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
|
|
return FALSE;
|
2001-03-31 01:17:30 +00:00
|
|
|
}
|
|
|
|
|
2003-07-10 18:50:51 +00:00
|
|
|
|
|
|
|
/*
|
2009-01-30 14:25:00 +00:00
|
|
|
* @unimplemented (Undocumented)
|
2003-07-10 18:50:51 +00:00
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
SetConsoleFont(DWORD Unknown0,
|
|
|
|
DWORD Unknown1)
|
2001-03-31 01:17:30 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
DPRINT1("SetConsoleFont(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1);
|
|
|
|
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
|
|
return FALSE;
|
2001-03-31 01:17:30 +00:00
|
|
|
}
|
|
|
|
|
2003-07-10 18:50:51 +00:00
|
|
|
|
|
|
|
/*
|
2009-01-30 14:25:00 +00:00
|
|
|
* @implemented (Undocumented)
|
2003-07-10 18:50:51 +00:00
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
SetConsoleHardwareState(HANDLE hConsole,
|
|
|
|
DWORD Flags,
|
|
|
|
DWORD State)
|
2001-03-31 01:17:30 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
|
|
|
NTSTATUS Status;
|
2009-01-07 10:23:29 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
Request.Data.ConsoleHardwareStateRequest.ConsoleHandle = hConsole;
|
|
|
|
Request.Data.ConsoleHardwareStateRequest.SetGet = CONSOLE_HARDWARE_STATE_SET;
|
|
|
|
Request.Data.ConsoleHardwareStateRequest.State = State;
|
2003-06-19 19:38:26 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
2012-10-17 23:10:40 +00:00
|
|
|
CSR_CREATE_API_NUMBER(CSR_CONSOLE, SETGET_CONSOLE_HW_STATE),
|
2009-01-30 14:25:00 +00:00
|
|
|
sizeof(CSR_API_MESSAGE));
|
|
|
|
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
|
|
|
{
|
2011-07-23 18:54:29 +00:00
|
|
|
BaseSetLastNTError(Status);
|
2009-01-30 14:25:00 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2003-06-19 19:38:26 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
return TRUE;
|
2001-03-31 01:17:30 +00:00
|
|
|
}
|
|
|
|
|
2003-07-10 18:50:51 +00:00
|
|
|
|
|
|
|
/*
|
2009-01-30 14:25:00 +00:00
|
|
|
* @unimplemented (Undocumented)
|
2003-07-10 18:50:51 +00:00
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
SetConsoleKeyShortcuts(DWORD Unknown0,
|
|
|
|
DWORD Unknown1,
|
|
|
|
DWORD Unknown2,
|
|
|
|
DWORD Unknown3)
|
2001-03-31 01:17:30 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
DPRINT1("SetConsoleKeyShortcuts(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1, Unknown2, Unknown3);
|
|
|
|
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
|
|
return FALSE;
|
2001-03-31 01:17:30 +00:00
|
|
|
}
|
|
|
|
|
2003-07-10 18:50:51 +00:00
|
|
|
|
|
|
|
/*
|
2009-01-30 14:25:00 +00:00
|
|
|
* @unimplemented (Undocumented)
|
2003-07-10 18:50:51 +00:00
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
SetConsoleMaximumWindowSize(DWORD Unknown0,
|
|
|
|
DWORD Unknown1)
|
2001-03-31 01:17:30 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
DPRINT1("SetConsoleMaximumWindowSize(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1);
|
|
|
|
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
|
|
return FALSE;
|
2001-03-31 01:17:30 +00:00
|
|
|
}
|
|
|
|
|
2003-07-10 18:50:51 +00:00
|
|
|
|
|
|
|
/*
|
2009-01-30 14:25:00 +00:00
|
|
|
* @unimplemented (Undocumented)
|
2003-07-10 18:50:51 +00:00
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
SetConsoleMenuClose(DWORD Unknown0)
|
2001-03-31 01:17:30 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
DPRINT1("SetConsoleMenuClose(0x%x) UNIMPLEMENTED!\n", Unknown0);
|
|
|
|
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
|
|
return FALSE;
|
2001-03-31 01:17:30 +00:00
|
|
|
}
|
|
|
|
|
2003-07-10 18:50:51 +00:00
|
|
|
|
|
|
|
/*
|
2009-01-30 14:25:00 +00:00
|
|
|
* @unimplemented (Undocumented)
|
2003-07-10 18:50:51 +00:00
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
SetConsolePalette(DWORD Unknown0,
|
|
|
|
DWORD Unknown1,
|
|
|
|
DWORD Unknown2)
|
2001-03-31 01:17:30 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
DPRINT1("SetConsolePalette(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1, Unknown2);
|
|
|
|
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
|
|
return FALSE;
|
2001-03-31 01:17:30 +00:00
|
|
|
}
|
|
|
|
|
2003-07-10 18:50:51 +00:00
|
|
|
/*
|
2009-01-30 14:25:00 +00:00
|
|
|
* @unimplemented (Undocumented)
|
2003-07-10 18:50:51 +00:00
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
DWORD
|
|
|
|
WINAPI
|
|
|
|
ShowConsoleCursor(DWORD Unknown0,
|
|
|
|
DWORD Unknown1)
|
2001-03-31 01:17:30 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
DPRINT1("ShowConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1);
|
|
|
|
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
|
|
return 0;
|
2001-03-31 01:17:30 +00:00
|
|
|
}
|
|
|
|
|
2003-03-05 22:51:48 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* FUNCTION: Checks whether the given handle is a valid console handle.
|
|
|
|
* ARGUMENTS:
|
|
|
|
* Handle - Handle to be checked
|
|
|
|
* RETURNS:
|
|
|
|
* TRUE: Handle is a valid console handle
|
|
|
|
* FALSE: Handle is not a valid console handle.
|
|
|
|
* STATUS: Officially undocumented
|
2003-07-10 18:50:51 +00:00
|
|
|
*
|
|
|
|
* @implemented
|
2003-03-05 22:51:48 +00:00
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
BOOL
|
|
|
|
WINAPI
|
2003-03-05 22:51:48 +00:00
|
|
|
VerifyConsoleIoHandle(HANDLE Handle)
|
2001-03-31 01:17:30 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
|
|
|
NTSTATUS Status;
|
2009-01-07 10:23:29 +00:00
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
Request.Data.VerifyHandleRequest.Handle = Handle;
|
2002-08-22 15:21:57 +00:00
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
|
|
|
CSR_CREATE_API_NUMBER(CSR_NATIVE, VERIFY_HANDLE),
|
|
|
|
sizeof(CSR_API_MESSAGE));
|
|
|
|
if (!NT_SUCCESS(Status))
|
2009-01-30 14:25:00 +00:00
|
|
|
{
|
2012-11-15 18:06:17 +00:00
|
|
|
BaseSetLastNTError(Status);
|
|
|
|
return FALSE;
|
2009-01-30 14:25:00 +00:00
|
|
|
}
|
2002-08-22 15:21:57 +00:00
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
return (BOOL)NT_SUCCESS(Request.Status);
|
2004-11-02 20:42:06 +00:00
|
|
|
}
|
2002-08-22 15:21:57 +00:00
|
|
|
|
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
/*
|
|
|
|
* @unimplemented
|
2004-11-02 20:42:06 +00:00
|
|
|
*/
|
2012-11-15 18:06:17 +00:00
|
|
|
DWORD
|
2004-11-02 20:42:06 +00:00
|
|
|
WINAPI
|
2012-11-15 18:06:17 +00:00
|
|
|
WriteConsoleInputVDMA(DWORD Unknown0,
|
|
|
|
DWORD Unknown1,
|
|
|
|
DWORD Unknown2,
|
|
|
|
DWORD Unknown3)
|
2004-11-02 20:42:06 +00:00
|
|
|
{
|
2012-11-15 18:06:17 +00:00
|
|
|
DPRINT1("WriteConsoleInputVDMA(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1, Unknown2, Unknown3);
|
|
|
|
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
|
|
return 0;
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
/*
|
|
|
|
* @unimplemented
|
1999-03-06 10:57:02 +00:00
|
|
|
*/
|
2012-11-15 18:06:17 +00:00
|
|
|
DWORD
|
1999-03-06 10:57:02 +00:00
|
|
|
WINAPI
|
2012-11-15 18:06:17 +00:00
|
|
|
WriteConsoleInputVDMW(DWORD Unknown0,
|
|
|
|
DWORD Unknown1,
|
|
|
|
DWORD Unknown2,
|
|
|
|
DWORD Unknown3)
|
1999-03-06 10:57:02 +00:00
|
|
|
{
|
2012-11-15 18:06:17 +00:00
|
|
|
DPRINT1("WriteConsoleInputVDMW(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1, Unknown2, Unknown3);
|
|
|
|
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
|
|
return 0;
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
/*
|
|
|
|
* @implemented (Undocumented)
|
1999-03-06 10:57:02 +00:00
|
|
|
*/
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
2012-11-15 18:06:17 +00:00
|
|
|
CloseConsoleHandle(HANDLE Handle)
|
1999-03-06 10:57:02 +00:00
|
|
|
{
|
2012-11-15 18:06:17 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
2009-01-30 14:25:00 +00:00
|
|
|
NTSTATUS Status;
|
2002-10-20 00:34:40 +00:00
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
Request.Data.CloseHandleRequest.Handle = Handle;
|
2002-10-20 00:34:40 +00:00
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
|
|
|
CSR_CREATE_API_NUMBER(CSR_NATIVE, CLOSE_HANDLE),
|
|
|
|
sizeof(CSR_API_MESSAGE));
|
|
|
|
if (!NT_SUCCESS(Status))
|
2002-10-20 00:34:40 +00:00
|
|
|
{
|
2012-11-15 18:06:17 +00:00
|
|
|
BaseSetLastNTError(Status);
|
2009-01-30 14:25:00 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2002-10-20 00:34:40 +00:00
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
return TRUE;
|
|
|
|
}
|
2009-01-30 14:25:00 +00:00
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
|
|
|
HANDLE
|
|
|
|
WINAPI
|
|
|
|
GetStdHandle(DWORD nStdHandle)
|
|
|
|
/*
|
|
|
|
* FUNCTION: Get a handle for the standard input, standard output
|
|
|
|
* and a standard error device.
|
|
|
|
* ARGUMENTS:
|
|
|
|
* nStdHandle - Specifies the device for which to return the handle.
|
|
|
|
* RETURNS: If the function succeeds, the return value is the handle
|
|
|
|
* of the specified device. Otherwise the value is INVALID_HANDLE_VALUE.
|
|
|
|
*/
|
|
|
|
{
|
|
|
|
PRTL_USER_PROCESS_PARAMETERS Ppb;
|
2009-01-30 14:25:00 +00:00
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
Ppb = NtCurrentPeb()->ProcessParameters;
|
|
|
|
switch (nStdHandle)
|
|
|
|
{
|
|
|
|
case STD_INPUT_HANDLE:
|
|
|
|
return Ppb->StandardInput;
|
2009-01-30 14:25:00 +00:00
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
case STD_OUTPUT_HANDLE:
|
|
|
|
return Ppb->StandardOutput;
|
2002-10-20 00:34:40 +00:00
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
case STD_ERROR_HANDLE:
|
|
|
|
return Ppb->StandardError;
|
2002-10-20 00:34:40 +00:00
|
|
|
}
|
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
SetLastError (ERROR_INVALID_PARAMETER);
|
|
|
|
return INVALID_HANDLE_VALUE;
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
BOOL
|
2012-11-15 18:06:17 +00:00
|
|
|
WINAPI
|
|
|
|
SetStdHandle(DWORD nStdHandle,
|
|
|
|
HANDLE hHandle)
|
|
|
|
/*
|
|
|
|
* FUNCTION: Set the handle for the standard input, standard output or
|
|
|
|
* the standard error device.
|
|
|
|
* ARGUMENTS:
|
|
|
|
* nStdHandle - Specifies the handle to be set.
|
|
|
|
* hHandle - The handle to set.
|
|
|
|
* RETURNS: TRUE if the function succeeds, FALSE otherwise.
|
|
|
|
*/
|
|
|
|
{
|
|
|
|
PRTL_USER_PROCESS_PARAMETERS Ppb;
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
/* no need to check if hHandle == INVALID_HANDLE_VALUE */
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
Ppb = NtCurrentPeb()->ProcessParameters;
|
2004-08-24 17:21:12 +00:00
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
switch (nStdHandle)
|
2009-01-30 14:25:00 +00:00
|
|
|
{
|
2012-11-15 18:06:17 +00:00
|
|
|
case STD_INPUT_HANDLE:
|
|
|
|
Ppb->StandardInput = hHandle;
|
|
|
|
return TRUE;
|
2005-08-28 12:03:25 +00:00
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
case STD_OUTPUT_HANDLE:
|
|
|
|
Ppb->StandardOutput = hHandle;
|
|
|
|
return TRUE;
|
2004-11-02 20:42:06 +00:00
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
case STD_ERROR_HANDLE:
|
|
|
|
Ppb->StandardError = hHandle;
|
|
|
|
return TRUE;
|
|
|
|
}
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
/* windows for whatever reason sets the last error to ERROR_INVALID_HANDLE here */
|
|
|
|
SetLastError(ERROR_INVALID_HANDLE);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2004-11-02 20:42:06 +00:00
|
|
|
|
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
/*--------------------------------------------------------------
|
|
|
|
* AllocConsole
|
|
|
|
*
|
|
|
|
* @implemented
|
|
|
|
*/
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
AllocConsole(VOID)
|
|
|
|
{
|
|
|
|
CSR_API_MESSAGE Request;
|
|
|
|
NTSTATUS Status;
|
|
|
|
HANDLE hStdError;
|
|
|
|
STARTUPINFO si;
|
2004-11-02 20:42:06 +00:00
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
if (NtCurrentPeb()->ProcessParameters->ConsoleHandle)
|
|
|
|
{
|
|
|
|
DPRINT("AllocConsole: Allocate duplicate console to the same Process\n");
|
|
|
|
BaseSetLastNTError (STATUS_OBJECT_NAME_EXISTS);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2004-11-02 20:42:06 +00:00
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
GetStartupInfo(&si);
|
2004-11-02 20:42:06 +00:00
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
Request.Data.AllocConsoleRequest.CtrlDispatcher = ConsoleControlDispatcher;
|
|
|
|
Request.Data.AllocConsoleRequest.ConsoleNeeded = TRUE;
|
|
|
|
Request.Data.AllocConsoleRequest.ShowCmd = si.wShowWindow;
|
2004-11-02 20:42:06 +00:00
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
|
|
|
CSR_CREATE_API_NUMBER(CSR_CONSOLE, ALLOC_CONSOLE),
|
|
|
|
sizeof(CSR_API_MESSAGE));
|
|
|
|
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
2009-01-30 14:25:00 +00:00
|
|
|
{
|
2012-11-15 18:06:17 +00:00
|
|
|
BaseSetLastNTError(Status);
|
|
|
|
return FALSE;
|
2009-01-30 14:25:00 +00:00
|
|
|
}
|
2004-11-02 20:42:06 +00:00
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
NtCurrentPeb()->ProcessParameters->ConsoleHandle = Request.Data.AllocConsoleRequest.Console;
|
|
|
|
|
|
|
|
SetStdHandle(STD_INPUT_HANDLE, Request.Data.AllocConsoleRequest.InputHandle);
|
|
|
|
SetStdHandle(STD_OUTPUT_HANDLE, Request.Data.AllocConsoleRequest.OutputHandle);
|
|
|
|
|
|
|
|
hStdError = DuplicateConsoleHandle(Request.Data.AllocConsoleRequest.OutputHandle,
|
|
|
|
0,
|
|
|
|
TRUE,
|
|
|
|
DUPLICATE_SAME_ACCESS);
|
2005-08-28 12:03:25 +00:00
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
SetStdHandle(STD_ERROR_HANDLE, hStdError);
|
2009-01-30 14:25:00 +00:00
|
|
|
return TRUE;
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-11-02 20:42:06 +00:00
|
|
|
/*--------------------------------------------------------------
|
2012-11-15 18:06:17 +00:00
|
|
|
* FreeConsole
|
2004-11-02 20:42:06 +00:00
|
|
|
*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
BOOL
|
|
|
|
WINAPI
|
2012-11-15 18:06:17 +00:00
|
|
|
FreeConsole(VOID)
|
2004-11-02 20:42:06 +00:00
|
|
|
{
|
2012-11-15 18:06:17 +00:00
|
|
|
// AG: I'm not sure if this is correct (what happens to std handles?)
|
|
|
|
// but I just tried to reverse what AllocConsole() does...
|
2004-11-02 20:42:06 +00:00
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
|
|
|
NTSTATUS Status;
|
2004-11-02 20:42:06 +00:00
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
|
|
|
CSR_CREATE_API_NUMBER(CSR_CONSOLE, FREE_CONSOLE),
|
|
|
|
sizeof(CSR_API_MESSAGE));
|
|
|
|
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
|
|
|
{
|
|
|
|
BaseSetLastNTError(Status);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
NtCurrentPeb()->ProcessParameters->ConsoleHandle = NULL;
|
|
|
|
return TRUE;
|
2003-07-09 10:43:08 +00:00
|
|
|
}
|
1999-03-06 10:57:02 +00:00
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------
|
2012-11-15 18:06:17 +00:00
|
|
|
* GetConsoleScreenBufferInfo
|
2003-07-10 18:50:51 +00:00
|
|
|
*
|
|
|
|
* @implemented
|
1999-03-06 10:57:02 +00:00
|
|
|
*/
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
2012-11-15 18:06:17 +00:00
|
|
|
GetConsoleScreenBufferInfo(HANDLE hConsoleOutput,
|
|
|
|
PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo)
|
1999-03-06 10:57:02 +00:00
|
|
|
{
|
2012-11-15 18:06:17 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
2009-01-30 14:25:00 +00:00
|
|
|
NTSTATUS Status;
|
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
Request.Data.ScreenBufferInfoRequest.ConsoleHandle = hConsoleOutput;
|
2009-01-07 10:23:29 +00:00
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
|
|
|
CSR_CREATE_API_NUMBER(CSR_CONSOLE, SCREEN_BUFFER_INFO),
|
|
|
|
sizeof(CSR_API_MESSAGE));
|
|
|
|
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
2009-01-30 14:25:00 +00:00
|
|
|
{
|
2012-11-15 18:06:17 +00:00
|
|
|
BaseSetLastNTError(Status);
|
|
|
|
return FALSE;
|
2009-01-30 14:25:00 +00:00
|
|
|
}
|
2012-11-15 18:06:17 +00:00
|
|
|
*lpConsoleScreenBufferInfo = Request.Data.ScreenBufferInfoRequest.Info;
|
2009-01-30 14:25:00 +00:00
|
|
|
return TRUE;
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------
|
2012-11-15 18:06:17 +00:00
|
|
|
* SetConsoleCursorPosition
|
2003-07-10 18:50:51 +00:00
|
|
|
*
|
|
|
|
* @implemented
|
1999-03-06 10:57:02 +00:00
|
|
|
*/
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
2012-11-15 18:06:17 +00:00
|
|
|
SetConsoleCursorPosition(HANDLE hConsoleOutput,
|
|
|
|
COORD dwCursorPosition)
|
1999-03-06 10:57:02 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
|
|
|
NTSTATUS Status;
|
|
|
|
|
2012-11-15 18:06:17 +00:00
|
|
|
Request.Data.SetCursorRequest.ConsoleHandle = hConsoleOutput;
|
|
|
|
Request.Data.SetCursorRequest.Position = dwCursorPosition;
|
2009-01-07 10:23:29 +00:00
|
|
|
|
2012-10-17 23:10:40 +00:00
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
2012-11-15 18:06:17 +00:00
|
|
|
CSR_CREATE_API_NUMBER(CSR_CONSOLE, SET_CURSOR),
|
2012-10-17 23:10:40 +00:00
|
|
|
sizeof(CSR_API_MESSAGE));
|
2012-11-15 18:06:17 +00:00
|
|
|
if(!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
2009-01-30 14:25:00 +00:00
|
|
|
{
|
2012-11-15 18:06:17 +00:00
|
|
|
BaseSetLastNTError(Status);
|
2009-01-30 14:25:00 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------
|
2009-01-30 14:25:00 +00:00
|
|
|
* GetConsoleMode
|
2003-07-10 18:50:51 +00:00
|
|
|
*
|
|
|
|
* @implemented
|
1999-03-06 10:57:02 +00:00
|
|
|
*/
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
2009-01-30 14:25:00 +00:00
|
|
|
GetConsoleMode(HANDLE hConsoleHandle,
|
|
|
|
LPDWORD lpMode)
|
1999-03-06 10:57:02 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
|
|
|
NTSTATUS Status;
|
2009-01-07 10:23:29 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
Request.Data.GetConsoleModeRequest.ConsoleHandle = hConsoleHandle;
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2012-10-17 23:10:40 +00:00
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
|
|
|
CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_CONSOLE_MODE),
|
|
|
|
sizeof(CSR_API_MESSAGE));
|
2009-01-30 14:25:00 +00:00
|
|
|
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
|
|
|
{
|
2012-10-17 23:10:40 +00:00
|
|
|
BaseSetLastNTError(Status);
|
2009-01-30 14:25:00 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2012-10-17 23:10:40 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
*lpMode = Request.Data.GetConsoleModeRequest.ConsoleMode;
|
|
|
|
|
|
|
|
return TRUE;
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------
|
2009-01-30 14:25:00 +00:00
|
|
|
* GetNumberOfConsoleInputEvents
|
2003-07-10 18:50:51 +00:00
|
|
|
*
|
|
|
|
* @implemented
|
1999-03-06 10:57:02 +00:00
|
|
|
*/
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
2009-01-30 14:25:00 +00:00
|
|
|
GetNumberOfConsoleInputEvents(HANDLE hConsoleInput,
|
|
|
|
LPDWORD lpNumberOfEvents)
|
1999-03-06 10:57:02 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
|
|
|
NTSTATUS Status;
|
2009-01-07 10:23:29 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
if (lpNumberOfEvents == NULL)
|
|
|
|
{
|
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
Request.Data.GetNumInputEventsRequest.ConsoleHandle = hConsoleInput;
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2012-10-17 23:10:40 +00:00
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
|
|
|
CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_NUM_INPUT_EVENTS),
|
|
|
|
sizeof(CSR_API_MESSAGE));
|
2009-01-30 14:25:00 +00:00
|
|
|
if(!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
|
|
|
{
|
2011-07-23 18:54:29 +00:00
|
|
|
BaseSetLastNTError(Status);
|
2009-01-30 14:25:00 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
*lpNumberOfEvents = Request.Data.GetNumInputEventsRequest.NumInputEvents;
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
return TRUE;
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------
|
2009-01-30 14:25:00 +00:00
|
|
|
* GetLargestConsoleWindowSize
|
2003-07-10 18:50:51 +00:00
|
|
|
*
|
|
|
|
* @unimplemented
|
1999-03-06 10:57:02 +00:00
|
|
|
*/
|
|
|
|
COORD
|
|
|
|
WINAPI
|
2009-01-30 14:25:00 +00:00
|
|
|
GetLargestConsoleWindowSize(HANDLE hConsoleOutput)
|
1999-03-06 10:57:02 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
COORD Coord = {80,25};
|
|
|
|
DPRINT1("GetLargestConsoleWindowSize(0x%x) UNIMPLEMENTED!\n", hConsoleOutput);
|
|
|
|
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
|
|
return Coord;
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------
|
2009-01-30 14:25:00 +00:00
|
|
|
* GetConsoleCursorInfo
|
2003-07-10 18:50:51 +00:00
|
|
|
*
|
|
|
|
* @implemented
|
1999-03-06 10:57:02 +00:00
|
|
|
*/
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
2009-01-30 14:25:00 +00:00
|
|
|
GetConsoleCursorInfo(HANDLE hConsoleOutput,
|
|
|
|
PCONSOLE_CURSOR_INFO lpConsoleCursorInfo)
|
1999-03-06 10:57:02 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
|
|
|
NTSTATUS Status;
|
|
|
|
|
|
|
|
if (!lpConsoleCursorInfo)
|
|
|
|
{
|
2009-01-30 14:36:57 +00:00
|
|
|
if (!hConsoleOutput)
|
|
|
|
SetLastError(ERROR_INVALID_HANDLE);
|
|
|
|
else
|
|
|
|
SetLastError(ERROR_INVALID_ACCESS);
|
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2009-01-07 10:23:29 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
Request.Data.GetCursorInfoRequest.ConsoleHandle = hConsoleOutput;
|
2000-05-26 06:06:42 +00:00
|
|
|
|
2012-10-17 23:10:40 +00:00
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
|
|
|
CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_CURSOR_INFO),
|
|
|
|
sizeof(CSR_API_MESSAGE));
|
2009-01-30 14:25:00 +00:00
|
|
|
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
|
|
|
{
|
2011-07-23 18:54:29 +00:00
|
|
|
BaseSetLastNTError(Status);
|
2009-01-30 14:25:00 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2012-10-17 23:10:40 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
*lpConsoleCursorInfo = Request.Data.GetCursorInfoRequest.Info;
|
2001-09-01 15:36:45 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
return TRUE;
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------
|
2009-01-30 14:25:00 +00:00
|
|
|
* GetNumberOfConsoleMouseButtons
|
2003-07-10 18:50:51 +00:00
|
|
|
*
|
|
|
|
* @unimplemented
|
1999-03-06 10:57:02 +00:00
|
|
|
*/
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
2009-01-30 14:25:00 +00:00
|
|
|
GetNumberOfConsoleMouseButtons(LPDWORD lpNumberOfMouseButtons)
|
1999-03-06 10:57:02 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
DPRINT1("GetNumberOfConsoleMouseButtons(0x%x) UNIMPLEMENTED!\n", lpNumberOfMouseButtons);
|
|
|
|
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
|
|
return FALSE;
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------
|
2009-01-30 14:25:00 +00:00
|
|
|
* SetConsoleMode
|
2003-07-10 18:50:51 +00:00
|
|
|
*
|
|
|
|
* @implemented
|
1999-03-06 10:57:02 +00:00
|
|
|
*/
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
2009-01-30 14:25:00 +00:00
|
|
|
SetConsoleMode(HANDLE hConsoleHandle,
|
|
|
|
DWORD dwMode)
|
1999-03-06 10:57:02 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
|
|
|
NTSTATUS Status;
|
2009-01-07 10:23:29 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
Request.Data.SetConsoleModeRequest.ConsoleHandle = hConsoleHandle;
|
|
|
|
Request.Data.SetConsoleModeRequest.Mode = dwMode;
|
|
|
|
|
2012-10-17 23:10:40 +00:00
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
|
|
|
CSR_CREATE_API_NUMBER(CSR_CONSOLE, SET_CONSOLE_MODE),
|
|
|
|
sizeof(CSR_API_MESSAGE));
|
2009-01-30 14:25:00 +00:00
|
|
|
if(!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
|
|
|
{
|
2012-10-17 23:10:40 +00:00
|
|
|
BaseSetLastNTError(Status);
|
2009-01-30 14:25:00 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
return TRUE;
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------
|
2009-01-30 14:25:00 +00:00
|
|
|
* SetConsoleActiveScreenBuffer
|
2003-07-10 18:50:51 +00:00
|
|
|
*
|
|
|
|
* @implemented
|
1999-03-06 10:57:02 +00:00
|
|
|
*/
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
2009-01-30 14:25:00 +00:00
|
|
|
SetConsoleActiveScreenBuffer(HANDLE hConsoleOutput)
|
1999-03-06 10:57:02 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
|
|
|
NTSTATUS Status;
|
|
|
|
|
|
|
|
Request.Data.SetScreenBufferRequest.OutputHandle = hConsoleOutput;
|
2009-01-07 10:23:29 +00:00
|
|
|
|
2012-10-17 23:10:40 +00:00
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
|
|
|
CSR_CREATE_API_NUMBER(CSR_CONSOLE, SET_SCREEN_BUFFER),
|
|
|
|
sizeof(CSR_API_MESSAGE));
|
2009-01-30 14:25:00 +00:00
|
|
|
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
|
|
|
{
|
2011-07-23 18:54:29 +00:00
|
|
|
BaseSetLastNTError(Status);
|
2009-01-30 14:25:00 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2001-01-21 00:07:03 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
return TRUE;
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------
|
2009-01-30 14:25:00 +00:00
|
|
|
* FlushConsoleInputBuffer
|
2003-07-10 18:50:51 +00:00
|
|
|
*
|
|
|
|
* @implemented
|
1999-03-06 10:57:02 +00:00
|
|
|
*/
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
2009-01-30 14:25:00 +00:00
|
|
|
FlushConsoleInputBuffer(HANDLE hConsoleInput)
|
1999-03-06 10:57:02 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
|
|
|
NTSTATUS Status;
|
2009-01-07 10:23:29 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
Request.Data.FlushInputBufferRequest.ConsoleInput = hConsoleInput;
|
|
|
|
|
2012-10-17 23:10:40 +00:00
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
|
|
|
CSR_CREATE_API_NUMBER(CSR_CONSOLE, FLUSH_INPUT_BUFFER),
|
|
|
|
sizeof(CSR_API_MESSAGE));
|
2009-01-30 14:25:00 +00:00
|
|
|
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
|
|
|
{
|
2011-07-23 18:54:29 +00:00
|
|
|
BaseSetLastNTError(Status);
|
2009-01-30 14:25:00 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2001-09-01 15:36:45 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
return TRUE;
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------
|
2009-01-30 14:25:00 +00:00
|
|
|
* SetConsoleScreenBufferSize
|
2003-07-10 18:50:51 +00:00
|
|
|
*
|
2010-05-12 03:34:02 +00:00
|
|
|
* @implemented
|
1999-03-06 10:57:02 +00:00
|
|
|
*/
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
2009-01-30 14:25:00 +00:00
|
|
|
SetConsoleScreenBufferSize(HANDLE hConsoleOutput,
|
|
|
|
COORD dwSize)
|
1999-03-06 10:57:02 +00:00
|
|
|
{
|
2010-05-12 03:34:02 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
|
|
|
NTSTATUS Status;
|
|
|
|
|
|
|
|
Request.Data.SetScreenBufferSize.OutputHandle = hConsoleOutput;
|
|
|
|
Request.Data.SetScreenBufferSize.Size = dwSize;
|
|
|
|
|
2012-10-17 23:10:40 +00:00
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
|
|
|
CSR_CREATE_API_NUMBER(CSR_CONSOLE, SET_SCREEN_BUFFER_SIZE),
|
|
|
|
sizeof(CSR_API_MESSAGE));
|
2010-05-12 03:34:02 +00:00
|
|
|
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
|
|
|
{
|
2011-07-23 18:54:29 +00:00
|
|
|
BaseSetLastNTError(Status);
|
2010-05-12 03:34:02 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------
|
2009-01-30 14:25:00 +00:00
|
|
|
* SetConsoleCursorInfo
|
2003-07-10 18:50:51 +00:00
|
|
|
*
|
|
|
|
* @implemented
|
1999-03-06 10:57:02 +00:00
|
|
|
*/
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
2009-01-30 14:25:00 +00:00
|
|
|
SetConsoleCursorInfo(HANDLE hConsoleOutput,
|
|
|
|
CONST CONSOLE_CURSOR_INFO *lpConsoleCursorInfo)
|
1999-03-06 10:57:02 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
|
|
|
NTSTATUS Status;
|
2009-01-07 10:23:29 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
Request.Data.SetCursorInfoRequest.ConsoleHandle = hConsoleOutput;
|
|
|
|
Request.Data.SetCursorInfoRequest.Info = *lpConsoleCursorInfo;
|
2000-05-26 06:06:42 +00:00
|
|
|
|
2012-10-17 23:10:40 +00:00
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
|
|
|
CSR_CREATE_API_NUMBER(CSR_CONSOLE, SET_CURSOR_INFO),
|
|
|
|
sizeof(CSR_API_MESSAGE));
|
2009-01-30 14:25:00 +00:00
|
|
|
if(!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
|
|
|
{
|
2011-07-23 18:54:29 +00:00
|
|
|
BaseSetLastNTError(Status);
|
2009-01-30 14:25:00 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2001-09-01 15:36:45 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
return TRUE;
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
static
|
|
|
|
BOOL
|
2004-11-02 20:42:06 +00:00
|
|
|
IntScrollConsoleScreenBuffer(HANDLE hConsoleOutput,
|
2007-01-21 23:29:10 +00:00
|
|
|
const SMALL_RECT *lpScrollRectangle,
|
|
|
|
const SMALL_RECT *lpClipRectangle,
|
2004-11-02 20:42:06 +00:00
|
|
|
COORD dwDestinationOrigin,
|
2007-01-21 23:29:10 +00:00
|
|
|
const CHAR_INFO *lpFill,
|
2004-11-02 20:42:06 +00:00
|
|
|
BOOL bUnicode)
|
1999-03-06 10:57:02 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
|
|
|
NTSTATUS Status;
|
|
|
|
|
|
|
|
Request.Data.ScrollConsoleScreenBufferRequest.ConsoleHandle = hConsoleOutput;
|
|
|
|
Request.Data.ScrollConsoleScreenBufferRequest.Unicode = bUnicode;
|
|
|
|
Request.Data.ScrollConsoleScreenBufferRequest.ScrollRectangle = *lpScrollRectangle;
|
|
|
|
|
|
|
|
if (lpClipRectangle != NULL)
|
|
|
|
{
|
|
|
|
Request.Data.ScrollConsoleScreenBufferRequest.UseClipRectangle = TRUE;
|
|
|
|
Request.Data.ScrollConsoleScreenBufferRequest.ClipRectangle = *lpClipRectangle;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Request.Data.ScrollConsoleScreenBufferRequest.UseClipRectangle = FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
Request.Data.ScrollConsoleScreenBufferRequest.DestinationOrigin = dwDestinationOrigin;
|
|
|
|
Request.Data.ScrollConsoleScreenBufferRequest.Fill = *lpFill;
|
|
|
|
|
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
2012-10-17 23:10:40 +00:00
|
|
|
CSR_CREATE_API_NUMBER(CSR_CONSOLE, SCROLL_CONSOLE_SCREEN_BUFFER),
|
2009-01-30 14:25:00 +00:00
|
|
|
sizeof(CSR_API_MESSAGE));
|
|
|
|
|
|
|
|
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
|
|
|
{
|
2011-07-23 18:54:29 +00:00
|
|
|
BaseSetLastNTError(Status);
|
2009-01-30 14:25:00 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2001-09-01 15:36:45 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
return TRUE;
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-11-02 20:42:06 +00:00
|
|
|
/*--------------------------------------------------------------
|
2009-01-30 14:25:00 +00:00
|
|
|
* ScrollConsoleScreenBufferA
|
2004-11-02 20:42:06 +00:00
|
|
|
*
|
|
|
|
* @implemented
|
|
|
|
*/
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
2009-01-30 14:25:00 +00:00
|
|
|
ScrollConsoleScreenBufferA(HANDLE hConsoleOutput,
|
|
|
|
CONST SMALL_RECT *lpScrollRectangle,
|
|
|
|
CONST SMALL_RECT *lpClipRectangle,
|
|
|
|
COORD dwDestinationOrigin,
|
|
|
|
CONST CHAR_INFO *lpFill)
|
|
|
|
{
|
|
|
|
return IntScrollConsoleScreenBuffer(hConsoleOutput,
|
|
|
|
(PSMALL_RECT)lpScrollRectangle,
|
|
|
|
(PSMALL_RECT)lpClipRectangle,
|
|
|
|
dwDestinationOrigin,
|
|
|
|
(PCHAR_INFO)lpFill,
|
|
|
|
FALSE);
|
2004-11-02 20:42:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
1999-03-06 10:57:02 +00:00
|
|
|
/*--------------------------------------------------------------
|
2009-01-30 14:25:00 +00:00
|
|
|
* ScrollConsoleScreenBufferW
|
2003-07-10 18:50:51 +00:00
|
|
|
*
|
2004-11-02 20:42:06 +00:00
|
|
|
* @implemented
|
1999-03-06 10:57:02 +00:00
|
|
|
*/
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
2009-01-30 14:25:00 +00:00
|
|
|
ScrollConsoleScreenBufferW(HANDLE hConsoleOutput,
|
|
|
|
CONST SMALL_RECT *lpScrollRectangle,
|
|
|
|
CONST SMALL_RECT *lpClipRectangle,
|
|
|
|
COORD dwDestinationOrigin,
|
|
|
|
CONST CHAR_INFO *lpFill)
|
|
|
|
{
|
|
|
|
return IntScrollConsoleScreenBuffer(hConsoleOutput,
|
|
|
|
lpScrollRectangle,
|
|
|
|
lpClipRectangle,
|
|
|
|
dwDestinationOrigin,
|
|
|
|
lpFill,
|
|
|
|
TRUE);
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------
|
2009-01-30 14:25:00 +00:00
|
|
|
* SetConsoleWindowInfo
|
2003-07-10 18:50:51 +00:00
|
|
|
*
|
|
|
|
* @unimplemented
|
1999-03-06 10:57:02 +00:00
|
|
|
*/
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
2009-01-30 14:25:00 +00:00
|
|
|
SetConsoleWindowInfo(HANDLE hConsoleOutput,
|
|
|
|
BOOL bAbsolute,
|
|
|
|
CONST SMALL_RECT *lpConsoleWindow)
|
1999-03-06 10:57:02 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
DPRINT1("SetConsoleWindowInfo(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput, bAbsolute, lpConsoleWindow);
|
|
|
|
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
|
|
return FALSE;
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------
|
1999-03-30 21:58:05 +00:00
|
|
|
* SetConsoleTextAttribute
|
2003-07-10 18:50:51 +00:00
|
|
|
*
|
|
|
|
* @implemented
|
1999-03-06 10:57:02 +00:00
|
|
|
*/
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
2009-01-30 14:25:00 +00:00
|
|
|
SetConsoleTextAttribute(HANDLE hConsoleOutput,
|
|
|
|
WORD wAttributes)
|
1999-03-30 21:58:05 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
|
|
|
NTSTATUS Status;
|
2009-01-07 10:23:29 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
Request.Data.SetAttribRequest.ConsoleHandle = hConsoleOutput;
|
|
|
|
Request.Data.SetAttribRequest.Attrib = wAttributes;
|
2000-05-26 06:06:42 +00:00
|
|
|
|
2012-10-17 23:10:40 +00:00
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
|
|
|
CSR_CREATE_API_NUMBER(CSR_CONSOLE, SET_ATTRIB),
|
|
|
|
sizeof(CSR_API_MESSAGE));
|
2009-01-30 14:25:00 +00:00
|
|
|
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
|
|
|
{
|
2011-07-23 18:54:29 +00:00
|
|
|
BaseSetLastNTError(Status);
|
2009-01-30 14:25:00 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
2003-07-10 18:50:51 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
static
|
|
|
|
BOOL
|
2001-04-04 22:21:32 +00:00
|
|
|
AddConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine)
|
|
|
|
{
|
2010-03-09 20:13:19 +00:00
|
|
|
PHANDLER_ROUTINE* NewCtrlHandlers = NULL;
|
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
if (HandlerRoutine == NULL)
|
2001-04-04 22:21:32 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
NtCurrentPeb()->ProcessParameters->ConsoleFlags = TRUE;
|
2010-03-09 20:13:19 +00:00
|
|
|
return TRUE;
|
2001-04-04 22:21:32 +00:00
|
|
|
}
|
2010-03-09 20:13:19 +00:00
|
|
|
|
|
|
|
if (NrCtrlHandlers == NrAllocatedHandlers)
|
2001-04-04 22:21:32 +00:00
|
|
|
{
|
2010-03-09 20:13:19 +00:00
|
|
|
NewCtrlHandlers = RtlAllocateHeap(RtlGetProcessHeap(),
|
|
|
|
0,
|
|
|
|
(NrCtrlHandlers + 4) * sizeof(PHANDLER_ROUTINE));
|
|
|
|
if (NewCtrlHandlers == NULL)
|
2009-01-30 14:25:00 +00:00
|
|
|
{
|
|
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
|
|
return FALSE;
|
2004-08-28 22:14:08 +00:00
|
|
|
}
|
2010-03-09 20:13:19 +00:00
|
|
|
|
|
|
|
memmove(NewCtrlHandlers, CtrlHandlers, sizeof(PHANDLER_ROUTINE) * NrCtrlHandlers);
|
|
|
|
|
|
|
|
if (NrAllocatedHandlers > 1) RtlFreeHeap(RtlGetProcessHeap(), 0, CtrlHandlers);
|
|
|
|
|
|
|
|
CtrlHandlers = NewCtrlHandlers;
|
|
|
|
NrAllocatedHandlers += 4;
|
|
|
|
}
|
|
|
|
|
|
|
|
ASSERT(NrCtrlHandlers < NrAllocatedHandlers);
|
|
|
|
|
|
|
|
CtrlHandlers[NrCtrlHandlers++] = HandlerRoutine;
|
|
|
|
return TRUE;
|
2001-04-04 22:21:32 +00:00
|
|
|
}
|
1999-03-06 10:57:02 +00:00
|
|
|
|
2003-07-10 18:50:51 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
static
|
|
|
|
BOOL
|
2001-04-04 22:21:32 +00:00
|
|
|
RemoveConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine)
|
1999-03-06 10:57:02 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
ULONG i;
|
2001-04-04 22:21:32 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
if (HandlerRoutine == NULL)
|
2001-04-04 22:21:32 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
NtCurrentPeb()->ProcessParameters->ConsoleFlags = FALSE;
|
2010-03-09 20:13:19 +00:00
|
|
|
return TRUE;
|
2001-04-04 22:21:32 +00:00
|
|
|
}
|
2010-03-09 20:13:19 +00:00
|
|
|
|
|
|
|
for (i = 0; i < NrCtrlHandlers; i++)
|
2001-04-04 22:21:32 +00:00
|
|
|
{
|
2010-03-09 20:13:19 +00:00
|
|
|
if (CtrlHandlers[i] == HandlerRoutine)
|
2009-01-30 14:25:00 +00:00
|
|
|
{
|
2010-03-09 20:13:19 +00:00
|
|
|
if (i < (NrCtrlHandlers - 1))
|
2009-01-30 14:25:00 +00:00
|
|
|
{
|
2010-03-09 20:13:19 +00:00
|
|
|
memmove(&CtrlHandlers[i],
|
|
|
|
&CtrlHandlers[i+1],
|
|
|
|
(NrCtrlHandlers - i + 1) * sizeof(PHANDLER_ROUTINE));
|
2009-01-30 14:25:00 +00:00
|
|
|
}
|
2010-03-09 20:13:19 +00:00
|
|
|
|
|
|
|
NrCtrlHandlers--;
|
|
|
|
return TRUE;
|
2009-01-30 14:25:00 +00:00
|
|
|
}
|
2001-04-04 22:21:32 +00:00
|
|
|
}
|
2009-01-30 14:25:00 +00:00
|
|
|
|
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
2010-03-09 20:13:19 +00:00
|
|
|
return FALSE;
|
2001-04-04 22:21:32 +00:00
|
|
|
}
|
|
|
|
|
2003-07-10 18:50:51 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
BOOL
|
|
|
|
WINAPI
|
2003-07-09 10:43:08 +00:00
|
|
|
SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine,
|
2009-01-30 14:25:00 +00:00
|
|
|
BOOL Add)
|
2001-04-04 22:21:32 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
BOOL Ret;
|
2001-04-04 22:21:32 +00:00
|
|
|
|
2011-03-29 21:48:13 +00:00
|
|
|
RtlEnterCriticalSection(&BaseDllDirectoryLock);
|
2009-01-30 14:25:00 +00:00
|
|
|
if (Add)
|
2001-04-04 22:21:32 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
Ret = AddConsoleCtrlHandler(HandlerRoutine);
|
2001-04-04 22:21:32 +00:00
|
|
|
}
|
2009-01-30 14:25:00 +00:00
|
|
|
else
|
2001-04-04 22:21:32 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
Ret = RemoveConsoleCtrlHandler(HandlerRoutine);
|
2001-04-04 22:21:32 +00:00
|
|
|
}
|
2009-01-30 14:25:00 +00:00
|
|
|
|
2011-03-29 21:48:13 +00:00
|
|
|
RtlLeaveCriticalSection(&BaseDllDirectoryLock);
|
2009-01-30 14:25:00 +00:00
|
|
|
return(Ret);
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------
|
2009-01-30 14:25:00 +00:00
|
|
|
* GenerateConsoleCtrlEvent
|
2003-07-10 18:50:51 +00:00
|
|
|
*
|
2008-08-02 17:01:22 +00:00
|
|
|
* @implemented
|
1999-03-06 10:57:02 +00:00
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
GenerateConsoleCtrlEvent(DWORD dwCtrlEvent,
|
|
|
|
DWORD dwProcessGroupId)
|
1999-03-06 10:57:02 +00:00
|
|
|
{
|
2008-08-02 17:01:22 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
|
|
|
NTSTATUS Status;
|
|
|
|
|
|
|
|
if (dwCtrlEvent != CTRL_C_EVENT && dwCtrlEvent != CTRL_BREAK_EVENT)
|
|
|
|
{
|
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
Request.Data.GenerateCtrlEvent.Event = dwCtrlEvent;
|
|
|
|
Request.Data.GenerateCtrlEvent.ProcessGroup = dwProcessGroupId;
|
2009-01-30 14:25:00 +00:00
|
|
|
|
2009-01-07 10:23:29 +00:00
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
2012-10-17 23:10:40 +00:00
|
|
|
CSR_CREATE_API_NUMBER(CSR_CONSOLE, GENERATE_CTRL_EVENT),
|
2008-08-02 17:01:22 +00:00
|
|
|
sizeof(CSR_API_MESSAGE));
|
|
|
|
if(!NT_SUCCESS(Status) || !(NT_SUCCESS(Status = Request.Status)))
|
|
|
|
{
|
2011-07-23 18:54:29 +00:00
|
|
|
BaseSetLastNTError(Status);
|
2008-08-02 17:01:22 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2009-01-07 10:23:29 +00:00
|
|
|
|
2008-08-02 17:01:22 +00:00
|
|
|
return TRUE;
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-06-04 06:36:12 +00:00
|
|
|
static DWORD
|
|
|
|
IntGetConsoleTitle(LPVOID lpConsoleTitle, DWORD nSize, BOOL bUnicode)
|
1999-03-06 10:57:02 +00:00
|
|
|
{
|
2010-06-04 06:36:12 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
|
|
|
PCSR_CAPTURE_BUFFER CaptureBuffer;
|
2009-01-30 14:25:00 +00:00
|
|
|
NTSTATUS Status;
|
2003-03-09 21:37:18 +00:00
|
|
|
|
2010-06-04 06:36:12 +00:00
|
|
|
if (nSize == 0)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
Request.Data.GetTitleRequest.Length = nSize * (bUnicode ? 1 : sizeof(WCHAR));
|
|
|
|
CaptureBuffer = CsrAllocateCaptureBuffer(1, Request.Data.GetTitleRequest.Length);
|
|
|
|
if (CaptureBuffer == NULL)
|
2009-01-30 14:25:00 +00:00
|
|
|
{
|
2011-02-23 14:24:57 +00:00
|
|
|
DPRINT1("CsrAllocateCaptureBuffer failed!\n");
|
2009-01-30 14:25:00 +00:00
|
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
2010-06-04 06:36:12 +00:00
|
|
|
return 0;
|
2009-01-30 14:25:00 +00:00
|
|
|
}
|
2005-08-28 12:03:25 +00:00
|
|
|
|
2010-06-04 06:36:12 +00:00
|
|
|
CsrAllocateMessagePointer(CaptureBuffer,
|
|
|
|
Request.Data.GetTitleRequest.Length,
|
|
|
|
(PVOID*)&Request.Data.GetTitleRequest.Title);
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2012-10-17 23:10:40 +00:00
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
CaptureBuffer,
|
|
|
|
CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_TITLE),
|
|
|
|
sizeof(CSR_API_MESSAGE));
|
2010-06-04 06:36:12 +00:00
|
|
|
if (!NT_SUCCESS(Status) || !(NT_SUCCESS(Status = Request.Status)))
|
2009-01-30 14:25:00 +00:00
|
|
|
{
|
2010-06-04 06:36:12 +00:00
|
|
|
CsrFreeCaptureBuffer(CaptureBuffer);
|
2011-07-23 18:54:29 +00:00
|
|
|
BaseSetLastNTError(Status);
|
2009-01-30 14:25:00 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2010-06-04 06:36:12 +00:00
|
|
|
if (bUnicode)
|
2009-01-30 14:25:00 +00:00
|
|
|
{
|
2010-06-04 06:36:12 +00:00
|
|
|
if (nSize >= sizeof(WCHAR))
|
|
|
|
wcscpy((LPWSTR)lpConsoleTitle, Request.Data.GetTitleRequest.Title);
|
2009-01-30 14:25:00 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2010-06-04 06:36:12 +00:00
|
|
|
if (nSize < Request.Data.GetTitleRequest.Length / sizeof(WCHAR) ||
|
|
|
|
!WideCharToMultiByte(CP_ACP, // ANSI code page
|
|
|
|
0, // performance and mapping flags
|
|
|
|
Request.Data.GetTitleRequest.Title, // address of wide-character string
|
|
|
|
-1, // number of characters in string
|
|
|
|
(LPSTR)lpConsoleTitle, // address of buffer for new string
|
|
|
|
nSize, // size of buffer
|
|
|
|
NULL, // FAST
|
|
|
|
NULL))
|
|
|
|
{
|
|
|
|
/* Yes, if the buffer isn't big enough, it returns 0... Bad API */
|
|
|
|
*(LPSTR)lpConsoleTitle = '\0';
|
|
|
|
Request.Data.GetTitleRequest.Length = 0;
|
|
|
|
}
|
2009-01-30 14:25:00 +00:00
|
|
|
}
|
2010-06-04 06:36:12 +00:00
|
|
|
CsrFreeCaptureBuffer(CaptureBuffer);
|
2005-08-28 12:03:25 +00:00
|
|
|
|
2010-06-04 06:36:12 +00:00
|
|
|
return Request.Data.GetTitleRequest.Length / sizeof(WCHAR);
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
2010-06-04 06:36:12 +00:00
|
|
|
/*--------------------------------------------------------------
|
|
|
|
* GetConsoleTitleW
|
|
|
|
*
|
|
|
|
* @implemented
|
|
|
|
*/
|
|
|
|
DWORD
|
|
|
|
WINAPI
|
|
|
|
GetConsoleTitleW(LPWSTR lpConsoleTitle,
|
|
|
|
DWORD nSize)
|
|
|
|
{
|
|
|
|
return IntGetConsoleTitle(lpConsoleTitle, nSize, TRUE);
|
|
|
|
}
|
1999-03-06 10:57:02 +00:00
|
|
|
|
|
|
|
/*--------------------------------------------------------------
|
2009-01-30 14:25:00 +00:00
|
|
|
* GetConsoleTitleA
|
1999-03-06 10:57:02 +00:00
|
|
|
*
|
2009-01-30 14:25:00 +00:00
|
|
|
* 19990306 EA
|
2003-07-10 18:50:51 +00:00
|
|
|
*
|
|
|
|
* @implemented
|
1999-03-06 10:57:02 +00:00
|
|
|
*/
|
|
|
|
DWORD
|
|
|
|
WINAPI
|
2009-01-30 14:25:00 +00:00
|
|
|
GetConsoleTitleA(LPSTR lpConsoleTitle,
|
|
|
|
DWORD nSize)
|
|
|
|
{
|
2010-06-04 06:36:12 +00:00
|
|
|
return IntGetConsoleTitle(lpConsoleTitle, nSize, FALSE);
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------
|
2009-01-30 14:25:00 +00:00
|
|
|
* SetConsoleTitleW
|
2003-07-10 18:50:51 +00:00
|
|
|
*
|
|
|
|
* @implemented
|
1999-03-06 10:57:02 +00:00
|
|
|
*/
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
2009-01-30 14:25:00 +00:00
|
|
|
SetConsoleTitleW(LPCWSTR lpConsoleTitle)
|
1999-03-06 10:57:02 +00:00
|
|
|
{
|
2010-06-04 06:36:12 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
|
|
|
PCSR_CAPTURE_BUFFER CaptureBuffer;
|
2009-01-30 14:25:00 +00:00
|
|
|
NTSTATUS Status;
|
|
|
|
|
2010-06-04 06:36:12 +00:00
|
|
|
Request.Data.SetTitleRequest.Length = wcslen(lpConsoleTitle) * sizeof(WCHAR);
|
|
|
|
|
|
|
|
CaptureBuffer = CsrAllocateCaptureBuffer(1, Request.Data.SetTitleRequest.Length);
|
|
|
|
if (CaptureBuffer == NULL)
|
2009-01-30 14:25:00 +00:00
|
|
|
{
|
2011-02-23 14:24:57 +00:00
|
|
|
DPRINT1("CsrAllocateCaptureBuffer failed!\n");
|
2009-01-30 14:25:00 +00:00
|
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2010-06-04 06:36:12 +00:00
|
|
|
CsrCaptureMessageBuffer(CaptureBuffer,
|
|
|
|
(PVOID)lpConsoleTitle,
|
|
|
|
Request.Data.SetTitleRequest.Length,
|
|
|
|
(PVOID*)&Request.Data.SetTitleRequest.Title);
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2012-10-17 23:10:40 +00:00
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
CaptureBuffer,
|
|
|
|
CSR_CREATE_API_NUMBER(CSR_CONSOLE, SET_TITLE),
|
|
|
|
sizeof(CSR_API_MESSAGE));
|
|
|
|
|
2010-06-04 06:36:12 +00:00
|
|
|
CsrFreeCaptureBuffer(CaptureBuffer);
|
2012-10-17 23:10:40 +00:00
|
|
|
|
2010-06-04 06:36:12 +00:00
|
|
|
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
2001-06-22 02:11:44 +00:00
|
|
|
{
|
2011-07-23 18:54:29 +00:00
|
|
|
BaseSetLastNTError(Status);
|
2010-06-04 06:36:12 +00:00
|
|
|
return FALSE;
|
2001-06-22 02:11:44 +00:00
|
|
|
}
|
2005-08-28 12:03:25 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
return TRUE;
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------
|
2009-01-30 14:25:00 +00:00
|
|
|
* SetConsoleTitleA
|
2005-05-09 01:46:57 +00:00
|
|
|
*
|
2009-01-30 14:25:00 +00:00
|
|
|
* 19990204 EA Added
|
2003-07-10 18:50:51 +00:00
|
|
|
*
|
|
|
|
* @implemented
|
1999-03-06 10:57:02 +00:00
|
|
|
*/
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
2009-01-30 14:25:00 +00:00
|
|
|
SetConsoleTitleA(LPCSTR lpConsoleTitle)
|
1999-01-16 02:11:45 +00:00
|
|
|
{
|
2010-06-04 06:36:12 +00:00
|
|
|
ULONG Length = strlen(lpConsoleTitle) + 1;
|
|
|
|
LPWSTR WideTitle = HeapAlloc(GetProcessHeap(), 0, Length * sizeof(WCHAR));
|
|
|
|
BOOL Ret;
|
|
|
|
if (!WideTitle)
|
2009-01-30 14:25:00 +00:00
|
|
|
{
|
|
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2010-06-04 06:36:12 +00:00
|
|
|
MultiByteToWideChar(CP_ACP, 0, lpConsoleTitle, -1, WideTitle, Length);
|
|
|
|
Ret = SetConsoleTitleW(WideTitle);
|
|
|
|
HeapFree(GetProcessHeap(), 0, WideTitle);
|
|
|
|
return Ret;
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------
|
2009-01-30 14:25:00 +00:00
|
|
|
* CreateConsoleScreenBuffer
|
2003-07-10 18:50:51 +00:00
|
|
|
*
|
|
|
|
* @implemented
|
1999-03-06 10:57:02 +00:00
|
|
|
*/
|
|
|
|
HANDLE
|
|
|
|
WINAPI
|
2009-01-30 14:25:00 +00:00
|
|
|
CreateConsoleScreenBuffer(DWORD dwDesiredAccess,
|
|
|
|
DWORD dwShareMode,
|
|
|
|
CONST SECURITY_ATTRIBUTES *lpSecurityAttributes,
|
|
|
|
DWORD dwFlags,
|
|
|
|
LPVOID lpScreenBufferData)
|
1999-03-06 10:57:02 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
|
|
|
NTSTATUS Status;
|
2001-01-21 00:07:03 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
if (dwDesiredAccess & ~(GENERIC_READ | GENERIC_WRITE)
|
|
|
|
|| dwShareMode & ~(FILE_SHARE_READ | FILE_SHARE_WRITE)
|
|
|
|
|| dwFlags != CONSOLE_TEXTMODE_BUFFER)
|
|
|
|
{
|
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
|
|
return INVALID_HANDLE_VALUE;
|
|
|
|
}
|
2008-07-22 17:37:13 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
Request.Data.CreateScreenBufferRequest.Access = dwDesiredAccess;
|
|
|
|
Request.Data.CreateScreenBufferRequest.ShareMode = dwShareMode;
|
|
|
|
Request.Data.CreateScreenBufferRequest.Inheritable =
|
|
|
|
lpSecurityAttributes ? lpSecurityAttributes->bInheritHandle : FALSE;
|
2008-07-22 17:37:13 +00:00
|
|
|
|
2012-10-17 23:10:40 +00:00
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
|
|
|
CSR_CREATE_API_NUMBER(CSR_CONSOLE, CREATE_SCREEN_BUFFER),
|
|
|
|
sizeof(CSR_API_MESSAGE));
|
2009-01-30 14:25:00 +00:00
|
|
|
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
|
|
|
{
|
2011-07-23 18:54:29 +00:00
|
|
|
BaseSetLastNTError(Status);
|
2009-01-30 14:25:00 +00:00
|
|
|
return INVALID_HANDLE_VALUE;
|
|
|
|
}
|
|
|
|
return Request.Data.CreateScreenBufferRequest.OutputHandle;
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------
|
2009-01-30 14:25:00 +00:00
|
|
|
* GetConsoleCP
|
2003-07-10 18:50:51 +00:00
|
|
|
*
|
2004-08-22 20:52:28 +00:00
|
|
|
* @implemented
|
1999-03-06 10:57:02 +00:00
|
|
|
*/
|
|
|
|
UINT
|
|
|
|
WINAPI
|
2009-01-30 14:25:00 +00:00
|
|
|
GetConsoleCP(VOID)
|
1999-03-06 10:57:02 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
|
|
|
NTSTATUS Status;
|
2009-01-07 10:23:29 +00:00
|
|
|
|
2012-10-17 23:10:40 +00:00
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
|
|
|
CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_CONSOLE_CP),
|
|
|
|
sizeof(CSR_API_MESSAGE));
|
2009-01-30 14:25:00 +00:00
|
|
|
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
|
|
|
{
|
2011-07-23 18:54:29 +00:00
|
|
|
BaseSetLastNTError (Status);
|
2009-01-30 14:25:00 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
return Request.Data.GetConsoleCodePage.CodePage;
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------
|
2009-01-30 14:25:00 +00:00
|
|
|
* SetConsoleCP
|
2003-07-10 18:50:51 +00:00
|
|
|
*
|
2004-08-24 17:21:12 +00:00
|
|
|
* @implemented
|
1999-03-06 10:57:02 +00:00
|
|
|
*/
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
2009-01-30 14:25:00 +00:00
|
|
|
SetConsoleCP(UINT wCodePageID)
|
1999-03-06 10:57:02 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
|
|
|
NTSTATUS Status;
|
|
|
|
|
|
|
|
Request.Data.SetConsoleCodePage.CodePage = wCodePageID;
|
2009-01-07 10:23:29 +00:00
|
|
|
|
2012-10-17 23:10:40 +00:00
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
|
|
|
CSR_CREATE_API_NUMBER(CSR_CONSOLE, SET_CONSOLE_CP),
|
|
|
|
sizeof(CSR_API_MESSAGE));
|
2009-01-30 14:25:00 +00:00
|
|
|
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
|
|
|
{
|
2011-07-23 18:54:29 +00:00
|
|
|
BaseSetLastNTError(Status);
|
2009-01-30 14:25:00 +00:00
|
|
|
}
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
return NT_SUCCESS(Status);
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------
|
2009-01-30 14:25:00 +00:00
|
|
|
* GetConsoleOutputCP
|
2003-07-10 18:50:51 +00:00
|
|
|
*
|
2004-08-22 20:52:28 +00:00
|
|
|
* @implemented
|
1999-03-06 10:57:02 +00:00
|
|
|
*/
|
|
|
|
UINT
|
|
|
|
WINAPI
|
2009-01-30 14:25:00 +00:00
|
|
|
GetConsoleOutputCP(VOID)
|
1999-03-06 10:57:02 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
|
|
|
NTSTATUS Status;
|
2009-01-07 10:23:29 +00:00
|
|
|
|
2012-10-17 23:10:40 +00:00
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
|
|
|
CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_CONSOLE_OUTPUT_CP),
|
|
|
|
sizeof(CSR_API_MESSAGE));
|
2009-01-30 14:25:00 +00:00
|
|
|
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
|
|
|
{
|
2011-07-23 18:54:29 +00:00
|
|
|
BaseSetLastNTError (Status);
|
2009-01-30 14:25:00 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
return Request.Data.GetConsoleOutputCodePage.CodePage;
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------
|
2009-01-30 14:25:00 +00:00
|
|
|
* SetConsoleOutputCP
|
2003-07-10 18:50:51 +00:00
|
|
|
*
|
2004-08-22 20:52:28 +00:00
|
|
|
* @implemented
|
1999-03-06 10:57:02 +00:00
|
|
|
*/
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
2009-01-30 14:25:00 +00:00
|
|
|
SetConsoleOutputCP(UINT wCodePageID)
|
1999-03-06 10:57:02 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
|
|
|
NTSTATUS Status;
|
2009-01-07 10:23:29 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
Request.Data.SetConsoleOutputCodePage.CodePage = wCodePageID;
|
2012-10-17 23:10:40 +00:00
|
|
|
|
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
|
|
|
CSR_CREATE_API_NUMBER(CSR_CONSOLE, SET_CONSOLE_OUTPUT_CP),
|
|
|
|
sizeof(CSR_API_MESSAGE));
|
2009-01-30 14:25:00 +00:00
|
|
|
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
|
|
|
{
|
2011-07-23 18:54:29 +00:00
|
|
|
BaseSetLastNTError(Status);
|
2009-01-30 14:25:00 +00:00
|
|
|
}
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
return NT_SUCCESS(Status);
|
1999-03-06 10:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-10-20 00:34:40 +00:00
|
|
|
/*--------------------------------------------------------------
|
2009-01-30 14:25:00 +00:00
|
|
|
* GetConsoleProcessList
|
2003-07-10 18:50:51 +00:00
|
|
|
*
|
2005-02-05 01:44:05 +00:00
|
|
|
* @implemented
|
2002-10-20 00:34:40 +00:00
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
DWORD
|
|
|
|
WINAPI
|
2002-10-20 00:34:40 +00:00
|
|
|
GetConsoleProcessList(LPDWORD lpdwProcessList,
|
2005-02-05 01:44:05 +00:00
|
|
|
DWORD dwProcessCount)
|
2002-10-20 00:34:40 +00:00
|
|
|
{
|
2010-05-23 17:40:54 +00:00
|
|
|
PCSR_CAPTURE_BUFFER CaptureBuffer;
|
|
|
|
CSR_API_MESSAGE Request;
|
2009-01-30 14:25:00 +00:00
|
|
|
ULONG nProcesses;
|
|
|
|
NTSTATUS Status;
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
if (lpdwProcessList == NULL || dwProcessCount == 0)
|
|
|
|
{
|
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
|
|
return 0;
|
|
|
|
}
|
2005-02-05 01:44:05 +00:00
|
|
|
|
2010-05-23 17:40:54 +00:00
|
|
|
CaptureBuffer = CsrAllocateCaptureBuffer(1, dwProcessCount * sizeof(DWORD));
|
|
|
|
if (CaptureBuffer == NULL)
|
2009-01-30 14:25:00 +00:00
|
|
|
{
|
2011-02-23 14:24:57 +00:00
|
|
|
DPRINT1("CsrAllocateCaptureBuffer failed!\n");
|
2009-01-30 14:25:00 +00:00
|
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2010-05-23 17:40:54 +00:00
|
|
|
Request.Data.GetProcessListRequest.nMaxIds = dwProcessCount;
|
|
|
|
CsrAllocateMessagePointer(CaptureBuffer,
|
|
|
|
dwProcessCount * sizeof(DWORD),
|
|
|
|
(PVOID*)&Request.Data.GetProcessListRequest.ProcessId);
|
2009-01-30 14:25:00 +00:00
|
|
|
|
2010-05-23 17:40:54 +00:00
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
CaptureBuffer,
|
2012-10-17 23:10:40 +00:00
|
|
|
CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_PROCESS_LIST),
|
2010-05-23 17:40:54 +00:00
|
|
|
sizeof(CSR_API_MESSAGE));
|
|
|
|
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
2009-01-30 14:25:00 +00:00
|
|
|
{
|
2011-07-23 18:54:29 +00:00
|
|
|
BaseSetLastNTError (Status);
|
2009-01-30 14:25:00 +00:00
|
|
|
nProcesses = 0;
|
|
|
|
}
|
|
|
|
else
|
2005-02-05 01:44:05 +00:00
|
|
|
{
|
2010-05-23 17:40:54 +00:00
|
|
|
nProcesses = Request.Data.GetProcessListRequest.nProcessIdsTotal;
|
2009-01-30 14:25:00 +00:00
|
|
|
if (dwProcessCount >= nProcesses)
|
|
|
|
{
|
2010-05-23 17:40:54 +00:00
|
|
|
memcpy(lpdwProcessList, Request.Data.GetProcessListRequest.ProcessId, nProcesses * sizeof(DWORD));
|
2009-01-30 14:25:00 +00:00
|
|
|
}
|
2005-02-05 01:44:05 +00:00
|
|
|
}
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2010-05-23 17:40:54 +00:00
|
|
|
CsrFreeCaptureBuffer(CaptureBuffer);
|
2009-01-30 14:25:00 +00:00
|
|
|
return nProcesses;
|
2002-10-20 00:34:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------
|
2009-01-30 14:25:00 +00:00
|
|
|
* GetConsoleSelectionInfo
|
2003-07-10 18:50:51 +00:00
|
|
|
*
|
2010-05-23 22:38:16 +00:00
|
|
|
* @implemented
|
2002-10-20 00:34:40 +00:00
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
BOOL
|
|
|
|
WINAPI
|
2002-10-20 00:34:40 +00:00
|
|
|
GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo)
|
|
|
|
{
|
2010-05-23 22:38:16 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
2012-10-17 23:10:40 +00:00
|
|
|
NTSTATUS Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
|
|
|
CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_CONSOLE_SELECTION_INFO),
|
|
|
|
sizeof(CSR_API_MESSAGE));
|
2010-05-23 22:38:16 +00:00
|
|
|
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
|
|
|
{
|
2011-07-23 18:54:29 +00:00
|
|
|
BaseSetLastNTError(Status);
|
2010-05-23 22:38:16 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
*lpConsoleSelectionInfo = Request.Data.GetConsoleSelectionInfo.Info;
|
|
|
|
return TRUE;
|
2002-10-20 00:34:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------
|
2009-01-30 14:25:00 +00:00
|
|
|
* AttachConsole
|
2003-07-10 18:50:51 +00:00
|
|
|
*
|
|
|
|
* @unimplemented
|
2002-10-20 00:34:40 +00:00
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
BOOL
|
|
|
|
WINAPI
|
2002-10-20 00:34:40 +00:00
|
|
|
AttachConsole(DWORD dwProcessId)
|
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
DPRINT1("AttachConsole(0x%x) UNIMPLEMENTED!\n", dwProcessId);
|
2009-08-15 10:04:45 +00:00
|
|
|
return TRUE;
|
2002-10-20 00:34:40 +00:00
|
|
|
}
|
|
|
|
|
2003-06-19 19:38:26 +00:00
|
|
|
/*--------------------------------------------------------------
|
2009-01-30 14:25:00 +00:00
|
|
|
* GetConsoleWindow
|
2003-07-10 18:50:51 +00:00
|
|
|
*
|
|
|
|
* @implemented
|
2003-06-19 19:38:26 +00:00
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
HWND
|
|
|
|
WINAPI
|
|
|
|
GetConsoleWindow(VOID)
|
2003-06-19 19:38:26 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
|
|
|
NTSTATUS Status;
|
2009-01-07 10:23:29 +00:00
|
|
|
|
2012-10-17 23:10:40 +00:00
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
|
|
|
CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_CONSOLE_WINDOW),
|
|
|
|
sizeof(CSR_API_MESSAGE));
|
2009-01-30 14:25:00 +00:00
|
|
|
if (!NT_SUCCESS(Status ) || !NT_SUCCESS(Status = Request.Status))
|
|
|
|
{
|
2011-07-23 18:54:29 +00:00
|
|
|
BaseSetLastNTError(Status);
|
2009-01-30 14:25:00 +00:00
|
|
|
return (HWND) NULL;
|
|
|
|
}
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
return Request.Data.GetConsoleWindowRequest.WindowHandle;
|
2003-06-19 19:38:26 +00:00
|
|
|
}
|
|
|
|
|
2004-03-14 17:53:27 +00:00
|
|
|
|
|
|
|
/*--------------------------------------------------------------
|
2009-01-30 14:25:00 +00:00
|
|
|
* SetConsoleIcon
|
2004-08-22 20:52:28 +00:00
|
|
|
*
|
2004-03-14 17:53:27 +00:00
|
|
|
* @implemented
|
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
SetConsoleIcon(HICON hicon)
|
2004-03-14 17:53:27 +00:00
|
|
|
{
|
2009-01-30 14:25:00 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
|
|
|
NTSTATUS Status;
|
2009-01-07 10:23:29 +00:00
|
|
|
|
2009-01-30 14:25:00 +00:00
|
|
|
Request.Data.SetConsoleIconRequest.WindowIcon = hicon;
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2012-10-17 23:10:40 +00:00
|
|
|
Status = CsrClientCallServer(&Request,
|
|
|
|
NULL,
|
|
|
|
CSR_CREATE_API_NUMBER(CSR_CONSOLE, SET_CONSOLE_ICON),
|
|
|
|
sizeof(CSR_API_MESSAGE));
|
2009-01-30 14:25:00 +00:00
|
|
|
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
|
|
|
{
|
2011-07-23 18:54:29 +00:00
|
|
|
BaseSetLastNTError(Status);
|
2009-01-30 14:25:00 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NT_SUCCESS(Status);
|
2004-03-14 17:53:27 +00:00
|
|
|
}
|
|
|
|
|
2004-12-18 13:26:57 +00:00
|
|
|
|
2009-01-19 17:08:47 +00:00
|
|
|
/******************************************************************************
|
|
|
|
* \name SetConsoleInputExeNameW
|
|
|
|
* \brief Sets the console input file name from a unicode string.
|
|
|
|
* \param lpInputExeName Pointer to a unicode string with the name.
|
|
|
|
* \return TRUE if successful, FALSE if unsuccsedful.
|
|
|
|
* \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
|
|
|
|
* the function fails and sets last error to ERROR_INVALID_PARAMETER.
|
2004-12-18 13:26:57 +00:00
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
BOOL
|
|
|
|
WINAPI
|
2004-12-18 13:26:57 +00:00
|
|
|
SetConsoleInputExeNameW(LPCWSTR lpInputExeName)
|
|
|
|
{
|
2009-01-19 17:08:47 +00:00
|
|
|
int lenName;
|
2004-12-18 13:26:57 +00:00
|
|
|
|
2009-01-19 17:08:47 +00:00
|
|
|
if (!lpInputExeName
|
|
|
|
|| (lenName = lstrlenW(lpInputExeName)) == 0
|
|
|
|
|| lenName > INPUTEXENAME_BUFLEN - 1)
|
|
|
|
{
|
|
|
|
/* Fail if string is empty or too long */
|
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2009-01-19 17:08:47 +00:00
|
|
|
RtlEnterCriticalSection(&ConsoleLock);
|
2009-01-18 10:06:34 +00:00
|
|
|
_SEH2_TRY
|
|
|
|
{
|
2009-01-19 17:08:47 +00:00
|
|
|
RtlCopyMemory(InputExeName, lpInputExeName, lenName * sizeof(WCHAR));
|
|
|
|
InputExeName[lenName] = L'\0';
|
2009-01-18 10:06:34 +00:00
|
|
|
}
|
2009-01-19 17:08:47 +00:00
|
|
|
_SEH2_FINALLY
|
2009-01-18 10:06:34 +00:00
|
|
|
{
|
2009-01-19 17:08:47 +00:00
|
|
|
RtlLeaveCriticalSection(&ConsoleLock);
|
2009-01-18 10:06:34 +00:00
|
|
|
}
|
|
|
|
_SEH2_END;
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2009-01-19 17:08:47 +00:00
|
|
|
return TRUE;
|
2004-12-18 13:26:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-01-19 17:08:47 +00:00
|
|
|
/******************************************************************************
|
|
|
|
* \name SetConsoleInputExeNameA
|
|
|
|
* \brief Sets the console input file name from an ansi string.
|
|
|
|
* \param lpInputExeName Pointer to an ansi string with the name.
|
|
|
|
* \return TRUE if successful, FALSE if unsuccsedful.
|
|
|
|
* \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
|
|
|
|
* the function fails and sets last error to ERROR_INVALID_PARAMETER.
|
2004-12-18 13:26:57 +00:00
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
BOOL
|
|
|
|
WINAPI
|
2004-12-18 13:26:57 +00:00
|
|
|
SetConsoleInputExeNameA(LPCSTR lpInputExeName)
|
|
|
|
{
|
2009-01-19 17:08:47 +00:00
|
|
|
WCHAR Buffer[INPUTEXENAME_BUFLEN];
|
|
|
|
ANSI_STRING InputExeNameA;
|
|
|
|
UNICODE_STRING InputExeNameU;
|
|
|
|
NTSTATUS Status;
|
|
|
|
BOOL Ret;
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2009-01-19 17:08:47 +00:00
|
|
|
RtlInitAnsiString(&InputExeNameA, lpInputExeName);
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2009-01-19 17:08:47 +00:00
|
|
|
if(InputExeNameA.Length == 0 ||
|
|
|
|
InputExeNameA.Length > INPUTEXENAME_BUFLEN - 1)
|
|
|
|
{
|
|
|
|
/* Fail if string is empty or too long */
|
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2009-01-19 17:08:47 +00:00
|
|
|
InputExeNameU.Buffer = Buffer;
|
|
|
|
InputExeNameU.MaximumLength = sizeof(Buffer);
|
|
|
|
InputExeNameU.Length = 0;
|
|
|
|
Status = RtlAnsiStringToUnicodeString(&InputExeNameU, &InputExeNameA, FALSE);
|
|
|
|
if(NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
Ret = SetConsoleInputExeNameW(InputExeNameU.Buffer);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2011-07-23 18:54:29 +00:00
|
|
|
BaseSetLastNTError(Status);
|
2009-01-19 17:08:47 +00:00
|
|
|
Ret = FALSE;
|
|
|
|
}
|
2004-12-18 13:26:57 +00:00
|
|
|
|
2009-01-19 17:08:47 +00:00
|
|
|
return Ret;
|
2004-12-18 13:26:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-01-19 17:08:47 +00:00
|
|
|
/******************************************************************************
|
|
|
|
* \name GetConsoleInputExeNameW
|
|
|
|
* \brief Retrieves the console input file name as unicode string.
|
|
|
|
* \param nBufferLength Length of the buffer in WCHARs.
|
|
|
|
* Specify 0 to recieve the needed buffer length.
|
|
|
|
* \param lpBuffer Pointer to a buffer that recieves the string.
|
|
|
|
* \return Needed buffer size if \p nBufferLength is 0.
|
|
|
|
* Otherwise 1 if successful, 2 if buffer is too small.
|
|
|
|
* \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
|
|
|
|
* is not big enough.
|
2004-12-18 13:26:57 +00:00
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
DWORD
|
|
|
|
WINAPI
|
2004-12-18 13:26:57 +00:00
|
|
|
GetConsoleInputExeNameW(DWORD nBufferLength, LPWSTR lpBuffer)
|
|
|
|
{
|
2009-01-19 17:08:47 +00:00
|
|
|
int lenName = lstrlenW(InputExeName);
|
2004-12-18 13:26:57 +00:00
|
|
|
|
2009-01-19 17:08:47 +00:00
|
|
|
if (nBufferLength == 0)
|
2009-01-18 10:06:34 +00:00
|
|
|
{
|
2009-01-19 17:08:47 +00:00
|
|
|
/* Buffer size is requested, return it */
|
|
|
|
return lenName + 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(lenName + 1 > nBufferLength)
|
|
|
|
{
|
|
|
|
/* Buffer is not large enough! */
|
2009-01-18 10:06:34 +00:00
|
|
|
SetLastError(ERROR_BUFFER_OVERFLOW);
|
2009-01-19 17:08:47 +00:00
|
|
|
return 2;
|
2009-01-18 10:06:34 +00:00
|
|
|
}
|
2009-01-19 17:08:47 +00:00
|
|
|
|
|
|
|
RtlEnterCriticalSection(&ConsoleLock);
|
|
|
|
_SEH2_TRY
|
2009-01-07 10:23:29 +00:00
|
|
|
{
|
2009-01-19 17:08:47 +00:00
|
|
|
RtlCopyMemory(lpBuffer, InputExeName, lenName * sizeof(WCHAR));
|
|
|
|
lpBuffer[lenName] = '\0';
|
|
|
|
}
|
|
|
|
_SEH2_FINALLY
|
|
|
|
{
|
|
|
|
RtlLeaveCriticalSection(&ConsoleLock);
|
2009-01-07 10:23:29 +00:00
|
|
|
}
|
2009-01-18 10:06:34 +00:00
|
|
|
_SEH2_END;
|
|
|
|
|
2009-01-19 17:08:47 +00:00
|
|
|
/* Success, return 1 */
|
|
|
|
return 1;
|
2004-12-18 13:26:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-01-19 17:08:47 +00:00
|
|
|
/******************************************************************************
|
|
|
|
* \name GetConsoleInputExeNameA
|
|
|
|
* \brief Retrieves the console input file name as ansi string.
|
|
|
|
* \param nBufferLength Length of the buffer in CHARs.
|
|
|
|
* \param lpBuffer Pointer to a buffer that recieves the string.
|
|
|
|
* \return 1 if successful, 2 if buffer is too small.
|
|
|
|
* \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
|
|
|
|
* is not big enough. The buffer recieves as much characters as fit.
|
2004-12-18 13:26:57 +00:00
|
|
|
*/
|
2009-01-30 14:25:00 +00:00
|
|
|
DWORD
|
|
|
|
WINAPI
|
2004-12-18 13:26:57 +00:00
|
|
|
GetConsoleInputExeNameA(DWORD nBufferLength, LPSTR lpBuffer)
|
|
|
|
{
|
2009-01-19 17:08:47 +00:00
|
|
|
WCHAR Buffer[INPUTEXENAME_BUFLEN];
|
|
|
|
DWORD Ret;
|
|
|
|
UNICODE_STRING BufferU;
|
|
|
|
ANSI_STRING BufferA;
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2009-01-19 17:08:47 +00:00
|
|
|
/* Get the unicode name */
|
|
|
|
Ret = GetConsoleInputExeNameW(sizeof(Buffer) / sizeof(Buffer[0]), Buffer);
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2009-01-19 17:08:47 +00:00
|
|
|
/* Initialize strings for conversion */
|
|
|
|
RtlInitUnicodeString(&BufferU, Buffer);
|
|
|
|
BufferA.Length = 0;
|
|
|
|
BufferA.MaximumLength = nBufferLength;
|
|
|
|
BufferA.Buffer = lpBuffer;
|
2004-12-18 13:26:57 +00:00
|
|
|
|
2009-01-19 17:08:47 +00:00
|
|
|
/* Convert unicode name to ansi, copying as much chars as fit */
|
|
|
|
RtlUnicodeStringToAnsiString(&BufferA, &BufferU, FALSE);
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2009-01-19 17:08:47 +00:00
|
|
|
/* Error handling */
|
|
|
|
if(nBufferLength <= BufferU.Length / sizeof(WCHAR))
|
|
|
|
{
|
|
|
|
SetLastError(ERROR_BUFFER_OVERFLOW);
|
|
|
|
return 2;
|
2004-12-18 13:26:57 +00:00
|
|
|
}
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2009-01-19 17:08:47 +00:00
|
|
|
return Ret;
|
2004-12-18 13:26:57 +00:00
|
|
|
}
|
|
|
|
|
2011-07-22 02:13:57 +00:00
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
GetConsoleCharType(HANDLE hConsole, COORD Coord, PDWORD Type)
|
|
|
|
{
|
|
|
|
STUB;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
GetConsoleCursorMode(HANDLE hConsole, PBOOL pUnknown1, PBOOL pUnknown2)
|
|
|
|
{
|
|
|
|
STUB;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
GetConsoleNlsMode(HANDLE hConsole, LPDWORD lpMode)
|
|
|
|
{
|
|
|
|
STUB;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
RegisterConsoleIME(HWND hWnd, LPDWORD ThreadId)
|
|
|
|
{
|
|
|
|
STUB;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
RegisterConsoleOS2(BOOL bUnknown)
|
|
|
|
{
|
|
|
|
STUB;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
SetConsoleCursorMode(HANDLE hConsole, BOOL Unknown1, BOOL Unknown2)
|
|
|
|
{
|
|
|
|
STUB;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
SetConsoleLocalEUDC(DWORD Unknown1, DWORD Unknown2, DWORD Unknown3, DWORD Unknown4)
|
|
|
|
{
|
|
|
|
STUB;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
SetConsoleNlsMode(HANDLE hConsole, DWORD dwMode)
|
|
|
|
{
|
|
|
|
STUB;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
SetConsoleOS2OemFormat(BOOL bUnknown)
|
|
|
|
{
|
|
|
|
STUB;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
UnregisterConsoleIME(VOID)
|
|
|
|
{
|
|
|
|
STUB;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @unimplemented
|
|
|
|
*/
|
|
|
|
BOOL WINAPI GetConsoleKeyboardLayoutNameA(LPSTR name)
|
|
|
|
{
|
|
|
|
STUB;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @unimplemented
|
|
|
|
*/
|
|
|
|
BOOL WINAPI GetConsoleKeyboardLayoutNameW(LPWSTR name)
|
|
|
|
{
|
|
|
|
STUB;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @unimplemented
|
|
|
|
*/
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
SetLastConsoleEventActive(VOID)
|
|
|
|
{
|
|
|
|
STUB;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
1999-03-06 10:57:02 +00:00
|
|
|
/* EOF */
|