- 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:
Hartmut Birr 2005-08-28 12:03:25 +00:00
parent 37dced9725
commit bb6a166390
4 changed files with 381 additions and 224 deletions

View file

@ -412,12 +412,12 @@ typedef struct
#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_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_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_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_GET_PROCESS_LIST (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST))
/* WCHARs, not bytes! */
#define CSRSS_MAX_TITLE_LENGTH 80
@ -462,7 +462,7 @@ typedef struct
#define GET_OUTPUT_HANDLE (0x25)
#define CLOSE_HANDLE (0x26)
#define VERIFY_HANDLE (0x27)
#define DUPLICATE_HANDLE (0x28)
#define DUPLICATE_HANDLE (0x28)
#define SETGET_CONSOLE_HW_STATE (0x29)
#define GET_CONSOLE_WINDOW (0x2A)
#define CREATE_DESKTOP (0x2B)
@ -475,7 +475,7 @@ typedef struct
#define SET_CONSOLE_CP (0x32)
#define GET_CONSOLE_OUTPUT_CP (0x33)
#define SET_CONSOLE_OUTPUT_CP (0x34)
#define GET_INPUT_WAIT_HANDLE (0x35)
#define GET_INPUT_WAIT_HANDLE (0x35)
#define GET_PROCESS_LIST (0x36)
/* Keep in sync with definition below. */
@ -483,76 +483,65 @@ typedef struct
typedef struct _CSR_API_MESSAGE
{
PORT_MESSAGE Header;
ULONG Type;
NTSTATUS Status;
union
{
PORT_MESSAGE Header;
union
{
struct
{
BYTE HeaderReserved[sizeof(PORT_MESSAGE)];
ULONG Type;
NTSTATUS Status;
union
{
CSRSS_CREATE_PROCESS CreateProcessRequest;
CSRSS_CONNECT_PROCESS ConnectRequest;
CSRSS_WRITE_CONSOLE WriteConsoleRequest;
CSRSS_READ_CONSOLE ReadConsoleRequest;
CSRSS_ALLOC_CONSOLE AllocConsoleRequest;
CSRSS_SCREEN_BUFFER_INFO ScreenBufferInfoRequest;
CSRSS_SET_CURSOR SetCursorRequest;
CSRSS_FILL_OUTPUT FillOutputRequest;
CSRSS_READ_INPUT ReadInputRequest;
CSRSS_WRITE_CONSOLE_OUTPUT_CHAR WriteConsoleOutputCharRequest;
CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB WriteConsoleOutputAttribRequest;
CSRSS_FILL_OUTPUT_ATTRIB FillOutputAttribRequest;
CSRSS_SET_CURSOR_INFO SetCursorInfoRequest;
CSRSS_GET_CURSOR_INFO GetCursorInfoRequest;
CSRSS_SET_ATTRIB SetAttribRequest;
CSRSS_SET_CONSOLE_MODE SetConsoleModeRequest;
CSRSS_GET_CONSOLE_MODE GetConsoleModeRequest;
CSRSS_CREATE_SCREEN_BUFFER CreateScreenBufferRequest;
CSRSS_SET_SCREEN_BUFFER SetScreenBufferRequest;
CSRSS_SET_TITLE SetTitleRequest;
CSRSS_GET_TITLE GetTitleRequest;
CSRSS_WRITE_CONSOLE_OUTPUT WriteConsoleOutputRequest;
CSRSS_FLUSH_INPUT_BUFFER FlushInputBufferRequest;
CSRSS_SCROLL_CONSOLE_SCREEN_BUFFER ScrollConsoleScreenBufferRequest;
CSRSS_READ_CONSOLE_OUTPUT_CHAR ReadConsoleOutputCharRequest;
CSRSS_READ_CONSOLE_OUTPUT_ATTRIB ReadConsoleOutputAttribRequest;
CSRSS_GET_NUM_INPUT_EVENTS GetNumInputEventsRequest;
CSRSS_REGISTER_SERVICES_PROCESS RegisterServicesProcessRequest;
CSRSS_EXIT_REACTOS ExitReactosRequest;
CSRSS_SET_SHUTDOWN_PARAMETERS SetShutdownParametersRequest;
CSRSS_GET_SHUTDOWN_PARAMETERS GetShutdownParametersRequest;
CSRSS_PEEK_CONSOLE_INPUT PeekConsoleInputRequest;
CSRSS_READ_CONSOLE_OUTPUT ReadConsoleOutputRequest;
CSRSS_WRITE_CONSOLE_INPUT WriteConsoleInputRequest;
CSRSS_GET_INPUT_HANDLE GetInputHandleRequest;
CSRSS_GET_OUTPUT_HANDLE GetOutputHandleRequest;
CSRSS_CLOSE_HANDLE CloseHandleRequest;
CSRSS_VERIFY_HANDLE VerifyHandleRequest;
CSRSS_DUPLICATE_HANDLE DuplicateHandleRequest;
CSRSS_SETGET_CONSOLE_HW_STATE ConsoleHardwareStateRequest;
CSRSS_GET_CONSOLE_WINDOW GetConsoleWindowRequest;
CSRSS_CREATE_DESKTOP CreateDesktopRequest;
CSRSS_SHOW_DESKTOP ShowDesktopRequest;
CSRSS_HIDE_DESKTOP HideDesktopRequest;
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];
};
};
CSRSS_CREATE_PROCESS CreateProcessRequest;
CSRSS_CONNECT_PROCESS ConnectRequest;
CSRSS_WRITE_CONSOLE WriteConsoleRequest;
CSRSS_READ_CONSOLE ReadConsoleRequest;
CSRSS_ALLOC_CONSOLE AllocConsoleRequest;
CSRSS_SCREEN_BUFFER_INFO ScreenBufferInfoRequest;
CSRSS_SET_CURSOR SetCursorRequest;
CSRSS_FILL_OUTPUT FillOutputRequest;
CSRSS_READ_INPUT ReadInputRequest;
CSRSS_WRITE_CONSOLE_OUTPUT_CHAR WriteConsoleOutputCharRequest;
CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB WriteConsoleOutputAttribRequest;
CSRSS_FILL_OUTPUT_ATTRIB FillOutputAttribRequest;
CSRSS_SET_CURSOR_INFO SetCursorInfoRequest;
CSRSS_GET_CURSOR_INFO GetCursorInfoRequest;
CSRSS_SET_ATTRIB SetAttribRequest;
CSRSS_SET_CONSOLE_MODE SetConsoleModeRequest;
CSRSS_GET_CONSOLE_MODE GetConsoleModeRequest;
CSRSS_CREATE_SCREEN_BUFFER CreateScreenBufferRequest;
CSRSS_SET_SCREEN_BUFFER SetScreenBufferRequest;
CSRSS_SET_TITLE SetTitleRequest;
CSRSS_GET_TITLE GetTitleRequest;
CSRSS_WRITE_CONSOLE_OUTPUT WriteConsoleOutputRequest;
CSRSS_FLUSH_INPUT_BUFFER FlushInputBufferRequest;
CSRSS_SCROLL_CONSOLE_SCREEN_BUFFER ScrollConsoleScreenBufferRequest;
CSRSS_READ_CONSOLE_OUTPUT_CHAR ReadConsoleOutputCharRequest;
CSRSS_READ_CONSOLE_OUTPUT_ATTRIB ReadConsoleOutputAttribRequest;
CSRSS_GET_NUM_INPUT_EVENTS GetNumInputEventsRequest;
CSRSS_REGISTER_SERVICES_PROCESS RegisterServicesProcessRequest;
CSRSS_EXIT_REACTOS ExitReactosRequest;
CSRSS_SET_SHUTDOWN_PARAMETERS SetShutdownParametersRequest;
CSRSS_GET_SHUTDOWN_PARAMETERS GetShutdownParametersRequest;
CSRSS_PEEK_CONSOLE_INPUT PeekConsoleInputRequest;
CSRSS_READ_CONSOLE_OUTPUT ReadConsoleOutputRequest;
CSRSS_WRITE_CONSOLE_INPUT WriteConsoleInputRequest;
CSRSS_GET_INPUT_HANDLE GetInputHandleRequest;
CSRSS_GET_OUTPUT_HANDLE GetOutputHandleRequest;
CSRSS_CLOSE_HANDLE CloseHandleRequest;
CSRSS_VERIFY_HANDLE VerifyHandleRequest;
CSRSS_DUPLICATE_HANDLE DuplicateHandleRequest;
CSRSS_SETGET_CONSOLE_HW_STATE ConsoleHardwareStateRequest;
CSRSS_GET_CONSOLE_WINDOW GetConsoleWindowRequest;
CSRSS_CREATE_DESKTOP CreateDesktopRequest;
CSRSS_SHOW_DESKTOP ShowDesktopRequest;
CSRSS_HIDE_DESKTOP HideDesktopRequest;
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;
} CSR_API_MESSAGE, *PCSR_API_MESSAGE;
#endif /* __INCLUDE_CSRSS_CSRSS_H */

View file

@ -1097,7 +1097,7 @@ IntWriteConsole(HANDLE hConsoleOutput,
LPVOID lpReserved,
BOOL bUnicode)
{
CSR_API_MESSAGE Request;
PCSR_API_MESSAGE Request;
ULONG CsrRequest;
NTSTATUS Status;
USHORT nChars;
@ -1105,40 +1105,51 @@ IntWriteConsole(HANDLE hConsoleOutput,
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 = MAKE_CSR_API(WRITE_CONSOLE, CSR_CONSOLE);
Request.Data.WriteConsoleRequest.ConsoleHandle = hConsoleOutput;
Request.Data.WriteConsoleRequest.Unicode = bUnicode;
Request->Data.WriteConsoleRequest.ConsoleHandle = hConsoleOutput;
Request->Data.WriteConsoleRequest.Unicode = bUnicode;
while(nNumberOfCharsToWrite > 0)
{
nChars = min(nNumberOfCharsToWrite, CSRSS_MAX_WRITE_CONSOLE) / CharSize;
Request.Data.WriteConsoleRequest.NrCharactersToWrite = nChars;
nChars = min(nNumberOfCharsToWrite, CSRSS_MAX_WRITE_CONSOLE / CharSize);
Request->Data.WriteConsoleRequest.NrCharactersToWrite = nChars;
SizeBytes = nChars * CharSize;
memcpy(Request.Data.WriteConsoleRequest.Buffer, lpBuffer, SizeBytes);
memcpy(Request->Data.WriteConsoleRequest.Buffer, lpBuffer, SizeBytes);
Status = CsrClientCallServer(&Request,
Status = CsrClientCallServer(Request,
NULL,
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);
return FALSE;
}
nNumberOfCharsToWrite -= nChars;
lpBuffer = (PVOID)((ULONG_PTR)lpBuffer + (ULONG_PTR)SizeBytes);
Written += Request.Data.WriteConsoleRequest.NrCharactersWritten;
Written += Request->Data.WriteConsoleRequest.NrCharactersWritten;
}
if(lpNumberOfCharsWritten != NULL)
{
*lpNumberOfCharsWritten = Written;
}
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
return TRUE;
}
@ -1196,20 +1207,29 @@ IntReadConsole(HANDLE hConsoleInput,
LPVOID lpReserved,
BOOL bUnicode)
{
CSR_API_MESSAGE Request;
PCSR_API_MESSAGE Request;
ULONG CsrRequest;
NTSTATUS Status;
ULONG CharSize, CharsRead = 0;
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
{
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))
{
DPRINT1("Wait for console input failed!\n");
@ -1218,44 +1238,49 @@ IntReadConsole(HANDLE hConsoleInput,
}
CsrRequest = MAKE_CSR_API(READ_CONSOLE, CSR_CONSOLE);
Request.Data.ReadConsoleRequest.ConsoleHandle = hConsoleInput;
Request.Data.ReadConsoleRequest.Unicode = bUnicode;
Request.Data.ReadConsoleRequest.NrCharactersToRead = min(nNumberOfCharsToRead, CSRSS_MAX_READ_CONSOLE) / CharSize;
Request.Data.ReadConsoleRequest.nCharsCanBeDeleted = CharsRead;
Status = CsrClientCallServer(&Request,
Request->Data.ReadConsoleRequest.ConsoleHandle = hConsoleInput;
Request->Data.ReadConsoleRequest.Unicode = bUnicode;
Request->Data.ReadConsoleRequest.NrCharactersToRead = min(nNumberOfCharsToRead, CSRSS_MAX_READ_CONSOLE / CharSize);
Request->Data.ReadConsoleRequest.nCharsCanBeDeleted = CharsRead;
Status = CsrClientCallServer(Request,
NULL,
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");
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
SetLastErrorByStatus(Status);
return FALSE;
}
nNumberOfCharsToRead -= Request.Data.ReadConsoleRequest.NrCharactersRead;
nNumberOfCharsToRead -= Request->Data.ReadConsoleRequest.NrCharactersRead;
memcpy((PVOID)((ULONG_PTR)lpBuffer + (ULONG_PTR)(CharsRead * CharSize)),
Request.Data.ReadConsoleRequest.Buffer,
Request.Data.ReadConsoleRequest.NrCharactersRead * CharSize);
CharsRead += Request.Data.ReadConsoleRequest.NrCharactersRead;
Request->Data.ReadConsoleRequest.Buffer,
Request->Data.ReadConsoleRequest.NrCharactersRead * CharSize);
CharsRead += Request->Data.ReadConsoleRequest.NrCharactersRead;
if(Request.Status == STATUS_NOTIFY_CLEANUP)
if(Request->Status == STATUS_NOTIFY_CLEANUP)
{
if(CharsRead > 0)
{
CharsRead--;
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)
{
*lpNumberOfCharsRead = CharsRead;
}
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
return TRUE;
}
@ -2018,7 +2043,7 @@ IntReadConsoleOutputCharacter(HANDLE hConsoleOutput,
LPDWORD lpNumberOfCharsRead,
BOOL bUnicode)
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
PCSR_API_MESSAGE Request; ULONG CsrRequest;
NTSTATUS Status;
ULONG nChars, SizeBytes, CharSize;
DWORD CharsRead = 0;
@ -2028,35 +2053,47 @@ IntReadConsoleOutputCharacter(HANDLE hConsoleOutput,
nChars = min(nLength, CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR) / 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);
Request.Data.ReadConsoleOutputCharRequest.ConsoleHandle = hConsoleOutput;
Request.Data.ReadConsoleOutputCharRequest.Unicode = bUnicode;
Request.Data.ReadConsoleOutputCharRequest.ReadCoord = dwReadCoord;
Request->Data.ReadConsoleOutputCharRequest.ConsoleHandle = hConsoleOutput;
Request->Data.ReadConsoleOutputCharRequest.Unicode = bUnicode;
Request->Data.ReadConsoleOutputCharRequest.ReadCoord = dwReadCoord;
while(nLength > 0)
{
DWORD BytesRead;
Request.Data.ReadConsoleOutputCharRequest.NumCharsToRead = min(nLength, nChars);
SizeBytes = Request.Data.ReadConsoleOutputCharRequest.NumCharsToRead * CharSize;
Request->Data.ReadConsoleOutputCharRequest.NumCharsToRead = min(nLength, nChars);
SizeBytes = Request->Data.ReadConsoleOutputCharRequest.NumCharsToRead * CharSize;
Status = CsrClientCallServer(&Request,
Status = CsrClientCallServer(Request,
NULL,
CsrRequest,
sizeof(CSR_API_MESSAGE));
if(!NT_SUCCESS(Status) || !NT_SUCCESS(Request.Status))
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);
SetLastErrorByStatus(Status);
break;
}
BytesRead = Request.Data.ReadConsoleOutputCharRequest.CharsRead * CharSize;
memcpy(lpCharacter, Request.Data.ReadConsoleOutputCharRequest.String, BytesRead);
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;
CharsRead += 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)
@ -2064,6 +2101,8 @@ IntReadConsoleOutputCharacter(HANDLE hConsoleOutput,
*lpNumberOfCharsRead = CharsRead;
}
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
return TRUE;
}
@ -2131,16 +2170,26 @@ ReadConsoleOutputAttribute(
LPDWORD lpNumberOfAttrsRead
)
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
PCSR_API_MESSAGE Request; ULONG CsrRequest;
NTSTATUS Status;
DWORD Size;
if (lpNumberOfAttrsRead != NULL)
*lpNumberOfAttrsRead = nLength;
Request = RtlAllocateHeap(RtlGetProcessHeap(), 0,
max(sizeof(CSR_API_MESSAGE),
CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB)
+ min (nLength, CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB / sizeof(WORD)) * sizeof(WORD)));
if (Request == NULL)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return FALSE;
}
CsrRequest = MAKE_CSR_API(READ_CONSOLE_OUTPUT_ATTRIB, CSR_CONSOLE);
Request.Data.ReadConsoleOutputAttribRequest.ConsoleHandle = hConsoleOutput;
Request.Data.ReadConsoleOutputAttribRequest.ReadCoord = dwReadCoord;
Request->Data.ReadConsoleOutputAttribRequest.ConsoleHandle = hConsoleOutput;
Request->Data.ReadConsoleOutputAttribRequest.ReadCoord = dwReadCoord;
while (nLength != 0)
{
@ -2149,24 +2198,28 @@ ReadConsoleOutputAttribute(
else
Size = nLength;
Request.Data.ReadConsoleOutputAttribRequest.NumAttrsToRead = Size;
Request->Data.ReadConsoleOutputAttribRequest.NumAttrsToRead = Size;
Status = CsrClientCallServer(&Request,
Status = CsrClientCallServer(Request,
NULL,
CsrRequest,
sizeof(CSR_API_MESSAGE));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Request.Status))
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);
SetLastErrorByStatus(Status);
return(FALSE);
}
memcpy(lpAttribute, Request.Data.ReadConsoleOutputAttribRequest.Attribute, Size * sizeof(WORD));
memcpy(lpAttribute, Request->Data.ReadConsoleOutputAttribRequest.Attribute, Size * sizeof(WORD));
lpAttribute += 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);
}
@ -2179,7 +2232,7 @@ IntWriteConsoleOutputCharacter(HANDLE hConsoleOutput,
LPDWORD lpNumberOfCharsWritten,
BOOL bUnicode)
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
PCSR_API_MESSAGE Request; ULONG CsrRequest;
NTSTATUS Status;
ULONG SizeBytes, CharSize, nChars;
DWORD Written = 0;
@ -2189,36 +2242,48 @@ IntWriteConsoleOutputCharacter(HANDLE hConsoleOutput,
nChars = min(nLength, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR / CharSize);
SizeBytes = nChars * CharSize;
Request = RtlAllocateHeap(RtlGetProcessHeap(), 0,
max (sizeof(CSR_API_MESSAGE),
CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR)
+ min (nChars, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR / CharSize) * CharSize));
if (Request == NULL)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return FALSE;
}
CsrRequest = MAKE_CSR_API(WRITE_CONSOLE_OUTPUT_CHAR, CSR_CONSOLE);
Request.Data.WriteConsoleOutputCharRequest.ConsoleHandle = hConsoleOutput;
Request.Data.WriteConsoleOutputCharRequest.Unicode = bUnicode;
Request.Data.WriteConsoleOutputCharRequest.Coord = dwWriteCoord;
Request->Data.WriteConsoleOutputCharRequest.ConsoleHandle = hConsoleOutput;
Request->Data.WriteConsoleOutputCharRequest.Unicode = bUnicode;
Request->Data.WriteConsoleOutputCharRequest.Coord = dwWriteCoord;
while(nLength > 0)
{
DWORD BytesWrite;
Request.Data.WriteConsoleOutputCharRequest.Length = min(nLength, nChars);
BytesWrite = Request.Data.WriteConsoleOutputCharRequest.Length * CharSize;
Request->Data.WriteConsoleOutputCharRequest.Length = min(nLength, nChars);
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,
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);
return FALSE;
}
nLength -= Request.Data.WriteConsoleOutputCharRequest.NrCharactersWritten;
lpCharacter = (PVOID)((ULONG_PTR)lpCharacter + (ULONG_PTR)(Request.Data.WriteConsoleOutputCharRequest.NrCharactersWritten * CharSize));
Written += Request.Data.WriteConsoleOutputCharRequest.NrCharactersWritten;
nLength -= Request->Data.WriteConsoleOutputCharRequest.NrCharactersWritten;
lpCharacter = (PVOID)((ULONG_PTR)lpCharacter + (ULONG_PTR)(Request->Data.WriteConsoleOutputCharRequest.NrCharactersWritten * CharSize));
Written += Request->Data.WriteConsoleOutputCharRequest.NrCharactersWritten;
Request.Data.WriteConsoleOutputCharRequest.Coord = Request.Data.WriteConsoleOutputCharRequest.EndCoord;
Request->Data.WriteConsoleOutputCharRequest.Coord = Request->Data.WriteConsoleOutputCharRequest.EndCoord;
}
if(lpNumberOfCharsWritten != NULL)
@ -2226,6 +2291,8 @@ IntWriteConsoleOutputCharacter(HANDLE hConsoleOutput,
*lpNumberOfCharsWritten = Written;
}
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
return TRUE;
}
@ -2287,32 +2354,50 @@ WriteConsoleOutputAttribute(
LPDWORD lpNumberOfAttrsWritten
)
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
PCSR_API_MESSAGE Request; ULONG CsrRequest;
NTSTATUS Status;
WORD Size;
Request = RtlAllocateHeap(RtlGetProcessHeap(), 0,
max (sizeof(CSR_API_MESSAGE),
CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB)
+ min(nLength, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB / sizeof(WORD)) * sizeof(WORD)));
if (Request == NULL)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return FALSE;
}
CsrRequest = MAKE_CSR_API(WRITE_CONSOLE_OUTPUT_ATTRIB, CSR_CONSOLE);
Request.Data.WriteConsoleOutputAttribRequest.ConsoleHandle = hConsoleOutput;
Request.Data.WriteConsoleOutputAttribRequest.Coord = dwWriteCoord;
Request->Data.WriteConsoleOutputAttribRequest.ConsoleHandle = hConsoleOutput;
Request->Data.WriteConsoleOutputAttribRequest.Coord = dwWriteCoord;
if( lpNumberOfAttrsWritten )
*lpNumberOfAttrsWritten = nLength;
while( nLength )
{
Size = min(nLength, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB / sizeof(WORD));
Request.Data.WriteConsoleOutputAttribRequest.Length = Size;
memcpy(Request.Data.WriteConsoleOutputAttribRequest.Attribute, lpAttribute, Size * sizeof(WORD));
Request->Data.WriteConsoleOutputAttribRequest.Length = Size;
memcpy(Request->Data.WriteConsoleOutputAttribRequest.Attribute, lpAttribute, Size * sizeof(WORD));
Status = CsrClientCallServer( &Request, NULL, CsrRequest, sizeof(CSR_API_MESSAGE));
if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Request.Status ) )
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);
SetLastErrorByStatus ( Status );
return FALSE;
}
nLength -= 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;
}
@ -2879,7 +2964,7 @@ GetConsoleTitleW(
DWORD nSize
)
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
PCSR_API_MESSAGE Request; ULONG CsrRequest;
NTSTATUS Status;
HANDLE hConsole;
@ -2889,32 +2974,43 @@ GetConsoleTitleW(
return 0;
}
CsrRequest = MAKE_CSR_API(GET_TITLE, CSR_CONSOLE);
Request.Data.GetTitleRequest.ConsoleHandle = hConsole;
Request = RtlAllocateHeap(RtlGetProcessHeap(), 0,
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,
CsrRequest,
sizeof(CSR_API_MESSAGE));
CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_TITLE) + CSRSS_MAX_TITLE_LENGTH * sizeof(WCHAR));
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);
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';
}
else
{
nSize = Request.Data.GetTitleRequest.Length / sizeof (WCHAR);
wcscpy(lpConsoleTitle, Request.Data.GetTitleRequest.Title);
nSize = Request->Data.GetTitleRequest.Length / sizeof (WCHAR);
wcscpy(lpConsoleTitle, Request->Data.GetTitleRequest.Title);
lpConsoleTitle[nSize] = L'\0';
}
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
return nSize;
}
@ -2971,7 +3067,7 @@ SetConsoleTitleW(
LPCWSTR lpConsoleTitle
)
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
PCSR_API_MESSAGE Request; ULONG CsrRequest;
NTSTATUS Status;
unsigned int c;
HANDLE hConsole;
@ -2982,24 +3078,36 @@ SetConsoleTitleW(
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);
Request.Data.SetTitleRequest.Console = hConsole;
Request->Data.SetTitleRequest.Console = hConsole;
for( c = 0; lpConsoleTitle[c] && c < CSRSS_MAX_TITLE_LENGTH; c++ )
Request.Data.SetTitleRequest.Title[c] = lpConsoleTitle[c];
// add null
Request.Data.SetTitleRequest.Title[c] = 0;
Request.Data.SetTitleRequest.Length = c;
Status = CsrClientCallServer(&Request,
Request->Data.SetTitleRequest.Title[c] = lpConsoleTitle[c];
Request->Data.SetTitleRequest.Length = c * sizeof(WCHAR);
Status = CsrClientCallServer(Request,
NULL,
CsrRequest,
sizeof(CSR_API_MESSAGE));
max (sizeof(CSR_API_MESSAGE), CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE) + c * sizeof(WCHAR)));
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);
return(FALSE);
}
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
return TRUE;
}
@ -3017,7 +3125,7 @@ SetConsoleTitleA(
LPCSTR lpConsoleTitle
)
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
PCSR_API_MESSAGE Request; ULONG CsrRequest;
NTSTATUS Status;
unsigned int c;
HANDLE hConsole;
@ -3028,24 +3136,36 @@ SetConsoleTitleA(
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);
Request.Data.SetTitleRequest.Console = hConsole;
Request->Data.SetTitleRequest.Console = hConsole;
for( c = 0; lpConsoleTitle[c] && c < CSRSS_MAX_TITLE_LENGTH; c++ )
Request.Data.SetTitleRequest.Title[c] = lpConsoleTitle[c];
// add null
Request.Data.SetTitleRequest.Title[c] = 0;
Request.Data.SetTitleRequest.Length = c;
Status = CsrClientCallServer(&Request,
Request->Data.SetTitleRequest.Title[c] = lpConsoleTitle[c];
Request->Data.SetTitleRequest.Length = c * sizeof(WCHAR);
Status = CsrClientCallServer(Request,
NULL,
CsrRequest,
sizeof(CSR_API_MESSAGE));
max (sizeof(CSR_API_MESSAGE), CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE) + c * sizeof(WCHAR)));
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);
return(FALSE);
}
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
return TRUE;
}
@ -3194,7 +3314,7 @@ DWORD STDCALL
GetConsoleProcessList(LPDWORD lpdwProcessList,
DWORD dwProcessCount)
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
PCSR_API_MESSAGE Request; ULONG CsrRequest;
ULONG nProcesses;
NTSTATUS Status;
@ -3204,34 +3324,42 @@ GetConsoleProcessList(LPDWORD lpdwProcessList,
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);
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,
CsrRequest,
sizeof(CSR_API_MESSAGE));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
max (sizeof(CSR_API_MESSAGE),
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);
nProcesses = 0;
}
else
{
if(dwProcessCount >= Request.Data.GetProcessListRequest.nProcessIdsTotal)
nProcesses = Request->Data.GetProcessListRequest.nProcessIdsCopied;
if(dwProcessCount >= nProcesses)
{
nProcesses = Request.Data.GetProcessListRequest.nProcessIdsCopied;
for(nProcesses = 0; nProcesses < Request.Data.GetProcessListRequest.nProcessIdsCopied; nProcesses++)
{
*(lpdwProcessList++) = (DWORD)Request.Data.GetProcessListRequest.ProcessId[nProcesses];
}
}
else
{
nProcesses = Request.Data.GetProcessListRequest.nProcessIdsTotal;
memcpy(lpdwProcessList, Request->Data.GetProcessListRequest.ProcessId, nProcesses * sizeof(DWORD));
}
}
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
return nProcesses;
}

View file

@ -108,7 +108,8 @@ STDCALL
ClientConnectionThread(HANDLE ServerPort)
{
NTSTATUS Status;
CSR_API_MESSAGE Request;
BYTE RawRequest[LPC_MAX_DATA_LENGTH];
PCSR_API_MESSAGE Request = (PCSR_API_MESSAGE)RawRequest;
PCSR_API_MESSAGE Reply;
PCSRSS_PROCESS_DATA ProcessData;
@ -124,7 +125,7 @@ ClientConnectionThread(HANDLE ServerPort)
Status = NtReplyWaitReceivePort(ServerPort,
0,
&Reply->Header,
&Request.Header);
&Request->Header);
if (!NT_SUCCESS(Status))
{
DPRINT1("CSR: NtReplyWaitReceivePort failed\n");
@ -132,31 +133,31 @@ ClientConnectionThread(HANDLE ServerPort)
}
/* 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;
}
DPRINT("CSR: Got CSR API: %x [Message Origin: %x]\n",
Request.Type,
Request.Header.ClientId.UniqueProcess);
Request->Type,
Request->Header.ClientId.UniqueProcess);
/* Get the Process Data */
ProcessData = CsrGetProcessData(Request.Header.ClientId.UniqueProcess);
ProcessData = CsrGetProcessData(Request->Header.ClientId.UniqueProcess);
if (ProcessData == NULL)
{
DPRINT1("CSR: Message %d: Unable to find data for process 0x%x\n",
Request.Header.u2.s2.Type,
Request.Header.ClientId.UniqueProcess);
Request->Header.u2.s2.Type,
Request->Header.ClientId.UniqueProcess);
break;
}
/* Call the Handler */
CsrApiCallHandler(ProcessData, &Request);
CsrApiCallHandler(ProcessData, Request);
/* Send back the reply */
Reply = &Request;
Reply = Request;
}
/* Close the port and exit the thread */

View file

@ -564,7 +564,7 @@ CSR_API(CsrReadConsole)
/* truncate length to CSRSS_MAX_READ_CONSOLE_REQUEST */
nNumberOfCharsToRead = min(Request->Data.ReadConsoleRequest.NrCharactersToRead, CSRSS_MAX_READ_CONSOLE / CharSize);
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;
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 */
}
Request->Header.u1.s1.TotalLength += i * CharSize;
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;
}
@ -923,8 +929,8 @@ CSR_API(CsrWriteConsole)
DPRINT("CsrWriteConsole\n");
if (Request->Header.u1.s1.DataLength
< sizeof(CSRSS_WRITE_CONSOLE)
if (Request->Header.u1.s1.TotalLength
< CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE)
+ (Request->Data.WriteConsoleRequest.NrCharactersToWrite * CharSize))
{
DPRINT1("Invalid request size\n");
@ -1558,8 +1564,8 @@ CSR_API(CsrWriteConsoleOutputChar)
CharSize = (Request->Data.WriteConsoleOutputCharRequest.Unicode ? sizeof(WCHAR) : sizeof(CHAR));
if (Request->Header.u1.s1.DataLength
< sizeof(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR)
if (Request->Header.u1.s1.TotalLength
< CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR)
+ (Request->Data.WriteConsoleOutputCharRequest.Length * CharSize))
{
DPRINT1("Invalid request size\n");
@ -1812,9 +1818,9 @@ CSR_API(CsrWriteConsoleOutputAttrib)
DPRINT("CsrWriteConsoleOutputAttrib\n");
if (Request->Header.u1.s1.DataLength
< sizeof(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB)
+ Request->Data.WriteConsoleOutputAttribRequest.Length)
if (Request->Header.u1.s1.TotalLength
< CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB)
+ Request->Data.WriteConsoleOutputAttribRequest.Length * sizeof(WORD))
{
DPRINT1("Invalid request size\n");
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
@ -2256,11 +2262,12 @@ CSR_API(CsrSetTitle)
{
NTSTATUS Status;
PCSRSS_CONSOLE Console;
PWCHAR Buffer;
DPRINT("CsrSetTitle\n");
if (Request->Header.u1.s1.DataLength
< sizeof(CSRSS_SET_TITLE)
if (Request->Header.u1.s1.TotalLength
< CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE)
+ Request->Data.SetTitleRequest.Length)
{
DPRINT1("Invalid request size\n");
@ -2278,16 +2285,26 @@ CSR_API(CsrSetTitle)
}
else
{
/* copy title to console */
RtlFreeUnicodeString(&Console->Title);
RtlCreateUnicodeString(&Console->Title, Request->Data.SetTitleRequest.Title);
if (! ConioChangeTitle(Console))
Buffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, Request->Data.SetTitleRequest.Length);
if (Buffer)
{
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
{
Request->Status = STATUS_SUCCESS;
Request->Status = STATUS_NO_MEMORY;
}
}
ConioUnlockConsole(Console);
@ -2299,6 +2316,7 @@ CSR_API(CsrGetTitle)
{
NTSTATUS Status;
PCSRSS_CONSOLE Console;
DWORD Length;
DPRINT("CsrGetTitle\n");
@ -2318,12 +2336,17 @@ CSR_API(CsrGetTitle)
Request->Data.GetTitleRequest.ConsoleHandle = Request->Data.GetTitleRequest.ConsoleHandle;
Request->Data.GetTitleRequest.Length = Console->Title.Length;
wcscpy (Request->Data.GetTitleRequest.Title, Console->Title.Buffer);
Request->Header.u1.s1.TotalLength += Console->Title.Length;
Request->Header.u1.s1.DataLength += Console->Title.Length;
Request->Status = STATUS_SUCCESS;
Length = CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE) + Console->Title.Length;
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;
}
@ -2646,8 +2669,6 @@ CSR_API(CsrReadConsoleOutputChar)
Request->Status = STATUS_SUCCESS;
Request->Data.ReadConsoleOutputCharRequest.EndCoord.X = Xpos - Buff->ShowX;
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);
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;
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;
}
@ -2668,6 +2694,7 @@ CSR_API(CsrReadConsoleOutputAttrib)
DWORD Xpos, Ypos;
PWORD ReadBuffer;
DWORD i;
DWORD CurrentLength;
DPRINT("CsrReadConsoleOutputAttrib\n");
@ -2708,11 +2735,17 @@ CSR_API(CsrReadConsoleOutputAttrib)
Request->Status = STATUS_SUCCESS;
Request->Data.ReadConsoleOutputAttribRequest.EndCoord.X = Xpos - Buff->ShowX;
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);
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;
}
@ -3204,14 +3237,14 @@ CSR_API(CsrGetProcessList)
PCSRSS_CONSOLE Console;
PCSRSS_PROCESS_DATA current;
PLIST_ENTRY current_entry;
ULONG nItems, nCopied;
ULONG nItems, nCopied, Length;
NTSTATUS Status;
DPRINT("CsrGetProcessList\n");
Buffer = Request->Data.GetProcessListRequest.ProcessId;
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;
Request->Data.GetProcessListRequest.nProcessIdsCopied = 0;
@ -3242,6 +3275,12 @@ CSR_API(CsrGetProcessList)
Request->Data.GetProcessListRequest.nProcessIdsCopied = nCopied;
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;
}