- 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 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 */

View file

@ -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;
} }

View file

@ -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 */

View file

@ -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;
} }