Leaked source code of windows server 2003
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

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