mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 01:15:09 +00:00
- Allocate the csrss request buffer from heap if the necessary length is larger than the request structure.
- Fixed some buffer length calculations. svn path=/trunk/; revision=17582
This commit is contained in:
parent
37dced9725
commit
bb6a166390
4 changed files with 381 additions and 224 deletions
|
@ -412,12 +412,12 @@ typedef struct
|
||||||
|
|
||||||
#define CSR_API_MESSAGE_HEADER_SIZE(Type) (FIELD_OFFSET(CSR_API_MESSAGE, Data) + sizeof(Type))
|
#define CSR_API_MESSAGE_HEADER_SIZE(Type) (FIELD_OFFSET(CSR_API_MESSAGE, Data) + sizeof(Type))
|
||||||
#define CSRSS_MAX_WRITE_CONSOLE (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE))
|
#define CSRSS_MAX_WRITE_CONSOLE (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE))
|
||||||
#define CSRSS_MAX_SET_TITLE (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE))
|
|
||||||
#define CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR))
|
#define CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR))
|
||||||
#define CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB))
|
#define CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB))
|
||||||
#define CSRSS_MAX_READ_CONSOLE (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE))
|
#define CSRSS_MAX_READ_CONSOLE (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE))
|
||||||
#define CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR))
|
#define CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR))
|
||||||
#define CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB))
|
#define CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB))
|
||||||
|
#define CSRSS_MAX_GET_PROCESS_LIST (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST))
|
||||||
|
|
||||||
/* WCHARs, not bytes! */
|
/* WCHARs, not bytes! */
|
||||||
#define CSRSS_MAX_TITLE_LENGTH 80
|
#define CSRSS_MAX_TITLE_LENGTH 80
|
||||||
|
@ -462,7 +462,7 @@ typedef struct
|
||||||
#define GET_OUTPUT_HANDLE (0x25)
|
#define GET_OUTPUT_HANDLE (0x25)
|
||||||
#define CLOSE_HANDLE (0x26)
|
#define CLOSE_HANDLE (0x26)
|
||||||
#define VERIFY_HANDLE (0x27)
|
#define VERIFY_HANDLE (0x27)
|
||||||
#define DUPLICATE_HANDLE (0x28)
|
#define DUPLICATE_HANDLE (0x28)
|
||||||
#define SETGET_CONSOLE_HW_STATE (0x29)
|
#define SETGET_CONSOLE_HW_STATE (0x29)
|
||||||
#define GET_CONSOLE_WINDOW (0x2A)
|
#define GET_CONSOLE_WINDOW (0x2A)
|
||||||
#define CREATE_DESKTOP (0x2B)
|
#define CREATE_DESKTOP (0x2B)
|
||||||
|
@ -475,7 +475,7 @@ typedef struct
|
||||||
#define SET_CONSOLE_CP (0x32)
|
#define SET_CONSOLE_CP (0x32)
|
||||||
#define GET_CONSOLE_OUTPUT_CP (0x33)
|
#define GET_CONSOLE_OUTPUT_CP (0x33)
|
||||||
#define SET_CONSOLE_OUTPUT_CP (0x34)
|
#define SET_CONSOLE_OUTPUT_CP (0x34)
|
||||||
#define GET_INPUT_WAIT_HANDLE (0x35)
|
#define GET_INPUT_WAIT_HANDLE (0x35)
|
||||||
#define GET_PROCESS_LIST (0x36)
|
#define GET_PROCESS_LIST (0x36)
|
||||||
|
|
||||||
/* Keep in sync with definition below. */
|
/* Keep in sync with definition below. */
|
||||||
|
@ -483,76 +483,65 @@ typedef struct
|
||||||
|
|
||||||
typedef struct _CSR_API_MESSAGE
|
typedef struct _CSR_API_MESSAGE
|
||||||
{
|
{
|
||||||
|
PORT_MESSAGE Header;
|
||||||
|
ULONG Type;
|
||||||
|
NTSTATUS Status;
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
PORT_MESSAGE Header;
|
CSRSS_CREATE_PROCESS CreateProcessRequest;
|
||||||
union
|
CSRSS_CONNECT_PROCESS ConnectRequest;
|
||||||
{
|
CSRSS_WRITE_CONSOLE WriteConsoleRequest;
|
||||||
struct
|
CSRSS_READ_CONSOLE ReadConsoleRequest;
|
||||||
{
|
CSRSS_ALLOC_CONSOLE AllocConsoleRequest;
|
||||||
BYTE HeaderReserved[sizeof(PORT_MESSAGE)];
|
CSRSS_SCREEN_BUFFER_INFO ScreenBufferInfoRequest;
|
||||||
ULONG Type;
|
CSRSS_SET_CURSOR SetCursorRequest;
|
||||||
NTSTATUS Status;
|
CSRSS_FILL_OUTPUT FillOutputRequest;
|
||||||
union
|
CSRSS_READ_INPUT ReadInputRequest;
|
||||||
{
|
CSRSS_WRITE_CONSOLE_OUTPUT_CHAR WriteConsoleOutputCharRequest;
|
||||||
CSRSS_CREATE_PROCESS CreateProcessRequest;
|
CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB WriteConsoleOutputAttribRequest;
|
||||||
CSRSS_CONNECT_PROCESS ConnectRequest;
|
CSRSS_FILL_OUTPUT_ATTRIB FillOutputAttribRequest;
|
||||||
CSRSS_WRITE_CONSOLE WriteConsoleRequest;
|
CSRSS_SET_CURSOR_INFO SetCursorInfoRequest;
|
||||||
CSRSS_READ_CONSOLE ReadConsoleRequest;
|
CSRSS_GET_CURSOR_INFO GetCursorInfoRequest;
|
||||||
CSRSS_ALLOC_CONSOLE AllocConsoleRequest;
|
CSRSS_SET_ATTRIB SetAttribRequest;
|
||||||
CSRSS_SCREEN_BUFFER_INFO ScreenBufferInfoRequest;
|
CSRSS_SET_CONSOLE_MODE SetConsoleModeRequest;
|
||||||
CSRSS_SET_CURSOR SetCursorRequest;
|
CSRSS_GET_CONSOLE_MODE GetConsoleModeRequest;
|
||||||
CSRSS_FILL_OUTPUT FillOutputRequest;
|
CSRSS_CREATE_SCREEN_BUFFER CreateScreenBufferRequest;
|
||||||
CSRSS_READ_INPUT ReadInputRequest;
|
CSRSS_SET_SCREEN_BUFFER SetScreenBufferRequest;
|
||||||
CSRSS_WRITE_CONSOLE_OUTPUT_CHAR WriteConsoleOutputCharRequest;
|
CSRSS_SET_TITLE SetTitleRequest;
|
||||||
CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB WriteConsoleOutputAttribRequest;
|
CSRSS_GET_TITLE GetTitleRequest;
|
||||||
CSRSS_FILL_OUTPUT_ATTRIB FillOutputAttribRequest;
|
CSRSS_WRITE_CONSOLE_OUTPUT WriteConsoleOutputRequest;
|
||||||
CSRSS_SET_CURSOR_INFO SetCursorInfoRequest;
|
CSRSS_FLUSH_INPUT_BUFFER FlushInputBufferRequest;
|
||||||
CSRSS_GET_CURSOR_INFO GetCursorInfoRequest;
|
CSRSS_SCROLL_CONSOLE_SCREEN_BUFFER ScrollConsoleScreenBufferRequest;
|
||||||
CSRSS_SET_ATTRIB SetAttribRequest;
|
CSRSS_READ_CONSOLE_OUTPUT_CHAR ReadConsoleOutputCharRequest;
|
||||||
CSRSS_SET_CONSOLE_MODE SetConsoleModeRequest;
|
CSRSS_READ_CONSOLE_OUTPUT_ATTRIB ReadConsoleOutputAttribRequest;
|
||||||
CSRSS_GET_CONSOLE_MODE GetConsoleModeRequest;
|
CSRSS_GET_NUM_INPUT_EVENTS GetNumInputEventsRequest;
|
||||||
CSRSS_CREATE_SCREEN_BUFFER CreateScreenBufferRequest;
|
CSRSS_REGISTER_SERVICES_PROCESS RegisterServicesProcessRequest;
|
||||||
CSRSS_SET_SCREEN_BUFFER SetScreenBufferRequest;
|
CSRSS_EXIT_REACTOS ExitReactosRequest;
|
||||||
CSRSS_SET_TITLE SetTitleRequest;
|
CSRSS_SET_SHUTDOWN_PARAMETERS SetShutdownParametersRequest;
|
||||||
CSRSS_GET_TITLE GetTitleRequest;
|
CSRSS_GET_SHUTDOWN_PARAMETERS GetShutdownParametersRequest;
|
||||||
CSRSS_WRITE_CONSOLE_OUTPUT WriteConsoleOutputRequest;
|
CSRSS_PEEK_CONSOLE_INPUT PeekConsoleInputRequest;
|
||||||
CSRSS_FLUSH_INPUT_BUFFER FlushInputBufferRequest;
|
CSRSS_READ_CONSOLE_OUTPUT ReadConsoleOutputRequest;
|
||||||
CSRSS_SCROLL_CONSOLE_SCREEN_BUFFER ScrollConsoleScreenBufferRequest;
|
CSRSS_WRITE_CONSOLE_INPUT WriteConsoleInputRequest;
|
||||||
CSRSS_READ_CONSOLE_OUTPUT_CHAR ReadConsoleOutputCharRequest;
|
CSRSS_GET_INPUT_HANDLE GetInputHandleRequest;
|
||||||
CSRSS_READ_CONSOLE_OUTPUT_ATTRIB ReadConsoleOutputAttribRequest;
|
CSRSS_GET_OUTPUT_HANDLE GetOutputHandleRequest;
|
||||||
CSRSS_GET_NUM_INPUT_EVENTS GetNumInputEventsRequest;
|
CSRSS_CLOSE_HANDLE CloseHandleRequest;
|
||||||
CSRSS_REGISTER_SERVICES_PROCESS RegisterServicesProcessRequest;
|
CSRSS_VERIFY_HANDLE VerifyHandleRequest;
|
||||||
CSRSS_EXIT_REACTOS ExitReactosRequest;
|
CSRSS_DUPLICATE_HANDLE DuplicateHandleRequest;
|
||||||
CSRSS_SET_SHUTDOWN_PARAMETERS SetShutdownParametersRequest;
|
CSRSS_SETGET_CONSOLE_HW_STATE ConsoleHardwareStateRequest;
|
||||||
CSRSS_GET_SHUTDOWN_PARAMETERS GetShutdownParametersRequest;
|
CSRSS_GET_CONSOLE_WINDOW GetConsoleWindowRequest;
|
||||||
CSRSS_PEEK_CONSOLE_INPUT PeekConsoleInputRequest;
|
CSRSS_CREATE_DESKTOP CreateDesktopRequest;
|
||||||
CSRSS_READ_CONSOLE_OUTPUT ReadConsoleOutputRequest;
|
CSRSS_SHOW_DESKTOP ShowDesktopRequest;
|
||||||
CSRSS_WRITE_CONSOLE_INPUT WriteConsoleInputRequest;
|
CSRSS_HIDE_DESKTOP HideDesktopRequest;
|
||||||
CSRSS_GET_INPUT_HANDLE GetInputHandleRequest;
|
CSRSS_SET_CONSOLE_ICON SetConsoleIconRequest;
|
||||||
CSRSS_GET_OUTPUT_HANDLE GetOutputHandleRequest;
|
CSRSS_SET_LOGON_NOTIFY_WINDOW SetLogonNotifyWindowRequest;
|
||||||
CSRSS_CLOSE_HANDLE CloseHandleRequest;
|
CSRSS_REGISTER_LOGON_PROCESS RegisterLogonProcessRequest;
|
||||||
CSRSS_VERIFY_HANDLE VerifyHandleRequest;
|
CSRSS_GET_CONSOLE_CP GetConsoleCodePage;
|
||||||
CSRSS_DUPLICATE_HANDLE DuplicateHandleRequest;
|
CSRSS_SET_CONSOLE_CP SetConsoleCodePage;
|
||||||
CSRSS_SETGET_CONSOLE_HW_STATE ConsoleHardwareStateRequest;
|
CSRSS_GET_CONSOLE_OUTPUT_CP GetConsoleOutputCodePage;
|
||||||
CSRSS_GET_CONSOLE_WINDOW GetConsoleWindowRequest;
|
CSRSS_SET_CONSOLE_OUTPUT_CP SetConsoleOutputCodePage;
|
||||||
CSRSS_CREATE_DESKTOP CreateDesktopRequest;
|
CSRSS_GET_INPUT_WAIT_HANDLE GetConsoleInputWaitHandle;
|
||||||
CSRSS_SHOW_DESKTOP ShowDesktopRequest;
|
CSRSS_GET_PROCESS_LIST GetProcessListRequest;
|
||||||
CSRSS_HIDE_DESKTOP HideDesktopRequest;
|
} Data;
|
||||||
CSRSS_SET_CONSOLE_ICON SetConsoleIconRequest;
|
|
||||||
CSRSS_SET_LOGON_NOTIFY_WINDOW SetLogonNotifyWindowRequest;
|
|
||||||
CSRSS_REGISTER_LOGON_PROCESS RegisterLogonProcessRequest;
|
|
||||||
CSRSS_GET_CONSOLE_CP GetConsoleCodePage;
|
|
||||||
CSRSS_SET_CONSOLE_CP SetConsoleCodePage;
|
|
||||||
CSRSS_GET_CONSOLE_OUTPUT_CP GetConsoleOutputCodePage;
|
|
||||||
CSRSS_SET_CONSOLE_OUTPUT_CP SetConsoleOutputCodePage;
|
|
||||||
CSRSS_GET_INPUT_WAIT_HANDLE GetConsoleInputWaitHandle;
|
|
||||||
CSRSS_GET_PROCESS_LIST GetProcessListRequest;
|
|
||||||
} Data;
|
|
||||||
};
|
|
||||||
UCHAR PadBuffer[PORT_MAXIMUM_MESSAGE_LENGTH];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
} CSR_API_MESSAGE, *PCSR_API_MESSAGE;
|
} CSR_API_MESSAGE, *PCSR_API_MESSAGE;
|
||||||
|
|
||||||
#endif /* __INCLUDE_CSRSS_CSRSS_H */
|
#endif /* __INCLUDE_CSRSS_CSRSS_H */
|
||||||
|
|
|
@ -1097,7 +1097,7 @@ IntWriteConsole(HANDLE hConsoleOutput,
|
||||||
LPVOID lpReserved,
|
LPVOID lpReserved,
|
||||||
BOOL bUnicode)
|
BOOL bUnicode)
|
||||||
{
|
{
|
||||||
CSR_API_MESSAGE Request;
|
PCSR_API_MESSAGE Request;
|
||||||
ULONG CsrRequest;
|
ULONG CsrRequest;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
USHORT nChars;
|
USHORT nChars;
|
||||||
|
@ -1105,40 +1105,51 @@ IntWriteConsole(HANDLE hConsoleOutput,
|
||||||
DWORD Written = 0;
|
DWORD Written = 0;
|
||||||
|
|
||||||
CharSize = (bUnicode ? sizeof(WCHAR) : sizeof(CHAR));
|
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 = MAKE_CSR_API(WRITE_CONSOLE, CSR_CONSOLE);
|
CsrRequest = MAKE_CSR_API(WRITE_CONSOLE, CSR_CONSOLE);
|
||||||
Request.Data.WriteConsoleRequest.ConsoleHandle = hConsoleOutput;
|
Request->Data.WriteConsoleRequest.ConsoleHandle = hConsoleOutput;
|
||||||
Request.Data.WriteConsoleRequest.Unicode = bUnicode;
|
Request->Data.WriteConsoleRequest.Unicode = bUnicode;
|
||||||
|
|
||||||
while(nNumberOfCharsToWrite > 0)
|
while(nNumberOfCharsToWrite > 0)
|
||||||
{
|
{
|
||||||
nChars = min(nNumberOfCharsToWrite, CSRSS_MAX_WRITE_CONSOLE) / CharSize;
|
nChars = min(nNumberOfCharsToWrite, CSRSS_MAX_WRITE_CONSOLE / CharSize);
|
||||||
Request.Data.WriteConsoleRequest.NrCharactersToWrite = nChars;
|
Request->Data.WriteConsoleRequest.NrCharactersToWrite = nChars;
|
||||||
|
|
||||||
SizeBytes = nChars * CharSize;
|
SizeBytes = nChars * CharSize;
|
||||||
|
|
||||||
memcpy(Request.Data.WriteConsoleRequest.Buffer, lpBuffer, SizeBytes);
|
memcpy(Request->Data.WriteConsoleRequest.Buffer, lpBuffer, SizeBytes);
|
||||||
|
|
||||||
Status = CsrClientCallServer(&Request,
|
Status = CsrClientCallServer(Request,
|
||||||
NULL,
|
NULL,
|
||||||
CsrRequest,
|
CsrRequest,
|
||||||
sizeof(CSR_API_MESSAGE));
|
max(sizeof(CSR_API_MESSAGE), CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE) + SizeBytes));
|
||||||
|
|
||||||
if(!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
if(!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request->Status))
|
||||||
{
|
{
|
||||||
|
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
|
||||||
SetLastErrorByStatus(Status);
|
SetLastErrorByStatus(Status);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
nNumberOfCharsToWrite -= nChars;
|
nNumberOfCharsToWrite -= nChars;
|
||||||
lpBuffer = (PVOID)((ULONG_PTR)lpBuffer + (ULONG_PTR)SizeBytes);
|
lpBuffer = (PVOID)((ULONG_PTR)lpBuffer + (ULONG_PTR)SizeBytes);
|
||||||
Written += Request.Data.WriteConsoleRequest.NrCharactersWritten;
|
Written += Request->Data.WriteConsoleRequest.NrCharactersWritten;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(lpNumberOfCharsWritten != NULL)
|
if(lpNumberOfCharsWritten != NULL)
|
||||||
{
|
{
|
||||||
*lpNumberOfCharsWritten = Written;
|
*lpNumberOfCharsWritten = Written;
|
||||||
}
|
}
|
||||||
|
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -1196,20 +1207,29 @@ IntReadConsole(HANDLE hConsoleInput,
|
||||||
LPVOID lpReserved,
|
LPVOID lpReserved,
|
||||||
BOOL bUnicode)
|
BOOL bUnicode)
|
||||||
{
|
{
|
||||||
CSR_API_MESSAGE Request;
|
PCSR_API_MESSAGE Request;
|
||||||
ULONG CsrRequest;
|
ULONG CsrRequest;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
ULONG CharSize, CharsRead = 0;
|
ULONG CharSize, CharsRead = 0;
|
||||||
|
|
||||||
CharSize = (bUnicode ? sizeof(WCHAR) : sizeof(CHAR));
|
CharSize = (bUnicode ? sizeof(WCHAR) : sizeof(CHAR));
|
||||||
|
Request = RtlAllocateHeap(RtlGetProcessHeap(), 0,
|
||||||
|
max(sizeof(CSR_API_MESSAGE),
|
||||||
|
CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE)
|
||||||
|
+ min(nNumberOfCharsToRead, CSRSS_MAX_READ_CONSOLE / CharSize) * CharSize));
|
||||||
|
if (Request == NULL)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
Request.Status = STATUS_SUCCESS;
|
Request->Status = STATUS_SUCCESS;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
if(Request.Status == STATUS_PENDING)
|
if(Request->Status == STATUS_PENDING)
|
||||||
{
|
{
|
||||||
Status = NtWaitForSingleObject(Request.Data.ReadConsoleRequest.EventHandle, FALSE, 0);
|
Status = NtWaitForSingleObject(Request->Data.ReadConsoleRequest.EventHandle, FALSE, 0);
|
||||||
if(!NT_SUCCESS(Status))
|
if(!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
DPRINT1("Wait for console input failed!\n");
|
DPRINT1("Wait for console input failed!\n");
|
||||||
|
@ -1218,44 +1238,49 @@ IntReadConsole(HANDLE hConsoleInput,
|
||||||
}
|
}
|
||||||
|
|
||||||
CsrRequest = MAKE_CSR_API(READ_CONSOLE, CSR_CONSOLE);
|
CsrRequest = MAKE_CSR_API(READ_CONSOLE, CSR_CONSOLE);
|
||||||
Request.Data.ReadConsoleRequest.ConsoleHandle = hConsoleInput;
|
Request->Data.ReadConsoleRequest.ConsoleHandle = hConsoleInput;
|
||||||
Request.Data.ReadConsoleRequest.Unicode = bUnicode;
|
Request->Data.ReadConsoleRequest.Unicode = bUnicode;
|
||||||
Request.Data.ReadConsoleRequest.NrCharactersToRead = min(nNumberOfCharsToRead, CSRSS_MAX_READ_CONSOLE) / CharSize;
|
Request->Data.ReadConsoleRequest.NrCharactersToRead = min(nNumberOfCharsToRead, CSRSS_MAX_READ_CONSOLE / CharSize);
|
||||||
Request.Data.ReadConsoleRequest.nCharsCanBeDeleted = CharsRead;
|
Request->Data.ReadConsoleRequest.nCharsCanBeDeleted = CharsRead;
|
||||||
Status = CsrClientCallServer(&Request,
|
Status = CsrClientCallServer(Request,
|
||||||
NULL,
|
NULL,
|
||||||
CsrRequest,
|
CsrRequest,
|
||||||
sizeof(CSR_API_MESSAGE));
|
max(sizeof(CSR_API_MESSAGE),
|
||||||
|
CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE)
|
||||||
|
+ Request->Data.ReadConsoleRequest.NrCharactersToRead * CharSize));
|
||||||
|
|
||||||
if(!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
if(!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request->Status))
|
||||||
{
|
{
|
||||||
DPRINT1("CSR returned error in ReadConsole\n");
|
DPRINT1("CSR returned error in ReadConsole\n");
|
||||||
|
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
|
||||||
SetLastErrorByStatus(Status);
|
SetLastErrorByStatus(Status);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
nNumberOfCharsToRead -= Request.Data.ReadConsoleRequest.NrCharactersRead;
|
nNumberOfCharsToRead -= Request->Data.ReadConsoleRequest.NrCharactersRead;
|
||||||
memcpy((PVOID)((ULONG_PTR)lpBuffer + (ULONG_PTR)(CharsRead * CharSize)),
|
memcpy((PVOID)((ULONG_PTR)lpBuffer + (ULONG_PTR)(CharsRead * CharSize)),
|
||||||
Request.Data.ReadConsoleRequest.Buffer,
|
Request->Data.ReadConsoleRequest.Buffer,
|
||||||
Request.Data.ReadConsoleRequest.NrCharactersRead * CharSize);
|
Request->Data.ReadConsoleRequest.NrCharactersRead * CharSize);
|
||||||
CharsRead += Request.Data.ReadConsoleRequest.NrCharactersRead;
|
CharsRead += Request->Data.ReadConsoleRequest.NrCharactersRead;
|
||||||
|
|
||||||
if(Request.Status == STATUS_NOTIFY_CLEANUP)
|
if(Request->Status == STATUS_NOTIFY_CLEANUP)
|
||||||
{
|
{
|
||||||
if(CharsRead > 0)
|
if(CharsRead > 0)
|
||||||
{
|
{
|
||||||
CharsRead--;
|
CharsRead--;
|
||||||
nNumberOfCharsToRead++;
|
nNumberOfCharsToRead++;
|
||||||
}
|
}
|
||||||
Request.Status = STATUS_PENDING;
|
Request->Status = STATUS_PENDING;
|
||||||
}
|
}
|
||||||
} while(Request.Status == STATUS_PENDING && nNumberOfCharsToRead > 0);
|
} while(Request->Status == STATUS_PENDING && nNumberOfCharsToRead > 0);
|
||||||
|
|
||||||
if(lpNumberOfCharsRead != NULL)
|
if(lpNumberOfCharsRead != NULL)
|
||||||
{
|
{
|
||||||
*lpNumberOfCharsRead = CharsRead;
|
*lpNumberOfCharsRead = CharsRead;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2018,7 +2043,7 @@ IntReadConsoleOutputCharacter(HANDLE hConsoleOutput,
|
||||||
LPDWORD lpNumberOfCharsRead,
|
LPDWORD lpNumberOfCharsRead,
|
||||||
BOOL bUnicode)
|
BOOL bUnicode)
|
||||||
{
|
{
|
||||||
CSR_API_MESSAGE Request; ULONG CsrRequest;
|
PCSR_API_MESSAGE Request; ULONG CsrRequest;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
ULONG nChars, SizeBytes, CharSize;
|
ULONG nChars, SizeBytes, CharSize;
|
||||||
DWORD CharsRead = 0;
|
DWORD CharsRead = 0;
|
||||||
|
@ -2028,35 +2053,47 @@ IntReadConsoleOutputCharacter(HANDLE hConsoleOutput,
|
||||||
nChars = min(nLength, CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR) / CharSize;
|
nChars = min(nLength, CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR) / CharSize;
|
||||||
SizeBytes = nChars * CharSize;
|
SizeBytes = nChars * CharSize;
|
||||||
|
|
||||||
|
Request = RtlAllocateHeap(RtlGetProcessHeap(), 0,
|
||||||
|
max(sizeof(CSR_API_MESSAGE),
|
||||||
|
CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR)
|
||||||
|
+ min (nChars, CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR / CharSize) * CharSize));
|
||||||
|
if (Request == NULL)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
CsrRequest = MAKE_CSR_API(READ_CONSOLE_OUTPUT_CHAR, CSR_CONSOLE);
|
CsrRequest = MAKE_CSR_API(READ_CONSOLE_OUTPUT_CHAR, CSR_CONSOLE);
|
||||||
Request.Data.ReadConsoleOutputCharRequest.ConsoleHandle = hConsoleOutput;
|
Request->Data.ReadConsoleOutputCharRequest.ConsoleHandle = hConsoleOutput;
|
||||||
Request.Data.ReadConsoleOutputCharRequest.Unicode = bUnicode;
|
Request->Data.ReadConsoleOutputCharRequest.Unicode = bUnicode;
|
||||||
Request.Data.ReadConsoleOutputCharRequest.ReadCoord = dwReadCoord;
|
Request->Data.ReadConsoleOutputCharRequest.ReadCoord = dwReadCoord;
|
||||||
|
|
||||||
while(nLength > 0)
|
while(nLength > 0)
|
||||||
{
|
{
|
||||||
DWORD BytesRead;
|
DWORD BytesRead;
|
||||||
|
|
||||||
Request.Data.ReadConsoleOutputCharRequest.NumCharsToRead = min(nLength, nChars);
|
Request->Data.ReadConsoleOutputCharRequest.NumCharsToRead = min(nLength, nChars);
|
||||||
SizeBytes = Request.Data.ReadConsoleOutputCharRequest.NumCharsToRead * CharSize;
|
SizeBytes = Request->Data.ReadConsoleOutputCharRequest.NumCharsToRead * CharSize;
|
||||||
|
|
||||||
Status = CsrClientCallServer(&Request,
|
Status = CsrClientCallServer(Request,
|
||||||
NULL,
|
NULL,
|
||||||
CsrRequest,
|
CsrRequest,
|
||||||
sizeof(CSR_API_MESSAGE));
|
max (sizeof(CSR_API_MESSAGE),
|
||||||
if(!NT_SUCCESS(Status) || !NT_SUCCESS(Request.Status))
|
CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR) + SizeBytes));
|
||||||
|
if(!NT_SUCCESS(Status) || !NT_SUCCESS(Request->Status))
|
||||||
{
|
{
|
||||||
|
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
|
||||||
SetLastErrorByStatus(Status);
|
SetLastErrorByStatus(Status);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
BytesRead = Request.Data.ReadConsoleOutputCharRequest.CharsRead * CharSize;
|
BytesRead = Request->Data.ReadConsoleOutputCharRequest.CharsRead * CharSize;
|
||||||
memcpy(lpCharacter, Request.Data.ReadConsoleOutputCharRequest.String, BytesRead);
|
memcpy(lpCharacter, Request->Data.ReadConsoleOutputCharRequest.String, BytesRead);
|
||||||
lpCharacter = (PVOID)((ULONG_PTR)lpCharacter + (ULONG_PTR)BytesRead);
|
lpCharacter = (PVOID)((ULONG_PTR)lpCharacter + (ULONG_PTR)BytesRead);
|
||||||
CharsRead += Request.Data.ReadConsoleOutputCharRequest.CharsRead;
|
CharsRead += Request->Data.ReadConsoleOutputCharRequest.CharsRead;
|
||||||
nLength -= Request.Data.ReadConsoleOutputCharRequest.CharsRead;
|
nLength -= Request->Data.ReadConsoleOutputCharRequest.CharsRead;
|
||||||
|
|
||||||
Request.Data.ReadConsoleOutputCharRequest.ReadCoord = Request.Data.ReadConsoleOutputCharRequest.EndCoord;
|
Request->Data.ReadConsoleOutputCharRequest.ReadCoord = Request->Data.ReadConsoleOutputCharRequest.EndCoord;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(lpNumberOfCharsRead != NULL)
|
if(lpNumberOfCharsRead != NULL)
|
||||||
|
@ -2064,6 +2101,8 @@ IntReadConsoleOutputCharacter(HANDLE hConsoleOutput,
|
||||||
*lpNumberOfCharsRead = CharsRead;
|
*lpNumberOfCharsRead = CharsRead;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2131,16 +2170,26 @@ ReadConsoleOutputAttribute(
|
||||||
LPDWORD lpNumberOfAttrsRead
|
LPDWORD lpNumberOfAttrsRead
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
CSR_API_MESSAGE Request; ULONG CsrRequest;
|
PCSR_API_MESSAGE Request; ULONG CsrRequest;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
DWORD Size;
|
DWORD Size;
|
||||||
|
|
||||||
if (lpNumberOfAttrsRead != NULL)
|
if (lpNumberOfAttrsRead != NULL)
|
||||||
*lpNumberOfAttrsRead = nLength;
|
*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 = MAKE_CSR_API(READ_CONSOLE_OUTPUT_ATTRIB, CSR_CONSOLE);
|
CsrRequest = MAKE_CSR_API(READ_CONSOLE_OUTPUT_ATTRIB, CSR_CONSOLE);
|
||||||
Request.Data.ReadConsoleOutputAttribRequest.ConsoleHandle = hConsoleOutput;
|
Request->Data.ReadConsoleOutputAttribRequest.ConsoleHandle = hConsoleOutput;
|
||||||
Request.Data.ReadConsoleOutputAttribRequest.ReadCoord = dwReadCoord;
|
Request->Data.ReadConsoleOutputAttribRequest.ReadCoord = dwReadCoord;
|
||||||
|
|
||||||
while (nLength != 0)
|
while (nLength != 0)
|
||||||
{
|
{
|
||||||
|
@ -2149,24 +2198,28 @@ ReadConsoleOutputAttribute(
|
||||||
else
|
else
|
||||||
Size = nLength;
|
Size = nLength;
|
||||||
|
|
||||||
Request.Data.ReadConsoleOutputAttribRequest.NumAttrsToRead = Size;
|
Request->Data.ReadConsoleOutputAttribRequest.NumAttrsToRead = Size;
|
||||||
|
|
||||||
Status = CsrClientCallServer(&Request,
|
Status = CsrClientCallServer(Request,
|
||||||
NULL,
|
NULL,
|
||||||
CsrRequest,
|
CsrRequest,
|
||||||
sizeof(CSR_API_MESSAGE));
|
max (sizeof(CSR_API_MESSAGE),
|
||||||
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Request.Status))
|
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);
|
||||||
SetLastErrorByStatus(Status);
|
SetLastErrorByStatus(Status);
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(lpAttribute, Request.Data.ReadConsoleOutputAttribRequest.Attribute, Size * sizeof(WORD));
|
memcpy(lpAttribute, Request->Data.ReadConsoleOutputAttribRequest.Attribute, Size * sizeof(WORD));
|
||||||
lpAttribute += Size;
|
lpAttribute += Size;
|
||||||
nLength -= Size;
|
nLength -= Size;
|
||||||
Request.Data.ReadConsoleOutputAttribRequest.ReadCoord = Request.Data.ReadConsoleOutputAttribRequest.EndCoord;
|
Request->Data.ReadConsoleOutputAttribRequest.ReadCoord = Request->Data.ReadConsoleOutputAttribRequest.EndCoord;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
|
||||||
|
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2179,7 +2232,7 @@ IntWriteConsoleOutputCharacter(HANDLE hConsoleOutput,
|
||||||
LPDWORD lpNumberOfCharsWritten,
|
LPDWORD lpNumberOfCharsWritten,
|
||||||
BOOL bUnicode)
|
BOOL bUnicode)
|
||||||
{
|
{
|
||||||
CSR_API_MESSAGE Request; ULONG CsrRequest;
|
PCSR_API_MESSAGE Request; ULONG CsrRequest;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
ULONG SizeBytes, CharSize, nChars;
|
ULONG SizeBytes, CharSize, nChars;
|
||||||
DWORD Written = 0;
|
DWORD Written = 0;
|
||||||
|
@ -2189,36 +2242,48 @@ IntWriteConsoleOutputCharacter(HANDLE hConsoleOutput,
|
||||||
nChars = min(nLength, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR / CharSize);
|
nChars = min(nLength, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR / CharSize);
|
||||||
SizeBytes = nChars * 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 = MAKE_CSR_API(WRITE_CONSOLE_OUTPUT_CHAR, CSR_CONSOLE);
|
CsrRequest = MAKE_CSR_API(WRITE_CONSOLE_OUTPUT_CHAR, CSR_CONSOLE);
|
||||||
Request.Data.WriteConsoleOutputCharRequest.ConsoleHandle = hConsoleOutput;
|
Request->Data.WriteConsoleOutputCharRequest.ConsoleHandle = hConsoleOutput;
|
||||||
Request.Data.WriteConsoleOutputCharRequest.Unicode = bUnicode;
|
Request->Data.WriteConsoleOutputCharRequest.Unicode = bUnicode;
|
||||||
Request.Data.WriteConsoleOutputCharRequest.Coord = dwWriteCoord;
|
Request->Data.WriteConsoleOutputCharRequest.Coord = dwWriteCoord;
|
||||||
|
|
||||||
while(nLength > 0)
|
while(nLength > 0)
|
||||||
{
|
{
|
||||||
DWORD BytesWrite;
|
DWORD BytesWrite;
|
||||||
|
|
||||||
Request.Data.WriteConsoleOutputCharRequest.Length = min(nLength, nChars);
|
Request->Data.WriteConsoleOutputCharRequest.Length = min(nLength, nChars);
|
||||||
BytesWrite = Request.Data.WriteConsoleOutputCharRequest.Length * CharSize;
|
BytesWrite = Request->Data.WriteConsoleOutputCharRequest.Length * CharSize;
|
||||||
|
|
||||||
memcpy(Request.Data.WriteConsoleOutputCharRequest.String, lpCharacter, BytesWrite);
|
memcpy(Request->Data.WriteConsoleOutputCharRequest.String, lpCharacter, BytesWrite);
|
||||||
|
|
||||||
Status = CsrClientCallServer(&Request,
|
Status = CsrClientCallServer(Request,
|
||||||
NULL,
|
NULL,
|
||||||
CsrRequest,
|
CsrRequest,
|
||||||
sizeof(CSR_API_MESSAGE));
|
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))
|
if(!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request->Status))
|
||||||
{
|
{
|
||||||
|
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
|
||||||
SetLastErrorByStatus(Status);
|
SetLastErrorByStatus(Status);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
nLength -= Request.Data.WriteConsoleOutputCharRequest.NrCharactersWritten;
|
nLength -= Request->Data.WriteConsoleOutputCharRequest.NrCharactersWritten;
|
||||||
lpCharacter = (PVOID)((ULONG_PTR)lpCharacter + (ULONG_PTR)(Request.Data.WriteConsoleOutputCharRequest.NrCharactersWritten * CharSize));
|
lpCharacter = (PVOID)((ULONG_PTR)lpCharacter + (ULONG_PTR)(Request->Data.WriteConsoleOutputCharRequest.NrCharactersWritten * CharSize));
|
||||||
Written += Request.Data.WriteConsoleOutputCharRequest.NrCharactersWritten;
|
Written += Request->Data.WriteConsoleOutputCharRequest.NrCharactersWritten;
|
||||||
|
|
||||||
Request.Data.WriteConsoleOutputCharRequest.Coord = Request.Data.WriteConsoleOutputCharRequest.EndCoord;
|
Request->Data.WriteConsoleOutputCharRequest.Coord = Request->Data.WriteConsoleOutputCharRequest.EndCoord;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(lpNumberOfCharsWritten != NULL)
|
if(lpNumberOfCharsWritten != NULL)
|
||||||
|
@ -2226,6 +2291,8 @@ IntWriteConsoleOutputCharacter(HANDLE hConsoleOutput,
|
||||||
*lpNumberOfCharsWritten = Written;
|
*lpNumberOfCharsWritten = Written;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2287,32 +2354,50 @@ WriteConsoleOutputAttribute(
|
||||||
LPDWORD lpNumberOfAttrsWritten
|
LPDWORD lpNumberOfAttrsWritten
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
CSR_API_MESSAGE Request; ULONG CsrRequest;
|
PCSR_API_MESSAGE Request; ULONG CsrRequest;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
WORD Size;
|
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 = MAKE_CSR_API(WRITE_CONSOLE_OUTPUT_ATTRIB, CSR_CONSOLE);
|
CsrRequest = MAKE_CSR_API(WRITE_CONSOLE_OUTPUT_ATTRIB, CSR_CONSOLE);
|
||||||
Request.Data.WriteConsoleOutputAttribRequest.ConsoleHandle = hConsoleOutput;
|
Request->Data.WriteConsoleOutputAttribRequest.ConsoleHandle = hConsoleOutput;
|
||||||
Request.Data.WriteConsoleOutputAttribRequest.Coord = dwWriteCoord;
|
Request->Data.WriteConsoleOutputAttribRequest.Coord = dwWriteCoord;
|
||||||
if( lpNumberOfAttrsWritten )
|
if( lpNumberOfAttrsWritten )
|
||||||
*lpNumberOfAttrsWritten = nLength;
|
*lpNumberOfAttrsWritten = nLength;
|
||||||
while( nLength )
|
while( nLength )
|
||||||
{
|
{
|
||||||
Size = min(nLength, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB / sizeof(WORD));
|
Size = min(nLength, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB / sizeof(WORD));
|
||||||
Request.Data.WriteConsoleOutputAttribRequest.Length = Size;
|
Request->Data.WriteConsoleOutputAttribRequest.Length = Size;
|
||||||
memcpy(Request.Data.WriteConsoleOutputAttribRequest.Attribute, lpAttribute, Size * sizeof(WORD));
|
memcpy(Request->Data.WriteConsoleOutputAttribRequest.Attribute, lpAttribute, Size * sizeof(WORD));
|
||||||
|
|
||||||
Status = CsrClientCallServer( &Request, NULL, CsrRequest, sizeof(CSR_API_MESSAGE));
|
Status = CsrClientCallServer( Request,
|
||||||
if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Request.Status ) )
|
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);
|
||||||
SetLastErrorByStatus ( Status );
|
SetLastErrorByStatus ( Status );
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
nLength -= Size;
|
nLength -= Size;
|
||||||
lpAttribute += Size;
|
lpAttribute += Size;
|
||||||
Request.Data.WriteConsoleOutputAttribRequest.Coord = Request.Data.WriteConsoleOutputAttribRequest.EndCoord;
|
Request->Data.WriteConsoleOutputAttribRequest.Coord = Request->Data.WriteConsoleOutputAttribRequest.EndCoord;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2879,7 +2964,7 @@ GetConsoleTitleW(
|
||||||
DWORD nSize
|
DWORD nSize
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
CSR_API_MESSAGE Request; ULONG CsrRequest;
|
PCSR_API_MESSAGE Request; ULONG CsrRequest;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
HANDLE hConsole;
|
HANDLE hConsole;
|
||||||
|
|
||||||
|
@ -2889,32 +2974,43 @@ GetConsoleTitleW(
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
CsrRequest = MAKE_CSR_API(GET_TITLE, CSR_CONSOLE);
|
Request = RtlAllocateHeap(RtlGetProcessHeap(), 0,
|
||||||
Request.Data.GetTitleRequest.ConsoleHandle = hConsole;
|
CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_TITLE) + CSRSS_MAX_TITLE_LENGTH * sizeof(WCHAR));
|
||||||
|
if (Request == NULL)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
Status = CsrClientCallServer(&Request,
|
CsrRequest = MAKE_CSR_API(GET_TITLE, CSR_CONSOLE);
|
||||||
|
Request->Data.GetTitleRequest.ConsoleHandle = hConsole;
|
||||||
|
|
||||||
|
Status = CsrClientCallServer(Request,
|
||||||
NULL,
|
NULL,
|
||||||
CsrRequest,
|
CsrRequest,
|
||||||
sizeof(CSR_API_MESSAGE));
|
CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_TITLE) + CSRSS_MAX_TITLE_LENGTH * sizeof(WCHAR));
|
||||||
CloseHandle(hConsole);
|
CloseHandle(hConsole);
|
||||||
if(!NT_SUCCESS(Status) || !(NT_SUCCESS(Status = Request.Status)))
|
if(!NT_SUCCESS(Status) || !(NT_SUCCESS(Status = Request->Status)))
|
||||||
{
|
{
|
||||||
|
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
|
||||||
SetLastErrorByStatus(Status);
|
SetLastErrorByStatus(Status);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(nSize * sizeof(WCHAR) < Request.Data.GetTitleRequest.Length)
|
if(nSize * sizeof(WCHAR) < Request->Data.GetTitleRequest.Length)
|
||||||
{
|
{
|
||||||
wcsncpy(lpConsoleTitle, Request.Data.GetTitleRequest.Title, nSize - 1);
|
wcsncpy(lpConsoleTitle, Request->Data.GetTitleRequest.Title, nSize - 1);
|
||||||
lpConsoleTitle[nSize--] = L'\0';
|
lpConsoleTitle[nSize--] = L'\0';
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
nSize = Request.Data.GetTitleRequest.Length / sizeof (WCHAR);
|
nSize = Request->Data.GetTitleRequest.Length / sizeof (WCHAR);
|
||||||
wcscpy(lpConsoleTitle, Request.Data.GetTitleRequest.Title);
|
wcscpy(lpConsoleTitle, Request->Data.GetTitleRequest.Title);
|
||||||
lpConsoleTitle[nSize] = L'\0';
|
lpConsoleTitle[nSize] = L'\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
|
||||||
|
|
||||||
return nSize;
|
return nSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2971,7 +3067,7 @@ SetConsoleTitleW(
|
||||||
LPCWSTR lpConsoleTitle
|
LPCWSTR lpConsoleTitle
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
CSR_API_MESSAGE Request; ULONG CsrRequest;
|
PCSR_API_MESSAGE Request; ULONG CsrRequest;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
unsigned int c;
|
unsigned int c;
|
||||||
HANDLE hConsole;
|
HANDLE hConsole;
|
||||||
|
@ -2982,24 +3078,36 @@ SetConsoleTitleW(
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Request = RtlAllocateHeap(RtlGetProcessHeap(), 0,
|
||||||
|
max (sizeof(CSR_API_MESSAGE),
|
||||||
|
CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE) +
|
||||||
|
min (wcslen(lpConsoleTitle), CSRSS_MAX_TITLE_LENGTH) * sizeof(WCHAR)));
|
||||||
|
if (Request == NULL)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
CsrRequest = MAKE_CSR_API(SET_TITLE, CSR_CONSOLE);
|
CsrRequest = MAKE_CSR_API(SET_TITLE, CSR_CONSOLE);
|
||||||
Request.Data.SetTitleRequest.Console = hConsole;
|
Request->Data.SetTitleRequest.Console = hConsole;
|
||||||
|
|
||||||
for( c = 0; lpConsoleTitle[c] && c < CSRSS_MAX_TITLE_LENGTH; c++ )
|
for( c = 0; lpConsoleTitle[c] && c < CSRSS_MAX_TITLE_LENGTH; c++ )
|
||||||
Request.Data.SetTitleRequest.Title[c] = lpConsoleTitle[c];
|
Request->Data.SetTitleRequest.Title[c] = lpConsoleTitle[c];
|
||||||
// add null
|
Request->Data.SetTitleRequest.Length = c * sizeof(WCHAR);
|
||||||
Request.Data.SetTitleRequest.Title[c] = 0;
|
Status = CsrClientCallServer(Request,
|
||||||
Request.Data.SetTitleRequest.Length = c;
|
|
||||||
Status = CsrClientCallServer(&Request,
|
|
||||||
NULL,
|
NULL,
|
||||||
CsrRequest,
|
CsrRequest,
|
||||||
sizeof(CSR_API_MESSAGE));
|
max (sizeof(CSR_API_MESSAGE), CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE) + c * sizeof(WCHAR)));
|
||||||
CloseHandle(hConsole);
|
CloseHandle(hConsole);
|
||||||
if (!NT_SUCCESS(Status) || !NT_SUCCESS( Status = Request.Status ) )
|
if (!NT_SUCCESS(Status) || !NT_SUCCESS( Status = Request->Status ) )
|
||||||
{
|
{
|
||||||
|
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
|
||||||
SetLastErrorByStatus (Status);
|
SetLastErrorByStatus (Status);
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3017,7 +3125,7 @@ SetConsoleTitleA(
|
||||||
LPCSTR lpConsoleTitle
|
LPCSTR lpConsoleTitle
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
CSR_API_MESSAGE Request; ULONG CsrRequest;
|
PCSR_API_MESSAGE Request; ULONG CsrRequest;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
unsigned int c;
|
unsigned int c;
|
||||||
HANDLE hConsole;
|
HANDLE hConsole;
|
||||||
|
@ -3028,24 +3136,36 @@ SetConsoleTitleA(
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Request = RtlAllocateHeap(RtlGetProcessHeap(), 0,
|
||||||
|
max (sizeof(CSR_API_MESSAGE),
|
||||||
|
CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE) +
|
||||||
|
min (strlen(lpConsoleTitle), CSRSS_MAX_TITLE_LENGTH) * sizeof(WCHAR)));
|
||||||
|
if (Request == NULL)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
CsrRequest = MAKE_CSR_API(SET_TITLE, CSR_CONSOLE);
|
CsrRequest = MAKE_CSR_API(SET_TITLE, CSR_CONSOLE);
|
||||||
Request.Data.SetTitleRequest.Console = hConsole;
|
Request->Data.SetTitleRequest.Console = hConsole;
|
||||||
|
|
||||||
for( c = 0; lpConsoleTitle[c] && c < CSRSS_MAX_TITLE_LENGTH; c++ )
|
for( c = 0; lpConsoleTitle[c] && c < CSRSS_MAX_TITLE_LENGTH; c++ )
|
||||||
Request.Data.SetTitleRequest.Title[c] = lpConsoleTitle[c];
|
Request->Data.SetTitleRequest.Title[c] = lpConsoleTitle[c];
|
||||||
// add null
|
Request->Data.SetTitleRequest.Length = c * sizeof(WCHAR);
|
||||||
Request.Data.SetTitleRequest.Title[c] = 0;
|
Status = CsrClientCallServer(Request,
|
||||||
Request.Data.SetTitleRequest.Length = c;
|
|
||||||
Status = CsrClientCallServer(&Request,
|
|
||||||
NULL,
|
NULL,
|
||||||
CsrRequest,
|
CsrRequest,
|
||||||
sizeof(CSR_API_MESSAGE));
|
max (sizeof(CSR_API_MESSAGE), CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE) + c * sizeof(WCHAR)));
|
||||||
CloseHandle(hConsole);
|
CloseHandle(hConsole);
|
||||||
if (!NT_SUCCESS(Status) || !NT_SUCCESS( Status = Request.Status ) )
|
if (!NT_SUCCESS(Status) || !NT_SUCCESS( Status = Request->Status ) )
|
||||||
{
|
{
|
||||||
|
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
|
||||||
SetLastErrorByStatus (Status);
|
SetLastErrorByStatus (Status);
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3194,7 +3314,7 @@ DWORD STDCALL
|
||||||
GetConsoleProcessList(LPDWORD lpdwProcessList,
|
GetConsoleProcessList(LPDWORD lpdwProcessList,
|
||||||
DWORD dwProcessCount)
|
DWORD dwProcessCount)
|
||||||
{
|
{
|
||||||
CSR_API_MESSAGE Request; ULONG CsrRequest;
|
PCSR_API_MESSAGE Request; ULONG CsrRequest;
|
||||||
ULONG nProcesses;
|
ULONG nProcesses;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
@ -3204,34 +3324,42 @@ GetConsoleProcessList(LPDWORD lpdwProcessList,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Request = RtlAllocateHeap(RtlGetProcessHeap(), 0,
|
||||||
|
max (sizeof(CSR_API_MESSAGE),
|
||||||
|
CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST)
|
||||||
|
+ min (dwProcessCount, CSRSS_MAX_GET_PROCESS_LIST / sizeof(DWORD)) * sizeof(DWORD)));
|
||||||
|
if (Request == NULL)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
CsrRequest = MAKE_CSR_API(GET_PROCESS_LIST, CSR_CONSOLE);
|
CsrRequest = MAKE_CSR_API(GET_PROCESS_LIST, CSR_CONSOLE);
|
||||||
Request.Data.GetProcessListRequest.nMaxIds = dwProcessCount;
|
Request->Data.GetProcessListRequest.nMaxIds = min (dwProcessCount, CSRSS_MAX_GET_PROCESS_LIST / sizeof(DWORD));
|
||||||
|
|
||||||
Status = CsrClientCallServer(&Request,
|
Status = CsrClientCallServer(Request,
|
||||||
NULL,
|
NULL,
|
||||||
CsrRequest,
|
CsrRequest,
|
||||||
sizeof(CSR_API_MESSAGE));
|
max (sizeof(CSR_API_MESSAGE),
|
||||||
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST)
|
||||||
|
+ Request->Data.GetProcessListRequest.nMaxIds * sizeof(DWORD)));
|
||||||
|
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request->Status))
|
||||||
{
|
{
|
||||||
|
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
|
||||||
SetLastErrorByStatus (Status);
|
SetLastErrorByStatus (Status);
|
||||||
nProcesses = 0;
|
nProcesses = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(dwProcessCount >= Request.Data.GetProcessListRequest.nProcessIdsTotal)
|
nProcesses = Request->Data.GetProcessListRequest.nProcessIdsCopied;
|
||||||
|
if(dwProcessCount >= nProcesses)
|
||||||
{
|
{
|
||||||
nProcesses = Request.Data.GetProcessListRequest.nProcessIdsCopied;
|
memcpy(lpdwProcessList, Request->Data.GetProcessListRequest.ProcessId, nProcesses * sizeof(DWORD));
|
||||||
for(nProcesses = 0; nProcesses < Request.Data.GetProcessListRequest.nProcessIdsCopied; nProcesses++)
|
|
||||||
{
|
|
||||||
*(lpdwProcessList++) = (DWORD)Request.Data.GetProcessListRequest.ProcessId[nProcesses];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
nProcesses = Request.Data.GetProcessListRequest.nProcessIdsTotal;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
|
||||||
|
|
||||||
return nProcesses;
|
return nProcesses;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -108,7 +108,8 @@ STDCALL
|
||||||
ClientConnectionThread(HANDLE ServerPort)
|
ClientConnectionThread(HANDLE ServerPort)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
CSR_API_MESSAGE Request;
|
BYTE RawRequest[LPC_MAX_DATA_LENGTH];
|
||||||
|
PCSR_API_MESSAGE Request = (PCSR_API_MESSAGE)RawRequest;
|
||||||
PCSR_API_MESSAGE Reply;
|
PCSR_API_MESSAGE Reply;
|
||||||
PCSRSS_PROCESS_DATA ProcessData;
|
PCSRSS_PROCESS_DATA ProcessData;
|
||||||
|
|
||||||
|
@ -124,7 +125,7 @@ ClientConnectionThread(HANDLE ServerPort)
|
||||||
Status = NtReplyWaitReceivePort(ServerPort,
|
Status = NtReplyWaitReceivePort(ServerPort,
|
||||||
0,
|
0,
|
||||||
&Reply->Header,
|
&Reply->Header,
|
||||||
&Request.Header);
|
&Request->Header);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
DPRINT1("CSR: NtReplyWaitReceivePort failed\n");
|
DPRINT1("CSR: NtReplyWaitReceivePort failed\n");
|
||||||
|
@ -132,31 +133,31 @@ ClientConnectionThread(HANDLE ServerPort)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If the connection was closed, handle that */
|
/* If the connection was closed, handle that */
|
||||||
if (Request.Header.u2.s2.Type == LPC_PORT_CLOSED)
|
if (Request->Header.u2.s2.Type == LPC_PORT_CLOSED)
|
||||||
{
|
{
|
||||||
CsrFreeProcessData( Request.Header.ClientId.UniqueProcess );
|
CsrFreeProcessData( Request->Header.ClientId.UniqueProcess );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
DPRINT("CSR: Got CSR API: %x [Message Origin: %x]\n",
|
DPRINT("CSR: Got CSR API: %x [Message Origin: %x]\n",
|
||||||
Request.Type,
|
Request->Type,
|
||||||
Request.Header.ClientId.UniqueProcess);
|
Request->Header.ClientId.UniqueProcess);
|
||||||
|
|
||||||
/* Get the Process Data */
|
/* Get the Process Data */
|
||||||
ProcessData = CsrGetProcessData(Request.Header.ClientId.UniqueProcess);
|
ProcessData = CsrGetProcessData(Request->Header.ClientId.UniqueProcess);
|
||||||
if (ProcessData == NULL)
|
if (ProcessData == NULL)
|
||||||
{
|
{
|
||||||
DPRINT1("CSR: Message %d: Unable to find data for process 0x%x\n",
|
DPRINT1("CSR: Message %d: Unable to find data for process 0x%x\n",
|
||||||
Request.Header.u2.s2.Type,
|
Request->Header.u2.s2.Type,
|
||||||
Request.Header.ClientId.UniqueProcess);
|
Request->Header.ClientId.UniqueProcess);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Call the Handler */
|
/* Call the Handler */
|
||||||
CsrApiCallHandler(ProcessData, &Request);
|
CsrApiCallHandler(ProcessData, Request);
|
||||||
|
|
||||||
/* Send back the reply */
|
/* Send back the reply */
|
||||||
Reply = &Request;
|
Reply = Request;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Close the port and exit the thread */
|
/* Close the port and exit the thread */
|
||||||
|
|
|
@ -564,7 +564,7 @@ CSR_API(CsrReadConsole)
|
||||||
/* truncate length to CSRSS_MAX_READ_CONSOLE_REQUEST */
|
/* truncate length to CSRSS_MAX_READ_CONSOLE_REQUEST */
|
||||||
nNumberOfCharsToRead = min(Request->Data.ReadConsoleRequest.NrCharactersToRead, CSRSS_MAX_READ_CONSOLE / CharSize);
|
nNumberOfCharsToRead = min(Request->Data.ReadConsoleRequest.NrCharactersToRead, CSRSS_MAX_READ_CONSOLE / CharSize);
|
||||||
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
|
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
|
||||||
Request->Header.u1.s1.DataLength = Request->Header.u1.s1.TotalLength - sizeof(PORT_MESSAGE);
|
Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
|
||||||
|
|
||||||
Buffer = Request->Data.ReadConsoleRequest.Buffer;
|
Buffer = Request->Data.ReadConsoleRequest.Buffer;
|
||||||
UnicodeBuffer = (PWCHAR)Buffer;
|
UnicodeBuffer = (PWCHAR)Buffer;
|
||||||
|
@ -672,9 +672,15 @@ CSR_API(CsrReadConsole)
|
||||||
{
|
{
|
||||||
Console->EchoCount = 0; /* if the client is no longer waiting on input, do not echo */
|
Console->EchoCount = 0; /* if the client is no longer waiting on input, do not echo */
|
||||||
}
|
}
|
||||||
Request->Header.u1.s1.TotalLength += i * CharSize;
|
|
||||||
|
|
||||||
ConioUnlockConsole(Console);
|
ConioUnlockConsole(Console);
|
||||||
|
|
||||||
|
if (CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE) + i * CharSize > sizeof(CSR_API_MESSAGE))
|
||||||
|
{
|
||||||
|
Request->Header.u1.s1.TotalLength = CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE) + i * CharSize;
|
||||||
|
Request->Header.u1.s1.DataLength = Request->Header.u1.s1.TotalLength - sizeof(PORT_MESSAGE);
|
||||||
|
}
|
||||||
|
|
||||||
return Request->Status;
|
return Request->Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -923,8 +929,8 @@ CSR_API(CsrWriteConsole)
|
||||||
|
|
||||||
DPRINT("CsrWriteConsole\n");
|
DPRINT("CsrWriteConsole\n");
|
||||||
|
|
||||||
if (Request->Header.u1.s1.DataLength
|
if (Request->Header.u1.s1.TotalLength
|
||||||
< sizeof(CSRSS_WRITE_CONSOLE)
|
< CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE)
|
||||||
+ (Request->Data.WriteConsoleRequest.NrCharactersToWrite * CharSize))
|
+ (Request->Data.WriteConsoleRequest.NrCharactersToWrite * CharSize))
|
||||||
{
|
{
|
||||||
DPRINT1("Invalid request size\n");
|
DPRINT1("Invalid request size\n");
|
||||||
|
@ -1558,8 +1564,8 @@ CSR_API(CsrWriteConsoleOutputChar)
|
||||||
|
|
||||||
CharSize = (Request->Data.WriteConsoleOutputCharRequest.Unicode ? sizeof(WCHAR) : sizeof(CHAR));
|
CharSize = (Request->Data.WriteConsoleOutputCharRequest.Unicode ? sizeof(WCHAR) : sizeof(CHAR));
|
||||||
|
|
||||||
if (Request->Header.u1.s1.DataLength
|
if (Request->Header.u1.s1.TotalLength
|
||||||
< sizeof(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR)
|
< CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR)
|
||||||
+ (Request->Data.WriteConsoleOutputCharRequest.Length * CharSize))
|
+ (Request->Data.WriteConsoleOutputCharRequest.Length * CharSize))
|
||||||
{
|
{
|
||||||
DPRINT1("Invalid request size\n");
|
DPRINT1("Invalid request size\n");
|
||||||
|
@ -1812,9 +1818,9 @@ CSR_API(CsrWriteConsoleOutputAttrib)
|
||||||
|
|
||||||
DPRINT("CsrWriteConsoleOutputAttrib\n");
|
DPRINT("CsrWriteConsoleOutputAttrib\n");
|
||||||
|
|
||||||
if (Request->Header.u1.s1.DataLength
|
if (Request->Header.u1.s1.TotalLength
|
||||||
< sizeof(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB)
|
< CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB)
|
||||||
+ Request->Data.WriteConsoleOutputAttribRequest.Length)
|
+ Request->Data.WriteConsoleOutputAttribRequest.Length * sizeof(WORD))
|
||||||
{
|
{
|
||||||
DPRINT1("Invalid request size\n");
|
DPRINT1("Invalid request size\n");
|
||||||
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
|
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
|
||||||
|
@ -2256,11 +2262,12 @@ CSR_API(CsrSetTitle)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCSRSS_CONSOLE Console;
|
PCSRSS_CONSOLE Console;
|
||||||
|
PWCHAR Buffer;
|
||||||
|
|
||||||
DPRINT("CsrSetTitle\n");
|
DPRINT("CsrSetTitle\n");
|
||||||
|
|
||||||
if (Request->Header.u1.s1.DataLength
|
if (Request->Header.u1.s1.TotalLength
|
||||||
< sizeof(CSRSS_SET_TITLE)
|
< CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE)
|
||||||
+ Request->Data.SetTitleRequest.Length)
|
+ Request->Data.SetTitleRequest.Length)
|
||||||
{
|
{
|
||||||
DPRINT1("Invalid request size\n");
|
DPRINT1("Invalid request size\n");
|
||||||
|
@ -2278,16 +2285,26 @@ CSR_API(CsrSetTitle)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* copy title to console */
|
Buffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, Request->Data.SetTitleRequest.Length);
|
||||||
RtlFreeUnicodeString(&Console->Title);
|
if (Buffer)
|
||||||
RtlCreateUnicodeString(&Console->Title, Request->Data.SetTitleRequest.Title);
|
|
||||||
if (! ConioChangeTitle(Console))
|
|
||||||
{
|
{
|
||||||
Request->Status = STATUS_UNSUCCESSFUL;
|
/* copy title to console */
|
||||||
|
RtlFreeUnicodeString(&Console->Title);
|
||||||
|
Console->Title.Buffer = Buffer;
|
||||||
|
Console->Title.Length = Console->Title.MaximumLength = Request->Data.SetTitleRequest.Length;
|
||||||
|
memcpy(Console->Title.Buffer, Request->Data.SetTitleRequest.Title, Console->Title.Length);
|
||||||
|
if (! ConioChangeTitle(Console))
|
||||||
|
{
|
||||||
|
Request->Status = STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Request->Status = STATUS_SUCCESS;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Request->Status = STATUS_SUCCESS;
|
Request->Status = STATUS_NO_MEMORY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ConioUnlockConsole(Console);
|
ConioUnlockConsole(Console);
|
||||||
|
@ -2299,6 +2316,7 @@ CSR_API(CsrGetTitle)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCSRSS_CONSOLE Console;
|
PCSRSS_CONSOLE Console;
|
||||||
|
DWORD Length;
|
||||||
|
|
||||||
DPRINT("CsrGetTitle\n");
|
DPRINT("CsrGetTitle\n");
|
||||||
|
|
||||||
|
@ -2318,12 +2336,17 @@ CSR_API(CsrGetTitle)
|
||||||
Request->Data.GetTitleRequest.ConsoleHandle = Request->Data.GetTitleRequest.ConsoleHandle;
|
Request->Data.GetTitleRequest.ConsoleHandle = Request->Data.GetTitleRequest.ConsoleHandle;
|
||||||
Request->Data.GetTitleRequest.Length = Console->Title.Length;
|
Request->Data.GetTitleRequest.Length = Console->Title.Length;
|
||||||
wcscpy (Request->Data.GetTitleRequest.Title, Console->Title.Buffer);
|
wcscpy (Request->Data.GetTitleRequest.Title, Console->Title.Buffer);
|
||||||
Request->Header.u1.s1.TotalLength += Console->Title.Length;
|
Length = CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE) + Console->Title.Length;
|
||||||
Request->Header.u1.s1.DataLength += Console->Title.Length;
|
|
||||||
Request->Status = STATUS_SUCCESS;
|
|
||||||
|
|
||||||
ConioUnlockConsole(Console);
|
ConioUnlockConsole(Console);
|
||||||
|
|
||||||
|
if (Length > sizeof(CSR_API_MESSAGE))
|
||||||
|
{
|
||||||
|
Request->Header.u1.s1.TotalLength = Length;
|
||||||
|
Request->Header.u1.s1.DataLength = Length - sizeof(PORT_MESSAGE);
|
||||||
|
}
|
||||||
|
Request->Status = STATUS_SUCCESS;
|
||||||
|
|
||||||
return Request->Status;
|
return Request->Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2646,8 +2669,6 @@ CSR_API(CsrReadConsoleOutputChar)
|
||||||
Request->Status = STATUS_SUCCESS;
|
Request->Status = STATUS_SUCCESS;
|
||||||
Request->Data.ReadConsoleOutputCharRequest.EndCoord.X = Xpos - Buff->ShowX;
|
Request->Data.ReadConsoleOutputCharRequest.EndCoord.X = Xpos - Buff->ShowX;
|
||||||
Request->Data.ReadConsoleOutputCharRequest.EndCoord.Y = (Ypos - Buff->ShowY + Buff->MaxY) % Buff->MaxY;
|
Request->Data.ReadConsoleOutputCharRequest.EndCoord.Y = (Ypos - Buff->ShowY + Buff->MaxY) % Buff->MaxY;
|
||||||
Request->Header.u1.s1.TotalLength += Request->Data.ReadConsoleOutputCharRequest.NumCharsToRead;
|
|
||||||
Request->Header.u1.s1.DataLength += Request->Data.ReadConsoleOutputCharRequest.NumCharsToRead;
|
|
||||||
|
|
||||||
ConioUnlockScreenBuffer(Buff);
|
ConioUnlockScreenBuffer(Buff);
|
||||||
if (NULL != Console)
|
if (NULL != Console)
|
||||||
|
@ -2656,6 +2677,11 @@ CSR_API(CsrReadConsoleOutputChar)
|
||||||
}
|
}
|
||||||
|
|
||||||
Request->Data.ReadConsoleOutputCharRequest.CharsRead = (DWORD)((ULONG_PTR)ReadBuffer - (ULONG_PTR)Request->Data.ReadConsoleOutputCharRequest.String) / CharSize;
|
Request->Data.ReadConsoleOutputCharRequest.CharsRead = (DWORD)((ULONG_PTR)ReadBuffer - (ULONG_PTR)Request->Data.ReadConsoleOutputCharRequest.String) / CharSize;
|
||||||
|
if (Request->Data.ReadConsoleOutputCharRequest.CharsRead * CharSize + CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR) > sizeof(CSR_API_MESSAGE))
|
||||||
|
{
|
||||||
|
Request->Header.u1.s1.TotalLength = Request->Data.ReadConsoleOutputCharRequest.CharsRead * CharSize + CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR);
|
||||||
|
Request->Header.u1.s1.DataLength = Request->Header.u1.s1.TotalLength - sizeof(PORT_MESSAGE);
|
||||||
|
}
|
||||||
|
|
||||||
return Request->Status;
|
return Request->Status;
|
||||||
}
|
}
|
||||||
|
@ -2668,6 +2694,7 @@ CSR_API(CsrReadConsoleOutputAttrib)
|
||||||
DWORD Xpos, Ypos;
|
DWORD Xpos, Ypos;
|
||||||
PWORD ReadBuffer;
|
PWORD ReadBuffer;
|
||||||
DWORD i;
|
DWORD i;
|
||||||
|
DWORD CurrentLength;
|
||||||
|
|
||||||
DPRINT("CsrReadConsoleOutputAttrib\n");
|
DPRINT("CsrReadConsoleOutputAttrib\n");
|
||||||
|
|
||||||
|
@ -2708,11 +2735,17 @@ CSR_API(CsrReadConsoleOutputAttrib)
|
||||||
Request->Status = STATUS_SUCCESS;
|
Request->Status = STATUS_SUCCESS;
|
||||||
Request->Data.ReadConsoleOutputAttribRequest.EndCoord.X = Xpos - Buff->ShowX;
|
Request->Data.ReadConsoleOutputAttribRequest.EndCoord.X = Xpos - Buff->ShowX;
|
||||||
Request->Data.ReadConsoleOutputAttribRequest.EndCoord.Y = (Ypos - Buff->ShowY + Buff->MaxY) % Buff->MaxY;
|
Request->Data.ReadConsoleOutputAttribRequest.EndCoord.Y = (Ypos - Buff->ShowY + Buff->MaxY) % Buff->MaxY;
|
||||||
Request->Header.u1.s1.TotalLength += Request->Data.ReadConsoleOutputAttribRequest.NumAttrsToRead;
|
|
||||||
Request->Header.u1.s1.DataLength += Request->Data.ReadConsoleOutputAttribRequest.NumAttrsToRead;
|
|
||||||
|
|
||||||
ConioUnlockScreenBuffer(Buff);
|
ConioUnlockScreenBuffer(Buff);
|
||||||
|
|
||||||
|
CurrentLength = CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB)
|
||||||
|
+ Request->Data.ReadConsoleOutputAttribRequest.NumAttrsToRead * sizeof(WORD);
|
||||||
|
if (CurrentLength > sizeof(CSR_API_MESSAGE))
|
||||||
|
{
|
||||||
|
Request->Header.u1.s1.TotalLength = CurrentLength;
|
||||||
|
Request->Header.u1.s1.DataLength = CurrentLength - sizeof(PORT_MESSAGE);
|
||||||
|
}
|
||||||
|
|
||||||
return Request->Status;
|
return Request->Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3204,14 +3237,14 @@ CSR_API(CsrGetProcessList)
|
||||||
PCSRSS_CONSOLE Console;
|
PCSRSS_CONSOLE Console;
|
||||||
PCSRSS_PROCESS_DATA current;
|
PCSRSS_PROCESS_DATA current;
|
||||||
PLIST_ENTRY current_entry;
|
PLIST_ENTRY current_entry;
|
||||||
ULONG nItems, nCopied;
|
ULONG nItems, nCopied, Length;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
DPRINT("CsrGetProcessList\n");
|
DPRINT("CsrGetProcessList\n");
|
||||||
|
|
||||||
Buffer = Request->Data.GetProcessListRequest.ProcessId;
|
Buffer = Request->Data.GetProcessListRequest.ProcessId;
|
||||||
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
|
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
|
||||||
Request->Header.u1.s1.DataLength = Request->Header.u1.s1.TotalLength - sizeof(PORT_MESSAGE);
|
Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
|
||||||
|
|
||||||
nItems = nCopied = 0;
|
nItems = nCopied = 0;
|
||||||
Request->Data.GetProcessListRequest.nProcessIdsCopied = 0;
|
Request->Data.GetProcessListRequest.nProcessIdsCopied = 0;
|
||||||
|
@ -3242,6 +3275,12 @@ CSR_API(CsrGetProcessList)
|
||||||
Request->Data.GetProcessListRequest.nProcessIdsCopied = nCopied;
|
Request->Data.GetProcessListRequest.nProcessIdsCopied = nCopied;
|
||||||
Request->Data.GetProcessListRequest.nProcessIdsTotal = nItems;
|
Request->Data.GetProcessListRequest.nProcessIdsTotal = nItems;
|
||||||
|
|
||||||
|
Length = CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST) + nCopied * sizeof(HANDLE);
|
||||||
|
if (Length > sizeof(CSR_API_MESSAGE))
|
||||||
|
{
|
||||||
|
Request->Header.u1.s1.TotalLength = Length;
|
||||||
|
Request->Header.u1.s1.DataLength = Length - sizeof(PORT_MESSAGE);
|
||||||
|
}
|
||||||
return Request->Status = STATUS_SUCCESS;
|
return Request->Status = STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue