* PROJECT: ReactOS system libraries
* FILE: dll/win32/kernel32/client/console/console.c
* PURPOSE: Win32 server console functions
- * PROGRAMMER: James Tabor
+ * PROGRAMMERS: James Tabor
* <jimtabor@adsl-64-217-116-74.dsl.hstntx.swbell.net>
- * UPDATE HISTORY:
- * 199901?? ?? Created
- * 19990204 EA SetConsoleTitleA
- * 19990306 EA Stubs
*/
/* INCLUDES *******************************************************************/
#include <k32.h>
-// #define NDEBUG
+#define NDEBUG
#include <debug.h>
+
+/* GLOBALS ********************************************************************/
+
extern RTL_CRITICAL_SECTION ConsoleLock;
extern BOOL ConsoleInitialized;
extern BOOL WINAPI IsDebuggerPresent(VOID);
-/* GLOBALS ********************************************************************/
+/* Console reserved "file" names */
+static LPCWSTR BaseConFileName = CONSOLE_FILE_NAME;
+static LPCWSTR BaseConInputFileName = CONSOLE_INPUT_FILE_NAME;
+static LPCWSTR BaseConOutputFileName = CONSOLE_OUTPUT_FILE_NAME;
PHANDLER_ROUTINE InitialHandler[1];
PHANDLER_ROUTINE* CtrlHandlers;
ULONG NrCtrlHandlers;
ULONG NrAllocatedHandlers;
+BOOL LastCloseNotify = FALSE;
+
+HANDLE InputWaitHandle = INVALID_HANDLE_VALUE;
#define INPUTEXENAME_BUFLEN 256
static WCHAR InputExeName[INPUTEXENAME_BUFLEN];
+
/* Default Console Control Handler ********************************************/
BOOL
DPRINT("Ctrl-Break Event\n");
break;
- case CTRL_SHUTDOWN_EVENT:
- DPRINT("Ctrl Shutdown Event\n");
- break;
-
case CTRL_CLOSE_EVENT:
DPRINT("Ctrl Close Event\n");
break;
+ case CTRL_LAST_CLOSE_EVENT:
+ DPRINT("Ctrl Last Close Event\n");
+ break;
+
case CTRL_LOGOFF_EVENT:
DPRINT("Ctrl Logoff Event\n");
break;
+
+ case CTRL_SHUTDOWN_EVENT:
+ DPRINT("Ctrl Shutdown Event\n");
+ break;
}
ExitProcess(CONTROL_C_EXIT);
return TRUE;
}
-__declspec(noreturn)
-VOID
-CALLBACK
-ConsoleControlDispatcher(DWORD CodeAndFlag)
+DWORD
+WINAPI
+ConsoleControlDispatcher(IN LPVOID lpThreadParameter)
{
DWORD nExitCode = 0;
+ DWORD CodeAndFlag = PtrToUlong(lpThreadParameter);
DWORD nCode = CodeAndFlag & MAXLONG;
UINT i;
EXCEPTION_RECORD erException;
-
- DPRINT("Console Dispatcher Active: %lx %lx\n", CodeAndFlag, nCode);
+
+ DPRINT1("Console Dispatcher Active: %lx %lx\n", CodeAndFlag, nCode);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
switch(nCode)
erException.ExceptionRecord = NULL;
erException.ExceptionAddress = DefaultConsoleCtrlHandler;
erException.NumberParameters = 0;
-
+
_SEH2_TRY
{
RtlRaiseException(&erException);
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
RtlEnterCriticalSection(&ConsoleLock);
-
+
if ((nCode != CTRL_C_EVENT) ||
(NtCurrentPeb()->ProcessParameters->ConsoleFlags != 1))
{
if (CtrlHandlers[i - 1](nCode)) break;
}
}
-
+
RtlLeaveCriticalSection(&ConsoleLock);
}
_SEH2_END;
-
+
ExitThread(0);
}
-
break;
}
case CTRL_LOGOFF_EVENT:
case CTRL_SHUTDOWN_EVENT:
break;
-
- case 3:
-
- ExitThread(0);
+
+ case CTRL_LAST_CLOSE_EVENT:
+ /*
+ * In case the console app hasn't register for last close notification,
+ * just kill this console handler thread. We don't want that such apps
+ * get killed for unexpected reasons. On the contrary apps that registered
+ * can be killed because they expect to be.
+ */
+ if (!LastCloseNotify) ExitThread(0);
break;
-
+
case 4:
-
ExitProcess(CONTROL_C_EXIT);
break;
default:
-
ASSERT(FALSE);
break;
}
-
+
ASSERT(ConsoleInitialized);
-
+
RtlEnterCriticalSection(&ConsoleLock);
+
nExitCode = 0;
if ((nCode != CTRL_C_EVENT) || (NtCurrentPeb()->ProcessParameters->ConsoleFlags != 1))
{
switch(nCode)
{
case CTRL_CLOSE_EVENT:
+ case CTRL_LAST_CLOSE_EVENT:
case CTRL_LOGOFF_EVENT:
case CTRL_SHUTDOWN_EVENT:
- case 3:
nExitCode = CodeAndFlag;
break;
}
}
}
}
-
+
RtlLeaveCriticalSection(&ConsoleLock);
+
ExitThread(nExitCode);
+ return STATUS_SUCCESS;
}
-/* Get the size needed to copy a string to a capture buffer, including alignment */
-static ULONG
-IntStringSize(LPCVOID String,
- BOOL Unicode)
+VOID
+WINAPI
+InitConsoleCtrlHandling(VOID)
{
- ULONG Size = (Unicode ? wcslen(String) : strlen(String)) * sizeof(WCHAR);
- return (Size + 3) & -4;
+ /* Initialize Console Ctrl Handler */
+ NrAllocatedHandlers = NrCtrlHandlers = 1;
+ CtrlHandlers = InitialHandler;
+ CtrlHandlers[0] = DefaultConsoleCtrlHandler;
}
-/* Copy a string to a capture buffer */
-static VOID
-IntCaptureMessageString(PCSR_CAPTURE_BUFFER CaptureBuffer,
- LPCVOID String,
- BOOL Unicode,
- PUNICODE_STRING RequestString)
+
+/* FUNCTIONS ******************************************************************/
+
+LPCWSTR
+IntCheckForConsoleFileName(IN LPCWSTR pszName,
+ IN DWORD dwDesiredAccess)
{
- ULONG Size;
- if (Unicode)
+ LPCWSTR ConsoleName = pszName;
+ ULONG DeviceNameInfo;
+
+ /*
+ * Check whether we deal with a DOS device, and if so,
+ * strip the path till the file name.
+ * Therefore, things like \\.\CON or C:\some_path\CONIN$
+ * are transformed into CON or CONIN$, for example.
+ */
+ DeviceNameInfo = RtlIsDosDeviceName_U(pszName);
+ if (DeviceNameInfo != 0)
{
- Size = wcslen(String) * sizeof(WCHAR);
- CsrCaptureMessageBuffer(CaptureBuffer, (PVOID)String, Size, (PVOID *)&RequestString->Buffer);
+ ConsoleName = (LPCWSTR)((ULONG_PTR)ConsoleName + ((DeviceNameInfo >> 16) & 0xFFFF));
}
- else
+
+ /* Return a standard console "file" name according to what we passed in parameters */
+ if (_wcsicmp(ConsoleName, BaseConInputFileName) == 0)
+ {
+ return BaseConInputFileName;
+ }
+ else if (_wcsicmp(ConsoleName, BaseConOutputFileName) == 0)
+ {
+ return BaseConOutputFileName;
+ }
+ else if (_wcsicmp(ConsoleName, BaseConFileName) == 0)
{
- 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);
+ if ((dwDesiredAccess & (GENERIC_READ | GENERIC_WRITE)) == GENERIC_READ)
+ {
+ return BaseConInputFileName;
+ }
+ else if ((dwDesiredAccess & (GENERIC_READ | GENERIC_WRITE)) == GENERIC_WRITE)
+ {
+ return BaseConOutputFileName;
+ }
}
- RequestString->Length = RequestString->MaximumLength = Size;
+
+ /* If we are there, that means that either the file name or the desired access are wrong */
+ return NULL;
}
-/* FUNCTIONS ******************************************************************/
/*
- * @unimplemented (Undocumented)
+ * @implemented (Undocumented)
+ * @note See http://undoc.airesoft.co.uk/kernel32.dll/ConsoleMenuControl.php
*/
-BOOL
+HMENU
WINAPI
-ConsoleMenuControl(HANDLE hConsole,
- DWORD Unknown1,
- DWORD Unknown2)
+ConsoleMenuControl(HANDLE hConsoleOutput,
+ DWORD dwCmdIdLow,
+ DWORD dwCmdIdHigh)
{
- DPRINT1("ConsoleMenuControl(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsole, Unknown1, Unknown2);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_MENUCONTROL MenuControlRequest = &ApiMessage.Data.MenuControlRequest;
+
+ MenuControlRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ MenuControlRequest->OutputHandle = hConsoleOutput;
+ MenuControlRequest->CmdIdLow = dwCmdIdLow;
+ MenuControlRequest->CmdIdHigh = dwCmdIdHigh;
+ MenuControlRequest->MenuHandle = NULL;
+
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepMenuControl),
+ sizeof(*MenuControlRequest));
+
+ return MenuControlRequest->MenuHandle;
}
BOOL bInheritHandle,
DWORD dwOptions)
{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_DUPLICATEHANDLE DuplicateHandleRequest = &ApiMessage.Data.DuplicateHandleRequest;
- if (dwOptions & ~(DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)
- || (!(dwOptions & DUPLICATE_SAME_ACCESS)
- && dwDesiredAccess & ~(GENERIC_READ | GENERIC_WRITE)))
+ if ( (dwOptions & ~(DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) ||
+ (!(dwOptions & DUPLICATE_SAME_ACCESS) &&
+ (dwDesiredAccess & ~(GENERIC_READ | GENERIC_WRITE))) )
{
- SetLastError (ERROR_INVALID_PARAMETER);
+ SetLastError(ERROR_INVALID_PARAMETER);
return INVALID_HANDLE_VALUE;
}
- Request.Data.DuplicateHandleRequest.Handle = hConsole;
- Request.Data.DuplicateHandleRequest.Access = dwDesiredAccess;
- Request.Data.DuplicateHandleRequest.Inheritable = bInheritHandle;
- Request.Data.DuplicateHandleRequest.Options = dwOptions;
+ DuplicateHandleRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ DuplicateHandleRequest->SourceHandle = hConsole;
+ DuplicateHandleRequest->DesiredAccess = dwDesiredAccess;
+ DuplicateHandleRequest->InheritHandle = bInheritHandle;
+ DuplicateHandleRequest->Options = dwOptions;
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_NATIVE, DUPLICATE_HANDLE),
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status=Request.Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepDuplicateHandle),
+ sizeof(*DuplicateHandleRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return INVALID_HANDLE_VALUE;
}
- return Request.Data.DuplicateHandleRequest.Handle;
+ return DuplicateHandleRequest->TargetHandle;
}
-static BOOL
-IntExpungeConsoleCommandHistory(LPCVOID lpExeName, BOOL bUnicode)
+/*
+ * @implemented
+ */
+BOOL
+WINAPI
+GetConsoleHandleInformation(IN HANDLE hHandle,
+ OUT LPDWORD lpdwFlags)
{
- CSR_API_MESSAGE Request;
- PCSR_CAPTURE_BUFFER CaptureBuffer;
- NTSTATUS Status;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_GETHANDLEINFO GetHandleInfoRequest = &ApiMessage.Data.GetHandleInfoRequest;
- if (lpExeName == NULL || !(bUnicode ? *(PWCHAR)lpExeName : *(PCHAR)lpExeName))
- {
- SetLastError(ERROR_INVALID_PARAMETER);
- return FALSE;
- }
+ GetHandleInfoRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ GetHandleInfoRequest->Handle = hHandle;
- CaptureBuffer = CsrAllocateCaptureBuffer(1, IntStringSize(lpExeName, bUnicode));
- if (!CaptureBuffer)
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetHandleInformation),
+ sizeof(*GetHandleInfoRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- DPRINT1("CsrAllocateCaptureBuffer failed!\n");
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
- IntCaptureMessageString(CaptureBuffer, lpExeName, bUnicode,
- &Request.Data.ExpungeCommandHistory.ExeName);
-
- Status = CsrClientCallServer(&Request,
- CaptureBuffer,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, EXPUNGE_COMMAND_HISTORY),
- sizeof(CSR_API_MESSAGE));
-
- CsrFreeCaptureBuffer(CaptureBuffer);
-
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
- {
- BaseSetLastNTError(Status);
- return FALSE;
- }
+ *lpdwFlags = GetHandleInfoRequest->Flags;
return TRUE;
}
-/*
- * @implemented (Undocumented)
- */
-BOOL
-WINAPI
-ExpungeConsoleCommandHistoryW(LPCWSTR lpExeName)
-{
- return IntExpungeConsoleCommandHistory(lpExeName, TRUE);
-}
/*
- * @implemented (Undocumented)
+ * @implemented
*/
BOOL
WINAPI
-ExpungeConsoleCommandHistoryA(LPCSTR lpExeName)
-{
- return IntExpungeConsoleCommandHistory(lpExeName, FALSE);
-}
-
-
-static DWORD
-IntGetConsoleCommandHistory(LPVOID lpHistory, DWORD cbHistory, LPCVOID lpExeName, BOOL bUnicode)
+SetConsoleHandleInformation(IN HANDLE hHandle,
+ IN DWORD dwMask,
+ IN DWORD dwFlags)
{
- CSR_API_MESSAGE Request;
- PCSR_CAPTURE_BUFFER CaptureBuffer;
- NTSTATUS Status;
- DWORD HistoryLength = cbHistory * (bUnicode ? 1 : sizeof(WCHAR));
-
- if (lpExeName == NULL || !(bUnicode ? *(PWCHAR)lpExeName : *(PCHAR)lpExeName))
- {
- SetLastError(ERROR_INVALID_PARAMETER);
- return 0;
- }
-
- CaptureBuffer = CsrAllocateCaptureBuffer(2, IntStringSize(lpExeName, bUnicode) +
- HistoryLength);
- if (!CaptureBuffer)
- {
- DPRINT1("CsrAllocateCaptureBuffer failed!\n");
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return 0;
- }
-
- IntCaptureMessageString(CaptureBuffer, lpExeName, bUnicode,
- &Request.Data.GetCommandHistory.ExeName);
- Request.Data.GetCommandHistory.Length = HistoryLength;
- CsrAllocateMessagePointer(CaptureBuffer, HistoryLength,
- (PVOID*)&Request.Data.GetCommandHistory.History);
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_SETHANDLEINFO SetHandleInfoRequest = &ApiMessage.Data.SetHandleInfoRequest;
- Status = CsrClientCallServer(&Request,
- CaptureBuffer,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_COMMAND_HISTORY),
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
- {
- CsrFreeCaptureBuffer(CaptureBuffer);
- BaseSetLastNTError(Status);
- return 0;
- }
+ SetHandleInfoRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ SetHandleInfoRequest->Handle = hHandle;
+ SetHandleInfoRequest->Mask = dwMask;
+ SetHandleInfoRequest->Flags = dwFlags;
- if (bUnicode)
- {
- memcpy(lpHistory,
- Request.Data.GetCommandHistory.History,
- Request.Data.GetCommandHistory.Length);
- }
- else
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetHandleInformation),
+ sizeof(*SetHandleInfoRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- WideCharToMultiByte(CP_ACP, 0,
- Request.Data.GetCommandHistory.History,
- Request.Data.GetCommandHistory.Length / sizeof(WCHAR),
- lpHistory,
- cbHistory,
- NULL, NULL);
+ BaseSetLastNTError(ApiMessage.Status);
+ return FALSE;
}
- CsrFreeCaptureBuffer(CaptureBuffer);
- return Request.Data.GetCommandHistory.Length;
+ return TRUE;
}
-/*
- * @implemented (Undocumented)
- */
-DWORD
-WINAPI
-GetConsoleCommandHistoryW(LPWSTR lpHistory,
- DWORD cbHistory,
- LPCWSTR lpExeName)
-{
- return IntGetConsoleCommandHistory(lpHistory, cbHistory, lpExeName, TRUE);
-}
/*
- * @implemented (Undocumented)
+ * @implemented
*/
-DWORD
+BOOL
WINAPI
-GetConsoleCommandHistoryA(LPSTR lpHistory,
- DWORD cbHistory,
- LPCSTR lpExeName)
-{
- return IntGetConsoleCommandHistory(lpHistory, cbHistory, lpExeName, FALSE);
-}
-
-
-static DWORD
-IntGetConsoleCommandHistoryLength(LPCVOID lpExeName, BOOL bUnicode)
+GetConsoleDisplayMode(LPDWORD lpModeFlags)
{
- CSR_API_MESSAGE Request;
- PCSR_CAPTURE_BUFFER CaptureBuffer;
- NTSTATUS Status;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_GETDISPLAYMODE GetDisplayModeRequest = &ApiMessage.Data.GetDisplayModeRequest;
- if (lpExeName == NULL || !(bUnicode ? *(PWCHAR)lpExeName : *(PCHAR)lpExeName))
+ if (lpModeFlags == NULL)
{
SetLastError(ERROR_INVALID_PARAMETER);
- return 0;
- }
-
- CaptureBuffer = CsrAllocateCaptureBuffer(1, IntStringSize(lpExeName, bUnicode));
- if (!CaptureBuffer)
- {
- DPRINT1("CsrAllocateCaptureBuffer failed!\n");
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return 0;
+ return FALSE;
}
- IntCaptureMessageString(CaptureBuffer, lpExeName, bUnicode,
- &Request.Data.GetCommandHistoryLength.ExeName);
-
- Status = CsrClientCallServer(&Request,
- CaptureBuffer,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_COMMAND_HISTORY_LENGTH),
- sizeof(CSR_API_MESSAGE));
-
- CsrFreeCaptureBuffer(CaptureBuffer);
+ GetDisplayModeRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetDisplayMode),
+ sizeof(*GetDisplayModeRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
- return 0;
+ BaseSetLastNTError(ApiMessage.Status);
+ return FALSE;
}
- return Request.Data.GetCommandHistoryLength.Length;
-}
-
-/*
- * @implemented (Undocumented)
- */
-DWORD
-WINAPI
-GetConsoleCommandHistoryLengthW(LPCWSTR lpExeName)
-{
- return IntGetConsoleCommandHistoryLength(lpExeName, TRUE);
-}
-
-/*
- * @implemented (Undocumented)
- */
-DWORD
-WINAPI
-GetConsoleCommandHistoryLengthA(LPCSTR lpExeName)
-{
- return IntGetConsoleCommandHistoryLength(lpExeName, FALSE) / sizeof(WCHAR);
-}
-
+ *lpModeFlags = GetDisplayModeRequest->DisplayMode; // ModeFlags
-/*
- * @unimplemented
- */
-INT
-WINAPI
-GetConsoleDisplayMode(LPDWORD lpdwMode)
- /*
- * FUNCTION: Get the console display mode
- * ARGUMENTS:
- * lpdwMode - Address of variable that receives the current value
- * of display mode
- * STATUS: Undocumented
- */
-{
- DPRINT1("GetConsoleDisplayMode(0x%x) UNIMPLEMENTED!\n", lpdwMode);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
+ return TRUE;
}
*/
DWORD
WINAPI
-GetConsoleFontInfo(DWORD Unknown0,
- DWORD Unknown1,
- DWORD Unknown2,
- DWORD Unknown3)
+GetConsoleFontInfo(HANDLE hConsoleOutput,
+ BOOL bMaximumWindow,
+ DWORD nFontCount,
+ PCONSOLE_FONT_INFO lpConsoleFontInfo)
{
- DPRINT1("GetConsoleFontInfo(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1, Unknown2, Unknown3);
+ DPRINT1("GetConsoleFontInfo(0x%p, %d, %lu, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput, bMaximumWindow, nFontCount, lpConsoleFontInfo);
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return 0;
}
DWORD nFont)
{
COORD Empty = {0, 0};
- DPRINT1("GetConsoleFontSize(0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput, nFont);
+ DPRINT1("GetConsoleFontSize(0x%p, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput, nFont);
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return Empty;
}
/*
* @implemented (Undocumented)
*/
-DWORD
+BOOL
WINAPI
-GetConsoleHardwareState(HANDLE hConsole,
- DWORD Flags,
+GetConsoleHardwareState(HANDLE hConsoleOutput,
+ PDWORD Flags,
PDWORD State)
{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_GETSETHWSTATE HardwareStateRequest = &ApiMessage.Data.HardwareStateRequest;
- Request.Data.ConsoleHardwareStateRequest.ConsoleHandle = hConsole;
- Request.Data.ConsoleHardwareStateRequest.SetGet = CONSOLE_HARDWARE_STATE_GET;
+ DPRINT1("GetConsoleHardwareState(%lu, 0x%p) UNIMPLEMENTED!\n", Flags, State);
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, SETGET_CONSOLE_HW_STATE),
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ if (Flags == NULL || State == NULL)
{
- BaseSetLastNTError(Status);
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
+ HardwareStateRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ HardwareStateRequest->OutputHandle = hConsoleOutput;
+
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetHardwareState),
+ sizeof(*HardwareStateRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
+ {
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
- *State = Request.Data.ConsoleHardwareStateRequest.State;
+ *Flags = HardwareStateRequest->Flags;
+ *State = HardwareStateRequest->State;
+
return TRUE;
}
WINAPI
GetConsoleInputWaitHandle(VOID)
{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
-
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_INPUT_WAIT_HANDLE),
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
- {
- BaseSetLastNTError(Status);
- return 0;
- }
-
- return Request.Data.GetConsoleInputWaitHandle.InputWaitHandle;
+ return InputWaitHandle;
}
/*
* @unimplemented
*/
-INT
+BOOL
WINAPI
GetCurrentConsoleFont(HANDLE hConsoleOutput,
BOOL bMaximumWindow,
PCONSOLE_FONT_INFO lpConsoleCurrentFont)
{
- DPRINT1("GetCurrentConsoleFont(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput, bMaximumWindow, lpConsoleCurrentFont);
+ DPRINT1("GetCurrentConsoleFont(0x%p, 0x%x, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput, bMaximumWindow, lpConsoleCurrentFont);
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return 0;
}
{
DPRINT1("GetNumberOfConsoleFonts() UNIMPLEMENTED!\n");
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 1; /* FIXME: call csrss.exe */
+ return 1;
}
/*
- * @unimplemented (Undocumented)
+ * @implemented (Undocumented)
+ * @note See http://blog.airesoft.co.uk/2012/10/things-ms-can-do-that-they-dont-tell-you-about-console-graphics/
*/
-DWORD
+BOOL
WINAPI
-InvalidateConsoleDIBits(DWORD Unknown0,
- DWORD Unknown1)
+InvalidateConsoleDIBits(IN HANDLE hConsoleOutput,
+ IN PSMALL_RECT lpRect)
{
- DPRINT1("InvalidateConsoleDIBits(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_INVALIDATEDIBITS InvalidateDIBitsRequest = &ApiMessage.Data.InvalidateDIBitsRequest;
+
+ if (lpRect == NULL)
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
+ InvalidateDIBitsRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ InvalidateDIBitsRequest->OutputHandle = hConsoleOutput;
+ InvalidateDIBitsRequest->Region = *lpRect;
+
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepInvalidateBitMapRect),
+ sizeof(*InvalidateDIBitsRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
+ {
+ BaseSetLastNTError(ApiMessage.Status);
+ return FALSE;
+ }
+
+ return TRUE;
}
BOOL bInheritHandle,
DWORD dwShareMode)
{
- CSR_API_MESSAGE Request;
- ULONG CsrRequest;
- NTSTATUS Status = STATUS_SUCCESS;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_OPENCONSOLE OpenConsoleRequest = &ApiMessage.Data.OpenConsoleRequest;
+ CONSOLE_HANDLE_TYPE HandleType;
- if (wsName && 0 == _wcsicmp(wsName, L"CONIN$"))
+ if (wsName && (_wcsicmp(wsName, BaseConInputFileName) == 0))
{
- CsrRequest = CSR_CREATE_API_NUMBER(CSR_NATIVE, GET_INPUT_HANDLE);
+ HandleType = HANDLE_INPUT;
}
- else if (wsName && 0 == _wcsicmp(wsName, L"CONOUT$"))
+ else if (wsName && (_wcsicmp(wsName, BaseConOutputFileName) == 0))
{
- CsrRequest = CSR_CREATE_API_NUMBER(CSR_NATIVE, GET_OUTPUT_HANDLE);
+ HandleType = HANDLE_OUTPUT;
}
else
{
SetLastError(ERROR_INVALID_PARAMETER);
- return(INVALID_HANDLE_VALUE);
- }
-
- if (dwDesiredAccess & ~(GENERIC_READ|GENERIC_WRITE))
- {
- SetLastError(ERROR_INVALID_PARAMETER);
- return(INVALID_HANDLE_VALUE);
+ return INVALID_HANDLE_VALUE;
}
- if (dwShareMode & ~(FILE_SHARE_READ|FILE_SHARE_WRITE))
+ if ( (dwDesiredAccess & ~(GENERIC_READ | GENERIC_WRITE)) ||
+ (dwShareMode & ~(FILE_SHARE_READ | FILE_SHARE_WRITE)) )
{
SetLastError(ERROR_INVALID_PARAMETER);
- return(INVALID_HANDLE_VALUE);
+ 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;
- Request.Data.GetInputHandleRequest.ShareMode = dwShareMode;
+ OpenConsoleRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ OpenConsoleRequest->HandleType = HandleType;
+ OpenConsoleRequest->DesiredAccess = dwDesiredAccess;
+ OpenConsoleRequest->InheritHandle = bInheritHandle;
+ OpenConsoleRequest->ShareMode = dwShareMode;
- Status = CsrClientCallServer(&Request,
- NULL,
- CsrRequest,
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepOpenConsole),
+ sizeof(*OpenConsoleRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return INVALID_HANDLE_VALUE;
}
- return Request.Data.GetInputHandleRequest.Handle;
+ return OpenConsoleRequest->Handle;
}
/*
- * @unimplemented (Undocumented)
+ * @implemented (Undocumented)
+ * @note See http://undoc.airesoft.co.uk/kernel32.dll/SetConsoleCursor.php
*/
BOOL
WINAPI
-SetConsoleCursor(DWORD Unknown0,
- DWORD Unknown1)
+SetConsoleCursor(HANDLE hConsoleOutput,
+ HCURSOR hCursor)
{
- DPRINT1("SetConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_SETCURSOR SetCursorRequest = &ApiMessage.Data.SetCursorRequest;
+
+ SetCursorRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ SetCursorRequest->OutputHandle = hConsoleOutput;
+ SetCursorRequest->CursorHandle = hCursor;
+
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetCursor),
+ sizeof(*SetCursorRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
+ {
+ BaseSetLastNTError(ApiMessage.Status);
+ return FALSE;
+ }
+
+ return TRUE;
}
/*
- * @unimplemented
+ * @implemented
*/
BOOL
WINAPI
-SetConsoleDisplayMode(HANDLE hOut,
- DWORD dwNewMode,
- PCOORD lpdwOldMode)
- /*
- * FUNCTION: Set the console display mode.
- * ARGUMENTS:
- * hOut - Standard output handle.
- * dwNewMode - New mode.
- * lpdwOldMode - Address of a variable that receives the old mode.
- */
-{
- DPRINT1("SetConsoleDisplayMode(0x%x, 0x%x, 0x%p) UNIMPLEMENTED!\n", hOut, dwNewMode, lpdwOldMode);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+SetConsoleDisplayMode(HANDLE hConsoleOutput,
+ DWORD dwFlags, // dwModeFlags
+ PCOORD lpNewScreenBufferDimensions)
+{
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_SETDISPLAYMODE SetDisplayModeRequest = &ApiMessage.Data.SetDisplayModeRequest;
+
+ SetDisplayModeRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ SetDisplayModeRequest->OutputHandle = hConsoleOutput;
+ SetDisplayModeRequest->DisplayMode = dwFlags; // ModeFlags ; dwModeFlags
+ SetDisplayModeRequest->NewSBDim.X = 0;
+ SetDisplayModeRequest->NewSBDim.Y = 0;
+ /* SetDisplayModeRequest->EventHandle; */
+
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetDisplayMode),
+ sizeof(*SetDisplayModeRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
+ {
+ BaseSetLastNTError(ApiMessage.Status);
+ return FALSE;
+ }
+
+ if (lpNewScreenBufferDimensions)
+ *lpNewScreenBufferDimensions = SetDisplayModeRequest->NewSBDim;
+
+ return TRUE;
}
*/
BOOL
WINAPI
-SetConsoleFont(DWORD Unknown0,
- DWORD Unknown1)
+SetConsoleFont(HANDLE hConsoleOutput,
+ DWORD nFont)
{
- DPRINT1("SetConsoleFont(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1);
+ DPRINT1("SetConsoleFont(0x%p, %lu) UNIMPLEMENTED!\n", hConsoleOutput, nFont);
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
}
*/
BOOL
WINAPI
-SetConsoleHardwareState(HANDLE hConsole,
+SetConsoleHardwareState(HANDLE hConsoleOutput,
DWORD Flags,
DWORD State)
{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_GETSETHWSTATE HardwareStateRequest = &ApiMessage.Data.HardwareStateRequest;
- Request.Data.ConsoleHardwareStateRequest.ConsoleHandle = hConsole;
- Request.Data.ConsoleHardwareStateRequest.SetGet = CONSOLE_HARDWARE_STATE_SET;
- Request.Data.ConsoleHardwareStateRequest.State = State;
+ DPRINT1("SetConsoleHardwareState(%lu, %lu) UNIMPLEMENTED!\n", Flags, State);
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, SETGET_CONSOLE_HW_STATE),
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ HardwareStateRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ HardwareStateRequest->OutputHandle = hConsoleOutput;
+ HardwareStateRequest->Flags = Flags;
+ HardwareStateRequest->State = State;
+
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetHardwareState),
+ sizeof(*HardwareStateRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
/*
- * @unimplemented (Undocumented)
+ * @implemented (Undocumented)
+ * @note See http://undoc.airesoft.co.uk/kernel32.dll/SetConsoleMaximumWindowSize.php
+ * Does nothing, returns TRUE only. Checked on Windows Server 2003.
*/
BOOL
WINAPI
-SetConsoleMaximumWindowSize(DWORD Unknown0,
- DWORD Unknown1)
+SetConsoleMaximumWindowSize(HANDLE hConsoleOutput,
+ COORD dwMaximumSize)
{
- DPRINT1("SetConsoleMaximumWindowSize(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ DPRINT1("SetConsoleMaximumWindowSize(0x%p, {%d, %d}) does nothing\n",
+ hConsoleOutput, dwMaximumSize.X, dwMaximumSize.Y);
+ return TRUE;
}
/*
- * @unimplemented (Undocumented)
+ * @implemented (Undocumented)
*/
BOOL
WINAPI
-SetConsoleMenuClose(DWORD Unknown0)
-{
- DPRINT1("SetConsoleMenuClose(0x%x) UNIMPLEMENTED!\n", Unknown0);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
-}
-
-
-static BOOL
-IntSetConsoleNumberOfCommands(DWORD dwNumCommands,
- LPCVOID lpExeName,
- BOOL bUnicode)
+SetConsoleMenuClose(BOOL bEnable)
{
- CSR_API_MESSAGE Request;
- PCSR_CAPTURE_BUFFER CaptureBuffer;
- NTSTATUS Status;
-
- if (lpExeName == NULL || !(bUnicode ? *(PWCHAR)lpExeName : *(PCHAR)lpExeName))
- {
- SetLastError(ERROR_INVALID_PARAMETER);
- return FALSE;
- }
-
- CaptureBuffer = CsrAllocateCaptureBuffer(1, IntStringSize(lpExeName, bUnicode));
- if (!CaptureBuffer)
- {
- DPRINT1("CsrAllocateCaptureBuffer failed!\n");
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return FALSE;
- }
-
- IntCaptureMessageString(CaptureBuffer, lpExeName, bUnicode,
- &Request.Data.SetHistoryNumberCommands.ExeName);
- Request.Data.SetHistoryNumberCommands.NumCommands = dwNumCommands;
-
- Status = CsrClientCallServer(&Request,
- CaptureBuffer,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, SET_HISTORY_NUMBER_COMMANDS),
- sizeof(CSR_API_MESSAGE));
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_SETMENUCLOSE SetMenuCloseRequest = &ApiMessage.Data.SetMenuCloseRequest;
- CsrFreeCaptureBuffer(CaptureBuffer);
+ SetMenuCloseRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ SetMenuCloseRequest->Enable = bEnable;
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetMenuClose),
+ sizeof(*SetMenuCloseRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
return TRUE;
}
+
/*
* @implemented (Undocumented)
+ * @note See http://comments.gmane.org/gmane.comp.lang.harbour.devel/27844
+ * Usage example: https://github.com/harbour/core/commit/d79a1b7b812cbde6ddf718ebfd6939a24f633e52
*/
BOOL
WINAPI
-SetConsoleNumberOfCommandsA(DWORD dwNumCommands,
- LPCWSTR lpExeName)
+SetConsolePalette(HANDLE hConsoleOutput,
+ HPALETTE hPalette,
+ UINT dwUsage)
{
- return IntSetConsoleNumberOfCommands(dwNumCommands, lpExeName, FALSE);
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_SETPALETTE SetPaletteRequest = &ApiMessage.Data.SetPaletteRequest;
+
+ SetPaletteRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ SetPaletteRequest->OutputHandle = hConsoleOutput;
+ SetPaletteRequest->PaletteHandle = hPalette;
+ SetPaletteRequest->Usage = dwUsage;
+
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetPalette),
+ sizeof(*SetPaletteRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
+ {
+ BaseSetLastNTError(ApiMessage.Status);
+ return FALSE;
+ }
+
+ return TRUE;
}
/*
* @implemented (Undocumented)
+ * @note See http://undoc.airesoft.co.uk/kernel32.dll/ShowConsoleCursor.php
*/
-BOOL
+INT
WINAPI
-SetConsoleNumberOfCommandsW(DWORD dwNumCommands,
- LPCSTR lpExeName)
+ShowConsoleCursor(HANDLE hConsoleOutput,
+ BOOL bShow)
{
- return IntSetConsoleNumberOfCommands(dwNumCommands, lpExeName, TRUE);
-}
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_SHOWCURSOR ShowCursorRequest = &ApiMessage.Data.ShowCursorRequest;
+ ShowCursorRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ ShowCursorRequest->OutputHandle = hConsoleOutput;
+ ShowCursorRequest->Show = bShow;
+ ShowCursorRequest->RefCount = 0;
-/*
- * @unimplemented (Undocumented)
- */
-BOOL
-WINAPI
-SetConsolePalette(DWORD Unknown0,
- DWORD Unknown1,
- DWORD Unknown2)
-{
- DPRINT1("SetConsolePalette(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1, Unknown2);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
-}
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepShowCursor),
+ sizeof(*ShowCursorRequest));
-/*
- * @unimplemented (Undocumented)
- */
-DWORD
-WINAPI
-ShowConsoleCursor(DWORD Unknown0,
- DWORD Unknown1)
-{
- DPRINT1("ShowConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
+ return ShowCursorRequest->RefCount;
}
/*
* FUNCTION: Checks whether the given handle is a valid console handle.
+ *
* ARGUMENTS:
- * Handle - Handle to be checked
+ * hIoHandle - Handle to be checked.
+ *
* RETURNS:
- * TRUE: Handle is a valid console handle
+ * TRUE : Handle is a valid console handle.
* FALSE: Handle is not a valid console handle.
+ *
* STATUS: Officially undocumented
*
* @implemented
*/
BOOL
WINAPI
-VerifyConsoleIoHandle(HANDLE Handle)
+VerifyConsoleIoHandle(HANDLE hIoHandle)
{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_VERIFYHANDLE VerifyHandleRequest = &ApiMessage.Data.VerifyHandleRequest;
- Request.Data.VerifyHandleRequest.Handle = Handle;
+ VerifyHandleRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ VerifyHandleRequest->Handle = hIoHandle;
+ VerifyHandleRequest->IsValid = FALSE;
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_NATIVE, VERIFY_HANDLE),
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status))
+ /* If the process is not attached to a console, return invalid handle */
+ if (VerifyHandleRequest->ConsoleHandle == NULL) return FALSE;
+
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepVerifyIoHandle),
+ sizeof(*VerifyHandleRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
- return (BOOL)NT_SUCCESS(Request.Status);
-}
-
-
-/*
- * @unimplemented
- */
-DWORD
-WINAPI
-WriteConsoleInputVDMA(DWORD Unknown0,
- DWORD Unknown1,
- DWORD Unknown2,
- DWORD Unknown3)
-{
- DPRINT1("WriteConsoleInputVDMA(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1, Unknown2, Unknown3);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
-}
-
-
-/*
- * @unimplemented
- */
-DWORD
-WINAPI
-WriteConsoleInputVDMW(DWORD Unknown0,
- DWORD Unknown1,
- DWORD Unknown2,
- DWORD Unknown3)
-{
- DPRINT1("WriteConsoleInputVDMW(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1, Unknown2, Unknown3);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
+ return VerifyHandleRequest->IsValid;
}
*/
BOOL
WINAPI
-CloseConsoleHandle(HANDLE Handle)
+CloseConsoleHandle(HANDLE hHandle)
{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_CLOSEHANDLE CloseHandleRequest = &ApiMessage.Data.CloseHandleRequest;
- Request.Data.CloseHandleRequest.Handle = Handle;
+ CloseHandleRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ CloseHandleRequest->Handle = hHandle;
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_NATIVE, CLOSE_HANDLE),
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepCloseHandle),
+ sizeof(*CloseHandleRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
return TRUE;
}
+
/*
* @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;
-
- Ppb = NtCurrentPeb()->ProcessParameters;
+/*
+ * 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 = NtCurrentPeb()->ProcessParameters;
+ HANDLE Handle = INVALID_HANDLE_VALUE;
+
switch (nStdHandle)
{
case STD_INPUT_HANDLE:
- return Ppb->StandardInput;
+ Handle = Ppb->StandardInput;
+ break;
case STD_OUTPUT_HANDLE:
- return Ppb->StandardOutput;
+ Handle = Ppb->StandardOutput;
+ break;
case STD_ERROR_HANDLE:
- return Ppb->StandardError;
+ Handle = Ppb->StandardError;
+ break;
}
- SetLastError (ERROR_INVALID_PARAMETER);
- return INVALID_HANDLE_VALUE;
+ /* If the returned handle is invalid, set last error */
+ if (Handle == INVALID_HANDLE_VALUE) SetLastError(ERROR_INVALID_HANDLE);
+
+ return Handle;
}
*/
BOOL
WINAPI
-SetStdHandle(DWORD nStdHandle,
+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.
- */
+/*
+ * 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;
-
- /* no need to check if hHandle == INVALID_HANDLE_VALUE */
+ PRTL_USER_PROCESS_PARAMETERS Ppb = NtCurrentPeb()->ProcessParameters;
- Ppb = NtCurrentPeb()->ProcessParameters;
+ /* No need to check if hHandle == INVALID_HANDLE_VALUE */
switch (nStdHandle)
{
return TRUE;
}
- /* windows for whatever reason sets the last error to ERROR_INVALID_HANDLE here */
+ /* nStdHandle was invalid, bail out */
SetLastError(ERROR_INVALID_HANDLE);
return FALSE;
}
-static
+/*--------------------------------------------------------------
+ * AllocConsole
+ *
+ * @implemented
+ */
BOOL
-IntWriteConsole(HANDLE hConsoleOutput,
- PVOID lpBuffer,
- DWORD nNumberOfCharsToWrite,
- LPDWORD lpNumberOfCharsWritten,
- LPVOID lpReserved,
- BOOL bUnicode)
-{
- PCSR_API_MESSAGE Request;
- ULONG CsrRequest;
+WINAPI
+AllocConsole(VOID)
+{
NTSTATUS Status;
- USHORT nChars;
- ULONG SizeBytes, CharSize;
- DWORD Written = 0;
-
- CharSize = (bUnicode ? sizeof(WCHAR) : sizeof(CHAR));
- Request = RtlAllocateHeap(RtlGetProcessHeap(),
- 0,
- max(sizeof(CSR_API_MESSAGE),
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE) + min(nNumberOfCharsToWrite,
- CSRSS_MAX_WRITE_CONSOLE / CharSize) * CharSize));
- if (Request == NULL)
+ PRTL_USER_PROCESS_PARAMETERS Parameters = NtCurrentPeb()->ProcessParameters;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_ALLOCCONSOLE AllocConsoleRequest = &ApiMessage.Data.AllocConsoleRequest;
+ PCSR_CAPTURE_BUFFER CaptureBuffer;
+
+ if (Parameters->ConsoleHandle)
{
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ DPRINT1("AllocConsole: Allocating a console to a process already having one\n");
+ SetLastError(ERROR_ACCESS_DENIED);
return FALSE;
}
- CsrRequest = CSR_CREATE_API_NUMBER(CSR_CONSOLE, WRITE_CONSOLE);
-
- while (nNumberOfCharsToWrite > 0)
+ CaptureBuffer = CsrAllocateCaptureBuffer(1, sizeof(CONSOLE_START_INFO));
+ if (CaptureBuffer == NULL)
{
- Request->Data.WriteConsoleRequest.ConsoleHandle = hConsoleOutput;
- Request->Data.WriteConsoleRequest.Unicode = bUnicode;
-
- nChars = (USHORT)min(nNumberOfCharsToWrite, CSRSS_MAX_WRITE_CONSOLE / CharSize);
- Request->Data.WriteConsoleRequest.NrCharactersToWrite = nChars;
+ DPRINT1("CsrAllocateCaptureBuffer failed!\n");
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return FALSE;
+ }
- SizeBytes = nChars * CharSize;
+ CsrAllocateMessagePointer(CaptureBuffer,
+ sizeof(CONSOLE_START_INFO),
+ (PVOID*)&AllocConsoleRequest->ConsoleStartInfo);
- memcpy(Request->Data.WriteConsoleRequest.Buffer, lpBuffer, SizeBytes);
+ InitConsoleInfo(AllocConsoleRequest->ConsoleStartInfo,
+ &Parameters->ImagePathName);
- Status = CsrClientCallServer(Request,
- NULL,
- CsrRequest,
- max(sizeof(CSR_API_MESSAGE),
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE) + SizeBytes));
+ AllocConsoleRequest->ConsoleHandle = NULL;
+ AllocConsoleRequest->CtrlDispatcher = ConsoleControlDispatcher;
+ AllocConsoleRequest->PropDispatcher = PropDialogHandler;
- if (Status == STATUS_PENDING)
- {
- WaitForSingleObject(Request->Data.WriteConsoleRequest.UnpauseEvent, INFINITE);
- CloseHandle(Request->Data.WriteConsoleRequest.UnpauseEvent);
- continue;
- }
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request->Status))
- {
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
- BaseSetLastNTError(Status);
- return FALSE;
- }
+ Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ CaptureBuffer,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepAlloc),
+ sizeof(CONSOLE_ALLOCCONSOLE));
- nNumberOfCharsToWrite -= nChars;
- lpBuffer = (PVOID)((ULONG_PTR)lpBuffer + (ULONG_PTR)SizeBytes);
- Written += Request->Data.WriteConsoleRequest.NrCharactersWritten;
- }
+ CsrFreeCaptureBuffer(CaptureBuffer);
- if (lpNumberOfCharsWritten != NULL)
+ if (!NT_SUCCESS(Status))
{
- *lpNumberOfCharsWritten = Written;
+ BaseSetLastNTError(Status);
+ return FALSE;
}
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
+
+ Parameters->ConsoleHandle = AllocConsoleRequest->ConsoleHandle;
+ SetStdHandle(STD_INPUT_HANDLE , AllocConsoleRequest->InputHandle );
+ SetStdHandle(STD_OUTPUT_HANDLE, AllocConsoleRequest->OutputHandle);
+ SetStdHandle(STD_ERROR_HANDLE , AllocConsoleRequest->ErrorHandle );
+
+ /* Initialize Console Ctrl Handler */
+ InitConsoleCtrlHandling();
+
+ InputWaitHandle = AllocConsoleRequest->InputWaitHandle;
return TRUE;
}
/*--------------------------------------------------------------
- * WriteConsoleA
+ * FreeConsole
*
* @implemented
*/
BOOL
WINAPI
-WriteConsoleA(HANDLE hConsoleOutput,
- CONST VOID *lpBuffer,
- DWORD nNumberOfCharsToWrite,
- LPDWORD lpNumberOfCharsWritten,
- LPVOID lpReserved)
+FreeConsole(VOID)
{
- return IntWriteConsole(hConsoleOutput,
- (PVOID)lpBuffer,
- nNumberOfCharsToWrite,
- lpNumberOfCharsWritten,
- lpReserved,
- FALSE);
+ // AG: I'm not sure if this is correct (what happens to std handles?)
+ // but I just tried to reverse what AllocConsole() does...
+
+ NTSTATUS Status;
+ CONSOLE_API_MESSAGE ApiMessage;
+
+ Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepFree),
+ sizeof(CONSOLE_FREECONSOLE));
+ if (!NT_SUCCESS(Status))
+ {
+ BaseSetLastNTError(Status);
+ return FALSE;
+ }
+
+ NtCurrentPeb()->ProcessParameters->ConsoleHandle = NULL;
+
+ CloseHandle(InputWaitHandle);
+ InputWaitHandle = INVALID_HANDLE_VALUE;
+
+ return TRUE;
}
/*--------------------------------------------------------------
- * WriteConsoleW
+ * GetConsoleScreenBufferInfo
*
* @implemented
*/
BOOL
WINAPI
-WriteConsoleW(HANDLE hConsoleOutput,
- CONST VOID *lpBuffer,
- DWORD nNumberOfCharsToWrite,
- LPDWORD lpNumberOfCharsWritten,
- LPVOID lpReserved)
+GetConsoleScreenBufferInfo(HANDLE hConsoleOutput,
+ PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo)
{
- return IntWriteConsole(hConsoleOutput,
- (PVOID)lpBuffer,
- nNumberOfCharsToWrite,
- lpNumberOfCharsWritten,
- lpReserved,
- TRUE);
-}
-
-
-static
-BOOL
-IntReadConsole(HANDLE hConsoleInput,
- PVOID lpBuffer,
- DWORD nNumberOfCharsToRead,
- LPDWORD lpNumberOfCharsRead,
- PCONSOLE_READCONSOLE_CONTROL pInputControl,
- BOOL bUnicode)
-{
- CSR_API_MESSAGE Request;
- ULONG CsrRequest;
- PCSR_CAPTURE_BUFFER CaptureBuffer;
- NTSTATUS Status = STATUS_SUCCESS;
- ULONG CharSize = (bUnicode ? sizeof(WCHAR) : sizeof(CHAR));
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_GETSCREENBUFFERINFO ScreenBufferInfoRequest = &ApiMessage.Data.ScreenBufferInfoRequest;
- CaptureBuffer = CsrAllocateCaptureBuffer(1, nNumberOfCharsToRead * CharSize);
- if (CaptureBuffer == NULL)
+ if (lpConsoleScreenBufferInfo == NULL)
{
- DPRINT1("CsrAllocateCaptureBuffer failed!\n");
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
- CsrAllocateMessagePointer(CaptureBuffer,
- nNumberOfCharsToRead * CharSize,
- &Request.Data.ReadConsoleRequest.Buffer);
-
- Request.Data.ReadConsoleRequest.ConsoleHandle = hConsoleInput;
- Request.Data.ReadConsoleRequest.Unicode = bUnicode;
- Request.Data.ReadConsoleRequest.NrCharactersToRead = (WORD)nNumberOfCharsToRead;
- Request.Data.ReadConsoleRequest.NrCharactersRead = 0;
- Request.Data.ReadConsoleRequest.CtrlWakeupMask = 0;
- if (pInputControl && pInputControl->nLength == sizeof(CONSOLE_READCONSOLE_CONTROL))
- {
- Request.Data.ReadConsoleRequest.NrCharactersRead = pInputControl->nInitialChars;
- memcpy(Request.Data.ReadConsoleRequest.Buffer,
- lpBuffer,
- pInputControl->nInitialChars * sizeof(WCHAR));
- Request.Data.ReadConsoleRequest.CtrlWakeupMask = pInputControl->dwCtrlWakeupMask;
- }
-
- CsrRequest = CSR_CREATE_API_NUMBER(CSR_CONSOLE, READ_CONSOLE);
+ ScreenBufferInfoRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ ScreenBufferInfoRequest->OutputHandle = hConsoleOutput;
- do
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetScreenBufferInfo),
+ sizeof(*ScreenBufferInfoRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- if (Status == STATUS_PENDING)
- {
- Status = NtWaitForSingleObject(Request.Data.ReadConsoleRequest.EventHandle,
- FALSE,
- 0);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("Wait for console input failed!\n");
- break;
- }
- }
-
- Status = CsrClientCallServer(&Request,
- CaptureBuffer,
- CsrRequest,
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
- {
- DPRINT1("CSR returned error in ReadConsole\n");
- CsrFreeCaptureBuffer(CaptureBuffer);
- BaseSetLastNTError(Status);
- return FALSE;
- }
+ BaseSetLastNTError(ApiMessage.Status);
+ return FALSE;
}
- while (Status == STATUS_PENDING);
-
- memcpy(lpBuffer,
- Request.Data.ReadConsoleRequest.Buffer,
- Request.Data.ReadConsoleRequest.NrCharactersRead * CharSize);
-
- if (lpNumberOfCharsRead != NULL)
- *lpNumberOfCharsRead = Request.Data.ReadConsoleRequest.NrCharactersRead;
- if (pInputControl && pInputControl->nLength == sizeof(CONSOLE_READCONSOLE_CONTROL))
- pInputControl->dwControlKeyState = Request.Data.ReadConsoleRequest.ControlKeyState;
-
- CsrFreeCaptureBuffer(CaptureBuffer);
+ lpConsoleScreenBufferInfo->dwSize = ScreenBufferInfoRequest->ScreenBufferSize;
+ lpConsoleScreenBufferInfo->dwCursorPosition = ScreenBufferInfoRequest->CursorPosition;
+ lpConsoleScreenBufferInfo->wAttributes = ScreenBufferInfoRequest->Attributes;
+ lpConsoleScreenBufferInfo->srWindow.Left = ScreenBufferInfoRequest->ViewOrigin.X;
+ lpConsoleScreenBufferInfo->srWindow.Top = ScreenBufferInfoRequest->ViewOrigin.Y;
+ lpConsoleScreenBufferInfo->srWindow.Right = ScreenBufferInfoRequest->ViewOrigin.X + ScreenBufferInfoRequest->ViewSize.X - 1;
+ lpConsoleScreenBufferInfo->srWindow.Bottom = ScreenBufferInfoRequest->ViewOrigin.Y + ScreenBufferInfoRequest->ViewSize.Y - 1;
+ lpConsoleScreenBufferInfo->dwMaximumWindowSize = ScreenBufferInfoRequest->MaximumViewSize;
return TRUE;
}
/*--------------------------------------------------------------
- * ReadConsoleA
+ * SetConsoleCursorPosition
*
* @implemented
*/
BOOL
WINAPI
-ReadConsoleA(HANDLE hConsoleInput,
- LPVOID lpBuffer,
- DWORD nNumberOfCharsToRead,
- LPDWORD lpNumberOfCharsRead,
- PCONSOLE_READCONSOLE_CONTROL pInputControl)
+SetConsoleCursorPosition(HANDLE hConsoleOutput,
+ COORD dwCursorPosition)
{
- return IntReadConsole(hConsoleInput,
- lpBuffer,
- nNumberOfCharsToRead,
- lpNumberOfCharsRead,
- NULL,
- FALSE);
-}
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_SETCURSORPOSITION SetCursorPositionRequest = &ApiMessage.Data.SetCursorPositionRequest;
+ SetCursorPositionRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ SetCursorPositionRequest->OutputHandle = hConsoleOutput;
+ SetCursorPositionRequest->Position = dwCursorPosition;
-/*--------------------------------------------------------------
- * ReadConsoleW
- *
- * @implemented
- */
-BOOL
-WINAPI
-ReadConsoleW(HANDLE hConsoleInput,
- LPVOID lpBuffer,
- DWORD nNumberOfCharsToRead,
- LPDWORD lpNumberOfCharsRead,
- PCONSOLE_READCONSOLE_CONTROL pInputControl)
-{
- return IntReadConsole(hConsoleInput,
- lpBuffer,
- nNumberOfCharsToRead,
- lpNumberOfCharsRead,
- pInputControl,
- TRUE);
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetCursorPosition),
+ sizeof(*SetCursorPositionRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
+ {
+ BaseSetLastNTError(ApiMessage.Status);
+ return FALSE;
+ }
+
+ return TRUE;
}
/*--------------------------------------------------------------
- * AllocConsole
+ * GetConsoleMode
*
* @implemented
*/
BOOL
WINAPI
-AllocConsole(VOID)
+GetConsoleMode(HANDLE hConsoleHandle,
+ LPDWORD lpMode)
{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
- HANDLE hStdError;
- STARTUPINFO si;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_GETSETCONSOLEMODE ConsoleModeRequest = &ApiMessage.Data.ConsoleModeRequest;
- if (NtCurrentPeb()->ProcessParameters->ConsoleHandle)
+ if (lpMode == NULL)
{
- DPRINT("AllocConsole: Allocate duplicate console to the same Process\n");
- BaseSetLastNTError (STATUS_OBJECT_NAME_EXISTS);
+ SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
- GetStartupInfo(&si);
-
- Request.Data.AllocConsoleRequest.CtrlDispatcher = ConsoleControlDispatcher;
- Request.Data.AllocConsoleRequest.ConsoleNeeded = TRUE;
- Request.Data.AllocConsoleRequest.ShowCmd = si.wShowWindow;
+ ConsoleModeRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ ConsoleModeRequest->Handle = hConsoleHandle;
- 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))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetMode),
+ sizeof(*ConsoleModeRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
- NtCurrentPeb()->ProcessParameters->ConsoleHandle = Request.Data.AllocConsoleRequest.Console;
+ *lpMode = ConsoleModeRequest->Mode;
- 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);
-
- SetStdHandle(STD_ERROR_HANDLE, hStdError);
return TRUE;
}
/*--------------------------------------------------------------
- * FreeConsole
+ * SetConsoleMode
*
* @implemented
*/
BOOL
WINAPI
-FreeConsole(VOID)
+SetConsoleMode(HANDLE hConsoleHandle,
+ DWORD dwMode)
{
- // AG: I'm not sure if this is correct (what happens to std handles?)
- // but I just tried to reverse what AllocConsole() does...
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_GETSETCONSOLEMODE ConsoleModeRequest = &ApiMessage.Data.ConsoleModeRequest;
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
+ ConsoleModeRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ ConsoleModeRequest->Handle = hConsoleHandle;
+ ConsoleModeRequest->Mode = dwMode;
- 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))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetMode),
+ sizeof(*ConsoleModeRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
- NtCurrentPeb()->ProcessParameters->ConsoleHandle = NULL;
return TRUE;
}
/*--------------------------------------------------------------
- * GetConsoleScreenBufferInfo
+ * GetNumberOfConsoleInputEvents
*
* @implemented
*/
BOOL
WINAPI
-GetConsoleScreenBufferInfo(HANDLE hConsoleOutput,
- PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo)
+GetNumberOfConsoleInputEvents(HANDLE hConsoleInput,
+ LPDWORD lpNumberOfEvents)
{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_GETNUMINPUTEVENTS GetNumInputEventsRequest = &ApiMessage.Data.GetNumInputEventsRequest;
- Request.Data.ScreenBufferInfoRequest.ConsoleHandle = hConsoleOutput;
+ GetNumInputEventsRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ GetNumInputEventsRequest->InputHandle = hConsoleInput;
+ GetNumInputEventsRequest->NumberOfEvents = 0;
- 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))
- {
- BaseSetLastNTError(Status);
- return FALSE;
- }
- *lpConsoleScreenBufferInfo = Request.Data.ScreenBufferInfoRequest.Info;
- return TRUE;
-}
-
-
-/*--------------------------------------------------------------
- * SetConsoleCursorPosition
- *
- * @implemented
- */
-BOOL
-WINAPI
-SetConsoleCursorPosition(HANDLE hConsoleOutput,
- COORD dwCursorPosition)
-{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
-
- Request.Data.SetCursorRequest.ConsoleHandle = hConsoleOutput;
- Request.Data.SetCursorRequest.Position = dwCursorPosition;
-
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, SET_CURSOR),
- sizeof(CSR_API_MESSAGE));
- if(!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
- {
- BaseSetLastNTError(Status);
- return FALSE;
- }
-
- return TRUE;
-}
-
-
-static
-BOOL
-IntFillConsoleOutputCharacter(HANDLE hConsoleOutput,
- PVOID cCharacter,
- DWORD nLength,
- COORD dwWriteCoord,
- LPDWORD lpNumberOfCharsWritten,
- BOOL bUnicode)
-{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
-
- Request.Data.FillOutputRequest.ConsoleHandle = hConsoleOutput;
- Request.Data.FillOutputRequest.Unicode = bUnicode;
-
- if(bUnicode)
- Request.Data.FillOutputRequest.Char.UnicodeChar = *((WCHAR*)cCharacter);
- else
- Request.Data.FillOutputRequest.Char.AsciiChar = *((CHAR*)cCharacter);
-
- Request.Data.FillOutputRequest.Position = dwWriteCoord;
- Request.Data.FillOutputRequest.Length = (WORD)nLength;
-
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, FILL_OUTPUT),
- sizeof(CSR_API_MESSAGE));
-
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
- {
- BaseSetLastNTError(Status);
- return FALSE;
- }
-
- if(lpNumberOfCharsWritten != NULL)
- {
- *lpNumberOfCharsWritten = Request.Data.FillOutputRequest.NrCharactersWritten;
- }
-
- return TRUE;
-}
-
-/*--------------------------------------------------------------
- * FillConsoleOutputCharacterA
- *
- * @implemented
- */
-BOOL
-WINAPI
-FillConsoleOutputCharacterA(HANDLE hConsoleOutput,
- CHAR cCharacter,
- DWORD nLength,
- COORD dwWriteCoord,
- LPDWORD lpNumberOfCharsWritten)
-{
- return IntFillConsoleOutputCharacter(hConsoleOutput,
- &cCharacter,
- nLength,
- dwWriteCoord,
- lpNumberOfCharsWritten,
- FALSE);
-}
-
-
-/*--------------------------------------------------------------
- * FillConsoleOutputCharacterW
- *
- * @implemented
- */
-BOOL
-WINAPI
-FillConsoleOutputCharacterW(HANDLE hConsoleOutput,
- WCHAR cCharacter,
- DWORD nLength,
- COORD dwWriteCoord,
- LPDWORD lpNumberOfCharsWritten)
-{
- return IntFillConsoleOutputCharacter(hConsoleOutput,
- &cCharacter,
- nLength,
- dwWriteCoord,
- lpNumberOfCharsWritten,
- TRUE);
-}
-
-
-static
-BOOL
-IntPeekConsoleInput(HANDLE hConsoleInput,
- PINPUT_RECORD lpBuffer,
- DWORD nLength,
- LPDWORD lpNumberOfEventsRead,
- BOOL bUnicode)
-{
- CSR_API_MESSAGE Request;
- PCSR_CAPTURE_BUFFER CaptureBuffer;
- ULONG Size;
-
- if (lpBuffer == NULL)
- {
- SetLastError(ERROR_INVALID_PARAMETER);
- return FALSE;
- }
-
- Size = nLength * sizeof(INPUT_RECORD);
-
- /* Allocate a Capture Buffer */
- DPRINT("IntPeekConsoleInput: %lx %p\n", Size, lpNumberOfEventsRead);
- CaptureBuffer = CsrAllocateCaptureBuffer(1, Size);
- if (CaptureBuffer == NULL)
- {
- DPRINT1("CsrAllocateCaptureBuffer failed!\n");
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return FALSE;
- }
-
- /* Allocate space in the Buffer */
- CsrCaptureMessageBuffer(CaptureBuffer,
- NULL,
- Size,
- (PVOID*)&Request.Data.PeekConsoleInputRequest.InputRecord);
-
- /* Set up the data to send to the Console Server */
- Request.Data.PeekConsoleInputRequest.ConsoleHandle = hConsoleInput;
- Request.Data.PeekConsoleInputRequest.Unicode = bUnicode;
- Request.Data.PeekConsoleInputRequest.Length = nLength;
-
- /* Call the server */
- CsrClientCallServer(&Request,
- CaptureBuffer,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, PEEK_CONSOLE_INPUT),
- sizeof(CSR_API_MESSAGE));
- DPRINT("Server returned: %x\n", Request.Status);
-
- /* Check for success*/
- if (NT_SUCCESS(Request.Status))
- {
- /* Return the number of events read */
- DPRINT("Events read: %lx\n", Request.Data.PeekConsoleInputRequest.Length);
- *lpNumberOfEventsRead = Request.Data.PeekConsoleInputRequest.Length;
-
- /* Copy into the buffer */
- DPRINT("Copying to buffer\n");
- RtlCopyMemory(lpBuffer,
- Request.Data.PeekConsoleInputRequest.InputRecord,
- sizeof(INPUT_RECORD) * *lpNumberOfEventsRead);
- }
- else
- {
- /* Error out */
- *lpNumberOfEventsRead = 0;
- BaseSetLastNTError(Request.Status);
- }
-
- /* Release the capture buffer */
- CsrFreeCaptureBuffer(CaptureBuffer);
-
- /* Return TRUE or FALSE */
- return NT_SUCCESS(Request.Status);
-}
-
-/*--------------------------------------------------------------
- * PeekConsoleInputA
- *
- * @implemented
- */
-BOOL
-WINAPI
-PeekConsoleInputA(HANDLE hConsoleInput,
- PINPUT_RECORD lpBuffer,
- DWORD nLength,
- LPDWORD lpNumberOfEventsRead)
-{
- return IntPeekConsoleInput(hConsoleInput,
- lpBuffer,
- nLength,
- lpNumberOfEventsRead,
- FALSE);
-}
-
-
-/*--------------------------------------------------------------
- * PeekConsoleInputW
- *
- * @implemented
- */
-BOOL
-WINAPI
-PeekConsoleInputW(HANDLE hConsoleInput,
- PINPUT_RECORD lpBuffer,
- DWORD nLength,
- LPDWORD lpNumberOfEventsRead)
-{
- return IntPeekConsoleInput(hConsoleInput,
- lpBuffer, nLength,
- lpNumberOfEventsRead,
- TRUE);
-}
-
-
-static
-BOOL
-IntReadConsoleInput(HANDLE hConsoleInput,
- PINPUT_RECORD lpBuffer,
- DWORD nLength,
- LPDWORD lpNumberOfEventsRead,
- BOOL bUnicode)
-{
- CSR_API_MESSAGE Request;
- ULONG CsrRequest;
- ULONG Read;
- NTSTATUS Status;
-
- CsrRequest = CSR_CREATE_API_NUMBER(CSR_CONSOLE, READ_INPUT);
- Read = 0;
-
- while (nLength > 0)
- {
- Request.Data.ReadInputRequest.ConsoleHandle = hConsoleInput;
- Request.Data.ReadInputRequest.Unicode = bUnicode;
-
- Status = CsrClientCallServer(&Request,
- NULL,
- CsrRequest,
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
- {
- if (Read == 0)
- {
- /* we couldn't read a single record, fail */
- BaseSetLastNTError(Status);
- return FALSE;
- }
- else
- {
- /* FIXME - fail gracefully in case we already read at least one record? */
- break;
- }
- }
- else if (Status == STATUS_PENDING)
- {
- if (Read == 0)
- {
- Status = NtWaitForSingleObject(Request.Data.ReadInputRequest.Event, FALSE, 0);
- if (!NT_SUCCESS(Status))
- {
- BaseSetLastNTError(Status);
- break;
- }
- }
- else
- {
- /* nothing more to read (waiting for more input??), let's just bail */
- break;
- }
- }
- else
- {
- lpBuffer[Read++] = Request.Data.ReadInputRequest.Input;
- nLength--;
-
- if (!Request.Data.ReadInputRequest.MoreEvents)
- {
- /* nothing more to read, bail */
- break;
- }
- }
- }
-
- if (lpNumberOfEventsRead != NULL)
- {
- *lpNumberOfEventsRead = Read;
- }
-
- return (Read > 0);
-}
-
-
-/*--------------------------------------------------------------
- * ReadConsoleInputA
- *
- * @implemented
- */
-BOOL
-WINAPI
-ReadConsoleInputA(HANDLE hConsoleInput,
- PINPUT_RECORD lpBuffer,
- DWORD nLength,
- LPDWORD lpNumberOfEventsRead)
-{
- return IntReadConsoleInput(hConsoleInput,
- lpBuffer,
- nLength,
- lpNumberOfEventsRead,
- FALSE);
-}
-
-
-/*--------------------------------------------------------------
- * ReadConsoleInputW
- *
- * @implemented
- */
-BOOL
-WINAPI
-ReadConsoleInputW(HANDLE hConsoleInput,
- PINPUT_RECORD lpBuffer,
- DWORD nLength,
- LPDWORD lpNumberOfEventsRead)
-{
- return IntReadConsoleInput(hConsoleInput,
- lpBuffer,
- nLength,
- lpNumberOfEventsRead,
- TRUE);
-}
-
-
-static
-BOOL
-IntWriteConsoleInput(HANDLE hConsoleInput,
- PINPUT_RECORD lpBuffer,
- DWORD nLength,
- LPDWORD lpNumberOfEventsWritten,
- BOOL bUnicode)
-{
- CSR_API_MESSAGE Request;
- PCSR_CAPTURE_BUFFER CaptureBuffer;
- DWORD Size;
-
- if (lpBuffer == NULL)
- {
- SetLastError(ERROR_INVALID_PARAMETER);
- return FALSE;
- }
-
- Size = nLength * sizeof(INPUT_RECORD);
-
- /* Allocate a Capture Buffer */
- DPRINT("IntWriteConsoleInput: %lx %p\n", Size, lpNumberOfEventsWritten);
- CaptureBuffer = CsrAllocateCaptureBuffer(1, Size);
- if (CaptureBuffer == NULL)
- {
- DPRINT1("CsrAllocateCaptureBuffer failed!\n");
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return FALSE;
- }
-
- /* Allocate space in the Buffer */
- CsrCaptureMessageBuffer(CaptureBuffer,
- lpBuffer,
- Size,
- (PVOID*)&Request.Data.WriteConsoleInputRequest.InputRecord);
-
- /* Set up the data to send to the Console Server */
- Request.Data.WriteConsoleInputRequest.ConsoleHandle = hConsoleInput;
- Request.Data.WriteConsoleInputRequest.Unicode = bUnicode;
- Request.Data.WriteConsoleInputRequest.Length = nLength;
-
- /* Call the server */
- CsrClientCallServer(&Request,
- CaptureBuffer,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, WRITE_CONSOLE_INPUT),
- sizeof(CSR_API_MESSAGE));
- DPRINT("Server returned: %x\n", Request.Status);
-
- /* Check for success*/
- if (NT_SUCCESS(Request.Status))
- {
- /* Return the number of events read */
- DPRINT("Events read: %lx\n", Request.Data.WriteConsoleInputRequest.Length);
- *lpNumberOfEventsWritten = Request.Data.WriteConsoleInputRequest.Length;
- }
- else
- {
- /* Error out */
- *lpNumberOfEventsWritten = 0;
- BaseSetLastNTError(Request.Status);
- }
-
- /* Release the capture buffer */
- CsrFreeCaptureBuffer(CaptureBuffer);
-
- /* Return TRUE or FALSE */
- return NT_SUCCESS(Request.Status);
-}
-
-
-/*--------------------------------------------------------------
- * WriteConsoleInputA
- *
- * @implemented
- */
-BOOL
-WINAPI
-WriteConsoleInputA(HANDLE hConsoleInput,
- CONST INPUT_RECORD *lpBuffer,
- DWORD nLength,
- LPDWORD lpNumberOfEventsWritten)
-{
- return IntWriteConsoleInput(hConsoleInput,
- (PINPUT_RECORD)lpBuffer,
- nLength,
- lpNumberOfEventsWritten,
- FALSE);
-}
-
-
-/*--------------------------------------------------------------
- * WriteConsoleInputW
- *
- * @implemented
- */
-BOOL
-WINAPI
-WriteConsoleInputW(HANDLE hConsoleInput,
- CONST INPUT_RECORD *lpBuffer,
- DWORD nLength,
- LPDWORD lpNumberOfEventsWritten)
-{
- return IntWriteConsoleInput(hConsoleInput,
- (PINPUT_RECORD)lpBuffer,
- nLength,
- lpNumberOfEventsWritten,
- TRUE);
-}
-
-
-static
-BOOL
-IntReadConsoleOutput(HANDLE hConsoleOutput,
- PCHAR_INFO lpBuffer,
- COORD dwBufferSize,
- COORD dwBufferCoord,
- PSMALL_RECT lpReadRegion,
- BOOL bUnicode)
-{
- CSR_API_MESSAGE Request;
- PCSR_CAPTURE_BUFFER CaptureBuffer;
- DWORD Size, SizeX, SizeY;
-
- if (lpBuffer == NULL)
- {
- SetLastError(ERROR_INVALID_PARAMETER);
- return FALSE;
- }
-
- Size = dwBufferSize.X * dwBufferSize.Y * sizeof(CHAR_INFO);
-
- /* Allocate a Capture Buffer */
- DPRINT("IntReadConsoleOutput: %lx %p\n", Size, lpReadRegion);
- CaptureBuffer = CsrAllocateCaptureBuffer(1, Size);
- if (CaptureBuffer == NULL)
- {
- DPRINT1("CsrAllocateCaptureBuffer failed with size 0x%x!\n", Size);
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return FALSE;
- }
-
- /* Allocate space in the Buffer */
- CsrCaptureMessageBuffer(CaptureBuffer,
- NULL,
- Size,
- (PVOID*)&Request.Data.ReadConsoleOutputRequest.CharInfo);
-
- /* Set up the data to send to the Console Server */
- Request.Data.ReadConsoleOutputRequest.ConsoleHandle = hConsoleOutput;
- Request.Data.ReadConsoleOutputRequest.Unicode = bUnicode;
- Request.Data.ReadConsoleOutputRequest.BufferSize = dwBufferSize;
- Request.Data.ReadConsoleOutputRequest.BufferCoord = dwBufferCoord;
- Request.Data.ReadConsoleOutputRequest.ReadRegion = *lpReadRegion;
-
- /* Call the server */
- CsrClientCallServer(&Request,
- CaptureBuffer,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, READ_CONSOLE_OUTPUT),
- sizeof(CSR_API_MESSAGE));
- DPRINT("Server returned: %x\n", Request.Status);
-
- /* Check for success*/
- if (NT_SUCCESS(Request.Status))
- {
- /* Copy into the buffer */
- DPRINT("Copying to buffer\n");
- SizeX = Request.Data.ReadConsoleOutputRequest.ReadRegion.Right -
- Request.Data.ReadConsoleOutputRequest.ReadRegion.Left + 1;
- SizeY = Request.Data.ReadConsoleOutputRequest.ReadRegion.Bottom -
- Request.Data.ReadConsoleOutputRequest.ReadRegion.Top + 1;
- RtlCopyMemory(lpBuffer,
- Request.Data.ReadConsoleOutputRequest.CharInfo,
- sizeof(CHAR_INFO) * SizeX * SizeY);
- }
- else
- {
- /* Error out */
- BaseSetLastNTError(Request.Status);
- }
-
- /* Return the read region */
- DPRINT("read region: %lx\n", Request.Data.ReadConsoleOutputRequest.ReadRegion);
- *lpReadRegion = Request.Data.ReadConsoleOutputRequest.ReadRegion;
-
- /* Release the capture buffer */
- CsrFreeCaptureBuffer(CaptureBuffer);
-
- /* Return TRUE or FALSE */
- return NT_SUCCESS(Request.Status);
-}
-
-/*--------------------------------------------------------------
- * ReadConsoleOutputA
- *
- * @implemented
- */
-BOOL
-WINAPI
-ReadConsoleOutputA(HANDLE hConsoleOutput,
- PCHAR_INFO lpBuffer,
- COORD dwBufferSize,
- COORD dwBufferCoord,
- PSMALL_RECT lpReadRegion)
-{
- return IntReadConsoleOutput(hConsoleOutput,
- lpBuffer,
- dwBufferSize,
- dwBufferCoord,
- lpReadRegion,
- FALSE);
-}
-
-
-/*--------------------------------------------------------------
- * ReadConsoleOutputW
- *
- * @implemented
- */
-BOOL
-WINAPI
-ReadConsoleOutputW(HANDLE hConsoleOutput,
- PCHAR_INFO lpBuffer,
- COORD dwBufferSize,
- COORD dwBufferCoord,
- PSMALL_RECT lpReadRegion)
-{
- return IntReadConsoleOutput(hConsoleOutput,
- lpBuffer,
- dwBufferSize,
- dwBufferCoord,
- lpReadRegion,
- TRUE);
-}
-
-
-static
-BOOL
-IntWriteConsoleOutput(HANDLE hConsoleOutput,
- CONST CHAR_INFO *lpBuffer,
- COORD dwBufferSize,
- COORD dwBufferCoord,
- PSMALL_RECT lpWriteRegion,
- BOOL bUnicode)
-{
- CSR_API_MESSAGE Request;
- PCSR_CAPTURE_BUFFER CaptureBuffer;
- ULONG Size;
-
- Size = dwBufferSize.Y * dwBufferSize.X * sizeof(CHAR_INFO);
-
- /* Allocate a Capture Buffer */
- DPRINT("IntWriteConsoleOutput: %lx %p\n", Size, lpWriteRegion);
- CaptureBuffer = CsrAllocateCaptureBuffer(1, Size);
- if (CaptureBuffer == NULL)
- {
- DPRINT1("CsrAllocateCaptureBuffer failed!\n");
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return FALSE;
- }
-
- /* Allocate space in the Buffer */
- CsrCaptureMessageBuffer(CaptureBuffer,
- NULL,
- Size,
- (PVOID*)&Request.Data.WriteConsoleOutputRequest.CharInfo);
-
- /* Copy from the buffer */
- RtlCopyMemory(Request.Data.WriteConsoleOutputRequest.CharInfo, lpBuffer, Size);
-
- /* Set up the data to send to the Console Server */
- Request.Data.WriteConsoleOutputRequest.ConsoleHandle = hConsoleOutput;
- Request.Data.WriteConsoleOutputRequest.Unicode = bUnicode;
- Request.Data.WriteConsoleOutputRequest.BufferSize = dwBufferSize;
- Request.Data.WriteConsoleOutputRequest.BufferCoord = dwBufferCoord;
- Request.Data.WriteConsoleOutputRequest.WriteRegion = *lpWriteRegion;
-
- /* Call the server */
- CsrClientCallServer(&Request,
- CaptureBuffer,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, WRITE_CONSOLE_OUTPUT),
- sizeof(CSR_API_MESSAGE));
- DPRINT("Server returned: %x\n", Request.Status);
-
- /* Check for success*/
- if (!NT_SUCCESS(Request.Status))
- {
- /* Error out */
- BaseSetLastNTError(Request.Status);
- }
-
- /* Return the read region */
- DPRINT("read region: %lx\n", Request.Data.WriteConsoleOutputRequest.WriteRegion);
- *lpWriteRegion = Request.Data.WriteConsoleOutputRequest.WriteRegion;
-
- /* Release the capture buffer */
- CsrFreeCaptureBuffer(CaptureBuffer);
-
- /* Return TRUE or FALSE */
- return NT_SUCCESS(Request.Status);
-}
-
-/*--------------------------------------------------------------
- * WriteConsoleOutputA
- *
- * @implemented
- */
-BOOL
-WINAPI
-WriteConsoleOutputA(HANDLE hConsoleOutput,
- CONST CHAR_INFO *lpBuffer,
- COORD dwBufferSize,
- COORD dwBufferCoord,
- PSMALL_RECT lpWriteRegion)
-{
- return IntWriteConsoleOutput(hConsoleOutput,
- lpBuffer,
- dwBufferSize,
- dwBufferCoord,
- lpWriteRegion,
- FALSE);
-}
-
-
-/*--------------------------------------------------------------
- * WriteConsoleOutputW
- *
- * @implemented
- */
-BOOL
-WINAPI
-WriteConsoleOutputW(HANDLE hConsoleOutput,
- CONST CHAR_INFO *lpBuffer,
- COORD dwBufferSize,
- COORD dwBufferCoord,
- PSMALL_RECT lpWriteRegion)
-{
- return IntWriteConsoleOutput(hConsoleOutput,
- lpBuffer,
- dwBufferSize,
- dwBufferCoord,
- lpWriteRegion,
- TRUE);
-}
-
-
-static
-BOOL
-IntReadConsoleOutputCharacter(HANDLE hConsoleOutput,
- PVOID lpCharacter,
- DWORD nLength,
- COORD dwReadCoord,
- LPDWORD lpNumberOfCharsRead,
- BOOL bUnicode)
-{
- PCSR_API_MESSAGE Request;
- ULONG CsrRequest;
- NTSTATUS Status;
- ULONG SizeBytes, CharSize;
- DWORD CharsRead = 0;
-
- CharSize = (bUnicode ? sizeof(WCHAR) : sizeof(CHAR));
-
- nLength = min(nLength, CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR / CharSize);
- SizeBytes = nLength * CharSize;
-
- Request = RtlAllocateHeap(RtlGetProcessHeap(), 0,
- max(sizeof(CSR_API_MESSAGE),
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR) + SizeBytes));
- if (Request == NULL)
- {
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return FALSE;
- }
-
- CsrRequest = CSR_CREATE_API_NUMBER(CSR_CONSOLE, READ_CONSOLE_OUTPUT_CHAR);
- Request->Data.ReadConsoleOutputCharRequest.ReadCoord = dwReadCoord;
-
- while (nLength > 0)
- {
- DWORD BytesRead;
-
- Request->Data.ReadConsoleOutputCharRequest.ConsoleHandle = hConsoleOutput;
- Request->Data.ReadConsoleOutputCharRequest.Unicode = bUnicode;
- Request->Data.ReadConsoleOutputCharRequest.NumCharsToRead = nLength;
- SizeBytes = Request->Data.ReadConsoleOutputCharRequest.NumCharsToRead * CharSize;
-
- Status = CsrClientCallServer(Request,
- NULL,
- CsrRequest,
- max(sizeof(CSR_API_MESSAGE),
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR) + SizeBytes));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Request->Status))
- {
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
- BaseSetLastNTError(Status);
- break;
- }
-
- BytesRead = Request->Data.ReadConsoleOutputCharRequest.CharsRead * CharSize;
- memcpy(lpCharacter, Request->Data.ReadConsoleOutputCharRequest.String, BytesRead);
- lpCharacter = (PVOID)((ULONG_PTR)lpCharacter + (ULONG_PTR)BytesRead);
- CharsRead += Request->Data.ReadConsoleOutputCharRequest.CharsRead;
- nLength -= Request->Data.ReadConsoleOutputCharRequest.CharsRead;
-
- Request->Data.ReadConsoleOutputCharRequest.ReadCoord = Request->Data.ReadConsoleOutputCharRequest.EndCoord;
- }
-
- if (lpNumberOfCharsRead != NULL)
- {
- *lpNumberOfCharsRead = CharsRead;
- }
-
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
-
- return TRUE;
-}
-
-
-/*--------------------------------------------------------------
- * ReadConsoleOutputCharacterA
- *
- * @implemented
- */
-BOOL
-WINAPI
-ReadConsoleOutputCharacterA(HANDLE hConsoleOutput,
- LPSTR lpCharacter,
- DWORD nLength,
- COORD dwReadCoord,
- LPDWORD lpNumberOfCharsRead)
-{
- return IntReadConsoleOutputCharacter(hConsoleOutput,
- (PVOID)lpCharacter,
- nLength,
- dwReadCoord,
- lpNumberOfCharsRead,
- FALSE);
-}
-
-
-/*--------------------------------------------------------------
- * ReadConsoleOutputCharacterW
- *
- * @implemented
- */
-BOOL
-WINAPI
-ReadConsoleOutputCharacterW(HANDLE hConsoleOutput,
- LPWSTR lpCharacter,
- DWORD nLength,
- COORD dwReadCoord,
- LPDWORD lpNumberOfCharsRead)
-{
- return IntReadConsoleOutputCharacter(hConsoleOutput,
- (PVOID)lpCharacter,
- nLength,
- dwReadCoord,
- lpNumberOfCharsRead,
- TRUE);
-}
-
-
-/*--------------------------------------------------------------
- * ReadConsoleOutputAttribute
- *
- * @implemented
- */
-BOOL
-WINAPI
-ReadConsoleOutputAttribute(HANDLE hConsoleOutput,
- LPWORD lpAttribute,
- DWORD nLength,
- COORD dwReadCoord,
- LPDWORD lpNumberOfAttrsRead)
-{
- PCSR_API_MESSAGE Request;
- ULONG CsrRequest;
- NTSTATUS Status;
- DWORD Size;
-
- if (lpNumberOfAttrsRead != NULL)
- *lpNumberOfAttrsRead = nLength;
-
- Request = RtlAllocateHeap(RtlGetProcessHeap(),
- 0,
- max(sizeof(CSR_API_MESSAGE),
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB)
- + min (nLength, CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB / sizeof(WORD)) * sizeof(WORD)));
- if (Request == NULL)
- {
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return FALSE;
- }
-
- CsrRequest = CSR_CREATE_API_NUMBER(CSR_CONSOLE, READ_CONSOLE_OUTPUT_ATTRIB);
-
- while (nLength != 0)
- {
- Request->Data.ReadConsoleOutputAttribRequest.ConsoleHandle = hConsoleOutput;
- Request->Data.ReadConsoleOutputAttribRequest.ReadCoord = dwReadCoord;
-
- if (nLength > CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB / sizeof(WORD))
- Size = CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB / sizeof(WCHAR);
- else
- Size = nLength;
-
- Request->Data.ReadConsoleOutputAttribRequest.NumAttrsToRead = Size;
-
- Status = CsrClientCallServer(Request,
- NULL,
- CsrRequest,
- max(sizeof(CSR_API_MESSAGE),
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB) + Size * sizeof(WORD)));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Request->Status))
- {
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
- BaseSetLastNTError(Status);
- return FALSE;
- }
-
- memcpy(lpAttribute, Request->Data.ReadConsoleOutputAttribRequest.Attribute, Size * sizeof(WORD));
- lpAttribute += Size;
- nLength -= Size;
- Request->Data.ReadConsoleOutputAttribRequest.ReadCoord = Request->Data.ReadConsoleOutputAttribRequest.EndCoord;
- }
-
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
-
- return TRUE;
-}
-
-
-static
-BOOL
-IntWriteConsoleOutputCharacter(HANDLE hConsoleOutput,
- PVOID lpCharacter,
- DWORD nLength,
- COORD dwWriteCoord,
- LPDWORD lpNumberOfCharsWritten,
- BOOL bUnicode)
-{
- PCSR_API_MESSAGE Request;
- ULONG CsrRequest;
- NTSTATUS Status;
- ULONG CharSize, nChars;
- //ULONG SizeBytes;
- DWORD Written = 0;
-
- CharSize = (bUnicode ? sizeof(WCHAR) : sizeof(CHAR));
-
- nChars = min(nLength, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR / CharSize);
- //SizeBytes = nChars * CharSize;
-
- Request = RtlAllocateHeap(RtlGetProcessHeap(), 0,
- max(sizeof(CSR_API_MESSAGE),
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR)
- + min (nChars, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR / CharSize) * CharSize));
- if (Request == NULL)
- {
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return FALSE;
- }
-
- CsrRequest = CSR_CREATE_API_NUMBER(CSR_CONSOLE, WRITE_CONSOLE_OUTPUT_CHAR);
- Request->Data.WriteConsoleOutputCharRequest.Coord = dwWriteCoord;
-
- while (nLength > 0)
- {
- DWORD BytesWrite;
-
- Request->Data.WriteConsoleOutputCharRequest.ConsoleHandle = hConsoleOutput;
- Request->Data.WriteConsoleOutputCharRequest.Unicode = bUnicode;
- Request->Data.WriteConsoleOutputCharRequest.Length = (WORD)min(nLength, nChars);
- BytesWrite = Request->Data.WriteConsoleOutputCharRequest.Length * CharSize;
-
- memcpy(Request->Data.WriteConsoleOutputCharRequest.String, lpCharacter, BytesWrite);
-
- Status = CsrClientCallServer(Request,
- NULL,
- CsrRequest,
- max(sizeof(CSR_API_MESSAGE),
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR) + BytesWrite));
-
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request->Status))
- {
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
- BaseSetLastNTError(Status);
- return FALSE;
- }
-
- nLength -= Request->Data.WriteConsoleOutputCharRequest.NrCharactersWritten;
- lpCharacter = (PVOID)((ULONG_PTR)lpCharacter + (ULONG_PTR)(Request->Data.WriteConsoleOutputCharRequest.NrCharactersWritten * CharSize));
- Written += Request->Data.WriteConsoleOutputCharRequest.NrCharactersWritten;
-
- Request->Data.WriteConsoleOutputCharRequest.Coord = Request->Data.WriteConsoleOutputCharRequest.EndCoord;
- }
-
- if (lpNumberOfCharsWritten != NULL)
- {
- *lpNumberOfCharsWritten = Written;
- }
-
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
-
- return TRUE;
-}
-
-
-/*--------------------------------------------------------------
- * WriteConsoleOutputCharacterA
- *
- * @implemented
- */
-BOOL
-WINAPI
-WriteConsoleOutputCharacterA(HANDLE hConsoleOutput,
- LPCSTR lpCharacter,
- DWORD nLength,
- COORD dwWriteCoord,
- LPDWORD lpNumberOfCharsWritten)
-{
- return IntWriteConsoleOutputCharacter(hConsoleOutput,
- (PVOID)lpCharacter,
- nLength,
- dwWriteCoord,
- lpNumberOfCharsWritten,
- FALSE);
-}
-
-
-/*--------------------------------------------------------------
- * WriteConsoleOutputCharacterW
- *
- * @implemented
- */
-BOOL
-WINAPI
-WriteConsoleOutputCharacterW(HANDLE hConsoleOutput,
- LPCWSTR lpCharacter,
- DWORD nLength,
- COORD dwWriteCoord,
- LPDWORD lpNumberOfCharsWritten)
-{
- return IntWriteConsoleOutputCharacter(hConsoleOutput,
- (PVOID)lpCharacter,
- nLength,
- dwWriteCoord,
- lpNumberOfCharsWritten,
- TRUE);
-}
-
-
-/*--------------------------------------------------------------
- * WriteConsoleOutputAttribute
- *
- * @implemented
- */
-BOOL
-WINAPI
-WriteConsoleOutputAttribute(HANDLE hConsoleOutput,
- CONST WORD *lpAttribute,
- DWORD nLength,
- COORD dwWriteCoord,
- LPDWORD lpNumberOfAttrsWritten)
-{
- PCSR_API_MESSAGE Request;
- ULONG CsrRequest;
- NTSTATUS Status;
- WORD Size;
-
- Request = RtlAllocateHeap(RtlGetProcessHeap(),
- 0,
- max(sizeof(CSR_API_MESSAGE),
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB)
- + min(nLength, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB / sizeof(WORD)) * sizeof(WORD)));
- if (Request == NULL)
- {
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return FALSE;
- }
-
- CsrRequest = CSR_CREATE_API_NUMBER(CSR_CONSOLE, WRITE_CONSOLE_OUTPUT_ATTRIB);
- Request->Data.WriteConsoleOutputAttribRequest.Coord = dwWriteCoord;
-
- if (lpNumberOfAttrsWritten)
- *lpNumberOfAttrsWritten = nLength;
- while (nLength)
- {
- Size = (WORD)min(nLength, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB / sizeof(WORD));
- Request->Data.WriteConsoleOutputAttribRequest.ConsoleHandle = hConsoleOutput;
- Request->Data.WriteConsoleOutputAttribRequest.Length = Size;
- memcpy(Request->Data.WriteConsoleOutputAttribRequest.Attribute, lpAttribute, Size * sizeof(WORD));
-
- Status = CsrClientCallServer(Request,
- NULL,
- CsrRequest,
- max(sizeof(CSR_API_MESSAGE),
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB) + Size * sizeof(WORD)));
-
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request->Status))
- {
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
- BaseSetLastNTError (Status);
- return FALSE;
- }
- nLength -= Size;
- lpAttribute += Size;
- Request->Data.WriteConsoleOutputAttribRequest.Coord = Request->Data.WriteConsoleOutputAttribRequest.EndCoord;
- }
-
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
-
- return TRUE;
-}
-
-
-/*--------------------------------------------------------------
- * FillConsoleOutputAttribute
- *
- * @implemented
- */
-BOOL
-WINAPI
-FillConsoleOutputAttribute(HANDLE hConsoleOutput,
- WORD wAttribute,
- DWORD nLength,
- COORD dwWriteCoord,
- LPDWORD lpNumberOfAttrsWritten)
-{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
-
- Request.Data.FillOutputAttribRequest.ConsoleHandle = hConsoleOutput;
- Request.Data.FillOutputAttribRequest.Attribute = (CHAR)wAttribute;
- Request.Data.FillOutputAttribRequest.Coord = dwWriteCoord;
- Request.Data.FillOutputAttribRequest.Length = (WORD)nLength;
-
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, FILL_OUTPUT_ATTRIB),
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetNumberOfInputEvents),
+ sizeof(*GetNumInputEventsRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError ( Status );
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
- if (lpNumberOfAttrsWritten)
- *lpNumberOfAttrsWritten = nLength;
-
- return TRUE;
-}
-
-
-/*--------------------------------------------------------------
- * GetConsoleMode
- *
- * @implemented
- */
-BOOL
-WINAPI
-GetConsoleMode(HANDLE hConsoleHandle,
- LPDWORD lpMode)
-{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
-
- Request.Data.GetConsoleModeRequest.ConsoleHandle = hConsoleHandle;
-
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_CONSOLE_MODE),
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ if (lpNumberOfEvents == NULL)
{
- BaseSetLastNTError(Status);
+ SetLastError(ERROR_INVALID_ACCESS);
return FALSE;
}
- *lpMode = Request.Data.GetConsoleModeRequest.ConsoleMode;
+ *lpNumberOfEvents = GetNumInputEventsRequest->NumberOfEvents;
return TRUE;
}
/*--------------------------------------------------------------
- * GetNumberOfConsoleInputEvents
+ * GetLargestConsoleWindowSize
*
* @implemented
*/
-BOOL
+COORD
WINAPI
-GetNumberOfConsoleInputEvents(HANDLE hConsoleInput,
- LPDWORD lpNumberOfEvents)
+GetLargestConsoleWindowSize(HANDLE hConsoleOutput)
{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
-
- if (lpNumberOfEvents == NULL)
- {
- SetLastError(ERROR_INVALID_PARAMETER);
- return FALSE;
- }
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_GETLARGESTWINDOWSIZE GetLargestWindowSizeRequest = &ApiMessage.Data.GetLargestWindowSizeRequest;
- Request.Data.GetNumInputEventsRequest.ConsoleHandle = hConsoleInput;
+ GetLargestWindowSizeRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ GetLargestWindowSizeRequest->OutputHandle = hConsoleOutput;
+ GetLargestWindowSizeRequest->Size.X = 0;
+ GetLargestWindowSizeRequest->Size.Y = 0;
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_NUM_INPUT_EVENTS),
- sizeof(CSR_API_MESSAGE));
- if(!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetLargestWindowSize),
+ sizeof(*GetLargestWindowSizeRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
- return FALSE;
+ BaseSetLastNTError(ApiMessage.Status);
}
- *lpNumberOfEvents = Request.Data.GetNumInputEventsRequest.NumInputEvents;
-
- return TRUE;
-}
-
-
-/*--------------------------------------------------------------
- * GetLargestConsoleWindowSize
- *
- * @unimplemented
- */
-COORD
-WINAPI
-GetLargestConsoleWindowSize(HANDLE hConsoleOutput)
-{
- COORD Coord = {80,25};
- DPRINT1("GetLargestConsoleWindowSize(0x%x) UNIMPLEMENTED!\n", hConsoleOutput);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return Coord;
+ DPRINT1("GetLargestConsoleWindowSize, X = %d, Y = %d\n", GetLargestWindowSizeRequest->Size.X, GetLargestWindowSizeRequest->Size.Y);
+ return GetLargestWindowSizeRequest->Size;
}
GetConsoleCursorInfo(HANDLE hConsoleOutput,
PCONSOLE_CURSOR_INFO lpConsoleCursorInfo)
{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_GETSETCURSORINFO CursorInfoRequest = &ApiMessage.Data.CursorInfoRequest;
if (!lpConsoleCursorInfo)
{
return FALSE;
}
- Request.Data.GetCursorInfoRequest.ConsoleHandle = hConsoleOutput;
+ CursorInfoRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ CursorInfoRequest->OutputHandle = hConsoleOutput;
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_CURSOR_INFO),
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetCursorInfo),
+ sizeof(*CursorInfoRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
- *lpConsoleCursorInfo = Request.Data.GetCursorInfoRequest.Info;
+ *lpConsoleCursorInfo = CursorInfoRequest->Info;
return TRUE;
}
/*--------------------------------------------------------------
- * GetNumberOfConsoleMouseButtons
- *
- * @unimplemented
- */
-BOOL
-WINAPI
-GetNumberOfConsoleMouseButtons(LPDWORD lpNumberOfMouseButtons)
-{
- DPRINT1("GetNumberOfConsoleMouseButtons(0x%x) UNIMPLEMENTED!\n", lpNumberOfMouseButtons);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
-}
-
-
-/*--------------------------------------------------------------
- * SetConsoleMode
+ * SetConsoleCursorInfo
*
* @implemented
*/
BOOL
-WINAPI
-SetConsoleMode(HANDLE hConsoleHandle,
- DWORD dwMode)
+WINAPI
+SetConsoleCursorInfo(HANDLE hConsoleOutput,
+ CONST CONSOLE_CURSOR_INFO *lpConsoleCursorInfo)
{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_GETSETCURSORINFO CursorInfoRequest = &ApiMessage.Data.CursorInfoRequest;
- Request.Data.SetConsoleModeRequest.ConsoleHandle = hConsoleHandle;
- Request.Data.SetConsoleModeRequest.Mode = dwMode;
+ CursorInfoRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ CursorInfoRequest->OutputHandle = hConsoleOutput;
+ CursorInfoRequest->Info = *lpConsoleCursorInfo;
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, SET_CONSOLE_MODE),
- sizeof(CSR_API_MESSAGE));
- if(!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetCursorInfo),
+ sizeof(*CursorInfoRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
/*--------------------------------------------------------------
- * SetConsoleActiveScreenBuffer
+ * GetNumberOfConsoleMouseButtons
*
* @implemented
*/
BOOL
WINAPI
-SetConsoleActiveScreenBuffer(HANDLE hConsoleOutput)
+GetNumberOfConsoleMouseButtons(LPDWORD lpNumberOfMouseButtons)
{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_GETMOUSEINFO GetMouseInfoRequest = &ApiMessage.Data.GetMouseInfoRequest;
- Request.Data.SetScreenBufferRequest.OutputHandle = hConsoleOutput;
+ GetMouseInfoRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, SET_SCREEN_BUFFER),
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetMouseInfo),
+ sizeof(*GetMouseInfoRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
+ *lpNumberOfMouseButtons = GetMouseInfoRequest->NumButtons;
return TRUE;
}
/*--------------------------------------------------------------
- * FlushConsoleInputBuffer
+ * SetConsoleActiveScreenBuffer
*
* @implemented
*/
BOOL
WINAPI
-FlushConsoleInputBuffer(HANDLE hConsoleInput)
+SetConsoleActiveScreenBuffer(HANDLE hConsoleOutput)
{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_SETACTIVESCREENBUFFER SetScreenBufferRequest = &ApiMessage.Data.SetScreenBufferRequest;
- Request.Data.FlushInputBufferRequest.ConsoleInput = hConsoleInput;
+ SetScreenBufferRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ SetScreenBufferRequest->OutputHandle = hConsoleOutput;
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, FLUSH_INPUT_BUFFER),
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetActiveScreenBuffer),
+ sizeof(*SetScreenBufferRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
/*--------------------------------------------------------------
- * SetConsoleScreenBufferSize
+ * FlushConsoleInputBuffer
*
* @implemented
*/
BOOL
WINAPI
-SetConsoleScreenBufferSize(HANDLE hConsoleOutput,
- COORD dwSize)
+FlushConsoleInputBuffer(HANDLE hConsoleInput)
{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_FLUSHINPUTBUFFER FlushInputBufferRequest = &ApiMessage.Data.FlushInputBufferRequest;
- Request.Data.SetScreenBufferSize.OutputHandle = hConsoleOutput;
- Request.Data.SetScreenBufferSize.Size = dwSize;
+ FlushInputBufferRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ FlushInputBufferRequest->InputHandle = hConsoleInput;
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, SET_SCREEN_BUFFER_SIZE),
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepFlushInputBuffer),
+ sizeof(*FlushInputBufferRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
return TRUE;
}
+
/*--------------------------------------------------------------
- * SetConsoleCursorInfo
+ * SetConsoleScreenBufferSize
*
* @implemented
*/
BOOL
WINAPI
-SetConsoleCursorInfo(HANDLE hConsoleOutput,
- CONST CONSOLE_CURSOR_INFO *lpConsoleCursorInfo)
+SetConsoleScreenBufferSize(HANDLE hConsoleOutput,
+ COORD dwSize)
{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_SETSCREENBUFFERSIZE SetScreenBufferSizeRequest = &ApiMessage.Data.SetScreenBufferSizeRequest;
- Request.Data.SetCursorInfoRequest.ConsoleHandle = hConsoleOutput;
- Request.Data.SetCursorInfoRequest.Info = *lpConsoleCursorInfo;
+ SetScreenBufferSizeRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ SetScreenBufferSizeRequest->OutputHandle = hConsoleOutput;
+ SetScreenBufferSizeRequest->Size = dwSize;
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, SET_CURSOR_INFO),
- sizeof(CSR_API_MESSAGE));
- if(!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetScreenBufferSize),
+ sizeof(*SetScreenBufferSizeRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
static
BOOL
IntScrollConsoleScreenBuffer(HANDLE hConsoleOutput,
- const SMALL_RECT *lpScrollRectangle,
- const SMALL_RECT *lpClipRectangle,
+ CONST SMALL_RECT* lpScrollRectangle,
+ CONST SMALL_RECT* lpClipRectangle,
COORD dwDestinationOrigin,
- const CHAR_INFO *lpFill,
+ CONST CHAR_INFO* lpFill,
BOOL bUnicode)
{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_SCROLLSCREENBUFFER ScrollScreenBufferRequest = &ApiMessage.Data.ScrollScreenBufferRequest;
- Request.Data.ScrollConsoleScreenBufferRequest.ConsoleHandle = hConsoleOutput;
- Request.Data.ScrollConsoleScreenBufferRequest.Unicode = bUnicode;
- Request.Data.ScrollConsoleScreenBufferRequest.ScrollRectangle = *lpScrollRectangle;
+ ScrollScreenBufferRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ ScrollScreenBufferRequest->OutputHandle = hConsoleOutput;
+ ScrollScreenBufferRequest->ScrollRectangle = *lpScrollRectangle;
if (lpClipRectangle != NULL)
{
- Request.Data.ScrollConsoleScreenBufferRequest.UseClipRectangle = TRUE;
- Request.Data.ScrollConsoleScreenBufferRequest.ClipRectangle = *lpClipRectangle;
+ ScrollScreenBufferRequest->UseClipRectangle = TRUE;
+ ScrollScreenBufferRequest->ClipRectangle = *lpClipRectangle;
}
else
{
- Request.Data.ScrollConsoleScreenBufferRequest.UseClipRectangle = FALSE;
+ ScrollScreenBufferRequest->UseClipRectangle = FALSE;
}
- Request.Data.ScrollConsoleScreenBufferRequest.DestinationOrigin = dwDestinationOrigin;
- Request.Data.ScrollConsoleScreenBufferRequest.Fill = *lpFill;
-
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, SCROLL_CONSOLE_SCREEN_BUFFER),
- sizeof(CSR_API_MESSAGE));
+ ScrollScreenBufferRequest->DestinationOrigin = dwDestinationOrigin;
+ ScrollScreenBufferRequest->Fill = *lpFill;
+ ScrollScreenBufferRequest->Unicode = bUnicode;
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepScrollScreenBuffer),
+ sizeof(*ScrollScreenBufferRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
BOOL
WINAPI
ScrollConsoleScreenBufferA(HANDLE hConsoleOutput,
- CONST SMALL_RECT *lpScrollRectangle,
- CONST SMALL_RECT *lpClipRectangle,
+ CONST SMALL_RECT* lpScrollRectangle,
+ CONST SMALL_RECT* lpClipRectangle,
COORD dwDestinationOrigin,
- CONST CHAR_INFO *lpFill)
+ CONST CHAR_INFO* lpFill)
{
return IntScrollConsoleScreenBuffer(hConsoleOutput,
- (PSMALL_RECT)lpScrollRectangle,
- (PSMALL_RECT)lpClipRectangle,
+ lpScrollRectangle,
+ lpClipRectangle,
dwDestinationOrigin,
- (PCHAR_INFO)lpFill,
+ lpFill,
FALSE);
}
/*--------------------------------------------------------------
* SetConsoleWindowInfo
*
- * @unimplemented
+ * @implemented
*/
BOOL
WINAPI
BOOL bAbsolute,
CONST SMALL_RECT *lpConsoleWindow)
{
- DPRINT1("SetConsoleWindowInfo(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput, bAbsolute, lpConsoleWindow);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_SETWINDOWINFO SetWindowInfoRequest = &ApiMessage.Data.SetWindowInfoRequest;
+
+ if (lpConsoleWindow == NULL)
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
+ SetWindowInfoRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ SetWindowInfoRequest->OutputHandle = hConsoleOutput;
+ SetWindowInfoRequest->Absolute = bAbsolute;
+ SetWindowInfoRequest->WindowRect = *lpConsoleWindow;
+
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetWindowInfo),
+ sizeof(*SetWindowInfoRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
+ {
+ BaseSetLastNTError(ApiMessage.Status);
+ return FALSE;
+ }
+
+ return TRUE;
}
SetConsoleTextAttribute(HANDLE hConsoleOutput,
WORD wAttributes)
{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_SETTEXTATTRIB SetTextAttribRequest = &ApiMessage.Data.SetTextAttribRequest;
- Request.Data.SetAttribRequest.ConsoleHandle = hConsoleOutput;
- Request.Data.SetAttribRequest.Attrib = wAttributes;
+ SetTextAttribRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ SetTextAttribRequest->OutputHandle = hConsoleOutput;
+ SetTextAttribRequest->Attributes = wAttributes;
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, SET_ATTRIB),
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetTextAttribute),
+ sizeof(*SetTextAttribRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
GenerateConsoleCtrlEvent(DWORD dwCtrlEvent,
DWORD dwProcessGroupId)
{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_GENERATECTRLEVENT GenerateCtrlEventRequest = &ApiMessage.Data.GenerateCtrlEventRequest;
if (dwCtrlEvent != CTRL_C_EVENT && dwCtrlEvent != CTRL_BREAK_EVENT)
{
return FALSE;
}
- Request.Data.GenerateCtrlEvent.Event = dwCtrlEvent;
- Request.Data.GenerateCtrlEvent.ProcessGroup = dwProcessGroupId;
+ GenerateCtrlEventRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ GenerateCtrlEventRequest->CtrlEvent = dwCtrlEvent;
+ GenerateCtrlEventRequest->ProcessGroupId = dwProcessGroupId;
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, GENERATE_CTRL_EVENT),
- sizeof(CSR_API_MESSAGE));
- if(!NT_SUCCESS(Status) || !(NT_SUCCESS(Status = Request.Status)))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGenerateCtrlEvent),
+ sizeof(*GenerateCtrlEventRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
static DWORD
-IntGetConsoleTitle(LPVOID lpConsoleTitle, DWORD nSize, BOOL bUnicode)
+IntGetConsoleTitle(LPVOID lpConsoleTitle, DWORD dwNumChars, BOOLEAN bUnicode)
{
- CSR_API_MESSAGE Request;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_GETSETCONSOLETITLE TitleRequest = &ApiMessage.Data.TitleRequest;
PCSR_CAPTURE_BUFFER CaptureBuffer;
- NTSTATUS Status;
- if (nSize == 0)
- return 0;
+ if (dwNumChars == 0) return 0;
- Request.Data.GetTitleRequest.Length = nSize * (bUnicode ? 1 : sizeof(WCHAR));
- CaptureBuffer = CsrAllocateCaptureBuffer(1, Request.Data.GetTitleRequest.Length);
+ TitleRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ TitleRequest->Length = dwNumChars * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR));
+ TitleRequest->Unicode = bUnicode;
+
+ CaptureBuffer = CsrAllocateCaptureBuffer(1, TitleRequest->Length);
if (CaptureBuffer == NULL)
{
DPRINT1("CsrAllocateCaptureBuffer failed!\n");
}
CsrAllocateMessagePointer(CaptureBuffer,
- Request.Data.GetTitleRequest.Length,
- (PVOID*)&Request.Data.GetTitleRequest.Title);
+ TitleRequest->Length,
+ (PVOID*)&TitleRequest->Title);
- Status = CsrClientCallServer(&Request,
- CaptureBuffer,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_TITLE),
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status) || !(NT_SUCCESS(Status = Request.Status)))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ CaptureBuffer,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetTitle),
+ sizeof(*TitleRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
CsrFreeCaptureBuffer(CaptureBuffer);
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return 0;
}
- if (bUnicode)
- {
- if (nSize >= sizeof(WCHAR))
- wcscpy((LPWSTR)lpConsoleTitle, Request.Data.GetTitleRequest.Title);
- }
- else
+ dwNumChars = TitleRequest->Length / (bUnicode ? sizeof(WCHAR) : sizeof(CHAR));
+
+ if (dwNumChars > 0)
{
- 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;
- }
+ memcpy(lpConsoleTitle, TitleRequest->Title, TitleRequest->Length);
+
+ if (bUnicode)
+ ((LPWSTR)lpConsoleTitle)[dwNumChars] = L'\0';
+ else
+ ((LPSTR)lpConsoleTitle)[dwNumChars] = '\0';
}
+
CsrFreeCaptureBuffer(CaptureBuffer);
- return Request.Data.GetTitleRequest.Length / sizeof(WCHAR);
+ return dwNumChars;
}
+
/*--------------------------------------------------------------
* GetConsoleTitleW
*
return IntGetConsoleTitle(lpConsoleTitle, nSize, TRUE);
}
+
/*--------------------------------------------------------------
* GetConsoleTitleA
*
- * 19990306 EA
- *
* @implemented
*/
DWORD
}
-/*--------------------------------------------------------------
- * SetConsoleTitleW
- *
- * @implemented
- */
-BOOL
-WINAPI
-SetConsoleTitleW(LPCWSTR lpConsoleTitle)
+static BOOL
+IntSetConsoleTitle(CONST VOID *lpConsoleTitle, BOOLEAN bUnicode)
{
- CSR_API_MESSAGE Request;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_GETSETCONSOLETITLE TitleRequest = &ApiMessage.Data.TitleRequest;
PCSR_CAPTURE_BUFFER CaptureBuffer;
- NTSTATUS Status;
- Request.Data.SetTitleRequest.Length = wcslen(lpConsoleTitle) * sizeof(WCHAR);
+ ULONG NumChars = (ULONG)(lpConsoleTitle ? (bUnicode ? wcslen(lpConsoleTitle) : strlen(lpConsoleTitle)) : 0);
- CaptureBuffer = CsrAllocateCaptureBuffer(1, Request.Data.SetTitleRequest.Length);
+ TitleRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ TitleRequest->Length = NumChars * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR));
+ TitleRequest->Unicode = bUnicode;
+
+ CaptureBuffer = CsrAllocateCaptureBuffer(1, TitleRequest->Length);
if (CaptureBuffer == NULL)
{
DPRINT1("CsrAllocateCaptureBuffer failed!\n");
CsrCaptureMessageBuffer(CaptureBuffer,
(PVOID)lpConsoleTitle,
- Request.Data.SetTitleRequest.Length,
- (PVOID*)&Request.Data.SetTitleRequest.Title);
+ TitleRequest->Length,
+ (PVOID*)&TitleRequest->Title);
- Status = CsrClientCallServer(&Request,
- CaptureBuffer,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, SET_TITLE),
- sizeof(CSR_API_MESSAGE));
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ CaptureBuffer,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetTitle),
+ sizeof(*TitleRequest));
CsrFreeCaptureBuffer(CaptureBuffer);
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
return TRUE;
}
+/*--------------------------------------------------------------
+ * SetConsoleTitleW
+ *
+ * @implemented
+ */
+BOOL
+WINAPI
+SetConsoleTitleW(LPCWSTR lpConsoleTitle)
+{
+ return IntSetConsoleTitle(lpConsoleTitle, TRUE);
+}
+
/*--------------------------------------------------------------
* SetConsoleTitleA
*
- * 19990204 EA Added
- *
* @implemented
*/
BOOL
WINAPI
SetConsoleTitleA(LPCSTR lpConsoleTitle)
{
- ULONG Length = strlen(lpConsoleTitle) + 1;
- LPWSTR WideTitle = HeapAlloc(GetProcessHeap(), 0, Length * sizeof(WCHAR));
- BOOL Ret;
- if (!WideTitle)
- {
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return FALSE;
- }
- MultiByteToWideChar(CP_ACP, 0, lpConsoleTitle, -1, WideTitle, Length);
- Ret = SetConsoleTitleW(WideTitle);
- HeapFree(GetProcessHeap(), 0, WideTitle);
- return Ret;
+ return IntSetConsoleTitle(lpConsoleTitle, FALSE);
}
DWORD dwFlags,
LPVOID lpScreenBufferData)
{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_CREATESCREENBUFFER CreateScreenBufferRequest = &ApiMessage.Data.CreateScreenBufferRequest;
+ PCSR_CAPTURE_BUFFER CaptureBuffer = NULL;
+ PCONSOLE_GRAPHICS_BUFFER_INFO GraphicsBufferInfo = lpScreenBufferData;
- if (dwDesiredAccess & ~(GENERIC_READ | GENERIC_WRITE)
- || dwShareMode & ~(FILE_SHARE_READ | FILE_SHARE_WRITE)
- || dwFlags != CONSOLE_TEXTMODE_BUFFER)
+ if ( (dwDesiredAccess & ~(GENERIC_READ | GENERIC_WRITE)) ||
+ (dwShareMode & ~(FILE_SHARE_READ | FILE_SHARE_WRITE)) ||
+ (dwFlags != CONSOLE_TEXTMODE_BUFFER && dwFlags != CONSOLE_GRAPHICS_BUFFER) )
{
SetLastError(ERROR_INVALID_PARAMETER);
return INVALID_HANDLE_VALUE;
}
- Request.Data.CreateScreenBufferRequest.Access = dwDesiredAccess;
- Request.Data.CreateScreenBufferRequest.ShareMode = dwShareMode;
- Request.Data.CreateScreenBufferRequest.Inheritable =
- lpSecurityAttributes ? lpSecurityAttributes->bInheritHandle : FALSE;
+ CreateScreenBufferRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ CreateScreenBufferRequest->DesiredAccess = dwDesiredAccess;
+ CreateScreenBufferRequest->InheritHandle =
+ (lpSecurityAttributes ? lpSecurityAttributes->bInheritHandle : FALSE);
+ CreateScreenBufferRequest->ShareMode = dwShareMode;
+ CreateScreenBufferRequest->ScreenBufferType = dwFlags;
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, CREATE_SCREEN_BUFFER),
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ if (dwFlags == CONSOLE_GRAPHICS_BUFFER)
{
- BaseSetLastNTError(Status);
+ if (CreateScreenBufferRequest->InheritHandle || GraphicsBufferInfo == NULL)
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return INVALID_HANDLE_VALUE;
+ }
+
+ CreateScreenBufferRequest->GraphicsBufferInfo = *GraphicsBufferInfo;
+
+ CaptureBuffer = CsrAllocateCaptureBuffer(1, GraphicsBufferInfo->dwBitMapInfoLength);
+ if (CaptureBuffer == NULL)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return INVALID_HANDLE_VALUE;
+ }
+
+ CsrCaptureMessageBuffer(CaptureBuffer,
+ (PVOID)GraphicsBufferInfo->lpBitMapInfo,
+ GraphicsBufferInfo->dwBitMapInfoLength,
+ (PVOID*)&CreateScreenBufferRequest->GraphicsBufferInfo.lpBitMapInfo);
+ }
+
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ CaptureBuffer,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepCreateScreenBuffer),
+ sizeof(*CreateScreenBufferRequest));
+
+ if (CaptureBuffer) CsrFreeCaptureBuffer(CaptureBuffer);
+
+ if (!NT_SUCCESS(ApiMessage.Status))
+ {
+ BaseSetLastNTError(ApiMessage.Status);
return INVALID_HANDLE_VALUE;
}
- return Request.Data.CreateScreenBufferRequest.OutputHandle;
+
+ if (dwFlags == CONSOLE_GRAPHICS_BUFFER && GraphicsBufferInfo)
+ {
+ GraphicsBufferInfo->hMutex = CreateScreenBufferRequest->hMutex ; // CreateScreenBufferRequest->GraphicsBufferInfo.hMutex ;
+ GraphicsBufferInfo->lpBitMap = CreateScreenBufferRequest->lpBitMap; // CreateScreenBufferRequest->GraphicsBufferInfo.lpBitMap;
+ }
+
+ return CreateScreenBufferRequest->OutputHandle;
}
WINAPI
GetConsoleCP(VOID)
{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_GETINPUTOUTPUTCP GetConsoleCPRequest = &ApiMessage.Data.GetConsoleCPRequest;
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_CONSOLE_CP),
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ /* Get the Input Code Page */
+ GetConsoleCPRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ GetConsoleCPRequest->OutputCP = FALSE;
+
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetCP),
+ sizeof(*GetConsoleCPRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError (Status);
+ BaseSetLastNTError(ApiMessage.Status);
return 0;
}
- return Request.Data.GetConsoleCodePage.CodePage;
+ return GetConsoleCPRequest->CodePage;
}
WINAPI
SetConsoleCP(UINT wCodePageID)
{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_SETINPUTOUTPUTCP SetConsoleCPRequest = &ApiMessage.Data.SetConsoleCPRequest;
- Request.Data.SetConsoleCodePage.CodePage = wCodePageID;
+ /* Set the Input Code Page */
+ SetConsoleCPRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ SetConsoleCPRequest->CodePage = wCodePageID;
+ SetConsoleCPRequest->OutputCP = FALSE;
+ /* SetConsoleCPRequest->EventHandle; */
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, SET_CONSOLE_CP),
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetCP),
+ sizeof(*SetConsoleCPRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
+ return FALSE;
}
- return NT_SUCCESS(Status);
+ return TRUE;
}
WINAPI
GetConsoleOutputCP(VOID)
{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_GETINPUTOUTPUTCP GetConsoleCPRequest = &ApiMessage.Data.GetConsoleCPRequest;
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_CONSOLE_OUTPUT_CP),
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ /* Get the Output Code Page */
+ GetConsoleCPRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ GetConsoleCPRequest->OutputCP = TRUE;
+
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetCP),
+ sizeof(*GetConsoleCPRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError (Status);
+ BaseSetLastNTError(ApiMessage.Status);
return 0;
}
- return Request.Data.GetConsoleOutputCodePage.CodePage;
+ return GetConsoleCPRequest->CodePage;
}
WINAPI
SetConsoleOutputCP(UINT wCodePageID)
{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_SETINPUTOUTPUTCP SetConsoleCPRequest = &ApiMessage.Data.SetConsoleCPRequest;
- Request.Data.SetConsoleOutputCodePage.CodePage = wCodePageID;
+ /* Set the Output Code Page */
+ SetConsoleCPRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ SetConsoleCPRequest->CodePage = wCodePageID;
+ SetConsoleCPRequest->OutputCP = TRUE;
+ /* SetConsoleCPRequest->EventHandle; */
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, SET_CONSOLE_OUTPUT_CP),
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetCP),
+ sizeof(*SetConsoleCPRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
+ return FALSE;
}
- return NT_SUCCESS(Status);
+ return TRUE;
}
GetConsoleProcessList(LPDWORD lpdwProcessList,
DWORD dwProcessCount)
{
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_GETPROCESSLIST GetProcessListRequest = &ApiMessage.Data.GetProcessListRequest;
PCSR_CAPTURE_BUFFER CaptureBuffer;
- CSR_API_MESSAGE Request;
- ULONG nProcesses;
- NTSTATUS Status;
+ ULONG nProcesses = 0;
if (lpdwProcessList == NULL || dwProcessCount == 0)
{
{
DPRINT1("CsrAllocateCaptureBuffer failed!\n");
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return FALSE;
+ return 0;
}
- Request.Data.GetProcessListRequest.nMaxIds = dwProcessCount;
+ GetProcessListRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ GetProcessListRequest->ProcessCount = dwProcessCount;
+
CsrAllocateMessagePointer(CaptureBuffer,
dwProcessCount * sizeof(DWORD),
- (PVOID*)&Request.Data.GetProcessListRequest.ProcessId);
+ (PVOID*)&GetProcessListRequest->ProcessIdsList);
- Status = CsrClientCallServer(&Request,
- CaptureBuffer,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_PROCESS_LIST),
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ CaptureBuffer,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetProcessList),
+ sizeof(*GetProcessListRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError (Status);
- nProcesses = 0;
+ BaseSetLastNTError(ApiMessage.Status);
}
else
{
- nProcesses = Request.Data.GetProcessListRequest.nProcessIdsTotal;
+ nProcesses = GetProcessListRequest->ProcessCount;
if (dwProcessCount >= nProcesses)
{
- memcpy(lpdwProcessList, Request.Data.GetProcessListRequest.ProcessId, nProcesses * sizeof(DWORD));
+ memcpy(lpdwProcessList, GetProcessListRequest->ProcessIdsList, nProcesses * sizeof(DWORD));
}
}
}
-
/*--------------------------------------------------------------
* GetConsoleSelectionInfo
*
WINAPI
GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo)
{
- CSR_API_MESSAGE Request;
- NTSTATUS Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_CONSOLE_SELECTION_INFO),
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_GETSELECTIONINFO GetSelectionInfoRequest = &ApiMessage.Data.GetSelectionInfoRequest;
+
+ if (lpConsoleSelectionInfo == NULL)
{
- BaseSetLastNTError(Status);
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
+ GetSelectionInfoRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetSelectionInfo),
+ sizeof(*GetSelectionInfoRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
+ {
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
- *lpConsoleSelectionInfo = Request.Data.GetConsoleSelectionInfo.Info;
+ *lpConsoleSelectionInfo = GetSelectionInfoRequest->Info;
+
return TRUE;
}
-
/*--------------------------------------------------------------
* AttachConsole
*
- * @unimplemented
+ * @implemented
+ *
+ * @note Strongly inspired by AllocConsole.
*/
BOOL
WINAPI
AttachConsole(DWORD dwProcessId)
{
- DPRINT1("AttachConsole(0x%x) UNIMPLEMENTED!\n", dwProcessId);
+ NTSTATUS Status;
+ PRTL_USER_PROCESS_PARAMETERS Parameters = NtCurrentPeb()->ProcessParameters;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_ATTACHCONSOLE AttachConsoleRequest = &ApiMessage.Data.AttachConsoleRequest;
+
+ if (Parameters->ConsoleHandle)
+ {
+ DPRINT1("AttachConsole: Attaching a console to a process already having one\n");
+ SetLastError(ERROR_ACCESS_DENIED);
+ return FALSE;
+ }
+
+ AttachConsoleRequest->ProcessId = dwProcessId;
+ AttachConsoleRequest->CtrlDispatcher = ConsoleControlDispatcher;
+ AttachConsoleRequest->PropDispatcher = PropDialogHandler;
+
+ Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepAttach),
+ sizeof(CONSOLE_ATTACHCONSOLE));
+ if (!NT_SUCCESS(Status))
+ {
+ BaseSetLastNTError(Status);
+ return FALSE;
+ }
+
+ Parameters->ConsoleHandle = AttachConsoleRequest->ConsoleHandle;
+ SetStdHandle(STD_INPUT_HANDLE , AttachConsoleRequest->InputHandle );
+ SetStdHandle(STD_OUTPUT_HANDLE, AttachConsoleRequest->OutputHandle);
+ SetStdHandle(STD_ERROR_HANDLE , AttachConsoleRequest->ErrorHandle );
+
+ /* Initialize Console Ctrl Handler */
+ InitConsoleCtrlHandling();
+
+ InputWaitHandle = AttachConsoleRequest->InputWaitHandle;
+
return TRUE;
}
+
/*--------------------------------------------------------------
* GetConsoleWindow
*
WINAPI
GetConsoleWindow(VOID)
{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_GETWINDOW GetWindowRequest = &ApiMessage.Data.GetWindowRequest;
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_CONSOLE_WINDOW),
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status ) || !NT_SUCCESS(Status = Request.Status))
+ GetWindowRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetConsoleWindow),
+ sizeof(*GetWindowRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
- return (HWND) NULL;
+ BaseSetLastNTError(ApiMessage.Status);
+ return (HWND)NULL;
}
- return Request.Data.GetConsoleWindowRequest.WindowHandle;
+ return GetWindowRequest->WindowHandle;
}
*/
BOOL
WINAPI
-SetConsoleIcon(HICON hicon)
+SetConsoleIcon(HICON hIcon)
{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_SETICON SetIconRequest = &ApiMessage.Data.SetIconRequest;
- Request.Data.SetConsoleIconRequest.WindowIcon = hicon;
+ SetIconRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ SetIconRequest->IconHandle = hIcon;
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, SET_CONSOLE_ICON),
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetIcon),
+ sizeof(*SetIconRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
- return NT_SUCCESS(Status);
+ return TRUE;
}
{
int lenName;
- if (!lpInputExeName
- || (lenName = lstrlenW(lpInputExeName)) == 0
- || lenName > INPUTEXENAME_BUFLEN - 1)
+ if ( !lpInputExeName ||
+ (lenName = lstrlenW(lpInputExeName)) == 0 ||
+ lenName > INPUTEXENAME_BUFLEN - 1 )
{
/* Fail if string is empty or too long */
SetLastError(ERROR_INVALID_PARAMETER);
ANSI_STRING InputExeNameA;
UNICODE_STRING InputExeNameU;
NTSTATUS Status;
- BOOL Ret;
RtlInitAnsiString(&InputExeNameA, lpInputExeName);
- if(InputExeNameA.Length == 0 ||
- InputExeNameA.Length > INPUTEXENAME_BUFLEN - 1)
+ if ( InputExeNameA.Length == 0 ||
+ InputExeNameA.Length > INPUTEXENAME_BUFLEN - 1 )
{
/* Fail if string is empty or too long */
SetLastError(ERROR_INVALID_PARAMETER);
InputExeNameU.Buffer = Buffer;
InputExeNameU.MaximumLength = sizeof(Buffer);
InputExeNameU.Length = 0;
+
Status = RtlAnsiStringToUnicodeString(&InputExeNameU, &InputExeNameA, FALSE);
- if(NT_SUCCESS(Status))
- {
- Ret = SetConsoleInputExeNameW(InputExeNameU.Buffer);
- }
- else
+ if (!NT_SUCCESS(Status))
{
BaseSetLastNTError(Status);
- Ret = FALSE;
+ return FALSE;
}
- return Ret;
+ return SetConsoleInputExeNameW(InputExeNameU.Buffer);
}
* \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.
+ * Specify 0 to receive the needed buffer length.
+ * \param lpBuffer Pointer to a buffer that receives 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
WINAPI
GetConsoleInputExeNameW(DWORD nBufferLength, LPWSTR lpBuffer)
{
- int lenName = lstrlenW(InputExeName);
+ ULONG lenName = lstrlenW(InputExeName);
if (nBufferLength == 0)
{
return lenName + 1;
}
- if(lenName + 1 > nBufferLength)
+ if (lenName + 1 > nBufferLength)
{
/* Buffer is not large enough! */
SetLastError(ERROR_BUFFER_OVERFLOW);
* \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.
+ * \param lpBuffer Pointer to a buffer that receives 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.
+ * is not big enough. The buffer receives as much characters as fit.
*/
DWORD
WINAPI
/* Initialize strings for conversion */
RtlInitUnicodeString(&BufferU, Buffer);
BufferA.Length = 0;
- BufferA.MaximumLength = nBufferLength;
+ BufferA.MaximumLength = (USHORT)nBufferLength;
BufferA.Buffer = lpBuffer;
/* Convert unicode name to ansi, copying as much chars as fit */
RtlUnicodeStringToAnsiString(&BufferA, &BufferU, FALSE);
/* Error handling */
- if(nBufferLength <= BufferU.Length / sizeof(WCHAR))
+ if (nBufferLength <= BufferU.Length / sizeof(WCHAR))
{
SetLastError(ERROR_BUFFER_OVERFLOW);
return 2;
BOOL
WINAPI
-GetConsoleNlsMode(HANDLE hConsole, LPDWORD lpMode)
-{
- STUB;
- return FALSE;
-}
-
-
-BOOL
-WINAPI
-ReadConsoleInputExA(HANDLE hConsole, LPVOID lpBuffer, DWORD dwLen, LPDWORD Unknown1, DWORD Unknown2)
-{
- STUB;
- return FALSE;
-}
-
-BOOL
-WINAPI
-ReadConsoleInputExW(HANDLE hConsole, LPVOID lpBuffer, DWORD dwLen, LPDWORD Unknown1, DWORD Unknown2)
+SetConsoleCursorMode(HANDLE hConsole, BOOL Unknown1, BOOL Unknown2)
{
STUB;
return FALSE;
BOOL
WINAPI
-RegisterConsoleIME(HWND hWnd, LPDWORD ThreadId)
+GetConsoleNlsMode(HANDLE hConsole, LPDWORD lpMode)
{
STUB;
return FALSE;
BOOL
WINAPI
-RegisterConsoleOS2(BOOL bUnknown)
+SetConsoleNlsMode(HANDLE hConsole, DWORD dwMode)
{
STUB;
return FALSE;
BOOL
WINAPI
-SetConsoleCursorMode(HANDLE hConsole, BOOL Unknown1, BOOL Unknown2)
+SetConsoleLocalEUDC(DWORD Unknown1, DWORD Unknown2, DWORD Unknown3, DWORD Unknown4)
{
STUB;
return FALSE;
BOOL
WINAPI
-SetConsoleLocalEUDC(DWORD Unknown1, DWORD Unknown2, DWORD Unknown3, DWORD Unknown4)
+RegisterConsoleIME(HWND hWnd, LPDWORD ThreadId)
{
STUB;
return FALSE;
BOOL
WINAPI
-SetConsoleNlsMode(HANDLE hConsole, DWORD dwMode)
+RegisterConsoleOS2(BOOL bUnknown)
{
STUB;
return FALSE;
}
/*
- * @unimplemented
+ * @implemented
*/
-BOOL
+DWORD
WINAPI
SetLastConsoleEventActive(VOID)
{
- STUB;
- return FALSE;
-}
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_NOTIFYLASTCLOSE NotifyLastCloseRequest = &ApiMessage.Data.NotifyLastCloseRequest;
-/*
- * @unimplemented
- */
-BOOL
-WINAPI
-SetConsoleCommandHistoryMode(IN DWORD dwMode)
-{
- STUB;
- return FALSE;
-}
+ /* Set the flag used by the console control dispatcher */
+ LastCloseNotify = TRUE;
+ /* Set up the input arguments */
+ NotifyLastCloseRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+
+ /* Call CSRSS; just return the NTSTATUS cast to DWORD */
+ return CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepNotifyLastClose),
+ sizeof(*NotifyLastCloseRequest));
+}
/* EOF */