|
|
// --------------------------------------------------------------------------
// Module Name: ThemeManagerSessionData.h
//
// Copyright (c) 2000, Microsoft Corporation
//
// This file contains a class that implements information the encapsulates a
// client TS session for the theme server.
//
// History: 2000-10-10 vtan created
// 2000-11-29 vtan moved to separate file
// --------------------------------------------------------------------------
#ifndef _ThemeManagerSessionData_
#define _ThemeManagerSessionData_
#include "APIConnection.h"
// --------------------------------------------------------------------------
// CLoaderProcess
//
// Purpose: Manages per-session process loader data.
//
// Note: all loader methods should be invoked only under session-wide lock.
//
// History: 2002-03-06 scotthan created
// --------------------------------------------------------------------------
class CLoaderProcess { public: CLoaderProcess(); ~CLoaderProcess();
// create, destroy.
NTSTATUS Create(IN PVOID pvSessionData, IN HANDLE hTokenClient, IN OPTIONAL LPWSTR pszDesktop, IN LPCWSTR pszFile, IN LPCWSTR pszColor, IN LPCWSTR pszSize, OUT HANDLE* phLoader);
// section validation, ownership
NTSTATUS ValidateAndCopySection( PVOID pvSessionData, IN HANDLE hSectionIn, OUT HANDLE *phSectionOut );
// section cleanup
void Clear(PVOID pvContext, BOOL fClearHResult);
// query methods
BOOL IsProcessLoader( IN HANDLE hProcess ); BOOL IsAlive() const {return _process_info.hProcess != NULL;}
// access functions
NTSTATUS SetHResult( IN HRESULT hr ) {_hr = hr; return STATUS_SUCCESS;} HANDLE GetSectionHandle( BOOL fTakeOwnership ); HRESULT GetHResult() const { return _hr; }
private: // access functions
NTSTATUS SetSectionHandle( IN HANDLE hSection );
// data
PROCESS_INFORMATION _process_info; // secure loader process information.
LPWSTR _pszFile; LPWSTR _pszColor; LPWSTR _pszSize; HANDLE _hSection; // secure theme section handle, valid in service's address space.
// This member is assigned by API_THEMES_SECUREAPPLYTHEME, and propagated
// to caller of API_THEMES_SECURELOADTHEME.
// The lifetime of this value should not exceed that of the
// API_THEMES_SECURELOADTHEME's handler (i.e, uninitialized on handler's entry,
// uninitialized on handler's exit)
HRESULT _hr ; // HRESULT associated with _hSection. Assigned in API_THEMES_SECUREAPPLYTHEME,
// propagated to caller of API_THEMES_SECURELOADTHEME.
};
// --------------------------------------------------------------------------
// CThemeManagerSessionData
//
// Purpose: This class encapsulates all the information that the theme
// manager needs to maintain a client session.
//
// History: 2000-11-17 vtan created
// 2000-11-29 vtan moved to separate file
// --------------------------------------------------------------------------
class CThemeManagerSessionData : public CCountedObject { private: CThemeManagerSessionData (void); public: CThemeManagerSessionData (DWORD dwSessionID); ~CThemeManagerSessionData (void);
void* GetData (void) const; bool EqualSessionID (DWORD dwSessionID) const;
NTSTATUS Allocate (HANDLE hProcessClient, DWORD dwServerChangeNumber, void *pfnRegister, void *pfnUnregister, void *pfnClearStockObjects, DWORD dwStackSizeReserve, DWORD dwStackSizeCommit); NTSTATUS Cleanup (void); NTSTATUS UserLogon (HANDLE hToken); NTSTATUS UserLogoff (void);
// secure loader process access methods.
// note: all loader methods should be invoked only under session-wide lock.
NTSTATUS GetLoaderProcess( OUT CLoaderProcess** ppLoader );
static void SetAPIConnection (CAPIConnection *pAPIConnection); static void ReleaseAPIConnection (void); private: void SessionTermination (void); static void CALLBACK CB_SessionTermination (void *pParameter, BOOLEAN TimerOrWaitFired); static DWORD WINAPI CB_UnregisterWait (void *pParameter); private: DWORD _dwSessionID; void* _pvThemeLoaderData; HANDLE _hToken; HANDLE _hProcessClient; HANDLE _hWait;
CLoaderProcess* _pLoader;
static CAPIConnection* s_pAPIConnection; };
#endif /* _ThemeManagerSessionData_ */
|