mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-02 12:23:31 +00:00
implemented GetConsoleProcessList()
svn path=/trunk/; revision=13414
This commit is contained in:
@@ -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;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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 }
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user