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