mirror of
https://github.com/reactos/reactos.git
synced 2024-08-07 19:58:21 +00:00
Commit Ctrl Event handler
svn path=/trunk/; revision=5633
This commit is contained in:
parent
38064c3a39
commit
2cfb8d7b0d
|
@ -73,6 +73,7 @@ typedef struct CSRSS_CONSOLE_t
|
||||||
BOOL EarlyReturn; /* wake client and return data, even if we are in line buffered mode, and we don't have a complete line */
|
BOOL EarlyReturn; /* wake client and return data, even if we are in line buffered mode, and we don't have a complete line */
|
||||||
DWORD HardwareState; /* _GDI_MANAGED, _DIRECT */
|
DWORD HardwareState; /* _GDI_MANAGED, _DIRECT */
|
||||||
HWND hWindow;
|
HWND hWindow;
|
||||||
|
ULONG ProcessId;
|
||||||
} CSRSS_CONSOLE, *PCSRSS_CONSOLE;
|
} CSRSS_CONSOLE, *PCSRSS_CONSOLE;
|
||||||
|
|
||||||
typedef struct _CSRSS_PROCESS_DATA
|
typedef struct _CSRSS_PROCESS_DATA
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: conio.c,v 1.49 2003/07/29 23:03:01 jimtabor Exp $
|
/* $Id: conio.c,v 1.50 2003/08/18 07:20:23 jimtabor Exp $
|
||||||
*
|
*
|
||||||
* reactos/subsys/csrss/api/conio.c
|
* reactos/subsys/csrss/api/conio.c
|
||||||
*
|
*
|
||||||
|
@ -24,7 +24,7 @@
|
||||||
|
|
||||||
/* FIXME: Is there a way to create real aliasses with gcc? [CSH] */
|
/* FIXME: Is there a way to create real aliasses with gcc? [CSH] */
|
||||||
#define ALIAS(Name, Target) typeof(Target) Name = Target
|
#define ALIAS(Name, Target) typeof(Target) Name = Target
|
||||||
|
extern VOID CsrConsoleCtrlEvent(DWORD Event);
|
||||||
|
|
||||||
/* GLOBALS *******************************************************************/
|
/* GLOBALS *******************************************************************/
|
||||||
|
|
||||||
|
@ -34,9 +34,48 @@ static PCSRSS_CONSOLE ActiveConsole;
|
||||||
CRITICAL_SECTION ActiveConsoleLock;
|
CRITICAL_SECTION ActiveConsoleLock;
|
||||||
static COORD PhysicalConsoleSize;
|
static COORD PhysicalConsoleSize;
|
||||||
static BOOL KeyReadInhibit = FALSE;
|
static BOOL KeyReadInhibit = FALSE;
|
||||||
|
static PCONTROLDISPATCHER CtrlDispatcher;
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
VOID CsrConsoleCtrlEvent(DWORD Event)
|
||||||
|
{
|
||||||
|
HANDLE Process, hThread;
|
||||||
|
NTSTATUS Status;
|
||||||
|
CLIENT_ID ClientId, ClientId1;
|
||||||
|
|
||||||
|
|
||||||
|
ClientId.UniqueProcess = (HANDLE) ActiveConsole->ProcessId;
|
||||||
|
|
||||||
|
|
||||||
|
DPRINT1("CsrConsoleCtrlEvent Parent ProcessId = %x\n", ClientId.UniqueProcess);
|
||||||
|
|
||||||
|
|
||||||
|
Status = NtOpenProcess( &Process, PROCESS_DUP_HANDLE, 0, &ClientId );
|
||||||
|
if( !NT_SUCCESS( Status ) )
|
||||||
|
{
|
||||||
|
DPRINT("CsrConsoleCtrlEvent: Failed for handle duplication\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DPRINT1("CsrConsoleCtrlEvent Process Handle = %x\n", Process);
|
||||||
|
|
||||||
|
|
||||||
|
Status = RtlCreateUserThread(Process, NULL, FALSE, 0, NULL, NULL,
|
||||||
|
(PTHREAD_START_ROUTINE)CtrlDispatcher,
|
||||||
|
(PVOID) Event, hThread, &ClientId1);
|
||||||
|
if( !NT_SUCCESS( Status ) )
|
||||||
|
{
|
||||||
|
DPRINT("CsrConsoleCtrlEvent: Failed Thread creation\n");
|
||||||
|
NtClose(Process);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
DPRINT1("CsrConsoleCtrlEvent Parent ProcessId = %x, ReturnPId = %x, hT = %x\n",
|
||||||
|
ClientId.UniqueProcess, ClientId1.UniqueProcess, hThread);
|
||||||
|
NtClose(Process);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
CSR_API(CsrAllocConsole)
|
CSR_API(CsrAllocConsole)
|
||||||
{
|
{
|
||||||
PCSRSS_CONSOLE Console;
|
PCSRSS_CONSOLE Console;
|
||||||
|
@ -89,6 +128,11 @@ CSR_API(CsrAllocConsole)
|
||||||
ProcessData->Console = 0;
|
ProcessData->Console = 0;
|
||||||
return Reply->Status = Status;
|
return Reply->Status = Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CtrlDispatcher = Request->Data.AllocConsoleRequest.CtrlDispatcher;
|
||||||
|
DPRINT1("CSRSS:CtrlDispatcher address: %x\n", CtrlDispatcher);
|
||||||
|
ProcessData->Console->ProcessId = ProcessData->ProcessId;
|
||||||
|
|
||||||
ClientId.UniqueProcess = (HANDLE)ProcessData->ProcessId;
|
ClientId.UniqueProcess = (HANDLE)ProcessData->ProcessId;
|
||||||
Status = NtOpenProcess( &Process, PROCESS_DUP_HANDLE, 0, &ClientId );
|
Status = NtOpenProcess( &Process, PROCESS_DUP_HANDLE, 0, &ClientId );
|
||||||
if( !NT_SUCCESS( Status ) )
|
if( !NT_SUCCESS( Status ) )
|
||||||
|
@ -1162,6 +1206,16 @@ VOID Console_Api( DWORD RefreshEvent )
|
||||||
KeyEventRecord->Echoed = TRUE;
|
KeyEventRecord->Echoed = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* After all the keys processed */
|
||||||
|
if (((KeyEventRecord->InputEvent.Event.KeyEvent.wVirtualKeyCode == VK_PAUSE) ||
|
||||||
|
(KeyEventRecord->InputEvent.Event.KeyEvent.wVirtualKeyCode == 'C')) &&
|
||||||
|
(KeyEventRecord->InputEvent.Event.KeyEvent.dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)))
|
||||||
|
{
|
||||||
|
DPRINT1("Console_Api Ctrl-C\n");
|
||||||
|
CsrConsoleCtrlEvent((DWORD)CTRL_C_EVENT);
|
||||||
|
}
|
||||||
|
|
||||||
ActiveConsole->WaitingChars++;
|
ActiveConsole->WaitingChars++;
|
||||||
if( !(ActiveConsole->Mode & ENABLE_LINE_INPUT) )
|
if( !(ActiveConsole->Mode & ENABLE_LINE_INPUT) )
|
||||||
NtSetEvent( ActiveConsole->ActiveEvent, 0 );
|
NtSetEvent( ActiveConsole->ActiveEvent, 0 );
|
||||||
|
|
Loading…
Reference in a new issue