[KERNEL32]

This is the first of a series of commits aiming at making kernel32 using the new CSR messaging structures for communicating with Server Dlls.

svn path=/branches/ros-csrss/; revision=57666
This commit is contained in:
Hermès Bélusca-Maïto 2012-11-02 18:00:47 +00:00
parent bd4d83d88f
commit 1e4253f2c0
4 changed files with 108 additions and 94 deletions

View file

@ -90,8 +90,9 @@ DefineDosDeviceW(
{
ULONG ArgumentCount;
ULONG BufferSize;
BASE_API_MESSAGE ApiMessage;
PBASE_DEFINE_DOS_DEVICE DefineDosDeviceRequest = &ApiMessage.Data.DefineDosDeviceRequest;
PCSR_CAPTURE_BUFFER CaptureBuffer;
CSR_API_MESSAGE Request;
NTSTATUS Status;
UNICODE_STRING NtTargetPathU;
UNICODE_STRING DeviceNameU;
@ -157,16 +158,16 @@ DefineDosDeviceW(
}
else
{
Request.Data.DefineDosDeviceRequest.dwFlags = dwFlags;
DefineDosDeviceRequest->dwFlags = dwFlags;
CsrCaptureMessageBuffer(CaptureBuffer,
(PVOID)DeviceUpcaseNameU.Buffer,
DeviceUpcaseNameU.Length,
(PVOID*)&Request.Data.DefineDosDeviceRequest.DeviceName.Buffer);
(PVOID*)&DefineDosDeviceRequest->DeviceName.Buffer);
Request.Data.DefineDosDeviceRequest.DeviceName.Length =
DefineDosDeviceRequest->DeviceName.Length =
DeviceUpcaseNameU.Length;
Request.Data.DefineDosDeviceRequest.DeviceName.MaximumLength =
DefineDosDeviceRequest->DeviceName.MaximumLength =
DeviceUpcaseNameU.Length;
if (NtTargetPathU.Buffer)
@ -174,21 +175,20 @@ DefineDosDeviceW(
CsrCaptureMessageBuffer(CaptureBuffer,
(PVOID)NtTargetPathU.Buffer,
NtTargetPathU.Length,
(PVOID*)&Request.Data.DefineDosDeviceRequest.TargetName.Buffer);
(PVOID*)&DefineDosDeviceRequest->TargetName.Buffer);
}
Request.Data.DefineDosDeviceRequest.TargetName.Length =
DefineDosDeviceRequest->TargetName.Length =
NtTargetPathU.Length;
Request.Data.DefineDosDeviceRequest.TargetName.MaximumLength =
DefineDosDeviceRequest->TargetName.MaximumLength =
NtTargetPathU.Length;
Status = CsrClientCallServer(&Request,
Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
CaptureBuffer,
CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepDefineDosDevice),
sizeof(CSR_API_MESSAGE));
sizeof(BASE_DEFINE_DOS_DEVICE));
CsrFreeCaptureBuffer(CaptureBuffer);
if (! NT_SUCCESS(Status) ||
! NT_SUCCESS(Status = Request.Status))
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = ApiMessage.Status))
{
WARN("CsrClientCallServer() failed (Status %lx)\n",
Status);

View file

@ -1,10 +1,9 @@
/* $Id: proc.c 57086 2012-08-16 15:39:40Z akhaldi $
*
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries
* FILE: lib/kernel32/proc/proc.c
* PURPOSE: Process functions
* PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
* PROGRAMMERS: Ariadne (ariadne@xs4all.nl)
* UPDATE HISTORY:
* Created 01/11/98
*/
@ -13,7 +12,7 @@
#include <k32.h>
#define NDEBUG
// #define NDEBUG
#include <debug.h>
/* GLOBALS *******************************************************************/
@ -494,25 +493,26 @@ WINAPI
BasepNotifyCsrOfThread(IN HANDLE ThreadHandle,
IN PCLIENT_ID ClientId)
{
CSR_API_MESSAGE CsrRequest;
NTSTATUS Status;
BASE_API_MESSAGE ApiMessage;
PBASE_CREATE_THREAD CreateThreadRequest = &ApiMessage.Data.CreateThreadRequest;
DPRINT("BasepNotifyCsrOfThread: Thread: %lx, Handle %lx\n",
ClientId->UniqueThread, ThreadHandle);
/* Fill out the request */
CsrRequest.Data.CreateThreadRequest.ClientId = *ClientId;
CsrRequest.Data.CreateThreadRequest.ThreadHandle = ThreadHandle;
CreateThreadRequest->ClientId = *ClientId;
CreateThreadRequest->ThreadHandle = ThreadHandle;
/* Call CSR */
Status = CsrClientCallServer(&CsrRequest,
Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
NULL,
CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepCreateThread),
sizeof(CSR_API_MESSAGE));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(CsrRequest.Status))
sizeof(BASE_CREATE_THREAD));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(ApiMessage.Status))
{
DPRINT1("Failed to tell csrss about new thread: %lx %lx\n", Status, CsrRequest.Status);
return CsrRequest.Status;
DPRINT1("Failed to tell csrss about new thread: %lx %lx\n", Status, ApiMessage.Status);
return ApiMessage.Status;
}
/* Return Success */
@ -531,13 +531,15 @@ BasepCreateFirstThread(HANDLE ProcessHandle,
BOOLEAN InheritHandles,
DWORD dwCreationFlags)
{
NTSTATUS Status;
OBJECT_ATTRIBUTES LocalObjectAttributes;
POBJECT_ATTRIBUTES ObjectAttributes;
CONTEXT Context;
INITIAL_TEB InitialTeb;
NTSTATUS Status;
HANDLE hThread;
CSR_API_MESSAGE CsrRequest;
BASE_API_MESSAGE ApiMessage;
PBASE_CREATE_PROCESS CreateProcessRequest = &ApiMessage.Data.CreateProcessRequest;
DPRINT("BasepCreateFirstThread. hProcess: %lx\n", ProcessHandle);
/* Create the Thread's Stack */
@ -573,20 +575,21 @@ BasepCreateFirstThread(HANDLE ProcessHandle,
}
/* Fill out the request to notify CSRSS */
CsrRequest.Data.CreateProcessRequest.ClientId = *ClientId;
CsrRequest.Data.CreateProcessRequest.ProcessHandle = ProcessHandle;
CsrRequest.Data.CreateProcessRequest.ThreadHandle = hThread;
CsrRequest.Data.CreateProcessRequest.CreationFlags = dwCreationFlags;
CsrRequest.Data.CreateProcessRequest.bInheritHandles = InheritHandles;
CreateProcessRequest->ClientId = *ClientId;
CreateProcessRequest->ProcessHandle = ProcessHandle;
CreateProcessRequest->ThreadHandle = hThread;
CreateProcessRequest->CreationFlags = dwCreationFlags;
CreateProcessRequest->bInheritHandles = InheritHandles;
/* Call CSR */
Status = CsrClientCallServer(&CsrRequest,
DPRINT1("Calling CsrClientCallServer from BasepCreateFirstThread...\n");
Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
NULL,
CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepCreateProcess),
sizeof(CSR_API_MESSAGE));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(CsrRequest.Status))
sizeof(BASE_CREATE_PROCESS));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(ApiMessage.Status))
{
DPRINT1("Failed to tell csrss about new process: %lx %lx\n", Status, CsrRequest.Status);
DPRINT1("Failed to tell csrss about new process: %lx %lx\n", Status, ApiMessage.Status);
return NULL;
}
@ -1174,24 +1177,25 @@ WINAPI
GetProcessShutdownParameters(OUT LPDWORD lpdwLevel,
OUT LPDWORD lpdwFlags)
{
CSR_API_MESSAGE CsrRequest;
NTSTATUS Status;
BASE_API_MESSAGE ApiMessage;
PBASE_GET_PROCESS_SHUTDOWN_PARAMS GetShutdownParametersRequest = &ApiMessage.Data.GetShutdownParametersRequest;
/* Ask CSRSS for shutdown information */
Status = CsrClientCallServer(&CsrRequest,
Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
NULL,
CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepGetProcessShutdownParam),
sizeof(CSR_API_MESSAGE));
if (!(NT_SUCCESS(Status)) || !(NT_SUCCESS(CsrRequest.Status)))
sizeof(BASE_GET_PROCESS_SHUTDOWN_PARAMS));
if (!(NT_SUCCESS(Status)) || !(NT_SUCCESS(ApiMessage.Status)))
{
/* Return the failure from CSRSS */
BaseSetLastNTError(CsrRequest.Status);
BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
/* Get the data out of the LCP reply */
*lpdwLevel = CsrRequest.Data.GetShutdownParametersRequest.Level;
*lpdwFlags = CsrRequest.Data.GetShutdownParametersRequest.Flags;
*lpdwLevel = GetShutdownParametersRequest->Level;
*lpdwFlags = GetShutdownParametersRequest->Flags;
return TRUE;
}
@ -1203,20 +1207,21 @@ WINAPI
SetProcessShutdownParameters(IN DWORD dwLevel,
IN DWORD dwFlags)
{
CSR_API_MESSAGE CsrRequest;
NTSTATUS Status;
BASE_API_MESSAGE ApiMessage;
PBASE_SET_PROCESS_SHUTDOWN_PARAMS SetShutdownParametersRequest = &ApiMessage.Data.SetShutdownParametersRequest;
/* Write the data into the CSRSS request and send it */
CsrRequest.Data.SetShutdownParametersRequest.Level = dwLevel;
CsrRequest.Data.SetShutdownParametersRequest.Flags = dwFlags;
Status = CsrClientCallServer(&CsrRequest,
SetShutdownParametersRequest->Level = dwLevel;
SetShutdownParametersRequest->Flags = dwFlags;
Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
NULL,
CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepSetProcessShutdownParam),
sizeof(CSR_API_MESSAGE));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(CsrRequest.Status))
sizeof(BASE_SET_PROCESS_SHUTDOWN_PARAMS));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(ApiMessage.Status))
{
/* Return the failure from CSRSS */
BaseSetLastNTError(CsrRequest.Status);
BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
@ -1740,7 +1745,9 @@ VOID
WINAPI
ExitProcess(IN UINT uExitCode)
{
CSR_API_MESSAGE CsrRequest;
BASE_API_MESSAGE ApiMessage;
PBASE_EXIT_PROCESS ExitProcessRequest = &ApiMessage.Data.ExitProcessRequest;
ASSERT(!BaseRunningInServerProcess);
_SEH2_TRY
@ -1755,11 +1762,11 @@ ExitProcess(IN UINT uExitCode)
LdrShutdownProcess();
/* Notify Base Server of process termination */
CsrRequest.Data.TerminateProcessRequest.uExitCode = uExitCode;
CsrClientCallServer(&CsrRequest,
ExitProcessRequest->uExitCode = uExitCode;
CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
NULL,
CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepExitProcess),
sizeof(CSR_API_MESSAGE));
sizeof(BASE_EXIT_PROCESS));
/* Now do it again */
NtTerminateProcess(NtCurrentProcess(), uExitCode);

View file

@ -70,7 +70,7 @@ BaseCheckVDM(IN ULONG BinaryType,
IN PCWCH CommandLine,
IN PCWCH CurrentDirectory,
IN PANSI_STRING AnsiEnvironment,
IN PCSR_API_MESSAGE Msg,
IN PCSR_API_MESSAGE ApiMessage,
IN OUT PULONG iTask,
IN DWORD CreationFlags,
IN LPSTARTUPINFOW StartupInfo)
@ -87,8 +87,10 @@ BaseUpdateVDMEntry(IN ULONG UpdateIndex,
IN ULONG IndexInfo,
IN ULONG BinaryType)
{
#if 0 // Unimplemented in BASESRV
NTSTATUS Status;
CSR_API_MESSAGE Msg;
BASE_API_MESSAGE ApiMessage;
PBASE_UPDATE_VDM_ENTRY UpdateVdmEntry = &ApiMessage.Data.UpdateVdmEntry;
/* Check what update is being sent */
switch (UpdateIndex)
@ -97,16 +99,16 @@ BaseUpdateVDMEntry(IN ULONG UpdateIndex,
case VdmEntryUndo:
/* Tell the server how far we had gotten along */
Msg.Data.UpdateVdmEntry.iTask = (ULONG)*WaitHandle;
Msg.Data.UpdateVdmEntry.VDMCreationState = IndexInfo;
UpdateVdmEntry->iTask = (ULONG)*WaitHandle;
UpdateVdmEntry->VDMCreationState = IndexInfo;
break;
/* VDM is ready with a new process handle */
case VdmEntryUpdateProcess:
/* Send it the process handle */
Msg.Data.UpdateVdmEntry.VDMProcessHandle = *WaitHandle;
Msg.Data.UpdateVdmEntry.iTask = IndexInfo;
UpdateVdmEntry->VDMProcessHandle = *WaitHandle;
UpdateVdmEntry->iTask = IndexInfo;
break;
}
@ -114,32 +116,32 @@ BaseUpdateVDMEntry(IN ULONG UpdateIndex,
if (BinaryType == BINARY_TYPE_WOW)
{
/* Magic value for 16-bit apps */
Msg.Data.UpdateVdmEntry.ConsoleHandle = (HANDLE)-1;
UpdateVdmEntry->ConsoleHandle = (HANDLE)-1;
}
else if (Msg.Data.UpdateVdmEntry.iTask)
else if (UpdateVdmEntry->iTask)
{
/* No handle for true VDM */
Msg.Data.UpdateVdmEntry.ConsoleHandle = 0;
UpdateVdmEntry->ConsoleHandle = 0;
}
else
{
/* Otherwise, send the regular consoel handle */
Msg.Data.UpdateVdmEntry.ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
UpdateVdmEntry->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
}
/* Finally write the index and binary type */
Msg.Data.UpdateVdmEntry.EntryIndex = UpdateIndex;
Msg.Data.UpdateVdmEntry.BinaryType = BinaryType;
UpdateVdmEntry->EntryIndex = UpdateIndex;
UpdateVdmEntry->BinaryType = BinaryType;
/* Send the message to CSRSS */
Status = CsrClientCallServer(&Msg,
Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
NULL,
CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepUpdateVDMEntry),
sizeof(Msg));
if (!(NT_SUCCESS(Status)) || !(NT_SUCCESS(Msg.Status)))
sizeof(BASE_UPDATE_VDM_ENTRY));
if (!(NT_SUCCESS(Status)) || !(NT_SUCCESS(ApiMessage.Status)))
{
/* Handle failure */
BaseSetLastNTError(Msg.Status);
BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
@ -147,9 +149,9 @@ BaseUpdateVDMEntry(IN ULONG UpdateIndex,
if (UpdateIndex == VdmEntryUpdateProcess)
{
/* Return it to the caller */
*WaitHandle = Msg.Data.UpdateVdmEntry.WaitObjectForParent;
*WaitHandle = UpdateVdmEntry->WaitObjectForParent;
}
#endif
/* We made it */
return TRUE;
}
@ -159,9 +161,11 @@ WINAPI
BaseCheckForVDM(IN HANDLE ProcessHandle,
OUT LPDWORD ExitCode)
{
#if 0 // Unimplemented in BASESRV
NTSTATUS Status;
EVENT_BASIC_INFORMATION EventBasicInfo;
CSR_API_MESSAGE Msg;
BASE_API_MESSAGE ApiMessage;
PBASE_GET_VDM_EXIT_CODE GetVdmExitCode = &ApiMessage.Data.GetVdmExitCode;
/* It's VDM if the process is actually a wait handle (an event) */
Status = NtQueryEvent(ProcessHandle,
@ -172,18 +176,19 @@ BaseCheckForVDM(IN HANDLE ProcessHandle,
if (!NT_SUCCESS(Status)) return FALSE;
/* Setup the input parameters */
Msg.Data.GetVdmExitCode.ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
Msg.Data.GetVdmExitCode.hParent = ProcessHandle;
GetVdmExitCode->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
GetVdmExitCode->hParent = ProcessHandle;
/* Call CSRSS */
Status = CsrClientCallServer(&Msg,
Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
NULL,
CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepCheckVDM /* BasepGetVDMExitCode */),
sizeof(Msg));
CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepGetVDMExitCode /* BasepCheckVDM */),
sizeof(BASE_GET_VDM_EXIT_CODE));
if (!NT_SUCCESS(Status)) return FALSE;
/* Get the exit code from the reply */
*ExitCode = Msg.Data.GetVdmExitCode.ExitCode;
*ExitCode = GetVdmExitCode->ExitCode;
#endif
return TRUE;
}

View file

@ -318,8 +318,9 @@ BOOL
WINAPI
GetConsoleHistoryInfo(PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo)
{
CSR_API_MESSAGE Request;
NTSTATUS Status;
CONSOLE_API_MESSAGE ApiMessage;
PCSRSS_GET_HISTORY_INFO GetHistoryInfo = &ApiMessage.Data.GetHistoryInfo;
if (lpConsoleHistoryInfo->cbSize != sizeof(CONSOLE_HISTORY_INFO))
{
@ -327,19 +328,19 @@ GetConsoleHistoryInfo(PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo)
return FALSE;
}
Status = CsrClientCallServer(&Request,
Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
NULL,
CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_HISTORY_INFO),
sizeof(CSR_API_MESSAGE));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetHistory),
sizeof(CSRSS_GET_HISTORY_INFO));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = ApiMessage.Status))
{
BaseSetLastNTError(Status);
return FALSE;
}
lpConsoleHistoryInfo->HistoryBufferSize = Request.Data.GetHistoryInfo.HistoryBufferSize;
lpConsoleHistoryInfo->NumberOfHistoryBuffers = Request.Data.GetHistoryInfo.NumberOfHistoryBuffers;
lpConsoleHistoryInfo->dwFlags = Request.Data.GetHistoryInfo.dwFlags;
lpConsoleHistoryInfo->HistoryBufferSize = GetHistoryInfo->HistoryBufferSize;
lpConsoleHistoryInfo->NumberOfHistoryBuffers = GetHistoryInfo->NumberOfHistoryBuffers;
lpConsoleHistoryInfo->dwFlags = GetHistoryInfo->dwFlags;
return TRUE;
}
@ -354,8 +355,9 @@ BOOL
WINAPI
SetConsoleHistoryInfo(IN PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo)
{
CSR_API_MESSAGE Request;
NTSTATUS Status;
CONSOLE_API_MESSAGE ApiMessage;
PCSRSS_SET_HISTORY_INFO SetHistoryInfo = &ApiMessage.Data.SetHistoryInfo;
if (lpConsoleHistoryInfo->cbSize != sizeof(CONSOLE_HISTORY_INFO))
{
@ -363,15 +365,15 @@ SetConsoleHistoryInfo(IN PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo)
return FALSE;
}
Request.Data.SetHistoryInfo.HistoryBufferSize = lpConsoleHistoryInfo->HistoryBufferSize;
Request.Data.SetHistoryInfo.NumberOfHistoryBuffers = lpConsoleHistoryInfo->NumberOfHistoryBuffers;
Request.Data.SetHistoryInfo.dwFlags = lpConsoleHistoryInfo->dwFlags;
SetHistoryInfo->HistoryBufferSize = lpConsoleHistoryInfo->HistoryBufferSize;
SetHistoryInfo->NumberOfHistoryBuffers = lpConsoleHistoryInfo->NumberOfHistoryBuffers;
SetHistoryInfo->dwFlags = lpConsoleHistoryInfo->dwFlags;
Status = CsrClientCallServer(&Request,
Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
NULL,
CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_HISTORY_INFO),
sizeof(CSR_API_MESSAGE));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetHistory),
sizeof(CSRSS_SET_HISTORY_INFO));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = ApiMessage.Status))
{
BaseSetLastNTError(Status);
return FALSE;