BOOL bInheritHandle,
DWORD dwShareMode)
{
- CSR_API_MESSAGE Request;
- ULONG CsrRequest;
NTSTATUS Status = STATUS_SUCCESS;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCSRSS_OPEN_CONSOLE OpenConsoleRequest = &ApiMessage.Data.OpenConsoleRequest;
+ HANDLE_TYPE HandleType;
if (wsName && 0 == _wcsicmp(wsName, L"CONIN$"))
{
- CsrRequest = CSR_CREATE_API_NUMBER(CSR_NATIVE, GET_INPUT_HANDLE);
+ HandleType = HANDLE_INPUT;
}
else if (wsName && 0 == _wcsicmp(wsName, L"CONOUT$"))
{
- CsrRequest = CSR_CREATE_API_NUMBER(CSR_NATIVE, GET_OUTPUT_HANDLE);
+ HandleType = HANDLE_OUTPUT;
}
else
{
SetLastError(ERROR_INVALID_PARAMETER);
- return(INVALID_HANDLE_VALUE);
+ return INVALID_HANDLE_VALUE;
}
- if (dwDesiredAccess & ~(GENERIC_READ|GENERIC_WRITE))
+ if (dwDesiredAccess & ~(GENERIC_READ | GENERIC_WRITE))
{
SetLastError(ERROR_INVALID_PARAMETER);
- return(INVALID_HANDLE_VALUE);
+ return INVALID_HANDLE_VALUE;
}
- if (dwShareMode & ~(FILE_SHARE_READ|FILE_SHARE_WRITE))
+ if (dwShareMode & ~(FILE_SHARE_READ | FILE_SHARE_WRITE))
{
SetLastError(ERROR_INVALID_PARAMETER);
- return(INVALID_HANDLE_VALUE);
+ return INVALID_HANDLE_VALUE;
}
- /* Structures for GET_INPUT_HANDLE and GET_OUTPUT_HANDLE requests are identical */
- Request.Data.GetInputHandleRequest.Access = dwDesiredAccess;
- Request.Data.GetInputHandleRequest.Inheritable = bInheritHandle;
- Request.Data.GetInputHandleRequest.ShareMode = dwShareMode;
+ OpenConsoleRequest->HandleType = HandleType;
+ OpenConsoleRequest->Access = dwDesiredAccess;
+ OpenConsoleRequest->Inheritable = bInheritHandle;
+ OpenConsoleRequest->ShareMode = dwShareMode;
- Status = CsrClientCallServer(&Request,
+ Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
NULL,
- CsrRequest,
- sizeof(CSR_API_MESSAGE));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepOpenConsole),
+ sizeof(CSRSS_OPEN_CONSOLE));
+ if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = ApiMessage.Status))
{
BaseSetLastNTError(Status);
return INVALID_HANDLE_VALUE;
}
- return Request.Data.GetInputHandleRequest.Handle;
+ return OpenConsoleRequest->Handle;
}
// Some names are also deduced from the subsystems/win32/csrss/csrsrv/server.c ones.
typedef enum _CONSRV_API_NUMBER
{
- // ConsolepOpenConsole = CONSRV_FIRST_API_NUMBER,
- ConsolepGetConsoleInput = CONSRV_FIRST_API_NUMBER,
+ ConsolepOpenConsole = CONSRV_FIRST_API_NUMBER,
+ ConsolepGetConsoleInput,
ConsolepWriteConsoleInput,
ConsolepReadConsoleOutput,
ConsolepWriteConsoleOutput,
DWORD Options;
} CSRSS_DUPLICATE_HANDLE, *PCSRSS_DUPLICATE_HANDLE;
+/*
+ * Type of handles.
+ */
+typedef enum _HANDLE_TYPE
+{
+ HANDLE_INPUT = 0x01,
+ HANDLE_OUTPUT = 0x02
+} HANDLE_TYPE;
+
typedef struct
{
+ HANDLE Handle;
+ HANDLE_TYPE HandleType;
DWORD Access;
BOOL Inheritable;
- HANDLE Handle;
DWORD ShareMode;
-} CSRSS_GET_INPUT_HANDLE, *PCSRSS_GET_INPUT_HANDLE,
- CSRSS_GET_OUTPUT_HANDLE, *PCSRSS_GET_OUTPUT_HANDLE;
+} CSRSS_OPEN_CONSOLE, *PCSRSS_OPEN_CONSOLE;
typedef struct
{
CSRSS_FREE_CONSOLE FreeConsoleRequest;
/* Handles */
- CSRSS_GET_INPUT_HANDLE GetInputHandleRequest;
- CSRSS_GET_OUTPUT_HANDLE GetOutputHandleRequest;
+ CSRSS_OPEN_CONSOLE OpenConsoleRequest;
CSRSS_CLOSE_HANDLE CloseHandleRequest;
CSRSS_VERIFY_HANDLE VerifyHandleRequest;
CSRSS_DUPLICATE_HANDLE DuplicateHandleRequest;
/* FUNCTIONS *****************************************************************/
-/*** Taken from win32ss/user/win32csr/desktopbg.c ***/
BOOL FASTCALL
DtbgIsDesktopVisible(VOID)
{
return VisibleDesktopWindow != NULL;
}
-/****************************************************/
NTSTATUS FASTCALL
-ConioConsoleFromProcessData(PCSR_PROCESS ProcessData, PCSRSS_CONSOLE *Console)
+ConioConsoleFromProcessData(PCONSOLE_PROCESS_DATA ProcessData,
+ PCSRSS_CONSOLE *Console)
{
PCSRSS_CONSOLE ProcessConsole;
}
VOID FASTCALL
-ConioConsoleCtrlEventTimeout(DWORD Event, PCSR_PROCESS ProcessData, DWORD Timeout)
+ConioConsoleCtrlEventTimeout(DWORD Event,
+ PCONSOLE_PROCESS_DATA ProcessData,
+ DWORD Timeout)
{
HANDLE Thread;
- DPRINT("ConioConsoleCtrlEvent Parent ProcessId = %x\n", ProcessData->ClientId.UniqueProcess);
+ DPRINT("ConioConsoleCtrlEvent Parent ProcessId = %x\n", ProcessData->Process->ClientId.UniqueProcess);
if (ProcessData->CtrlDispatcher)
{
-
- Thread = CreateRemoteThread(ProcessData->ProcessHandle, NULL, 0,
- (LPTHREAD_START_ROUTINE) ProcessData->CtrlDispatcher,
+ Thread = CreateRemoteThread(ProcessData->Process->ProcessHandle, NULL, 0,
+ ProcessData->CtrlDispatcher,
UlongToPtr(Event), 0, NULL);
if (NULL == Thread)
{
DPRINT1("Failed thread creation (Error: 0x%x)\n", GetLastError());
return;
}
+
WaitForSingleObject(Thread, Timeout);
CloseHandle(Thread);
}
}
VOID FASTCALL
-ConioConsoleCtrlEvent(DWORD Event, PCSR_PROCESS ProcessData)
+ConioConsoleCtrlEvent(DWORD Event, PCONSOLE_PROCESS_DATA ProcessData)
{
ConioConsoleCtrlEventTimeout(Event, ProcessData, 0);
}
PCSRSS_SCREEN_BUFFER NewBuffer;
BOOL GuiMode;
WCHAR Title[255];
- HINSTANCE hInst;
Console->Title.MaximumLength = Console->Title.Length = 0;
Console->Title.Buffer = NULL;
- hInst = GetModuleHandleW(L"win32csr");
- if (LoadStringW(hInst,IDS_COMMAND_PROMPT,Title,sizeof(Title)/sizeof(Title[0])))
+ if (LoadStringW(ConSrvDllInstance, IDS_COMMAND_PROMPT, Title, sizeof(Title) / sizeof(Title[0])))
{
RtlCreateUnicodeString(&Console->Title, Title);
}
/* make console active, and insert into console list */
Console->ActiveBuffer = (PCSRSS_SCREEN_BUFFER) NewBuffer;
- if (! GuiMode)
+ if (!GuiMode)
{
Status = TuiInitConsole(Console);
- if (! NT_SUCCESS(Status))
+ if (!NT_SUCCESS(Status))
{
DPRINT1("Failed to open text-mode console, switching to gui-mode\n");
GuiMode = TRUE;
else /* GuiMode */
{
Status = GuiInitConsole(Console, ShowCmd);
- if (! NT_SUCCESS(Status))
+ if (!NT_SUCCESS(Status))
{
HeapFree(ConSrvHeap,0, NewBuffer);
RtlFreeUnicodeString(&Console->Title);
return STATUS_SUCCESS;
}
+CSR_API(SrvOpenConsole)
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+ PCSRSS_OPEN_CONSOLE OpenConsoleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.OpenConsoleRequest;
+ PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrGetClientThread()->Process);
+
+ DPRINT("SrvOpenConsole\n");
+
+ OpenConsoleRequest->Handle = INVALID_HANDLE_VALUE;
+
+ RtlEnterCriticalSection(&ProcessData->HandleTableLock);
+
+ DPRINT1("SrvOpenConsole - Checkpoint 1\n");
+ DPRINT1("ProcessData = 0x%p ; ProcessData->Console = 0x%p\n", ProcessData, ProcessData->Console);
+
+ if (ProcessData->Console)
+ {
+ DWORD DesiredAccess = OpenConsoleRequest->Access;
+ DWORD ShareMode = OpenConsoleRequest->ShareMode;
+
+ PCSRSS_CONSOLE Console = ProcessData->Console;
+ Object_t *Object;
+
+ DPRINT1("SrvOpenConsole - Checkpoint 2\n");
+ EnterCriticalSection(&Console->Lock);
+ DPRINT1("SrvOpenConsole - Checkpoint 3\n");
+
+ if (OpenConsoleRequest->HandleType == HANDLE_OUTPUT)
+ Object = &Console->ActiveBuffer->Header;
+ else // HANDLE_INPUT
+ Object = &Console->Header;
+
+ if (((DesiredAccess & GENERIC_READ) && Object->ExclusiveRead != 0) ||
+ ((DesiredAccess & GENERIC_WRITE) && Object->ExclusiveWrite != 0) ||
+ (!(ShareMode & FILE_SHARE_READ) && Object->AccessRead != 0) ||
+ (!(ShareMode & FILE_SHARE_WRITE) && Object->AccessWrite != 0))
+ {
+ DPRINT1("Sharing violation\n");
+ Status = STATUS_SHARING_VIOLATION;
+ }
+ else
+ {
+ Status = Win32CsrInsertObject(ProcessData,
+ &OpenConsoleRequest->Handle,
+ Object,
+ DesiredAccess,
+ OpenConsoleRequest->Inheritable,
+ ShareMode);
+ }
+
+ LeaveCriticalSection(&Console->Lock);
+ }
+
+ RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
+
+ return Status;
+}
+
CSR_API(SrvAllocConsole)
{
PCSRSS_ALLOC_CONSOLE AllocConsoleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.AllocConsoleRequest;