[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:
Jeffrey Morlan 2010-05-23 17:40:54 +00:00
parent 4bba2335c0
commit 4b687b2792
5 changed files with 39 additions and 43 deletions

View file

@ -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);

View file

@ -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;
} }

View file

@ -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;

View file

@ -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

View file

@ -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;
} }