//+-------------------------------------------------------------------------- // // Copyright (c) 1997-1999 Microsoft Corporation // // File: misc.cpp // // Contents: Misc. routines // // History: // //--------------------------------------------------------------------------- #include "pch.cpp" #include "globals.h" #include "misc.h" //------------------------------------------------------------ PMHANDLE GenerateClientId() { return (PMHANDLE)ULongToPtr(GetCurrentThreadId()); } //--------------------------------------------------------------------------- void TlsLicenseRequestToPMLicenseRequest( DWORD dwLicenseType, PTLSLICENSEREQUEST pTlsRequest, LPTSTR pszMachineName, LPTSTR pszUserName, DWORD dwSupportFlags, PPMLICENSEREQUEST pPmRequest ) /*++ Private routine. ++*/ { pPmRequest->dwLicenseType = dwLicenseType; pPmRequest->dwProductVersion = pTlsRequest->ProductInfo.dwVersion; pPmRequest->pszProductId = (LPTSTR)pTlsRequest->ProductInfo.pbProductID; pPmRequest->pszCompanyName = (LPTSTR) pTlsRequest->ProductInfo.pbCompanyName; pPmRequest->dwLanguageId = pTlsRequest->dwLanguageID; pPmRequest->dwPlatformId = pTlsRequest->dwPlatformID; pPmRequest->pszMachineName = pszMachineName; pPmRequest->pszUserName = pszUserName; pPmRequest->fTemporary = FALSE; pPmRequest->dwSupportFlags = dwSupportFlags; return; } //--------------------------------------------------------------------------- BOOL TLSDBGetMaxKeyPackId( PTLSDbWorkSpace pDbWkSpace, DWORD* pdwKeyPackId ) /* */ { TLSLICENSEPACK keypack; SetLastError(ERROR_SUCCESS); // if(pDbWkSpace == NULL || pdwKeyPackId == NULL) { SetLastError(ERROR_INVALID_PARAMETER); return GetLastError(); } LicPackTable& licpackTable = pDbWkSpace->m_LicPackTable; // use primary index - internal keypack id if( licpackTable.EnumBegin() == FALSE || licpackTable.MoveToRecord(JET_MoveLast) == FALSE) { if(licpackTable.GetLastJetError() == JET_errNoCurrentRecord) { *pdwKeyPackId = 0; goto cleanup; } else { SetLastError(SET_JB_ERROR(licpackTable.GetLastJetError())); goto cleanup; } } if(licpackTable.FetchRecord(keypack) == FALSE) { SetLastError(SET_JB_ERROR(licpackTable.GetLastJetError())); goto cleanup; } //FreeTlsLicensePack(&keypack); *pdwKeyPackId = keypack.dwKeyPackId; cleanup: return GetLastError() == ERROR_SUCCESS; } //--------------------------------------------------------------------------- BOOL TLSDBGetMaxLicenseId( PTLSDbWorkSpace pDbWkSpace, DWORD* pdwLicenseId ) /* */ { LICENSEDCLIENT licensed; SetLastError(ERROR_SUCCESS); // if(pDbWkSpace == NULL || pdwLicenseId == NULL) { SetLastError(ERROR_INVALID_PARAMETER); return GetLastError(); } LicensedTable& licensedTable = pDbWkSpace->m_LicensedTable; // use primary index - internal keypack id if( licensedTable.EnumBegin() == FALSE || licensedTable.MoveToRecord(JET_MoveLast) == FALSE) { if(licensedTable.GetLastJetError() == JET_errNoCurrentRecord) { *pdwLicenseId = 0; goto cleanup; } else { SetLastError(SET_JB_ERROR(licensedTable.GetLastJetError())); goto cleanup; } } if(licensedTable.FetchRecord(licensed) == FALSE) { SetLastError(SET_JB_ERROR(licensedTable.GetLastJetError())); goto cleanup; } *pdwLicenseId = licensed.dwLicenseId; cleanup: return GetLastError() == ERROR_SUCCESS; } //+------------------------------------------------------------------------ // Function: // LSDBGetNextKeyPackId() // // Description: // Return next available KeyPackId to be used in KeyPack table // // Arguments: // None // // Returns: // Key Pack Id // // Notes: // Could use AUTO NUMBER column type but returning the value would be // more toublesome. // // History: //------------------------------------------------------------------------- DWORD TLSDBGetNextKeyPackId() { LONG nextkeypack = InterlockedExchangeAdd(&g_NextKeyPackId, 1); DBGPrintf( DBG_INFORMATION, DBG_FACILITY_ALLOCATELICENSE, DBGLEVEL_FUNCTION_TRACE, _TEXT("GetNextKeyPack returns %d\n"), nextkeypack ); return nextkeypack; } //+------------------------------------------------------------------------ // Function: // LSDBGetNextLicenseId() // // Abstract: // Return next available LicenseId to be used in License Table // // Arguments: // None. // // Returns: // Next available License Id // // Notes: // // History: //------------------------------------------------------------------------- DWORD TLSDBGetNextLicenseId() { LONG nextlicenseid = InterlockedExchangeAdd(&g_NextLicenseId, 1); DBGPrintf( DBG_INFORMATION, DBG_FACILITY_ALLOCATELICENSE, DBGLEVEL_FUNCTION_TRACE, _TEXT("GetNextLicenseId returns %d\n"), nextlicenseid ); return nextlicenseid; } //--------------------------------------------------------------------------- DWORD TLSFormDBRequest( PBYTE pbEncryptedHwid, DWORD cbEncryptedHwid, DWORD dwProductVersion, LPTSTR pszCompanyName, LPTSTR pszProductId, DWORD dwLanguageId, DWORD dwPlatformId, LPTSTR szClientMachine, LPTSTR szUserName, LPTLSDBLICENSEREQUEST pDbRequest ) /*++ ++*/ { DWORD status; memset(pDbRequest, 0, sizeof(TLSDBLICENSEREQUEST)); // Decrypt HWID if(pbEncryptedHwid) { status=LicenseDecryptHwid( &pDbRequest->hWid, cbEncryptedHwid, pbEncryptedHwid, g_cbSecretKey, g_pbSecretKey); if(status != LICENSE_STATUS_OK) { return status; } } // // NOTE : No allocation of memory here... // pDbRequest->dwProductVersion = dwProductVersion; pDbRequest->pszCompanyName = pszCompanyName; pDbRequest->pszProductId = pszProductId; pDbRequest->dwLanguageID = dwLanguageId; pDbRequest->dwPlatformID = dwPlatformId; pDbRequest->pbEncryptedHwid = pbEncryptedHwid; pDbRequest->cbEncryptedHwid = cbEncryptedHwid; if(szClientMachine) _tcscpy(pDbRequest->szMachineName, szClientMachine); if(szUserName) _tcscpy(pDbRequest->szUserName, szUserName); pDbRequest->clientCertRdn.type = LSCERT_CLIENT_INFO_TYPE; pDbRequest->clientCertRdn.ClientInfo.szUserName = pDbRequest->szUserName; pDbRequest->clientCertRdn.ClientInfo.szMachineName = pDbRequest->szMachineName; pDbRequest->clientCertRdn.ClientInfo.pClientID = &pDbRequest->hWid; return ERROR_SUCCESS; } //--------------------------------------------------------------------------- DWORD TLSConvertRpcLicenseRequestToDbRequest( PBYTE pbEncryptedHwid, DWORD cbEncryptedHwid, TLSLICENSEREQUEST* pRequest, LPTSTR szClientMachine, LPTSTR szUserName, LPTLSDBLICENSEREQUEST pDbRequest ) /*++ ++*/ { DWORD status; memset(pDbRequest, 0, sizeof(TLSDBLICENSEREQUEST)); // Decrypt HWID if(pbEncryptedHwid) { status=LicenseDecryptHwid( &pDbRequest->hWid, cbEncryptedHwid, pbEncryptedHwid, g_cbSecretKey, g_pbSecretKey); if(status != LICENSE_STATUS_OK) { return status; } } // // NOTE : No allocation of memory here... // // pDbRequest->pProductInfo = &(pRequest->ProductInfo); pDbRequest->dwProductVersion = pRequest->ProductInfo.dwVersion; pDbRequest->pszCompanyName = (LPTSTR)pRequest->ProductInfo.pbCompanyName; pDbRequest->pszProductId = (LPTSTR)pRequest->ProductInfo.pbProductID; pDbRequest->dwLanguageID = pRequest->dwLanguageID; pDbRequest->dwPlatformID = pRequest->dwPlatformID; pDbRequest->pbEncryptedHwid = pRequest->pbEncryptedHwid; pDbRequest->cbEncryptedHwid = pRequest->cbEncryptedHwid; if(szClientMachine) _tcscpy(pDbRequest->szMachineName, szClientMachine); if(szUserName) _tcscpy(pDbRequest->szUserName, szUserName); pDbRequest->clientCertRdn.type = LSCERT_CLIENT_INFO_TYPE; pDbRequest->clientCertRdn.ClientInfo.szUserName = pDbRequest->szUserName; pDbRequest->clientCertRdn.ClientInfo.szMachineName = pDbRequest->szMachineName; pDbRequest->clientCertRdn.ClientInfo.pClientID = &pDbRequest->hWid; return ERROR_SUCCESS; } //--------------------------------------------------------------------------- BOOL ConvertLsKeyPackToKeyPack( IN LPLSKeyPack lpLsKeyPack, IN OUT PTLSLICENSEPACK lpLicPack, IN OUT PLICPACKDESC lpLicPackDesc ) /* Abstract: Convert LSKeyPack from client to internally use structure Parameter: lpLsKeyPack - source value. lpLicPack - Target license pack. lpLicPackDesc - target license pack description Return: None. */ { if(lpLsKeyPack == NULL) { SetLastError(TLS_E_INVALID_DATA); return FALSE; } // // BUG 226875 // DWORD dwBufSize; dwBufSize = sizeof(lpLsKeyPack->szCompanyName)/sizeof(lpLsKeyPack->szCompanyName[0]); lpLsKeyPack->szCompanyName[dwBufSize - 1] = _TEXT('\0'); dwBufSize = sizeof(lpLsKeyPack->szKeyPackId)/sizeof(lpLsKeyPack->szKeyPackId[0]); lpLsKeyPack->szKeyPackId[dwBufSize - 1] = _TEXT('\0'); dwBufSize = sizeof(lpLsKeyPack->szProductId)/sizeof(lpLsKeyPack->szProductId[0]); lpLsKeyPack->szProductId[dwBufSize - 1] = _TEXT('\0'); dwBufSize = sizeof(lpLsKeyPack->szProductDesc)/sizeof(lpLsKeyPack->szProductDesc[0]); lpLsKeyPack->szProductDesc[dwBufSize - 1] = _TEXT('\0'); dwBufSize = sizeof(lpLsKeyPack->szBeginSerialNumber)/sizeof(lpLsKeyPack->szBeginSerialNumber[0]); lpLsKeyPack->szBeginSerialNumber[dwBufSize - 1] = _TEXT('\0'); dwBufSize = sizeof(lpLsKeyPack->szProductName)/sizeof(lpLsKeyPack->szProductName[0]); lpLsKeyPack->szProductName[dwBufSize - 1] = _TEXT('\0'); if(lpLicPack) { memset(lpLicPack, 0, sizeof(TLSLICENSEPACK)); lpLicPack->ucAgreementType = lpLsKeyPack->ucKeyPackType; SAFESTRCPY(lpLicPack->szCompanyName, lpLsKeyPack->szCompanyName); SAFESTRCPY(lpLicPack->szKeyPackId, lpLsKeyPack->szKeyPackId); SAFESTRCPY(lpLicPack->szProductId, lpLsKeyPack->szProductId); lpLicPack->wMajorVersion = lpLsKeyPack->wMajorVersion; lpLicPack->wMinorVersion = lpLsKeyPack->wMinorVersion; lpLicPack->dwPlatformType = lpLsKeyPack->dwPlatformType; lpLicPack->ucLicenseType = lpLsKeyPack->ucLicenseType; lpLicPack->ucChannelOfPurchase = lpLsKeyPack->ucChannelOfPurchase; SAFESTRCPY(lpLicPack->szBeginSerialNumber, lpLsKeyPack->szBeginSerialNumber); lpLicPack->dwTotalLicenseInKeyPack = lpLsKeyPack->dwTotalLicenseInKeyPack; lpLicPack->dwProductFlags = lpLsKeyPack->dwProductFlags; lpLicPack->dwKeyPackId = lpLsKeyPack->dwKeyPackId; lpLicPack->dwExpirationDate = lpLsKeyPack->dwExpirationDate; lpLicPack->dwKeyPackId = lpLsKeyPack->dwKeyPackId; lpLicPack->dwActivateDate = lpLsKeyPack->dwActivateDate; lpLicPack->dwExpirationDate = lpLsKeyPack->dwExpirationDate; lpLicPack->dwNumberOfLicenses = lpLsKeyPack->dwNumberOfLicenses; lpLicPack->ucKeyPackStatus = lpLsKeyPack->ucKeyPackStatus; } if(lpLicPackDesc) { lpLicPackDesc->dwKeyPackId = lpLsKeyPack->dwKeyPackId; lpLicPackDesc->dwLanguageId = lpLsKeyPack->dwLanguageId; SAFESTRCPY(lpLicPackDesc->szCompanyName, lpLsKeyPack->szCompanyName); SAFESTRCPY(lpLicPackDesc->szProductName, lpLsKeyPack->szProductName); SAFESTRCPY(lpLicPackDesc->szProductDesc, lpLsKeyPack->szProductDesc); } return TRUE; } //----------------------------------------------------------- void ConvertKeyPackToLsKeyPack( IN PTLSLICENSEPACK lpLicPack, IN PLICPACKDESC lpLicPackDesc, IN OUT LPLSKeyPack lpLsKeyPack ) /* Abstract: Combine internally used license pack structure into one for return back to RPC client Parameter: lpLicPack - source lpLicPackStatus - source lpLicPackDesc - source lpLsKeyPack - target Return: None. */ { if(lpLicPack) { lpLsKeyPack->ucKeyPackType = lpLicPack->ucAgreementType; SAFESTRCPY(lpLsKeyPack->szCompanyName, lpLicPack->szCompanyName); SAFESTRCPY(lpLsKeyPack->szKeyPackId, lpLicPack->szKeyPackId); SAFESTRCPY(lpLsKeyPack->szProductId, lpLicPack->szProductId); lpLsKeyPack->wMajorVersion = lpLicPack->wMajorVersion; lpLsKeyPack->wMinorVersion = lpLicPack->wMinorVersion; lpLsKeyPack->dwPlatformType = lpLicPack->dwPlatformType; lpLsKeyPack->ucLicenseType = lpLicPack->ucLicenseType; lpLsKeyPack->ucChannelOfPurchase = lpLicPack->ucChannelOfPurchase; SAFESTRCPY(lpLsKeyPack->szBeginSerialNumber, lpLicPack->szBeginSerialNumber); lpLsKeyPack->dwTotalLicenseInKeyPack = lpLicPack->dwTotalLicenseInKeyPack; lpLsKeyPack->dwProductFlags = lpLicPack->dwProductFlags; lpLsKeyPack->dwKeyPackId = lpLicPack->dwKeyPackId; lpLsKeyPack->ucKeyPackStatus = lpLicPack->ucKeyPackStatus; lpLsKeyPack->dwActivateDate = lpLicPack->dwActivateDate; lpLsKeyPack->dwExpirationDate = lpLicPack->dwExpirationDate; lpLsKeyPack->dwNumberOfLicenses = lpLicPack->dwNumberOfLicenses; } if(lpLicPackDesc) { lpLsKeyPack->dwKeyPackId = lpLicPackDesc->dwKeyPackId; lpLsKeyPack->dwLanguageId = lpLicPackDesc->dwLanguageId; SAFESTRCPY(lpLsKeyPack->szCompanyName, lpLicPackDesc->szCompanyName); SAFESTRCPY(lpLsKeyPack->szProductName, lpLicPackDesc->szProductName); SAFESTRCPY(lpLsKeyPack->szProductDesc, lpLicPackDesc->szProductDesc); } return; } //----------------------------------------------------------------------- void ConvertLSLicenseToLicense( LPLSLicense lplsLicense, LPLICENSEDCLIENT lpLicense ) /* */ { lpLicense->dwLicenseId = lplsLicense->dwLicenseId; lpLicense->dwKeyPackId = lplsLicense->dwKeyPackId; memset(lpLicense->szMachineName, 0, sizeof(lpLicense->szMachineName)); memset(lpLicense->szUserName, 0, sizeof(lpLicense->szUserName)); //SAFESTRCPY(lpLicense->szMachineName, lplsLicense->szMachineName); _tcsncpy( lpLicense->szMachineName, lplsLicense->szMachineName, sizeof(lpLicense->szMachineName)/sizeof(lpLicense->szMachineName[0]) - 1 ); //SAFESTRCPY(lpLicense->szUserName, lplsLicense->szUserName); _tcsncpy( lpLicense->szUserName, lplsLicense->szUserName, sizeof(lpLicense->szUserName)/sizeof(lpLicense->szUserName[0]) - 1 ); lpLicense->ftIssueDate = lplsLicense->ftIssueDate; lpLicense->ftExpireDate = lplsLicense->ftExpireDate; lpLicense->ucLicenseStatus = lplsLicense->ucLicenseStatus; // // not expose to client // lpLicense->dwNumLicenses = 0; return; } //----------------------------------------------------------------------- void ConvertLicenseToLSLicense( LPLICENSEDCLIENT lpLicense, LPLSLicense lplsLicense ) /* */ { lplsLicense->dwLicenseId = lpLicense->dwLicenseId; lplsLicense->dwKeyPackId = lpLicense->dwKeyPackId; SAFESTRCPY(lplsLicense->szMachineName, lpLicense->szMachineName); SAFESTRCPY(lplsLicense->szUserName, lpLicense->szUserName); lplsLicense->ftIssueDate = lpLicense->ftIssueDate; lplsLicense->ftExpireDate = lpLicense->ftExpireDate; lplsLicense->ucLicenseStatus = lpLicense->ucLicenseStatus; return; } //----------------------------------------------------------------------- void ConvertLicenseToLSLicenseEx( LPLICENSEDCLIENT lpLicense, LPLSLicenseEx lplsLicense ) /* */ { lplsLicense->dwLicenseId = lpLicense->dwLicenseId; lplsLicense->dwKeyPackId = lpLicense->dwKeyPackId; SAFESTRCPY(lplsLicense->szMachineName, lpLicense->szMachineName); SAFESTRCPY(lplsLicense->szUserName, lpLicense->szUserName); lplsLicense->ftIssueDate = lpLicense->ftIssueDate; lplsLicense->ftExpireDate = lpLicense->ftExpireDate; lplsLicense->ucLicenseStatus = lpLicense->ucLicenseStatus; lplsLicense->dwQuantity = lpLicense->dwNumLicenses; return; }