1189 lines
28 KiB
C++
1189 lines
28 KiB
C++
|
//+--------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1996-1998
|
||
|
//
|
||
|
// File: keypack.cpp
|
||
|
//
|
||
|
// Contents:
|
||
|
// KeyPack Table related function.
|
||
|
//
|
||
|
// History:
|
||
|
// Feb. 4, 98 HueiWang Created.
|
||
|
//---------------------------------------------------------------------------
|
||
|
#include "pch.cpp"
|
||
|
#include "globals.h"
|
||
|
#include "keypack.h"
|
||
|
#include "misc.h"
|
||
|
|
||
|
//++--------------------------------------------------------------------
|
||
|
static BOOL
|
||
|
ValidKeyPackParameter(
|
||
|
IN PTLSLICENSEPACK lpKeyPack,
|
||
|
IN BOOL bAdd
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Validate Licese KeyPack value
|
||
|
|
||
|
Parameter:
|
||
|
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
++*/
|
||
|
{
|
||
|
BOOL bValid=FALSE;
|
||
|
UCHAR ucAgreementType = (lpKeyPack->ucAgreementType & ~LSKEYPACK_RESERVED_TYPE);
|
||
|
UCHAR ucKeyPackStatus = (lpKeyPack->ucKeyPackStatus & ~LSKEYPACKSTATUS_RESERVED);
|
||
|
do {
|
||
|
// verify input parameter
|
||
|
if(ucAgreementType < LSKEYPACKTYPE_FIRST ||
|
||
|
ucAgreementType > LSKEYPACKTYPE_LAST)
|
||
|
{
|
||
|
DBGPrintf(
|
||
|
DBG_INFORMATION,
|
||
|
DBG_FACILITY_KEYPACK,
|
||
|
DBGLEVEL_FUNCTION_DETAILSIMPLE,
|
||
|
_TEXT("Invalid ucKeyPackType - %d\n"),
|
||
|
lpKeyPack->ucAgreementType
|
||
|
);
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if((ucKeyPackStatus < LSKEYPACKSTATUS_FIRST ||
|
||
|
ucKeyPackStatus > LSKEYPACKSTATUS_LAST) &&
|
||
|
ucKeyPackStatus != LSKEYPACKSTATUS_DELETE)
|
||
|
{
|
||
|
DBGPrintf(
|
||
|
DBG_INFORMATION,
|
||
|
DBG_FACILITY_KEYPACK,
|
||
|
DBGLEVEL_FUNCTION_DETAILSIMPLE,
|
||
|
_TEXT("Invalid ucKeyPackStatus - %d\n"),
|
||
|
lpKeyPack->ucKeyPackStatus
|
||
|
);
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if(lpKeyPack->ucLicenseType < LSKEYPACKLICENSETYPE_FIRST ||
|
||
|
lpKeyPack->ucLicenseType > LSKEYPACKLICENSETYPE_LAST)
|
||
|
{
|
||
|
DBGPrintf(
|
||
|
DBG_INFORMATION,
|
||
|
DBG_FACILITY_KEYPACK,
|
||
|
DBGLEVEL_FUNCTION_DETAILSIMPLE,
|
||
|
_TEXT("Invalid ucLicenseType - %d\n"),
|
||
|
lpKeyPack->ucLicenseType
|
||
|
);
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if(!bAdd)
|
||
|
{
|
||
|
bValid = TRUE;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Following value is required for adding entry into keypack
|
||
|
//
|
||
|
if(lpKeyPack->ucChannelOfPurchase < LSKEYPACKCHANNELOFPURCHASE_FIRST ||
|
||
|
lpKeyPack->ucChannelOfPurchase > LSKEYPACKCHANNELOFPURCHASE_LAST)
|
||
|
{
|
||
|
DBGPrintf(
|
||
|
DBG_INFORMATION,
|
||
|
DBG_FACILITY_KEYPACK,
|
||
|
DBGLEVEL_FUNCTION_DETAILSIMPLE,
|
||
|
_TEXT("Invalid ucChannelOfPurchase - %d\n"),
|
||
|
lpKeyPack->ucChannelOfPurchase
|
||
|
);
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if(!_tcslen(lpKeyPack->szCompanyName))
|
||
|
{
|
||
|
DBGPrintf(
|
||
|
DBG_INFORMATION,
|
||
|
DBG_FACILITY_KEYPACK,
|
||
|
DBGLEVEL_FUNCTION_DETAILSIMPLE,
|
||
|
_TEXT("Null szCompanyName\n")
|
||
|
);
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if(!_tcslen(lpKeyPack->szKeyPackId))
|
||
|
{
|
||
|
DBGPrintf(
|
||
|
DBG_INFORMATION,
|
||
|
DBG_FACILITY_KEYPACK,
|
||
|
DBGLEVEL_FUNCTION_DETAILSIMPLE,
|
||
|
_TEXT("Null szKeyPackId\n")
|
||
|
);
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if(!_tcslen(lpKeyPack->szProductId))
|
||
|
{
|
||
|
DBGPrintf(
|
||
|
DBG_INFORMATION,
|
||
|
DBG_FACILITY_KEYPACK,
|
||
|
DBGLEVEL_FUNCTION_DETAILSIMPLE,
|
||
|
_TEXT("Null szProductId\n")
|
||
|
);
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if(!_tcslen(lpKeyPack->szBeginSerialNumber))
|
||
|
{
|
||
|
DBGPrintf(
|
||
|
DBG_INFORMATION,
|
||
|
DBG_FACILITY_KEYPACK,
|
||
|
DBGLEVEL_FUNCTION_DETAILSIMPLE,
|
||
|
_TEXT("Null szBeginSerialNumber\n")
|
||
|
);
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
bValid=TRUE;
|
||
|
} while(FALSE);
|
||
|
|
||
|
return bValid;
|
||
|
}
|
||
|
|
||
|
//++-----------------------------------------------------------
|
||
|
void
|
||
|
TLSDBLockKeyPackTable()
|
||
|
/*++
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Lock both LicPack and LicPackStatus table.
|
||
|
|
||
|
|
||
|
Parameter:
|
||
|
|
||
|
None.
|
||
|
|
||
|
++*/
|
||
|
{
|
||
|
DBGPrintf(
|
||
|
DBG_INFORMATION,
|
||
|
DBG_FACILITY_LOCK,
|
||
|
DBGLEVEL_FUNCTION_TRACE,
|
||
|
_TEXT("Locking table KeyPackTable\n")
|
||
|
);
|
||
|
|
||
|
LicPackTable::LockTable();
|
||
|
}
|
||
|
|
||
|
//++-----------------------------------------------------------
|
||
|
void
|
||
|
TLSDBUnlockKeyPackTable()
|
||
|
/*++
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Unlock both LicPack and LicPackStatus table.
|
||
|
|
||
|
Parameter:
|
||
|
|
||
|
None:
|
||
|
|
||
|
++*/
|
||
|
{
|
||
|
DBGPrintf(
|
||
|
DBG_INFORMATION,
|
||
|
DBG_FACILITY_LOCK,
|
||
|
DBGLEVEL_FUNCTION_TRACE,
|
||
|
_TEXT("Unlocking table KeyPackTable\n")
|
||
|
);
|
||
|
|
||
|
LicPackTable::UnlockTable();
|
||
|
}
|
||
|
|
||
|
//++--------------------------------------------------------------
|
||
|
DWORD
|
||
|
TLSDBKeyPackFind(
|
||
|
IN PTLSDbWorkSpace pDbWkSpace,
|
||
|
IN BOOL bMatchAllParm,
|
||
|
IN DWORD dwSearchParm,
|
||
|
IN PTLSLICENSEPACK lpKeyPack,
|
||
|
IN OUT PTLSLICENSEPACK lpFound
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Find a license pack based on search parameter.
|
||
|
|
||
|
Parameter:
|
||
|
|
||
|
pDbWkSpace : workspace handle.
|
||
|
bMatchAllParm : TRUE if match all parameter, FALSE otherwise.
|
||
|
dwSearchParm : search parameter.
|
||
|
lpKeyPack : value to search for.
|
||
|
lpFound : record found.
|
||
|
|
||
|
Return:
|
||
|
|
||
|
|
||
|
++*/
|
||
|
{
|
||
|
DWORD dwStatus=ERROR_SUCCESS;
|
||
|
BOOL bSuccess;
|
||
|
|
||
|
if(pDbWkSpace == NULL || lpKeyPack == NULL)
|
||
|
{
|
||
|
SetLastError(dwStatus = ERROR_INVALID_PARAMETER);
|
||
|
TLSASSERT(FALSE);
|
||
|
return dwStatus;
|
||
|
}
|
||
|
|
||
|
LicPackTable& licpackTable=pDbWkSpace->m_LicPackTable;
|
||
|
|
||
|
//
|
||
|
// Find the record in LicPack table
|
||
|
//
|
||
|
bSuccess = licpackTable.FindRecord(
|
||
|
bMatchAllParm,
|
||
|
dwSearchParm,
|
||
|
*lpKeyPack,
|
||
|
*lpFound
|
||
|
);
|
||
|
|
||
|
if(bSuccess != TRUE)
|
||
|
{
|
||
|
if(licpackTable.GetLastJetError() == JET_errRecordNotFound)
|
||
|
{
|
||
|
SetLastError(dwStatus = TLS_E_RECORD_NOTFOUND);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LPTSTR pString = NULL;
|
||
|
|
||
|
TLSGetESEError(licpackTable.GetLastJetError(), &pString);
|
||
|
|
||
|
TLSLogEvent(
|
||
|
EVENTLOG_ERROR_TYPE,
|
||
|
TLS_E_DBGENERAL,
|
||
|
TLS_E_JB_BASE,
|
||
|
licpackTable.GetLastJetError(),
|
||
|
(pString != NULL) ? pString : _TEXT("")
|
||
|
);
|
||
|
|
||
|
if(pString != NULL)
|
||
|
{
|
||
|
LocalFree(pString);
|
||
|
}
|
||
|
|
||
|
SetLastError(
|
||
|
dwStatus = (SET_JB_ERROR(licpackTable.GetLastJetError()))
|
||
|
);
|
||
|
|
||
|
TLSASSERT(licpackTable.GetLastJetError() == JET_errRecordNotFound);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
return dwStatus;
|
||
|
}
|
||
|
|
||
|
//++-------------------------------------------------------------------
|
||
|
DWORD
|
||
|
TLSDBKeyPackAddEntry(
|
||
|
IN PTLSDbWorkSpace pDbWkSpace,
|
||
|
IN PTLSLICENSEPACK lpKeyPack
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Add an entry into LicPack and LicPackStatus table.
|
||
|
|
||
|
Parameter:
|
||
|
|
||
|
pDbWkSpace :
|
||
|
lpKeyPack ;
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
++*/
|
||
|
{
|
||
|
DWORD dwStatus = ERROR_SUCCESS;
|
||
|
TLSLICENSEPACK found;
|
||
|
BOOL bSuccess;
|
||
|
|
||
|
LicPackTable& licpackTable=pDbWkSpace->m_LicPackTable;
|
||
|
|
||
|
found.pbDomainSid = NULL;
|
||
|
found.cbDomainSid = 0;
|
||
|
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
TLSDBLockKeyPackTable();
|
||
|
|
||
|
TLSASSERT(pDbWkSpace != NULL && lpKeyPack != NULL);
|
||
|
if(pDbWkSpace == NULL || lpKeyPack == NULL)
|
||
|
{
|
||
|
SetLastError(dwStatus = ERROR_INVALID_PARAMETER);
|
||
|
goto cleanup;
|
||
|
}
|
||
|
|
||
|
// lpKeyPack->pbDomainSid == NULL || lpKeyPack->cbDomainSid == 0 ||
|
||
|
if( _tcslen(lpKeyPack->szInstallId) == 0 || _tcslen(lpKeyPack->szTlsServerName) == 0 )
|
||
|
{
|
||
|
TLSASSERT(FALSE);
|
||
|
SetLastError(dwStatus = ERROR_INVALID_PARAMETER);
|
||
|
goto cleanup;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// make sure no duplicate entry via primary index
|
||
|
dwStatus = TLSDBKeyPackFind(
|
||
|
pDbWkSpace,
|
||
|
TRUE,
|
||
|
LICENSEDPACK_PROCESS_DWINTERNAL,
|
||
|
lpKeyPack,
|
||
|
&found
|
||
|
);
|
||
|
if(dwStatus == ERROR_SUCCESS)
|
||
|
{
|
||
|
dwStatus = TLS_E_DUPLICATE_RECORD;
|
||
|
goto cleanup;
|
||
|
}
|
||
|
|
||
|
dwStatus = ERROR_SUCCESS;
|
||
|
|
||
|
//
|
||
|
// Mark internal field -
|
||
|
//
|
||
|
switch( (lpKeyPack->ucAgreementType & ~LSKEYPACK_RESERVED_TYPE) )
|
||
|
{
|
||
|
case LSKEYPACKTYPE_SELECT:
|
||
|
case LSKEYPACKTYPE_RETAIL:
|
||
|
case LSKEYPACKTYPE_CONCURRENT:
|
||
|
case LSKEYPACKTYPE_OPEN:
|
||
|
// number of license available to client
|
||
|
lpKeyPack->dwNumberOfLicenses = lpKeyPack->dwTotalLicenseInKeyPack;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
// number of licenses issued.
|
||
|
lpKeyPack->dwNumberOfLicenses = 0;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Begin serial number in this keypack
|
||
|
//
|
||
|
lpKeyPack->dwNextSerialNumber = 1;
|
||
|
GetSystemTimeAsFileTime(&(lpKeyPack->ftLastModifyTime));
|
||
|
|
||
|
//
|
||
|
// Mark beta keypack.
|
||
|
//
|
||
|
if(TLSIsBetaNTServer() == TRUE)
|
||
|
{
|
||
|
lpKeyPack->ucKeyPackStatus |= LSKEYPACKSTATUS_BETA;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// insert the record
|
||
|
//
|
||
|
bSuccess = licpackTable.InsertRecord(
|
||
|
*lpKeyPack
|
||
|
);
|
||
|
|
||
|
if(bSuccess == FALSE)
|
||
|
{
|
||
|
if(licpackTable.GetLastJetError() == JET_errKeyDuplicate)
|
||
|
{
|
||
|
SetLastError(dwStatus=TLS_E_DUPLICATE_RECORD);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LPTSTR pString = NULL;
|
||
|
|
||
|
TLSGetESEError(licpackTable.GetLastJetError(), &pString);
|
||
|
|
||
|
TLSLogEvent(
|
||
|
EVENTLOG_ERROR_TYPE,
|
||
|
TLS_E_DBGENERAL,
|
||
|
TLS_E_JB_BASE,
|
||
|
licpackTable.GetLastJetError(),
|
||
|
(pString != NULL) ? pString : _TEXT("")
|
||
|
);
|
||
|
|
||
|
if(pString != NULL)
|
||
|
{
|
||
|
LocalFree(pString);
|
||
|
}
|
||
|
|
||
|
SetLastError(dwStatus = SET_JB_ERROR(licpackTable.GetLastJetError()));
|
||
|
TLSASSERT(FALSE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
cleanup:
|
||
|
|
||
|
TLSDBUnlockKeyPackTable();
|
||
|
SetLastError(dwStatus);
|
||
|
return dwStatus;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------
|
||
|
|
||
|
DWORD
|
||
|
TLSDBKeyPackDeleteEntry(
|
||
|
IN PTLSDbWorkSpace pDbWkSpace,
|
||
|
IN BOOL bDeleteAllRecord,
|
||
|
IN PTLSLICENSEPACK lpKeyPack
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Delete an entry from both LicPack and LicPackStatus table.
|
||
|
|
||
|
Parameter:
|
||
|
|
||
|
pDbWkSpace : workspace handle.
|
||
|
bDeleteAllRecord : Delete all record with same ID.
|
||
|
lpKeyPack : record to be delete.
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
Note:
|
||
|
|
||
|
If not deleting same record, current record must be point
|
||
|
to the record that going to be deleted.
|
||
|
|
||
|
++*/
|
||
|
{
|
||
|
DWORD dwStatus=ERROR_SUCCESS;
|
||
|
BOOL bSuccess;
|
||
|
|
||
|
LicPackTable& licpackTable = pDbWkSpace->m_LicPackTable;
|
||
|
|
||
|
GetSystemTimeAsFileTime(&(lpKeyPack->ftLastModifyTime));
|
||
|
|
||
|
//
|
||
|
// BACKUP - Need to update this record to deleted state instead of delete it.
|
||
|
//
|
||
|
|
||
|
if(bDeleteAllRecord == TRUE)
|
||
|
{
|
||
|
//
|
||
|
// Delete record from LicPack Table.
|
||
|
//
|
||
|
bSuccess = licpackTable.DeleteAllRecord(
|
||
|
TRUE,
|
||
|
LICENSEDPACK_PROCESS_DWINTERNAL,
|
||
|
*lpKeyPack
|
||
|
);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
bSuccess = licpackTable.DeleteRecord();
|
||
|
}
|
||
|
|
||
|
if(bSuccess == FALSE)
|
||
|
{
|
||
|
SetLastError(dwStatus = SET_JB_ERROR(licpackTable.GetLastJetError()));
|
||
|
if(licpackTable.GetLastJetError() != JET_errRecordNotFound)
|
||
|
{
|
||
|
|
||
|
LPTSTR pString = NULL;
|
||
|
|
||
|
TLSGetESEError(licpackTable.GetLastJetError(), &pString);
|
||
|
|
||
|
TLSLogEvent(
|
||
|
EVENTLOG_ERROR_TYPE,
|
||
|
TLS_E_DBGENERAL,
|
||
|
TLS_E_JB_BASE,
|
||
|
licpackTable.GetLastJetError(),
|
||
|
(pString != NULL) ? pString : _TEXT("")
|
||
|
);
|
||
|
|
||
|
if(pString != NULL)
|
||
|
{
|
||
|
LocalFree(pString);
|
||
|
}
|
||
|
|
||
|
TLSASSERT(FALSE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
return dwStatus;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------
|
||
|
|
||
|
DWORD
|
||
|
TLSDBKeyPackUpdateEntry(
|
||
|
IN PTLSDbWorkSpace pDbWkSpace,
|
||
|
IN BOOL bPointerOnRecord,
|
||
|
IN DWORD dwUpdateParm,
|
||
|
IN PTLSLICENSEPACK lpKeyPack
|
||
|
)
|
||
|
/*
|
||
|
*/
|
||
|
{
|
||
|
DWORD dwStatus = ERROR_SUCCESS;
|
||
|
BOOL bSuccess;
|
||
|
TLSLICENSEPACK found;
|
||
|
|
||
|
LicPackTable& licpackTable=pDbWkSpace->m_LicPackTable;
|
||
|
|
||
|
if(bPointerOnRecord == FALSE)
|
||
|
{
|
||
|
found.pbDomainSid = NULL;
|
||
|
|
||
|
dwStatus = TLSDBKeyPackFind(
|
||
|
pDbWkSpace,
|
||
|
TRUE,
|
||
|
LICENSEDPACK_PROCESS_DWINTERNAL,
|
||
|
lpKeyPack,
|
||
|
&found
|
||
|
);
|
||
|
|
||
|
|
||
|
lpKeyPack->dwKeyPackId = found.dwKeyPackId;
|
||
|
|
||
|
if(dwStatus != ERROR_SUCCESS)
|
||
|
{
|
||
|
TLSASSERT(FALSE);
|
||
|
goto cleanup;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
#if DBG
|
||
|
{
|
||
|
//
|
||
|
// try to cache some bug...
|
||
|
//
|
||
|
TLSLICENSEPACK found1;
|
||
|
|
||
|
found.pbDomainSid = NULL;
|
||
|
|
||
|
bSuccess = licpackTable.FetchRecord( found1, 0xFFFFFFFF );
|
||
|
|
||
|
//
|
||
|
// Make sure we update right record
|
||
|
if( found1.dwKeyPackId != lpKeyPack->dwKeyPackId )
|
||
|
{
|
||
|
TLSASSERT(FALSE);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// check input parameter
|
||
|
if( ValidKeyPackParameter( lpKeyPack, FALSE ) == FALSE )
|
||
|
{
|
||
|
TLSASSERT(FALSE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
|
||
|
//
|
||
|
// Update the timestamp for this record.
|
||
|
//
|
||
|
GetSystemTimeAsFileTime(&(lpKeyPack->ftLastModifyTime));
|
||
|
bSuccess = licpackTable.UpdateRecord(
|
||
|
*lpKeyPack,
|
||
|
(dwUpdateParm & ~LICENSEDPACK_PROCESS_DWINTERNAL) | LICENSEDPACK_PROCESS_MODIFYTIME
|
||
|
);
|
||
|
|
||
|
if(bSuccess == FALSE)
|
||
|
{
|
||
|
LPTSTR pString = NULL;
|
||
|
|
||
|
TLSGetESEError(licpackTable.GetLastJetError(), &pString);
|
||
|
|
||
|
TLSLogEvent(
|
||
|
EVENTLOG_ERROR_TYPE,
|
||
|
TLS_E_DBGENERAL,
|
||
|
TLS_E_JB_BASE,
|
||
|
licpackTable.GetLastJetError(),
|
||
|
(pString != NULL) ? pString : _TEXT("")
|
||
|
);
|
||
|
|
||
|
if(pString != NULL)
|
||
|
{
|
||
|
LocalFree(pString);
|
||
|
}
|
||
|
|
||
|
SetLastError(dwStatus = SET_JB_ERROR(licpackTable.GetLastJetError()));
|
||
|
TLSASSERT(FALSE);
|
||
|
}
|
||
|
|
||
|
cleanup:
|
||
|
|
||
|
return dwStatus;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------
|
||
|
|
||
|
DWORD
|
||
|
TLSDBKeyPackUpdateNumOfAvailableLicense(
|
||
|
IN PTLSDbWorkSpace pDbWkSpace,
|
||
|
IN BOOL bAdd,
|
||
|
IN PTLSLICENSEPACK lpKeyPack
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Update number of license available .
|
||
|
|
||
|
Parameter:
|
||
|
|
||
|
pDbWkSpace : workspace handle.
|
||
|
bAdd : TRUE if add license
|
||
|
lpKeyPack :
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
++*/
|
||
|
{
|
||
|
DWORD dwStatus=ERROR_SUCCESS;
|
||
|
|
||
|
if(pDbWkSpace == NULL || lpKeyPack == NULL)
|
||
|
{
|
||
|
SetLastError(dwStatus = ERROR_INVALID_PARAMETER);
|
||
|
TLSASSERT(pDbWkSpace != NULL);
|
||
|
return dwStatus;
|
||
|
}
|
||
|
|
||
|
TLSLICENSEPACK found;
|
||
|
DWORD dwNumberLicenseToAddRemove;
|
||
|
BOOL bRemoveMoreThanAvailable=FALSE;
|
||
|
|
||
|
found.pbDomainSid = NULL;
|
||
|
|
||
|
TLSDBLockKeyPackTable();
|
||
|
dwStatus = TLSDBKeyPackFind(
|
||
|
pDbWkSpace,
|
||
|
TRUE,
|
||
|
LICENSEDPACK_PROCESS_DWINTERNAL,
|
||
|
lpKeyPack,
|
||
|
&found
|
||
|
);
|
||
|
|
||
|
if(dwStatus != ERROR_SUCCESS)
|
||
|
{
|
||
|
goto cleanup;
|
||
|
}
|
||
|
|
||
|
dwNumberLicenseToAddRemove = lpKeyPack->dwTotalLicenseInKeyPack;
|
||
|
|
||
|
*lpKeyPack = found;
|
||
|
|
||
|
if(dwNumberLicenseToAddRemove == 0)
|
||
|
{
|
||
|
// query only, a hook so that test program can get actual
|
||
|
// numbers - Jet not re-reading MDB file problem
|
||
|
goto cleanup;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Only allow add/remove license on retail
|
||
|
//
|
||
|
if( (found.ucAgreementType & ~LSKEYPACK_RESERVED_TYPE) != LSKEYPACKTYPE_RETAIL &&
|
||
|
(found.ucAgreementType & ~LSKEYPACK_RESERVED_TYPE) != LSKEYPACKTYPE_CONCURRENT)
|
||
|
{
|
||
|
DBGPrintf(
|
||
|
DBG_INFORMATION,
|
||
|
DBG_FACILITY_KEYPACK,
|
||
|
DBGLEVEL_FUNCTION_DETAILSIMPLE,
|
||
|
_TEXT("LSDBKeyPackUpdate : Invalid parameter...\n")
|
||
|
);
|
||
|
|
||
|
SetLastError(dwStatus = TLS_E_INVALID_DATA);
|
||
|
goto cleanup;
|
||
|
}
|
||
|
|
||
|
if(bAdd)
|
||
|
{
|
||
|
// increase both total and number available
|
||
|
found.dwNumberOfLicenses += dwNumberLicenseToAddRemove;
|
||
|
found.dwTotalLicenseInKeyPack += dwNumberLicenseToAddRemove;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//
|
||
|
// if number of licenses to remove is greater that what's available,
|
||
|
// remove all available license and set the return code to invalid data.
|
||
|
//
|
||
|
if(found.dwNumberOfLicenses < dwNumberLicenseToAddRemove)
|
||
|
{
|
||
|
bRemoveMoreThanAvailable = TRUE;
|
||
|
}
|
||
|
|
||
|
dwNumberLicenseToAddRemove = min(dwNumberLicenseToAddRemove, found.dwNumberOfLicenses);
|
||
|
found.dwNumberOfLicenses -= dwNumberLicenseToAddRemove;
|
||
|
found.dwTotalLicenseInKeyPack -= dwNumberLicenseToAddRemove;
|
||
|
}
|
||
|
|
||
|
dwStatus = TLSDBKeyPackSetValues(
|
||
|
pDbWkSpace,
|
||
|
TRUE,
|
||
|
LSKEYPACK_SEARCH_TOTALLICENSES | LSKEYPACK_EXSEARCH_AVAILABLE,
|
||
|
&found
|
||
|
);
|
||
|
|
||
|
*lpKeyPack = found;
|
||
|
|
||
|
cleanup:
|
||
|
|
||
|
TLSDBUnlockKeyPackTable();
|
||
|
if(dwStatus == ERROR_SUCCESS && bRemoveMoreThanAvailable)
|
||
|
SetLastError(dwStatus = TLS_W_REMOVE_TOOMANY);
|
||
|
|
||
|
return dwStatus;
|
||
|
}
|
||
|
|
||
|
//+-----------------------------------------------------------------
|
||
|
DWORD
|
||
|
TLSDBKeyPackAdd(
|
||
|
IN PTLSDbWorkSpace pDbWkSpace,
|
||
|
IN OUT PTLSLICENSEPACK lpKeyPack // return internal tracking ID
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Install a product keypack into keypack table, routine only set
|
||
|
keypack status to pending, must call corresponding set status
|
||
|
routine to activate key pack.
|
||
|
|
||
|
Parameters:
|
||
|
|
||
|
pDbWkSpace : Workspace handle.
|
||
|
lpKeyPack : value to be inserted.
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
++*/
|
||
|
{
|
||
|
DWORD lNextKeyPackId;
|
||
|
DWORD dwStatus;
|
||
|
|
||
|
if(!ValidKeyPackParameter(lpKeyPack, TRUE))
|
||
|
{
|
||
|
SetLastError(TLS_E_INVALID_DATA);
|
||
|
return TLS_E_INVALID_DATA;
|
||
|
}
|
||
|
|
||
|
TLSLICENSEPACK found;
|
||
|
TLSDBLockKeyPackTable();
|
||
|
|
||
|
found.pbDomainSid = NULL;
|
||
|
|
||
|
//
|
||
|
// No duplicate entry for product installed
|
||
|
//
|
||
|
dwStatus = TLSDBKeyPackFind(
|
||
|
pDbWkSpace,
|
||
|
TRUE,
|
||
|
LICENSEDPACK_FIND_PRODUCT,
|
||
|
lpKeyPack,
|
||
|
&found
|
||
|
);
|
||
|
|
||
|
if(dwStatus == ERROR_SUCCESS)
|
||
|
{
|
||
|
// Product already installed
|
||
|
switch( (found.ucKeyPackStatus & ~LSKEYPACKSTATUS_RESERVED) )
|
||
|
{
|
||
|
case LSKEYPACKSTATUS_TEMPORARY:
|
||
|
// case 1 : keypack is installed by temporary license
|
||
|
if(found.ucAgreementType == lpKeyPack->ucAgreementType)
|
||
|
{
|
||
|
dwStatus = TLS_E_DUPLICATE_RECORD;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case LSKEYPACKSTATUS_ACTIVE:
|
||
|
case LSKEYPACKSTATUS_PENDING:
|
||
|
// case 2 : duplicate entry
|
||
|
dwStatus = TLS_E_DUPLICATE_RECORD;
|
||
|
break;
|
||
|
|
||
|
case LSKEYPACKSTATUS_RETURNED:
|
||
|
case LSKEYPACKSTATUS_REVOKED:
|
||
|
case LSKEYPACKSTATUS_OTHERS:
|
||
|
// de-activated license key pack.
|
||
|
// keep it.
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
dwStatus = TLS_E_CORRUPT_DATABASE;
|
||
|
|
||
|
#if DBG
|
||
|
TLSASSERT(FALSE);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
if(dwStatus != ERROR_SUCCESS)
|
||
|
goto cleanup;
|
||
|
}
|
||
|
else if(dwStatus == TLS_E_RECORD_NOTFOUND)
|
||
|
{
|
||
|
//
|
||
|
// Always use new keypack ID
|
||
|
// temporary license will be deleted after all license
|
||
|
// has been returned.
|
||
|
//
|
||
|
lpKeyPack->dwKeyPackId = TLSDBGetNextKeyPackId();
|
||
|
|
||
|
dwStatus = TLSDBKeyPackAddEntry(
|
||
|
pDbWkSpace,
|
||
|
lpKeyPack
|
||
|
);
|
||
|
}
|
||
|
|
||
|
cleanup:
|
||
|
|
||
|
TLSDBUnlockKeyPackTable();
|
||
|
return dwStatus;
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------
|
||
|
DWORD
|
||
|
TLSDBKeyPackEnumBegin(
|
||
|
IN PTLSDbWorkSpace pDbWkSpace,
|
||
|
IN BOOL bMatchAll,
|
||
|
IN DWORD dwSearchParm,
|
||
|
IN PTLSLICENSEPACK lpSearch
|
||
|
)
|
||
|
/*
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Begin enumeration of licensepack table.
|
||
|
|
||
|
Parameter:
|
||
|
|
||
|
pDbWkSpace : workspace handle.
|
||
|
bMatchAll : match all search value.
|
||
|
dwSearchParm : value to search.
|
||
|
lpSearch : search value
|
||
|
|
||
|
Return:
|
||
|
|
||
|
|
||
|
*/
|
||
|
{
|
||
|
DWORD dwStatus = ERROR_SUCCESS;
|
||
|
BOOL bSuccess = TRUE;
|
||
|
|
||
|
if(pDbWkSpace == NULL)
|
||
|
{
|
||
|
SetLastError(dwStatus = ERROR_INVALID_PARAMETER);
|
||
|
TLSASSERT(FALSE);
|
||
|
return dwStatus;
|
||
|
}
|
||
|
|
||
|
LicPackTable& licpackTable=pDbWkSpace->m_LicPackTable;
|
||
|
|
||
|
bSuccess = licpackTable.EnumerateBegin(
|
||
|
bMatchAll,
|
||
|
dwSearchParm,
|
||
|
lpSearch
|
||
|
);
|
||
|
|
||
|
if(bSuccess == FALSE)
|
||
|
{
|
||
|
LPTSTR pString = NULL;
|
||
|
|
||
|
TLSGetESEError(licpackTable.GetLastJetError(), &pString);
|
||
|
|
||
|
TLSLogEvent(
|
||
|
EVENTLOG_ERROR_TYPE,
|
||
|
TLS_E_DBGENERAL,
|
||
|
TLS_E_JB_BASE,
|
||
|
licpackTable.GetLastJetError(),
|
||
|
(pString != NULL) ? pString : _TEXT("")
|
||
|
);
|
||
|
|
||
|
if(pString != NULL)
|
||
|
{
|
||
|
LocalFree(pString);
|
||
|
}
|
||
|
|
||
|
SetLastError(dwStatus = SET_JB_ERROR(licpackTable.GetLastJetError()));
|
||
|
TLSASSERT(FALSE);
|
||
|
}
|
||
|
|
||
|
return dwStatus;
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------
|
||
|
DWORD
|
||
|
TLSDBKeyPackEnumNext(
|
||
|
IN PTLSDbWorkSpace pDbWkSpace,
|
||
|
IN OUT PTLSLICENSEPACK lpKeyPack
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Fetch next row of record that match search condition.
|
||
|
|
||
|
Parameters:
|
||
|
|
||
|
pDbWkSpace : workspace handle.
|
||
|
lpKeyPack : return founded keypack.
|
||
|
|
||
|
Return:
|
||
|
|
||
|
|
||
|
++*/
|
||
|
{
|
||
|
DWORD dwStatus = ERROR_SUCCESS;
|
||
|
|
||
|
if(pDbWkSpace == NULL || lpKeyPack == NULL)
|
||
|
{
|
||
|
SetLastError(dwStatus = ERROR_INVALID_PARAMETER);
|
||
|
TLSASSERT(FALSE);
|
||
|
return dwStatus;
|
||
|
}
|
||
|
|
||
|
//FreeTlsLicensePack(lpKeyPack);
|
||
|
|
||
|
LicPackTable& licpackTable=pDbWkSpace->m_LicPackTable;
|
||
|
|
||
|
switch(licpackTable.EnumerateNext(*lpKeyPack))
|
||
|
{
|
||
|
case RECORD_ENUM_ERROR:
|
||
|
{
|
||
|
LPTSTR pString = NULL;
|
||
|
|
||
|
TLSGetESEError(licpackTable.GetLastJetError(), &pString);
|
||
|
|
||
|
TLSLogEvent(
|
||
|
EVENTLOG_ERROR_TYPE,
|
||
|
TLS_E_DBGENERAL,
|
||
|
TLS_E_JB_BASE,
|
||
|
licpackTable.GetLastJetError(),
|
||
|
(pString != NULL) ? pString : _TEXT("")
|
||
|
);
|
||
|
|
||
|
if(pString != NULL)
|
||
|
{
|
||
|
LocalFree(pString);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
dwStatus = SET_JB_ERROR(licpackTable.GetLastJetError());
|
||
|
TLSASSERT(FALSE);
|
||
|
break;
|
||
|
|
||
|
case RECORD_ENUM_MORE_DATA:
|
||
|
dwStatus = ERROR_SUCCESS;
|
||
|
break;
|
||
|
|
||
|
case RECORD_ENUM_END:
|
||
|
dwStatus = TLS_I_NO_MORE_DATA;
|
||
|
}
|
||
|
|
||
|
return dwStatus;
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------
|
||
|
void
|
||
|
TLSDBKeyPackEnumEnd(
|
||
|
IN PTLSDbWorkSpace pDbWkSpace
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
End enumeration of licensepack.
|
||
|
|
||
|
Parameter:
|
||
|
|
||
|
pDbWkSpace : workspace handle.
|
||
|
++*/
|
||
|
{
|
||
|
TLSASSERT(pDbWkSpace != NULL);
|
||
|
pDbWkSpace->m_LicPackTable.EnumerateEnd();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
|
||
|
//+-------------------------------------------------------------------
|
||
|
DWORD
|
||
|
TLSDBKeyPackSetValues(
|
||
|
IN PTLSDbWorkSpace pDbWkSpace,
|
||
|
IN BOOL bPointerOnRecord,
|
||
|
IN DWORD dwSetParm,
|
||
|
IN PTLSLICENSEPACK lpKeyPack
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Set column value of a license pack record.
|
||
|
|
||
|
Parameter;
|
||
|
|
||
|
pDbWkSpace : workspace handle.
|
||
|
bInternal : call is from internal routine, no error checking.
|
||
|
dwSetParm : Columns to be set.
|
||
|
lpKeyPack : value to be set.
|
||
|
|
||
|
Returns.
|
||
|
|
||
|
++*/
|
||
|
{
|
||
|
|
||
|
DWORD dwStatus=ERROR_SUCCESS;
|
||
|
|
||
|
if(pDbWkSpace == NULL || lpKeyPack == NULL)
|
||
|
{
|
||
|
SetLastError(dwStatus = ERROR_INVALID_PARAMETER);
|
||
|
TLSASSERT(FALSE);
|
||
|
goto cleanup;
|
||
|
}
|
||
|
|
||
|
if(bPointerOnRecord == FALSE)
|
||
|
{
|
||
|
TLSLICENSEPACK found;
|
||
|
|
||
|
// Find this keypack's internal keypack id
|
||
|
dwStatus = TLSDBKeyPackFind(
|
||
|
pDbWkSpace,
|
||
|
TRUE,
|
||
|
LICENSEDPACK_FIND_PRODUCT,
|
||
|
lpKeyPack,
|
||
|
&found
|
||
|
);
|
||
|
|
||
|
//FreeTlsLicensePack(&found);
|
||
|
|
||
|
if(dwStatus != ERROR_SUCCESS)
|
||
|
{
|
||
|
goto cleanup;
|
||
|
}
|
||
|
|
||
|
lpKeyPack->dwKeyPackId = found.dwKeyPackId;
|
||
|
}
|
||
|
|
||
|
if(lpKeyPack->ucKeyPackStatus == LSKEYPACKSTATUS_DELETE)
|
||
|
{
|
||
|
dwStatus = TLSDBKeyPackDeleteEntry(
|
||
|
pDbWkSpace,
|
||
|
TRUE, // delete all records with same ID
|
||
|
lpKeyPack
|
||
|
);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
dwStatus = TLSDBKeyPackUpdateEntry(
|
||
|
pDbWkSpace,
|
||
|
TRUE,
|
||
|
dwSetParm,
|
||
|
lpKeyPack
|
||
|
);
|
||
|
}
|
||
|
|
||
|
cleanup:
|
||
|
return dwStatus;
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------
|
||
|
DWORD
|
||
|
TLSDBKeyPackSetStatus(
|
||
|
IN PTLSDbWorkSpace pDbWkSpace,
|
||
|
IN DWORD dwSetStatus,
|
||
|
IN PTLSLICENSEPACK lpKeyPack
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Stub routine for RPC to set status of a keypack
|
||
|
|
||
|
|
||
|
++*/
|
||
|
{
|
||
|
return TLSDBKeyPackSetValues(
|
||
|
pDbWkSpace,
|
||
|
FALSE,
|
||
|
dwSetStatus,
|
||
|
lpKeyPack
|
||
|
);
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------
|
||
|
DWORD
|
||
|
TLSDBKeyPackGetAvailableLicenses(
|
||
|
IN PTLSDbWorkSpace pDbWkSpace,
|
||
|
IN DWORD dwSearchParm,
|
||
|
IN PTLSLICENSEPACK lplsKeyPack,
|
||
|
IN OUT LPDWORD lpdwAvail
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
retrieve number of available licenses for the key pack.
|
||
|
|
||
|
Parameter:
|
||
|
|
||
|
pDbWkSpace : workspace handle.
|
||
|
dwSearchParm : search parameters.
|
||
|
lpLsKeyPack : search value.
|
||
|
lpdwAvail : return number of available licenses.
|
||
|
|
||
|
Return:
|
||
|
|
||
|
++*/
|
||
|
{
|
||
|
DWORD dwStatus = ERROR_SUCCESS;
|
||
|
TLSLICENSEPACK found;
|
||
|
|
||
|
dwStatus = TLSDBKeyPackFind(
|
||
|
pDbWkSpace,
|
||
|
TRUE,
|
||
|
dwSearchParm,
|
||
|
lplsKeyPack,
|
||
|
&found
|
||
|
);
|
||
|
|
||
|
if(dwStatus == ERROR_SUCCESS)
|
||
|
{
|
||
|
switch(found.ucAgreementType)
|
||
|
{
|
||
|
case LSKEYPACKTYPE_SELECT:
|
||
|
case LSKEYPACKTYPE_RETAIL:
|
||
|
case LSKEYPACKTYPE_CONCURRENT:
|
||
|
case LSKEYPACKTYPE_OPEN:
|
||
|
*lpdwAvail = found.dwNumberOfLicenses;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
*lpdwAvail = LONG_MAX;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//FreeTlsLicensePack(&found);
|
||
|
return dwStatus;
|
||
|
}
|