mirror of
https://github.com/reactos/reactos.git
synced 2024-08-01 09:01:13 +00:00
[CSRSRV]: Move the CsrSv* APIs to session.c where they belong. Also enable most of the code in CsrSbCreateSession now since it works, minus one hack needed since we don't have a real BaseSrv yet.
svn path=/trunk/; revision=55637
This commit is contained in:
parent
7816af6cb9
commit
a6998d5930
|
@ -17,20 +17,9 @@
|
|||
|
||||
/* GLOBALS *******************************************************************/
|
||||
|
||||
extern HANDLE hApiPort;
|
||||
|
||||
static unsigned ApiDefinitionsCount = 0;
|
||||
static PCSRSS_API_DEFINITION ApiDefinitions = NULL;
|
||||
|
||||
PCHAR CsrServerSbApiName[5] =
|
||||
{
|
||||
"SbCreateSession",
|
||||
"SbTerminateSession",
|
||||
"SbForeignSessionComplete",
|
||||
"SbCreateProcess",
|
||||
"Unknown Csr Sb Api Number"
|
||||
};
|
||||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
NTSTATUS FASTCALL
|
||||
|
@ -1050,391 +1039,4 @@ CsrReleaseCapturedArguments(IN PCSR_API_MESSAGE ApiMessage)
|
|||
RtlFreeHeap(CsrHeap, 0, RemoteCaptureBuffer);
|
||||
}
|
||||
|
||||
/* SESSION MANAGER FUNCTIONS**************************************************/
|
||||
|
||||
/*++
|
||||
* @name CsrSbCreateSession
|
||||
*
|
||||
* The CsrSbCreateSession API is called by the Session Manager whenever a new
|
||||
* session is created.
|
||||
*
|
||||
* @param ApiMessage
|
||||
* Pointer to the Session Manager API Message.
|
||||
*
|
||||
* @return TRUE in case of success, FALSE othwerwise.
|
||||
*
|
||||
* @remarks The CsrSbCreateSession routine will initialize a new CSR NT
|
||||
* Session and allocate a new CSR Process for the subsystem process.
|
||||
*
|
||||
*--*/
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CsrSbCreateSession(IN PSB_API_MSG ApiMessage)
|
||||
{
|
||||
PSB_CREATE_SESSION_MSG CreateSession = &ApiMessage->CreateSession;
|
||||
HANDLE hProcess, hThread;
|
||||
// PCSR_PROCESS CsrProcess;
|
||||
NTSTATUS Status;
|
||||
KERNEL_USER_TIMES KernelTimes;
|
||||
//PCSR_THREAD CsrThread;
|
||||
//PVOID ProcessData;
|
||||
//ULONG i;
|
||||
|
||||
/* Save the Process and Thread Handles */
|
||||
hProcess = CreateSession->ProcessInfo.ProcessHandle;
|
||||
hThread = CreateSession->ProcessInfo.ThreadHandle;
|
||||
|
||||
#if 0
|
||||
/* Lock the Processes */
|
||||
CsrAcquireProcessLock();
|
||||
|
||||
/* Allocate a new process */
|
||||
CsrProcess = CsrAllocateProcess();
|
||||
if (!CsrProcess)
|
||||
{
|
||||
/* Fail */
|
||||
ApiMessage->ReturnValue = STATUS_NO_MEMORY;
|
||||
CsrReleaseProcessLock();
|
||||
return TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Set the exception port */
|
||||
Status = NtSetInformationProcess(hProcess,
|
||||
ProcessExceptionPort,
|
||||
&hApiPort,//&CsrApiPort,
|
||||
sizeof(HANDLE));
|
||||
|
||||
/* Check for success */
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* Fail the request */
|
||||
#if 0
|
||||
CsrDeallocateProcess(CsrProcess);
|
||||
CsrReleaseProcessLock();
|
||||
#endif
|
||||
/* Strange as it seems, NTSTATUSes are actually returned */
|
||||
return (BOOLEAN)STATUS_NO_MEMORY;
|
||||
}
|
||||
|
||||
/* Get the Create Time */
|
||||
Status = NtQueryInformationThread(hThread,
|
||||
ThreadTimes,
|
||||
&KernelTimes,
|
||||
sizeof(KERNEL_USER_TIMES),
|
||||
NULL);
|
||||
|
||||
/* Check for success */
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* Fail the request */
|
||||
#if 0
|
||||
CsrDeallocateProcess(CsrProcess);
|
||||
CsrReleaseProcessLock();
|
||||
#endif
|
||||
|
||||
/* Strange as it seems, NTSTATUSes are actually returned */
|
||||
return (BOOLEAN)Status;
|
||||
}
|
||||
|
||||
/* Allocate a new Thread */
|
||||
#if 0
|
||||
CsrThread = CsrAllocateThread(CsrProcess);
|
||||
if (!CsrThread)
|
||||
{
|
||||
/* Fail the request */
|
||||
CsrDeallocateProcess(CsrProcess);
|
||||
CsrReleaseProcessLock();
|
||||
|
||||
ApiMessage->ReturnValue = STATUS_NO_MEMORY;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Setup the Thread Object */
|
||||
CsrThread->CreateTime = KernelTimes.CreateTime;
|
||||
CsrThread->ClientId = CreateSession->ProcessInfo.ClientId;
|
||||
CsrThread->ThreadHandle = hThread;
|
||||
ProtectHandle(hThread);
|
||||
CsrThread->Flags = 0;
|
||||
|
||||
/* Insert it into the Process List */
|
||||
CsrInsertThread(CsrProcess, CsrThread);
|
||||
|
||||
/* Setup Process Data */
|
||||
CsrProcess->ClientId = CreateSession->ProcessInfo.ClientId;
|
||||
CsrProcess->ProcessHandle = hProcess;
|
||||
CsrProcess->NtSession = CsrAllocateNtSession(CreateSession->SessionId);
|
||||
|
||||
/* Set the Process Priority */
|
||||
CsrSetBackgroundPriority(CsrProcess);
|
||||
|
||||
/* Get the first data location */
|
||||
ProcessData = &CsrProcess->ServerData[CSR_SERVER_DLL_MAX];
|
||||
|
||||
/* Loop every DLL */
|
||||
for (i = 0; i < CSR_SERVER_DLL_MAX; i++)
|
||||
{
|
||||
/* Check if the DLL is loaded and has Process Data */
|
||||
if (CsrLoadedServerDll[i] && CsrLoadedServerDll[i]->SizeOfProcessData)
|
||||
{
|
||||
/* Write the pointer to the data */
|
||||
CsrProcess->ServerData[i] = ProcessData;
|
||||
|
||||
/* Move to the next data location */
|
||||
ProcessData = (PVOID)((ULONG_PTR)ProcessData +
|
||||
CsrLoadedServerDll[i]->SizeOfProcessData);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Nothing for this Process */
|
||||
CsrProcess->ServerData[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Insert the Process */
|
||||
CsrInsertProcess(NULL, NULL, CsrProcess);
|
||||
#endif
|
||||
/* Activate the Thread */
|
||||
ApiMessage->ReturnValue = NtResumeThread(hThread, NULL);
|
||||
|
||||
/* Release lock and return */
|
||||
// CsrReleaseProcessLock();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrSbForeignSessionComplete
|
||||
*
|
||||
* The CsrSbForeignSessionComplete API is called by the Session Manager
|
||||
* whenever a foreign session is completed (ie: terminated).
|
||||
*
|
||||
* @param ApiMessage
|
||||
* Pointer to the Session Manager API Message.
|
||||
*
|
||||
* @return TRUE in case of success, FALSE othwerwise.
|
||||
*
|
||||
* @remarks The CsrSbForeignSessionComplete API is not yet implemented.
|
||||
*
|
||||
*--*/
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CsrSbForeignSessionComplete(IN PSB_API_MSG ApiMessage)
|
||||
{
|
||||
/* Deprecated/Unimplemented in NT */
|
||||
ApiMessage->ReturnValue = STATUS_NOT_IMPLEMENTED;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrSbTerminateSession
|
||||
*
|
||||
* The CsrSbTerminateSession API is called by the Session Manager
|
||||
* whenever a foreign session should be destroyed.
|
||||
*
|
||||
* @param ApiMessage
|
||||
* Pointer to the Session Manager API Message.
|
||||
*
|
||||
* @return TRUE in case of success, FALSE othwerwise.
|
||||
*
|
||||
* @remarks The CsrSbTerminateSession API is not yet implemented.
|
||||
*
|
||||
*--*/
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CsrSbTerminateSession(IN PSB_API_MSG ApiMessage)
|
||||
{
|
||||
ApiMessage->ReturnValue = STATUS_NOT_IMPLEMENTED;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrSbCreateProcess
|
||||
*
|
||||
* The CsrSbCreateProcess API is called by the Session Manager
|
||||
* whenever a foreign session is created and a new process should be started.
|
||||
*
|
||||
* @param ApiMessage
|
||||
* Pointer to the Session Manager API Message.
|
||||
*
|
||||
* @return TRUE in case of success, FALSE othwerwise.
|
||||
*
|
||||
* @remarks The CsrSbCreateProcess API is not yet implemented.
|
||||
*
|
||||
*--*/
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CsrSbCreateProcess(IN PSB_API_MSG ApiMessage)
|
||||
{
|
||||
ApiMessage->ReturnValue = STATUS_NOT_IMPLEMENTED;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
PSB_API_ROUTINE CsrServerSbApiDispatch[5] =
|
||||
{
|
||||
CsrSbCreateSession,
|
||||
CsrSbTerminateSession,
|
||||
CsrSbForeignSessionComplete,
|
||||
CsrSbCreateProcess,
|
||||
NULL
|
||||
};
|
||||
|
||||
/*++
|
||||
* @name CsrSbApiHandleConnectionRequest
|
||||
*
|
||||
* The CsrSbApiHandleConnectionRequest routine handles and accepts a new
|
||||
* connection request to the SM API LPC Port.
|
||||
*
|
||||
* @param ApiMessage
|
||||
* Pointer to the incoming CSR API Message which contains the
|
||||
* connection request.
|
||||
*
|
||||
* @return STATUS_SUCCESS in case of success, or status code which caused
|
||||
* the routine to error.
|
||||
*
|
||||
* @remarks None.
|
||||
*
|
||||
*--*/
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrSbApiHandleConnectionRequest(IN PSB_API_MSG Message)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
REMOTE_PORT_VIEW RemotePortView;
|
||||
HANDLE hPort;
|
||||
|
||||
/* Set the Port View Structure Length */
|
||||
RemotePortView.Length = sizeof(REMOTE_PORT_VIEW);
|
||||
|
||||
/* Accept the connection */
|
||||
Status = NtAcceptConnectPort(&hPort,
|
||||
NULL,
|
||||
(PPORT_MESSAGE)Message,
|
||||
TRUE,
|
||||
NULL,
|
||||
&RemotePortView);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("CSRSS: Sb Accept Connection failed %lx\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Complete the Connection */
|
||||
Status = NtCompleteConnectPort(hPort);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("CSRSS: Sb Complete Connection failed %lx\n",Status);
|
||||
}
|
||||
|
||||
/* Return status */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrSbApiRequestThread
|
||||
*
|
||||
* The CsrSbApiRequestThread routine handles incoming messages or connection
|
||||
* requests on the SM API LPC Port.
|
||||
*
|
||||
* @param Parameter
|
||||
* System-default user-defined parameter. Unused.
|
||||
*
|
||||
* @return The thread exit code, if the thread is terminated.
|
||||
*
|
||||
* @remarks Before listening on the port, the routine will first attempt
|
||||
* to connect to the user subsystem.
|
||||
*
|
||||
*--*/
|
||||
VOID
|
||||
NTAPI
|
||||
CsrSbApiRequestThread(IN PVOID Parameter)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
SB_API_MSG ReceiveMsg;
|
||||
PSB_API_MSG ReplyMsg = NULL;
|
||||
PVOID PortContext;
|
||||
ULONG MessageType;
|
||||
|
||||
/* Start the loop */
|
||||
while (TRUE)
|
||||
{
|
||||
/* Wait for a message to come in */
|
||||
Status = NtReplyWaitReceivePort(CsrSbApiPort,
|
||||
&PortContext,
|
||||
&ReplyMsg->h,
|
||||
&ReceiveMsg.h);
|
||||
|
||||
/* Check if we didn't get success */
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
/* If we only got a warning, keep going */
|
||||
if (NT_SUCCESS(Status)) continue;
|
||||
|
||||
/* We failed big time, so start out fresh */
|
||||
ReplyMsg = NULL;
|
||||
DPRINT1("CSRSS: ReceivePort failed - Status == %X\n", Status);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Save the message type */
|
||||
MessageType = ReceiveMsg.h.u2.s2.Type;
|
||||
|
||||
/* Check if this is a connection request */
|
||||
if (MessageType == LPC_CONNECTION_REQUEST)
|
||||
{
|
||||
/* Handle connection request */
|
||||
CsrSbApiHandleConnectionRequest(&ReceiveMsg);
|
||||
|
||||
/* Start over */
|
||||
ReplyMsg = NULL;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Check if the port died */
|
||||
if (MessageType == LPC_PORT_CLOSED)
|
||||
{
|
||||
/* Close the handle if we have one */
|
||||
if (PortContext) NtClose((HANDLE)PortContext);
|
||||
|
||||
/* Client died, start over */
|
||||
ReplyMsg = NULL;
|
||||
continue;
|
||||
}
|
||||
else if (MessageType == LPC_CLIENT_DIED)
|
||||
{
|
||||
/* Client died, start over */
|
||||
ReplyMsg = NULL;
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* It's an API Message, check if it's within limits. If it's not, the
|
||||
* NT Behaviour is to set this to the Maximum API.
|
||||
*/
|
||||
if (ReceiveMsg.ApiNumber > SbpMaxApiNumber)
|
||||
{
|
||||
ReceiveMsg.ApiNumber = SbpMaxApiNumber;
|
||||
DPRINT1("CSRSS: %lx is invalid Sb ApiNumber\n", ReceiveMsg.ApiNumber);
|
||||
}
|
||||
|
||||
/* Reuse the message */
|
||||
ReplyMsg = &ReceiveMsg;
|
||||
|
||||
/* Make sure that the message is supported */
|
||||
if (ReceiveMsg.ApiNumber < SbpMaxApiNumber)
|
||||
{
|
||||
/* Call the API */
|
||||
if (!CsrServerSbApiDispatch[ReceiveMsg.ApiNumber](&ReceiveMsg))
|
||||
{
|
||||
/* It failed, so return nothing */
|
||||
ReplyMsg = NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* We don't support this API Number */
|
||||
ReplyMsg->ReturnValue = STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
|
|
@ -18,6 +18,15 @@
|
|||
RTL_CRITICAL_SECTION CsrNtSessionLock;
|
||||
LIST_ENTRY CsrNtSessionList;
|
||||
|
||||
PCHAR CsrServerSbApiName[5] =
|
||||
{
|
||||
"SbCreateSession",
|
||||
"SbTerminateSession",
|
||||
"SbForeignSessionComplete",
|
||||
"SbCreateProcess",
|
||||
"Unknown Csr Sb Api Number"
|
||||
};
|
||||
|
||||
/* PRIVATE FUNCTIONS *********************************************************/
|
||||
|
||||
/*++
|
||||
|
@ -172,4 +181,388 @@ CsrDereferenceNtSession(IN PCSR_NT_SESSION Session,
|
|||
}
|
||||
}
|
||||
|
||||
/* SESSION MANAGER FUNCTIONS**************************************************/
|
||||
|
||||
/*++
|
||||
* @name CsrSbCreateSession
|
||||
*
|
||||
* The CsrSbCreateSession API is called by the Session Manager whenever a new
|
||||
* session is created.
|
||||
*
|
||||
* @param ApiMessage
|
||||
* Pointer to the Session Manager API Message.
|
||||
*
|
||||
* @return TRUE in case of success, FALSE othwerwise.
|
||||
*
|
||||
* @remarks The CsrSbCreateSession routine will initialize a new CSR NT
|
||||
* Session and allocate a new CSR Process for the subsystem process.
|
||||
*
|
||||
*--*/
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CsrSbCreateSession(IN PSB_API_MSG ApiMessage)
|
||||
{
|
||||
PSB_CREATE_SESSION_MSG CreateSession = &ApiMessage->CreateSession;
|
||||
HANDLE hProcess, hThread;
|
||||
PCSR_PROCESS CsrProcess;
|
||||
NTSTATUS Status;
|
||||
KERNEL_USER_TIMES KernelTimes;
|
||||
PCSR_THREAD CsrThread;
|
||||
//PVOID ProcessData;
|
||||
//ULONG i;
|
||||
|
||||
/* Save the Process and Thread Handles */
|
||||
hProcess = CreateSession->ProcessInfo.ProcessHandle;
|
||||
hThread = CreateSession->ProcessInfo.ThreadHandle;
|
||||
|
||||
/* Lock the Processes */
|
||||
CsrAcquireProcessLock();
|
||||
|
||||
/* Allocate a new process */
|
||||
CsrProcess = CsrAllocateProcess();
|
||||
if (!CsrProcess)
|
||||
{
|
||||
/* Fail */
|
||||
ApiMessage->ReturnValue = STATUS_NO_MEMORY;
|
||||
CsrReleaseProcessLock();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Set the exception port */
|
||||
Status = NtSetInformationProcess(hProcess,
|
||||
ProcessExceptionPort,
|
||||
&hApiPort,//&CsrApiPort,
|
||||
sizeof(HANDLE));
|
||||
|
||||
/* Check for success */
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* Fail the request */
|
||||
CsrDeallocateProcess(CsrProcess);
|
||||
CsrReleaseProcessLock();
|
||||
|
||||
/* Strange as it seems, NTSTATUSes are actually returned */
|
||||
return (BOOLEAN)STATUS_NO_MEMORY;
|
||||
}
|
||||
|
||||
/* Get the Create Time */
|
||||
Status = NtQueryInformationThread(hThread,
|
||||
ThreadTimes,
|
||||
&KernelTimes,
|
||||
sizeof(KERNEL_USER_TIMES),
|
||||
NULL);
|
||||
|
||||
/* Check for success */
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* Fail the request */
|
||||
CsrDeallocateProcess(CsrProcess);
|
||||
CsrReleaseProcessLock();
|
||||
|
||||
/* Strange as it seems, NTSTATUSes are actually returned */
|
||||
return (BOOLEAN)Status;
|
||||
}
|
||||
|
||||
/* Allocate a new Thread */
|
||||
CsrThread = CsrAllocateThread(CsrProcess);
|
||||
if (!CsrThread)
|
||||
{
|
||||
/* Fail the request */
|
||||
CsrDeallocateProcess(CsrProcess);
|
||||
CsrReleaseProcessLock();
|
||||
|
||||
ApiMessage->ReturnValue = STATUS_NO_MEMORY;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Setup the Thread Object */
|
||||
CsrThread->CreateTime = KernelTimes.CreateTime;
|
||||
CsrThread->ClientId = CreateSession->ProcessInfo.ClientId;
|
||||
CsrThread->ThreadHandle = hThread;
|
||||
ProtectHandle(hThread);
|
||||
CsrThread->Flags = 0;
|
||||
|
||||
/* Insert it into the Process List */
|
||||
CsrInsertThread(CsrProcess, CsrThread);
|
||||
|
||||
/* Setup Process Data */
|
||||
CsrProcess->ClientId = CreateSession->ProcessInfo.ClientId;
|
||||
CsrProcess->ProcessHandle = hProcess;
|
||||
CsrProcess->NtSession = CsrAllocateNtSession(CreateSession->SessionId);
|
||||
|
||||
/* Set the Process Priority */
|
||||
CsrSetBackgroundPriority(CsrProcess);
|
||||
#if 0
|
||||
/* Get the first data location */
|
||||
ProcessData = &CsrProcess->ServerData[CSR_SERVER_DLL_MAX];
|
||||
|
||||
/* Loop every DLL */
|
||||
for (i = 0; i < CSR_SERVER_DLL_MAX; i++)
|
||||
{
|
||||
/* Check if the DLL is loaded and has Process Data */
|
||||
if (CsrLoadedServerDll[i] && CsrLoadedServerDll[i]->SizeOfProcessData)
|
||||
{
|
||||
/* Write the pointer to the data */
|
||||
CsrProcess->ServerData[i] = ProcessData;
|
||||
|
||||
/* Move to the next data location */
|
||||
ProcessData = (PVOID)((ULONG_PTR)ProcessData +
|
||||
CsrLoadedServerDll[i]->SizeOfProcessData);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Nothing for this Process */
|
||||
CsrProcess->ServerData[i] = NULL;
|
||||
}
|
||||
}
|
||||
#else
|
||||
/* HACKZ: should go in BaseSrv part of CreateCallback done in Insert below */
|
||||
RtlInitializeCriticalSection(&CsrProcess->HandleTableLock);
|
||||
#endif
|
||||
/* Insert the Process */
|
||||
CsrInsertProcess(NULL, NULL, CsrProcess);
|
||||
|
||||
/* Activate the Thread */
|
||||
ApiMessage->ReturnValue = NtResumeThread(hThread, NULL);
|
||||
|
||||
/* Release lock and return */
|
||||
CsrReleaseProcessLock();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrSbForeignSessionComplete
|
||||
*
|
||||
* The CsrSbForeignSessionComplete API is called by the Session Manager
|
||||
* whenever a foreign session is completed (ie: terminated).
|
||||
*
|
||||
* @param ApiMessage
|
||||
* Pointer to the Session Manager API Message.
|
||||
*
|
||||
* @return TRUE in case of success, FALSE othwerwise.
|
||||
*
|
||||
* @remarks The CsrSbForeignSessionComplete API is not yet implemented.
|
||||
*
|
||||
*--*/
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CsrSbForeignSessionComplete(IN PSB_API_MSG ApiMessage)
|
||||
{
|
||||
/* Deprecated/Unimplemented in NT */
|
||||
ApiMessage->ReturnValue = STATUS_NOT_IMPLEMENTED;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrSbTerminateSession
|
||||
*
|
||||
* The CsrSbTerminateSession API is called by the Session Manager
|
||||
* whenever a foreign session should be destroyed.
|
||||
*
|
||||
* @param ApiMessage
|
||||
* Pointer to the Session Manager API Message.
|
||||
*
|
||||
* @return TRUE in case of success, FALSE othwerwise.
|
||||
*
|
||||
* @remarks The CsrSbTerminateSession API is not yet implemented.
|
||||
*
|
||||
*--*/
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CsrSbTerminateSession(IN PSB_API_MSG ApiMessage)
|
||||
{
|
||||
ApiMessage->ReturnValue = STATUS_NOT_IMPLEMENTED;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrSbCreateProcess
|
||||
*
|
||||
* The CsrSbCreateProcess API is called by the Session Manager
|
||||
* whenever a foreign session is created and a new process should be started.
|
||||
*
|
||||
* @param ApiMessage
|
||||
* Pointer to the Session Manager API Message.
|
||||
*
|
||||
* @return TRUE in case of success, FALSE othwerwise.
|
||||
*
|
||||
* @remarks The CsrSbCreateProcess API is not yet implemented.
|
||||
*
|
||||
*--*/
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CsrSbCreateProcess(IN PSB_API_MSG ApiMessage)
|
||||
{
|
||||
ApiMessage->ReturnValue = STATUS_NOT_IMPLEMENTED;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
PSB_API_ROUTINE CsrServerSbApiDispatch[5] =
|
||||
{
|
||||
CsrSbCreateSession,
|
||||
CsrSbTerminateSession,
|
||||
CsrSbForeignSessionComplete,
|
||||
CsrSbCreateProcess,
|
||||
NULL
|
||||
};
|
||||
|
||||
/*++
|
||||
* @name CsrSbApiHandleConnectionRequest
|
||||
*
|
||||
* The CsrSbApiHandleConnectionRequest routine handles and accepts a new
|
||||
* connection request to the SM API LPC Port.
|
||||
*
|
||||
* @param ApiMessage
|
||||
* Pointer to the incoming CSR API Message which contains the
|
||||
* connection request.
|
||||
*
|
||||
* @return STATUS_SUCCESS in case of success, or status code which caused
|
||||
* the routine to error.
|
||||
*
|
||||
* @remarks None.
|
||||
*
|
||||
*--*/
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrSbApiHandleConnectionRequest(IN PSB_API_MSG Message)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
REMOTE_PORT_VIEW RemotePortView;
|
||||
HANDLE hPort;
|
||||
|
||||
/* Set the Port View Structure Length */
|
||||
RemotePortView.Length = sizeof(REMOTE_PORT_VIEW);
|
||||
|
||||
/* Accept the connection */
|
||||
Status = NtAcceptConnectPort(&hPort,
|
||||
NULL,
|
||||
(PPORT_MESSAGE)Message,
|
||||
TRUE,
|
||||
NULL,
|
||||
&RemotePortView);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("CSRSS: Sb Accept Connection failed %lx\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Complete the Connection */
|
||||
Status = NtCompleteConnectPort(hPort);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("CSRSS: Sb Complete Connection failed %lx\n",Status);
|
||||
}
|
||||
|
||||
/* Return status */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrSbApiRequestThread
|
||||
*
|
||||
* The CsrSbApiRequestThread routine handles incoming messages or connection
|
||||
* requests on the SM API LPC Port.
|
||||
*
|
||||
* @param Parameter
|
||||
* System-default user-defined parameter. Unused.
|
||||
*
|
||||
* @return The thread exit code, if the thread is terminated.
|
||||
*
|
||||
* @remarks Before listening on the port, the routine will first attempt
|
||||
* to connect to the user subsystem.
|
||||
*
|
||||
*--*/
|
||||
VOID
|
||||
NTAPI
|
||||
CsrSbApiRequestThread(IN PVOID Parameter)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
SB_API_MSG ReceiveMsg;
|
||||
PSB_API_MSG ReplyMsg = NULL;
|
||||
PVOID PortContext;
|
||||
ULONG MessageType;
|
||||
|
||||
/* Start the loop */
|
||||
while (TRUE)
|
||||
{
|
||||
/* Wait for a message to come in */
|
||||
Status = NtReplyWaitReceivePort(CsrSbApiPort,
|
||||
&PortContext,
|
||||
&ReplyMsg->h,
|
||||
&ReceiveMsg.h);
|
||||
|
||||
/* Check if we didn't get success */
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
/* If we only got a warning, keep going */
|
||||
if (NT_SUCCESS(Status)) continue;
|
||||
|
||||
/* We failed big time, so start out fresh */
|
||||
ReplyMsg = NULL;
|
||||
DPRINT1("CSRSS: ReceivePort failed - Status == %X\n", Status);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Save the message type */
|
||||
MessageType = ReceiveMsg.h.u2.s2.Type;
|
||||
|
||||
/* Check if this is a connection request */
|
||||
if (MessageType == LPC_CONNECTION_REQUEST)
|
||||
{
|
||||
/* Handle connection request */
|
||||
CsrSbApiHandleConnectionRequest(&ReceiveMsg);
|
||||
|
||||
/* Start over */
|
||||
ReplyMsg = NULL;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Check if the port died */
|
||||
if (MessageType == LPC_PORT_CLOSED)
|
||||
{
|
||||
/* Close the handle if we have one */
|
||||
if (PortContext) NtClose((HANDLE)PortContext);
|
||||
|
||||
/* Client died, start over */
|
||||
ReplyMsg = NULL;
|
||||
continue;
|
||||
}
|
||||
else if (MessageType == LPC_CLIENT_DIED)
|
||||
{
|
||||
/* Client died, start over */
|
||||
ReplyMsg = NULL;
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* It's an API Message, check if it's within limits. If it's not, the
|
||||
* NT Behaviour is to set this to the Maximum API.
|
||||
*/
|
||||
if (ReceiveMsg.ApiNumber > SbpMaxApiNumber)
|
||||
{
|
||||
ReceiveMsg.ApiNumber = SbpMaxApiNumber;
|
||||
DPRINT1("CSRSS: %lx is invalid Sb ApiNumber\n", ReceiveMsg.ApiNumber);
|
||||
}
|
||||
|
||||
/* Reuse the message */
|
||||
ReplyMsg = &ReceiveMsg;
|
||||
|
||||
/* Make sure that the message is supported */
|
||||
if (ReceiveMsg.ApiNumber < SbpMaxApiNumber)
|
||||
{
|
||||
/* Call the API */
|
||||
if (!CsrServerSbApiDispatch[ReceiveMsg.ApiNumber](&ReceiveMsg))
|
||||
{
|
||||
/* It failed, so return nothing */
|
||||
ReplyMsg = NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* We don't support this API Number */
|
||||
ReplyMsg->ReturnValue = STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
|
|
@ -91,7 +91,7 @@ typedef struct _CSR_PROCESS
|
|||
LIST_ENTRY ListLink;
|
||||
LIST_ENTRY ThreadList;
|
||||
struct _CSR_PROCESS *Parent;
|
||||
// PCSR_NT_SESSION NtSession;
|
||||
PCSR_NT_SESSION NtSession;
|
||||
ULONG ExpectedVersion;
|
||||
HANDLE ClientPort;
|
||||
ULONG_PTR ClientViewBase;
|
||||
|
@ -229,6 +229,7 @@ VOID
|
|||
NTAPI
|
||||
CsrReleaseCapturedArguments(IN PCSR_API_MESSAGE ApiMessage);
|
||||
|
||||
extern HANDLE hApiPort;
|
||||
extern HANDLE CsrSmApiPort;
|
||||
extern HANDLE CsrSbApiPort;
|
||||
extern LIST_ENTRY CsrThreadHashTable[256];
|
||||
|
|
Loading…
Reference in a new issue