windows-nt/Source/XPSP1/NT/ds/security/base/lsa/server/sesmgr.h
2020-09-26 16:20:57 +08:00

357 lines
10 KiB
C

//+-----------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (c) Microsoft Corporation 1991 - 1992
//
// File: SesMgr.h
//
// Contents: "Session" manager structures.
//
//
// History: 27 May 92 RichardW Created from ether
//
//------------------------------------------------------------------------
#ifndef __SESMGR_H__
#define __SESMGR_H__
#ifdef __cplusplus
extern "C" {
#endif
#include "handle.h"
//
// Forward definition so that we can reference it
//
struct _Session;
//
// Shared Section structure. This allows packages to create shared
// sections with client processes.
//
typedef struct _LSAP_SHARED_SECTION {
LIST_ENTRY List; // List of sections for a session
PVOID Base; // Base pointer
HANDLE Heap; // Heap handle
struct _Session * Session; // Session pointer
HANDLE Section; // Handle to section object
} LSAP_SHARED_SECTION, * PLSAP_SHARED_SECTION ;
typedef struct _LSAP_THREAD_TASK {
LIST_ENTRY Next;
struct _Session * pSession;
LPTHREAD_START_ROUTINE pFunction;
PVOID pvParameter;
} LSAP_THREAD_TASK, * PLSAP_THREAD_TASK;
typedef enum _LSAP_TASK_QUEUE_TYPE {
QueueShared, // Queue shared by many threads
QueueSingle, // Queue owned/run by single thread
QueueShareRead, // Queue with dedicated thread, but
// linked to other queue
QueueZombie // Queue pending deletion
} LSAP_TASK_QUEUE_TYPE;
typedef struct _LSAP_TASK_QUEUE {
LSAP_TASK_QUEUE_TYPE Type; // Type of Queue
HANDLE hSemaphore; // Semaphore to gate access
CRITICAL_SECTION Lock; // Per-q lock
LONG Tasks; // Number of Tasks
LIST_ENTRY pTasks; // List of tasks
struct _LSAP_TASK_QUEUE * pNext; // Next Queue
struct _LSAP_TASK_QUEUE * pShared; // Shared Queue
LONG TotalThreads; // Total Threads (for Shared)
LONG IdleThreads; // Idle Threads (for Shared)
struct _LSAP_TASK_QUEUE * pOriginal; // "Parent" queue for shareread
struct _Session * OwnerSession; // Owning session record
LONGLONG TaskCounter; // Total number of tasks
LONGLONG QueuedCounter; // Total number queued
HANDLE StartSync; // Event for start syncing
LONG MissedTasks; // Number of tasks grabbed by other threads
LONG ReqThread ; // Number of times had to start another thd
LONG MaxThreads ; // Max # threads
LONG TaskHighWater ; // Max # tasks
} LSAP_TASK_QUEUE, * PLSAP_TASK_QUEUE;
typedef
NTSTATUS (LSAP_SESSION_CONNECT_FN)(
struct _Session * Session,
PVOID Parameter
);
typedef LSAP_SESSION_CONNECT_FN * PLSAP_SESSION_CONNECT_FN ;
typedef struct _LSAP_SESSION_CONNECT {
LIST_ENTRY List ;
PLSAP_SESSION_CONNECT_FN Callback ;
ULONG ConnectFilter ;
PVOID Parameter ;
} LSAP_SESSION_CONNECT, * PLSAP_SESSION_CONNECT ;
#define SESSION_CONNECT_TRUSTED 0x00000001
#define SESSION_CONNECT_UNTRUSTED 0x00000002
#define SESSION_CONNECT_KERNEL 0x00000004
typedef HRESULT (LSAP_SESSION_RUNDOWN_FN)(
struct _Session * Session,
PVOID Parameter
);
typedef LSAP_SESSION_RUNDOWN_FN * PLSAP_SESSION_RUNDOWN_FN ;
typedef struct _LSAP_SESSION_RUNDOWN {
LIST_ENTRY List ;
PLSAP_SESSION_RUNDOWN_FN Rundown ;
PVOID Parameter ;
} LSAP_SESSION_RUNDOWN, * PLSAP_SESSION_RUNDOWN ;
typedef struct _LSAP_SHARED_SESSION_DATA {
PVOID CredTable ;
PVOID ContextTable ;
PLSAP_TASK_QUEUE pQueue ;
PHANDLE_PACKAGE CredHandlePackage ;
PHANDLE_PACKAGE ContextHandlePackage ;
ULONG cRefs ;
} LSAP_SHARED_SESSION_DATA, * PLSAP_SHARED_SESSION_DATA ;
typedef struct _Session {
LIST_ENTRY List ;
DWORD dwProcessID; // ID of the calling process
PLSAP_SHARED_SESSION_DATA SharedData ; // Shared data for kernel sessions
HANDLE hPort; // Comm port used by this ses
DWORD fSession; // Flags
HANDLE hProcess; // Handle to the process
CRITICAL_SECTION SessionLock; // Session Lock
LONG RefCount; // Reference Count
PVOID pvStats; // Statistics
PVOID NegotiateData; // Reserved for negotiate support
DWORD ThreadId; // Dedicated Thread (possible)
LPWSTR ClientProcessName; // name of the registering process
ULONG SessionId; // Hydra Session Id
LIST_ENTRY SectionList; // List of sharedsections
LIST_ENTRY RundownList ; // List of rundown hooks
LONGLONG CallCount ; // Calls processed
ULONG Tick ; // Tick Count last snap
LSAP_SHARED_SESSION_DATA DefaultData ;
} Session, * PSession;
#define SESFLAG_TASK_QUEUE 0x00000001 // Session has thread and queue
#define SESFLAG_TCB_PRIV 0x00000002 // Client has TCB privilege
#define SESFLAG_CLONE 0x00000004 // Assumed identity
#define SESFLAG_IMPERSONATE 0x00000008 // Session is an impersonation
#define SESFLAG_DESKTOP 0x00000010 // Session is using user's desktop
#define SESFLAG_UNTRUSTED 0x00000020 // Session didn't require TCB priv
#define SESFLAG_INPROC 0x00000040 // Session is an inprocess clone
#define SESFLAG_AUTONOMOUS 0x00000080 // Autonomous thread
#define SESFLAG_DEFAULT 0x00000100 // Default session for inactive
#define SESFLAG_UNLOADING 0x00000200 // Session called SpmUnload
#define SESFLAG_SCAVENGER 0x00000400 // Scavenger thread
#define SESFLAG_CLEANUP 0x00000800 // Session is being deleted
#define SESFLAG_KERNEL 0x00001000 // Handle list is shared kernel-mode list
#define SESFLAG_RESTRICTED 0x00002000 // caller has a restricted token
#define SESFLAG_MAYBEKERNEL 0x00004000 // might be kernel (see sesmgr.cxx)
#define SESFLAG_EFS 0x00008000 // EFS session
#define SESFLAG_SHADOW 0x00010000 // Shadow session until the real connection
#define SESFLAG_WOW_PROCESS 0x00020000 // WOW64 Process
extern PSession pDefaultSession;
extern PSession pEfsSession ;
extern LSAP_TASK_QUEUE GlobalQueue;
BOOL
InitSessionManager( void);
VOID
LsapFindEfsSession(
VOID
);
VOID
LsapUpdateEfsSession(
PSession pSession
);
HRESULT
CreateSession( CLIENT_ID * pCid,
BOOL fOpenImmediate,
PWCHAR ClientProcessName,
ULONG Flags,
PSession * ppSession);
HRESULT
CloneSession( PSession pOriginalSession,
PSession * ppSession,
ULONG Flags );
NTSTATUS
CreateShadowSession(
DWORD ProcessId,
PSession * NewSession
);
void
FreeSession(PSession pSession);
VOID
SpmpReferenceSession(
PSession pSession);
VOID
SpmpDereferenceSession(
PSession pSession);
VOID
LsapSessionDisconnect(
PSession pSession
);
BOOL
AddRundown( PSession pSession,
PLSAP_SESSION_RUNDOWN_FN RundownFn,
PVOID pvParameter);
BOOL
DelRundown( PSession pSession,
PLSAP_SESSION_RUNDOWN_FN RundownFn
);
BOOL
AddConnectionHook(
PLSAP_SESSION_CONNECT_FN ConnectFn,
PVOID Parameter,
ULONG Filter
);
BOOLEAN
AddCredHandle( PSession pSession,
PCredHandle phCred,
ULONG Flags );
BOOLEAN
AddContextHandle( PSession pSession,
PCtxtHandle phContext,
ULONG Flags);
NTSTATUS
ValidateContextHandle(
PSession pSession,
PCtxtHandle phContext,
PVOID * pKey
);
VOID
DerefContextHandle(
PSession pSession,
PCtxtHandle phContext,
PVOID Key OPTIONAL
);
NTSTATUS
ValidateAndDerefContextHandle(
PSession pSession,
PCtxtHandle phContext
);
NTSTATUS
ValidateCredHandle(
PSession pSession,
PCtxtHandle phCred,
PVOID * pKey
);
VOID
DerefCredHandle(
PSession pSession,
PCtxtHandle phCred,
PVOID Key OPTIONAL
);
NTSTATUS
ValidateAndDerefCredHandle(
PSession pSession,
PCtxtHandle phCred
);
BOOL
LsapMoveContextHandle(
PSecHandle Handle,
PSession OriginatingSession,
PSession DestinationSession
);
BOOL
LsapMoveCredHandle(
PSecHandle Handle,
PSession OriginatingSession,
PSession DestinationSession
);
BOOL
GetMeClientDesktop(void);
void
DoneWithClientDesktop(void);
//
// PSession
// GetCurrentSession( VOID );
//
#define GetCurrentSession() ((PSession) TlsGetValue( dwSession ))
//
// VOID
// SetCurrentSession( PSession pSession );
//
#define SetCurrentSession( p ) TlsSetValue( dwSession, (PVOID) p )
//
// VOID
// LockSession( PSession pSession );
//
#define LockSession( p ) RtlEnterCriticalSection( &(((PSession) p)->SessionLock) )
//
// VOID
// UnlockSession( PSession pSession );
//
#define UnlockSession( p ) RtlLeaveCriticalSection( &(((PSession) p)->SessionLock) )
#ifndef WIN32_CHICAGO
#define GetCurrentPackageId() ((ULONG_PTR) TlsGetValue(dwThreadPackage))
#ifdef LSAP_VERIFY_PACKAGE_ID
extern BOOL RefSetCurrentPackageId(DWORD dwPackageId);
#define SetCurrentPackageId(p) RefSetCurrentPackageId((DWORD) p)
#else
#define SetCurrentPackageId(p) TlsSetValue(dwThreadPackage, (PVOID)p)
#endif // LSAP_VERIFY_PACKAGE_ID
#else
#define GetCurrentPackageId() 1
#define SetCurrentPackageId(p)
#endif // WIN32_CHICAGO
VOID
SesEnumPerfData(VOID);
#ifdef __cplusplus
} // extern C
#endif
#endif // __SESMGR_H__