mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 08:25:03 +00:00
[KERNEL32/CONSRV]
- Make OpenConsole call only one server api, namely SrvOpenConsole, which was known before under the name CsrGetHandle (this latter function was removed in r57689 by error). - Merge CSRSS_GET_INPUT_HANDLE and CSRSS_GET_OUTPUT_HANDLE structures into CSRSS_OPEN_CONSOLE (used by the functions named above). [CONSRV] - Add SrvOpenConsole (copied from CsrGetHandle), and add DPRINT1s to it. - Load the localized string "Command Prompt" using the Server DLL's instance handle instead of calling GetModuleHandleW. - Make use of CONSOLE_PROCESS_DATA structures. svn path=/branches/ros-csrss/; revision=57723
This commit is contained in:
parent
8a4c1b3d26
commit
dab294603f
3 changed files with 106 additions and 40 deletions
|
@ -389,52 +389,53 @@ OpenConsoleW(LPCWSTR wsName,
|
|||
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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -20,8 +20,8 @@
|
|||
// 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,
|
||||
|
@ -392,14 +392,23 @@ typedef struct
|
|||
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
|
||||
{
|
||||
|
@ -575,8 +584,7 @@ typedef struct _CONSOLE_API_MESSAGE
|
|||
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;
|
||||
|
|
|
@ -17,7 +17,6 @@
|
|||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
/*** Taken from win32ss/user/win32csr/desktopbg.c ***/
|
||||
BOOL FASTCALL
|
||||
DtbgIsDesktopVisible(VOID)
|
||||
{
|
||||
|
@ -31,10 +30,10 @@ 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;
|
||||
|
||||
|
@ -57,30 +56,32 @@ ConioConsoleFromProcessData(PCSR_PROCESS ProcessData, PCSRSS_CONSOLE *Console)
|
|||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
@ -93,13 +94,11 @@ CsrInitConsole(PCSRSS_CONSOLE Console, int ShowCmd)
|
|||
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);
|
||||
}
|
||||
|
@ -150,10 +149,10 @@ CsrInitConsole(PCSRSS_CONSOLE Console, int ShowCmd)
|
|||
/* 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;
|
||||
|
@ -162,7 +161,7 @@ CsrInitConsole(PCSRSS_CONSOLE Console, int ShowCmd)
|
|||
else /* GuiMode */
|
||||
{
|
||||
Status = GuiInitConsole(Console, ShowCmd);
|
||||
if (! NT_SUCCESS(Status))
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
HeapFree(ConSrvHeap,0, NewBuffer);
|
||||
RtlFreeUnicodeString(&Console->Title);
|
||||
|
@ -191,6 +190,64 @@ CsrInitConsole(PCSRSS_CONSOLE Console, int ShowCmd)
|
|||
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;
|
||||
|
|
Loading…
Reference in a new issue