You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
326 lines
8.5 KiB
326 lines
8.5 KiB
/*++
|
|
|
|
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 <strsafe.h> //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;
|
|
}
|
|
|