|
|
//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996-1998
//
// File: findlost.cpp
//
// Contents:
// Find lost license
//
// History:
// Feb 4, 98 HueiWang Created
//---------------------------------------------------------------------------
#include "pch.cpp"
#include "globals.h"
#include "findlost.h"
#include "misc.h"
#include "db.h"
#include "clilic.h"
#include "keypack.h"
#include "kp.h"
#include "lkpdesc.h"
#define STRSAFE_NO_DEPRECATE
#include <strsafe.h>
//++-------------------------------------------------------------------
DWORD DBFindLicenseExact( IN PTLSDbWorkSpace pDbWkSpace, IN PLICENSEDPRODUCT pLicProduct, OUT LICENSEDCLIENT *pFoundLicense ) /*++
Abstract:
Find license based on exact match of client HWID
Parameter:
pDbWkSpace : workspace handle. pLicProduct : product to request license. pFoundLicense: found license
Returns:
TLS_E_RECORD_NOTFOUND: HWID not found ++*/ { DWORD dwStatus = ERROR_SUCCESS; BOOL bFound=FALSE; DWORD dwMatchHwidCount; LICENSEDCLIENT search_license; TLSLICENSEPACK search_keypack; TLSLICENSEPACK found_keypack;
memset(&search_license, 0, sizeof(search_license)); memset(pFoundLicense, 0, sizeof(LICENSEDCLIENT));
search_license.dwSystemBiosChkSum = pLicProduct->Hwid.dwPlatformID; search_license.dwVideoBiosChkSum = pLicProduct->Hwid.Data1; search_license.dwFloppyBiosChkSum = pLicProduct->Hwid.Data2; search_license.dwHardDiskSize = pLicProduct->Hwid.Data3; search_license.dwRamSize = pLicProduct->Hwid.Data4;
//
// lock both tables -
// Other threads might be in the process of allocating a temp. license
// while this thread is searching
//
TLSDBLockKeyPackTable(); TLSDBLockLicenseTable();
dwStatus = TLSDBLicenseEnumBegin( pDbWkSpace, TRUE, LICENSE_COLUMN_SEARCH_HWID, &search_license ); if(dwStatus != ERROR_SUCCESS) { goto cleanup; }
while(bFound == FALSE) { dwStatus = TLSDBLicenseEnumNext( pDbWkSpace, pFoundLicense );
if(dwStatus != ERROR_SUCCESS) { break; }
//
// Verify against client HWID
//
dwMatchHwidCount = 0;
dwMatchHwidCount += (pFoundLicense->dwSystemBiosChkSum == pLicProduct->Hwid.dwPlatformID); dwMatchHwidCount += (pFoundLicense->dwVideoBiosChkSum == pLicProduct->Hwid.Data1); dwMatchHwidCount += (pFoundLicense->dwFloppyBiosChkSum == pLicProduct->Hwid.Data2); dwMatchHwidCount += (pFoundLicense->dwHardDiskSize == pLicProduct->Hwid.Data3); dwMatchHwidCount += (pFoundLicense->dwRamSize == pLicProduct->Hwid.Data4);
if(dwMatchHwidCount != 5) { break; }
//
// See if this match our license pack
//
search_keypack.dwKeyPackId = pFoundLicense->dwKeyPackId; dwStatus = TLSDBKeyPackFind( pDbWkSpace, TRUE, LSKEYPACK_EXSEARCH_DWINTERNAL, &search_keypack, &found_keypack );
if(dwStatus != ERROR_SUCCESS) { continue; }
//
// No actual license is issued for concurrent KeyPack.
//
if(found_keypack.ucAgreementType != LSKEYPACKTYPE_RETAIL && found_keypack.ucAgreementType != LSKEYPACKTYPE_SELECT && found_keypack.ucAgreementType != LSKEYPACKTYPE_OPEN && found_keypack.ucAgreementType != LSKEYPACKTYPE_TEMPORARY && found_keypack.ucAgreementType != LSKEYPACKTYPE_FREE ) { continue; }
UCHAR ucKeyPackStatus = found_keypack.ucKeyPackStatus & ~LSKEYPACKSTATUS_RESERVED;
//
// No license for pending activation key pack, use temporary license scheme.
//
if(ucKeyPackStatus != LSKEYPACKSTATUS_ACTIVE && ucKeyPackStatus != LSKEYPACKSTATUS_TEMPORARY) { continue; }
if(found_keypack.wMajorVersion != pLicProduct->pLicensedVersion->wMajorVersion || found_keypack.wMinorVersion != pLicProduct->pLicensedVersion->wMinorVersion) { continue; }
if(found_keypack.dwPlatformType != pLicProduct->LicensedProduct.dwPlatformID) { continue; }
if(_tcsnicmp(found_keypack.szProductId, (LPTSTR)(pLicProduct->pbOrgProductID), ((pLicProduct->cbOrgProductID)/sizeof(TCHAR)) - 1) != 0) { continue; }
//
// Found our lost license.
//
bFound = TRUE; }
TLSDBLicenseEnumEnd(pDbWkSpace);
cleanup: if(dwStatus == TLS_I_NO_MORE_DATA) { SetLastError(dwStatus = TLS_E_RECORD_NOTFOUND); }
TLSDBUnlockLicenseTable(); TLSDBUnlockKeyPackTable();
return dwStatus;
}
//++-------------------------------------------------------------------
DWORD DBFindLostLicenseExact( IN PTLSDbWorkSpace pDbWkSpace, IN PTLSDBAllocateRequest pRequest, // ucKeyPackType not use
// IN BOOL bMatchHwid,
IN PHWID pHwid, IN OUT PTLSLICENSEPACK lpKeyPack, IN OUT PLICENSEDCLIENT lpLicense ) /*++
Abstract:
Find lost license base on exact/closest match of client HWID
Parameter:
pDbWkSpace : workspace handle. pRequest : product to request license. bMatchHwid : TRUE if match HWID, FALSE otherwise. lpKeyPack : keyPack that license was issued from. lpLicense : Founded license record.
Returns:
++*/ { DWORD dwStatus = ERROR_SUCCESS; BOOL bFound=FALSE;
DWORD dwMatchHwidCount; LICENSEDCLIENT search_license; LICENSEDCLIENT found_license;
TLSLICENSEPACK search_keypack; TLSLICENSEPACK found_keypack;
//
// Ignore ucKeyPackType
//
pRequest->ucAgreementType = LSKEYPACKTYPE_FIRST; dwStatus = VerifyTLSDBAllocateRequest(pRequest); if(dwStatus != ERROR_SUCCESS) { return dwStatus; }
memset(&search_license, 0, sizeof(search_license)); memset(&found_license, 0, sizeof(found_license));
search_license.dwSystemBiosChkSum = pHwid->dwPlatformID; search_license.dwVideoBiosChkSum = pHwid->Data1; search_license.dwFloppyBiosChkSum = pHwid->Data2; search_license.dwHardDiskSize = pHwid->Data3; search_license.dwRamSize = pHwid->Data4;
//
// lock both table -
// Other thread might be in the process of allocating a temp. license while this
// thread try to delete the temp. key pack.
//
TLSDBLockKeyPackTable(); TLSDBLockLicenseTable();
dwStatus = TLSDBLicenseEnumBegin( pDbWkSpace, TRUE, LICENSE_COLUMN_SEARCH_HWID, &search_license ); if(dwStatus != ERROR_SUCCESS) { goto cleanup; }
while(bFound == FALSE) { dwStatus = TLSDBLicenseEnumNext( pDbWkSpace, &found_license );
if(dwStatus != ERROR_SUCCESS) { break; }
//
// Verify against client HWID
//
dwMatchHwidCount = 0;
dwMatchHwidCount += (found_license.dwSystemBiosChkSum == pHwid->dwPlatformID); dwMatchHwidCount += (found_license.dwVideoBiosChkSum == pHwid->Data1); dwMatchHwidCount += (found_license.dwFloppyBiosChkSum == pHwid->Data2); dwMatchHwidCount += (found_license.dwHardDiskSize == pHwid->Data3); dwMatchHwidCount += (found_license.dwRamSize == pHwid->Data4);
if(dwMatchHwidCount != 5) { break; }
//
// consider only valid license
//
if( found_license.ucLicenseStatus != LSLICENSE_STATUS_ACTIVE && found_license.ucLicenseStatus != LSLICENSE_STATUS_PENDING && found_license.ucLicenseStatus != LSLICENSE_STATUS_TEMPORARY) { continue; }
//
// See if this match our license pack
//
search_keypack.dwKeyPackId = found_license.dwKeyPackId; dwStatus = TLSDBKeyPackFind( pDbWkSpace, TRUE, LSKEYPACK_EXSEARCH_DWINTERNAL, &search_keypack, &found_keypack );
if(dwStatus != ERROR_SUCCESS) { continue; }
//
// No actual license is issued for concurrent KeyPack.
//
if(found_keypack.ucAgreementType != LSKEYPACKTYPE_RETAIL && found_keypack.ucAgreementType != LSKEYPACKTYPE_SELECT && found_keypack.ucAgreementType != LSKEYPACKTYPE_OPEN && found_keypack.ucAgreementType != LSKEYPACKTYPE_TEMPORARY && found_keypack.ucAgreementType != LSKEYPACKTYPE_FREE ) { continue; }
UCHAR ucKeyPackStatus = found_keypack.ucKeyPackStatus & ~LSKEYPACKSTATUS_RESERVED;
//
// No license for pending activation key pack, use temporary license scheme.
//
if(ucKeyPackStatus != LSKEYPACKSTATUS_ACTIVE && ucKeyPackStatus != LSKEYPACKSTATUS_TEMPORARY) { continue; }
if(found_keypack.wMajorVersion != HIWORD(pRequest->dwVersion) || found_keypack.wMinorVersion != LOWORD(pRequest->dwVersion) ) { continue; }
if(found_keypack.dwPlatformType != pRequest->dwPlatformId) { continue; }
if(_tcscmp(found_keypack.szCompanyName, pRequest->szCompanyName) != 0) { continue; }
if(_tcscmp(found_keypack.szProductId, pRequest->szProductId) != 0) { continue; }
//
// Found our lost license.
//
bFound = TRUE; *lpLicense = found_license; *lpKeyPack = found_keypack; }
TLSDBLicenseEnumEnd(pDbWkSpace);
cleanup: if(dwStatus == TLS_I_NO_MORE_DATA) { SetLastError(dwStatus = TLS_E_RECORD_NOTFOUND); }
TLSDBUnlockLicenseTable(); TLSDBUnlockKeyPackTable();
return dwStatus; }
//++--------------------------------------------------------------------
DWORD TLSFindLicense( IN PLICENSEDPRODUCT pLicProduct, OUT PLICENSEDCLIENT pLicClient ) { PTLSDbWorkSpace pDbWkSpace = NULL; DWORD status = ERROR_SUCCESS;
pDbWkSpace = AllocateWorkSpace(g_EnumDbTimeout);
if(pDbWkSpace == NULL) { status=TLS_E_ALLOCATE_HANDLE; goto cleanup; }
status = DBFindLicenseExact(pDbWkSpace,pLicProduct,pLicClient);
ReleaseWorkSpace(&pDbWkSpace);
cleanup:
return status; }
//++--------------------------------------------------------------------
DWORD TLSFindDbLicensedProduct( IN PTLSDBLICENSEDPRODUCT pDbLicProduct, OUT PLICENSEDCLIENT pLicClient ) { PTLSDbWorkSpace pDbWkSpace = NULL; DWORD status = ERROR_SUCCESS; LICENSEDPRODUCT LicProduct; LICENSED_VERSION_INFO LicVerInfo;
pDbWkSpace = AllocateWorkSpace(g_EnumDbTimeout);
if(pDbWkSpace == NULL) { status=TLS_E_ALLOCATE_HANDLE; goto cleanup; }
memcpy(&(LicProduct.Hwid), &(pDbLicProduct->ClientHwid), sizeof(HWID)); LicVerInfo.wMajorVersion = HIWORD(pDbLicProduct->dwProductVersion); LicVerInfo.wMinorVersion = LOWORD(pDbLicProduct->dwProductVersion); LicProduct.pLicensedVersion = &LicVerInfo; LicProduct.LicensedProduct.dwPlatformID = pDbLicProduct->dwPlatformID; LicProduct.pbOrgProductID = (PBYTE)(pDbLicProduct->szLicensedProductId); LicProduct.cbOrgProductID = _tcslen(pDbLicProduct->szLicensedProductId) * sizeof(TCHAR);
status = DBFindLicenseExact(pDbWkSpace,&LicProduct,pLicClient);
ReleaseWorkSpace(&pDbWkSpace);
cleanup:
return status; }
//++--------------------------------------------------------------------
DWORD TLSDBFindLostLicense( IN PTLSDbWorkSpace pDbWkSpace, IN PTLSDBLICENSEREQUEST pLicenseRequest, IN PHWID pHwid, IN OUT PTLSDBLICENSEDPRODUCT pLicensedProduct, OUT PUCHAR pucMarked ) /*++
Abstract:
Wrapper to DBFindLostLicense().
See DBFindLostLicense.
++*/ { DWORD dwStatus=ERROR_SUCCESS; TLSLICENSEPACK keypack; LICENSEDCLIENT License;
ULARGE_INTEGER ulSerialNumber;
FILETIME notBefore; FILETIME notAfter; PMGENERATELICENSE PolModGenLicense; PPMCERTEXTENSION pPolModCertExtension=NULL; PMLICENSEREQUEST PolRequest; TLSDBAllocateRequest AllocateRequest;
DWORD dwRetCode=ERROR_SUCCESS;
keypack.pbDomainSid = NULL; AllocateRequest.szCompanyName = (LPTSTR)pLicenseRequest->pszCompanyName; AllocateRequest.szProductId = (LPTSTR)pLicenseRequest->pszProductId; AllocateRequest.dwVersion = pLicenseRequest->dwProductVersion; AllocateRequest.dwPlatformId = pLicenseRequest->dwPlatformID; AllocateRequest.dwLangId = pLicenseRequest->dwLanguageID; AllocateRequest.dwNumLicenses = 1;
dwStatus = DBFindLostLicenseExact( pDbWkSpace, &AllocateRequest, //TRUE,
pHwid, &keypack, &License );
#if 0
//
// TermSrv does not support matching, comment out for now
//
if(dwStatus == TLS_E_RECORD_NOTFOUND) { //
// find by matching, very expensive operation
//
dwStatus = DBFindLostLicenseMatch( pDbWkSpace, &AllocateRequest, FALSE, pHwid, &keypack, &License );
if(dwStatus == ERROR_SUCCESS) { dwRetCode = TLS_W_LICENSE_PROXIMATE; } } #endif
if(dwStatus != ERROR_SUCCESS) { goto cleanup; }
UnixTimeToFileTime(License.ftIssueDate, ¬Before); UnixTimeToFileTime(License.ftExpireDate, ¬After);
ulSerialNumber.LowPart = License.dwLicenseId; ulSerialNumber.HighPart = keypack.dwKeyPackId;
PolRequest.dwProductVersion = MAKELONG(keypack.wMinorVersion, keypack.wMajorVersion); PolRequest.pszProductId = (LPTSTR)keypack.szProductId; PolRequest.pszCompanyName = (LPTSTR)keypack.szCompanyName; PolRequest.dwLanguageId = pLicenseRequest->dwLanguageID; PolRequest.dwPlatformId = keypack.dwPlatformType; PolRequest.pszMachineName = License.szMachineName; PolRequest.pszUserName = License.szUserName;
//
// Inform Policy Module of license generation.
//
PolModGenLicense.pLicenseRequest = &PolRequest; PolModGenLicense.dwKeyPackType = keypack.ucAgreementType; PolModGenLicense.dwKeyPackId = keypack.dwKeyPackId; PolModGenLicense.dwKeyPackLicenseId = License.dwKeyPackLicenseId; PolModGenLicense.ClientLicenseSerialNumber = ulSerialNumber; PolModGenLicense.ftNotBefore = notBefore; PolModGenLicense.ftNotAfter = notAfter;
dwStatus = pLicenseRequest->pPolicy->PMLicenseRequest( pLicenseRequest->hClient, REQUEST_GENLICENSE, (PVOID)&PolModGenLicense, (PVOID *)&pPolModCertExtension );
if(dwStatus != ERROR_SUCCESS) { //
// Error in policy module
//
goto cleanup; }
//
// Check error return from policy module
//
if(pPolModCertExtension != NULL) { if(pPolModCertExtension->pbData != NULL && pPolModCertExtension->cbData == 0 || pPolModCertExtension->pbData == NULL && pPolModCertExtension->cbData != 0 ) { // assuming no extension data
pPolModCertExtension->cbData = 0; pPolModCertExtension->pbData = NULL; }
if(CompareFileTime(&(pPolModCertExtension->ftNotBefore), &(pPolModCertExtension->ftNotAfter)) > 0) { //
// invalid data return from policy module
//
TLSLogEvent( EVENTLOG_ERROR_TYPE, TLS_E_GENERATECLIENTELICENSE, dwStatus = TLS_E_POLICYMODULEERROR, pLicenseRequest->pPolicy->GetCompanyName(), pLicenseRequest->pPolicy->GetProductId() );
goto cleanup; }
//
// Ignore not before and not after
//
}
if(keypack.ucAgreementType == LSKEYPACKTYPE_TEMPORARY) { //
// we found a temporary license
//
dwRetCode = TLS_I_FOUND_TEMPORARY_LICENSE; }
//
// License expired
//
if(License.ftExpireDate < time(NULL)) { dwRetCode = TLS_E_LICENSE_EXPIRED; }
//
// Return licensed product
//
pLicensedProduct->pSubjectPublicKeyInfo = NULL; pLicensedProduct->dwQuantity = License.dwNumLicenses; pLicensedProduct->ulSerialNumber = ulSerialNumber;
pLicensedProduct->dwKeyPackId = keypack.dwKeyPackId; pLicensedProduct->dwLicenseId = License.dwLicenseId; pLicensedProduct->dwKeyPackLicenseId = License.dwKeyPackLicenseId;
pLicensedProduct->ClientHwid.dwPlatformID = License.dwSystemBiosChkSum; pLicensedProduct->ClientHwid.Data1 = License.dwVideoBiosChkSum; pLicensedProduct->ClientHwid.Data2 = License.dwFloppyBiosChkSum; pLicensedProduct->ClientHwid.Data3 = License.dwHardDiskSize; pLicensedProduct->ClientHwid.Data4 = License.dwRamSize;
pLicensedProduct->bTemp = (keypack.ucAgreementType == LSKEYPACKTYPE_TEMPORARY);
pLicensedProduct->NotBefore = notBefore; pLicensedProduct->NotAfter = notAfter;
pLicensedProduct->dwProductVersion = MAKELONG(keypack.wMinorVersion, keypack.wMajorVersion);
_tcscpy(pLicensedProduct->szCompanyName, keypack.szCompanyName); _tcscpy(pLicensedProduct->szLicensedProductId, keypack.szProductId); StringCbCopy(pLicensedProduct->szRequestProductId, sizeof(pLicensedProduct->szRequestProductId), pLicenseRequest->pClientLicenseRequest->pszProductId);
_tcscpy(pLicensedProduct->szUserName, License.szUserName); _tcscpy(pLicensedProduct->szMachineName, License.szMachineName);
pLicensedProduct->dwLanguageID = pLicenseRequest->dwLanguageID; pLicensedProduct->dwPlatformID = pLicenseRequest->dwPlatformID; pLicensedProduct->pbPolicyData = (pPolModCertExtension) ? pPolModCertExtension->pbData : NULL; pLicensedProduct->cbPolicyData = (pPolModCertExtension) ? pPolModCertExtension->cbData : 0;
if (NULL != pucMarked) { // this field is being reused for marking (e.g. user is authenticated)
*pucMarked = License.ucEntryStatus; }
cleanup: return (dwStatus == ERROR_SUCCESS) ? dwRetCode : dwStatus; }
|