implemented GetConsoleProcessList()

svn path=/trunk/; revision=13414
This commit is contained in:
Thomas Bluemel
2005-02-05 01:44:05 +00:00
parent 2b921cb3e3
commit ab73f037f8
6 changed files with 129 additions and 14 deletions
+21 -6
View File
@@ -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;
};
};
+55 -7
View File
@@ -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;
}
+4 -1
View File
@@ -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);
+1
View File
@@ -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))
+47
View File
@@ -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 */
+1
View File
@@ -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 }
};