From ab73f037f8365a2bb13415a925e4a37c855efcb9 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sat, 5 Feb 2005 01:44:05 +0000 Subject: [PATCH] implemented GetConsoleProcessList() svn path=/trunk/; revision=13414 --- reactos/include/csrss/csrss.h | 27 ++++++++--- reactos/lib/kernel32/misc/console.c | 62 ++++++++++++++++++++++--- reactos/lib/ntdll/csr/lpc.c | 5 +- reactos/subsys/csrss/include/conio.h | 1 + reactos/subsys/csrss/win32csr/conio.c | 47 +++++++++++++++++++ reactos/subsys/csrss/win32csr/dllmain.c | 1 + 6 files changed, 129 insertions(+), 14 deletions(-) diff --git a/reactos/include/csrss/csrss.h b/reactos/include/csrss/csrss.h index d8376a2f6c4..ffcaf8d7f26 100644 --- a/reactos/include/csrss/csrss.h +++ b/reactos/include/csrss/csrss.h @@ -11,11 +11,11 @@ typedef __declspec(noreturn) VOID CALLBACK(*PCONTROLDISPATCHER)(DWORD); typedef struct { -} CSRSS_CONNECT_PROCESS_REQUEST, PCSRSS_CONNECT_PROCESS_REQUEST; +} CSRSS_CONNECT_PROCESS_REQUEST, *PCSRSS_CONNECT_PROCESS_REQUEST; typedef struct { -} CSRSS_CONNECT_PROCESS_REPLY, PCSRSS_CONNECT_PROCESS_REPLY; +} CSRSS_CONNECT_PROCESS_REPLY, *PCSRSS_CONNECT_PROCESS_REPLY; typedef struct { @@ -33,11 +33,23 @@ typedef struct typedef struct { -} CSRSS_TERMINATE_PROCESS_REQUEST, PCSRSS_TERMINATE_PROCESS_REQUEST; +} CSRSS_TERMINATE_PROCESS_REQUEST, *PCSRSS_TERMINATE_PROCESS_REQUEST; typedef struct { -} CSRSS_TERMINATE_PROCESS_REPLY, PCSRSS_TERMINATE_PROCESS_REPLY; +} CSRSS_TERMINATE_PROCESS_REPLY, *PCSRSS_TERMINATE_PROCESS_REPLY; + +typedef struct +{ + ULONG nMaxIds; +} CSRSS_GET_PROCESS_LIST_REQUEST, *PCSRSS_GET_PROCESS_LIST_REQUEST; + +typedef struct +{ + ULONG nProcessIdsCopied; + ULONG nProcessIdsTotal; + HANDLE ProcessId[1]; +} CSRSS_GET_PROCESS_LIST_REPLY, *PCSRSS_GET_PROCESS_LIST_REPLY; typedef struct { @@ -250,12 +262,12 @@ typedef struct typedef struct { HANDLE UniqueThread; -} CSRSS_IDENTIFY_ALERTABLE_THREAD_REQUEST, * PCSRSS_IDENTIFY_ALERTABLE_THREAD_REQUEST; +} CSRSS_IDENTIFY_ALERTABLE_THREAD_REQUEST, *PCSRSS_IDENTIFY_ALERTABLE_THREAD_REQUEST; typedef struct { CLIENT_ID Cid; -} CSRSS_IDENTIFY_ALERTABLE_THREAD_REPLY, * PCSRSS_IDENTIFY_ALERTABLE_THREAD_REPLY; +} CSRSS_IDENTIFY_ALERTABLE_THREAD_REPLY, *PCSRSS_IDENTIFY_ALERTABLE_THREAD_REPLY; typedef struct { @@ -687,6 +699,7 @@ typedef struct #define CSRSS_GET_CONSOLE_OUTPUT_CP (0x33) #define CSRSS_SET_CONSOLE_OUTPUT_CP (0x34) #define CSRSS_GET_INPUT_WAIT_HANDLE (0x35) +#define CSRSS_GET_PROCESS_LIST (0x36) /* Keep in sync with definition below. */ #define CSRSS_REQUEST_HEADER_SIZE (LPC_MESSAGE_BASE_SIZE + sizeof(ULONG)) @@ -752,6 +765,7 @@ typedef struct CSRSS_GET_CONSOLE_OUTPUT_CP_REQUEST GetConsoleOutputCodePage; CSRSS_SET_CONSOLE_OUTPUT_CP_REQUEST SetConsoleOutputCodePage; CSRSS_GET_INPUT_WAIT_HANDLE_REQUEST GetConsoleInputWaitHandle; + CSRSS_GET_PROCESS_LIST_REQUEST GetProcessListRequest; } Data; }; }; @@ -807,6 +821,7 @@ typedef struct CSRSS_GET_CONSOLE_OUTPUT_CP_REPLY GetConsoleOutputCodePage; CSRSS_SET_CONSOLE_OUTPUT_CP_REPLY SetConsoleOutputCodePage; CSRSS_GET_INPUT_WAIT_HANDLE_REPLY GetConsoleInputWaitHandle; + CSRSS_GET_PROCESS_LIST_REPLY GetProcessListReply; } Data; }; }; diff --git a/reactos/lib/kernel32/misc/console.c b/reactos/lib/kernel32/misc/console.c index 58e13ffea8a..742ee5b185f 100644 --- a/reactos/lib/kernel32/misc/console.c +++ b/reactos/lib/kernel32/misc/console.c @@ -1569,7 +1569,7 @@ IntPeekConsoleInput(HANDLE hConsoleInput, Size = nLength * sizeof(INPUT_RECORD); - Status = CsrCaptureParameterBuffer((PVOID)lpBuffer, Size, &BufferBase, &BufferTargetBase); + Status = CsrCaptureParameterBuffer(NULL, Size, &BufferBase, &BufferTargetBase); if(!NT_SUCCESS(Status)) { SetLastErrorByStatus(Status); @@ -1884,7 +1884,7 @@ IntReadConsoleOutput(HANDLE hConsoleOutput, Size = dwBufferSize.X * dwBufferSize.Y * sizeof(CHAR_INFO); - Status = CsrCaptureParameterBuffer((PVOID)lpBuffer, Size, &BufferBase, &BufferTargetBase); + Status = CsrCaptureParameterBuffer(NULL, Size, &BufferBase, &BufferTargetBase); if(!NT_SUCCESS(Status)) { SetLastErrorByStatus(Status); @@ -3327,15 +3327,63 @@ SetConsoleOutputCP( /*-------------------------------------------------------------- * GetConsoleProcessList * - * @unimplemented + * @implemented */ DWORD STDCALL GetConsoleProcessList(LPDWORD lpdwProcessList, - DWORD dwProcessCount) + DWORD dwProcessCount) { - DPRINT1("GetConsoleProcessList(0x%x, 0x%x) UNIMPLEMENTED!\n", lpdwProcessList, dwProcessCount); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; + CSRSS_API_REQUEST Request; + PCSRSS_API_REPLY Reply; + ULONG BufferSize, nProcesses; + NTSTATUS Status; + + if(lpdwProcessList == NULL || dwProcessCount == 0) + { + SetLastError(ERROR_INVALID_PARAMETER); + return 0; + } + + BufferSize = sizeof(CSRSS_API_REQUEST) + + (dwProcessCount * sizeof(Reply->Data.GetProcessListReply.ProcessId[0])); + + Reply = RtlAllocateHeap(GetProcessHeap(), 0, BufferSize); + if(Reply == NULL) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return 0; + } + + Reply->Status = STATUS_SUCCESS; + + Request.Type = CSRSS_GET_PROCESS_LIST; + Request.Data.GetProcessListRequest.nMaxIds = dwProcessCount; + + Status = CsrClientCallServer(&Request, Reply, sizeof(CSRSS_API_REQUEST), + BufferSize); + if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply->Status)) + { + SetLastErrorByStatus (Status); + nProcesses = 0; + } + else + { + if(dwProcessCount >= Reply->Data.GetProcessListReply.nProcessIdsTotal) + { + nProcesses = Reply->Data.GetProcessListReply.nProcessIdsCopied; + for(nProcesses = 0; nProcesses < Reply->Data.GetProcessListReply.nProcessIdsCopied; nProcesses++) + { + *(lpdwProcessList++) = (DWORD)Reply->Data.GetProcessListReply.ProcessId[nProcesses]; + } + } + else + { + nProcesses = Reply->Data.GetProcessListReply.nProcessIdsTotal; + } + } + + RtlFreeHeap(GetProcessHeap(), 0, Reply); + return nProcesses; } diff --git a/reactos/lib/ntdll/csr/lpc.c b/reactos/lib/ntdll/csr/lpc.c index 1c63f07bd7d..81467b5d149 100644 --- a/reactos/lib/ntdll/csr/lpc.c +++ b/reactos/lib/ntdll/csr/lpc.c @@ -71,7 +71,10 @@ CsrCaptureParameterBuffer(PVOID ParameterBuffer, { return(STATUS_NO_MEMORY); } - memcpy(Block, ParameterBuffer, ParameterBufferSize); + if(ParameterBuffer != NULL) + { + memcpy(Block, ParameterBuffer, ParameterBufferSize); + } *ClientAddress = Block; *ServerAddress = Block - CsrSectionMapBase + CsrSectionMapServerBase; return(STATUS_SUCCESS); diff --git a/reactos/subsys/csrss/include/conio.h b/reactos/subsys/csrss/include/conio.h index 082fab28707..2f9fca25acb 100644 --- a/reactos/subsys/csrss/include/conio.h +++ b/reactos/subsys/csrss/include/conio.h @@ -139,6 +139,7 @@ CSR_API(CsrGetConsoleCodePage); CSR_API(CsrSetConsoleCodePage); CSR_API(CsrGetConsoleOutputCodePage); CSR_API(CsrSetConsoleOutputCodePage); +CSR_API(CsrGetProcessList); #define ConioInitScreenBuffer(Console, Buff) (Console)->Vtbl->InitScreenBuffer((Console), (Buff)) #define ConioDrawRegion(Console, Region) (Console)->Vtbl->DrawRegion((Console), (Region)) diff --git a/reactos/subsys/csrss/win32csr/conio.c b/reactos/subsys/csrss/win32csr/conio.c index c924c8755b6..4c82d872b59 100644 --- a/reactos/subsys/csrss/win32csr/conio.c +++ b/reactos/subsys/csrss/win32csr/conio.c @@ -3163,4 +3163,51 @@ CSR_API(CsrSetConsoleOutputCodePage) return Reply->Status = STATUS_UNSUCCESSFUL; } +CSR_API(CsrGetProcessList) +{ + PHANDLE Buffer; + PCSRSS_CONSOLE Console; + PCSRSS_PROCESS_DATA current; + PLIST_ENTRY current_entry; + ULONG nItems, nCopied; + NTSTATUS Status; + + DPRINT("CsrGetProcessList\n"); + + Buffer = Reply->Data.GetProcessListReply.ProcessId; + Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); + Reply->Header.DataSize = Reply->Header.MessageSize - LPC_MESSAGE_BASE_SIZE; + + nItems = nCopied = 0; + Reply->Data.GetProcessListReply.nProcessIdsCopied = 0; + Reply->Data.GetProcessListReply.nProcessIdsTotal = 0; + + Status = ConioConsoleFromProcessData(ProcessData, &Console); + if (! NT_SUCCESS(Status)) + { + return Reply->Status = Status; + } + + DPRINT1("Console_Api Ctrl-C\n"); + + for(current_entry = Console->ProcessList.Flink; + current_entry != &Console->ProcessList; + current_entry = current_entry->Flink) + { + current = CONTAINING_RECORD(current_entry, CSRSS_PROCESS_DATA, ProcessEntry); + if(nItems++ < Request->Data.GetProcessListRequest.nMaxIds) + { + *(Buffer++) = current->ProcessId; + nCopied++; + } + } + + ConioUnlockConsole(Console); + + Reply->Data.GetProcessListReply.nProcessIdsCopied = nCopied; + Reply->Data.GetProcessListReply.nProcessIdsTotal = nItems; + + return Reply->Status = STATUS_SUCCESS; +} + /* EOF */ diff --git a/reactos/subsys/csrss/win32csr/dllmain.c b/reactos/subsys/csrss/win32csr/dllmain.c index 7fd2f7b6c12..44da402f033 100644 --- a/reactos/subsys/csrss/win32csr/dllmain.c +++ b/reactos/subsys/csrss/win32csr/dllmain.c @@ -71,6 +71,7 @@ static CSRSS_API_DEFINITION Win32CsrApiDefinitions[] = CSRSS_DEFINE_API(CSRSS_SET_CONSOLE_CP, CsrSetConsoleCodePage), CSRSS_DEFINE_API(CSRSS_GET_CONSOLE_OUTPUT_CP, CsrGetConsoleOutputCodePage), CSRSS_DEFINE_API(CSRSS_SET_CONSOLE_OUTPUT_CP, CsrSetConsoleOutputCodePage), + CSRSS_DEFINE_API(CSRSS_GET_PROCESS_LIST, CsrGetProcessList), { 0, 0, 0, NULL } };