BasepAnsiStringToHeapUnicodeString(lpExeName, (LPWSTR*) &lpExeNameW);
bRetVal = AddConsoleAliasW(lpSourceW, lpTargetW, lpExeNameW);
-
+
/* Clean up */
if (lpSourceW)
RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR*) lpSourceW);
LPCWSTR lpTarget,
LPCWSTR lpExeName)
{
- PCSR_API_MESSAGE Request;
+ PCSR_API_MESSAGE Request;
ULONG CsrRequest;
NTSTATUS Status;
ULONG SourceLength;
ULONG Size;
ULONG RequestLength;
WCHAR * Ptr;
-
+
DPRINT("AddConsoleAliasW enterd with lpSource %S lpTarget %S lpExeName %S\n", lpSource, lpTarget, lpExeName);
ExeLength = wcslen(lpExeName) + 1;
Size = (ExeLength + SourceLength + TargetLength) * sizeof(WCHAR);
RequestLength = sizeof(CSR_API_MESSAGE) + Size;
-
+
Request = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY, RequestLength);
Ptr = (WCHAR*)(((ULONG_PTR)Request) + sizeof(CSR_API_MESSAGE));
-
+
wcscpy(Ptr, lpSource);
Request->Data.AddConsoleAlias.SourceLength = SourceLength;
Ptr = (WCHAR*)(((ULONG_PTR)Request) + sizeof(CSR_API_MESSAGE) + SourceLength * sizeof(WCHAR));
DWORD TargetBufferLength,
LPWSTR lpExeName)
{
- PCSR_API_MESSAGE Request;
+ PCSR_API_MESSAGE Request;
PCSR_CAPTURE_BUFFER CaptureBuffer;
ULONG CsrRequest;
NTSTATUS Status;
RequestLength = Size + sizeof(CSR_API_MESSAGE);
Request = RtlAllocateHeap(GetProcessHeap(), 0, RequestLength);
-
+
CaptureBuffer = CsrAllocateCaptureBuffer(1, TargetBufferLength);
if (!CaptureBuffer)
{
- RtlFreeHeap(GetProcessHeap(), 0, Request);
+ RtlFreeHeap(GetProcessHeap(), 0, Request);
return 0;
}
lpwSource = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSourceSize);
MultiByteToWideChar(CP_ACP, 0, lpSource, -1, lpwSource, dwSourceSize);
- dwExeNameSize = (strlen(lpExeName)+1) * sizeof(WCHAR);
+ dwExeNameSize = (strlen(lpExeName)+1) * sizeof(WCHAR);
lpwExeName = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwExeNameSize);
MultiByteToWideChar(CP_ACP, 0, lpExeName, -1, lpwExeName, dwExeNameSize);
GetConsoleAliasExesW (LPWSTR lpExeNameBuffer,
DWORD ExeNameBufferLength)
{
- CSR_API_MESSAGE Request;
+ CSR_API_MESSAGE Request;
PCSR_CAPTURE_BUFFER CaptureBuffer;
ULONG CsrRequest;
NTSTATUS Status;
DWORD WINAPI
GetConsoleAliasExesLengthW (VOID)
{
- CSR_API_MESSAGE Request;
+ CSR_API_MESSAGE Request;
ULONG CsrRequest;
NTSTATUS Status;
DWORD AliasBufferLength,
LPWSTR ExeName)
{
- CSR_API_MESSAGE Request;
+ CSR_API_MESSAGE Request;
ULONG CsrRequest;
NTSTATUS Status;
DWORD dwLength;
if (dwRetVal)
dwRetVal = WideCharToMultiByte(CP_ACP, 0, lpwAliasBuffer, dwRetVal, AliasBuffer, AliasBufferLength, NULL, NULL);
-
+
HeapFree(GetProcessHeap(), 0, lpwAliasBuffer);
return dwRetVal;
}
* @implemented
*/
DWORD WINAPI
-GetConsoleAliasesLengthW (LPWSTR lpExeName)
+GetConsoleAliasesLengthW (LPWSTR lpExeName)
{
- CSR_API_MESSAGE Request;
+ CSR_API_MESSAGE Request;
ULONG CsrRequest;
NTSTATUS Status;
dwRetVal = GetConsoleAliasesLengthW(lpExeNameW);
if (dwRetVal)
dwRetVal /= sizeof(WCHAR);
-
+
/* Clean up */
if (lpExeNameW)
RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR*) lpExeNameW);
*/
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
-
+
NTSTATUS Status;
CsrRequest = MAKE_CSR_API(SETGET_CONSOLE_HW_STATE, CSR_CONSOLE);
*/
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
-
+
NTSTATUS Status;
CsrRequest = MAKE_CSR_API(GET_INPUT_WAIT_HANDLE, CSR_CONSOLE);
*/
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
-
+
NTSTATUS Status = STATUS_SUCCESS;
if(0 == _wcsicmp(wsName, L"CONIN$"))
*/
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
-
+
NTSTATUS Status;
CsrRequest = MAKE_CSR_API(SETGET_CONSOLE_HW_STATE, CSR_CONSOLE);
VerifyConsoleIoHandle(HANDLE Handle)
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
-
+
NTSTATUS Status;
CsrRequest = MAKE_CSR_API(VERIFY_HANDLE, CSR_NATIVE);
*/
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
-
+
NTSTATUS Status;
CsrRequest = MAKE_CSR_API(CLOSE_HANDLE, CSR_NATIVE);
LPVOID lpReserved,
BOOL bUnicode)
{
- PCSR_API_MESSAGE Request;
+ PCSR_API_MESSAGE Request;
ULONG CsrRequest;
NTSTATUS Status;
USHORT nChars;
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)
+ 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)
{
PCONSOLE_READCONSOLE_CONTROL lpReserved,
BOOL bUnicode)
{
- PCSR_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)
+ CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE)
+ min(nNumberOfCharsToRead, CSRSS_MAX_READ_CONSOLE / CharSize) * CharSize));
if (Request == NULL)
{
Status = CsrClientCallServer(Request,
NULL,
CsrRequest,
- max(sizeof(CSR_API_MESSAGE),
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE)
+ 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))
BOOL WINAPI AllocConsole(VOID)
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
-
+
NTSTATUS Status;
HANDLE hStdError;
// but I just tried to reverse what AllocConsole() does...
CSR_API_MESSAGE Request; ULONG CsrRequest;
-
+
NTSTATUS Status;
CsrRequest = MAKE_CSR_API(FREE_CONSOLE, CSR_CONSOLE);
)
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
-
+
NTSTATUS Status;
CsrRequest = MAKE_CSR_API(SCREEN_BUFFER_INFO, CSR_CONSOLE);
)
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
-
+
NTSTATUS Status;
CsrRequest = MAKE_CSR_API(SET_CURSOR, CSR_CONSOLE);
BOOL bUnicode)
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
-
+
NTSTATUS Status;
CsrRequest = MAKE_CSR_API(FILL_OUTPUT, CSR_CONSOLE);
Request.Data.PeekConsoleInputRequest.Length = nLength;
/* Call the server */
- Status = CsrClientCallServer(&Request,
+ Status = CsrClientCallServer(&Request,
CaptureBuffer,
CsrRequest,
sizeof(CSR_API_MESSAGE));
/* Copy into the buffer */
DPRINT("Copying to buffer\n");
RtlCopyMemory(lpBuffer,
- Request.Data.PeekConsoleInputRequest.InputRecord,
+ Request.Data.PeekConsoleInputRequest.InputRecord,
sizeof(INPUT_RECORD) * *lpNumberOfEventsRead);
}
else
BOOL bUnicode)
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
-
+
ULONG Read;
NTSTATUS Status;
Request.Data.WriteConsoleInputRequest.Length = nLength;
/* Call the server */
- Status = CsrClientCallServer(&Request,
+ Status = CsrClientCallServer(&Request,
CaptureBuffer,
CsrRequest,
sizeof(CSR_API_MESSAGE));
Request.Data.ReadConsoleOutputRequest.ReadRegion = *lpReadRegion;
/* Call the server */
- Status = CsrClientCallServer(&Request,
+ Status = CsrClientCallServer(&Request,
CaptureBuffer,
CsrRequest,
sizeof(CSR_API_MESSAGE));
{
/* Copy into the buffer */
DPRINT("Copying to buffer\n");
- SizeX = Request.Data.ReadConsoleOutputRequest.ReadRegion.Right -
+ SizeX = Request.Data.ReadConsoleOutputRequest.ReadRegion.Right -
Request.Data.ReadConsoleOutputRequest.ReadRegion.Left + 1;
- SizeY = Request.Data.ReadConsoleOutputRequest.ReadRegion.Bottom -
+ SizeY = Request.Data.ReadConsoleOutputRequest.ReadRegion.Bottom -
Request.Data.ReadConsoleOutputRequest.ReadRegion.Top + 1;
- RtlCopyMemory(lpBuffer,
- Request.Data.ReadConsoleOutputRequest.CharInfo,
+ RtlCopyMemory(lpBuffer,
+ Request.Data.ReadConsoleOutputRequest.CharInfo,
sizeof(CHAR_INFO) * SizeX * SizeY);
}
else
Request.Data.WriteConsoleOutputRequest.WriteRegion = *lpWriteRegion;
/* Call the server */
- Status = CsrClientCallServer(&Request,
+ Status = CsrClientCallServer(&Request,
CaptureBuffer,
CsrRequest,
sizeof(CSR_API_MESSAGE));
Request = RtlAllocateHeap(RtlGetProcessHeap(), 0,
max(sizeof(CSR_API_MESSAGE),
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR)
+ CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR)
+ min (nChars, CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR / CharSize) * CharSize));
if (Request == NULL)
{
Status = CsrClientCallServer(Request,
NULL,
CsrRequest,
- max (sizeof(CSR_API_MESSAGE),
+ max (sizeof(CSR_API_MESSAGE),
CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR) + SizeBytes));
if(!NT_SUCCESS(Status) || !NT_SUCCESS(Request->Status))
{
Request = RtlAllocateHeap(RtlGetProcessHeap(), 0,
max (sizeof(CSR_API_MESSAGE),
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR)
+ CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR)
+ min (nChars, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR / CharSize) * CharSize));
if (Request == NULL)
{
memcpy(Request->Data.WriteConsoleOutputCharRequest.String, lpCharacter, BytesWrite);
- Status = CsrClientCallServer(Request,
+ Status = CsrClientCallServer(Request,
NULL,
CsrRequest,
max (sizeof(CSR_API_MESSAGE),
Request->Data.WriteConsoleOutputAttribRequest.Length = Size;
memcpy(Request->Data.WriteConsoleOutputAttribRequest.Attribute, lpAttribute, Size * sizeof(WORD));
- Status = CsrClientCallServer( Request,
- NULL,
- CsrRequest,
+ 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);
)
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
-
+
NTSTATUS Status;
CsrRequest = MAKE_CSR_API(FILL_OUTPUT_ATTRIB, CSR_CONSOLE);
)
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
-
+
NTSTATUS Status;
CsrRequest = MAKE_CSR_API(GET_CONSOLE_MODE, CSR_CONSOLE);
)
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
-
+
NTSTATUS Status;
if(lpNumberOfEvents == NULL)
)
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
-
+
NTSTATUS Status;
CsrRequest = MAKE_CSR_API(GET_CURSOR_INFO, CSR_CONSOLE);
)
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
-
+
NTSTATUS Status;
CsrRequest = MAKE_CSR_API(SET_CONSOLE_MODE, CSR_CONSOLE);
)
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
-
+
NTSTATUS Status;
CsrRequest = MAKE_CSR_API(SET_SCREEN_BUFFER, CSR_CONSOLE);
)
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
-
+
NTSTATUS Status;
CsrRequest = MAKE_CSR_API(FLUSH_INPUT_BUFFER, CSR_CONSOLE);
)
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
-
+
NTSTATUS Status;
CsrRequest = MAKE_CSR_API(SET_CURSOR_INFO, CSR_CONSOLE);
BOOL bUnicode)
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
-
+
NTSTATUS Status;
CsrRequest = MAKE_CSR_API(SCROLL_CONSOLE_SCREEN_BUFFER, CSR_CONSOLE);
)
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
-
+
NTSTATUS Status;
CsrRequest = MAKE_CSR_API(SET_ATTRIB, CSR_CONSOLE);
CsrRequest = MAKE_CSR_API(GENERATE_CTRL_EVENT, CSR_CONSOLE);
Request.Data.GenerateCtrlEvent.Event = dwCtrlEvent;
Request.Data.GenerateCtrlEvent.ProcessGroup = dwProcessGroupId;
- Status = CsrClientCallServer(&Request,
- NULL,
- CsrRequest,
+ Status = CsrClientCallServer(&Request,
+ NULL,
+ CsrRequest,
sizeof(CSR_API_MESSAGE));
if(!NT_SUCCESS(Status) || !(NT_SUCCESS(Status = Request.Status)))
{
SetLastErrorByStatus(Status);
return FALSE;
}
-
+
return TRUE;
}
CsrRequest = MAKE_CSR_API(GET_TITLE, CSR_CONSOLE);
- Status = CsrClientCallServer(Request,
- NULL,
- CsrRequest,
+ Status = CsrClientCallServer(Request,
+ NULL,
+ CsrRequest,
CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_TITLE) + CSRSS_MAX_TITLE_LENGTH * sizeof(WCHAR));
if(!NT_SUCCESS(Status) || !(NT_SUCCESS(Status = Request->Status)))
{
}
memcpy(lpConsoleTitle, Request->Data.GetTitleRequest.Title, nSize * sizeof(WCHAR));
lpConsoleTitle[nSize] = L'\0';
-
+
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
return nSize;
Request = RtlAllocateHeap(RtlGetProcessHeap(), 0,
max (sizeof(CSR_API_MESSAGE),
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE) +
+ CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE) +
min (wcslen(lpConsoleTitle), CSRSS_MAX_TITLE_LENGTH) * sizeof(WCHAR)));
if (Request == NULL)
{
Request = RtlAllocateHeap(RtlGetProcessHeap(), 0,
max (sizeof(CSR_API_MESSAGE),
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE) +
+ CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE) +
min (strlen(lpConsoleTitle), CSRSS_MAX_TITLE_LENGTH) * sizeof(WCHAR)));
if (Request == NULL)
{
GetConsoleCP( VOID )
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
-
+
NTSTATUS Status;
CsrRequest = MAKE_CSR_API(GET_CONSOLE_CP, CSR_CONSOLE);
)
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
-
+
NTSTATUS Status;
CsrRequest = MAKE_CSR_API(SET_CONSOLE_CP, CSR_CONSOLE);
GetConsoleOutputCP( VOID )
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
-
+
NTSTATUS Status;
CsrRequest = MAKE_CSR_API(GET_CONSOLE_OUTPUT_CP, CSR_CONSOLE);
)
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
-
+
NTSTATUS Status;
CsrRequest = MAKE_CSR_API(SET_CONSOLE_OUTPUT_CP, CSR_CONSOLE);
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return FALSE;
}
-
+
CsrRequest = MAKE_CSR_API(GET_PROCESS_LIST, CSR_CONSOLE);
Request->Data.GetProcessListRequest.nMaxIds = min (dwProcessCount, CSRSS_MAX_GET_PROCESS_LIST / sizeof(DWORD));
- Status = CsrClientCallServer(Request,
+ Status = CsrClientCallServer(Request,
NULL,
CsrRequest,
max (sizeof(CSR_API_MESSAGE),
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST)
+ CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST)
+ Request->Data.GetProcessListRequest.nMaxIds * sizeof(DWORD)));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request->Status))
{
GetConsoleWindow (VOID)
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
-
+
NTSTATUS Status;
CsrRequest = MAKE_CSR_API(GET_CONSOLE_WINDOW, CSR_CONSOLE);
BOOL WINAPI SetConsoleIcon(HICON hicon)
{
CSR_API_MESSAGE Request; ULONG CsrRequest;
-
+
NTSTATUS Status;
CsrRequest = MAKE_CSR_API(SET_CONSOLE_ICON, CSR_CONSOLE);
BOOL WINAPI
SetConsoleInputExeNameW(LPCWSTR lpInputExeName)
{
- BOOL Ret = FALSE;
int lenName = lstrlenW(lpInputExeName);
if(lenName < 1 ||
}
RtlEnterCriticalSection(&ConsoleLock);
- /* wrap copying into SEH as we may copy from invalid buffer and in case of an
- exception the console lock would've never been released, which would cause
- further calls (if the exception was handled by the caller) to recursively
- acquire the lock... */
_SEH2_TRY
{
RtlCopyMemory(InputExeName, lpInputExeName, lenName * sizeof(WCHAR));
InputExeName[lenName] = L'\0';
- Ret = TRUE;
}
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ _SEH2_FINALLY
{
- lenName = 0;
- SetLastErrorByStatus(_SEH2_GetExceptionCode());
+ RtlLeaveCriticalSection(&ConsoleLock);
}
_SEH2_END;
- RtlLeaveCriticalSection(&ConsoleLock);
- return Ret;
+ return TRUE;
}
DWORD WINAPI
GetConsoleInputExeNameW(DWORD nBufferLength, LPWSTR lpBuffer)
{
- int lenName;
+ int lenName = 0;
RtlEnterCriticalSection(&ConsoleLock);
- lenName = lstrlenW(InputExeName);
- if(lenName >= (int)nBufferLength)
- {
- /* buffer is not large enough, return the required size */
- RtlLeaveCriticalSection(&ConsoleLock);
- SetLastError(ERROR_BUFFER_OVERFLOW);
- return lenName + 1;
- }
-
- /* wrap copying into SEH as we may copy to invalid buffer and in case of an
- exception the console lock would've never been released, which would cause
- further calls (if the exception was handled by the caller) to recursively
- acquire the lock... */
_SEH2_TRY
{
+ lenName = lstrlenW(InputExeName);
+ if(lenName >= (int)nBufferLength)
+ {
+ /* buffer is not large enough, return the required size */
+ SetLastError(ERROR_BUFFER_OVERFLOW);
+ lenName += 1;
+ }
RtlCopyMemory(lpBuffer, InputExeName, (lenName + 1) * sizeof(WCHAR));
}
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ _SEH2_FINALLY
{
- lenName = 0;
- SetLastErrorByStatus(_SEH2_GetExceptionCode());
+ RtlLeaveCriticalSection(&ConsoleLock);
}
_SEH2_END;
- RtlLeaveCriticalSection(&ConsoleLock);
-
return lenName;
}