/*++ Copyright (c) 1994-95 Microsoft Corporation Module Name: licobj.cpp Abstract: License object implementation. Author: Don Ryan (donryan) 04-Jan-1995 Environment: User Mode - Win32 Revision History: Jeff Parham (jeffparh) 12-Nov-1995 Copied from LLSMGR, converted to handle level 1 licenses, removed OLE support. --*/ #include "stdafx.h" #include "ccfapi.h" #include "licobj.h" #include //include last #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif IMPLEMENT_DYNCREATE(CLicense, CObject) CLicense::CLicense( LPCTSTR pProduct /* = NULL */, LPCTSTR pVendor /* = NULL */, LPCTSTR pAdmin /* = NULL */, DWORD dwPurchaseDate /* = 0 */, long lQuantity /* = 0 */, LPCTSTR pDescription /* = NULL */, DWORD dwAllowedModes /* = LLS_LICENSE_MODE_ALLOW_PER_SEAT */, DWORD dwCertificateID /* = 0 */, LPCTSTR pSource /* = TEXT("None") */, DWORD dwExpirationDate /* = 0 */, DWORD dwMaxQuantity /* = 0 */, LPDWORD pdwSecrets /* = NULL */ ) /*++ Routine Description: Constructor for CLicense object. Arguments: None. Return Values: None. --*/ { ASSERT(pProduct && *pProduct); m_strAdmin = pAdmin; m_strVendor = pVendor; m_strProduct = pProduct; m_strDescription = pDescription; m_strSource = pSource; m_lQuantity = lQuantity; m_dwAllowedModes = dwAllowedModes; m_dwCertificateID = dwCertificateID; m_dwPurchaseDate = dwPurchaseDate; m_dwExpirationDate = dwExpirationDate; m_dwMaxQuantity = dwMaxQuantity; if ( NULL == pdwSecrets ) { ZeroMemory( m_adwSecrets, sizeof( m_adwSecrets ) ); } else { memcpy( m_adwSecrets, pdwSecrets, sizeof( m_adwSecrets ) ); } m_strSourceDisplayName = TEXT(""); m_strAllowedModes = TEXT(""); } CString CLicense::GetSourceDisplayName() /*++ Routine Description: Retrieve the display name for the certificate source that was used to install these licenses. Note that if the source that was used is not installed locally, the display name is not retrievable, and the source name will be returned instead. Arguments: None. Return Values: CString. --*/ { if ( m_strSourceDisplayName.IsEmpty() ) { if ( !m_strSource.CompareNoCase( TEXT( "None" ) ) ) { m_strSourceDisplayName.LoadString( IDS_SOURCE_NONE ); } else { LONG lError; CString strKeyName = TEXT( "Software\\LSAPI\\Microsoft\\CertificateSources\\" ) + m_strSource; HKEY hKeySource; lError = RegOpenKeyEx( HKEY_LOCAL_MACHINE, strKeyName, 0, KEY_READ, &hKeySource ); if ( ERROR_SUCCESS == lError ) { const DWORD cchSourceDisplayName = 80; DWORD cbSourceDisplayName = sizeof( TCHAR ) * cchSourceDisplayName; LPTSTR pszSourceDisplayName; DWORD dwType; pszSourceDisplayName = m_strSourceDisplayName.GetBuffer( cchSourceDisplayName ); if ( NULL != pszSourceDisplayName ) { lError = RegQueryValueEx( hKeySource, REG_VALUE_NAME, NULL, &dwType, (LPBYTE) pszSourceDisplayName, &cbSourceDisplayName ); m_strSourceDisplayName.ReleaseBuffer(); } RegCloseKey( hKeySource ); } if ( ( ERROR_SUCCESS != lError ) || m_strSourceDisplayName.IsEmpty() ) { m_strSourceDisplayName = m_strSource; } } } return m_strSourceDisplayName; } DWORD CLicense::CreateLicenseInfo( PLLS_LICENSE_INFO_1 pLicInfo1 ) /*++ Routine Description: Create a LLS_LICENSE_INFO_1 structure corresponding to this object. Arguments: pLicInfo1 (PLLS_LICENSE_INFO_1) On return, holds the created structure. Return Values: ERROR_SUCCESS or ERROR_NOT_ENOUGH_MEMORY. --*/ { DWORD dwError; HRESULT hr; size_t cch1, cch2, cch3, cch4, cch5; ASSERT(NULL != pLicInfo1); cch1 = m_strProduct.GetLength() + 1; pLicInfo1->Product = (LPTSTR) LocalAlloc(LMEM_FIXED, sizeof(TCHAR) * cch1); cch2 = m_strVendor.GetLength() + 1; pLicInfo1->Vendor = (LPTSTR) LocalAlloc(LMEM_FIXED, sizeof(TCHAR) * cch2); cch3 = m_strAdmin.GetLength() + 1; pLicInfo1->Admin = (LPTSTR) LocalAlloc(LMEM_FIXED, sizeof(TCHAR) * cch3); cch4 = m_strDescription.GetLength(); pLicInfo1->Comment = (LPTSTR) LocalAlloc(LMEM_FIXED, sizeof(TCHAR) * cch4); cch5 = m_strSource.GetLength() + 1; pLicInfo1->Source = (LPTSTR) LocalAlloc(LMEM_FIXED, sizeof(TCHAR) * cch5); if ( ( NULL == pLicInfo1->Product ) || ( NULL == pLicInfo1->Vendor ) || ( NULL == pLicInfo1->Admin ) || ( NULL == pLicInfo1->Comment ) || ( NULL == pLicInfo1->Source ) ) { dwError = ERROR_NOT_ENOUGH_MEMORY; } else { hr = StringCchCopy( pLicInfo1->Product, cch1, m_strProduct ); ASSERT(SUCCEEDED(hr)); hr = StringCchCopy( pLicInfo1->Vendor, cch2, m_strVendor ); ASSERT(SUCCEEDED(hr)); hr = StringCchCopy( pLicInfo1->Admin, cch3, m_strAdmin ); ASSERT(SUCCEEDED(hr)); hr = StringCchCopy( pLicInfo1->Comment, cch4, m_strDescription ); ASSERT(SUCCEEDED(hr)); hr = StringCchCopy( pLicInfo1->Source, cch5, m_strSource ); ASSERT(SUCCEEDED(hr)); pLicInfo1->Quantity = m_lQuantity; pLicInfo1->MaxQuantity = m_dwMaxQuantity; pLicInfo1->Date = m_dwPurchaseDate; pLicInfo1->AllowedModes = m_dwAllowedModes; pLicInfo1->CertificateID = m_dwCertificateID; pLicInfo1->ExpirationDate = m_dwExpirationDate; memcpy( pLicInfo1->Secrets, m_adwSecrets, sizeof( m_adwSecrets ) ); dwError = ERROR_SUCCESS; } if ( ERROR_SUCCESS != dwError ) { if ( NULL != pLicInfo1->Product ) LocalFree( pLicInfo1->Product ); if ( NULL != pLicInfo1->Vendor ) LocalFree( pLicInfo1->Vendor ); if ( NULL != pLicInfo1->Admin ) LocalFree( pLicInfo1->Admin ); if ( NULL != pLicInfo1->Comment ) LocalFree( pLicInfo1->Comment ); if ( NULL != pLicInfo1->Source ) LocalFree( pLicInfo1->Source ); ZeroMemory( pLicInfo1, sizeof( *pLicInfo1 ) ); } return dwError; } void CLicense::DestroyLicenseInfo( PLLS_LICENSE_INFO_1 pLicInfo1 ) /*++ Routine Description: Frees a license structure previously created by CreateLicenseInfo(). Arguments: pLicInfo1 (PLLS_LICENSE_INFO_1) The structure previously created by CreateLicenseInfo(). Return Values: None. --*/ { ASSERT(NULL != pLicInfo1); if ( NULL != pLicInfo1->Product ) LocalFree( pLicInfo1->Product ); if ( NULL != pLicInfo1->Vendor ) LocalFree( pLicInfo1->Vendor ); if ( NULL != pLicInfo1->Admin ) LocalFree( pLicInfo1->Admin ); if ( NULL != pLicInfo1->Comment ) LocalFree( pLicInfo1->Comment ); if ( NULL != pLicInfo1->Source ) LocalFree( pLicInfo1->Source ); } CString CLicense::GetAllowedModesString() /*++ Routine Description: Get a string corresponding to the license mode(s) for which this license was installed. Arguments: None. Return Values: CString. --*/ { if ( m_strAllowedModes.IsEmpty() ) { UINT uStringID; switch ( m_dwAllowedModes & ( LLS_LICENSE_MODE_ALLOW_PER_SEAT | LLS_LICENSE_MODE_ALLOW_PER_SERVER ) ) { case ( LLS_LICENSE_MODE_ALLOW_PER_SEAT | LLS_LICENSE_MODE_ALLOW_PER_SERVER ): uStringID = IDS_LICENSE_MODE_EITHER; break; case LLS_LICENSE_MODE_ALLOW_PER_SEAT: uStringID = IDS_LICENSE_MODE_PER_SEAT; break; case LLS_LICENSE_MODE_ALLOW_PER_SERVER: uStringID = IDS_LICENSE_MODE_PER_SERVER; break; default: uStringID = IDS_LICENSE_MODE_UNKNOWN; break; } m_strAllowedModes.LoadString( uStringID ); } return m_strAllowedModes; }