windows-nt/Source/XPSP1/NT/base/subsys/csr/server/sbapi.c
2020-09-26 16:20:57 +08:00

154 lines
3.7 KiB
C

/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
sbapi.c
Abstract:
This module contains the implementations of the Sb API calls exported
by the Server side of the Client-Server Runtime Subsystem to the
Session Manager SubSystem.
Author:
Steve Wood (stevewo) 8-Oct-1990
Revision History:
--*/
#include "csrsrv.h"
BOOLEAN
CsrSbCreateSession(
IN PSBAPIMSG Msg
)
{
PSBCREATESESSION a = &Msg->u.CreateSession;
PCSR_PROCESS Process;
PCSR_THREAD Thread;
PVOID ProcessDataPtr;
ULONG i;
NTSTATUS Status;
HANDLE ProcessHandle;
HANDLE ThreadHandle;
KERNEL_USER_TIMES TimeInfo;
ProcessHandle = a->ProcessInformation.Process;
ThreadHandle = a->ProcessInformation.Thread;
AcquireProcessStructureLock();
Process = CsrAllocateProcess();
if (Process == NULL) {
Msg->ReturnedStatus = STATUS_NO_MEMORY;
ReleaseProcessStructureLock();
return( TRUE );
}
Status = NtSetInformationProcess(
ProcessHandle,
ProcessExceptionPort,
&CsrApiPort,
sizeof(HANDLE)
);
if ( !NT_SUCCESS(Status) ) {
CsrDeallocateProcess( Process );
ReleaseProcessStructureLock();
return( (BOOLEAN)STATUS_NO_MEMORY );
}
//
// capture the thread's createtime so that we can use
// this as a sequence number
//
Status = NtQueryInformationThread(
ThreadHandle,
ThreadTimes,
(PVOID)&TimeInfo,
sizeof(TimeInfo),
NULL
);
if ( !NT_SUCCESS(Status) ) {
CsrDeallocateProcess( Process );
ReleaseProcessStructureLock();
return( (BOOLEAN)Status );
}
Thread = CsrAllocateThread( Process );
if (Thread == NULL) {
CsrDeallocateProcess( Process );
Msg->ReturnedStatus = STATUS_NO_MEMORY;
ReleaseProcessStructureLock();
return( TRUE );
}
Thread->CreateTime = TimeInfo.CreateTime;
Thread->ClientId = a->ProcessInformation.ClientId;
Thread->ThreadHandle = a->ProcessInformation.Thread;
ProtectHandle(Thread->ThreadHandle);
Thread->Flags = 0;
CsrInsertThread( Process, Thread );
//
// this needs a little more thought
//
Process->NtSession = CsrAllocateNtSession( a->SessionId );
Process->ClientId = a->ProcessInformation.ClientId;
Process->ProcessHandle = a->ProcessInformation.Process;
CsrSetBackgroundPriority(Process);
//
// initialize each DLL's per process data area.
//
ProcessDataPtr = (PVOID)QUAD_ALIGN(&Process->ServerDllPerProcessData[CSR_MAX_SERVER_DLL]);
for (i=0;i<CSR_MAX_SERVER_DLL;i++) {
if (CsrLoadedServerDll[i] != NULL && CsrLoadedServerDll[i]->PerProcessDataLength) {
Process->ServerDllPerProcessData[i] = ProcessDataPtr;
ProcessDataPtr = (PVOID)QUAD_ALIGN((PCHAR)ProcessDataPtr + CsrLoadedServerDll[i]->PerProcessDataLength);
}
else {
Process->ServerDllPerProcessData[i] = NULL;
}
}
CsrInsertProcess( NULL, NULL, Process );
Msg->ReturnedStatus = NtResumeThread( a->ProcessInformation.Thread,
NULL
);
ReleaseProcessStructureLock();
return( TRUE );
}
BOOLEAN
CsrSbTerminateSession(
IN PSBAPIMSG Msg
)
{
PSBTERMINATESESSION a = &Msg->u.TerminateSession;
Msg->ReturnedStatus = STATUS_NOT_IMPLEMENTED;
return( TRUE );
}
BOOLEAN
CsrSbForeignSessionComplete(
IN PSBAPIMSG Msg
)
{
PSBFOREIGNSESSIONCOMPLETE a = &Msg->u.ForeignSessionComplete;
Msg->ReturnedStatus = STATUS_NOT_IMPLEMENTED;
return( TRUE );
}