/*++ BUILD Version: 0002 // Increment this if a change has global effects Copyright (c) Microsoft Corporation. All rights reserved. Module Name: ntcsrsrv.h Abstract: This module defines the public interfaces of the Server portion of the Client-Server Runtime (Csr) Subsystem. Author: Steve Wood (stevewo) 09-Oct-1990 Revision History: --*/ #ifndef _NTCSRSRVAPI_ #define _NTCSRSRVAPI_ #if _MSC_VER > 1000 #pragma once #endif // // Define API decoration for direct importing system DLL references. // #if !defined(_CSRSRV_) #define NTCSRAPI DECLSPEC_IMPORT #else #define NTCSRAPI #endif #include "ntcsrmsg.h" #ifdef __cplusplus extern "C" { #endif // // NT Session structure allocated in the server context for each new NT // session that is a client of the server. // typedef struct _CSR_NT_SESSION { LIST_ENTRY SessionLink; ULONG SessionId; ULONG ReferenceCount; STRING RootDirectory; } CSR_NT_SESSION, *PCSR_NT_SESSION; // // Per Thread data structure allocated in the server context for each new // client thread that is allowed to communicate with the server. // #define CSR_ALERTABLE_THREAD 0x00000001 #define CSR_THREAD_TERMINATING 0x00000002 #define CSR_THREAD_DESTROYED 0x00000004 typedef struct _CSR_THREAD { LARGE_INTEGER CreateTime; LIST_ENTRY Link; LIST_ENTRY HashLinks; CLIENT_ID ClientId; struct _CSR_PROCESS *Process; struct _CSR_WAIT_BLOCK *WaitBlock; HANDLE ThreadHandle; ULONG Flags; ULONG ReferenceCount; ULONG ImpersonateCount; } CSR_THREAD, *PCSR_THREAD; // // Per Process data structure allocated in the server context for each new // client process that successfully connects to the server. // // // 0x00000010 -> 0x000000x0 are used in ntcsrmsg.h // #define CSR_DEBUG_THIS_PROCESS 0x00000001 #define CSR_DEBUG_PROCESS_TREE 0x00000002 #define CSR_DEBUG_WIN32SERVER 0x00000004 #define CSR_CREATE_PROCESS_GROUP 0x00000100 #define CSR_PROCESS_DESTROYED 0x00000200 #define CSR_PROCESS_LASTTHREADOK 0x00000400 #define CSR_PROCESS_CONSOLEAPP 0x00000800 #define CSR_PROCESS_TERMINATED 0x00001000 // // Flags defines // #define CSR_PROCESS_TERMINATING 1 #define CSR_PROCESS_SHUTDOWNSKIP 2 typedef struct _CSR_PROCESS { CLIENT_ID ClientId; LIST_ENTRY ListLink; LIST_ENTRY ThreadList; struct _CSR_PROCESS *Parent; PCSR_NT_SESSION NtSession; ULONG ExpectedVersion; HANDLE ClientPort; PCH ClientViewBase; PCH ClientViewBounds; HANDLE ProcessHandle; ULONG SequenceNumber; ULONG Flags; ULONG DebugFlags; CLIENT_ID DebugUserInterface; ULONG ReferenceCount; ULONG ProcessGroupId; ULONG ProcessGroupSequence; ULONG fVDM; ULONG ThreadCount; UCHAR PriorityClass; UCHAR Spare0; UCHAR Spare1; UCHAR Spare2; ULONG Spare3; ULONG ShutdownLevel; ULONG ShutdownFlags; PVOID ServerDllPerProcessData[ 1 ]; // Variable length array } CSR_PROCESS, *PCSR_PROCESS; // // All exported API calls define the same interface to the Server Request // loop. The return value is any arbritrary 32-bit value, which will be // be returned in the ReturnValue field of the reply message. // typedef enum _CSR_REPLY_STATUS { CsrReplyImmediate, CsrReplyPending, CsrClientDied, CsrServerReplied } CSR_REPLY_STATUS, *PCSR_REPLY_STATUS; typedef ULONG (*PCSR_API_ROUTINE)( IN OUT PCSR_API_MSG ReplyMsg, OUT PCSR_REPLY_STATUS ReplyStatus ); #define CSR_SERVER_QUERYCLIENTTHREAD() \ ((PCSR_THREAD)(NtCurrentTeb()->CsrClientThread)) // // Server data structure allocated for each Server DLL loaded into the // context of the server process. // typedef NTSTATUS (*PCSR_SERVER_CONNECT_ROUTINE)( IN PCSR_PROCESS Process, IN OUT PVOID ConnectionInformation, IN OUT PULONG ConnectionInformationLength ); typedef VOID (*PCSR_SERVER_DISCONNECT_ROUTINE)( IN PCSR_PROCESS Process ); typedef NTSTATUS (*PCSR_SERVER_ADDPROCESS_ROUTINE)( IN PCSR_PROCESS ParentProcess, IN PCSR_PROCESS Process ); typedef VOID (*PCSR_SERVER_HARDERROR_ROUTINE)( IN PCSR_THREAD Thread, IN PHARDERROR_MSG HardErrorMsg ); NTCSRAPI NTSTATUS NTAPI CsrServerInitialization( IN ULONG argc, IN PCH argv[] ); NTCSRAPI NTSTATUS NTAPI CsrCallServerFromServer( PCSR_API_MSG ReceiveMsg, PCSR_API_MSG ReplyMsg ); // // ShutdownProcessRoutine return values // #define SHUTDOWN_KNOWN_PROCESS 1 #define SHUTDOWN_UNKNOWN_PROCESS 2 #define SHUTDOWN_CANCEL 3 // // Private ShutdownFlags flag // #define SHUTDOWN_SYSTEMCONTEXT 0x00000004 #define SHUTDOWN_OTHERCONTEXT 0x00000008 typedef ULONG (*PCSR_SERVER_SHUTDOWNPROCESS_ROUTINE)( IN PCSR_PROCESS Process, IN ULONG Flags, IN BOOLEAN fFirstPass ); NTCSRAPI ULONG NTAPI CsrComputePriorityClass( IN PCSR_PROCESS Process ); NTCSRAPI NTSTATUS NTAPI CsrShutdownProcesses( PLUID LuidCaller, ULONG Flags ); NTCSRAPI NTSTATUS NTAPI CsrGetProcessLuid( HANDLE ProcessHandle, PLUID LuidProcess ); typedef struct _CSR_SERVER_DLL { ULONG Length; HANDLE CsrInitializationEvent; STRING ModuleName; HANDLE ModuleHandle; ULONG ServerDllIndex; ULONG ServerDllConnectInfoLength; ULONG ApiNumberBase; ULONG MaxApiNumber; PCSR_API_ROUTINE *ApiDispatchTable; PBOOLEAN ApiServerValidTable; PSZ *ApiNameTable; ULONG PerProcessDataLength; PCSR_SERVER_CONNECT_ROUTINE ConnectRoutine; PCSR_SERVER_DISCONNECT_ROUTINE DisconnectRoutine; PCSR_SERVER_HARDERROR_ROUTINE HardErrorRoutine; PVOID SharedStaticServerData; PCSR_SERVER_ADDPROCESS_ROUTINE AddProcessRoutine; PCSR_SERVER_SHUTDOWNPROCESS_ROUTINE ShutdownProcessRoutine; } CSR_SERVER_DLL, *PCSR_SERVER_DLL; typedef NTSTATUS (*PCSR_SERVER_DLL_INIT_ROUTINE)( IN PCSR_SERVER_DLL LoadedServerDll ); typedef VOID (*PCSR_ATTACH_COMPLETE_ROUTINE)( VOID ); NTCSRAPI VOID NTAPI CsrReferenceThread( PCSR_THREAD t ); NTCSRAPI VOID NTAPI CsrDereferenceThread( PCSR_THREAD t ); NTCSRAPI NTSTATUS NTAPI CsrCreateProcess( IN HANDLE ProcessHandle, IN HANDLE ThreadHandle, IN PCLIENT_ID ClientId, IN PCSR_NT_SESSION Session, IN ULONG DebugFlags, IN PCLIENT_ID DebugUserInterface OPTIONAL ); NTCSRAPI NTSTATUS NTAPI CsrDebugProcess( IN ULONG TargetProcessId, IN PCLIENT_ID DebugUserInterface, IN PCSR_ATTACH_COMPLETE_ROUTINE AttachCompleteRoutine ); NTCSRAPI NTSTATUS NTAPI CsrDebugProcessStop( IN ULONG TargetProcessId, IN PCLIENT_ID DebugUserInterface ); NTCSRAPI VOID NTAPI CsrDereferenceProcess( PCSR_PROCESS p ); NTCSRAPI NTSTATUS NTAPI CsrDestroyProcess( IN PCLIENT_ID ClientId, IN NTSTATUS ExitStatus ); NTCSRAPI NTSTATUS NTAPI CsrLockProcessByClientId( IN HANDLE UniqueProcessId, OUT PCSR_PROCESS *Process ); NTCSRAPI NTSTATUS NTAPI CsrUnlockProcess( IN PCSR_PROCESS Process ); NTCSRAPI NTSTATUS NTAPI CsrLockThreadByClientId( IN HANDLE UniqueThreadId, OUT PCSR_THREAD *Thread ); NTCSRAPI NTSTATUS NTAPI CsrUnlockThread( IN PCSR_THREAD Thread ); NTCSRAPI NTSTATUS NTAPI CsrCreateThread( IN PCSR_PROCESS Process, IN HANDLE ThreadHandle, IN PCLIENT_ID ClientId, BOOLEAN ValidateCallingThread ); NTCSRAPI PCSR_THREAD NTAPI CsrLocateThreadInProcess( IN PCSR_PROCESS Process, IN PCLIENT_ID ClientId ); NTCSRAPI NTSTATUS NTAPI CsrCreateRemoteThread( IN HANDLE ThreadHandle, IN PCLIENT_ID ClientId ); NTCSRAPI NTSTATUS NTAPI CsrDestroyThread( IN PCLIENT_ID ClientId ); // // WaitFlags // typedef BOOLEAN (*CSR_WAIT_ROUTINE)( IN PLIST_ENTRY WaitQueue, IN PCSR_THREAD WaitingThread, IN PCSR_API_MSG WaitReplyMessage, IN PVOID WaitParameter, IN PVOID SatisfyParameter1, IN PVOID SatisfyParameter2, IN ULONG WaitFlags ); typedef struct _CSR_WAIT_BLOCK { ULONG Length; LIST_ENTRY Link; LIST_ENTRY UserLink; PVOID WaitParameter; PCSR_THREAD WaitingThread; CSR_WAIT_ROUTINE WaitRoutine; CSR_API_MSG WaitReplyMessage; } CSR_WAIT_BLOCK, *PCSR_WAIT_BLOCK; NTCSRAPI BOOLEAN NTAPI CsrCreateWait( IN PLIST_ENTRY WaitQueue, IN CSR_WAIT_ROUTINE WaitRoutine, IN PCSR_THREAD WaitingThread, IN OUT PCSR_API_MSG WaitReplyMessage, IN PVOID WaitParameter, IN PLIST_ENTRY UserLinkListHead OPTIONAL ); NTCSRAPI VOID NTAPI CsrDereferenceWait( IN PLIST_ENTRY WaitQueue ); NTCSRAPI BOOLEAN NTAPI CsrNotifyWait( IN PLIST_ENTRY WaitQueue, IN BOOLEAN SatisfyAll, IN PVOID SatisfyParameter1, IN PVOID SatisfyParameter2 ); NTCSRAPI VOID NTAPI CsrMoveSatisfiedWait( IN PLIST_ENTRY DstWaitQueue, IN PLIST_ENTRY SrcWaitQueue ); NTCSRAPI PVOID NTAPI CsrAddStaticServerThread( IN HANDLE ThreadHandle, IN PCLIENT_ID ClientId, IN ULONG Flags ); NTCSRAPI NTSTATUS NTAPI CsrExecServerThread( IN PUSER_THREAD_START_ROUTINE StartAddress, IN ULONG Flags ); NTCSRAPI PCSR_THREAD NTAPI CsrConnectToUser( VOID ); NTCSRAPI BOOLEAN NTAPI CsrImpersonateClient( IN PCSR_THREAD Thread ); NTCSRAPI BOOLEAN NTAPI CsrRevertToSelf( VOID ); NTCSRAPI VOID NTAPI CsrSetForegroundPriority( IN PCSR_PROCESS Process ); NTCSRAPI VOID NTAPI CsrSetBackgroundPriority( IN PCSR_PROCESS Process ); NTCSRAPI EXCEPTION_DISPOSITION NTAPI CsrUnhandledExceptionFilter( IN PEXCEPTION_POINTERS ExceptionInfo ); NTCSRAPI BOOLEAN NTAPI CsrValidateMessageBuffer( IN CONST CSR_API_MSG *m, IN VOID CONST * CONST * Buffer, IN ULONG Count, IN ULONG Size ); NTCSRAPI BOOLEAN NTAPI CsrValidateMessageString( IN CONST CSR_API_MSG *m, IN CONST PCWSTR *Buffer ); typedef struct _CSR_FAST_ANSI_OEM_TABLES { char OemToAnsiTable[256]; char AnsiToOemTable[256]; } CSR_FAST_ANSI_OEM_TABLES, *PCSR_FAST_ANSI_OEM_TABLES; #ifdef __cplusplus } #endif #endif // _NTCSRSRVAPI_