- Further compactify console allocation / attach code by putting common code into helper functions.
- Now, the default title of a console window is... "ReactOS Console" (and not command prompt since a console window isn't only reserved to command prompts).

svn path=/branches/ros-csrss/; revision=58260
This commit is contained in:
Hermès Bélusca-Maïto 2013-02-01 23:36:23 +00:00
parent 03d1c009f0
commit 54293ba008
25 changed files with 152 additions and 151 deletions

View file

@ -121,13 +121,13 @@ ConSrvInitConsole(PCONSOLE* NewConsole, int ShowCmd, PCSR_PROCESS ConsoleLeaderP
Console->Title.MaximumLength = Console->Title.Length = 0;
Console->Title.Buffer = NULL;
if (LoadStringW(ConSrvDllInstance, IDS_COMMAND_PROMPT, Title, sizeof(Title) / sizeof(Title[0])))
if (LoadStringW(ConSrvDllInstance, IDS_CONSOLE_TITLE, Title, sizeof(Title) / sizeof(Title[0])))
{
RtlCreateUnicodeString(&Console->Title, Title);
}
else
{
RtlCreateUnicodeString(&Console->Title, L"Command Prompt");
RtlCreateUnicodeString(&Console->Title, L"ReactOS Console");
}
InitializeCriticalSection(&Console->Lock);
@ -364,10 +364,6 @@ CSR_API(SrvAllocConsole)
return STATUS_ACCESS_DENIED;
}
/******************************************************************************/
/** This comes from ConSrvConnect!! **/
DPRINT1("SrvAllocConsole - Checkpoint 1\n");
/*
* We are about to create a new console. However when ConSrvNewProcess
* was called, we didn't know that we wanted to create a new console and
@ -383,36 +379,17 @@ CSR_API(SrvAllocConsole)
/* Initialize a new Console owned by the Console Leader Process */
Status = ConSrvAllocateConsole(ProcessData,
&AllocConsoleRequest->InputHandle,
&AllocConsoleRequest->OutputHandle,
&AllocConsoleRequest->ErrorHandle,
AllocConsoleRequest->ShowCmd,
ConsoleLeader);
&AllocConsoleRequest->InputHandle,
&AllocConsoleRequest->OutputHandle,
&AllocConsoleRequest->ErrorHandle,
AllocConsoleRequest->ShowCmd,
ConsoleLeader);
if (!NT_SUCCESS(Status))
{
DPRINT1("Console allocation failed\n");
return Status;
}
/* Add a reference count because the process is tied to the console */
_InterlockedIncrement(&ProcessData->Console->ReferenceCount);
/* Insert the process into the processes list of the console */
InsertHeadList(&ProcessData->Console->ProcessList, &ProcessData->ConsoleLink);
/* Duplicate the Event */
Status = NtDuplicateObject(NtCurrentProcess(),
ProcessData->Console->InputBuffer.ActiveEvent,
ProcessData->Process->ProcessHandle,
&ProcessData->ConsoleEvent,
EVENT_ALL_ACCESS, 0, 0);
if (!NT_SUCCESS(Status))
{
DPRINT1("NtDuplicateObject() failed: %lu\n", Status);
ConSrvRemoveConsole(ProcessData);
return Status;
}
/* Return it to the caller */
AllocConsoleRequest->Console = ProcessData->Console;
@ -422,7 +399,6 @@ CSR_API(SrvAllocConsole)
/* Set the Ctrl Dispatcher */
ProcessData->CtrlDispatcher = AllocConsoleRequest->CtrlDispatcher;
DPRINT("CONSRV: CtrlDispatcher address: %x\n", ProcessData->CtrlDispatcher);
/******************************************************************************/
return STATUS_SUCCESS;
}
@ -446,6 +422,7 @@ CSR_API(SrvAttachConsole)
return STATUS_ACCESS_DENIED;
}
/* Check whether we try to attach to the parent's console */
if (ProcessId == ULongToHandle(ATTACH_PARENT_PROCESS))
{
PROCESS_BASIC_INFORMATION ProcessInfo;
@ -468,17 +445,20 @@ CSR_API(SrvAttachConsole)
DPRINT("Parent process ID = %lu\n", ProcessId);
}
/* Lock the target process via its PID */
DPRINT1("Lock process Id %lu\n", ProcessId);
/* Lock the source process via its PID */
Status = CsrLockProcessByClientId(ProcessId, &SourceProcess);
DPRINT1("Lock process Status %lu\n", Status);
DPRINT1("Lock process Id %lu - Status %lu\n", ProcessId, Status);
if (!NT_SUCCESS(Status)) return Status;
DPRINT1("AttachConsole OK\n");
/******************************************************************************/
/** This comes from ConSrvNewProcess!! **/
SourceProcessData = ConsoleGetPerProcessData(SourceProcess);
DPRINT1("SourceProcessData->Console = 0x%p\n", SourceProcessData->Console);
if (SourceProcessData->Console == NULL)
{
Status = STATUS_INVALID_HANDLE;
goto Quit;
}
/*
* We are about to create a new console. However when ConSrvNewProcess
* was called, we didn't know that we wanted to create a new console and
@ -496,54 +476,15 @@ CSR_API(SrvAttachConsole)
* Inherit the console from the parent,
* if any, otherwise return an error.
*/
DPRINT1("SourceProcessData->Console = 0x%p\n", SourceProcessData->Console);
if (SourceProcessData->Console == NULL)
{
Status = STATUS_INVALID_HANDLE;
goto Quit;
}
TargetProcessData->Console = SourceProcessData->Console;
/// REMARK: This code comes from ConSrvAllocateConsole.
/* Initialize the handles table */
Status = ConSrvInitHandlesTable(TargetProcessData,
&AttachConsoleRequest->InputHandle,
&AttachConsoleRequest->OutputHandle,
&AttachConsoleRequest->ErrorHandle);
Status = ConSrvInheritConsole(TargetProcessData,
SourceProcessData->Console,
TRUE,
&AttachConsoleRequest->InputHandle,
&AttachConsoleRequest->OutputHandle,
&AttachConsoleRequest->ErrorHandle);
if (!NT_SUCCESS(Status))
{
DPRINT1("Failed to initialize the handles table\n");
// ConSrvRemoveConsole(TargetProcessData);
TargetProcessData->Console = NULL;
goto Quit;
}
/******************************************************************************/
/******************************************************************************/
/** This comes from ConSrvConnect / SrvAllocConsole!! **/
/* Add a reference count because the process is tied to the console */
_InterlockedIncrement(&TargetProcessData->Console->ReferenceCount);
/* Insert the process into the processes list of the console */
InsertHeadList(&TargetProcessData->Console->ProcessList, &TargetProcessData->ConsoleLink);
/** Here, we inherited the console handles from the "source" process,
** so no need to reinitialize the handles table. **/
DPRINT1("SrvAttachConsole - Checkpoint\n");
/* Duplicate the Event */
Status = NtDuplicateObject(NtCurrentProcess(),
TargetProcessData->Console->InputBuffer.ActiveEvent,
TargetProcessData->Process->ProcessHandle,
&TargetProcessData->ConsoleEvent,
EVENT_ALL_ACCESS, 0, 0);
if (!NT_SUCCESS(Status))
{
DPRINT1("NtDuplicateObject() failed: %lu\n", Status);
ConSrvRemoveConsole(TargetProcessData);
DPRINT1("Console inheritance failed\n");
goto Quit;
}
@ -558,14 +499,10 @@ CSR_API(SrvAttachConsole)
DPRINT("CONSRV: CtrlDispatcher address: %x\n", TargetProcessData->CtrlDispatcher);
Status = STATUS_SUCCESS;
/******************************************************************************/
Quit:
DPRINT1("SrvAttachConsole - exiting 1\n");
/* Unlock the "source" process */
/* Unlock the "source" process and exit */
CsrUnlockProcess(SourceProcess);
DPRINT1("SrvAttachConsole - exiting 2\n");
return Status;
}

View file

@ -183,6 +183,12 @@ NTSTATUS FASTCALL ConSrvAllocateConsole(PCONSOLE_PROCESS_DATA ProcessData,
PHANDLE pErrorHandle,
int ShowCmd,
PCSR_PROCESS CsrProcess);
NTSTATUS FASTCALL ConSrvInheritConsole(PCONSOLE_PROCESS_DATA ProcessData,
struct _CONSOLE* Console,
BOOL CreateNewHandlesTable,
PHANDLE pInputHandle,
PHANDLE pOutputHandle,
PHANDLE pErrorHandle);
VOID FASTCALL ConSrvRemoveConsole(PCONSOLE_PROCESS_DATA ProcessData);
NTSTATUS FASTCALL ConSrvGetConsole(PCONSOLE_PROCESS_DATA ProcessData,
struct _CONSOLE** Console,

View file

@ -420,21 +420,91 @@ ConSrvAllocateConsole(PCONSOLE_PROCESS_DATA ProcessData,
/* Initialize the handles table */
Status = ConSrvInitHandlesTable(ProcessData,
pInputHandle,
pOutputHandle,
pErrorHandle);
pInputHandle,
pOutputHandle,
pErrorHandle);
if (!NT_SUCCESS(Status))
{
DPRINT1("Failed to initialize the handles table\n");
// ConSrvRemoveConsole(ProcessData);
ConSrvDeleteConsole(ProcessData->Console);
ProcessData->Console = NULL;
return Status;
}
return Status;
/* Duplicate the Input Event */
Status = NtDuplicateObject(NtCurrentProcess(),
ProcessData->Console->InputBuffer.ActiveEvent,
ProcessData->Process->ProcessHandle,
&ProcessData->ConsoleEvent,
EVENT_ALL_ACCESS, 0, 0);
if (!NT_SUCCESS(Status))
{
DPRINT1("NtDuplicateObject() failed: %lu\n", Status);
ConSrvFreeHandlesTable(ProcessData);
ConSrvDeleteConsole(ProcessData->Console);
ProcessData->Console = NULL;
return Status;
}
/* Insert the process into the processes list of the console */
InsertHeadList(&ProcessData->Console->ProcessList, &ProcessData->ConsoleLink);
/* Add a reference count because the process is tied to the console */
_InterlockedIncrement(&ProcessData->Console->ReferenceCount);
return STATUS_SUCCESS;
}
NTSTATUS
FASTCALL
ConSrvInheritConsole(PCONSOLE_PROCESS_DATA ProcessData,
PCONSOLE Console,
BOOL CreateNewHandlesTable,
PHANDLE pInputHandle,
PHANDLE pOutputHandle,
PHANDLE pErrorHandle)
{
NTSTATUS Status = STATUS_SUCCESS;
/* Inherit the console */
ProcessData->Console = Console;
if (CreateNewHandlesTable)
{
/* Initialize the handles table */
Status = ConSrvInitHandlesTable(ProcessData,
pInputHandle,
pOutputHandle,
pErrorHandle);
if (!NT_SUCCESS(Status))
{
DPRINT1("Failed to initialize the handles table\n");
ProcessData->Console = NULL;
return Status;
}
}
/* Duplicate the Input Event */
Status = NtDuplicateObject(NtCurrentProcess(),
ProcessData->Console->InputBuffer.ActiveEvent,
ProcessData->Process->ProcessHandle,
&ProcessData->ConsoleEvent,
EVENT_ALL_ACCESS, 0, 0);
if (!NT_SUCCESS(Status))
{
DPRINT1("NtDuplicateObject() failed: %lu\n", Status);
ConSrvFreeHandlesTable(ProcessData); // NOTE: Always free the handles table.
ProcessData->Console = NULL;
return Status;
}
/* Insert the process into the processes list of the console */
InsertHeadList(&ProcessData->Console->ProcessList, &ProcessData->ConsoleLink);
/* Add a reference count because the process is tied to the console */
_InterlockedIncrement(&ProcessData->Console->ReferenceCount);
return STATUS_SUCCESS;
}
VOID
@ -521,7 +591,7 @@ ConSrvNewProcess(PCSR_PROCESS SourceProcess,
PCONSOLE_PROCESS_DATA SourceProcessData, TargetProcessData;
DPRINT1("ConSrvNewProcess inside\n");
DPRINT1("ConSrvNewProcess\n");
DPRINT1("SourceProcess = 0x%p ; TargetProcess = 0x%p\n", SourceProcess, TargetProcess);
/* An empty target process is invalid */
@ -565,17 +635,14 @@ ConSrvNewProcess(PCSR_PROCESS SourceProcess,
NTSTATUS Status;
Status = ConSrvInheritHandlesTable(SourceProcessData, TargetProcessData);
if (!NT_SUCCESS(Status))
{
return Status;
}
if (!NT_SUCCESS(Status)) return Status;
/* Temporary "inherit" the console from the parent */
/* Temporary save the parent's console */
TargetProcessData->ParentConsole = SourceProcessData->Console;
}
else
{
DPRINT1("ConSrvNewProcess - We don't launch a Console process : SourceProcessData->Console = 0x%p ; TargetProcess->Flags = %lu\n", SourceProcessData->Console, TargetProcess->Flags);
DPRINT1("ConSrvNewProcess - We don't inherit a handle table : SourceProcessData->Console = 0x%p ; TargetProcess->Flags = %lu\n", SourceProcessData->Console, TargetProcess->Flags);
}
return STATUS_SUCCESS;
@ -632,11 +699,11 @@ ConSrvConnect(IN PCSR_PROCESS CsrProcess,
/* Initialize a new Console owned by the Console Leader Process */
Status = ConSrvAllocateConsole(ProcessData,
&ConnectInfo->InputHandle,
&ConnectInfo->OutputHandle,
&ConnectInfo->ErrorHandle,
ConnectInfo->ShowCmd,
CsrProcess);
&ConnectInfo->InputHandle,
&ConnectInfo->OutputHandle,
&ConnectInfo->ErrorHandle,
ConnectInfo->ShowCmd,
CsrProcess);
if (!NT_SUCCESS(Status))
{
DPRINT1("Console allocation failed\n");
@ -648,27 +715,17 @@ ConSrvConnect(IN PCSR_PROCESS CsrProcess,
DPRINT1("ConSrvConnect - Reuse current (parent's) console\n");
/* Reuse our current console */
ProcessData->Console = ConnectInfo->Console;
}
/* Add a reference count because the process is tied to the console */
_InterlockedIncrement(&ProcessData->Console->ReferenceCount);
/* Insert the process into the processes list of the console */
InsertHeadList(&ProcessData->Console->ProcessList, &ProcessData->ConsoleLink);
/// TODO: Move this up ?
/* Duplicate the Event */
Status = NtDuplicateObject(NtCurrentProcess(),
ProcessData->Console->InputBuffer.ActiveEvent,
ProcessData->Process->ProcessHandle,
&ProcessData->ConsoleEvent,
EVENT_ALL_ACCESS, 0, 0);
if (!NT_SUCCESS(Status))
{
DPRINT1("NtDuplicateObject() failed: %lu\n", Status);
ConSrvRemoveConsole(ProcessData);
return Status;
Status = ConSrvInheritConsole(ProcessData,
ConnectInfo->Console,
FALSE,
NULL, // &ConnectInfo->InputHandle,
NULL, // &ConnectInfo->OutputHandle,
NULL); // &ConnectInfo->ErrorHandle);
if (!NT_SUCCESS(Status))
{
DPRINT1("Console inheritance failed\n");
return Status;
}
}
/* Return it to the caller */
@ -694,7 +751,8 @@ ConSrvDisconnect(PCSR_PROCESS Process)
* This function is called whenever a new process (GUI or CUI) is destroyed.
**************************************************************************/
DPRINT1("ConSrvDisconnect called\n");
DPRINT1("ConSrvDisconnect\n");
if ( ProcessData->Console != NULL ||
ProcessData->HandleTable != NULL )
{

View file

@ -25,5 +25,5 @@ BEGIN
IDS_SCROLLUP "Прелистване нагоре"
IDS_SCROLLDOWN "Прелистване надолу"
IDS_COMMAND_PROMPT "Command Prompt"
IDS_CONSOLE_TITLE "ReactOS Console"
END

View file

@ -24,5 +24,5 @@ BEGIN
IDS_SCROLLUP "Posunout nahoru"
IDS_SCROLLDOWN "Posunout dolù"
IDS_COMMAND_PROMPT "Pøíkazový øádek"
IDS_CONSOLE_TITLE "ReactOS Console"
END

View file

@ -19,5 +19,5 @@ BEGIN
IDS_SCROLLUP "Nach oben scrollen"
IDS_SCROLLDOWN "Nach unten scrollen"
IDS_COMMAND_PROMPT "Eingabeaufforderung"
IDS_CONSOLE_TITLE "ReactOS Console"
END

View file

@ -19,5 +19,5 @@ BEGIN
IDS_SCROLLUP "数腴箸 疖睐"
IDS_SCROLLDOWN "数腴箸 贶豉"
IDS_COMMAND_PROMPT "Command Prompt"
IDS_CONSOLE_TITLE "ReactOS Console"
END

View file

@ -19,5 +19,5 @@ BEGIN
IDS_SCROLLUP "Scroll up"
IDS_SCROLLDOWN "Scroll down"
IDS_COMMAND_PROMPT "Command Prompt"
IDS_CONSOLE_TITLE "ReactOS Console"
END

View file

@ -24,5 +24,5 @@ BEGIN
IDS_SCROLLUP "Desplazar arriba"
IDS_SCROLLDOWN "Desplazar abajo"
IDS_COMMAND_PROMPT "Command Prompt"
IDS_CONSOLE_TITLE "ReactOS Console"
END

View file

@ -21,5 +21,5 @@ BEGIN
IDS_SCROLLUP "Défiler en haut"
IDS_SCROLLDOWN "Défiler en bas"
IDS_COMMAND_PROMPT "Command Prompt"
IDS_CONSOLE_TITLE "ReactOS Console"
END

View file

@ -19,5 +19,5 @@ BEGIN
IDS_SCROLLUP "Gulung Naik"
IDS_SCROLLDOWN "Gulung Turun"
IDS_COMMAND_PROMPT "Command Prompt"
IDS_CONSOLE_TITLE "ReactOS Console"
END

View file

@ -28,5 +28,5 @@ BEGIN
IDS_SCROLLUP "Scorri sù"
IDS_SCROLLDOWN "Scorri giù"
IDS_COMMAND_PROMPT "Prompt dei commandi"
IDS_CONSOLE_TITLE "ReactOS Console"
END

View file

@ -19,5 +19,5 @@ BEGIN
IDS_SCROLLUP "上にスクロール"
IDS_SCROLLDOWN "下にスクロール"
IDS_COMMAND_PROMPT "Command Prompt"
IDS_CONSOLE_TITLE "ReactOS Console"
END

View file

@ -19,5 +19,5 @@ BEGIN
IDS_SCROLLUP "Rull opp"
IDS_SCROLLDOWN "Rull ned"
IDS_COMMAND_PROMPT "Command Prompt"
IDS_CONSOLE_TITLE "ReactOS Console"
END

View file

@ -27,5 +27,5 @@ BEGIN
IDS_SCROLLUP "Przewiń do góry"
IDS_SCROLLDOWN "Przewiń na dół"
IDS_COMMAND_PROMPT "Wiersz polecenia"
IDS_CONSOLE_TITLE "ReactOS Console"
END

View file

@ -21,5 +21,5 @@ BEGIN
IDS_SCROLLUP "Scroll up"
IDS_SCROLLDOWN "Scroll down"
IDS_COMMAND_PROMPT "Prompt de Comando"
IDS_CONSOLE_TITLE "ReactOS Console"
END

View file

@ -26,5 +26,5 @@ BEGIN
IDS_SCROLLUP "Derulează în sus"
IDS_SCROLLDOWN "Derulează în jos"
IDS_COMMAND_PROMPT "Linie de comandă"
IDS_CONSOLE_TITLE "ReactOS Console"
END

View file

@ -19,5 +19,5 @@ BEGIN
IDS_SCROLLUP "Прокрутить вверх"
IDS_SCROLLDOWN "Scroll Down"
IDS_COMMAND_PROMPT "Command Prompt"
IDS_CONSOLE_TITLE "ReactOS Console"
END

View file

@ -24,5 +24,5 @@ BEGIN
IDS_SCROLLUP "Rolovať nahor"
IDS_SCROLLDOWN "Rolovať nadol"
IDS_COMMAND_PROMPT "Príkazový riadok"
IDS_CONSOLE_TITLE "ReactOS Console"
END

View file

@ -26,5 +26,5 @@ BEGIN
IDS_SCROLLUP "Skrolla upp"
IDS_SCROLLDOWN "Skrolla ner"
IDS_COMMAND_PROMPT "Command Prompt"
IDS_CONSOLE_TITLE "ReactOS Console"
END

View file

@ -39,5 +39,5 @@ BEGIN
IDS_SCROLLUP "Yukarı yuvarla"
IDS_SCROLLDOWN "Aşağı yuvarla"
IDS_COMMAND_PROMPT "Komut İstemi"
IDS_CONSOLE_TITLE "ReactOS Console"
END

View file

@ -27,5 +27,5 @@ BEGIN
IDS_SCROLLUP "Прокрутити догори"
IDS_SCROLLDOWN "Прокрутити донизу"
IDS_COMMAND_PROMPT "Командний рядок"
IDS_CONSOLE_TITLE "ReactOS Console"
END

View file

@ -19,5 +19,5 @@ BEGIN
IDS_SCROLLUP "向上滚动"
IDS_SCROLLDOWN "向下滚动"
IDS_COMMAND_PROMPT "Command Prompt"
IDS_CONSOLE_TITLE "ReactOS Console"
END

View file

@ -19,5 +19,5 @@ BEGIN
IDS_SCROLLUP "向上滾動"
IDS_SCROLLDOWN "向下滾動"
IDS_COMMAND_PROMPT "Command Prompt"
IDS_CONSOLE_TITLE "ReactOS Console"
END

View file

@ -37,6 +37,6 @@
#define IDS_SCROLLUP 309
#define IDS_SCROLLDOWN 310
#define IDS_COMMAND_PROMPT 500
#define IDS_CONSOLE_TITLE 500
/* EOF */