You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
571 lines
15 KiB
571 lines
15 KiB
//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
|