//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//
//  Copyright (C) Microsoft Corporation, 1997 - 1999
//
//  File:       setuput.h
//
//--------------------------------------------------------------------------

#ifndef __SETUPUT_H__
#define __SETUPUT_H__

//+------------------------------------------------------------------------
//
//  File:	setuput.h
// 
//  Contents:	Header file for setup utility functions.
//
//  Functions:
//
//  History:	04/20/97	JerryK	Created
//
//-------------------------------------------------------------------------

#define SERVERINSTALLTICKS	50
#define CA_DEFAULT_KEY_LENGTH_ROOT	2048
#define CA_DEFAULT_KEY_LENGTH_SUB	1024
#define wszCERTSRVEXENAME   L"certsrv.exe"

#define wszCERTSRVSECTION  L"certsrv"
#define wszSERVERSECTION  L"certsrv_server"
#define wszCLIENTSECTION  L"certsrv_client"

#define wszOLDDOCCOMPONENT  L"certsrv_doc"

#define wszREGKEYOCMSUBCOMPONENTS L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Setup\\OC Manager\\Subcomponents"

#define wszREGKEYCERTSRVTODOLIST L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Setup\\OCManager\\ToDoList\\CertSrv"

#define wszW3SVCNAME    L"W3Svc"

#define _JumpIfOutOfMemory(hr, label, pMem) \
    { \
        if (NULL == (pMem)) \
        { \
            (hr) = E_OUTOFMEMORY; \
            _JumpError((hr), label, "Out of Memory"); \
        } \
    }


#define IS_CLIENT_INSTALL	0x00000001
#define IS_CLIENT_REMOVE	0x00000002
#define IS_CLIENT_CHANGE	0x00000004
#define IS_CLIENT_UPGRADE	0x00000008
#define IS_CLIENT_ENABLED	0x00000010

#define IS_SERVER_INSTALL	0x00000100
#define IS_SERVER_REMOVE	0x00000200
#define IS_SERVER_CHANGE	0x00000400
#define IS_SERVER_UPGRADE	0x00000800
#define IS_SERVER_ENABLED	0x00001000

#define VP_MIN                  1
#define VP_MAX                  1000
#define VP_MAX_DAYS_WEEKS_MONTHS    9999

// count the number of bytes needed to fully store the WSZ
#define WSZ_BYTECOUNT(__z__)   \
    ( (__z__ == NULL) ? 0 : (wcslen(__z__)+1)*sizeof(WCHAR) )


typedef enum {
    cscInvalid,
    cscTopLevel,
    cscServer,
    cscClient,
} CertSubComponent;


typedef struct _UNATTENDPARM
{
    WCHAR const  *pwszName;
    WCHAR	**ppwszValue;
} UNATTENDPARM;

typedef struct _SUBCOMP
{
    WCHAR const *pwszSubComponent;
    CertSubComponent cscSubComponent;
    DWORD InstallFlags;
    DWORD UninstallFlags;
    DWORD ChangeFlags;
    DWORD UpgradeFlags;
    DWORD EnabledFlags;
    DWORD SetupStatusFlags;
    BOOL  fDefaultInstallUnattend;
    BOOL  fInstallUnattend;
    UNATTENDPARM *aUnattendParm;
} SUBCOMP;

HRESULT InitCASetup(HWND, PER_COMPONENT_DATA *pComp);

DWORD
myDoPageRequest(
    IN PER_COMPONENT_DATA *pComp,
    IN WizardPagesType WhichOnes,
    IN OUT PSETUP_REQUEST_PAGES SetupPages);

VOID
FreeCAComponentInfo(PER_COMPONENT_DATA *pComp);

HRESULT
PrepareUnattendedAttributes(
    IN HWND         hwnd,
    IN WCHAR const *pwszComponent,
    IN WCHAR const *pwszSubComponent,
    IN PER_COMPONENT_DATA *pComp);

VOID
FreeCAGlobals(VOID);

HRESULT
HookUnattendedServerAttributes(
    IN OUT PER_COMPONENT_DATA *pComp,
    IN OUT const SUBCOMP      *pServerComp);

HRESULT
HookUnattendedClientAttributes(
    IN OUT PER_COMPONENT_DATA *pComp,
    IN OUT const SUBCOMP      *pClientComp);

SUBCOMP const *
LookupSubComponent(
    IN CertSubComponent SubComp);

HRESULT
EnableVRootsAndShares(
    IN BOOL fFileSharesOnly,
    IN BOOL fUpgrade,
    IN BOOL fServer,
    IN OUT PER_COMPONENT_DATA *pComp);

HRESULT
DisableVRootsAndShares(
    IN BOOL fFileSharesOnly);

HRESULT
InstallCore(
    IN HWND hwnd,
    IN PER_COMPONENT_DATA *pComp,
    IN BOOL fServer);

HRESULT
PreUninstallCore(
    IN HWND hwnd,
    IN PER_COMPONENT_DATA *pComp,
    IN BOOL fPreserveClient);

HRESULT
UninstallCore(
    IN HWND hwnd,
    OPTIONAL IN PER_COMPONENT_DATA *pComp,
    IN DWORD PerCentCompleteBase,
    IN DWORD PerCentCompleteMax,
    IN BOOL fPreserveClient,
    IN BOOL fRemoveVD,
    IN BOOL fPreserveToDoList);

HRESULT
UpgradeServer(
    IN HWND                hwnd,
    IN PER_COMPONENT_DATA *pComp);

HRESULT
UpgradeClient(
    IN HWND                hwnd,
    IN PER_COMPONENT_DATA *pComp);

HRESULT CreateConfigFiles(WCHAR *pwszDirectoryPath,
    PER_COMPONENT_DATA *pComp, BOOL fRemove, HWND hwnd);

HRESULT myStringToAnsiFile(HANDLE hFile, LPCSTR psz, DWORD cch);
HRESULT myStringToAnsiFile(HANDLE hFile, LPCWSTR pwsz, DWORD cch);
HRESULT myStringToAnsiFile(HANDLE hFile, CHAR ch);

HRESULT
myGetEnvString(
    WCHAR **ppwszOut,
    WCHAR const *pwszVariable);

VOID
certocmBumpGasGauge(
    IN PER_COMPONENT_DATA *pComp,
    IN DWORD PerCentComplete
    DBGPARM(IN WCHAR const *pwszSource));

HRESULT
UpdateSubComponentInstallStatus(
    IN WCHAR const *pwszComponent,
    IN WCHAR const *pwszSubComponent,
    IN OUT PER_COMPONENT_DATA *pComp);

HRESULT StartCertsrvService(BOOL fSilent);

BOOL certocmIsEnabled(PER_COMPONENT_DATA *pComp, CertSubComponent SubComp);
BOOL certocmWasEnabled(PER_COMPONENT_DATA *pComp, CertSubComponent SubComp);
BOOL certocmInstalling(PER_COMPONENT_DATA *pComp, CertSubComponent SubComp);
BOOL certocmUninstalling(PER_COMPONENT_DATA *pComp, CertSubComponent SubComp);
BOOL certocmPreserving(PER_COMPONENT_DATA *pComp, CertSubComponent SubComp);
HRESULT certocmRetrieveUnattendedText(
    IN WCHAR const *pwszComponent,
    IN WCHAR const *pwszSubComponent,
    IN PER_COMPONENT_DATA *pComp);

SUBCOMP *
TranslateSubComponent(
    IN WCHAR const *pwszComponent,
    OPTIONAL IN WCHAR const *pwszSubComponent);

HRESULT
certocmReadInfString(
    IN HINF hInf,
    OPTIONAL IN WCHAR const *pwszFile,
    IN WCHAR const *pwszSection,
    IN WCHAR const *pwszName,
    IN OUT WCHAR **ppwszValue);

HRESULT
ImportPFXAndUpdateCSPInfo(
    IN const HWND    hDlg,
    IN OUT PER_COMPONENT_DATA *pComp);

HRESULT CreateProgramGroups(BOOL fClient,
                            PER_COMPONENT_DATA *pComp,
                            HWND hwnd);

HRESULT
LoadDefaultCAIDAttributes(
    IN OUT PER_COMPONENT_DATA *pComp);

HRESULT
LoadDefaultAdvanceAttributes(
    IN OUT CASERVERSETUPINFO* pServer);

HRESULT
BuildDBFileName(
    IN WCHAR const *pwszCAName,
    IN WCHAR const *pwszDBDirectory,
    OUT WCHAR **ppwszDBFile);

VOID
BuildPath(
    OUT WCHAR *pwszOut,
    IN DWORD cwcOut,
    IN WCHAR const *pwszDir,
    IN WCHAR const *pwszFile);

HRESULT
GetDefaultDBDirectory(
    IN PER_COMPONENT_DATA *pComp,
    OUT WCHAR            **ppwszDir);

HRESULT
GetDefaultSharedFolder(
    OUT WCHAR **ppwszSharedFolder);

HRESULT 
StartAndStopService(
    IN HINSTANCE    hInstance,
    IN BOOL         fUnattended,
    IN HWND const   hwnd,
    IN WCHAR const *pwszServiceName,
    IN BOOL const   fStopService,
    IN BOOL const   fConfirm,
    IN int          iMsg,
    OUT BOOL       *pfServiceWasRunning);

HRESULT
FixCertsvcService(
    IN PER_COMPONENT_DATA *pComp);

HRESULT
DetermineServerCustomModule(
    IN OUT PER_COMPONENT_DATA *pComp,
    IN BOOL  fPolicy);

HRESULT
DetermineServerUpgradePath(
    IN OUT PER_COMPONENT_DATA *pComp);

HRESULT
DetermineClientUpgradePath(
    IN OUT PER_COMPONENT_DATA *pComp);


HRESULT CreateCertWebDatIncPage(IN PER_COMPONENT_DATA *pComp, IN BOOL bIsServer);


HRESULT
CancelCertsrvInstallation(
    HWND                hwnd,
    PER_COMPONENT_DATA *pComp);

HRESULT
BuildCACertFileName(
    IN HINSTANCE        hInstance,
    IN HWND             hwnd,
    IN BOOL             fUnattended,
    OPTIONAL IN WCHAR   *pwszSharedFolder,
    IN WCHAR           *pwszSanitizedName,
    OUT WCHAR         **ppwszCACertFile);

HRESULT
myRenameCertRegKey(
    IN WCHAR const *pwszSrcCAName,
    IN WCHAR const *pwszDesCAName);

bool IsValidPeriod(const CASERVERSETUPINFO *pServer);

HRESULT
CheckPostBaseInstallStatus(
    OUT BOOL *pfFinished);

// externals

extern BOOL   g_fShowErrMsg;
extern HINSTANCE g_hInstance;
extern BOOL g_fW3SvcRunning;
extern WCHAR *g_pwszArgvPath;
extern WCHAR *g_pwszNoService;
#if DBG_CERTSRV
extern WCHAR *g_pwszDumpStrings;
#endif

extern UNATTENDPARM aUnattendParmClient[];
extern UNATTENDPARM aUnattendParmServer[];

#endif // __SETUPUT_H__