590 lines
16 KiB
C++
590 lines
16 KiB
C++
//+--------------------------------------------------------------------------
|
|
//
|
|
// 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;
|
|
}
|