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