implemented GetConsoleProcessList() Modified: trunk/reactos/include/csrss/csrss.h Modified: trunk/reactos/lib/kernel32/misc/console.c Modified: trunk/reactos/lib/ntdll/csr/lpc.c Modified: trunk/reactos/subsys/csrss/include/conio.h Modified: trunk/reactos/subsys/csrss/win32csr/conio.c Modified: trunk/reactos/subsys/csrss/win32csr/dllmain.c _____
Modified: trunk/reactos/include/csrss/csrss.h --- trunk/reactos/include/csrss/csrss.h 2005-02-05 00:20:14 UTC (rev 13413) +++ trunk/reactos/include/csrss/csrss.h 2005-02-05 01:44:05 UTC (rev 13414) @@ -11,11 +11,11 @@
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,14 +33,26 @@
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 +{ HANDLE ConsoleHandle; BOOL Unicode; ULONG NrCharactersToWrite; @@ -250,12 +262,12 @@ 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 @@ #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 @@ 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 @@ 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; }; }; _____
Modified: trunk/reactos/lib/kernel32/misc/console.c --- trunk/reactos/lib/kernel32/misc/console.c 2005-02-05 00:20:14 UTC (rev 13413) +++ trunk/reactos/lib/kernel32/misc/console.c 2005-02-05 01:44:05 UTC (rev 13414) @@ -1569,7 +1569,7 @@
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 @@
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 @@ /*-------------------------------------------------------------- * 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; }
_____
Modified: trunk/reactos/lib/ntdll/csr/lpc.c --- trunk/reactos/lib/ntdll/csr/lpc.c 2005-02-05 00:20:14 UTC (rev 13413) +++ trunk/reactos/lib/ntdll/csr/lpc.c 2005-02-05 01:44:05 UTC (rev 13414) @@ -71,7 +71,10 @@
{ return(STATUS_NO_MEMORY); } - memcpy(Block, ParameterBuffer, ParameterBufferSize); + if(ParameterBuffer != NULL) + { + memcpy(Block, ParameterBuffer, ParameterBufferSize); + } *ClientAddress = Block; *ServerAddress = Block - CsrSectionMapBase + CsrSectionMapServerBase; return(STATUS_SUCCESS); _____
Modified: trunk/reactos/subsys/csrss/include/conio.h --- trunk/reactos/subsys/csrss/include/conio.h 2005-02-05 00:20:14 UTC (rev 13413) +++ trunk/reactos/subsys/csrss/include/conio.h 2005-02-05 01:44:05 UTC (rev 13414) @@ -139,6 +139,7 @@
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)) _____
Modified: trunk/reactos/subsys/csrss/win32csr/conio.c --- trunk/reactos/subsys/csrss/win32csr/conio.c 2005-02-05 00:20:14 UTC (rev 13413) +++ trunk/reactos/subsys/csrss/win32csr/conio.c 2005-02-05 01:44:05 UTC (rev 13414) @@ -3163,4 +3163,51 @@
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 */ _____
Modified: trunk/reactos/subsys/csrss/win32csr/dllmain.c --- trunk/reactos/subsys/csrss/win32csr/dllmain.c 2005-02-05 00:20:14 UTC (rev 13413) +++ trunk/reactos/subsys/csrss/win32csr/dllmain.c 2005-02-05 01:44:05 UTC (rev 13414) @@ -71,6 +71,7 @@
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 } };