|
|
/*++
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
|