mirror of
https://github.com/reactos/reactos.git
synced 2024-10-21 00:18:26 +00:00
- Try to get or to allocate the process data structure in ServerApiPortThread.
- Changed the initialization sequence in CsrServerInitialization. svn path=/trunk/; revision=9980
This commit is contained in:
parent
9a64b81079
commit
c973b907c8
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: wapi.c,v 1.36 2004/06/27 12:21:32 weiden Exp $
|
/* $Id: wapi.c,v 1.37 2004/07/03 17:15:02 hbirr Exp $
|
||||||
*
|
*
|
||||||
* reactos/subsys/csrss/api/wapi.c
|
* reactos/subsys/csrss/api/wapi.c
|
||||||
*
|
*
|
||||||
|
@ -97,8 +97,8 @@ CsrApiCallHandler(PCSRSS_PROCESS_DATA ProcessData,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void STDCALL
|
||||||
Thread_Api2(HANDLE ServerPort)
|
ClientConnectionThread(HANDLE ServerPort)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
LPC_MAX_MESSAGE LpcReply;
|
LPC_MAX_MESSAGE LpcReply;
|
||||||
|
@ -118,26 +118,31 @@ Thread_Api2(HANDLE ServerPort)
|
||||||
if (! NT_SUCCESS(Status))
|
if (! NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
DPRINT1("CSR: NtReplyWaitReceivePort failed\n");
|
DPRINT1("CSR: NtReplyWaitReceivePort failed\n");
|
||||||
NtClose(ServerPort);
|
break;
|
||||||
RtlRosExitUserThread(Status);
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (LpcRequest.Header.MessageType == LPC_PORT_CLOSED)
|
if (LpcRequest.Header.MessageType == LPC_PORT_CLOSED)
|
||||||
{
|
{
|
||||||
CsrFreeProcessData( (ULONG)LpcRequest.Header.ClientId.UniqueProcess );
|
CsrFreeProcessData( (ULONG)LpcRequest.Header.ClientId.UniqueProcess );
|
||||||
NtClose(ServerPort);
|
break;
|
||||||
RtlRosExitUserThread(STATUS_SUCCESS);
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Request = (PCSRSS_API_REQUEST)&LpcRequest;
|
Request = (PCSRSS_API_REQUEST)&LpcRequest;
|
||||||
Reply = (PCSRSS_API_REPLY)&LpcReply;
|
Reply = (PCSRSS_API_REPLY)&LpcReply;
|
||||||
|
|
||||||
ProcessData = CsrGetProcessData((ULONG)LpcRequest.Header.ClientId.UniqueProcess);
|
ProcessData = CsrGetProcessData((ULONG)LpcRequest.Header.ClientId.UniqueProcess);
|
||||||
|
if (ProcessData == NULL)
|
||||||
|
{
|
||||||
|
DPRINT1("CSR: Message %d: Unable to find data for process %d\n",
|
||||||
|
LpcRequest.Header.MessageType, (ULONG)LpcRequest.Header.ClientId.UniqueProcess);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
CsrApiCallHandler(ProcessData, Request, Reply);
|
CsrApiCallHandler(ProcessData, Request, Reply);
|
||||||
}
|
}
|
||||||
|
NtClose(ServerPort);
|
||||||
|
RtlRosExitUserThread(STATUS_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
|
@ -148,7 +153,8 @@ Thread_Api2(HANDLE ServerPort)
|
||||||
* Handle connection requests from clients to the port
|
* Handle connection requests from clients to the port
|
||||||
* "\Windows\ApiPort".
|
* "\Windows\ApiPort".
|
||||||
*/
|
*/
|
||||||
void Thread_Api(PVOID PortHandle)
|
void STDCALL
|
||||||
|
ServerApiPortThead(PVOID PortHandle)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
LPC_MAX_MESSAGE Request;
|
LPC_MAX_MESSAGE Request;
|
||||||
|
@ -161,14 +167,14 @@ void Thread_Api(PVOID PortHandle)
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
LPC_SECTION_READ LpcRead;
|
LPC_SECTION_READ LpcRead;
|
||||||
|
ServerPort = NULL;
|
||||||
|
|
||||||
Status = NtListenPort(PortHandle, &Request.Header);
|
Status = NtListenPort(PortHandle, &Request.Header);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
DPRINT1("CSR: NtListenPort() failed\n");
|
DPRINT1("CSR: NtListenPort() failed\n");
|
||||||
NtTerminateThread(NtCurrentThread(), Status);
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = NtAcceptConnectPort(&ServerPort,
|
Status = NtAcceptConnectPort(&ServerPort,
|
||||||
PortHandle,
|
PortHandle,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -178,10 +184,19 @@ void Thread_Api(PVOID PortHandle)
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
DPRINT1("CSR: NtAcceptConnectPort() failed\n");
|
DPRINT1("CSR: NtAcceptConnectPort() failed\n");
|
||||||
NtTerminateThread(NtCurrentThread(), Status);
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ProcessData = CsrGetProcessData((ULONG)Request.Header.ClientId.UniqueProcess);
|
ProcessData = CsrCreateProcessData((ULONG)Request.Header.ClientId.UniqueProcess);
|
||||||
|
if (ProcessData == NULL)
|
||||||
|
{
|
||||||
|
DPRINT1("Unable to allocate or find data for process %d\n",
|
||||||
|
(ULONG)Request.Header.ClientId.UniqueProcess);
|
||||||
|
Status = STATUS_UNSUCCESSFUL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
ProcessData->CsrSectionViewBase = LpcRead.ViewBase;
|
ProcessData->CsrSectionViewBase = LpcRead.ViewBase;
|
||||||
ProcessData->CsrSectionViewSize = LpcRead.ViewSize;
|
ProcessData->CsrSectionViewSize = LpcRead.ViewSize;
|
||||||
|
|
||||||
|
@ -189,7 +204,7 @@ void Thread_Api(PVOID PortHandle)
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
DPRINT1("CSR: NtCompleteConnectPort() failed\n");
|
DPRINT1("CSR: NtCompleteConnectPort() failed\n");
|
||||||
NtTerminateThread(NtCurrentThread(), Status);
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = RtlCreateUserThread(NtCurrentProcess(),
|
Status = RtlCreateUserThread(NtCurrentProcess(),
|
||||||
|
@ -198,18 +213,23 @@ void Thread_Api(PVOID PortHandle)
|
||||||
0,
|
0,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
(PTHREAD_START_ROUTINE)Thread_Api2,
|
(PTHREAD_START_ROUTINE)ClientConnectionThread,
|
||||||
ServerPort,
|
ServerPort,
|
||||||
&ServerThread,
|
&ServerThread,
|
||||||
NULL);
|
NULL);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
DPRINT1("CSR: Unable to create server thread\n");
|
DPRINT1("CSR: Unable to create server thread\n");
|
||||||
NtClose(ServerPort);
|
break;
|
||||||
NtTerminateThread(NtCurrentThread(), Status);
|
|
||||||
}
|
}
|
||||||
NtClose(ServerThread);
|
NtClose(ServerThread);
|
||||||
}
|
}
|
||||||
|
if (ServerPort)
|
||||||
|
{
|
||||||
|
NtClose(ServerPort);
|
||||||
|
}
|
||||||
|
NtClose(PortHandle);
|
||||||
|
NtTerminateThread(NtCurrentThread(), Status);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: api.h,v 1.4 2004/01/11 17:31:15 gvg Exp $
|
/* $Id: api.h,v 1.5 2004/07/03 17:15:02 hbirr Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS system libraries
|
* PROJECT: ReactOS system libraries
|
||||||
|
@ -96,7 +96,7 @@ NTSTATUS FASTCALL CsrApiRegisterDefinitions(PCSRSS_API_DEFINITION NewDefinitions
|
||||||
VOID FASTCALL CsrApiCallHandler(PCSRSS_PROCESS_DATA ProcessData,
|
VOID FASTCALL CsrApiCallHandler(PCSRSS_PROCESS_DATA ProcessData,
|
||||||
PCSRSS_API_REQUEST Request,
|
PCSRSS_API_REQUEST Request,
|
||||||
PCSRSS_API_REPLY Reply);
|
PCSRSS_API_REPLY Reply);
|
||||||
VOID Thread_Api(PVOID PortHandle);
|
VOID STDCALL ServerApiPortThead(PVOID PortHandle);
|
||||||
VOID Console_Api( DWORD Ignored );
|
VOID Console_Api( DWORD Ignored );
|
||||||
|
|
||||||
extern HANDLE CsrssApiHeap;
|
extern HANDLE CsrssApiHeap;
|
||||||
|
@ -107,6 +107,7 @@ VOID STDCALL CsrInitConsoleSupport(VOID);
|
||||||
/* api/process.c */
|
/* api/process.c */
|
||||||
VOID STDCALL CsrInitProcessData(VOID);
|
VOID STDCALL CsrInitProcessData(VOID);
|
||||||
PCSRSS_PROCESS_DATA STDCALL CsrGetProcessData(ULONG ProcessId);
|
PCSRSS_PROCESS_DATA STDCALL CsrGetProcessData(ULONG ProcessId);
|
||||||
|
PCSRSS_PROCESS_DATA STDCALL CsrCreateProcessData(ULONG ProcessId);
|
||||||
NTSTATUS STDCALL CsrFreeProcessData( ULONG Pid );
|
NTSTATUS STDCALL CsrFreeProcessData( ULONG Pid );
|
||||||
|
|
||||||
/* api/handle.c */
|
/* api/handle.c */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: init.c,v 1.27 2004/05/28 21:33:41 gvg Exp $
|
/* $Id: init.c,v 1.28 2004/07/03 17:15:02 hbirr Exp $
|
||||||
*
|
*
|
||||||
* reactos/subsys/csrss/init.c
|
* reactos/subsys/csrss/init.c
|
||||||
*
|
*
|
||||||
|
@ -249,7 +249,6 @@ CsrServerInitialization (
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
CsrIsCsrss( );
|
|
||||||
CsrInitVideo();
|
CsrInitVideo();
|
||||||
|
|
||||||
CsrssApiHeap = RtlCreateHeap(HEAP_GROWABLE,
|
CsrssApiHeap = RtlCreateHeap(HEAP_GROWABLE,
|
||||||
|
@ -270,13 +269,6 @@ CsrServerInitialization (
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = InitWin32Csr();
|
|
||||||
if (! NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
DPRINT1("CSR: Unable to load usermode dll (Status %x)\n", Status);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* NEW NAMED PORT: \ApiPort */
|
/* NEW NAMED PORT: \ApiPort */
|
||||||
RtlRosInitUnicodeStringFromLiteral(&PortName, L"\\Windows\\ApiPort");
|
RtlRosInitUnicodeStringFromLiteral(&PortName, L"\\Windows\\ApiPort");
|
||||||
InitializeObjectAttributes(&ObAttributes,
|
InitializeObjectAttributes(&ObAttributes,
|
||||||
|
@ -300,7 +292,7 @@ CsrServerInitialization (
|
||||||
0,
|
0,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
(PTHREAD_START_ROUTINE)Thread_Api,
|
(PTHREAD_START_ROUTINE)ServerApiPortThead,
|
||||||
ApiPortHandle,
|
ApiPortHandle,
|
||||||
NULL,
|
NULL,
|
||||||
NULL);
|
NULL);
|
||||||
|
@ -310,6 +302,18 @@ CsrServerInitialization (
|
||||||
NtClose(ApiPortHandle);
|
NtClose(ApiPortHandle);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
Status = CsrClientConnectToServer();
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
DPRINT1("CsrClientConnectToServer() failed (Status %x)\n", Status);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
Status = InitWin32Csr();
|
||||||
|
if (! NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
DPRINT1("CSR: Unable to load usermode dll (Status %x)\n", Status);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
return CallInitComplete();
|
return CallInitComplete();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue