|
|
/*++ 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; 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; STRING ModuleName; HANDLE ModuleHandle; ULONG ServerDllIndex; ULONG ServerDllConnectInfoLength; ULONG ApiNumberBase; ULONG MaxApiNumber; CONST PCSR_API_ROUTINE *ApiDispatchTable; PBOOLEAN ApiServerValidTable; #if DBG
CONST PSZ *ApiNameTable; #endif
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 ULONG 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 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; 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);
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_
|