mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 17:52:56 +00:00
[KERNEL32], [WIN32CSR] More fixes for console winetest
- BasepInitConsole: Initialize console input EXE name - GetConsoleProcessList: Use capture buffer; only copy IDs if buffer has enough room for all of them; return total number of processes. svn path=/trunk/; revision=47331
This commit is contained in:
parent
4bba2335c0
commit
4b687b2792
5 changed files with 39 additions and 43 deletions
|
@ -85,6 +85,8 @@ HANDLE WINAPI OpenConsoleW (LPCWSTR wsName,
|
||||||
BOOL bInheritHandle,
|
BOOL bInheritHandle,
|
||||||
DWORD dwShareMode);
|
DWORD dwShareMode);
|
||||||
|
|
||||||
|
BOOL WINAPI SetConsoleInputExeNameW(LPCWSTR lpInputExeName);
|
||||||
|
|
||||||
PTEB GetTeb(VOID);
|
PTEB GetTeb(VOID);
|
||||||
|
|
||||||
HANDLE FASTCALL TranslateStdHandle(HANDLE hHandle);
|
HANDLE FASTCALL TranslateStdHandle(HANDLE hHandle);
|
||||||
|
|
|
@ -3753,7 +3753,8 @@ WINAPI
|
||||||
GetConsoleProcessList(LPDWORD lpdwProcessList,
|
GetConsoleProcessList(LPDWORD lpdwProcessList,
|
||||||
DWORD dwProcessCount)
|
DWORD dwProcessCount)
|
||||||
{
|
{
|
||||||
PCSR_API_MESSAGE Request;
|
PCSR_CAPTURE_BUFFER CaptureBuffer;
|
||||||
|
CSR_API_MESSAGE Request;
|
||||||
ULONG CsrRequest;
|
ULONG CsrRequest;
|
||||||
ULONG nProcesses;
|
ULONG nProcesses;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
@ -3764,43 +3765,38 @@ GetConsoleProcessList(LPDWORD lpdwProcessList,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Request = RtlAllocateHeap(RtlGetProcessHeap(),
|
CaptureBuffer = CsrAllocateCaptureBuffer(1, dwProcessCount * sizeof(DWORD));
|
||||||
0,
|
if (CaptureBuffer == NULL)
|
||||||
max(sizeof(CSR_API_MESSAGE),
|
|
||||||
CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST)
|
|
||||||
+ min (dwProcessCount, CSRSS_MAX_GET_PROCESS_LIST / sizeof(DWORD)) * sizeof(DWORD)));
|
|
||||||
if (Request == NULL)
|
|
||||||
{
|
{
|
||||||
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
CsrRequest = MAKE_CSR_API(GET_PROCESS_LIST, CSR_CONSOLE);
|
CsrRequest = MAKE_CSR_API(GET_PROCESS_LIST, CSR_CONSOLE);
|
||||||
Request->Data.GetProcessListRequest.nMaxIds = min (dwProcessCount, CSRSS_MAX_GET_PROCESS_LIST / sizeof(DWORD));
|
Request.Data.GetProcessListRequest.nMaxIds = dwProcessCount;
|
||||||
|
CsrAllocateMessagePointer(CaptureBuffer,
|
||||||
|
dwProcessCount * sizeof(DWORD),
|
||||||
|
(PVOID*)&Request.Data.GetProcessListRequest.ProcessId);
|
||||||
|
|
||||||
Status = CsrClientCallServer(Request,
|
Status = CsrClientCallServer(&Request,
|
||||||
NULL,
|
CaptureBuffer,
|
||||||
CsrRequest,
|
CsrRequest,
|
||||||
max(sizeof(CSR_API_MESSAGE),
|
sizeof(CSR_API_MESSAGE));
|
||||||
CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST)
|
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
|
||||||
+ Request->Data.GetProcessListRequest.nMaxIds * sizeof(DWORD)));
|
|
||||||
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request->Status))
|
|
||||||
{
|
{
|
||||||
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
|
|
||||||
SetLastErrorByStatus (Status);
|
SetLastErrorByStatus (Status);
|
||||||
nProcesses = 0;
|
nProcesses = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
nProcesses = Request->Data.GetProcessListRequest.nProcessIdsCopied;
|
nProcesses = Request.Data.GetProcessListRequest.nProcessIdsTotal;
|
||||||
if (dwProcessCount >= nProcesses)
|
if (dwProcessCount >= nProcesses)
|
||||||
{
|
{
|
||||||
memcpy(lpdwProcessList, Request->Data.GetProcessListRequest.ProcessId, nProcesses * sizeof(DWORD));
|
memcpy(lpdwProcessList, Request.Data.GetProcessListRequest.ProcessId, nProcesses * sizeof(DWORD));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
|
CsrFreeCaptureBuffer(CaptureBuffer);
|
||||||
|
|
||||||
return nProcesses;
|
return nProcesses;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -130,6 +130,7 @@ BasepInitConsole(VOID)
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
BOOLEAN NotConsole = FALSE;
|
BOOLEAN NotConsole = FALSE;
|
||||||
PRTL_USER_PROCESS_PARAMETERS Parameters = NtCurrentPeb()->ProcessParameters;
|
PRTL_USER_PROCESS_PARAMETERS Parameters = NtCurrentPeb()->ProcessParameters;
|
||||||
|
LPCWSTR ExeName;
|
||||||
|
|
||||||
WCHAR lpTest[MAX_PATH];
|
WCHAR lpTest[MAX_PATH];
|
||||||
GetModuleFileNameW(NULL, lpTest, MAX_PATH);
|
GetModuleFileNameW(NULL, lpTest, MAX_PATH);
|
||||||
|
@ -183,7 +184,7 @@ BasepInitConsole(VOID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize Console Ctrl Handler */
|
/* Initialize Console Ctrl Handler and input EXE name */
|
||||||
ConsoleInitialized = TRUE;
|
ConsoleInitialized = TRUE;
|
||||||
RtlInitializeCriticalSection(&ConsoleLock);
|
RtlInitializeCriticalSection(&ConsoleLock);
|
||||||
NrAllocatedHandlers = 1;
|
NrAllocatedHandlers = 1;
|
||||||
|
@ -191,6 +192,10 @@ BasepInitConsole(VOID)
|
||||||
CtrlHandlers = InitialHandler;
|
CtrlHandlers = InitialHandler;
|
||||||
CtrlHandlers[0] = DefaultConsoleCtrlHandler;
|
CtrlHandlers[0] = DefaultConsoleCtrlHandler;
|
||||||
|
|
||||||
|
ExeName = wcsrchr(Parameters->ImagePathName.Buffer, L'\\');
|
||||||
|
if (ExeName)
|
||||||
|
SetConsoleInputExeNameW(ExeName + 1);
|
||||||
|
|
||||||
/* Now use the proper console handle */
|
/* Now use the proper console handle */
|
||||||
Request.Data.AllocConsoleRequest.Console = Parameters->ConsoleHandle;
|
Request.Data.AllocConsoleRequest.Console = Parameters->ConsoleHandle;
|
||||||
|
|
||||||
|
|
|
@ -51,10 +51,9 @@ typedef struct
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
ULONG nMaxIds;
|
USHORT nMaxIds;
|
||||||
ULONG nProcessIdsCopied;
|
PDWORD ProcessId;
|
||||||
ULONG nProcessIdsTotal;
|
ULONG nProcessIdsTotal;
|
||||||
HANDLE ProcessId[0];
|
|
||||||
} CSRSS_GET_PROCESS_LIST, *PCSRSS_GET_PROCESS_LIST;
|
} CSRSS_GET_PROCESS_LIST, *PCSRSS_GET_PROCESS_LIST;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
|
|
|
@ -2960,22 +2960,27 @@ CSR_API(CsrSetConsoleOutputCodePage)
|
||||||
|
|
||||||
CSR_API(CsrGetProcessList)
|
CSR_API(CsrGetProcessList)
|
||||||
{
|
{
|
||||||
PHANDLE Buffer;
|
PDWORD Buffer;
|
||||||
PCSRSS_CONSOLE Console;
|
PCSRSS_CONSOLE Console;
|
||||||
PCSRSS_PROCESS_DATA current;
|
PCSRSS_PROCESS_DATA current;
|
||||||
PLIST_ENTRY current_entry;
|
PLIST_ENTRY current_entry;
|
||||||
ULONG nItems, nCopied, Length;
|
ULONG nItems = 0;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
ULONG_PTR Offset;
|
||||||
|
|
||||||
DPRINT("CsrGetProcessList\n");
|
DPRINT("CsrGetProcessList\n");
|
||||||
|
|
||||||
Buffer = Request->Data.GetProcessListRequest.ProcessId;
|
|
||||||
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
|
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
|
||||||
Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
|
Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
|
||||||
|
|
||||||
nItems = nCopied = 0;
|
Buffer = Request->Data.GetProcessListRequest.ProcessId;
|
||||||
Request->Data.GetProcessListRequest.nProcessIdsCopied = 0;
|
Offset = (PBYTE)Buffer - (PBYTE)ProcessData->CsrSectionViewBase;
|
||||||
Request->Data.GetProcessListRequest.nProcessIdsTotal = 0;
|
if (Offset >= ProcessData->CsrSectionViewSize
|
||||||
|
|| (Request->Data.GetProcessListRequest.nMaxIds * sizeof(DWORD)) > (ProcessData->CsrSectionViewSize - Offset)
|
||||||
|
|| Offset & (sizeof(DWORD) - 1))
|
||||||
|
{
|
||||||
|
return STATUS_ACCESS_VIOLATION;
|
||||||
|
}
|
||||||
|
|
||||||
Status = ConioConsoleFromProcessData(ProcessData, &Console);
|
Status = ConioConsoleFromProcessData(ProcessData, &Console);
|
||||||
if (! NT_SUCCESS(Status))
|
if (! NT_SUCCESS(Status))
|
||||||
|
@ -2983,31 +2988,20 @@ CSR_API(CsrGetProcessList)
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
DPRINT1("Console_Api Ctrl-C\n");
|
|
||||||
|
|
||||||
for(current_entry = Console->ProcessList.Flink;
|
for(current_entry = Console->ProcessList.Flink;
|
||||||
current_entry != &Console->ProcessList;
|
current_entry != &Console->ProcessList;
|
||||||
current_entry = current_entry->Flink)
|
current_entry = current_entry->Flink)
|
||||||
{
|
{
|
||||||
current = CONTAINING_RECORD(current_entry, CSRSS_PROCESS_DATA, ProcessEntry);
|
current = CONTAINING_RECORD(current_entry, CSRSS_PROCESS_DATA, ProcessEntry);
|
||||||
if(++nItems < Request->Data.GetProcessListRequest.nMaxIds)
|
if(++nItems <= Request->Data.GetProcessListRequest.nMaxIds)
|
||||||
{
|
{
|
||||||
*(Buffer++) = current->ProcessId;
|
*Buffer++ = (DWORD)current->ProcessId;
|
||||||
nCopied++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ConioUnlockConsole(Console);
|
ConioUnlockConsole(Console);
|
||||||
|
|
||||||
Request->Data.GetProcessListRequest.nProcessIdsCopied = nCopied;
|
|
||||||
Request->Data.GetProcessListRequest.nProcessIdsTotal = nItems;
|
Request->Data.GetProcessListRequest.nProcessIdsTotal = nItems;
|
||||||
|
|
||||||
Length = CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST) + nCopied * sizeof(HANDLE);
|
|
||||||
if (Length > sizeof(CSR_API_MESSAGE))
|
|
||||||
{
|
|
||||||
Request->Header.u1.s1.TotalLength = Length;
|
|
||||||
Request->Header.u1.s1.DataLength = Length - sizeof(PORT_MESSAGE);
|
|
||||||
}
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue