#include <k32.h>
-// #define NDEBUG
+#define NDEBUG
#include <debug.h>
extern RTL_CRITICAL_SECTION ConsoleLock;
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);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
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);
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))
}
}
}
-
+
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)
-{
- ULONG Size = (Unicode ? wcslen(String) : strlen(String)) * sizeof(WCHAR);
- return (Size + 3) & -4;
-}
-
-/* Copy a string to a capture buffer */
-static VOID
-IntCaptureMessageString(PCSR_CAPTURE_BUFFER CaptureBuffer,
- LPCVOID String,
- BOOL Unicode,
- PUNICODE_STRING RequestString)
-{
- ULONG Size;
- if (Unicode)
- {
- Size = wcslen(String) * sizeof(WCHAR);
- CsrCaptureMessageBuffer(CaptureBuffer, (PVOID)String, Size, (PVOID *)&RequestString->Buffer);
- }
- else
- {
- Size = strlen(String);
- CsrAllocateMessagePointer(CaptureBuffer, Size * sizeof(WCHAR), (PVOID *)&RequestString->Buffer);
- Size = MultiByteToWideChar(CP_ACP, 0, String, Size, RequestString->Buffer, Size * sizeof(WCHAR))
- * sizeof(WCHAR);
- }
- RequestString->Length = RequestString->MaximumLength = Size;
-}
/* FUNCTIONS ******************************************************************/
}
-
-
/*
* @unimplemented
*/
BOOL bInheritHandle,
DWORD dwShareMode)
{
- CSR_API_MESSAGE Request;
- ULONG CsrRequest;
NTSTATUS Status = STATUS_SUCCESS;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCSRSS_OPEN_CONSOLE OpenConsoleRequest = &ApiMessage.Data.OpenConsoleRequest;
+ HANDLE_TYPE HandleType;
if (wsName && 0 == _wcsicmp(wsName, L"CONIN$"))
{
- CsrRequest = CSR_CREATE_API_NUMBER(CSR_NATIVE, GET_INPUT_HANDLE);
+ HandleType = HANDLE_INPUT;
}
else if (wsName && 0 == _wcsicmp(wsName, L"CONOUT$"))
{
- CsrRequest = CSR_CREATE_API_NUMBER(CSR_NATIVE, GET_OUTPUT_HANDLE);
+ HandleType = HANDLE_OUTPUT;
}
else
{
SetLastError(ERROR_INVALID_PARAMETER);
- return(INVALID_HANDLE_VALUE);
+ return INVALID_HANDLE_VALUE;
}
- if (dwDesiredAccess & ~(GENERIC_READ|GENERIC_WRITE))
+ 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 (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->HandleType = HandleType;
+ OpenConsoleRequest->Access = dwDesiredAccess;
+ OpenConsoleRequest->Inheritable = bInheritHandle;
+ OpenConsoleRequest->ShareMode = dwShareMode;
- Status = CsrClientCallServer(&Request,
+ Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
NULL,
- CsrRequest,
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepOpenConsole),
+ sizeof(CSRSS_OPEN_CONSOLE));
+ if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = ApiMessage.Status))
{
BaseSetLastNTError(Status);
return INVALID_HANDLE_VALUE;
}
- return Request.Data.GetInputHandleRequest.Handle;
+ return OpenConsoleRequest->Handle;
}
BOOL
WINAPI
VerifyConsoleIoHandle(HANDLE Handle)
-{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
-
- Request.Data.VerifyHandleRequest.Handle = Handle;
-
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_NATIVE, VERIFY_HANDLE),
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status))
- {
- BaseSetLastNTError(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;
-}
-
-
-/*
- * @implemented (Undocumented)
- */
-BOOL
-WINAPI
-CloseConsoleHandle(HANDLE Handle)
-{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
-
- Request.Data.CloseHandleRequest.Handle = Handle;
-
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_NATIVE, CLOSE_HANDLE),
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status))
- {
- BaseSetLastNTError(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;
- switch (nStdHandle)
- {
- case STD_INPUT_HANDLE:
- return Ppb->StandardInput;
-
- case STD_OUTPUT_HANDLE:
- return Ppb->StandardOutput;
-
- case STD_ERROR_HANDLE:
- return Ppb->StandardError;
- }
-
- SetLastError (ERROR_INVALID_PARAMETER);
- return INVALID_HANDLE_VALUE;
-}
-
-
-/*
- * @implemented
- */
-BOOL
-WINAPI
-SetStdHandle(DWORD nStdHandle,
- HANDLE hHandle)
- /*
- * FUNCTION: Set the handle for the standard input, standard output or
- * the standard error device.
- * ARGUMENTS:
- * nStdHandle - Specifies the handle to be set.
- * hHandle - The handle to set.
- * RETURNS: TRUE if the function succeeds, FALSE otherwise.
- */
-{
- PRTL_USER_PROCESS_PARAMETERS Ppb;
-
- /* no need to check if hHandle == INVALID_HANDLE_VALUE */
-
- Ppb = NtCurrentPeb()->ProcessParameters;
-
- switch (nStdHandle)
- {
- case STD_INPUT_HANDLE:
- Ppb->StandardInput = hHandle;
- return TRUE;
-
- case STD_OUTPUT_HANDLE:
- Ppb->StandardOutput = hHandle;
- return TRUE;
-
- case STD_ERROR_HANDLE:
- Ppb->StandardError = hHandle;
- return TRUE;
- }
-
- /* windows for whatever reason sets the last error to ERROR_INVALID_HANDLE here */
- SetLastError(ERROR_INVALID_HANDLE);
- return FALSE;
-}
-
-
-static
-BOOL
-IntWriteConsole(HANDLE hConsoleOutput,
- PVOID lpBuffer,
- DWORD nNumberOfCharsToWrite,
- LPDWORD lpNumberOfCharsWritten,
- LPVOID lpReserved,
- BOOL bUnicode)
-{
- PCSR_API_MESSAGE Request;
- ULONG CsrRequest;
- 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)
- {
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return FALSE;
- }
-
- CsrRequest = CSR_CREATE_API_NUMBER(CSR_CONSOLE, WRITE_CONSOLE);
-
- while (nNumberOfCharsToWrite > 0)
- {
- Request->Data.WriteConsoleRequest.ConsoleHandle = hConsoleOutput;
- Request->Data.WriteConsoleRequest.Unicode = bUnicode;
-
- nChars = (USHORT)min(nNumberOfCharsToWrite, CSRSS_MAX_WRITE_CONSOLE / CharSize);
- Request->Data.WriteConsoleRequest.NrCharactersToWrite = nChars;
-
- SizeBytes = nChars * CharSize;
-
- memcpy(Request->Data.WriteConsoleRequest.Buffer, lpBuffer, SizeBytes);
-
- Status = CsrClientCallServer(Request,
- NULL,
- CsrRequest,
- max(sizeof(CSR_API_MESSAGE),
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE) + SizeBytes));
-
- 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;
- }
-
- nNumberOfCharsToWrite -= nChars;
- lpBuffer = (PVOID)((ULONG_PTR)lpBuffer + (ULONG_PTR)SizeBytes);
- Written += Request->Data.WriteConsoleRequest.NrCharactersWritten;
- }
-
- if (lpNumberOfCharsWritten != NULL)
- {
- *lpNumberOfCharsWritten = Written;
- }
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
-
- return TRUE;
-}
-
-
-/*--------------------------------------------------------------
- * WriteConsoleA
- *
- * @implemented
- */
-BOOL
-WINAPI
-WriteConsoleA(HANDLE hConsoleOutput,
- CONST VOID *lpBuffer,
- DWORD nNumberOfCharsToWrite,
- LPDWORD lpNumberOfCharsWritten,
- LPVOID lpReserved)
-{
- return IntWriteConsole(hConsoleOutput,
- (PVOID)lpBuffer,
- nNumberOfCharsToWrite,
- lpNumberOfCharsWritten,
- lpReserved,
- FALSE);
-}
-
-
-/*--------------------------------------------------------------
- * WriteConsoleW
- *
- * @implemented
- */
-BOOL
-WINAPI
-WriteConsoleW(HANDLE hConsoleOutput,
- CONST VOID *lpBuffer,
- DWORD nNumberOfCharsToWrite,
- LPDWORD lpNumberOfCharsWritten,
- LPVOID lpReserved)
-{
- 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));
-
- CaptureBuffer = CsrAllocateCaptureBuffer(1, nNumberOfCharsToRead * CharSize);
- if (CaptureBuffer == NULL)
- {
- DPRINT1("CsrAllocateCaptureBuffer failed!\n");
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- 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);
-
- do
- {
- 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;
- }
- }
- 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);
-
- return TRUE;
-}
-
-
-/*--------------------------------------------------------------
- * ReadConsoleA
- *
- * @implemented
- */
-BOOL
-WINAPI
-ReadConsoleA(HANDLE hConsoleInput,
- LPVOID lpBuffer,
- DWORD nNumberOfCharsToRead,
- LPDWORD lpNumberOfCharsRead,
- PCONSOLE_READCONSOLE_CONTROL pInputControl)
-{
- return IntReadConsole(hConsoleInput,
- lpBuffer,
- nNumberOfCharsToRead,
- lpNumberOfCharsRead,
- NULL,
- FALSE);
-}
-
-
-/*--------------------------------------------------------------
- * 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);
-}
-
-
-/*--------------------------------------------------------------
- * AllocConsole
- *
- * @implemented
- */
-BOOL
-WINAPI
-AllocConsole(VOID)
-{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
- HANDLE hStdError;
- STARTUPINFO si;
-
- if (NtCurrentPeb()->ProcessParameters->ConsoleHandle)
- {
- DPRINT("AllocConsole: Allocate duplicate console to the same Process\n");
- BaseSetLastNTError (STATUS_OBJECT_NAME_EXISTS);
- return FALSE;
- }
-
- GetStartupInfo(&si);
-
- Request.Data.AllocConsoleRequest.CtrlDispatcher = ConsoleControlDispatcher;
- Request.Data.AllocConsoleRequest.ConsoleNeeded = TRUE;
- Request.Data.AllocConsoleRequest.ShowCmd = si.wShowWindow;
-
- 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))
- {
- BaseSetLastNTError(Status);
- return FALSE;
- }
-
- NtCurrentPeb()->ProcessParameters->ConsoleHandle = Request.Data.AllocConsoleRequest.Console;
-
- SetStdHandle(STD_INPUT_HANDLE, Request.Data.AllocConsoleRequest.InputHandle);
- SetStdHandle(STD_OUTPUT_HANDLE, Request.Data.AllocConsoleRequest.OutputHandle);
-
- hStdError = DuplicateConsoleHandle(Request.Data.AllocConsoleRequest.OutputHandle,
- 0,
- TRUE,
- DUPLICATE_SAME_ACCESS);
-
- SetStdHandle(STD_ERROR_HANDLE, hStdError);
- return TRUE;
-}
-
-
-/*--------------------------------------------------------------
- * FreeConsole
- *
- * @implemented
- */
-BOOL
-WINAPI
-FreeConsole(VOID)
-{
- // AG: I'm not sure if this is correct (what happens to std handles?)
- // but I just tried to reverse what AllocConsole() does...
-
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
-
- Status = CsrClientCallServer(&Request,
- NULL,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, FREE_CONSOLE),
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
- {
- BaseSetLastNTError(Status);
- return FALSE;
- }
-
- NtCurrentPeb()->ProcessParameters->ConsoleHandle = NULL;
- return TRUE;
-}
-
-
-/*--------------------------------------------------------------
- * GetConsoleScreenBufferInfo
- *
- * @implemented
- */
-BOOL
-WINAPI
-GetConsoleScreenBufferInfo(HANDLE hConsoleOutput,
- PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo)
-{
- CSR_API_MESSAGE Request;
- NTSTATUS Status;
-
- Request.Data.ScreenBufferInfoRequest.ConsoleHandle = hConsoleOutput;
-
- 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;
+{
+ CSR_API_MESSAGE Request;
+ NTSTATUS Status;
- Request->Data.ReadConsoleOutputCharRequest.ReadCoord = Request->Data.ReadConsoleOutputCharRequest.EndCoord;
- }
+ Request.Data.VerifyHandleRequest.Handle = Handle;
- if (lpNumberOfCharsRead != NULL)
+ Status = CsrClientCallServer(&Request,
+ NULL,
+ CSR_CREATE_API_NUMBER(CSR_NATIVE, VERIFY_HANDLE),
+ sizeof(CSR_API_MESSAGE));
+ if (!NT_SUCCESS(Status))
{
- *lpNumberOfCharsRead = CharsRead;
+ BaseSetLastNTError(Status);
+ return FALSE;
}
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
-
- return TRUE;
+ return (BOOL)NT_SUCCESS(Request.Status);
}
-/*--------------------------------------------------------------
- * ReadConsoleOutputCharacterA
- *
- * @implemented
+/*
+ * @unimplemented
*/
-BOOL
+DWORD
WINAPI
-ReadConsoleOutputCharacterA(HANDLE hConsoleOutput,
- LPSTR lpCharacter,
- DWORD nLength,
- COORD dwReadCoord,
- LPDWORD lpNumberOfCharsRead)
+WriteConsoleInputVDMA(DWORD Unknown0,
+ DWORD Unknown1,
+ DWORD Unknown2,
+ DWORD Unknown3)
{
- return IntReadConsoleOutputCharacter(hConsoleOutput,
- (PVOID)lpCharacter,
- nLength,
- dwReadCoord,
- lpNumberOfCharsRead,
- FALSE);
+ DPRINT1("WriteConsoleInputVDMA(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1, Unknown2, Unknown3);
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return 0;
}
-/*--------------------------------------------------------------
- * ReadConsoleOutputCharacterW
- *
- * @implemented
+/*
+ * @unimplemented
*/
-BOOL
+DWORD
WINAPI
-ReadConsoleOutputCharacterW(HANDLE hConsoleOutput,
- LPWSTR lpCharacter,
- DWORD nLength,
- COORD dwReadCoord,
- LPDWORD lpNumberOfCharsRead)
+WriteConsoleInputVDMW(DWORD Unknown0,
+ DWORD Unknown1,
+ DWORD Unknown2,
+ DWORD Unknown3)
{
- return IntReadConsoleOutputCharacter(hConsoleOutput,
- (PVOID)lpCharacter,
- nLength,
- dwReadCoord,
- lpNumberOfCharsRead,
- TRUE);
+ DPRINT1("WriteConsoleInputVDMW(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1, Unknown2, Unknown3);
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return 0;
}
-/*--------------------------------------------------------------
- * ReadConsoleOutputAttribute
- *
- * @implemented
+/*
+ * @implemented (Undocumented)
*/
BOOL
WINAPI
-ReadConsoleOutputAttribute(HANDLE hConsoleOutput,
- LPWORD lpAttribute,
- DWORD nLength,
- COORD dwReadCoord,
- LPDWORD lpNumberOfAttrsRead)
+CloseConsoleHandle(HANDLE Handle)
{
- PCSR_API_MESSAGE Request;
- ULONG CsrRequest;
+ CSR_API_MESSAGE Request;
NTSTATUS Status;
- DWORD Size;
- if (lpNumberOfAttrsRead != NULL)
- *lpNumberOfAttrsRead = nLength;
+ Request.Data.CloseHandleRequest.Handle = Handle;
- 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)
+ Status = CsrClientCallServer(&Request,
+ NULL,
+ CSR_CREATE_API_NUMBER(CSR_NATIVE, CLOSE_HANDLE),
+ sizeof(CSR_API_MESSAGE));
+ if (!NT_SUCCESS(Status))
{
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ BaseSetLastNTError(Status);
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;
+ return TRUE;
+}
- if (nLength > CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB / sizeof(WORD))
- Size = CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB / sizeof(WCHAR);
- else
- Size = nLength;
+/*
+ * @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;
- Request->Data.ReadConsoleOutputAttribRequest.NumAttrsToRead = Size;
+ Ppb = NtCurrentPeb()->ProcessParameters;
+ switch (nStdHandle)
+ {
+ case STD_INPUT_HANDLE:
+ return Ppb->StandardInput;
- 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;
- }
+ case STD_OUTPUT_HANDLE:
+ return Ppb->StandardOutput;
- memcpy(lpAttribute, Request->Data.ReadConsoleOutputAttribRequest.Attribute, Size * sizeof(WORD));
- lpAttribute += Size;
- nLength -= Size;
- Request->Data.ReadConsoleOutputAttribRequest.ReadCoord = Request->Data.ReadConsoleOutputAttribRequest.EndCoord;
+ case STD_ERROR_HANDLE:
+ return Ppb->StandardError;
}
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
-
- return TRUE;
+ SetLastError (ERROR_INVALID_PARAMETER);
+ return INVALID_HANDLE_VALUE;
}
-static
+/*
+ * @implemented
+ */
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;
+WINAPI
+SetStdHandle(DWORD nStdHandle,
+ HANDLE hHandle)
+ /*
+ * FUNCTION: Set the handle for the standard input, standard output or
+ * the standard error device.
+ * ARGUMENTS:
+ * nStdHandle - Specifies the handle to be set.
+ * hHandle - The handle to set.
+ * RETURNS: TRUE if the function succeeds, FALSE otherwise.
+ */
+{
+ PRTL_USER_PROCESS_PARAMETERS Ppb;
- CharSize = (bUnicode ? sizeof(WCHAR) : sizeof(CHAR));
+ /* no need to check if hHandle == INVALID_HANDLE_VALUE */
- nChars = min(nLength, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR / CharSize);
- //SizeBytes = nChars * CharSize;
+ Ppb = NtCurrentPeb()->ProcessParameters;
- 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)
+ switch (nStdHandle)
{
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return FALSE;
- }
+ case STD_INPUT_HANDLE:
+ Ppb->StandardInput = hHandle;
+ return TRUE;
- CsrRequest = CSR_CREATE_API_NUMBER(CSR_CONSOLE, WRITE_CONSOLE_OUTPUT_CHAR);
- Request->Data.WriteConsoleOutputCharRequest.Coord = dwWriteCoord;
+ case STD_OUTPUT_HANDLE:
+ Ppb->StandardOutput = hHandle;
+ return TRUE;
- while (nLength > 0)
- {
- DWORD BytesWrite;
+ case STD_ERROR_HANDLE:
+ Ppb->StandardError = hHandle;
+ return TRUE;
+ }
- Request->Data.WriteConsoleOutputCharRequest.ConsoleHandle = hConsoleOutput;
- Request->Data.WriteConsoleOutputCharRequest.Unicode = bUnicode;
- Request->Data.WriteConsoleOutputCharRequest.Length = (WORD)min(nLength, nChars);
- BytesWrite = Request->Data.WriteConsoleOutputCharRequest.Length * CharSize;
+ /* windows for whatever reason sets the last error to ERROR_INVALID_HANDLE here */
+ SetLastError(ERROR_INVALID_HANDLE);
+ return FALSE;
+}
- 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));
+/*--------------------------------------------------------------
+ * AllocConsole
+ *
+ * @implemented
+ */
+BOOL
+WINAPI
+AllocConsole(VOID)
+{
+ CSR_API_MESSAGE Request;
+ NTSTATUS Status;
+ HANDLE hStdError;
+ STARTUPINFO si;
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request->Status))
- {
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
- BaseSetLastNTError(Status);
- return FALSE;
- }
+ if (NtCurrentPeb()->ProcessParameters->ConsoleHandle)
+ {
+ DPRINT("AllocConsole: Allocate duplicate console to the same Process\n");
+ BaseSetLastNTError (STATUS_OBJECT_NAME_EXISTS);
+ return FALSE;
+ }
- nLength -= Request->Data.WriteConsoleOutputCharRequest.NrCharactersWritten;
- lpCharacter = (PVOID)((ULONG_PTR)lpCharacter + (ULONG_PTR)(Request->Data.WriteConsoleOutputCharRequest.NrCharactersWritten * CharSize));
- Written += Request->Data.WriteConsoleOutputCharRequest.NrCharactersWritten;
+ GetStartupInfo(&si);
- Request->Data.WriteConsoleOutputCharRequest.Coord = Request->Data.WriteConsoleOutputCharRequest.EndCoord;
- }
+ Request.Data.AllocConsoleRequest.CtrlDispatcher = ConsoleControlDispatcher;
+ Request.Data.AllocConsoleRequest.ConsoleNeeded = TRUE;
+ Request.Data.AllocConsoleRequest.ShowCmd = si.wShowWindow;
- if (lpNumberOfCharsWritten != NULL)
+ 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))
{
- *lpNumberOfCharsWritten = Written;
+ BaseSetLastNTError(Status);
+ return FALSE;
}
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
+ NtCurrentPeb()->ProcessParameters->ConsoleHandle = Request.Data.AllocConsoleRequest.Console;
+
+ SetStdHandle(STD_INPUT_HANDLE, Request.Data.AllocConsoleRequest.InputHandle);
+ SetStdHandle(STD_OUTPUT_HANDLE, Request.Data.AllocConsoleRequest.OutputHandle);
+
+ hStdError = DuplicateConsoleHandle(Request.Data.AllocConsoleRequest.OutputHandle,
+ 0,
+ TRUE,
+ DUPLICATE_SAME_ACCESS);
+ SetStdHandle(STD_ERROR_HANDLE, hStdError);
return TRUE;
}
/*--------------------------------------------------------------
- * WriteConsoleOutputCharacterA
+ * FreeConsole
*
* @implemented
*/
BOOL
WINAPI
-WriteConsoleOutputCharacterA(HANDLE hConsoleOutput,
- LPCSTR lpCharacter,
- DWORD nLength,
- COORD dwWriteCoord,
- LPDWORD lpNumberOfCharsWritten)
+FreeConsole(VOID)
{
- return IntWriteConsoleOutputCharacter(hConsoleOutput,
- (PVOID)lpCharacter,
- nLength,
- dwWriteCoord,
- lpNumberOfCharsWritten,
- FALSE);
-}
+ // AG: I'm not sure if this is correct (what happens to std handles?)
+ // but I just tried to reverse what AllocConsole() does...
+ CSR_API_MESSAGE Request;
+ NTSTATUS Status;
-/*--------------------------------------------------------------
- * WriteConsoleOutputCharacterW
- *
- * @implemented
- */
-BOOL
-WINAPI
-WriteConsoleOutputCharacterW(HANDLE hConsoleOutput,
- LPCWSTR lpCharacter,
- DWORD nLength,
- COORD dwWriteCoord,
- LPDWORD lpNumberOfCharsWritten)
-{
- return IntWriteConsoleOutputCharacter(hConsoleOutput,
- (PVOID)lpCharacter,
- nLength,
- dwWriteCoord,
- lpNumberOfCharsWritten,
- TRUE);
+ Status = CsrClientCallServer(&Request,
+ NULL,
+ CSR_CREATE_API_NUMBER(CSR_CONSOLE, FREE_CONSOLE),
+ sizeof(CSR_API_MESSAGE));
+ if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ {
+ BaseSetLastNTError(Status);
+ return FALSE;
+ }
+
+ NtCurrentPeb()->ProcessParameters->ConsoleHandle = NULL;
+ return TRUE;
}
/*--------------------------------------------------------------
- * WriteConsoleOutputAttribute
+ * GetConsoleScreenBufferInfo
*
* @implemented
*/
BOOL
WINAPI
-WriteConsoleOutputAttribute(HANDLE hConsoleOutput,
- CONST WORD *lpAttribute,
- DWORD nLength,
- COORD dwWriteCoord,
- LPDWORD lpNumberOfAttrsWritten)
+GetConsoleScreenBufferInfo(HANDLE hConsoleOutput,
+ PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo)
{
- PCSR_API_MESSAGE Request;
- ULONG CsrRequest;
+ CSR_API_MESSAGE Request;
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;
+ Request.Data.ScreenBufferInfoRequest.ConsoleHandle = hConsoleOutput;
- if (lpNumberOfAttrsWritten)
- *lpNumberOfAttrsWritten = nLength;
- while (nLength)
+ 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))
{
- 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;
+ BaseSetLastNTError(Status);
+ return FALSE;
}
-
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
-
+ *lpConsoleScreenBufferInfo = Request.Data.ScreenBufferInfoRequest.Info;
return TRUE;
}
/*--------------------------------------------------------------
- * FillConsoleOutputAttribute
+ * SetConsoleCursorPosition
*
* @implemented
*/
BOOL
WINAPI
-FillConsoleOutputAttribute(HANDLE hConsoleOutput,
- WORD wAttribute,
- DWORD nLength,
- COORD dwWriteCoord,
- LPDWORD lpNumberOfAttrsWritten)
+SetConsoleCursorPosition(HANDLE hConsoleOutput,
+ COORD dwCursorPosition)
{
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;
+ Request.Data.SetCursorRequest.ConsoleHandle = hConsoleOutput;
+ Request.Data.SetCursorRequest.Position = dwCursorPosition;
Status = CsrClientCallServer(&Request,
NULL,
- CSR_CREATE_API_NUMBER(CSR_CONSOLE, FILL_OUTPUT_ATTRIB),
+ CSR_CREATE_API_NUMBER(CSR_CONSOLE, SET_CURSOR),
sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ if(!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
{
- BaseSetLastNTError ( Status );
+ BaseSetLastNTError(Status);
return FALSE;
}
- if (lpNumberOfAttrsWritten)
- *lpNumberOfAttrsWritten = nLength;
-
return TRUE;
}
}
-
/*--------------------------------------------------------------
* GetConsoleSelectionInfo
*
}
-
/*--------------------------------------------------------------
* AttachConsole
*
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)
-{
- STUB;
- return FALSE;
-}
-
BOOL
WINAPI
RegisterConsoleIME(HWND hWnd, LPDWORD ThreadId)