|
|
//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996-1996
//
// File: license.c
//
// Contents:
// Routine related to License Table
//
// History: 12-09-98 HueiWang Created
//
//---------------------------------------------------------------------------
#include "pch.cpp"
#include "clilic.h"
#include "globals.h"
void TLSDBLockLicenseTable() { DBGPrintf( DBG_INFORMATION, DBG_FACILITY_LOCK, DBGLEVEL_FUNCTION_TRACE, _TEXT("Locking table LicenseTable\n") );
LicensedTable::LockTable(); }
void TLSDBUnlockLicenseTable() { DBGPrintf( DBG_INFORMATION, DBG_FACILITY_LOCK, DBGLEVEL_FUNCTION_TRACE, _TEXT("Unlocking table LicenseTable\n") );
LicensedTable::UnlockTable(); } /*************************************************************************
Function: LSDBLicenseEnumBegin()
Description: Begin a enumeration through license table based on search criterial
Arguments: IN CSQLStmt* - SQL handle to bind input parameter IN bMatchAll - TRUE if match all search criterial, FALSE otherwise. IN dwSearchParm - which column in License table to bind IN LPLSLicenseSearchParm - search value
Returns: ERROR_SUCCESS SQL error code. *************************************************************************/ DWORD TLSDBLicenseFind( IN PTLSDbWorkSpace pDbWkSpace, IN BOOL bMatchAllParm, IN DWORD dwSearchParm, IN LPLICENSEDCLIENT lpSearch, IN OUT LPLICENSEDCLIENT lpFound ) /*
*/ { DWORD dwStatus=ERROR_SUCCESS;
if(pDbWkSpace == NULL) { SetLastError(dwStatus = ERROR_INVALID_PARAMETER); TLSASSERT(pDbWkSpace != NULL); return dwStatus; }
LicensedTable& licenseTable = pDbWkSpace->m_LicensedTable; BOOL bSuccess; LICENSEDCLIENT found;
bSuccess = licenseTable.FindRecord( bMatchAllParm, dwSearchParm, *lpSearch, (lpFound) ? *lpFound : found );
if(bSuccess == FALSE) { if(licenseTable.GetLastJetError() == JET_errRecordNotFound) { SetLastError(dwStatus = TLS_E_RECORD_NOTFOUND); } else { LPTSTR pString = NULL; TLSGetESEError(licenseTable.GetLastJetError(), &pString);
TLSLogEvent( EVENTLOG_ERROR_TYPE, TLS_E_DBGENERAL, TLS_E_JB_BASE, licenseTable.GetLastJetError(), (pString != NULL) ? pString : _TEXT("") );
if(pString != NULL) { LocalFree(pString); }
SetLastError( dwStatus = (SET_JB_ERROR(licenseTable.GetLastJetError())) );
TLSASSERT(FALSE); } }
return dwStatus; }
//-----------------------------------------------------------------------
DWORD TLSDBLicenseEnumBegin( IN PTLSDbWorkSpace pDbWkSpace, IN BOOL bMatchAll, IN DWORD dwSearchParm, IN LPLICENSEDCLIENT lpSearch ) /*++
--*/ { return TLSDBLicenseEnumBeginEx( pDbWkSpace, bMatchAll, dwSearchParm, lpSearch, JET_bitSeekGE ); }
//-----------------------------------------------------------------------
DWORD TLSDBLicenseEnumBeginEx( IN PTLSDbWorkSpace pDbWkSpace, IN BOOL bMatchAll, IN DWORD dwSearchParm, IN LPLICENSEDCLIENT lpSearch, IN JET_GRBIT jet_seek_grbit ) /*++
--*/ { DWORD dwStatus=ERROR_SUCCESS; LicensedTable& licenseTable = pDbWkSpace->m_LicensedTable; BOOL bSuccess; bSuccess = licenseTable.EnumerateBegin( bMatchAll, dwSearchParm, lpSearch, jet_seek_grbit );
if(bSuccess == FALSE) { LPTSTR pString = NULL; TLSGetESEError(licenseTable.GetLastJetError(), &pString);
TLSLogEvent( EVENTLOG_ERROR_TYPE, TLS_E_DBGENERAL, TLS_E_JB_BASE, licenseTable.GetLastJetError(), (pString != NULL) ? pString : _TEXT("") );
if(pString != NULL) { LocalFree(pString); }
SetLastError( dwStatus = SET_JB_ERROR(licenseTable.GetLastJetError()) );
TLSASSERT(FALSE); }
return dwStatus; }
/*************************************************************************
Function: LSDBLicenseEnumNext()
Description: Retrieve next record that match search criterial, must have call LSDBLicenseEnumBegin() to establish search criterial.
Arguments: IN CSQLStmt* - SQL handle to bind input parameter IN LPLSLicense - return record. IN LPLSHARDWARECHECKSUM - return hardware checksum value, see note
Returns: ERROR_SUCCESS SQL error code. HLS_I_NO_MORE_DATA End of recordset.
Note: Hardware checksum column is consider internal and not exposed across RPC layer. *************************************************************************/ DWORD TLSDBLicenseEnumNext( IN PTLSDbWorkSpace pDbWkSpace, IN OUT LPLICENSEDCLIENT lplsLicense ) /*
*/ { return TLSDBLicenseEnumNextEx( pDbWkSpace, FALSE, FALSE, lplsLicense ); }
/*************************************************************************
Function: LSDBLicenseEnumNext()
Description: Retrieve next record that match search criterial, must have call LSDBLicenseEnumBegin() to establish search criterial.
Arguments: IN pDbWkSpace - Workspace to search in IN bReverse - search in reverse order IN bAnyRecord - don't do equality comparison if true IN LPLSLicense - return record.
Returns: ERROR_SUCCESS SQL error code. HLS_I_NO_MORE_DATA End of recordset.
Note: Hardware checksum column is consider internal and not exposed across RPC layer. *************************************************************************/ DWORD TLSDBLicenseEnumNextEx( IN PTLSDbWorkSpace pDbWkSpace, IN BOOL bReverse, IN BOOL bAnyRecord, IN OUT LPLICENSEDCLIENT lplsLicense ) /*
*/ { DWORD dwStatus=ERROR_SUCCESS; if(pDbWkSpace == NULL || lplsLicense == NULL) { SetLastError(dwStatus = ERROR_INVALID_PARAMETER); TLSASSERT(FALSE); return dwStatus; }
LicensedTable& licenseTable = pDbWkSpace->m_LicensedTable; BOOL bSuccess;
switch(licenseTable.EnumerateNext(*lplsLicense,bReverse,bAnyRecord)) { case RECORD_ENUM_ERROR: { LPTSTR pString = NULL; TLSGetESEError(licenseTable.GetLastJetError(), &pString);
TLSLogEvent( EVENTLOG_ERROR_TYPE, TLS_E_DBGENERAL, TLS_E_JB_BASE, licenseTable.GetLastJetError(), (pString != NULL) ? pString : _TEXT("") );
if(pString != NULL) { LocalFree(pString); } }
dwStatus = SET_JB_ERROR(licenseTable.GetLastJetError());
TLSASSERT(FALSE); break;
case RECORD_ENUM_MORE_DATA: dwStatus = ERROR_SUCCESS; break;
case RECORD_ENUM_END: dwStatus = TLS_I_NO_MORE_DATA; break; }
return dwStatus; }
/*************************************************************************
Function: LSDBLicenseEnumEnd()
Description: Terminate a license table enumeration
Arguments: IN CSQLStmt* - SQL handle
Returns: None *************************************************************************/ void TLSDBLicenseEnumEnd( IN PTLSDbWorkSpace pDbWkSpace ) /*
*/ { DWORD dwStatus=ERROR_SUCCESS;
if(pDbWkSpace == NULL) { SetLastError(dwStatus = ERROR_INVALID_PARAMETER); TLSASSERT(FALSE); return; }
LicensedTable& licenseTable = pDbWkSpace->m_LicensedTable; licenseTable.EnumerateEnd(); return; }
//---------------------------------------------------------------------
DWORD TLSDBLicenseAddEntry( IN PTLSDbWorkSpace pDbWkSpace, IN LPLICENSEDCLIENT pLicense ) /*
*/ { TLSASSERT(pDbWkSpace != NULL && pLicense != NULL);
DWORD dwStatus=ERROR_SUCCESS; LicensedTable& licenseTable = pDbWkSpace->m_LicensedTable; BOOL bSuccess; TLSLicensedIndexMatchHwid dump(*pLicense);
//
// Check for duplicate entry - license ID
//
dwStatus = TLSDBLicenseFind( pDbWkSpace, TRUE, LSLICENSE_SEARCH_LICENSEID, pLicense, NULL );
if(dwStatus == ERROR_SUCCESS) { SetLastError(dwStatus = TLS_E_DUPLICATE_RECORD); goto cleanup; } else if(dwStatus != TLS_E_RECORD_NOTFOUND) { goto cleanup; }
dwStatus = ERROR_SUCCESS;
pLicense->dbLowerBound = dump.dbLowerBound; GetSystemTimeAsFileTime(&(pLicense->ftLastModifyTime)); bSuccess = licenseTable.InsertRecord(*pLicense);
if(bSuccess == FALSE) { if(licenseTable.GetLastJetError() == JET_errKeyDuplicate) { SetLastError(dwStatus=TLS_E_DUPLICATE_RECORD); } else { LPTSTR pString = NULL; TLSGetESEError(licenseTable.GetLastJetError(), &pString);
TLSLogEvent( EVENTLOG_ERROR_TYPE, TLS_E_DBGENERAL, TLS_E_JB_BASE, licenseTable.GetLastJetError(), (pString != NULL) ? pString : _TEXT("") );
if(pString != NULL) { LocalFree(pString); }
SetLastError(dwStatus = SET_JB_ERROR(licenseTable.GetLastJetError())); TLSASSERT(FALSE); } };
cleanup: return dwStatus; }
//---------------------------------------------------------------
DWORD TLSDBLicenseDeleteEntry( IN PTLSDbWorkSpace pDbWkSpace, IN LPLICENSEDCLIENT pLicense, IN BOOL bPointerOnRecord ) /*
*/ { TLSASSERT(pDbWkSpace != NULL && pLicense != NULL);
DWORD dwStatus=ERROR_SUCCESS; LicensedTable& licenseTable = pDbWkSpace->m_LicensedTable; BOOL bSuccess;
bSuccess = licenseTable.DeleteAllRecord( TRUE, LSLICENSE_SEARCH_LICENSEID, *pLicense );
if(bSuccess == FALSE) { SetLastError(dwStatus = SET_JB_ERROR(licenseTable.GetLastJetError())); if(licenseTable.GetLastJetError() != JET_errRecordNotFound) { LPTSTR pString = NULL; TLSGetESEError(licenseTable.GetLastJetError(), &pString);
TLSLogEvent( EVENTLOG_ERROR_TYPE, TLS_E_DBGENERAL, TLS_E_JB_BASE, licenseTable.GetLastJetError(), (pString != NULL) ? pString : _TEXT("") );
if(pString != NULL) { LocalFree(pString); }
TLSASSERT(licenseTable.GetLastJetError() == JET_errRecordNotFound); } }
return dwStatus; }
DWORD TLSDBDeleteEnumeratedLicense( IN PTLSDbWorkSpace pDbWkSpace ) { TLSASSERT(pDbWkSpace != NULL);
DWORD dwStatus = ERROR_SUCCESS; LicensedTable& licenseTable = pDbWkSpace->m_LicensedTable; BOOL fSuccess;
fSuccess = licenseTable.DeleteRecord();
if (!fSuccess) { SetLastError(dwStatus = SET_JB_ERROR(licenseTable.GetLastJetError())); if(licenseTable.GetLastJetError() != JET_errRecordNotFound) { LPTSTR pString = NULL;
TLSGetESEError(licenseTable.GetLastJetError(), &pString);
TLSLogEvent( EVENTLOG_ERROR_TYPE, TLS_E_DBGENERAL, TLS_E_JB_BASE, licenseTable.GetLastJetError(), (pString != NULL) ? pString : _TEXT("") );
if(pString != NULL) { LocalFree(pString); }
TLSASSERT(licenseTable.GetLastJetError() == JET_errRecordNotFound); } }
return dwStatus; }
//----------------------------------------------------------------
DWORD TLSDBLicenseUpdateEntry( IN PTLSDbWorkSpace pDbWkSpace, IN DWORD dwUpdateParm, IN LPLICENSEDCLIENT pLicense, IN BOOL bPointerOnRecord ) /*
*/ { TLSASSERT(pDbWkSpace != NULL && pLicense != NULL);
DWORD dwStatus=ERROR_SUCCESS; LicensedTable& licenseTable = pDbWkSpace->m_LicensedTable; BOOL bSuccess;
if(bPointerOnRecord == FALSE) { //
// Check for duplicate entry - license ID, position pointer
// to record and prepare for update.
//
dwStatus = TLSDBLicenseFind( pDbWkSpace, TRUE, LSLICENSE_SEARCH_LICENSEID, pLicense, NULL );
if(dwStatus != ERROR_SUCCESS) { TLSASSERT(dwStatus == ERROR_SUCCESS); goto cleanup; } } GetSystemTimeAsFileTime(&(pLicense->ftLastModifyTime)); bSuccess = licenseTable.UpdateRecord( *pLicense, (dwUpdateParm & ~LSLICENSE_SEARCH_LICENSEID) | LICENSE_PROCESS_LASTMODIFYTIME );
if(bSuccess == FALSE) { LPTSTR pString = NULL; TLSGetESEError(licenseTable.GetLastJetError(), &pString);
TLSLogEvent( EVENTLOG_ERROR_TYPE, TLS_E_DBGENERAL, TLS_E_JB_BASE, licenseTable.GetLastJetError(), (pString != NULL) ? pString : _TEXT("") );
if(pString != NULL) { LocalFree(pString); }
SetLastError(dwStatus = SET_JB_ERROR(licenseTable.GetLastJetError())); TLSASSERT(FALSE); }
cleanup: return dwStatus; }
//-----------------------------------------------------------------
DWORD TLSDBLicenseSetValue( IN PTLSDbWorkSpace pDbWkSpace, IN DWORD dwSetParm, IN LPLICENSEDCLIENT lpLicense, IN BOOL bPointerOnRecord ) /*
*/ { DWORD dwStatus=ERROR_SUCCESS; BOOL bSuccess;
if(pDbWkSpace == NULL || lpLicense == NULL) { SetLastError(dwStatus = ERROR_INVALID_PARAMETER); TLSASSERT(FALSE); return dwStatus; }
LicensedTable& licenseTable = pDbWkSpace->m_LicensedTable;
TLSDBLockLicenseTable();
if(lpLicense->ucLicenseStatus == LSLICENSESTATUS_DELETE) { dwStatus = TLSDBLicenseDeleteEntry( pDbWkSpace, lpLicense, bPointerOnRecord ); } else { dwStatus = TLSDBLicenseUpdateEntry( pDbWkSpace, dwSetParm, lpLicense, bPointerOnRecord ); }
TLSDBUnlockLicenseTable(); return dwStatus; }
/*************************************************************************
Function: LSDBLicenseGetCert()
Description: Retrieve certificate issued to specific client
Arguments: IN CSQLStmt* - SQL handle IN dwLicenseId - License Id OUT cbCert - size of certificate OUT pbCert - certificate issued to client
Returns: ERROR_SUCCESS HLS_E_RECORD_NOTFOUND HLS_E_CORRUPT_DATABASE SQL error
Note: Must have valid LicenseId. *************************************************************************/ DWORD TLSDBLicenseGetCert( IN PTLSDbWorkSpace pDbWorkSpace, IN DWORD dwLicenseId, IN OUT PDWORD cbCert, IN OUT PBYTE pbCert ) /*
*/ { // unsupport function.
TLSASSERT(FALSE); return TLS_E_INTERNAL; }
/*************************************************************************
Function: LSDBLicenseAdd()
Description: Add an entry into license table
Arguments: IN CSQLStmt* - SQL handle IN LSLicense* - value to be inserted IN PHWID - hardware ID. IN cbLicense - size of certificate IN pbLicense - Pointer to certificate
Returns: ERROR_SUCCESS SQL error *************************************************************************/ DWORD TLSDBLicenseAdd( IN PTLSDbWorkSpace pDbWorkSpace, LPLICENSEDCLIENT pLicense, DWORD cbLicense, PBYTE pbLicense ) /*
*/ { if(pDbWorkSpace == NULL || pLicense == NULL) { SetLastError(ERROR_INVALID_PARAMETER); TLSASSERT(FALSE); return ERROR_INVALID_PARAMETER; }
return TLSDBLicenseAddEntry( pDbWorkSpace, pLicense ); }
|