windows-nt/Source/XPSP1/NT/base/ntsetup/complnce/compchk.c
2020-09-26 16:20:57 +08:00

1547 lines
47 KiB
C

/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
compliance.c
Abstract:
compliance checking routines.
Author:
Vijayachandran Jayaseelan (vijayj) - 31 Aug 1999
Revision History:
none
Notes:
These routines are used for compliance checking. CCMedia abstracts the
install media and the already existing COMPLIANCE_DATA structure is
used to abstract installation details.
The current compliance checking design uses factory design pattern
(Eric Gamma et.al.) to allow extensibility. Polymorphic behavior of
compliance check is implemented using a function pointer.
CCMediaCreate(...) creates the correct media object and binds the
appropriate compliance checking method to the object. To support a new media
type one needs to write a compliance check function for that
media and change CCMediaCreate(...) function to create the appropriate
media object bound to the new check function.
The compliance matrix is a multidimensional matrix i.e. type,
variation, suite, version (version in turn is made up of major,
minor and build# elements). Since changing a the multi-dimensional
compliance matrix can be error prone and not extensible in terms of
index management, a static global compliance matrix data structure was avoided.
--*/
#ifdef KERNEL_MODE
#include "textmode.h"
#define assert(x) ASSERT(x)
#else // KERNEL_MODE
#if DBG
#define assert(x) if (!(x)) DebugBreak();
#else
#define assert(x)
#endif // DBG
#include "winnt32.h"
#include <stdio.h>
#include <compliance.h>
#endif // for KERNEL_MODE
//
// macros
//
//
// indicates whether a given suite is installed
//
#define SUITE_INSTALLED(X, Y) \
(((X) & (Y)) ? TRUE : FALSE)
#define DEFAULT_MINIMUM_VALIDBUILD 2428
static BOOL bDisableBuildCheck = FALSE;
VOID
CCDisableBuildCheck(
VOID )
{
bDisableBuildCheck = TRUE;
}
//
// indicates whether the build is allowed to upgrade
//
__inline
BOOL
IsValidBuild(
IN DWORD InstallVersion,
IN DWORD SourceInstallVersion )
{
BOOL Result = TRUE;
if (bDisableBuildCheck) {
Result = TRUE;
} else if ((InstallVersion > 1381 && InstallVersion < 2031) ||
(InstallVersion > 2195 && InstallVersion < DEFAULT_MINIMUM_VALIDBUILD) ||
(InstallVersion > SourceInstallVersion)) {
Result = FALSE;
}
return Result;
}
BOOLEAN
CCProfessionalCheck(
IN PCCMEDIA This,
IN PCOMPLIANCE_DATA CompData,
OUT PUINT FailureReason,
OUT PBOOL UpgradeAllowed )
/*++
Routine Description:
This routine checks whether the an installation is compliant with the
professional media.
Arguments:
This : professional media object pointer
CompData : compliance data describing details for an installation
FailureReason : receives the reason for failure, if any.
UpgradeAllowed : receives a bool indicating whether upgrade is allowed
or not
Return Value:
TRUE if the given install is compliant for installing using the
professional media, otherwise FALSE
--*/
{
switch (CompData->InstallType) {
case COMPLIANCE_INSTALLTYPE_NTWP:
case COMPLIANCE_INSTALLTYPE_NTW:
if (CompData->MinimumVersion < 400) {
*FailureReason = COMPLIANCEERR_VERSION;
*UpgradeAllowed = FALSE;
} else {
if (IsValidBuild(CompData->BuildNumberNt, This->BuildNumber)) {
*FailureReason = COMPLIANCEERR_NONE;
*UpgradeAllowed = TRUE;
} else {
*FailureReason = COMPLIANCEERR_VERSION;
*UpgradeAllowed = FALSE;
}
}
break;
case COMPLIANCE_INSTALLTYPE_WIN9X:
// note: 401 is 4.1
if (CompData->MinimumVersion < 401) {
*FailureReason = COMPLIANCEERR_VERSION;
*UpgradeAllowed = FALSE;
} else {
*FailureReason = COMPLIANCEERR_NONE;
*UpgradeAllowed = TRUE;
}
break;
case COMPLIANCE_INSTALLTYPE_WIN31:
case COMPLIANCE_INSTALLTYPE_NTSTSE:
case COMPLIANCE_INSTALLTYPE_NTS:
case COMPLIANCE_INSTALLTYPE_NTSB:
case COMPLIANCE_INSTALLTYPE_NTSE:
case COMPLIANCE_INSTALLTYPE_NTSDTC:
case COMPLIANCE_INSTALLTYPE_NTSBS:
*FailureReason = COMPLIANCEERR_TYPE;
*UpgradeAllowed = FALSE;
break;
default:
*UpgradeAllowed = FALSE;
*FailureReason = COMPLIANCEERR_UNKNOWNTARGET;
break;
}
return (*FailureReason == COMPLIANCEERR_NONE) ? TRUE : FALSE;
}
BOOLEAN
CCFullProfessionalCheck(
IN PCCMEDIA This,
IN PCOMPLIANCE_DATA CompData,
OUT PUINT FailureReason,
OUT PBOOL UpgradeAllowed )
/*++
Routine Description:
This routine checks whether the an installation is compliant with the
professional full media.
Arguments:
This : professional media object pointer
CompData : compliance data describing details for an installation
FailureReason : receives the reason for failure, if any.
UpgradeAllowed : receives a bool indicating whether upgrade is allowed
or not
Return Value:
TRUE if the given install is compliant for installing using the
professional full media, otherwise FALSE
--*/
{
switch (This->SourceVariation) {
case COMPLIANCE_INSTALLVAR_OEM:
if ( ((CompData->InstallType == COMPLIANCE_INSTALLTYPE_WIN9X) && (CompData->MinimumVersion > 400) && (CompData->MinimumVersion <= 490)) ||
((CompData->InstallType == COMPLIANCE_INSTALLTYPE_NTW) && (CompData->MinimumVersion == 400)) ||
((CompData->InstallType == COMPLIANCE_INSTALLTYPE_NTW) && (CompData->MinimumVersion == 500)) ||
(((CompData->InstallType == COMPLIANCE_INSTALLTYPE_NTW) || (CompData->InstallType == COMPLIANCE_INSTALLTYPE_NTWP) )
&& (CompData->MinimumVersion == 501)
&& (CompData->InstallVariation != COMPLIANCE_INSTALLVAR_OEM)) ){
*FailureReason = COMPLIANCEERR_VARIATION;
*UpgradeAllowed = FALSE;
} else {
CCProfessionalCheck(This, CompData, FailureReason, UpgradeAllowed);
}
break;
case COMPLIANCE_INSTALLVAR_EVAL:
if( (CompData->InstallType == COMPLIANCE_INSTALLTYPE_NTW) &&
(CompData->MinimumVersion >= 501) &&
(CompData->InstallVariation != COMPLIANCE_INSTALLVAR_EVAL)) {
*FailureReason = COMPLIANCEERR_VARIATION;
*UpgradeAllowed = FALSE;
}
else {
CCProfessionalCheck(This, CompData, FailureReason, UpgradeAllowed);
}
break;
default:
CCProfessionalCheck(This, CompData, FailureReason, UpgradeAllowed);
break;
}
return (*FailureReason != COMPLIANCEERR_UNKNOWNTARGET) ? TRUE : FALSE;
}
BOOLEAN
CCProfessionalUpgCheck(
IN PCCMEDIA This,
IN PCOMPLIANCE_DATA CompData,
OUT PUINT FailureReason,
OUT PBOOL UpgradeAllowed )
/*++
Routine Description:
This routine checks whether the an installation is compliant with the
professional upgrade media.
Arguments:
This : professional media object pointer
CompData : compliance data describing details for an installation
FailureReason : receives the reason for failure, if any.
UpgradeAllowed : receives a bool indicating whether upgrade is allowed
or not
Return Value:
TRUE if the given install is compliant for installing using the
professional upgrade media, otherwise FALSE
--*/
{
if (CompData->InstallVariation == COMPLIANCE_INSTALLVAR_NFR) {
*FailureReason = COMPLIANCEERR_VARIATION;
*UpgradeAllowed = FALSE;
} else {
switch (This->SourceVariation) {
case COMPLIANCE_INSTALLVAR_OEM:
if ( ((CompData->InstallType == COMPLIANCE_INSTALLTYPE_WIN9X) && (CompData->MinimumVersion > 400) && (CompData->MinimumVersion <= 490)) ||
((CompData->InstallType == COMPLIANCE_INSTALLTYPE_NTW) && (CompData->MinimumVersion == 400)) ||
((CompData->InstallType == COMPLIANCE_INSTALLTYPE_NTW) && (CompData->MinimumVersion == 500) && (CompData->InstallVariation != COMPLIANCE_INSTALLVAR_OEM)) ||
(((CompData->InstallType == COMPLIANCE_INSTALLTYPE_NTW) || (CompData->InstallType == COMPLIANCE_INSTALLTYPE_NTWP) )
&& (CompData->MinimumVersion == 501)
&& (CompData->InstallVariation != COMPLIANCE_INSTALLVAR_OEM)) ){
*FailureReason = COMPLIANCEERR_VARIATION;
*UpgradeAllowed = FALSE;
} else {
CCProfessionalCheck(This, CompData, FailureReason, UpgradeAllowed);
}
break;
default:
CCProfessionalCheck(This, CompData, FailureReason, UpgradeAllowed);
break;
}
}
return (*FailureReason == COMPLIANCEERR_NONE) ? TRUE : FALSE;
}
BOOLEAN
CCPersonalCheck(
IN PCCMEDIA This,
IN PCOMPLIANCE_DATA CompData,
OUT PUINT FailureReason,
OUT PBOOL UpgradeAllowed )
/*++
Routine Description:
This routine checks whether the an installation is compliant with the
personal media.
Arguments:
This : personal media object pointer
CompData : compliance data describing details for an installation
FailureReason : receives the reason for failure, if any.
UpgradeAllowed : receives a bool indicating whether upgrade is allowed
or not
Return Value:
TRUE if the given install is compliant for installing using the
personal media, otherwise FALSE
--*/
{
switch (CompData->InstallType) {
case COMPLIANCE_INSTALLTYPE_WIN9X:
// note: 401 is version 4.1
if (CompData->MinimumVersion < 401) {
*FailureReason = COMPLIANCEERR_VERSION;
*UpgradeAllowed = FALSE;
} else {
*FailureReason = COMPLIANCEERR_NONE;
*UpgradeAllowed = TRUE;
}
break;
case COMPLIANCE_INSTALLTYPE_NTWP:
if (IsValidBuild(CompData->BuildNumberNt, This->BuildNumber)) {
*FailureReason = COMPLIANCEERR_NONE;
*UpgradeAllowed = TRUE;
} else {
*FailureReason = COMPLIANCEERR_VERSION;
*UpgradeAllowed = FALSE;
}
break;
case COMPLIANCE_INSTALLTYPE_WIN31:
case COMPLIANCE_INSTALLTYPE_NTW:
case COMPLIANCE_INSTALLTYPE_NTSTSE:
case COMPLIANCE_INSTALLTYPE_NTS:
case COMPLIANCE_INSTALLTYPE_NTSB:
case COMPLIANCE_INSTALLTYPE_NTSE:
case COMPLIANCE_INSTALLTYPE_NTSDTC:
case COMPLIANCE_INSTALLTYPE_NTSBS:
*FailureReason = COMPLIANCEERR_TYPE;
*UpgradeAllowed = FALSE;
break;
default:
*FailureReason = COMPLIANCEERR_UNKNOWNTARGET;
*UpgradeAllowed = FALSE;
break;
}
return (*FailureReason == COMPLIANCEERR_NONE) ? TRUE : FALSE;
}
BOOLEAN
CCFullPersonalCheck(
IN PCCMEDIA This,
IN PCOMPLIANCE_DATA CompData,
OUT PUINT FailureReason,
OUT PBOOL UpgradeAllowed )
/*++
Routine Description:
This routine checks whether the an installation is compliant with the
personal full media.
Arguments:
This : personal media object pointer
CompData : compliance data describing details for an installation
FailureReason : receives the reason for failure, if any.
UpgradeAllowed : receives a bool indicating whether upgrade is allowed
or not
Return Value:
TRUE if the given install is compliant for installing using the
personal full media, otherwise FALSE
--*/
{
switch (This->SourceVariation) {
case COMPLIANCE_INSTALLVAR_OEM:
if ((CompData->InstallType == COMPLIANCE_INSTALLTYPE_WIN9X) && (CompData->MinimumVersion > 400) && (CompData->MinimumVersion <= 490)) {
*FailureReason = COMPLIANCEERR_VARIATION;
*UpgradeAllowed = FALSE;
} else if( (CompData->InstallType == COMPLIANCE_INSTALLTYPE_NTWP) &&
(CompData->InstallVariation != COMPLIANCE_INSTALLVAR_OEM)) {
*FailureReason = COMPLIANCEERR_VARIATION;
*UpgradeAllowed = FALSE;
}
else {
CCPersonalCheck(This, CompData, FailureReason, UpgradeAllowed);
}
break;
case COMPLIANCE_INSTALLVAR_EVAL:
if( (CompData->InstallType == COMPLIANCE_INSTALLTYPE_NTWP) &&
(CompData->InstallVariation != COMPLIANCE_INSTALLVAR_EVAL)) {
*FailureReason = COMPLIANCEERR_VARIATION;
*UpgradeAllowed = FALSE;
}
else {
CCPersonalCheck(This, CompData, FailureReason, UpgradeAllowed);
}
break;
default:
CCPersonalCheck(This, CompData, FailureReason, UpgradeAllowed);
break;
}
return (*FailureReason != COMPLIANCEERR_UNKNOWNTARGET) ? TRUE : FALSE;
}
BOOLEAN
CCPersonalUpgCheck(
IN PCCMEDIA This,
IN PCOMPLIANCE_DATA CompData,
OUT PUINT FailureReason,
OUT PBOOL UpgradeAllowed )
/*++
Routine Description:
This routine checks whether the an installation is compliant with the
personal upgrade media.
Arguments:
This : personal media object pointer
CompData : compliance data describing details for an installation
FailureReason : receives the reason for failure, if any.
UpgradeAllowed : receives a bool indicating whether upgrade is allowed
or not
Return Value:
TRUE if the given install is compliant for installing using the
personal upgrade media, otherwise FALSE
--*/
{
if (CompData->InstallVariation == COMPLIANCE_INSTALLVAR_NFR) {
*FailureReason = COMPLIANCEERR_VARIATION;
*UpgradeAllowed = FALSE;
} else {
switch (This->SourceVariation) {
case COMPLIANCE_INSTALLVAR_OEM:
if( (CompData->InstallType == COMPLIANCE_INSTALLTYPE_NTWP) &&
(CompData->InstallVariation != COMPLIANCE_INSTALLVAR_OEM)) {
*FailureReason = COMPLIANCEERR_VARIATION;
*UpgradeAllowed = FALSE;
}
else {
CCPersonalCheck(This, CompData, FailureReason, UpgradeAllowed);
}
break;
default:
CCPersonalCheck(This, CompData, FailureReason, UpgradeAllowed);
break;
}
}
return (*FailureReason == COMPLIANCEERR_NONE) ? TRUE : FALSE;
}
BOOLEAN
CCBladeServerCheck(
IN PCCMEDIA This,
IN PCOMPLIANCE_DATA CompData,
OUT PUINT FailureReason,
OUT PBOOL UpgradeAllowed )
/*++
Routine Description:
This routine checks whether the an installation is compliant with the
blade server media. Policy is to allow blade server to be installed on
older version of blade or on Windows Powered boxes (ADS w/EMBED suite).
Arguments:
This : server media object pointer
CompData : compliance data describing details for an installation
FailureReason : receives the reason for failure, if any.
UpgradeAllowed : receives a bool indicating whether upgrade is allowed
or not
Return Value:
TRUE if the given install is compliant for installing using the
blade server media, otherwise FALSE
--*/
{
DWORD SuitesToCheck = 0;
switch (CompData->InstallType) {
case COMPLIANCE_INSTALLTYPE_NTSB:
if (CompData->MinimumVersion < 500) {
*UpgradeAllowed = FALSE;
*FailureReason = COMPLIANCEERR_VERSION;
} else {
switch (CompData->InstallVariation) {
case COMPLIANCE_INSTALLVAR_CDRETAIL:
case COMPLIANCE_INSTALLVAR_FLOPPYRETAIL:
case COMPLIANCE_INSTALLVAR_OEM:
case COMPLIANCE_INSTALLVAR_SELECT:
case COMPLIANCE_INSTALLVAR_NFR:
if (IsValidBuild(CompData->BuildNumberNt, This->BuildNumber)) {
*FailureReason = COMPLIANCEERR_NONE;
*UpgradeAllowed = TRUE;
} else {
*FailureReason = COMPLIANCEERR_VERSION;
*UpgradeAllowed = FALSE;
}
break;
default:
*FailureReason = COMPLIANCEERR_UNKNOWNTARGET;
*UpgradeAllowed = FALSE;
break;
}
}
break;
case COMPLIANCE_INSTALLTYPE_NTSE:
SuitesToCheck = (COMPLIANCE_INSTALLSUITE_EMBED);
if (!SUITE_INSTALLED(CompData->InstallSuite, SuitesToCheck)) {
*FailureReason = COMPLIANCEERR_SUITE;
*UpgradeAllowed = FALSE;
} else {
if (CompData->MinimumVersion < 400) {
*FailureReason = COMPLIANCEERR_VERSION;
*UpgradeAllowed = FALSE;
} else {
if (IsValidBuild(CompData->BuildNumberNt, This->BuildNumber)) {
*FailureReason = COMPLIANCEERR_NONE;
*UpgradeAllowed = TRUE;
} else {
*FailureReason = COMPLIANCEERR_VERSION;
*UpgradeAllowed = FALSE;
}
}
}
break;
case COMPLIANCE_INSTALLTYPE_WIN9X:
case COMPLIANCE_INSTALLTYPE_WIN31:
case COMPLIANCE_INSTALLTYPE_NTWP:
case COMPLIANCE_INSTALLTYPE_NTW:
case COMPLIANCE_INSTALLTYPE_NTS:
case COMPLIANCE_INSTALLTYPE_NTSTSE:
case COMPLIANCE_INSTALLTYPE_NTSDTC:
case COMPLIANCE_INSTALLTYPE_NTSBS:
*FailureReason = COMPLIANCEERR_TYPE;
*UpgradeAllowed = FALSE;
break;
default:
*UpgradeAllowed = FALSE;
*FailureReason = COMPLIANCEERR_UNKNOWNTARGET;
break;
}
return (*FailureReason == COMPLIANCEERR_NONE) ? TRUE : FALSE;
}
BOOLEAN
CCFullBladeServerCheck(
IN PCCMEDIA This,
IN PCOMPLIANCE_DATA CompData,
OUT PUINT FailureReason,
OUT PBOOL UpgradeAllowed )
/*++
Routine Description:
This routine checks whether the an installation is compliant with the
blade server full media.
Arguments:
This : server media object pointer
CompData : compliance data describing details for an installation
FailureReason : receives the reason for failure, if any.
UpgradeAllowed : receives a bool indicating whether upgrade is allowed
or not
Return Value:
TRUE if the given install is compliant for installing using the
blade server media, otherwise FALSE
--*/
{
CCBladeServerCheck(This, CompData, FailureReason, UpgradeAllowed);
return (*FailureReason != COMPLIANCEERR_UNKNOWNTARGET) ? TRUE : FALSE;
}
BOOLEAN
CCBladeServerUpgCheck(
IN PCCMEDIA This,
IN PCOMPLIANCE_DATA CompData,
OUT PUINT FailureReason,
OUT PBOOL UpgradeAllowed )
/*++
Routine Description:
This routine checks whether the an installation is compliant with the
blade server upgrade media.
Arguments:
This : server media object pointer
CompData : compliance data describing details for an installation
FailureReason : receives the reason for failure, if any.
UpgradeAllowed : receives a bool indicating whether upgrade is allowed
or not
Return Value:
TRUE if the given install is compliant for installing using the
blade server upgrade media, otherwise FALSE
--*/
{
switch (CompData->InstallVariation) {
case COMPLIANCE_INSTALLVAR_NFR:
case COMPLIANCE_INSTALLVAR_EVAL:
*FailureReason = COMPLIANCEERR_VARIATION;
*UpgradeAllowed = FALSE;
break;
default:
CCBladeServerCheck(This, CompData, FailureReason, UpgradeAllowed);
break;
}
return (*FailureReason == COMPLIANCEERR_NONE) ? TRUE : FALSE;
}
BOOLEAN
CCSmallBusinessServerCheck(
IN PCCMEDIA This,
IN PCOMPLIANCE_DATA CompData,
OUT PUINT FailureReason,
OUT PBOOL UpgradeAllowed )
/*++
Routine Description:
This routine checks whether the an installation is compliant with the
blade server media. Policy is to only allow Whistler SBS to upgrade Win2k Server,
Whistler Server, and SBS 2k.
Arguments:
This : server media object pointer
CompData : compliance data describing details for an installation
FailureReason : receives the reason for failure, if any.
UpgradeAllowed : receives a bool indicating whether upgrade is allowed
or not
Return Value:
TRUE if the given install is compliant for installing using the
blade server media, otherwise FALSE
--*/
{
DWORD SuitesToCheck = 0;
switch (CompData->InstallType) {
case COMPLIANCE_INSTALLTYPE_NTS:
case COMPLIANCE_INSTALLTYPE_NTSBS:
if (CompData->MinimumVersion < 2195) {
*UpgradeAllowed = FALSE;
*FailureReason = COMPLIANCEERR_VERSION;
} else {
*FailureReason = COMPLIANCEERR_NONE;
*UpgradeAllowed = TRUE;
}
break;
case COMPLIANCE_INSTALLTYPE_WIN9X:
case COMPLIANCE_INSTALLTYPE_WIN31:
case COMPLIANCE_INSTALLTYPE_NTWP:
case COMPLIANCE_INSTALLTYPE_NTW:
case COMPLIANCE_INSTALLTYPE_NTSTSE:
case COMPLIANCE_INSTALLTYPE_NTSDTC:
case COMPLIANCE_INSTALLTYPE_NTSB:
*FailureReason = COMPLIANCEERR_TYPE;
*UpgradeAllowed = FALSE;
break;
default:
*UpgradeAllowed = FALSE;
*FailureReason = COMPLIANCEERR_UNKNOWNTARGET;
break;
}
return (*FailureReason == COMPLIANCEERR_NONE) ? TRUE : FALSE;
}
BOOLEAN
CCFullSmallBusinessServerCheck(
IN PCCMEDIA This,
IN PCOMPLIANCE_DATA CompData,
OUT PUINT FailureReason,
OUT PBOOL UpgradeAllowed )
/*++
Routine Description:
This routine checks whether the an installation is compliant with the
blade server full media.
Arguments:
This : server media object pointer
CompData : compliance data describing details for an installation
FailureReason : receives the reason for failure, if any.
UpgradeAllowed : receives a bool indicating whether upgrade is allowed
or not
Return Value:
TRUE if the given install is compliant for installing using the
blade server media, otherwise FALSE
--*/
{
CCSmallBusinessServerCheck(This, CompData, FailureReason, UpgradeAllowed);
return (*FailureReason != COMPLIANCEERR_UNKNOWNTARGET) ? TRUE : FALSE;
}
BOOLEAN
CCSmallBusinessServerUpgCheck(
IN PCCMEDIA This,
IN PCOMPLIANCE_DATA CompData,
OUT PUINT FailureReason,
OUT PBOOL UpgradeAllowed )
/*++
Routine Description:
This routine checks whether the an installation is compliant with the
blade server upgrade media.
Arguments:
This : server media object pointer
CompData : compliance data describing details for an installation
FailureReason : receives the reason for failure, if any.
UpgradeAllowed : receives a bool indicating whether upgrade is allowed
or not
Return Value:
TRUE if the given install is compliant for installing using the
blade server upgrade media, otherwise FALSE
--*/
{
switch (CompData->InstallVariation) {
case COMPLIANCE_INSTALLVAR_NFR:
case COMPLIANCE_INSTALLVAR_EVAL:
*FailureReason = COMPLIANCEERR_VARIATION;
*UpgradeAllowed = FALSE;
break;
default:
CCSmallBusinessServerCheck(This, CompData, FailureReason, UpgradeAllowed);
break;
}
return (*FailureReason == COMPLIANCEERR_NONE) ? TRUE : FALSE;
}
BOOLEAN
CCServerCheck(
IN PCCMEDIA This,
IN PCOMPLIANCE_DATA CompData,
OUT PUINT FailureReason,
OUT PBOOL UpgradeAllowed )
/*++
Routine Description:
This routine checks whether the an installation is compliant with the
server media.
Arguments:
This : server media object pointer
CompData : compliance data describing details for an installation
FailureReason : receives the reason for failure, if any.
UpgradeAllowed : receives a bool indicating whether upgrade is allowed
or not
Return Value:
TRUE if the given install is compliant for installing using the
server media, otherwise FALSE
--*/
{
DWORD SuitesToCheck = 0;
switch (CompData->InstallType) {
case COMPLIANCE_INSTALLTYPE_NTS:
SuitesToCheck = (COMPLIANCE_INSTALLSUITE_ENT |
COMPLIANCE_INSTALLSUITE_SBS |
COMPLIANCE_INSTALLSUITE_SBSR |
COMPLIANCE_INSTALLSUITE_BACK);
if (SUITE_INSTALLED(CompData->InstallSuite, SuitesToCheck)) {
*FailureReason = COMPLIANCEERR_SUITE;
*UpgradeAllowed = FALSE;
} else {
if (CompData->MinimumVersion < 400) {
*FailureReason = COMPLIANCEERR_VERSION;
*UpgradeAllowed = FALSE;
} else {
if (IsValidBuild(CompData->BuildNumberNt, This->BuildNumber)) {
*FailureReason = COMPLIANCEERR_NONE;
*UpgradeAllowed = TRUE;
} else {
*FailureReason = COMPLIANCEERR_VERSION;
*UpgradeAllowed = FALSE;
}
}
}
break;
case COMPLIANCE_INSTALLTYPE_NTSTSE:
if (CompData->BuildNumberNt < 1381) {
*FailureReason = COMPLIANCEERR_SUITE;
*UpgradeAllowed = FALSE;
} else {
*FailureReason = COMPLIANCEERR_NONE;
*UpgradeAllowed = TRUE;
}
break;
case COMPLIANCE_INSTALLTYPE_WIN9X:
case COMPLIANCE_INSTALLTYPE_WIN31:
case COMPLIANCE_INSTALLTYPE_NTWP:
case COMPLIANCE_INSTALLTYPE_NTW:
case COMPLIANCE_INSTALLTYPE_NTSB:
case COMPLIANCE_INSTALLTYPE_NTSE:
case COMPLIANCE_INSTALLTYPE_NTSDTC:
case COMPLIANCE_INSTALLTYPE_NTSBS:
*FailureReason = COMPLIANCEERR_TYPE;
*UpgradeAllowed = FALSE;
break;
default:
*UpgradeAllowed = FALSE;
*FailureReason = COMPLIANCEERR_UNKNOWNTARGET;
break;
}
return (*FailureReason == COMPLIANCEERR_NONE) ? TRUE : FALSE;
}
BOOLEAN
CCFullServerCheck(
IN PCCMEDIA This,
IN PCOMPLIANCE_DATA CompData,
OUT PUINT FailureReason,
OUT PBOOL UpgradeAllowed )
/*++
Routine Description:
This routine checks whether the an installation is compliant with the
server full media.
Arguments:
This : server media object pointer
CompData : compliance data describing details for an installation
FailureReason : receives the reason for failure, if any.
UpgradeAllowed : receives a bool indicating whether upgrade is allowed
or not
Return Value:
TRUE if the given install is compliant for installing using the
server media, otherwise FALSE
--*/
{
CCServerCheck(This, CompData, FailureReason, UpgradeAllowed);
return (*FailureReason != COMPLIANCEERR_UNKNOWNTARGET) ? TRUE : FALSE;
}
BOOLEAN
CCServerUpgCheck(
IN PCCMEDIA This,
IN PCOMPLIANCE_DATA CompData,
OUT PUINT FailureReason,
OUT PBOOL UpgradeAllowed )
/*++
Routine Description:
This routine checks whether the an installation is compliant with the
server upgrade media.
Arguments:
This : server media object pointer
CompData : compliance data describing details for an installation
FailureReason : receives the reason for failure, if any.
UpgradeAllowed : receives a bool indicating whether upgrade is allowed
or not
Return Value:
TRUE if the given install is compliant for installing using the
server upgrade media, otherwise FALSE
--*/
{
switch (CompData->InstallVariation) {
case COMPLIANCE_INSTALLVAR_NFR:
case COMPLIANCE_INSTALLVAR_EVAL:
*FailureReason = COMPLIANCEERR_VARIATION;
*UpgradeAllowed = FALSE;
break;
default:
CCServerCheck(This, CompData, FailureReason, UpgradeAllowed);
break;
}
return (*FailureReason == COMPLIANCEERR_NONE) ? TRUE : FALSE;
}
BOOLEAN
CCAdvancedServerCheck(
IN PCCMEDIA This,
IN PCOMPLIANCE_DATA CompData,
OUT PUINT FailureReason,
OUT PBOOL UpgradeAllowed )
/*++
Routine Description:
This routine checks whether the an installation is compliant with the
advanced server media.
Arguments:
This : advanced server media object pointer
CompData : compliance data describing details for an installation
FailureReason : receives the reason for failure, if any.
UpgradeAllowed : receives a bool indicating whether upgrade is allowed
or not
Return Value:
TRUE if the given install is compliant for installing using the
advanced server media, otherwise FALSE
--*/
{
DWORD SuitesToCheck = 0;
switch (CompData->InstallType) {
case COMPLIANCE_INSTALLTYPE_NTS:
// note: 501 is version 5.1 because of calculation major*100 + minor
if (CompData->MinimumVersion < 501 && CompData->MinimumVersion > 351) {
SuitesToCheck = (COMPLIANCE_INSTALLSUITE_SBS |
COMPLIANCE_INSTALLSUITE_SBSR |
COMPLIANCE_INSTALLSUITE_BACK);
if (SUITE_INSTALLED(CompData->InstallSuite, SuitesToCheck)) {
*FailureReason = COMPLIANCEERR_SUITE;
*UpgradeAllowed = FALSE;
} else {
if (IsValidBuild(CompData->BuildNumberNt, This->BuildNumber)) {
*FailureReason = COMPLIANCEERR_NONE;
*UpgradeAllowed = TRUE;
} else {
*FailureReason = COMPLIANCEERR_VERSION;
*UpgradeAllowed = FALSE;
}
}
} else {
*FailureReason = COMPLIANCEERR_VERSION;
*UpgradeAllowed = FALSE;
}
break;
case COMPLIANCE_INSTALLTYPE_NTSTSE:
if (CompData->BuildNumberNt < 1381) {
*FailureReason = COMPLIANCEERR_SUITE;
*UpgradeAllowed = FALSE;
} else {
*FailureReason = COMPLIANCEERR_NONE;
*UpgradeAllowed = TRUE;
}
break;
case COMPLIANCE_INSTALLTYPE_NTSE:
if (IsValidBuild(CompData->BuildNumberNt, This->BuildNumber)) {
*FailureReason = COMPLIANCEERR_NONE;
*UpgradeAllowed = TRUE;
} else {
*FailureReason = COMPLIANCEERR_VERSION;
*UpgradeAllowed = FALSE;
}
break;
case COMPLIANCE_INSTALLTYPE_WIN9X:
case COMPLIANCE_INSTALLTYPE_WIN31:
case COMPLIANCE_INSTALLTYPE_NTWP:
case COMPLIANCE_INSTALLTYPE_NTW:
case COMPLIANCE_INSTALLTYPE_NTSB:
case COMPLIANCE_INSTALLTYPE_NTSDTC:
case COMPLIANCE_INSTALLTYPE_NTSBS:
*FailureReason = COMPLIANCEERR_TYPE;
*UpgradeAllowed = FALSE;
break;
default:
*UpgradeAllowed = FALSE;
*FailureReason = COMPLIANCEERR_UNKNOWNTARGET;
break;
}
return (*FailureReason == COMPLIANCEERR_NONE) ? TRUE : FALSE;
}
BOOLEAN
CCFullAdvancedServerCheck(
IN PCCMEDIA This,
IN PCOMPLIANCE_DATA CompData,
OUT PUINT FailureReason,
OUT PBOOL UpgradeAllowed )
/*++
Routine Description:
This routine checks whether the an installation is compliant with the
advanced server full media.
Arguments:
This : advanced server media object pointer
CompData : compliance data describing details for an installation
FailureReason : receives the reason for failure, if any.
UpgradeAllowed : receives a bool indicating whether upgrade is allowed
or not
Return Value:
TRUE if the given install is compliant for installing using the
advanced server full media, otherwise FALSE
--*/
{
CCAdvancedServerCheck(This, CompData, FailureReason, UpgradeAllowed);
return (*FailureReason != COMPLIANCEERR_UNKNOWNTARGET) ? TRUE : FALSE;
}
BOOLEAN
CCAdvancedServerUpgCheck(
IN PCCMEDIA This,
IN PCOMPLIANCE_DATA CompData,
OUT PUINT FailureReason,
OUT PBOOL UpgradeAllowed )
/*++
Routine Description:
This routine checks whether the an installation is compliant with the
advanced server upgrade media.
Arguments:
This : advanced server media object pointer
CompData : compliance data describing details for an installation
FailureReason : receives the reason for failure, if any.
UpgradeAllowed : receives a bool indicating whether upgrade is allowed
or not
Return Value:
TRUE if the given install is compliant for installing using the
advanced server upgrade media, otherwise FALSE
--*/
{
DWORD CurrentSuite = 0;
DWORD SuitesToCheck = 0;
switch (CompData->InstallVariation) {
case COMPLIANCE_INSTALLVAR_NFR:
case COMPLIANCE_INSTALLVAR_EVAL:
*FailureReason = COMPLIANCEERR_VARIATION;
*UpgradeAllowed = FALSE;
break;
default:
switch (CompData->InstallType) {
case COMPLIANCE_INSTALLTYPE_NTS:
CurrentSuite = CompData->InstallSuite;
if (SUITE_INSTALLED(CurrentSuite, COMPLIANCE_INSTALLSUITE_ENT)) {
if (IsValidBuild(CompData->BuildNumberNt, This->BuildNumber)) {
*FailureReason = COMPLIANCEERR_NONE;
*UpgradeAllowed = TRUE;
} else {
*FailureReason = COMPLIANCEERR_VERSION;
*UpgradeAllowed = FALSE;
}
} else {
if (SUITE_INSTALLED(CurrentSuite, COMPLIANCE_INSTALLSUITE_NONE)) {
*FailureReason = COMPLIANCEERR_TYPE;
*UpgradeAllowed = FALSE;
} else {
*FailureReason = COMPLIANCEERR_SUITE;
*UpgradeAllowed = FALSE;
}
}
break;
case COMPLIANCE_INSTALLTYPE_NTSTSE:
*FailureReason = COMPLIANCEERR_SUITE;
*UpgradeAllowed = FALSE;
break;
default:
CCAdvancedServerCheck(This, CompData, FailureReason, UpgradeAllowed);
break;
}
break;
}
return (*FailureReason == COMPLIANCEERR_NONE) ? TRUE : FALSE;
}
BOOLEAN
CCDataCenterCheck(
IN PCCMEDIA This,
IN PCOMPLIANCE_DATA CompData,
OUT PUINT FailureReason,
OUT PBOOL UpgradeAllowed )
/*++
Routine Description:
This routine checks whether the an installation is compliant with the
datacenter media.
Arguments:
This : datacenter media object pointer
CompData : compliance data describing details for an installation
FailureReason : receives the reason for failure, if any.
UpgradeAllowed : receives a bool indicating whether upgrade is allowed
or not
Return Value:
TRUE if the given install is compliant for installing using the
datacenter media, otherwise FALSE
--*/
{
DWORD SuitesToCheck = 0;
switch (CompData->InstallType) {
case COMPLIANCE_INSTALLTYPE_NTSDTC:
if (CompData->MinimumVersion < 500) {
*UpgradeAllowed = FALSE;
*FailureReason = COMPLIANCEERR_VERSION;
} else {
switch (CompData->InstallVariation) {
case COMPLIANCE_INSTALLVAR_CDRETAIL:
case COMPLIANCE_INSTALLVAR_FLOPPYRETAIL:
case COMPLIANCE_INSTALLVAR_OEM:
case COMPLIANCE_INSTALLVAR_SELECT:
case COMPLIANCE_INSTALLVAR_NFR:
if (IsValidBuild(CompData->BuildNumberNt, This->BuildNumber)) {
*FailureReason = COMPLIANCEERR_NONE;
*UpgradeAllowed = TRUE;
} else {
*FailureReason = COMPLIANCEERR_VERSION;
*UpgradeAllowed = FALSE;
}
break;
default:
*FailureReason = COMPLIANCEERR_UNKNOWNTARGET;
*UpgradeAllowed = FALSE;
break;
}
}
break;
case COMPLIANCE_INSTALLTYPE_NTS:
case COMPLIANCE_INSTALLTYPE_NTSB:
case COMPLIANCE_INSTALLTYPE_NTSE:
case COMPLIANCE_INSTALLTYPE_NTSTSE:
case COMPLIANCE_INSTALLTYPE_WIN9X:
case COMPLIANCE_INSTALLTYPE_WIN31:
case COMPLIANCE_INSTALLTYPE_NTWP:
case COMPLIANCE_INSTALLTYPE_NTW:
case COMPLIANCE_INSTALLTYPE_NTSBS:
*FailureReason = COMPLIANCEERR_TYPE;
*UpgradeAllowed = FALSE;
break;
default:
*UpgradeAllowed = FALSE;
*FailureReason = COMPLIANCEERR_UNKNOWNTARGET;
break;
}
return (*FailureReason == COMPLIANCEERR_NONE) ? TRUE : FALSE;
}
BOOLEAN
CCFullDataCenterCheck(
IN PCCMEDIA This,
IN PCOMPLIANCE_DATA CompData,
OUT PUINT FailureReason,
OUT PBOOL UpgradeAllowed )
/*++
Routine Description:
This routine checks whether the an installation is compliant with the
datacenter full media.
Arguments:
This : datacenter media object pointer
CompData : compliance data describing details for an installation
FailureReason : receives the reason for failure, if any.
UpgradeAllowed : receives a bool indicating whether upgrade is allowed
or not
Return Value:
TRUE if the given install is compliant for installing using the
datacenter full media, otherwise FALSE
--*/
{
CCDataCenterCheck(This, CompData, FailureReason, UpgradeAllowed);
return (*FailureReason != COMPLIANCEERR_UNKNOWNTARGET) ? TRUE : FALSE;
}
PCCMEDIA
CCMediaCreate(
IN DWORD SourceSKU,
IN DWORD SourceVariation,
IN OPTIONAL DWORD Version,
IN OPTIONAL DWORD BuildNumber )
/*++
Routine Description:
This routine creates a media object and binds the appropriate compliance
checking function to the media object.
Arguments:
SourceSKU : the kind of SKU
SourceVariation : the kind of variation (oem, msdn, retail etc)
Version : the version ((major ver + minor ver) * 100)
BuildNumber : the build number
Return Value:
A new allocated and initialized media object of the appropriate type if
the media type is supported otherwise NULL.
NOTE:
Once you are done with the object, free the media object using CCMemFree()
macro. This function uses factory design pattern.
--*/
{
PCCMEDIA SourceMedia = CCMemAlloc(sizeof(CCMEDIA));
if( !SourceMedia ) {
return SourceMedia;
}
SourceMedia->SourceVariation = SourceVariation;
SourceMedia->Version = Version;
SourceMedia->BuildNumber = BuildNumber;
switch (SourceSKU) {
case COMPLIANCE_SKU_NTWFULL:
SourceMedia->SourceType = COMPLIANCE_INSTALLTYPE_NTW;
SourceMedia->StepUpMedia = FALSE;
SourceMedia->CheckInstall = CCFullProfessionalCheck;
break;
case COMPLIANCE_SKU_NTW32U:
SourceMedia->SourceType = COMPLIANCE_INSTALLTYPE_NTW;
SourceMedia->StepUpMedia = TRUE;
SourceMedia->CheckInstall = CCProfessionalUpgCheck;
break;
case COMPLIANCE_SKU_NTWPFULL:
SourceMedia->SourceType = COMPLIANCE_INSTALLTYPE_NTWP;
SourceMedia->StepUpMedia = FALSE;
SourceMedia->CheckInstall = CCFullPersonalCheck;
break;
case COMPLIANCE_SKU_NTWPU:
SourceMedia->SourceType = COMPLIANCE_INSTALLTYPE_NTWP;
SourceMedia->StepUpMedia = TRUE;
SourceMedia->CheckInstall = CCPersonalUpgCheck;
break;
case COMPLIANCE_SKU_NTSB:
SourceMedia->SourceType = COMPLIANCE_INSTALLTYPE_NTSB;
SourceMedia->StepUpMedia = FALSE;
SourceMedia->CheckInstall = CCFullBladeServerCheck;
break;
case COMPLIANCE_SKU_NTSBU:
SourceMedia->SourceType = COMPLIANCE_INSTALLTYPE_NTSB;
SourceMedia->StepUpMedia = TRUE;
SourceMedia->CheckInstall = CCBladeServerUpgCheck;
break;
case COMPLIANCE_SKU_NTSBS:
SourceMedia->SourceType = COMPLIANCE_INSTALLTYPE_NTSBS;
SourceMedia->StepUpMedia = FALSE;
SourceMedia->CheckInstall = CCFullSmallBusinessServerCheck;
break;
case COMPLIANCE_SKU_NTSBSU:
SourceMedia->SourceType = COMPLIANCE_INSTALLTYPE_NTSBS;
SourceMedia->StepUpMedia = TRUE;
SourceMedia->CheckInstall = CCSmallBusinessServerUpgCheck;
break;
case COMPLIANCE_SKU_NTSFULL:
SourceMedia->SourceType = COMPLIANCE_INSTALLTYPE_NTS;
SourceMedia->StepUpMedia = FALSE;
SourceMedia->CheckInstall = CCFullServerCheck;
break;
case COMPLIANCE_SKU_NTSU:
SourceMedia->SourceType = COMPLIANCE_INSTALLTYPE_NTS;
SourceMedia->StepUpMedia = TRUE;
SourceMedia->CheckInstall = CCServerUpgCheck;
break;
case COMPLIANCE_SKU_NTSEFULL:
SourceMedia->SourceType = COMPLIANCE_INSTALLTYPE_NTSE;
SourceMedia->StepUpMedia = FALSE;
SourceMedia->CheckInstall = CCFullAdvancedServerCheck;
break;
case COMPLIANCE_SKU_NTSEU:
SourceMedia->SourceType = COMPLIANCE_INSTALLTYPE_NTSE;
SourceMedia->StepUpMedia = TRUE;
SourceMedia->CheckInstall = CCAdvancedServerUpgCheck;
break;
case COMPLIANCE_SKU_NTSDTC:
SourceMedia->SourceType = COMPLIANCE_INSTALLTYPE_NTSDTC;
SourceMedia->StepUpMedia = FALSE;
SourceMedia->CheckInstall = CCFullDataCenterCheck;
break;
default:
CCMemFree(SourceMedia);
SourceMedia = 0;
break;
}
return SourceMedia;
}
BOOLEAN
CCMediaInitialize(
OUT PCCMEDIA DestMedia,
IN DWORD Type,
IN DWORD Variation,
IN BOOLEAN StepupMedia,
IN OPTIONAL DWORD Version,
IN OPTIONAL DWORD BuildNumber)
/*++
Routine Description:
The routine initializes a CCMEDIA structure with the given values
particularly the binding of "CheckInstall" method based on "Type"
and "StepupMedia".
Arguments:
DestMedia - The media object which needs to be initialized
Type - The type of media object (eg. COMPLIANCE_INSTALLTYPE_NTS)
Variation - The variation of the media object (eg. COMPLIANCE_INSTALLVAR_CDRETAIL)
StepupMedia - TRUE if the media is a stepup media or FALSE otherwise
Version - Optional OS Version (major * 100 + minor)
BuildNumber - Optinal Build number of OS (eg. 2172)
Return Value:
TRUE if the given media object could be initialized otherwise FALSE.
--*/
{
BOOLEAN Result = FALSE;
if (DestMedia) {
Result = TRUE;
DestMedia->SourceType = Type;
DestMedia->SourceVariation = Variation;
DestMedia->StepUpMedia = StepupMedia;
DestMedia->Version = Version;
DestMedia->BuildNumber = BuildNumber;
DestMedia->CheckInstall = 0;
switch (Type) {
case COMPLIANCE_INSTALLTYPE_NTW:
DestMedia->CheckInstall = StepupMedia ?
CCProfessionalUpgCheck : CCFullProfessionalCheck;
break;
case COMPLIANCE_INSTALLTYPE_NTWP:
DestMedia->CheckInstall = StepupMedia ?
CCPersonalUpgCheck : CCFullPersonalCheck;
break;
case COMPLIANCE_INSTALLTYPE_NTSB:
DestMedia->CheckInstall = StepupMedia ?
CCBladeServerUpgCheck : CCFullBladeServerCheck;
break;
case COMPLIANCE_INSTALLTYPE_NTS:
DestMedia->CheckInstall = StepupMedia ?
CCServerUpgCheck : CCFullServerCheck;
break;
case COMPLIANCE_INSTALLTYPE_NTSE:
DestMedia->CheckInstall = StepupMedia ?
CCAdvancedServerUpgCheck : CCFullAdvancedServerCheck;
break;
case COMPLIANCE_INSTALLTYPE_NTSDTC:
if (!StepupMedia) {
DestMedia->CheckInstall = CCFullDataCenterCheck;
} else {
Result = FALSE;
}
break;
default:
assert(FALSE);
Result = FALSE;
break;
}
}
return Result;
}