Windows2003-3790/termsrv/license/lrwizapi/global.h
2020-09-30 16:53:55 +02:00

572 lines
15 KiB
C++

//Copyright (c) 1998 - 1999 Microsoft Corporation
#ifndef _GLOBAL_H_
#define _GLOBAL_H_
#include "precomp.h"
#if !defined(_WIN32_WINNT)
#define _WIN32_WINNT 0x0400
#endif
#include <wininet.h>
#include "wincrypt.h"
#include "license.h"
#include "tlsapip.h"
#include "lrwizapi.h"
#include "chstruct.h"
#define szOID_GIVEN_NAME_W L"2.5.4.42"
#define szOID_COMMON_NAME_W L"2.5.4.3"
#define szOID_COUNTRY_NAME_W L"2.5.4.6"
#define szOID_LOCALITY_NAME_W L"2.5.4.7"
#define szOID_STATE_OR_PROVINCE_NAME_W L"2.5.4.8"
#define szOID_STREET_ADDRESS_W L"2.5.4.9"
#define szOID_POSTAL_CODE_W L"2.5.4.17"
#define szOID_TELEPHONE_NUMBER_W L"2.5.4.20"
#define szOID_FACSIMILE_TELEPHONE_NUMBER_W L"2.5.4.23"
#define szOID_RSA_emailAddr_W L"1.2.840.113549.1.9.1"
#define szCertEXTENSION_OID "1.3.6.1.4.1.311.18"
#define szCertEXTENSION_VALUE_FMT _TEXT("TLS~%s")
#define CH_ERROR_SUCCESS ERROR_SUCCESS
#define CH_ERROR_BASE 0x3000
#define CH_ERROR_BAD_DATA (CH_ERROR_BASE + 1)
#define CH_ERROR_BAD_PARAM (CH_ERROR_BASE + 2)
#define CH_ERROR_BAD_REQUEST (CH_ERROR_BASE + 3)
#define CH_ERROR_NO_DATA (CH_ERROR_BASE + 4)
#define CH_ERROR_OUT_OF_MEMORY (CH_ERROR_BASE + 5)
#define CH_ERROR_EXCEPTION (CH_ERROR_BASE + 6)
#define CH_ERROR_HTTPQRY_FAILED (CH_ERROR_BASE + 7)
#define CH_ERROR_SERVER_ERROR (CH_ERROR_BASE + 8)
#define CH_ERROR_SEND_FAILED (CH_ERROR_BASE + 9)
#define CH_ERROR_BAD_MFBLOB (CH_ERROR_BASE + 10)
#define NUMBER_OF_BATCHES 7
#define CHARS_IN_BATCH 5
#define REG_ICW_STATUS_PATH L"Software\\Microsoft\\Internet Connection Wizard"
#define REG_ICW_COMPLETED L"Completed"
#define RNC_NETWORKS 0x00000001
#define MAX_URL_LENGTH 255
#define RECTWIDTH( rc ) ((rc).right - (rc).left)
#define RECTHEIGHT( rc ) ((rc).bottom - (rc).top)
#define SIZE_OF_BUFFER( x ) sizeof( x ) / sizeof( TCHAR )
#define PRODUCT_WINDOW_STRING_LENGTH 50
#define PRODUCT_WINDOW_NUM_OFFSET_SPACES 5
enum ProductType
{
UNKNOWN_PRODUCT_TYPE = 0,
WIN2K_PERSEAT = 1,
WIN2K_INTERNET = 2,
WHISTLER_PERUSER = 3,
WHISTLER_PERSEAT = 4,
NUM_PRODUCT_TYPES = 5
};
enum ProductVersionType
{
PRODUCT_VERSION_UNDEFINED = 0,
PRODUCT_VERSION_W2K = 1,
PRODUCT_VERSION_WHISTLER = 2
};
typedef struct
{
TCHAR lpszSPK[ LR_RETAILSPK_LEN+1];
TCHAR tcStatus;
} RETAILSPK, *PRETAILSPK;
typedef struct
{
LPWSTR lpszAttribute;
LPWSTR lpszValue;
DWORD dwValueLen;
}REG_ATTR, * PREG_ATTR;
typedef struct
{
LPCSTR lpszOID;
LPSTR lpszValue;
} REQ_ATTR, * PREQ_ATTR;
typedef struct _Enveloped_Data
{
DWORD cbEncryptedKey;
PBYTE pbEncryptedKey;
DWORD cbEncryptedData;
PBYTE pbEncryptedData;
} EnvData, * PEnvData;
typedef struct _CONTACT_INFO_TAG
{
//program related information
CString sProgramName; //Can be Select, MOLP, Retail ...
CString sCertType;
//Contact information
CString sCompanyName;
CString sOrgUnit;
CString sContactLName;
CString sContactFName;
CString sContactAddress;
CString sContactPhone;
CString sContactFax;
CString sContactEmail;
CString sEmailAddressConf;
CString sCity;
CString sCountryCode;
CString sCountryDesc;
CString sState;
CString sZip;
CString sReasonCode;
CString sCSRFaxRegion;
CString sCSRPhoneRegion;
void Initialize()
{
sProgramName = sContactLName = sContactFName = sContactAddress =
sContactPhone = sCity = sCountryCode = sCountryDesc = sState = sZip =
sContactEmail = sCompanyName = sOrgUnit = sReasonCode = sContactFax =
sEmailAddressConf = sCertType = sCSRFaxRegion = sCSRPhoneRegion =
sCountryCode = sCountryDesc = "";
};
} CONTACTINFO, *PCONTACTINFO;
// Formerly named "LICINFO", but that conflicts with ocidl.h
typedef struct _LIC_INFO_TAG
{
//Select Information
CString sSelMastAgrNumber;
CString sSelEnrollmentNumber;
CString sSelProductType;
CString sSelProductDesc;
CString sSelQty;
//MOLP information
CString sMOLPAuthNumber; //authorization number
CString sMOLPAgreementNumber; //agreement number
CString sMOLPProductType; //product type
CString sMOLPProductDesc;
CString sMOLPQty; //quantity
void Initialize()
{
sSelMastAgrNumber = sSelEnrollmentNumber = sSelProductType = sSelProductDesc =
sSelQty = sMOLPAuthNumber = sMOLPAgreementNumber = sMOLPProductType = sMOLPProductDesc =
sMOLPQty = "";
};
} TSLICINFO, *PTSLICINFO;
typedef struct FAX_DATA_TAG
{
CString sRequestType;
CString sAgreementType;
CString sProductId;
CString sLSId;
CString sFName;
CString sLName;
CString sCompanyName;
CString sOrgUnit;
CString sAddress;
CString sCity;
CString sState;
CString sZip;
CString sCountryCode;
CString sCountryDesc;
CString sPhoneNumber;
CString sFaxNumber;
CString sEmailAddress;
CString sLicenseType;
CString sQuantity;
CString sSelEnrollNumber;
CString sMolpAuthNumber;
CString sMolpLicNumber;
void Initialize()
{
sRequestType = "";
sAgreementType = "";
sProductId = "";
sLSId = "";
sCompanyName = "";
sOrgUnit = "";
sAddress = "";
sCity = "";
sState = "";
sCountryCode = "";
sCountryDesc = "";
sZip = "";
sLName = "";
sFName = "";
sPhoneNumber = "";
sFaxNumber = "";
sEmailAddress = "";
sLicenseType = "";
sQuantity = "";
sSelEnrollNumber= "";
sMolpAuthNumber = "";
sMolpLicNumber = "";
};
}FAX_DATA, * PFAX_DATA;
class CGlobal
{
public:
CGlobal();
~CGlobal();
void FreeGlobal(void);
//Public Data Members
public:
//Public Member Functions
public:
DWORD PingCH(void);
void SetInstanceHandle(HINSTANCE hInst);
HINSTANCE GetInstanceHandle();
void SetLSName(LPCTSTR lpwszLSName);
DWORD InitGlobal();
DWORD CheckRequieredFields();
DWORD LRGetLastError();
int LRMessageBox(HWND hWndParent,DWORD dwMsgId,DWORD dwCaptionID = 0, DWORD dwErrorCode = 0);
DWORD AuthenticateLS();
DWORD SetCHCert(LPTSTR lpstrRegKey, PBYTE pCert, DWORD dwLen);
DWORD GetCHCert(LPTSTR lpstrRegKey, PBYTE * ppCert, DWORD * pdwLen );
BOOL IsLSRunning();
DWORD GetLSCertificates(PDWORD pdwLSStatus);
DWORD IsLicenseServerRegistered(PDWORD pdwServerStatus);
PCONTACTINFO GetContactDataObject();
PTSLICINFO GetLicDataObject();
DWORD GetRequestType();
void SetRequestType(DWORD dwMode);
DWORD ResetLSSPK(BOOL bGenKey = TRUE);
TCHAR * GetRegistrationID(void);
TCHAR * GetLicenseServerID(void);
BOOL IsOnlineCertRequestCreated();
DWORD SetLRState(DWORD dwState);
DWORD ProcessRequest();
DWORD SetCertificatePIN(LPTSTR lpszPIN);
DWORD PopulateCountryComboBox(HWND hWndCmb);
DWORD GetCountryCode(CString sDesc,LPTSTR szCode);
DWORD GetCountryDesc(CString sCode,LPTSTR szDesc);
DWORD PopulateProductComboBox(HWND hWndCmb, ProductVersionType VerType);
DWORD GetProductCode(CString sDesc,LPTSTR szCode);
DWORD PopulateReasonComboBox(HWND hWndCmb, DWORD dwType);
DWORD GetReasonCode(CString sDesc,LPTSTR szCode, DWORD dwType);
DWORD GetReasonDesc(CString sCode,LPTSTR szDesc, DWORD dwType);
DWORD PopulateCountryRegionComboBox(HWND hWndCmb);
DWORD PopulateCountryRegionListBox(HWND hWndCmb);
void ReadPhoneNumberFromRegistry(LPCTSTR lpCountry, LPTSTR lpPhoneNumber, DWORD nBufferSize);
DWORD CheckRegistryForPhoneNumbers();
void LRSetLastRetCode(DWORD dwCode);
DWORD LRGetLastRetCode();
void SetCSRNumber(TCHAR *);
TCHAR * GetCSRNumber(void);
void SetWWWSite(TCHAR *);
TCHAR * GetWWWSite(void);
void LRPush(DWORD dwPageId);
DWORD LRPop();
void ClearWizStack();
DWORD DepositLSSPK();
DWORD SetLSLKP(TCHAR * tcLKP);
DWORD SetLSSPK(TCHAR * tcLKP);
BOOL ValidateEmailId(CString sEmailId);
BOOL CheckProgramValidity(CString sProgramName);
BOOL ValidateLRString(CString sStr);
LPSTR UnicodeToAnsi( LPWSTR lpwszBuf);
LPSTR UnicodeToAnsi( LPWSTR lpwszBuf, DWORD dwLength );
LPWSTR AnsiToUnicode ( LPSTR lpszBuf );
void SetReFresh(DWORD dw) { m_dwRefresh = dw; }
DWORD GetReFresh(void)
{
return m_dwRefresh;
}
void DeleteRetailSPKFromList(TCHAR * lpszRetailSPK);
DWORD AddRetailSPKToList(HWND hListView, TCHAR * lpszRetailSPK);
void LoadUnfinishedFromList(HWND hListView);
void LoadFinishedFromList(HWND hListView);
void LoadFromList(HWND hListView);
void UpdateSPKStatus(TCHAR * lpszRetailSPK, TCHAR tcStatus);
DWORD SetConfirmationNumber(TCHAR * tcConf);
void SetModifiedRetailSPK(CString sRetailSPK);
void GetModifiedRetailSPK(CString &sRetailSPK);
void ModifyRetailSPKFromList(TCHAR * lpszOldSPK,TCHAR * lpszNewSPK);
DWORD ValidateRetailSPK(TCHAR * lpszRetailSPK);
DWORD GetLSLangId();
void SetLSLangId(DWORD dwLangId);
void SetLSStatus(DWORD dwStatus);
DWORD GetLSStatus(void);
DWORD GetEntryPoint(void);
WIZCONNECTION GetActivationMethod(void);
void SetActivationMethod(WIZCONNECTION conn);
WIZCONNECTION GetLSProp_ActivationMethod(void);
void SetLSProp_ActivationMethod(WIZCONNECTION conn);
WIZACTION GetWizAction(void);
void SetWizAction(WIZACTION act);
WIZTYPE GetWizType() {return m_WizType;}
void SetWizType(WIZTYPE t) {m_WizType = t;}
DWORD SetInRegistry(LPCSTR lpszOID, LPCTSTR lpszValue);
DWORD GetFromRegistry(LPCSTR lpszOID, LPTSTR lpszBuffer, BOOL bConnect = TRUE);
DWORD SetEncodedInRegistry(LPCSTR lpszOID, LPCTSTR lpszValue);
DWORD TransmitLKPData(NewLKP_Request &lkpRequest, NewLKP_Response* lkpResponse);
//Private Member functions
protected:
void LRSetLastError(DWORD dwErrorCode);
DWORD GetTempCryptContext(HCRYPTPROV * phCryptProv);
void DoneWithTempCryptContext(HCRYPTPROV hCryptProv);
DWORD GetCryptContextWithLSKeys(HCRYPTPROV * lphCryptProv );
void DoneWithCryptContextWithLSKeys(HCRYPTPROV hProv);
DWORD LoadCountries();
DWORD LoadReasons();
DWORD LoadProducts();
DWORD ConnectToLSRegistry();
void DisconnectLSRegistry();
DWORD ConnectToLS();
void DisconnectLS();
DWORD ProcessDownloadLKP();
DWORD ProcessIRegRequest();
DWORD ProcessCertDownload();
DWORD ProcessCASignOnlyRequest();
DWORD ProcessCHReissueLKPRequest();
DWORD DepositLSLKP(void);
DWORD ProcessCHRevokeCert(void);
DWORD ProcessCHReissueCert(void);
DWORD CreateLKPRequest(PBYTE * ppbLKPRequest, NewLKP_Request * newlkpp, DWORD &dwBufLen, ProductType productTypeFilter);
DWORD DepositLKPResponse(PBYTE pbResponseData, DWORD dwResponseLen);
DWORD CreateLSPKCS10(HCRYPTPROV hCryptProv,int nType, CHAR **lppszPKCS10);
DWORD AskLSToCreatePKCS10(int nType, CHAR **lppszPKCS10);
DWORD DepositLSCertificates(PBYTE pbExchangePKCS7,
DWORD dwExchangePKCS7Len,
PBYTE pbSignaturePKCS7,
DWORD dwSignaturePKCS7Len,
PBYTE pbRootCert,
DWORD dwRootCertLen);
DWORD SetCARequestAttributes();
DWORD SetCHRequestAttributes();
void ClearCHRequestAttributes();
void ClearCARequestAttributes();
DWORD SetRegistrationAttribute ( LPWSTR lpszAttribute, LPCWSTR lpszValue, DWORD dwLen );
DWORD SetDNAttribute(LPCSTR lpszOID, LPSTR lpszValue);
void PrepareLRString(CString &sStr);
CERT_RDN_ATTR * CreateRDNAttr();
//Crypto Related functions
DWORD EnvelopeData(
PCCERT_CONTEXT pCertContext,
DWORD cbMessage,
PBYTE pbMessage,
PEnvData pEnvelopedData,
HCRYPTPROV hCryptProv,
HCERTSTORE hCertStore
);
DWORD PackEnvData(
PEnvData pEnvelopedData,
PDWORD pcbPacked,
PBYTE *ppbPacked
);
DWORD GetCertforExtension ( HCRYPTPROV hCryptProv,
HCERTSTORE hCertStore,
LPSTR szOID_EXT,
PCCERT_CONTEXT * ppCertContext);
DWORD VerifyCertChain ( HCRYPTPROV hCryptProvider, //handle to crypt prov
HCERTSTORE hCertStore, //HAndle to store for verification
PBYTE pbRootCert, //Root cert
DWORD dwcbRootCert
);
DWORD InitCHRequest(void);
DWORD CloseCHRequest(void);
DWORD Dispatch(BYTE * bpData, DWORD dwLen);
DWORD FetchResponse(BYTE * bpResponse,
DWORD dwMaxLength,
PDWORD dwpDataLength);
DWORD InitSPKList(void);
DWORD InsertIntoSPKDisplayList(HWND hListView,
TCHAR * lpszRetailSPK,
TCHAR tcStatus);
BOOL CheckIfICWCompleted();
ProductType GetProductCodeFromKey(LPCTSTR lpLicenseKey);
DWORD FilteredRetailSPKEntered(ProductType productTypeFilter);
DWORD DownloadLKPBatch(ProductType productTypeFilter);
int FindStringTruncationPoint(TCHAR* sOriginal, unsigned int nTruncationLength);
void AddStringToProductWindow(HWND hListView, TCHAR* sProductInfo, int nCurrentPoint, int nTruncationPoint);
int GetProductWindowMaxStringLength(HWND hListView);
//Private Data members
private:
DWORD m_dwLSStatus;
HWND m_hWndParent;
HINSTANCE m_hInstance;
LPTSTR m_lpstrLSName;
LPWSTR m_lpwstrLSName;
LPTSTR m_lpstrCHServer;
LPTSTR m_lpstrCHExtension;
DWORD m_dwErrorCode;
HKEY m_hLSRegKey;
DWORD m_dwExchangeCertificateLen;
PBYTE m_pbExchangeCertificate;
DWORD m_dwSignCertificateLen;
PBYTE m_pbSignCertificate;
DWORD m_dwExtenstionValueLen;
PBYTE m_pbExtensionValue;
PREQ_ATTR m_pReqAttr; //For the Cert Request
DWORD m_dwReqAttrCount;
PREG_ATTR m_pRegAttr; //For the LKP Request
DWORD m_dwRegAttrCount;
PCONTEXT_HANDLE m_phLSContext;
BOOL m_fSupportConcurrent;
BOOL m_fSupportWhistlerCAL;
CONTACTINFO m_ContactData;
TSLICINFO m_LicData;
DWORD m_dwRequestType;
DWORD m_dwLRState;
DWORD m_dwLRCount; //LKP Request Count
LPTSTR m_lpstrPIN;
TCHAR m_lpCSRNumber[MAX_COUNTRY_NUMBER_LENGTH + 1];
TCHAR m_lpWWWSite[MAX_URL_LENGTH];
CStringArray m_csaCountryCode;
CStringArray m_csaCountryDesc;
CStringArray m_csaProductCode;
CStringArray m_csaProductDesc;
CStringArray m_csaDeactReasonCode;
CStringArray m_csaDeactReasonDesc;
CStringArray m_csaReactReasonCode;
CStringArray m_csaReactReasonDesc;
DWORD m_dwLastRetCode;
DWORD m_dwRefresh;
HINTERNET m_hOpenDirect;
HINTERNET m_hConnect;
HINTERNET m_hRequest;
TCHAR m_pRegistrationID[ LR_REGISTRATIONID_LEN+1];
TCHAR m_pLicenseServerID[ LR_LICENSESERVERID_LEN+1];
TCHAR m_pLSLKP[ LR_REGISTRATIONID_LEN+1];
TCHAR m_pLSSPK[ LR_REGISTRATIONID_LEN+1];
//Stores page traversal order. Implemented as a stack
DWORD m_dwWizStack[NO_OF_PAGES];
DWORD m_dwTop;
DWORD m_dwRetailSPKEntered;
RETAILSPK m_listRetailSPK[ MAX_RETAILSPKS_IN_BATCH];
DWORD m_ProductQuantity[NUM_PRODUCT_TYPES];
CString m_sModifiedRetailsSPK;
DWORD m_dwLangId;
WIZCONNECTION m_ActivationMethod;
WIZCONNECTION m_LSProp_ActivationMethod;
WIZACTION m_WizAction;
WIZTYPE m_WizType;
};
#endif