You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
569 lines
11 KiB
569 lines
11 KiB
/*++
|
|
|
|
Copyright (c) 1990 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
csrsrv.h
|
|
|
|
Abstract:
|
|
|
|
Main include file for Server side of the Client Server Runtime (CSR)
|
|
|
|
Author:
|
|
|
|
Steve Wood (stevewo) 8-Oct-1990
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
//
|
|
// Include definitions common between the Client and Server portions.
|
|
//
|
|
|
|
#include <csr.h>
|
|
|
|
//
|
|
// Include definitions specific to the Server portion.
|
|
//
|
|
|
|
#include <ntcsrsrv.h>
|
|
|
|
#define NOEXTAPI
|
|
#include <wdbgexts.h>
|
|
#include <ntdbg.h>
|
|
|
|
//
|
|
// Define debugging flags and macro for testing them. All debug code
|
|
// should be contained within a IF_CSR_DEBUG macro call so that when
|
|
// the system is compiled with debug code disabled, none of the code
|
|
// is generated.
|
|
//
|
|
|
|
#if DBG
|
|
#define CSR_DEBUG_INIT 0x00000001
|
|
#define CSR_DEBUG_LPC 0x00000002
|
|
#define CSR_DEBUG_FLAG3 0x00000004
|
|
#define CSR_DEBUG_FLAG4 0x00000008
|
|
#define CSR_DEBUG_FLAG5 0x00000010
|
|
#define CSR_DEBUG_FLAG6 0x00000020
|
|
#define CSR_DEBUG_FLAG7 0x00000040
|
|
#define CSR_DEBUG_FLAG8 0x00000080
|
|
#define CSR_DEBUG_FLAG9 0x00000100
|
|
#define CSR_DEBUG_FLAG10 0x00000200
|
|
#define CSR_DEBUG_FLAG11 0x00000400
|
|
#define CSR_DEBUG_FLAG12 0x00000800
|
|
#define CSR_DEBUG_FLAG13 0x00001000
|
|
#define CSR_DEBUG_FLAG14 0x00002000
|
|
#define CSR_DEBUG_FLAG15 0x00004000
|
|
#define CSR_DEBUG_FLAG16 0x00008000
|
|
#define CSR_DEBUG_FLAG17 0x00010000
|
|
#define CSR_DEBUG_FLAG18 0x00020000
|
|
#define CSR_DEBUG_FLAG19 0x00040000
|
|
#define CSR_DEBUG_FLAG20 0x00080000
|
|
#define CSR_DEBUG_FLAG21 0x00100000
|
|
#define CSR_DEBUG_FLAG22 0x00200000
|
|
#define CSR_DEBUG_FLAG23 0x00400000
|
|
#define CSR_DEBUG_FLAG24 0x00800000
|
|
#define CSR_DEBUG_FLAG25 0x01000000
|
|
#define CSR_DEBUG_FLAG26 0x02000000
|
|
#define CSR_DEBUG_FLAG27 0x04000000
|
|
#define CSR_DEBUG_FLAG28 0x08000000
|
|
#define CSR_DEBUG_FLAG29 0x10000000
|
|
#define CSR_DEBUG_FLAG30 0x20000000
|
|
#define CSR_DEBUG_FLAG31 0x40000000
|
|
#define CSR_DEBUG_FLAG32 0x80000000
|
|
|
|
ULONG CsrDebug;
|
|
|
|
#define IF_CSR_DEBUG( ComponentFlag ) \
|
|
if (CsrDebug & (CSR_DEBUG_ ## ComponentFlag))
|
|
|
|
#define SafeBreakPoint() \
|
|
if (NtCurrentPeb()->BeingDebugged) { \
|
|
DbgBreakPoint(); \
|
|
}
|
|
|
|
#else
|
|
#define IF_CSR_DEBUG( ComponentFlag ) if (FALSE)
|
|
|
|
#define SafeBreakPoint()
|
|
|
|
#endif
|
|
|
|
#if DBG
|
|
|
|
#define CSRSS_PROTECT_HANDLES 1
|
|
|
|
BOOLEAN
|
|
ProtectHandle(
|
|
HANDLE hObject
|
|
);
|
|
|
|
BOOLEAN
|
|
UnProtectHandle(
|
|
HANDLE hObject
|
|
);
|
|
|
|
#else
|
|
|
|
#define CSRSS_PROTECT_HANDLES 0
|
|
|
|
#define ProtectHandle( hObject )
|
|
#define UnProtectHandle( hObject )
|
|
|
|
#endif
|
|
|
|
|
|
//
|
|
// Include NT Session Manager and Debug SubSystem Interfaces
|
|
//
|
|
|
|
#include <ntsm.h>
|
|
typedef BOOLEAN (*PSB_API_ROUTINE)( IN PSBAPIMSG SbApiMsg );
|
|
|
|
//
|
|
// Global data accessed by Client-Server Runtime Server
|
|
//
|
|
|
|
PVOID CsrHeap;
|
|
|
|
HANDLE CsrObjectDirectory;
|
|
|
|
#define CSR_SBAPI_PORT_NAME L"SbApiPort"
|
|
|
|
UNICODE_STRING CsrDirectoryName;
|
|
UNICODE_STRING CsrApiPortName;
|
|
UNICODE_STRING CsrSbApiPortName;
|
|
|
|
HANDLE CsrApiPort;
|
|
HANDLE CsrSbApiPort;
|
|
HANDLE CsrSmApiPort;
|
|
|
|
ULONG CsrMaxApiRequestThreads;
|
|
|
|
#define CSR_MAX_THREADS 16
|
|
|
|
#define CSR_STATIC_API_THREAD 0x00000010
|
|
|
|
PCSR_THREAD CsrSbApiRequestThreadPtr;
|
|
|
|
#define FIRST_SEQUENCE_COUNT 5
|
|
|
|
//
|
|
// Routines defined in srvinit.c
|
|
//
|
|
|
|
|
|
//
|
|
// Hydra Specific Globals and prototypes
|
|
//
|
|
|
|
#define SESSION_ROOT L"\\Sessions"
|
|
#define DOSDEVICES L"\\DosDevices"
|
|
#define MAX_SESSION_PATH 256
|
|
ULONG SessionId;
|
|
HANDLE SessionObjectDirectory;
|
|
HANDLE DosDevicesDirectory;
|
|
HANDLE BNOLinksDirectory;
|
|
HANDLE SessionsObjectDirectory;
|
|
|
|
NTSTATUS
|
|
CsrCreateSessionObjectDirectory( ULONG SessionID );
|
|
|
|
//
|
|
// The CsrNtSysInfo global variable contains NT specific constants of
|
|
// interest, such as page size, allocation granularity, etc. It is filled
|
|
// in once during process initialization.
|
|
//
|
|
|
|
SYSTEM_BASIC_INFORMATION CsrNtSysInfo;
|
|
|
|
#define ROUND_UP_TO_PAGES(SIZE) (((ULONG)(SIZE) + CsrNtSysInfo.PageSize - 1) & ~(CsrNtSysInfo.PageSize - 1))
|
|
#define ROUND_DOWN_TO_PAGES(SIZE) (((ULONG)(SIZE)) & ~(CsrNtSysInfo.PageSize - 1))
|
|
|
|
#define QUAD_ALIGN(VALUE) ( ((ULONG_PTR)(VALUE) + 7) & ~7 )
|
|
|
|
NTSTATUS
|
|
CsrParseServerCommandLine(
|
|
IN ULONG argc,
|
|
IN PCH argv[]
|
|
);
|
|
|
|
NTSTATUS
|
|
CsrServerDllInitialization(
|
|
IN PCSR_SERVER_DLL LoadedServerDll
|
|
);
|
|
|
|
NTSTATUS
|
|
CsrSrvUnusedFunction(
|
|
IN OUT PCSR_API_MSG m,
|
|
IN OUT PCSR_REPLY_STATUS ReplyStatus
|
|
);
|
|
|
|
NTSTATUS
|
|
CsrEnablePrivileges(
|
|
VOID
|
|
);
|
|
|
|
|
|
//
|
|
// Routines define in srvdebug.c
|
|
//
|
|
|
|
#if DBG
|
|
|
|
#else
|
|
|
|
#endif // DBG
|
|
|
|
|
|
|
|
//
|
|
// Routines defined in sbinit.c
|
|
//
|
|
|
|
NTSTATUS
|
|
CsrSbApiPortInitialize( VOID );
|
|
|
|
|
|
VOID
|
|
CsrSbApiPortTerminate(
|
|
NTSTATUS Status
|
|
);
|
|
|
|
//
|
|
// Routines defined in sbreqst.c
|
|
//
|
|
|
|
NTSTATUS
|
|
CsrSbApiRequestThread(
|
|
IN PVOID Parameter
|
|
);
|
|
|
|
//
|
|
// Routines defined in sbapi.c
|
|
//
|
|
|
|
BOOLEAN
|
|
CsrSbCreateSession(
|
|
IN PSBAPIMSG Msg
|
|
);
|
|
|
|
BOOLEAN
|
|
CsrSbTerminateSession(
|
|
IN PSBAPIMSG Msg
|
|
);
|
|
|
|
BOOLEAN
|
|
CsrSbForeignSessionComplete(
|
|
IN PSBAPIMSG Msg
|
|
);
|
|
|
|
//
|
|
// Routines defined in session.c
|
|
//
|
|
|
|
RTL_CRITICAL_SECTION CsrNtSessionLock;
|
|
LIST_ENTRY CsrNtSessionList;
|
|
|
|
#define LockNtSessionList() RtlEnterCriticalSection( &CsrNtSessionLock )
|
|
#define UnlockNtSessionList() RtlLeaveCriticalSection( &CsrNtSessionLock )
|
|
|
|
NTSTATUS
|
|
CsrInitializeNtSessionList( VOID );
|
|
|
|
PCSR_NT_SESSION
|
|
CsrAllocateNtSession(
|
|
ULONG SessionId
|
|
);
|
|
|
|
VOID
|
|
CsrReferenceNtSession(
|
|
PCSR_NT_SESSION Session
|
|
);
|
|
|
|
VOID
|
|
CsrDereferenceNtSession(
|
|
PCSR_NT_SESSION Session,
|
|
NTSTATUS ExitStatus
|
|
);
|
|
|
|
|
|
//
|
|
// Routines defined in apiinit.c
|
|
//
|
|
|
|
NTSTATUS
|
|
CsrApiPortInitialize( VOID );
|
|
|
|
|
|
//
|
|
// Routines defined in apireqst.c
|
|
//
|
|
|
|
NTSTATUS
|
|
CsrApiRequestThread(
|
|
IN PVOID Parameter
|
|
);
|
|
|
|
BOOLEAN
|
|
CsrCaptureArguments(
|
|
IN PCSR_THREAD t,
|
|
IN PCSR_API_MSG m
|
|
);
|
|
|
|
VOID
|
|
CsrReleaseCapturedArguments(
|
|
IN PCSR_API_MSG m
|
|
);
|
|
|
|
ULONG
|
|
CsrSrvNullApiCall(
|
|
IN OUT PCSR_API_MSG m,
|
|
IN OUT PCSR_REPLY_STATUS ReplyStatus
|
|
);
|
|
|
|
|
|
//
|
|
// Routines and data defined in srvloadr.c
|
|
//
|
|
|
|
#define CSR_MAX_SERVER_DLL 4
|
|
|
|
PCSR_SERVER_DLL CsrLoadedServerDll[ CSR_MAX_SERVER_DLL ];
|
|
|
|
ULONG CsrTotalPerProcessDataLength;
|
|
HANDLE CsrSrvSharedSection;
|
|
ULONG CsrSrvSharedSectionSize;
|
|
PVOID CsrSrvSharedSectionBase;
|
|
PVOID CsrSrvSharedSectionHeap;
|
|
PVOID *CsrSrvSharedStaticServerData;
|
|
|
|
#define CSR_BASE_PATH L"\\REGISTRY\\MACHINE\\System\\CurrentControlSet\\Control\\Session Manager\\Subsystems\\CSRSS"
|
|
#define IsTerminalServer() (BOOLEAN)(USER_SHARED_DATA->SuiteMask & (1 << TerminalServer))
|
|
|
|
|
|
NTSTATUS
|
|
CsrLoadServerDll(
|
|
IN PCH ModuleName,
|
|
IN PCH InitRoutineString,
|
|
IN ULONG ServerDllIndex
|
|
);
|
|
|
|
ULONG
|
|
CsrSrvClientConnect(
|
|
IN OUT PCSR_API_MSG m,
|
|
IN OUT PCSR_REPLY_STATUS ReplyStatus
|
|
);
|
|
|
|
|
|
NTSTATUS
|
|
CsrSrvCreateSharedSection(
|
|
IN PCH SizeParameter
|
|
);
|
|
|
|
|
|
NTSTATUS
|
|
CsrSrvAttachSharedSection(
|
|
IN PCSR_PROCESS Process OPTIONAL,
|
|
OUT PCSR_API_CONNECTINFO p
|
|
);
|
|
|
|
//
|
|
// Routines and data defined in process.c
|
|
//
|
|
|
|
//
|
|
// The CsrProcessStructureLock critical section protects all of the link
|
|
// fields of the Windows Process objects. You must own this lock to examine
|
|
// or modify any of the following fields of the CSR_PROCESS structure:
|
|
//
|
|
// ListLink
|
|
//
|
|
// It also protects the following variables:
|
|
//
|
|
// CsrRootProcess
|
|
//
|
|
|
|
RTL_CRITICAL_SECTION CsrProcessStructureLock;
|
|
#define AcquireProcessStructureLock() RtlEnterCriticalSection( &CsrProcessStructureLock )
|
|
#define ReleaseProcessStructureLock() RtlLeaveCriticalSection( &CsrProcessStructureLock )
|
|
#define ProcessStructureListLocked() \
|
|
(CsrProcessStructureLock.OwningThread == NtCurrentTeb()->ClientId.UniqueThread)
|
|
|
|
//
|
|
// The following is a dummy process that acts as the root of the Windows Process
|
|
// Structure. It has a ClientId of -1.-1 so it does not conflict with actual
|
|
// Windows Processes. All processes created via the session manager are children
|
|
// of this process, as are all orphaned processes. The ListLink field of this
|
|
// process is the head of a list of all Windows Processes.
|
|
//
|
|
|
|
PCSR_PROCESS CsrRootProcess;
|
|
|
|
//
|
|
// reference/dereference thread are public in ntcsrsrv.h
|
|
//
|
|
|
|
VOID
|
|
CsrLockedReferenceProcess(
|
|
PCSR_PROCESS p
|
|
);
|
|
|
|
VOID
|
|
CsrLockedReferenceThread(
|
|
PCSR_THREAD t
|
|
);
|
|
|
|
VOID
|
|
CsrLockedDereferenceProcess(
|
|
PCSR_PROCESS p
|
|
);
|
|
|
|
VOID
|
|
CsrLockedDereferenceThread(
|
|
PCSR_THREAD t
|
|
);
|
|
|
|
NTSTATUS
|
|
CsrInitializeProcessStructure( VOID );
|
|
|
|
PCSR_PROCESS
|
|
CsrAllocateProcess( VOID );
|
|
|
|
VOID
|
|
CsrDeallocateProcess(
|
|
IN PCSR_PROCESS Process
|
|
);
|
|
|
|
VOID
|
|
CsrInsertProcess(
|
|
IN PCSR_PROCESS CallingProcess,
|
|
IN PCSR_PROCESS Process
|
|
);
|
|
|
|
VOID
|
|
CsrRemoveProcess(
|
|
IN PCSR_PROCESS Process
|
|
);
|
|
|
|
PCSR_THREAD
|
|
CsrAllocateThread(
|
|
IN PCSR_PROCESS Process
|
|
);
|
|
|
|
VOID
|
|
CsrDeallocateThread(
|
|
IN PCSR_THREAD Thread
|
|
);
|
|
|
|
VOID
|
|
CsrInsertThread(
|
|
IN PCSR_PROCESS Process,
|
|
IN PCSR_THREAD Thread
|
|
);
|
|
|
|
VOID
|
|
CsrRemoveThread(
|
|
IN PCSR_THREAD Thread
|
|
);
|
|
|
|
PCSR_THREAD
|
|
CsrLocateThreadByClientId(
|
|
OUT PCSR_PROCESS *Process,
|
|
IN PCLIENT_ID ClientId
|
|
);
|
|
|
|
PCSR_THREAD
|
|
CsrLocateServerThread(
|
|
IN PCLIENT_ID ClientId);
|
|
|
|
//
|
|
// Routines and data defined in csrdebug.c
|
|
//
|
|
|
|
VOID
|
|
CsrSuspendProcess(
|
|
IN PCSR_PROCESS Process
|
|
);
|
|
|
|
VOID
|
|
CsrResumeProcess(
|
|
IN PCSR_PROCESS Process
|
|
);
|
|
|
|
|
|
//
|
|
// Routines and data defined in wait.c
|
|
//
|
|
|
|
#define AcquireWaitListsLock() RtlEnterCriticalSection( &CsrWaitListsLock )
|
|
#define ReleaseWaitListsLock() RtlLeaveCriticalSection( &CsrWaitListsLock )
|
|
|
|
RTL_CRITICAL_SECTION CsrWaitListsLock;
|
|
|
|
BOOLEAN
|
|
CsrInitializeWait(
|
|
IN CSR_WAIT_ROUTINE WaitRoutine,
|
|
IN PCSR_THREAD WaitingThread,
|
|
IN OUT PCSR_API_MSG WaitReplyMessage,
|
|
IN PVOID WaitParameter,
|
|
OUT PCSR_WAIT_BLOCK *WaitBlockPtr
|
|
);
|
|
|
|
BOOLEAN
|
|
CsrNotifyWaitBlock(
|
|
IN PCSR_WAIT_BLOCK WaitBlock,
|
|
IN PLIST_ENTRY WaitQueue,
|
|
IN PVOID SatisfyParameter1,
|
|
IN PVOID SatisfyParameter2,
|
|
IN ULONG WaitFlags,
|
|
IN BOOLEAN DereferenceThread
|
|
);
|
|
|
|
|
|
ULONG CsrBaseTag;
|
|
ULONG CsrSharedBaseTag;
|
|
|
|
#define MAKE_TAG( t ) (RTL_HEAP_MAKE_TAG( CsrBaseTag, t ))
|
|
|
|
#define TMP_TAG 0
|
|
#define INIT_TAG 1
|
|
#define CAPTURE_TAG 2
|
|
#define PROCESS_TAG 3
|
|
#define THREAD_TAG 4
|
|
#define SECURITY_TAG 5
|
|
#define SESSION_TAG 6
|
|
#define WAIT_TAG 7
|
|
|
|
#define MAKE_SHARED_TAG( t ) (RTL_HEAP_MAKE_TAG( CsrSharedBaseTag, t ))
|
|
#define SHR_INIT_TAG 0
|
|
|
|
//
|
|
// Routines and data defined in process.c
|
|
//
|
|
|
|
BOOLEAN
|
|
CsrSbCreateProcess(
|
|
IN OUT PSBAPIMSG m
|
|
);
|
|
|
|
#if DBG
|
|
typedef struct _LPC_TRACK_NODE {
|
|
PORT_MESSAGE Message;
|
|
NTSTATUS Status;
|
|
CLIENT_ID ClientCid;
|
|
CLIENT_ID ServerCid;
|
|
USHORT MessageType;
|
|
} LPC_TRACK_NODE, *PLPC_TRACK_NODE;
|
|
|
|
RTL_CRITICAL_SECTION CsrTrackLpcLock;
|
|
ULONG LpcTrackIndex;
|
|
LPC_TRACK_NODE LpcTrackNodes[4096];
|
|
#endif
|
|
|
|
#ifndef ARRAY_SIZE
|
|
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(*(a)))
|
|
#endif
|