[KERNEL32/CONSRV]

- Use new structures and api indices namings (as usual).

[CONSRV]
- Merge CSRSS_SET_TITLE and CSRSS_GET_TITLE into CSRSS_CONSOLE_TITLE.
- Merge CSRSS_GET_CONSOLE_(OUTPUT_)CP and CSRSS_SET_CONSOLE_(OUTPUT_)CP into CSRSS_CONSOLE_CP.
- NtDuplicateObject(GetCurrentProcess(), ... ---> NtDuplicateObject(NtCurrentProcess(), ...
- Use CsrValidateMessageBuffer instead of Win32CsrValidateBuffer.
- Use CONSOLE_PROCESS_DATA structure.

TODO: Remove a DPRINT1 checkpoint in SrvAllocConsole after future tests are OK.

svn path=/branches/ros-csrss/; revision=57727
This commit is contained in:
Hermès Bélusca-Maïto 2012-11-18 13:10:03 +00:00
parent 3a0d4c3269
commit de31fffea8
4 changed files with 229 additions and 253 deletions

View file

@ -1448,8 +1448,8 @@ WINAPI
GenerateConsoleCtrlEvent(DWORD dwCtrlEvent, GenerateConsoleCtrlEvent(DWORD dwCtrlEvent,
DWORD dwProcessGroupId) DWORD dwProcessGroupId)
{ {
CSR_API_MESSAGE Request;
NTSTATUS Status; NTSTATUS Status;
CONSOLE_API_MESSAGE ApiMessage;
if (dwCtrlEvent != CTRL_C_EVENT && dwCtrlEvent != CTRL_BREAK_EVENT) if (dwCtrlEvent != CTRL_C_EVENT && dwCtrlEvent != CTRL_BREAK_EVENT)
{ {
@ -1457,14 +1457,14 @@ GenerateConsoleCtrlEvent(DWORD dwCtrlEvent,
return FALSE; return FALSE;
} }
Request.Data.GenerateCtrlEvent.Event = dwCtrlEvent; ApiMessage.Data.GenerateCtrlEvent.Event = dwCtrlEvent;
Request.Data.GenerateCtrlEvent.ProcessGroup = dwProcessGroupId; ApiMessage.Data.GenerateCtrlEvent.ProcessGroup = dwProcessGroupId;
Status = CsrClientCallServer(&Request, Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
NULL, NULL,
CSR_CREATE_API_NUMBER(CSR_CONSOLE, GENERATE_CTRL_EVENT), CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGenerateCtrlEvent),
sizeof(CSR_API_MESSAGE)); sizeof(CSRSS_GENERATE_CTRL_EVENT));
if(!NT_SUCCESS(Status) || !(NT_SUCCESS(Status = Request.Status))) if(!NT_SUCCESS(Status) || !(NT_SUCCESS(Status = ApiMessage.Status)))
{ {
BaseSetLastNTError(Status); BaseSetLastNTError(Status);
return FALSE; return FALSE;
@ -1477,15 +1477,16 @@ GenerateConsoleCtrlEvent(DWORD dwCtrlEvent,
static DWORD static DWORD
IntGetConsoleTitle(LPVOID lpConsoleTitle, DWORD nSize, BOOL bUnicode) IntGetConsoleTitle(LPVOID lpConsoleTitle, DWORD nSize, BOOL bUnicode)
{ {
CSR_API_MESSAGE Request;
PCSR_CAPTURE_BUFFER CaptureBuffer;
NTSTATUS Status; NTSTATUS Status;
CONSOLE_API_MESSAGE ApiMessage;
PCSRSS_CONSOLE_TITLE TitleRequest = &ApiMessage.Data.TitleRequest;
PCSR_CAPTURE_BUFFER CaptureBuffer;
if (nSize == 0) if (nSize == 0)
return 0; return 0;
Request.Data.GetTitleRequest.Length = nSize * (bUnicode ? 1 : sizeof(WCHAR)); TitleRequest->Length = nSize * (bUnicode ? 1 : sizeof(WCHAR));
CaptureBuffer = CsrAllocateCaptureBuffer(1, Request.Data.GetTitleRequest.Length); CaptureBuffer = CsrAllocateCaptureBuffer(1, TitleRequest->Length);
if (CaptureBuffer == NULL) if (CaptureBuffer == NULL)
{ {
DPRINT1("CsrAllocateCaptureBuffer failed!\n"); DPRINT1("CsrAllocateCaptureBuffer failed!\n");
@ -1494,14 +1495,14 @@ IntGetConsoleTitle(LPVOID lpConsoleTitle, DWORD nSize, BOOL bUnicode)
} }
CsrAllocateMessagePointer(CaptureBuffer, CsrAllocateMessagePointer(CaptureBuffer,
Request.Data.GetTitleRequest.Length, TitleRequest->Length,
(PVOID*)&Request.Data.GetTitleRequest.Title); (PVOID*)&TitleRequest->Title);
Status = CsrClientCallServer(&Request, Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
CaptureBuffer, CaptureBuffer,
CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_TITLE), CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetTitle),
sizeof(CSR_API_MESSAGE)); sizeof(CSRSS_CONSOLE_TITLE));
if (!NT_SUCCESS(Status) || !(NT_SUCCESS(Status = Request.Status))) if (!NT_SUCCESS(Status) || !(NT_SUCCESS(Status = ApiMessage.Status)))
{ {
CsrFreeCaptureBuffer(CaptureBuffer); CsrFreeCaptureBuffer(CaptureBuffer);
BaseSetLastNTError(Status); BaseSetLastNTError(Status);
@ -1511,14 +1512,14 @@ IntGetConsoleTitle(LPVOID lpConsoleTitle, DWORD nSize, BOOL bUnicode)
if (bUnicode) if (bUnicode)
{ {
if (nSize >= sizeof(WCHAR)) if (nSize >= sizeof(WCHAR))
wcscpy((LPWSTR)lpConsoleTitle, Request.Data.GetTitleRequest.Title); wcscpy((LPWSTR)lpConsoleTitle, TitleRequest->Title);
} }
else else
{ {
if (nSize < Request.Data.GetTitleRequest.Length / sizeof(WCHAR) || if (nSize < TitleRequest->Length / sizeof(WCHAR) ||
!WideCharToMultiByte(CP_ACP, // ANSI code page !WideCharToMultiByte(CP_ACP, // ANSI code page
0, // performance and mapping flags 0, // performance and mapping flags
Request.Data.GetTitleRequest.Title, // address of wide-character string TitleRequest->Title, // address of wide-character string
-1, // number of characters in string -1, // number of characters in string
(LPSTR)lpConsoleTitle, // address of buffer for new string (LPSTR)lpConsoleTitle, // address of buffer for new string
nSize, // size of buffer nSize, // size of buffer
@ -1527,14 +1528,15 @@ IntGetConsoleTitle(LPVOID lpConsoleTitle, DWORD nSize, BOOL bUnicode)
{ {
/* Yes, if the buffer isn't big enough, it returns 0... Bad API */ /* Yes, if the buffer isn't big enough, it returns 0... Bad API */
*(LPSTR)lpConsoleTitle = '\0'; *(LPSTR)lpConsoleTitle = '\0';
Request.Data.GetTitleRequest.Length = 0; TitleRequest->Length = 0;
} }
} }
CsrFreeCaptureBuffer(CaptureBuffer); CsrFreeCaptureBuffer(CaptureBuffer);
return Request.Data.GetTitleRequest.Length / sizeof(WCHAR); return TitleRequest->Length / sizeof(WCHAR);
} }
/*-------------------------------------------------------------- /*--------------------------------------------------------------
* GetConsoleTitleW * GetConsoleTitleW
* *
@ -1548,6 +1550,7 @@ GetConsoleTitleW(LPWSTR lpConsoleTitle,
return IntGetConsoleTitle(lpConsoleTitle, nSize, TRUE); return IntGetConsoleTitle(lpConsoleTitle, nSize, TRUE);
} }
/*-------------------------------------------------------------- /*--------------------------------------------------------------
* GetConsoleTitleA * GetConsoleTitleA
* *
@ -1571,13 +1574,14 @@ BOOL
WINAPI WINAPI
SetConsoleTitleW(LPCWSTR lpConsoleTitle) SetConsoleTitleW(LPCWSTR lpConsoleTitle)
{ {
CSR_API_MESSAGE Request;
PCSR_CAPTURE_BUFFER CaptureBuffer;
NTSTATUS Status; NTSTATUS Status;
CONSOLE_API_MESSAGE ApiMessage;
PCSRSS_CONSOLE_TITLE TitleRequest = &ApiMessage.Data.TitleRequest;
PCSR_CAPTURE_BUFFER CaptureBuffer;
Request.Data.SetTitleRequest.Length = wcslen(lpConsoleTitle) * sizeof(WCHAR); TitleRequest->Length = wcslen(lpConsoleTitle) * sizeof(WCHAR);
CaptureBuffer = CsrAllocateCaptureBuffer(1, Request.Data.SetTitleRequest.Length); CaptureBuffer = CsrAllocateCaptureBuffer(1, TitleRequest->Length);
if (CaptureBuffer == NULL) if (CaptureBuffer == NULL)
{ {
DPRINT1("CsrAllocateCaptureBuffer failed!\n"); DPRINT1("CsrAllocateCaptureBuffer failed!\n");
@ -1587,17 +1591,17 @@ SetConsoleTitleW(LPCWSTR lpConsoleTitle)
CsrCaptureMessageBuffer(CaptureBuffer, CsrCaptureMessageBuffer(CaptureBuffer,
(PVOID)lpConsoleTitle, (PVOID)lpConsoleTitle,
Request.Data.SetTitleRequest.Length, TitleRequest->Length,
(PVOID*)&Request.Data.SetTitleRequest.Title); (PVOID*)&TitleRequest->Title);
Status = CsrClientCallServer(&Request, Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
CaptureBuffer, CaptureBuffer,
CSR_CREATE_API_NUMBER(CSR_CONSOLE, SET_TITLE), CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetTitle),
sizeof(CSR_API_MESSAGE)); sizeof(CSRSS_CONSOLE_TITLE));
CsrFreeCaptureBuffer(CaptureBuffer); CsrFreeCaptureBuffer(CaptureBuffer);
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status)) if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = ApiMessage.Status))
{ {
BaseSetLastNTError(Status); BaseSetLastNTError(Status);
return FALSE; return FALSE;
@ -1683,20 +1687,23 @@ UINT
WINAPI WINAPI
GetConsoleCP(VOID) GetConsoleCP(VOID)
{ {
CSR_API_MESSAGE Request;
NTSTATUS Status; NTSTATUS Status;
CONSOLE_API_MESSAGE ApiMessage;
Status = CsrClientCallServer(&Request, /* Get the Input Code Page */
ApiMessage.Data.ConsoleCPRequest.InputCP = TRUE;
Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
NULL, NULL,
CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_CONSOLE_CP), CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetCP),
sizeof(CSR_API_MESSAGE)); sizeof(CSRSS_CONSOLE_CP));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status)) if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = ApiMessage.Status))
{ {
BaseSetLastNTError (Status); BaseSetLastNTError(Status);
return 0; return 0;
} }
return Request.Data.GetConsoleCodePage.CodePage; return ApiMessage.Data.ConsoleCPRequest.CodePage;
} }
@ -1709,16 +1716,18 @@ BOOL
WINAPI WINAPI
SetConsoleCP(UINT wCodePageID) SetConsoleCP(UINT wCodePageID)
{ {
CSR_API_MESSAGE Request;
NTSTATUS Status; NTSTATUS Status;
CONSOLE_API_MESSAGE ApiMessage;
Request.Data.SetConsoleCodePage.CodePage = wCodePageID; /* Set the Input Code Page */
ApiMessage.Data.ConsoleCPRequest.InputCP = TRUE;
ApiMessage.Data.ConsoleCPRequest.CodePage = wCodePageID;
Status = CsrClientCallServer(&Request, Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
NULL, NULL,
CSR_CREATE_API_NUMBER(CSR_CONSOLE, SET_CONSOLE_CP), CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetCP),
sizeof(CSR_API_MESSAGE)); sizeof(CSRSS_CONSOLE_CP));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status)) if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = ApiMessage.Status))
{ {
BaseSetLastNTError(Status); BaseSetLastNTError(Status);
} }
@ -1736,20 +1745,23 @@ UINT
WINAPI WINAPI
GetConsoleOutputCP(VOID) GetConsoleOutputCP(VOID)
{ {
CSR_API_MESSAGE Request;
NTSTATUS Status; NTSTATUS Status;
CONSOLE_API_MESSAGE ApiMessage;
Status = CsrClientCallServer(&Request, /* Get the Output Code Page */
ApiMessage.Data.ConsoleCPRequest.InputCP = FALSE;
Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
NULL, NULL,
CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_CONSOLE_OUTPUT_CP), CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetCP),
sizeof(CSR_API_MESSAGE)); sizeof(CSRSS_CONSOLE_CP));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status)) if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = ApiMessage.Status))
{ {
BaseSetLastNTError (Status); BaseSetLastNTError (Status);
return 0; return 0;
} }
return Request.Data.GetConsoleOutputCodePage.CodePage; return ApiMessage.Data.ConsoleCPRequest.CodePage;
} }
@ -1762,16 +1774,18 @@ BOOL
WINAPI WINAPI
SetConsoleOutputCP(UINT wCodePageID) SetConsoleOutputCP(UINT wCodePageID)
{ {
CSR_API_MESSAGE Request;
NTSTATUS Status; NTSTATUS Status;
CONSOLE_API_MESSAGE ApiMessage;
Request.Data.SetConsoleOutputCodePage.CodePage = wCodePageID; /* Set the Output Code Page */
ApiMessage.Data.ConsoleCPRequest.InputCP = FALSE;
ApiMessage.Data.ConsoleCPRequest.CodePage = wCodePageID;
Status = CsrClientCallServer(&Request, Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
NULL, NULL,
CSR_CREATE_API_NUMBER(CSR_CONSOLE, SET_CONSOLE_OUTPUT_CP), CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetCP),
sizeof(CSR_API_MESSAGE)); sizeof(CSRSS_CONSOLE_CP));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status)) if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = ApiMessage.Status))
{ {
BaseSetLastNTError(Status); BaseSetLastNTError(Status);
} }
@ -1790,10 +1804,11 @@ WINAPI
GetConsoleProcessList(LPDWORD lpdwProcessList, GetConsoleProcessList(LPDWORD lpdwProcessList,
DWORD dwProcessCount) DWORD dwProcessCount)
{ {
PCSR_CAPTURE_BUFFER CaptureBuffer;
CSR_API_MESSAGE Request;
ULONG nProcesses;
NTSTATUS Status; NTSTATUS Status;
CONSOLE_API_MESSAGE ApiMessage;
PCSRSS_GET_PROCESS_LIST GetProcessListRequest = &ApiMessage.Data.GetProcessListRequest;
PCSR_CAPTURE_BUFFER CaptureBuffer;
ULONG nProcesses;
if (lpdwProcessList == NULL || dwProcessCount == 0) if (lpdwProcessList == NULL || dwProcessCount == 0)
{ {
@ -1809,26 +1824,27 @@ GetConsoleProcessList(LPDWORD lpdwProcessList,
return FALSE; return FALSE;
} }
Request.Data.GetProcessListRequest.nMaxIds = dwProcessCount; GetProcessListRequest->nMaxIds = dwProcessCount;
CsrAllocateMessagePointer(CaptureBuffer, CsrAllocateMessagePointer(CaptureBuffer,
dwProcessCount * sizeof(DWORD), dwProcessCount * sizeof(DWORD),
(PVOID*)&Request.Data.GetProcessListRequest.ProcessId); (PVOID*)&GetProcessListRequest->pProcessIds);
Status = CsrClientCallServer(&Request, Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
CaptureBuffer, CaptureBuffer,
CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_PROCESS_LIST), CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetProcessList),
sizeof(CSR_API_MESSAGE)); sizeof(CSRSS_GET_PROCESS_LIST));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status)) if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = ApiMessage.Status))
{ {
BaseSetLastNTError (Status); BaseSetLastNTError (Status);
nProcesses = 0; nProcesses = 0;
} }
else else
{ {
nProcesses = Request.Data.GetProcessListRequest.nProcessIdsTotal; nProcesses = GetProcessListRequest->nProcessIdsTotal;
if (dwProcessCount >= nProcesses) if (dwProcessCount >= nProcesses)
{ {
memcpy(lpdwProcessList, Request.Data.GetProcessListRequest.ProcessId, nProcesses * sizeof(DWORD)); memcpy(lpdwProcessList, GetProcessListRequest->pProcessIds, nProcesses * sizeof(DWORD));
} }
} }
@ -2134,22 +2150,6 @@ GetConsoleNlsMode(HANDLE hConsole, LPDWORD lpMode)
return FALSE; return FALSE;
} }
BOOL
WINAPI
RegisterConsoleIME(HWND hWnd, LPDWORD ThreadId)
{
STUB;
return FALSE;
}
BOOL
WINAPI
RegisterConsoleOS2(BOOL bUnknown)
{
STUB;
return FALSE;
}
BOOL BOOL
WINAPI WINAPI
SetConsoleCursorMode(HANDLE hConsole, BOOL Unknown1, BOOL Unknown2) SetConsoleCursorMode(HANDLE hConsole, BOOL Unknown1, BOOL Unknown2)
@ -2174,6 +2174,22 @@ SetConsoleNlsMode(HANDLE hConsole, DWORD dwMode)
return FALSE; return FALSE;
} }
BOOL
WINAPI
RegisterConsoleIME(HWND hWnd, LPDWORD ThreadId)
{
STUB;
return FALSE;
}
BOOL
WINAPI
RegisterConsoleOS2(BOOL bUnknown)
{
STUB;
return FALSE;
}
BOOL BOOL
WINAPI WINAPI
SetConsoleOS2OemFormat(BOOL bUnknown) SetConsoleOS2OemFormat(BOOL bUnknown)

View file

@ -126,7 +126,7 @@ typedef enum _CONSRV_API_NUMBER
typedef struct typedef struct
{ {
USHORT nMaxIds; USHORT nMaxIds;
PDWORD ProcessId; PDWORD pProcessIds;
ULONG nProcessIdsTotal; ULONG nProcessIdsTotal;
} CSRSS_GET_PROCESS_LIST, *PCSRSS_GET_PROCESS_LIST; } CSRSS_GET_PROCESS_LIST, *PCSRSS_GET_PROCESS_LIST;
@ -260,13 +260,7 @@ typedef struct
{ {
DWORD Length; DWORD Length;
PWCHAR Title; PWCHAR Title;
} CSRSS_SET_TITLE, *PCSRSS_SET_TITLE; } CSRSS_CONSOLE_TITLE, *PCSRSS_CONSOLE_TITLE;
typedef struct
{
DWORD Length;
PWCHAR Title;
} CSRSS_GET_TITLE, *PCSRSS_GET_TITLE;
typedef struct typedef struct
{ {
@ -540,23 +534,9 @@ typedef struct
typedef struct typedef struct
{ {
BOOL InputCP; // TRUE : Input Code Page ; FALSE : Output Code Page
UINT CodePage; UINT CodePage;
} CSRSS_GET_CONSOLE_CP, *PCSRSS_GET_CONSOLE_CP; } CSRSS_CONSOLE_CP, *PCSRSS_CONSOLE_CP;
typedef struct
{
UINT CodePage;
} CSRSS_SET_CONSOLE_CP, *PCSRSS_SET_CONSOLE_CP;
typedef struct
{
UINT CodePage;
} CSRSS_GET_CONSOLE_OUTPUT_CP, *PCSRSS_GET_CONSOLE_OUTPUT_CP;
typedef struct
{
UINT CodePage;
} CSRSS_SET_CONSOLE_OUTPUT_CP, *PCSRSS_SET_CONSOLE_OUTPUT_CP;
typedef struct _CONSOLE_API_MESSAGE typedef struct _CONSOLE_API_MESSAGE
{ {
@ -597,8 +577,7 @@ typedef struct _CONSOLE_API_MESSAGE
CSRSS_CONSOLE_HW_STATE ConsoleHardwareStateRequest; CSRSS_CONSOLE_HW_STATE ConsoleHardwareStateRequest;
/* Console window */ /* Console window */
CSRSS_SET_TITLE SetTitleRequest; CSRSS_CONSOLE_TITLE TitleRequest;
CSRSS_GET_TITLE GetTitleRequest;
CSRSS_GET_CONSOLE_WINDOW GetConsoleWindowRequest; CSRSS_GET_CONSOLE_WINDOW GetConsoleWindowRequest;
CSRSS_SET_CONSOLE_ICON SetConsoleIconRequest; CSRSS_SET_CONSOLE_ICON SetConsoleIconRequest;
@ -636,11 +615,8 @@ typedef struct _CONSOLE_API_MESSAGE
CSRSS_GENERATE_CTRL_EVENT GenerateCtrlEvent; CSRSS_GENERATE_CTRL_EVENT GenerateCtrlEvent;
CSRSS_GET_NUM_INPUT_EVENTS GetNumInputEventsRequest; CSRSS_GET_NUM_INPUT_EVENTS GetNumInputEventsRequest;
/* CodePage */ /* Input and Output Code Pages */
CSRSS_GET_CONSOLE_CP GetConsoleCodePage; CSRSS_CONSOLE_CP ConsoleCPRequest;
CSRSS_SET_CONSOLE_CP SetConsoleCodePage;
CSRSS_GET_CONSOLE_OUTPUT_CP GetConsoleOutputCodePage;
CSRSS_SET_CONSOLE_OUTPUT_CP SetConsoleOutputCodePage;
CSRSS_GET_PROCESS_LIST GetProcessListRequest; CSRSS_GET_PROCESS_LIST GetProcessListRequest;
} Data; } Data;

View file

@ -556,7 +556,7 @@ CSR_API(SrvWriteConsole)
if (Console->UnpauseEvent) if (Console->UnpauseEvent)
{ {
Status = NtDuplicateObject(GetCurrentProcess(), Console->UnpauseEvent, Status = NtDuplicateObject(NtCurrentProcess(), Console->UnpauseEvent,
ProcessData->ProcessHandle, &WriteConsoleRequest->UnpauseEvent, ProcessData->ProcessHandle, &WriteConsoleRequest->UnpauseEvent,
SYNCHRONIZE, 0, 0); SYNCHRONIZE, 0, 0);
ConioUnlockScreenBuffer(Buff); ConioUnlockScreenBuffer(Buff);

View file

@ -62,7 +62,7 @@ ConioConsoleCtrlEventTimeout(DWORD Event,
{ {
HANDLE Thread; HANDLE Thread;
DPRINT("ConioConsoleCtrlEvent Parent ProcessId = %x\n", ProcessData->Process->ClientId.UniqueProcess); DPRINT("ConioConsoleCtrlEvent Parent pProcessIds = %x\n", ProcessData->Process->ClientId.UniqueProcess);
if (ProcessData->CtrlDispatcher) if (ProcessData->CtrlDispatcher)
{ {
@ -250,15 +250,16 @@ CSR_API(SrvOpenConsole)
CSR_API(SrvAllocConsole) CSR_API(SrvAllocConsole)
{ {
PCSRSS_ALLOC_CONSOLE AllocConsoleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.AllocConsoleRequest;
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process;
PCSRSS_CONSOLE Console;
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
PCSRSS_ALLOC_CONSOLE AllocConsoleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.AllocConsoleRequest;
PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrGetClientThread()->Process);
PCSRSS_CONSOLE Console;
BOOLEAN NewConsole = FALSE; BOOLEAN NewConsole = FALSE;
DPRINT("SrvAllocConsole\n"); DPRINT("SrvAllocConsole\n");
RtlEnterCriticalSection(&ProcessData->HandleTableLock); RtlEnterCriticalSection(&ProcessData->HandleTableLock);
if (ProcessData->Console) if (ProcessData->Console)
{ {
DPRINT1("Process already has a console\n"); DPRINT1("Process already has a console\n");
@ -266,6 +267,8 @@ CSR_API(SrvAllocConsole)
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
} }
DPRINT1("SrvAllocConsole - Checkpoint 1\n");
/* If we don't need a console, then get out of here */ /* If we don't need a console, then get out of here */
if (!AllocConsoleRequest->ConsoleNeeded) if (!AllocConsoleRequest->ConsoleNeeded)
{ {
@ -276,7 +279,7 @@ CSR_API(SrvAllocConsole)
/* If we already have one, then don't create a new one... */ /* If we already have one, then don't create a new one... */
if (!AllocConsoleRequest->Console || if (!AllocConsoleRequest->Console ||
AllocConsoleRequest->Console != ProcessData->ParentConsole) AllocConsoleRequest->Console != ProcessData->ParentConsole)
{ {
/* Allocate a console structure */ /* Allocate a console structure */
NewConsole = TRUE; NewConsole = TRUE;
@ -287,10 +290,13 @@ CSR_API(SrvAllocConsole)
RtlLeaveCriticalSection(&ProcessData->HandleTableLock); RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
return STATUS_NO_MEMORY; return STATUS_NO_MEMORY;
} }
/* initialize list head */
/* Initialize list head */
InitializeListHead(&Console->ProcessList); InitializeListHead(&Console->ProcessList);
/* insert process data required for GUI initialization */
/* Insert process data required for GUI initialization */
InsertHeadList(&Console->ProcessList, &ProcessData->ConsoleLink); InsertHeadList(&Console->ProcessList, &ProcessData->ConsoleLink);
/* Initialize the Console */ /* Initialize the Console */
Status = CsrInitConsole(Console, AllocConsoleRequest->ShowCmd); Status = CsrInitConsole(Console, AllocConsoleRequest->ShowCmd);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
@ -329,7 +335,7 @@ CSR_API(SrvAllocConsole)
{ {
DPRINT1("Failed to insert object\n"); DPRINT1("Failed to insert object\n");
ConioDeleteConsole((Object_t *) Console); ConioDeleteConsole((Object_t *) Console);
ProcessData->Console = 0; ProcessData->Console = NULL;
RtlLeaveCriticalSection(&ProcessData->HandleTableLock); RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
return Status; return Status;
} }
@ -346,22 +352,21 @@ CSR_API(SrvAllocConsole)
ConioDeleteConsole((Object_t *) Console); ConioDeleteConsole((Object_t *) Console);
Win32CsrReleaseObject(ProcessData, Win32CsrReleaseObject(ProcessData,
AllocConsoleRequest->InputHandle); AllocConsoleRequest->InputHandle);
ProcessData->Console = 0; ProcessData->Console = NULL;
RtlLeaveCriticalSection(&ProcessData->HandleTableLock); RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
return Status; return Status;
} }
} }
/* Duplicate the Event */ /* Duplicate the Event */
if (!DuplicateHandle(GetCurrentProcess(), Status = NtDuplicateObject(NtCurrentProcess(),
ProcessData->Console->ActiveEvent, ProcessData->Console->ActiveEvent,
ProcessData->ProcessHandle, ProcessData->Process->ProcessHandle,
&ProcessData->ConsoleEvent, &ProcessData->ConsoleEvent,
EVENT_ALL_ACCESS, EVENT_ALL_ACCESS, 0, 0);
FALSE, if (!NT_SUCCESS(Status))
0))
{ {
DPRINT1("DuplicateHandle() failed: %lu\n", GetLastError()); DPRINT1("NtDuplicateObject() failed: %lu\n", Status);
ConioDeleteConsole((Object_t *) Console); ConioDeleteConsole((Object_t *) Console);
if (NewConsole || !ProcessData->bInheritHandles) if (NewConsole || !ProcessData->bInheritHandles)
{ {
@ -370,7 +375,7 @@ CSR_API(SrvAllocConsole)
Win32CsrReleaseObject(ProcessData, Win32CsrReleaseObject(ProcessData,
AllocConsoleRequest->InputHandle); AllocConsoleRequest->InputHandle);
} }
ProcessData->Console = 0; ProcessData->Console = NULL;
RtlLeaveCriticalSection(&ProcessData->HandleTableLock); RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
return Status; return Status;
} }
@ -531,31 +536,41 @@ CSR_API(SrvGetConsoleMode)
CSR_API(SrvSetConsoleTitle) CSR_API(SrvSetConsoleTitle)
{ {
NTSTATUS Status; NTSTATUS Status;
PCSRSS_SET_TITLE SetTitleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetTitleRequest; PCSRSS_CONSOLE_TITLE TitleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.TitleRequest;
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process; // PCSR_PROCESS Process = CsrGetClientThread()->Process;
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
PWCHAR Buffer; PWCHAR Buffer;
DPRINT("SrvSetConsoleTitle\n"); DPRINT("SrvSetConsoleTitle\n");
if (!Win32CsrValidateBuffer(ProcessData, SetTitleRequest->Title, if (!CsrValidateMessageBuffer(ApiMessage,
SetTitleRequest->Length, 1)) (PVOID)&TitleRequest->Title,
TitleRequest->Length,
sizeof(BYTE)))
{
return STATUS_INVALID_PARAMETER;
}
/*
if (!Win32CsrValidateBuffer(Process, TitleRequest->Title,
TitleRequest->Length, 1))
{ {
return STATUS_ACCESS_VIOLATION; return STATUS_ACCESS_VIOLATION;
} }
*/
Status = ConioConsoleFromProcessData(ProcessData, &Console); Status = ConioConsoleFromProcessData(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console);
if(NT_SUCCESS(Status)) if(NT_SUCCESS(Status))
{ {
Buffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, SetTitleRequest->Length); Buffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, TitleRequest->Length);
if (Buffer) if (Buffer)
{ {
/* copy title to console */ /* Copy title to console */
RtlFreeUnicodeString(&Console->Title); RtlFreeUnicodeString(&Console->Title);
Console->Title.Buffer = Buffer; Console->Title.Buffer = Buffer;
Console->Title.Length = Console->Title.MaximumLength = SetTitleRequest->Length; Console->Title.Length = Console->Title.MaximumLength = TitleRequest->Length;
memcpy(Console->Title.Buffer, SetTitleRequest->Title, Console->Title.Length); memcpy(Console->Title.Buffer, TitleRequest->Title, Console->Title.Length);
if (! ConioChangeTitle(Console))
if (!ConioChangeTitle(Console))
{ {
Status = STATUS_UNSUCCESSFUL; Status = STATUS_UNSUCCESSFUL;
} }
@ -568,6 +583,7 @@ CSR_API(SrvSetConsoleTitle)
{ {
Status = STATUS_NO_MEMORY; Status = STATUS_NO_MEMORY;
} }
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
} }
@ -577,35 +593,44 @@ CSR_API(SrvSetConsoleTitle)
CSR_API(SrvGetConsoleTitle) CSR_API(SrvGetConsoleTitle)
{ {
NTSTATUS Status; NTSTATUS Status;
PCSRSS_GET_TITLE GetTitleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetTitleRequest; PCSRSS_CONSOLE_TITLE TitleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.TitleRequest;
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process; // PCSR_PROCESS Process = CsrGetClientThread()->Process;
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
DWORD Length; DWORD Length;
DPRINT("SrvGetConsoleTitle\n"); DPRINT("SrvGetConsoleTitle\n");
if (!Win32CsrValidateBuffer(ProcessData, GetTitleRequest->Title, if (!CsrValidateMessageBuffer(ApiMessage,
GetTitleRequest->Length, 1)) (PVOID)&TitleRequest->Title,
TitleRequest->Length,
sizeof(BYTE)))
{
return STATUS_INVALID_PARAMETER;
}
/*
if (!Win32CsrValidateBuffer(Process, TitleRequest->Title,
TitleRequest->Length, 1))
{ {
return STATUS_ACCESS_VIOLATION; return STATUS_ACCESS_VIOLATION;
} }
*/
Status = ConioConsoleFromProcessData(ProcessData, &Console); Status = ConioConsoleFromProcessData(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console);
if (! NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DPRINT1("Can't get console\n"); DPRINT1("Can't get console\n");
return Status; return Status;
} }
/* Copy title of the console to the user title buffer */ /* Copy title of the console to the user title buffer */
if (GetTitleRequest->Length >= sizeof(WCHAR)) if (TitleRequest->Length >= sizeof(WCHAR))
{ {
Length = min(GetTitleRequest->Length - sizeof(WCHAR), Console->Title.Length); Length = min(TitleRequest->Length - sizeof(WCHAR), Console->Title.Length);
memcpy(GetTitleRequest->Title, Console->Title.Buffer, Length); memcpy(TitleRequest->Title, Console->Title.Buffer, Length);
GetTitleRequest->Title[Length / sizeof(WCHAR)] = L'\0'; TitleRequest->Title[Length / sizeof(WCHAR)] = L'\0';
} }
GetTitleRequest->Length = Console->Title.Length; TitleRequest->Length = Console->Title.Length;
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
return STATUS_SUCCESS; return STATUS_SUCCESS;
@ -699,17 +724,14 @@ CSR_API(SrvSetConsoleHardwareState)
CSR_API(SrvGetConsoleWindow) CSR_API(SrvGetConsoleWindow)
{ {
NTSTATUS Status;
PCSRSS_GET_CONSOLE_WINDOW GetConsoleWindowRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetConsoleWindowRequest; PCSRSS_GET_CONSOLE_WINDOW GetConsoleWindowRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetConsoleWindowRequest;
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
NTSTATUS Status;
DPRINT("SrvGetConsoleWindow\n"); DPRINT("SrvGetConsoleWindow\n");
Status = ConioConsoleFromProcessData(CsrGetClientThread()->Process, &Console); Status = ConioConsoleFromProcessData(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console);
if (! NT_SUCCESS(Status)) if (!NT_SUCCESS(Status)) return Status;
{
return Status;
}
GetConsoleWindowRequest->WindowHandle = Console->hWindow; GetConsoleWindowRequest->WindowHandle = Console->hWindow;
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
@ -719,20 +741,19 @@ CSR_API(SrvGetConsoleWindow)
CSR_API(SrvSetConsoleIcon) CSR_API(SrvSetConsoleIcon)
{ {
NTSTATUS Status;
PCSRSS_SET_CONSOLE_ICON SetConsoleIconRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetConsoleIconRequest; PCSRSS_SET_CONSOLE_ICON SetConsoleIconRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetConsoleIconRequest;
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
NTSTATUS Status;
DPRINT("SrvSetConsoleIcon\n"); DPRINT("SrvSetConsoleIcon\n");
Status = ConioConsoleFromProcessData(CsrGetClientThread()->Process, &Console); Status = ConioConsoleFromProcessData(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console);
if (! NT_SUCCESS(Status)) if (!NT_SUCCESS(Status)) return Status;
{
return Status;
}
Status = (ConioChangeIcon(Console, SetConsoleIconRequest->WindowIcon) Status = (ConioChangeIcon(Console, SetConsoleIconRequest->WindowIcon)
? STATUS_SUCCESS : STATUS_UNSUCCESSFUL); ? STATUS_SUCCESS
: STATUS_UNSUCCESSFUL);
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
return Status; return Status;
@ -740,84 +761,41 @@ CSR_API(SrvSetConsoleIcon)
CSR_API(SrvGetConsoleCP) CSR_API(SrvGetConsoleCP)
{ {
PCSRSS_GET_CONSOLE_CP GetConsoleCodePage = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetConsoleCodePage;
PCSRSS_CONSOLE Console;
NTSTATUS Status; NTSTATUS Status;
PCSRSS_CONSOLE_CP ConsoleCPRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ConsoleCPRequest;
DPRINT("SrvGetConsoleCP\n");
Status = ConioConsoleFromProcessData(CsrGetClientThread()->Process, &Console);
if (! NT_SUCCESS(Status))
{
return Status;
}
GetConsoleCodePage->CodePage = Console->CodePage;
ConioUnlockConsole(Console);
return STATUS_SUCCESS;
}
CSR_API(CsrGetConsoleOutputCodePage) // TODO: Merge this function with the other one.
{
PCSRSS_GET_CONSOLE_OUTPUT_CP GetConsoleOutputCodePage = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetConsoleOutputCodePage;
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
NTSTATUS Status;
DPRINT("CsrGetConsoleOutputCodePage\n"); DPRINT("SrvGetConsoleCP, getting %s Code Page\n",
ConsoleCPRequest->InputCP ? "Input" : "Output");
Status = ConioConsoleFromProcessData(CsrGetClientThread()->Process, &Console); Status = ConioConsoleFromProcessData(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console);
if (! NT_SUCCESS(Status)) if (!NT_SUCCESS(Status)) return Status;
{
return Status;
}
GetConsoleOutputCodePage->CodePage = Console->OutputCodePage; ConsoleCPRequest->CodePage = (ConsoleCPRequest->InputCP ? Console->CodePage
: Console->OutputCodePage);
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
CSR_API(SrvSetConsoleCP) CSR_API(SrvSetConsoleCP)
{ {
PCSRSS_SET_CONSOLE_CP SetConsoleCodePage = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetConsoleCodePage;
PCSRSS_CONSOLE Console;
NTSTATUS Status; NTSTATUS Status;
PCSRSS_CONSOLE_CP ConsoleCPRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ConsoleCPRequest;
DPRINT("SrvSetConsoleCP\n");
Status = ConioConsoleFromProcessData(CsrGetClientThread()->Process, &Console);
if (! NT_SUCCESS(Status))
{
return Status;
}
if (IsValidCodePage(SetConsoleCodePage->CodePage))
{
Console->CodePage = SetConsoleCodePage->CodePage;
ConioUnlockConsole(Console);
return STATUS_SUCCESS;
}
ConioUnlockConsole(Console);
return STATUS_INVALID_PARAMETER;
}
CSR_API(CsrSetConsoleOutputCodePage) // TODO: Merge this function with the other one.
{
PCSRSS_SET_CONSOLE_OUTPUT_CP SetConsoleOutputCodePage = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetConsoleOutputCodePage;
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
NTSTATUS Status;
DPRINT("CsrSetConsoleOutputCodePage\n"); DPRINT("SrvSetConsoleCP, setting %s Code Page\n",
ConsoleCPRequest->InputCP ? "Input" : "Output");
Status = ConioConsoleFromProcessData(CsrGetClientThread()->Process, &Console); Status = ConioConsoleFromProcessData(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console);
if (! NT_SUCCESS(Status)) if (!NT_SUCCESS(Status)) return Status;
if (IsValidCodePage(ConsoleCPRequest->CodePage))
{ {
return Status; if (ConsoleCPRequest->InputCP)
} Console->CodePage = ConsoleCPRequest->CodePage;
else
Console->OutputCodePage = ConsoleCPRequest->CodePage;
if (IsValidCodePage(SetConsoleOutputCodePage->CodePage))
{
Console->OutputCodePage = SetConsoleOutputCodePage->CodePage;
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -828,35 +806,43 @@ CSR_API(CsrSetConsoleOutputCodePage) // TODO: Merge this function with the other
CSR_API(SrvGetConsoleProcessList) CSR_API(SrvGetConsoleProcessList)
{ {
NTSTATUS Status;
PCSRSS_GET_PROCESS_LIST GetProcessListRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetProcessListRequest; PCSRSS_GET_PROCESS_LIST GetProcessListRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetProcessListRequest;
PDWORD Buffer; PDWORD Buffer;
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process; // PCSR_PROCESS Process = CsrGetClientThread()->Process;
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
PCSR_PROCESS current; PCONSOLE_PROCESS_DATA current;
PLIST_ENTRY current_entry; PLIST_ENTRY current_entry;
ULONG nItems = 0; ULONG nItems = 0;
NTSTATUS Status;
DPRINT("SrvGetConsoleProcessList\n"); DPRINT("SrvGetConsoleProcessList\n");
Buffer = GetProcessListRequest->ProcessId; if (!CsrValidateMessageBuffer(ApiMessage,
(PVOID)&GetProcessListRequest->pProcessIds,
GetProcessListRequest->nMaxIds,
sizeof(DWORD)))
{
return STATUS_INVALID_PARAMETER;
}
Buffer = GetProcessListRequest->pProcessIds;
/*
if (!Win32CsrValidateBuffer(ProcessData, Buffer, GetProcessListRequest->nMaxIds, sizeof(DWORD))) if (!Win32CsrValidateBuffer(ProcessData, Buffer, GetProcessListRequest->nMaxIds, sizeof(DWORD)))
return STATUS_ACCESS_VIOLATION; return STATUS_ACCESS_VIOLATION;
*/
Status = ConioConsoleFromProcessData(ProcessData, &Console); Status = ConioConsoleFromProcessData(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console);
if (! NT_SUCCESS(Status)) if (!NT_SUCCESS(Status)) return Status;
{
return Status;
}
for (current_entry = Console->ProcessList.Flink; for (current_entry = Console->ProcessList.Flink;
current_entry != &Console->ProcessList; current_entry != &Console->ProcessList;
current_entry = current_entry->Flink) current_entry = current_entry->Flink)
{ {
current = CONTAINING_RECORD(current_entry, CSR_PROCESS, ConsoleLink); current = CONTAINING_RECORD(current_entry, CONSOLE_PROCESS_DATA, ConsoleLink);
if (++nItems <= GetProcessListRequest->nMaxIds) if (++nItems <= GetProcessListRequest->nMaxIds)
{ {
*Buffer++ = HandleToUlong(current->ClientId.UniqueProcess); *Buffer++ = HandleToUlong(current->Process->ClientId.UniqueProcess);
} }
} }
@ -868,27 +854,24 @@ CSR_API(SrvGetConsoleProcessList)
CSR_API(SrvGenerateConsoleCtrlEvent) CSR_API(SrvGenerateConsoleCtrlEvent)
{ {
NTSTATUS Status;
PCSRSS_GENERATE_CTRL_EVENT GenerateCtrlEvent = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GenerateCtrlEvent; PCSRSS_GENERATE_CTRL_EVENT GenerateCtrlEvent = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GenerateCtrlEvent;
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
PCSR_PROCESS current; PCONSOLE_PROCESS_DATA current;
PLIST_ENTRY current_entry; PLIST_ENTRY current_entry;
DWORD Group; DWORD Group;
NTSTATUS Status;
Status = ConioConsoleFromProcessData(CsrGetClientThread()->Process, &Console); Status = ConioConsoleFromProcessData(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console);
if (! NT_SUCCESS(Status)) if (!NT_SUCCESS(Status)) return Status;
{
return Status;
}
Group = GenerateCtrlEvent->ProcessGroup; Group = GenerateCtrlEvent->ProcessGroup;
Status = STATUS_INVALID_PARAMETER; Status = STATUS_INVALID_PARAMETER;
for (current_entry = Console->ProcessList.Flink; for (current_entry = Console->ProcessList.Flink;
current_entry != &Console->ProcessList; current_entry != &Console->ProcessList;
current_entry = current_entry->Flink) current_entry = current_entry->Flink)
{ {
current = CONTAINING_RECORD(current_entry, CSR_PROCESS, ConsoleLink); current = CONTAINING_RECORD(current_entry, CONSOLE_PROCESS_DATA, ConsoleLink);
if (Group == 0 || current->ProcessGroupId == Group) if (Group == 0 || current->Process->ProcessGroupId == Group)
{ {
ConioConsoleCtrlEvent(GenerateCtrlEvent->Event, current); ConioConsoleCtrlEvent(GenerateCtrlEvent->Event, current);
Status = STATUS_SUCCESS; Status = STATUS_SUCCESS;
@ -906,7 +889,7 @@ CSR_API(SrvGetConsoleSelectionInfo)
PCSRSS_GET_CONSOLE_SELECTION_INFO GetConsoleSelectionInfo = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetConsoleSelectionInfo; PCSRSS_GET_CONSOLE_SELECTION_INFO GetConsoleSelectionInfo = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetConsoleSelectionInfo;
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
Status = ConioConsoleFromProcessData(CsrGetClientThread()->Process, &Console); Status = ConioConsoleFromProcessData(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
memset(&GetConsoleSelectionInfo->Info, 0, sizeof(CONSOLE_SELECTION_INFO)); memset(&GetConsoleSelectionInfo->Info, 0, sizeof(CONSOLE_SELECTION_INFO));
@ -914,6 +897,7 @@ CSR_API(SrvGetConsoleSelectionInfo)
GetConsoleSelectionInfo->Info = Console->Selection; GetConsoleSelectionInfo->Info = Console->Selection;
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
} }
return Status; return Status;
} }