diff --git a/reactos/include/csrss/csrss.h b/reactos/include/csrss/csrss.h index d13ece70ccf..3b37ee33ebf 100644 --- a/reactos/include/csrss/csrss.h +++ b/reactos/include/csrss/csrss.h @@ -337,6 +337,21 @@ typedef struct DWORD Length; } CSRSS_WRITE_CONSOLE_INPUT_REPLY, *PCSRSS_WRITE_CONSOLE_INPUT_REPLY; +typedef struct +{ + HANDLE InputHandle; +} CSRSS_GET_INPUT_HANDLE_REPLY, *PCSRSS_GET_INPUT_HANDLE_REPLY; + +typedef struct +{ + HANDLE OutputHandle; +} CSRSS_GET_OUTPUT_HANDLE_REPLY, *PCSRSS_GET_OUTPUT_HANDLE_REPLY; + +typedef struct +{ + HANDLE Handle; +} CSRSS_CLOSE_HANDLE_REQUEST, *PCSRSS_CLOSE_HANDLE_REQUEST; + #define CSRSS_MAX_WRITE_CONSOLE_REQUEST \ (MAX_MESSAGE_DATA - sizeof(ULONG) - sizeof(CSRSS_WRITE_CONSOLE_REQUEST)) @@ -391,6 +406,9 @@ typedef struct #define CSRSS_PEEK_CONSOLE_INPUT (0x21) #define CSRSS_READ_CONSOLE_OUTPUT (0x22) #define CSRSS_WRITE_CONSOLE_INPUT (0x23) +#define CSRSS_GET_INPUT_HANDLE (0x24) +#define CSRSS_GET_OUTPUT_HANDLE (0x25) +#define CSRSS_CLOSE_HANDLE (0x26) /* Keep in sync with definition below. */ #define CSRSS_REQUEST_HEADER_SIZE (sizeof(LPC_MESSAGE) + sizeof(ULONG)) @@ -434,6 +452,7 @@ typedef struct CSRSS_PEEK_CONSOLE_INPUT_REQUEST PeekConsoleInputRequest; CSRSS_READ_CONSOLE_OUTPUT_REQUEST ReadConsoleOutputRequest; CSRSS_WRITE_CONSOLE_INPUT_REQUEST WriteConsoleInputRequest; + CSRSS_CLOSE_HANDLE_REQUEST CloseHandleRequest; } Data; } CSRSS_API_REQUEST, *PCSRSS_API_REQUEST; @@ -464,6 +483,8 @@ typedef struct CSRSS_PEEK_CONSOLE_INPUT_REPLY PeekConsoleInputReply; CSRSS_READ_CONSOLE_OUTPUT_REPLY ReadConsoleOutputReply; CSRSS_WRITE_CONSOLE_INPUT_REPLY WriteConsoleInputReply; + CSRSS_GET_INPUT_HANDLE_REPLY GetInputHandleReply; + CSRSS_GET_OUTPUT_HANDLE_REPLY GetOutputHandleReply; } Data; } CSRSS_API_REPLY, *PCSRSS_API_REPLY; diff --git a/reactos/subsys/csrss/api.h b/reactos/subsys/csrss/api.h index c880c22bec1..3eca66e6586 100644 --- a/reactos/subsys/csrss/api.h +++ b/reactos/subsys/csrss/api.h @@ -132,6 +132,9 @@ CSR_API(CsrSetShutdownParameters); CSR_API(CsrPeekConsoleInput); CSR_API(CsrReadConsoleOutput); CSR_API(CsrWriteConsoleInput); +CSR_API(CsrGetInputHandle); +CSR_API(CsrGetOutputHandle); +CSR_API(CsrCloseHandle); /* print.c */ VOID STDCALL DisplayString(LPCWSTR lpwString); diff --git a/reactos/subsys/csrss/api/process.c b/reactos/subsys/csrss/api/process.c index 69069ef33b9..abbe32a9724 100644 --- a/reactos/subsys/csrss/api/process.c +++ b/reactos/subsys/csrss/api/process.c @@ -1,4 +1,4 @@ -/* $Id: process.c,v 1.23 2003/01/11 15:51:48 hbirr Exp $ +/* $Id: process.c,v 1.24 2003/02/24 23:20:15 hbirr Exp $ * * reactos/subsys/csrss/api/process.c * @@ -279,5 +279,72 @@ CSR_API(CsrSetShutdownParameters) return(STATUS_SUCCESS); } +CSR_API(CsrGetInputHandle) +{ + Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + if (ProcessData == NULL) + { + Reply->Data.GetInputHandleReply.InputHandle = INVALID_HANDLE_VALUE; + Reply->Status = STATUS_INVALID_PARAMETER; + } + else if (ProcessData->Console) + { + Reply->Status = CsrInsertObject(ProcessData, + &Reply->Data.GetInputHandleReply.InputHandle, + (Object_t *)ProcessData->Console); + } + else + { + Reply->Data.GetInputHandleReply.InputHandle = INVALID_HANDLE_VALUE; + Reply->Status = STATUS_SUCCESS; + } + + return Reply->Status; +} + +CSR_API(CsrGetOutputHandle) +{ + Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + + if (ProcessData == NULL) + { + Reply->Data.GetOutputHandleReply.OutputHandle = INVALID_HANDLE_VALUE; + Reply->Status = STATUS_INVALID_PARAMETER; + } + else if (ProcessData->Console) + { + RtlEnterCriticalSection( &ActiveConsoleLock ); + Reply->Status = CsrInsertObject(ProcessData, + &Reply->Data.GetOutputHandleReply.OutputHandle, + &(ProcessData->Console->ActiveBuffer->Header)); + RtlLeaveCriticalSection( &ActiveConsoleLock ); + } + else + { + Reply->Data.GetOutputHandleReply.OutputHandle = INVALID_HANDLE_VALUE; + Reply->Status = STATUS_SUCCESS; + } + + return Reply->Status; +} + +CSR_API(CsrCloseHandle) +{ + Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + + if (ProcessData == NULL) + { + Reply->Status = STATUS_INVALID_PARAMETER; + } + else + { + Reply->Status = CsrReleaseObject(ProcessData, Request->Data.CloseHandleRequest.Handle); + } + return Reply->Status; +} + /* EOF */ diff --git a/reactos/subsys/csrss/api/wapi.c b/reactos/subsys/csrss/api/wapi.c index f32dae9ec0f..89b555f8b73 100644 --- a/reactos/subsys/csrss/api/wapi.c +++ b/reactos/subsys/csrss/api/wapi.c @@ -1,4 +1,4 @@ -/* $Id: wapi.c,v 1.25 2002/11/12 00:48:26 mdill Exp $ +/* $Id: wapi.c,v 1.26 2003/02/24 23:20:15 hbirr Exp $ * * reactos/subsys/csrss/api/wapi.c * @@ -63,6 +63,9 @@ static const CsrFunc CsrFuncs[] = { CsrPeekConsoleInput, CsrReadConsoleOutput, CsrWriteConsoleInput, + CsrGetInputHandle, + CsrGetOutputHandle, + CsrCloseHandle, 0 }; static void Thread_Api2(HANDLE ServerPort)