mirror of
https://github.com/reactos/reactos.git
synced 2024-10-04 08:25:53 +00:00
- Add support for mapping the client section in NtAcceptConnectPort.
svn path=/trunk/; revision=24678
This commit is contained in:
parent
bf01f1f77c
commit
be2a6c6ee3
|
@ -51,10 +51,11 @@ NtAcceptConnectPort(OUT PHANDLE PortHandle,
|
|||
KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();
|
||||
NTSTATUS Status;
|
||||
ULONG ConnectionInfoLength;
|
||||
PLPCP_MESSAGE Msg;
|
||||
PLPCP_CONNECTION_MESSAGE ConnectMsg;
|
||||
PLPCP_MESSAGE Message;
|
||||
PLPCP_CONNECTION_MESSAGE ConnectMessage;
|
||||
PEPROCESS ClientProcess;
|
||||
PETHREAD ClientThread;
|
||||
LARGE_INTEGER SectionOffset;
|
||||
PAGED_CODE();
|
||||
LPCTRACE(LPC_COMPLETE_DEBUG,
|
||||
"Context: %p. Message: %p. Accept: %lx. Views: %p/%p\n",
|
||||
|
@ -100,11 +101,11 @@ NtAcceptConnectPort(OUT PHANDLE PortHandle,
|
|||
}
|
||||
|
||||
/* Now get the message and connection message */
|
||||
Msg = ClientThread->LpcReplyMessage;
|
||||
ConnectMsg = (PLPCP_CONNECTION_MESSAGE)(Msg + 1);
|
||||
Message = ClientThread->LpcReplyMessage;
|
||||
ConnectMessage = (PLPCP_CONNECTION_MESSAGE)(Message + 1);
|
||||
|
||||
/* Get the client and connection port as well */
|
||||
ClientPort = ConnectMsg->ClientPort;
|
||||
ClientPort = ConnectMessage->ClientPort;
|
||||
ConnectionPort = ClientPort->ConnectionPort;
|
||||
|
||||
/* Make sure that the reply is being sent to the proper server process */
|
||||
|
@ -122,7 +123,7 @@ NtAcceptConnectPort(OUT PHANDLE PortHandle,
|
|||
ClientThread->LpcReplyMessageId = 0;
|
||||
|
||||
/* Clear the client port for now as well, then release the lock */
|
||||
ConnectMsg->ClientPort = NULL;
|
||||
ConnectMessage->ClientPort = NULL;
|
||||
KeReleaseGuardedMutex(&LpcpLock);
|
||||
|
||||
/* Get the connection information length */
|
||||
|
@ -134,18 +135,18 @@ NtAcceptConnectPort(OUT PHANDLE PortHandle,
|
|||
}
|
||||
|
||||
/* Set the sizes of our reply message */
|
||||
Msg->Request.u1.s1.DataLength = sizeof(LPCP_CONNECTION_MESSAGE) +
|
||||
Message->Request.u1.s1.DataLength = sizeof(LPCP_CONNECTION_MESSAGE) +
|
||||
ConnectionInfoLength;
|
||||
Msg->Request.u1.s1.TotalLength = sizeof(LPCP_MESSAGE) +
|
||||
Msg->Request.u1.s1.DataLength;
|
||||
Message->Request.u1.s1.TotalLength = sizeof(LPCP_MESSAGE) +
|
||||
Message->Request.u1.s1.DataLength;
|
||||
|
||||
/* Setup the reply message */
|
||||
Msg->Request.u2.s2.Type = LPC_REPLY;
|
||||
Msg->Request.u2.s2.DataInfoOffset = 0;
|
||||
Msg->Request.ClientId = ReplyMessage->ClientId;
|
||||
Msg->Request.MessageId = ReplyMessage->MessageId;
|
||||
Msg->Request.ClientViewSize = 0;
|
||||
RtlMoveMemory(ConnectMsg + 1, ReplyMessage + 1, ConnectionInfoLength);
|
||||
Message->Request.u2.s2.Type = LPC_REPLY;
|
||||
Message->Request.u2.s2.DataInfoOffset = 0;
|
||||
Message->Request.ClientId = ReplyMessage->ClientId;
|
||||
Message->Request.MessageId = ReplyMessage->MessageId;
|
||||
Message->Request.ClientViewSize = 0;
|
||||
RtlMoveMemory(ConnectMessage + 1, ReplyMessage + 1, ConnectionInfoLength);
|
||||
|
||||
/* At this point, if the caller refused the connection, go to cleanup */
|
||||
if (!AcceptConnection) goto Cleanup;
|
||||
|
@ -180,19 +181,46 @@ NtAcceptConnectPort(OUT PHANDLE PortHandle,
|
|||
|
||||
/* Also set the creator CID */
|
||||
ServerPort->Creator = PsGetCurrentThread()->Cid;
|
||||
ClientPort->Creator = Msg->Request.ClientId;
|
||||
ClientPort->Creator = Message->Request.ClientId;
|
||||
|
||||
/* Get the section associated and then clear it, while inside the lock */
|
||||
KeAcquireGuardedMutex(&LpcpLock);
|
||||
ClientSectionToMap = ConnectMsg->SectionToMap;
|
||||
ConnectMsg->SectionToMap = NULL;
|
||||
ClientSectionToMap = ConnectMessage->SectionToMap;
|
||||
ConnectMessage->SectionToMap = NULL;
|
||||
KeReleaseGuardedMutex(&LpcpLock);
|
||||
|
||||
/* Now check if there's a client section */
|
||||
if (ClientSectionToMap)
|
||||
{
|
||||
/* FIXME: TODO */
|
||||
ASSERT(FALSE);
|
||||
/* Setup the offset */
|
||||
SectionOffset.QuadPart = ConnectMessage->ClientView.SectionOffset;
|
||||
|
||||
/* Map the section */
|
||||
Status = MmMapViewOfSection(ClientSectionToMap,
|
||||
PsGetCurrentProcess(),
|
||||
&ServerPort->ClientSectionBase,
|
||||
0,
|
||||
0,
|
||||
&SectionOffset,
|
||||
&ConnectMessage->ClientView.ViewSize,
|
||||
ViewUnmap,
|
||||
0,
|
||||
PAGE_READWRITE);
|
||||
|
||||
/* Update the offset and check for mapping status */
|
||||
ConnectMessage->ClientView.SectionOffset = SectionOffset.LowPart;
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
/* Set the view base */
|
||||
ConnectMessage->ClientView.ViewRemoteBase = ServerPort->
|
||||
ClientSectionBase;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Otherwise, quit */
|
||||
ObDereferenceObject(ServerPort);
|
||||
goto Cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check if there's a server section */
|
||||
|
@ -223,8 +251,8 @@ NtAcceptConnectPort(OUT PHANDLE PortHandle,
|
|||
if (ClientView)
|
||||
{
|
||||
/* Fill it out */
|
||||
ClientView->ViewBase = ConnectMsg->ClientView.ViewRemoteBase;
|
||||
ClientView->ViewSize = ConnectMsg->ClientView.ViewSize;
|
||||
ClientView->ViewBase = ConnectMessage->ClientView.ViewRemoteBase;
|
||||
ClientView->ViewSize = ConnectMessage->ClientView.ViewSize;
|
||||
}
|
||||
|
||||
/* Return the handle to user mode */
|
||||
|
@ -232,8 +260,8 @@ NtAcceptConnectPort(OUT PHANDLE PortHandle,
|
|||
LPCTRACE(LPC_COMPLETE_DEBUG,
|
||||
"Handle: %lx. Messages: %p/%p. Ports: %p/%p/%p\n",
|
||||
Handle,
|
||||
Msg,
|
||||
ConnectMsg,
|
||||
Message,
|
||||
ConnectMessage,
|
||||
ServerPort,
|
||||
ClientPort,
|
||||
ConnectionPort);
|
||||
|
@ -244,7 +272,7 @@ NtAcceptConnectPort(OUT PHANDLE PortHandle,
|
|||
|
||||
/* Set this message as the LPC Reply message while holding the lock */
|
||||
KeAcquireGuardedMutex(&LpcpLock);
|
||||
ClientThread->LpcReplyMessage = Msg;
|
||||
ClientThread->LpcReplyMessage = Message;
|
||||
KeReleaseGuardedMutex(&LpcpLock);
|
||||
|
||||
/* Clear the thread pointer so it doesn't get cleaned later */
|
||||
|
|
Loading…
Reference in a new issue