- Allocate the csrss request buffer from heap if the necessary length is larger than the request structure. - Fixed some buffer length calculations. Modified: trunk/reactos/include/subsys/csrss/csrss.h Modified: trunk/reactos/lib/kernel32/misc/console.c Modified: trunk/reactos/subsys/csrss/api/wapi.c Modified: trunk/reactos/subsys/csrss/win32csr/conio.c _____
Modified: trunk/reactos/include/subsys/csrss/csrss.h --- trunk/reactos/include/subsys/csrss/csrss.h 2005-08-28 11:58:06 UTC (rev 17581) +++ trunk/reactos/include/subsys/csrss/csrss.h 2005-08-28 12:03:25 UTC (rev 17582) @@ -412,12 +412,12 @@
#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 @@ #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 @@ #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 _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 */ _____
Modified: trunk/reactos/lib/kernel32/misc/console.c --- trunk/reactos/lib/kernel32/misc/console.c 2005-08-28 11:58:06 UTC (rev 17581) +++ trunk/reactos/lib/kernel32/misc/console.c 2005-08-28 12:03:25 UTC (rev 17582) @@ -1097,7 +1097,7 @@
LPVOID lpReserved, BOOL bUnicode) { - CSR_API_MESSAGE Request; + PCSR_API_MESSAGE Request; ULONG CsrRequest; NTSTATUS Status; USHORT nChars; @@ -1105,40 +1105,51 @@ 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 @@ 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 @@ }
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 @@ 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 @@ 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 @@ *lpNumberOfCharsRead = CharsRead; }
+ RtlFreeHeap(RtlGetProcessHeap(), 0, Request); + return TRUE; }
@@ -2131,16 +2170,26 @@ 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 @@ 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 @@ 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 @@ 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.NrCharactersWritt en * CharSize)); - Written += Request.Data.WriteConsoleOutputCharRequest.NrCharactersWritten; + nLength -= Request->Data.WriteConsoleOutputCharRequest.NrCharactersWritten; + lpCharacter = (PVOID)((ULONG_PTR)lpCharacter + (ULONG_PTR)(Request->Data.WriteConsoleOutputCharRequest.NrCharactersWrit ten * 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 @@ *lpNumberOfCharsWritten = Written; }
+ RtlFreeHeap(RtlGetProcessHeap(), 0, Request); + return TRUE; }
@@ -2287,32 +2354,50 @@ 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 @@ DWORD nSize ) { - CSR_API_MESSAGE Request; ULONG CsrRequest; + PCSR_API_MESSAGE Request; ULONG CsrRequest; NTSTATUS Status; HANDLE hConsole;
@@ -2889,32 +2974,43 @@ return 0; }
+ 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; + } + CsrRequest = MAKE_CSR_API(GET_TITLE, CSR_CONSOLE); - Request.Data.GetTitleRequest.ConsoleHandle = hConsole; + Request->Data.GetTitleRequest.ConsoleHandle = hConsole;
- Status = CsrClientCallServer(&Request, + 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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]; - } + memcpy(lpdwProcessList, Request->Data.GetProcessListRequest.ProcessId, nProcesses * sizeof(DWORD)); } - else - { - nProcesses = Request.Data.GetProcessListRequest.nProcessIdsTotal; - } }
+ RtlFreeHeap(RtlGetProcessHeap(), 0, Request); + return nProcesses; }
_____
Modified: trunk/reactos/subsys/csrss/api/wapi.c --- trunk/reactos/subsys/csrss/api/wapi.c 2005-08-28 11:58:06 UTC (rev 17581) +++ trunk/reactos/subsys/csrss/api/wapi.c 2005-08-28 12:03:25 UTC (rev 17582) @@ -108,7 +108,8 @@
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 @@ Status = NtReplyWaitReceivePort(ServerPort, 0, &Reply->Header, - &Request.Header); + &Request->Header); if (!NT_SUCCESS(Status)) { DPRINT1("CSR: NtReplyWaitReceivePort failed\n"); @@ -132,31 +133,31 @@ }
/* 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 */ _____
Modified: trunk/reactos/subsys/csrss/win32csr/conio.c --- trunk/reactos/subsys/csrss/win32csr/conio.c 2005-08-28 11:58:06 UTC (rev 17581) +++ trunk/reactos/subsys/csrss/win32csr/conio.c 2005-08-28 12:03:25 UTC (rev 17582) @@ -564,7 +564,7 @@
/* 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 @@ { 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 @@
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 @@
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 @@
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 @@ { 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 [truncated at 1000 lines; 145 more skipped]