//+-------------------------------------------------------------------------- // // Copyright (c) 1997-1999 Microsoft Corporation // // File: policy.h // // Contents: // // History: // //--------------------------------------------------------------------------- #ifndef __POLICY_MODULE_MGR__ #define __POLICY_MODULE_MGR__ #include "tlsstl.h" // STL. #include #include #include "tlsdef.h" #include "tlspol.h" #include "locks.h" #define RETURNLICENSEPROCNAME "PMReturnLicense" #define LICENSEUPGRADEPROCNAME "PMLicenseUpgrade" #define LICENSEREQUESTPROCNAME "PMLicenseRequest" #define TEMINATEPROCNAME "PMTerminate" #define INITIALIZEPROCNAME "PMInitialize" #define SUPPORTEDPRODUCTPROCNAME "PMInitializeProduct" #define ULOADPRODUCTPROCNAME "PMUnloadProduct" #define REGISTERLKPPROCNAME "PMRegisterLicensePack" #define POLICY_DENY_ALL_REQUEST 0x00000000 #define POLICY_USE_DEFAULT 0x00000001 typedef POLICYSTATUS (WINAPI *TLSPMReturnLicense)( PMHANDLE hClient, ULARGE_INTEGER* pLicenseSerialNumber, PPMLICENSETOBERETURN pLicenseToBeReturn, PDWORD pdwLicenseStatus, PDWORD pdwRetCode ); typedef POLICYSTATUS (WINAPI *TLSPMLicenseUpgrade)( PMHANDLE hClient, DWORD dwProgressCode, PVOID pbProgressData, PVOID* ppbReturnData, PDWORD pdwRetCode ); typedef POLICYSTATUS (WINAPI *TLSPMLicenseRequest)( PMHANDLE client, DWORD dwProgressCode, PVOID pbProgressData, PVOID* pbNewProgressData, PDWORD pdwRetCode ); typedef void (WINAPI *TLSPMTerminate)(); typedef POLICYSTATUS (WINAPI* TLSPMInitialize)( DWORD dwLicenseServerVersion, LPCTSTR pszCompanyName, LPCTSTR pszProductCode, PDWORD pdwNumProduct, PPMSUPPORTEDPRODUCT* ppProduct, PDWORD pdwRetCode ); typedef POLICYSTATUS (WINAPI* TLSPMInitializeProduct)( LPCTSTR pszCompanyName, LPCTSTR pszCHProductId, LPCTSTR pszTLSProductId, PDWORD pdwRetCode ); typedef POLICYSTATUS (WINAPI* TLSPMUnloadProduct)( LPCTSTR pszCompanyName, LPCTSTR pszCHProductId, LPCTSTR pszTLSProductCode, PDWORD pdwRetCode ); typedef POLICYSTATUS (WINAPI* TLSPMRegisterLicensePack)( PMHANDLE hClient, DWORD dwProgressCode, PVOID pbProgressData, PVOID pbProgressRetData, PDWORD pdwRetCode ); class CTLSPolicyMgr; //////////////////////////////////////////////////////////////////////////// class CTLSPolicy { friend class CTLSPolicyMgr; private: typedef enum { MODULE_UNKNOWN, // object has been initialized. MODULE_LOADED, // module has been loaded. MODULE_PMINITALIZED, // module has been initialized. MODULE_PMTERMINATED, // module has been terminated. MODULE_ERROR, // module initialization error or // cause an exeption MODULE_UNLOADED // module has been unloaded. } MODULE_STATE; long m_RefCount; DWORD m_dwFlags; BOOL m_bAlreadyLogError; POLICYSTATUS m_dwLastCallStatus; // Policy Module last call status DWORD m_dwPolicyErrCode; // Policy specific error code. MODULE_STATE m_dwModuleState; // // Policy module must be multi-thread safe. // TLSPMReturnLicense m_pfnReturnLicense; TLSPMLicenseUpgrade m_pfnLicenseUpgrade; TLSPMLicenseRequest m_pfnLicenseRequest; TLSPMUnloadProduct m_pfnUnloadProduct; TLSPMInitializeProduct m_pfnInitProduct; TLSPMRegisterLicensePack m_pfnRegisterLkp; HMODULE m_hPolicyModule; TCHAR m_szCompanyName[LSERVER_MAX_STRING_SIZE+1]; TCHAR m_szProductId[LSERVER_MAX_STRING_SIZE+1]; TCHAR m_szCHProductId[LSERVER_MAX_STRING_SIZE+1]; //-------------------------------------------------------------- void SetDllFlags(DWORD dllFlags) { m_dwFlags = dllFlags; } //-------------------------------------------------------------- long Acquire() { return InterlockedIncrement(&m_RefCount); } //-------------------------------------------------------------- long Release() { return InterlockedDecrement(&m_RefCount); } //-------------------------------------------------------------- DWORD InitializePolicyModule(); //-------------------------------------------------------------- void SetModuleState( MODULE_STATE state ) /*++ ++*/ { m_dwModuleState = state; return; } //------------------------------------------------------------- MODULE_STATE GetModuleState() { return m_dwModuleState; } //------------------------------------------------------------- void CreatePolicy( HMODULE hModule, LPCTSTR pszCompanyName, LPCTSTR pszProductId, TLSPMReturnLicense pfnReturnLicense, TLSPMLicenseUpgrade pfnLicenseUpgrade, TLSPMLicenseRequest pfnLicenseRequest, TLSPMUnloadProduct pfnUnloadProduct, TLSPMInitializeProduct pfnInitProduct, TLSPMRegisterLicensePack pfnRegisterLkp ) /*++ ++*/ { m_hPolicyModule = hModule; m_pfnReturnLicense = pfnReturnLicense; m_pfnLicenseUpgrade = pfnLicenseUpgrade; m_pfnLicenseRequest = pfnLicenseRequest; m_pfnUnloadProduct = pfnUnloadProduct; m_pfnInitProduct = pfnInitProduct; m_pfnRegisterLkp = pfnRegisterLkp; SetModuleState(MODULE_PMINITALIZED); lstrcpyn( m_szCompanyName, pszCompanyName, sizeof(m_szCompanyName) / sizeof(m_szCompanyName[0]) ); lstrcpyn( m_szProductId, pszProductId, sizeof(m_szProductId) / sizeof(m_szProductId[0]) ); } void LogPolicyRequestStatus( DWORD dwMsgId ); public: CTLSPolicy() : m_pfnReturnLicense(NULL), m_pfnLicenseUpgrade(NULL), m_pfnLicenseRequest(NULL), m_pfnUnloadProduct(NULL), m_pfnInitProduct(NULL), m_pfnRegisterLkp(NULL), m_hPolicyModule(NULL), m_RefCount(0), m_bAlreadyLogError(FALSE), m_dwModuleState(MODULE_UNKNOWN), m_dwFlags(0), m_dwLastCallStatus(POLICY_SUCCESS), m_dwPolicyErrCode(ERROR_SUCCESS) /*++ Constructor ++*/ { #ifdef DBG memset(m_szCompanyName, 0, sizeof(m_szCompanyName)); memset(m_szProductId, 0, sizeof(m_szProductId)); memset(m_szCHProductId, 0, sizeof(m_szCHProductId)); #endif } //-------------------------------------------------------------- ~CTLSPolicy() /*++ Destructor ++*/ { Unload(); } //-------------------------------------------------------------- DWORD GetProductFlags() { return m_dwFlags; } //-------------------------------------------------------------- long GetRefCount() { return InterlockedExchange(&m_RefCount, m_RefCount); } //-------------------------------------------------------------- void Unload(); //-------------------------------------------------------------- DWORD Initialize( HINSTANCE hInstance, LPCTSTR pszCompanyName, LPCTSTR pszCHProductId, LPCTSTR pszProductId, LPCTSTR pszDllName, DWORD dwDllFlag = POLICY_DENY_ALL_REQUEST ); //-------------------------------------------------------------- LPCTSTR GetCompanyName() { return m_szCompanyName; } //-------------------------------------------------------------- LPCTSTR GetProductId() { return m_szProductId; } //-------------------------------------------------------------- LPCTSTR GetCHProductId() { return m_szCHProductId; } //-------------------------------------------------------------- DWORD GetPolicyRetCode() { return m_dwPolicyErrCode; } //-------------------------------------------------------------- DWORD GetPolicyLastCallStatus() { return m_dwLastCallStatus; } //-------------------------------------------------------------- BOOL IsValid(); //-------------------------------------------------------------- DWORD PMReturnLicense( PMHANDLE hClient, ULARGE_INTEGER* pLicenseSerialNumber, PPMLICENSETOBERETURN pLicenseTobeReturn, PDWORD pdwLicenseStatus ); //-------------------------------------------------------------- DWORD PMLicenseUpgrade( PMHANDLE hClient, DWORD dwProgressCode, PVOID pbProgressData, PVOID* ppbReturnData ); //-------------------------------------------------------------- DWORD PMLicenseRequest( PMHANDLE client, DWORD dwProgressCode, const PVOID pbProgressData, PVOID* pbNewProgressData ); //-------------------------------------------------------------- DWORD PMRegisterLicensePack( PMHANDLE hClient, DWORD dwProgressCode, const PVOID pbProgessData, PVOID pbProgressRetData ); //-------------------------------------------------------------- DWORD PMUnload(); //-------------------------------------------------------------- DWORD PMInitProduct(); }; ///////////////////////////////////////////////////////////////////// typedef struct __PolicyModule { TCHAR m_szCompanyName[LSERVER_MAX_STRING_SIZE+1]; TCHAR m_szProductId[LSERVER_MAX_STRING_SIZE+1]; friend bool operator<(const __PolicyModule&, const __PolicyModule&); __PolicyModule() { memset(m_szCompanyName, 0, sizeof(m_szCompanyName)); memset(m_szProductId, 0, sizeof(m_szProductId)); } } PolicyModule; inline bool operator<( const PolicyModule& a, const PolicyModule& b ) /*++ ++*/ { int iComp; iComp = _tcsicmp(a.m_szCompanyName, b.m_szCompanyName); if(iComp == 0) { iComp = _tcsicmp(a.m_szProductId, b.m_szProductId); } return iComp < 0; } ////////////////////////////////////////////////////////// // // CTLSPolicyMgr must be a global object so destructor is // invoked at the end. // class CTLSPolicyMgr { private: typedef map > PMLoadedModuleMapType; typedef map > PMProductPolicyMapType; typedef map > PMProductTransationMapType; // // Policy module per product // CRWLock m_ProductPolicyModuleRWLock; PMProductPolicyMapType m_ProductPolicyModule; // // List of loaded policy module // CRWLock m_LoadedPolicyRWLock; PMLoadedModuleMapType m_LoadedPolicy; // // List of Product transation // CRWLock m_ProductTranslationRWLock; PMProductTransationMapType m_ProductTranslation; HMODULE LoadPolicyModule( LPCTSTR pszCompanyName, LPCTSTR pszProductCode, LPCTSTR pszDllName ); // // Find policy module handle for a particular product // PMProductPolicyMapType::iterator FindProductPolicyModule( LPCTSTR pszCompanyName, LPCTSTR pszProductId ); // // Find policy module handle for a particular product // PMProductTransationMapType::iterator FindProductTransation( LPCTSTR pszCompanyName, LPCTSTR pszCHProductCode ); void InsertProductTransation( LPCTSTR pszCompanyName, LPCTSTR pszCHProductCode, LPCTSTR pszTLSProductCode ); DWORD GetSupportedProduct( HMODULE hModule, LPCTSTR pszDllName, LPCTSTR pszCompanyName, LPCTSTR pszProductId, PDWORD pdwNumProducts, PPMSUPPORTEDPRODUCT* pSupportedProduct ); DWORD InsertProductPolicyModule( HMODULE hModule, BOOL bReplace, LPCTSTR pszCompanyName, LPCTSTR pszCHProductId, LPCTSTR pszTLSProductId, LPCTSTR pszDllName, DWORD dwFlag ); DWORD UnloadPolicyModule( HINSTANCE hModule ); public: CTLSPolicyMgr(); ~CTLSPolicyMgr(); // // Insert a policy module handle into Handle arrays. // DWORD AddPolicyModule( BOOL bReplace, LPCTSTR pszCompanyName, LPCTSTR pszProductId, LPCTSTR pszDllName, DWORD dwFlag ); DWORD UnloadPolicyModule( LPCTSTR pszCompanyName, LPCTSTR pszProductCode ); // // Find a policy module for specific product // CTLSPolicy* AcquireProductPolicyModule( LPCTSTR pszCompanyName, LPCTSTR pszProductId ); // // Find a translation for CH. // BOOL TranslateCHCodeToTlsCode( LPCTSTR pszCompanyName, LPCTSTR pszCHProductCode, LPTSTR pszTlsProductCode, PDWORD pdwBufferSize ); // // Release a product policy module // void ReleaseProductPolicyModule( CTLSPolicy* p ); // // Initialize All Product Policy Module // DWORD InitProductPolicyModule(); }; #ifdef __cplusplus extern "C" { #endif DWORD ServiceInitPolicyModule(void); DWORD ServiceLoadAllPolicyModule( IN HKEY hRoot, IN LPCTSTR pszSubkey ); CTLSPolicy* AcquirePolicyModule( IN LPCTSTR pszCompanyName, IN LPCTSTR pszProductId, IN BOOL bUseProductPolicy ); BOOL TranslateCHCodeToTlsCode( IN LPCTSTR pszCompanyName, IN LPCTSTR pszCHProductId, IN LPTSTR pszTLSProductId, IN OUT PDWORD pdwBufferSize ); void ReleasePolicyModule( CTLSPolicy* ptr ); #ifdef __cplusplus } #endif #endif