Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

2941 lines
84 KiB

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
sgmqueue.c
Abstract:
Parses the v1 script, builds rules and queues enumeration callbacks.
Author:
Jim Schmidt (jimschm) 12-Mar-2000
Revision History:
<alias> <date> <comments>
--*/
//
// Includes
//
#include "pch.h"
#include "v2app.h"
#include "v1p.h"
#define DBG_SCRIPT "Script"
//
// Strings
//
// None
//
// Constants
//
// none
//
// Macros
//
// None
//
// Types
//
// None
//
// Globals
//
MIG_OPERATIONID g_RenameFileExOp;
MIG_OPERATIONID g_RenameFileOp;
MIG_OPERATIONID g_RenameExOp;
MIG_OPERATIONID g_RenameOp;
BOOL g_VcmMode;
BOOL g_PreParse;
//
// Macro expansion list
//
// None
//
// Private function prototypes
//
VCMPARSE ScriptVcmParse;
VCMQUEUEENUMERATION ScriptVcmQueueEnumeration;
SGMPARSE ScriptSgmParse;
SGMQUEUEENUMERATION ScriptSgmQueueEnumeration;
BOOL
pSelectFilesAndFolders (
VOID
);
BOOL
pParseAllInfs (
IN BOOL PreParse
);
//
// Macro expansion definition
//
// None
//
// Code
//
BOOL
pCommonQueueEnumeration (
IN BOOL PreParse
)
{
MIG_OBJECTSTRINGHANDLE objectHandle;
ACTION_STRUCT actionStruct;
BOOL b = FALSE;
//
// INF-based inclusion/exclusion mechanism. We are called first to pre-parse
// the INF (to allow the UI to alter the results). Then we are called to
// queue the enumeration.
//
if (PreParse) {
g_RenameFileExOp = IsmRegisterOperation (S_OPERATION_V1_FILEMOVEEX, TRUE);
g_RenameFileOp = IsmRegisterOperation (S_OPERATION_V1_FILEMOVE, TRUE);
g_RenameOp = IsmRegisterOperation (S_OPERATION_MOVE, FALSE);
g_DefaultIconOp = IsmRegisterOperation (S_OPERATION_DEFICON_FIXCONTENT, FALSE);
g_DefaultIconData = IsmRegisterProperty (S_V1PROP_ICONDATA, FALSE);
g_FileCollPatternData = IsmRegisterProperty (S_V1PROP_FILECOLLPATTERN, FALSE);
g_RenameExOp = IsmRegisterOperation (S_OPERATION_ENHANCED_MOVE, FALSE);
g_RegAutoFilterOp = IsmRegisterOperation (S_OPERATION_REG_AUTO_FILTER, FALSE);
return pParseAllInfs (TRUE);
}
//
// Now queue enumeration
//
MYASSERT (g_RenameFileExOp);
MYASSERT (g_RenameFileOp);
MYASSERT (g_RenameOp);
MYASSERT (g_RegAutoFilterOp);
//
// From the sgm point of view, the v1 tool supports the following:
//
// - Optional transfer of the entire HKCU
// - Optional transfer of the entire HKLM
// - Optional transfer of all files except for OS files
// - INF-based inclusion/exclusion mechanism
// - Specialized migration of certain settings (RAS, printers)
//
// This SGM implements this functionality set.
//
__try {
//
// Component-based inclusion mechanism
//
if (!pSelectFilesAndFolders ()) {
__leave;
}
//
// INF-based inclusion/exclusion mechanism
//
if (!pParseAllInfs (FALSE)) {
__leave;
}
//
// If the /u was specified at the command line we want to suck and apply all HKR
// like if we had a rule in the script: AddReg=HKR\*
//
if (IsmIsEnvironmentFlagSet (IsmGetRealPlatform(), NULL, S_ENV_HKCU_V1)) {
ZeroMemory (&actionStruct, sizeof (ACTION_STRUCT));
objectHandle = TurnRegStringIntoHandle (TEXT("HKCU\\*"), TRUE, NULL);
MYASSERT (objectHandle);
actionStruct.ObjectBase = TurnRegStringIntoHandle (TEXT("HKCU\\*"), FALSE, NULL);
MYASSERT (actionStruct.ObjectBase);
//
// Add this rule
//
if (AddRule (
g_RegType,
actionStruct.ObjectBase,
objectHandle,
ACTIONGROUP_INCLUDE,
ACTION_PERSIST,
&actionStruct
)) {
AddRuleEx (
g_RegType,
actionStruct.ObjectBase,
objectHandle,
ACTIONGROUP_DEFAULTPRIORITY,
ACTION_PRIORITYDEST,
NULL,
RULEGROUP_PRIORITY
);
IsmHookEnumeration (
g_RegType,
objectHandle,
ObjectPriority,
0,
NULL
);
//
// Queue enumeration for include patterns
//
IsmQueueEnumeration (
g_RegType,
objectHandle,
g_VcmMode ? GatherVirtualComputer : PrepareActions,
0,
NULL
);
}
IsmDestroyObjectHandle (objectHandle);
}
b = TRUE;
}
__finally {
}
return b;
}
VOID
QueueAllFiles (
VOID
)
{
static BOOL done = FALSE;
MIG_OBJECTSTRINGHANDLE objectHandle;
MIG_SEGMENTS nodeSeg[2];
if (done) {
return;
}
done = TRUE;
nodeSeg[0].Segment = TEXT("*");
nodeSeg[0].IsPattern = TRUE ;
objectHandle = IsmCreateObjectPattern (nodeSeg, 1, ALL_PATTERN, 0);
IsmQueueEnumeration (g_FileType, objectHandle, NulCallback, 0, NULL);
IsmDestroyObjectHandle (objectHandle);
}
VOID
pQueueAllReg (
VOID
)
{
static BOOL done = FALSE;
MIG_OBJECTSTRINGHANDLE objectHandle;
MIG_SEGMENTS nodeSeg[2];
MIG_PLATFORMTYPEID platform = IsmGetRealPlatform();
if (done) {
return;
}
done = TRUE;
//
// Optional transfer of entire HKCU
//
if (IsmIsEnvironmentFlagSet (platform, NULL, S_ENV_HKCU_ON)) {
nodeSeg[0].Segment = TEXT("HKCU\\");
nodeSeg[0].IsPattern = FALSE;
nodeSeg[1].Segment = TEXT("*");
nodeSeg[1].IsPattern = TRUE;
objectHandle = IsmCreateObjectPattern (nodeSeg, 2, ALL_PATTERN, 0);
IsmQueueEnumeration (g_RegType, objectHandle, NulCallback, 0, NULL);
IsmDestroyObjectHandle (objectHandle);
}
//
// Optional transfer of entire HKLM
//
if (IsmIsEnvironmentFlagSet (platform, NULL, S_ENV_HKLM_ON)) {
nodeSeg[0].Segment = TEXT("HKLM\\");
nodeSeg[0].IsPattern = FALSE;
nodeSeg[1].Segment = TEXT("*");
nodeSeg[1].IsPattern = TRUE;
objectHandle = IsmCreateObjectPattern (nodeSeg, 2, ALL_PATTERN, 0);
IsmQueueEnumeration (g_RegType, objectHandle, NulCallback, 0, NULL);
IsmDestroyObjectHandle (objectHandle);
}
}
BOOL
WINAPI
ScriptSgmParse (
IN PVOID Reserved
)
{
return pCommonQueueEnumeration (TRUE);
}
BOOL
WINAPI
ScriptSgmQueueEnumeration (
IN PVOID Reserved
)
{
BOOL result;
result = pCommonQueueEnumeration (FALSE);
OEAddComplexRules();
return result;
}
BOOL
WINAPI
ScriptVcmParse (
IN PVOID Reserved
)
{
g_VcmMode = TRUE;
return pCommonQueueEnumeration (TRUE);
}
BOOL
WINAPI
ScriptVcmQueueEnumeration (
IN PVOID Reserved
)
{
g_VcmMode = TRUE;
return pCommonQueueEnumeration (FALSE);
}
PCTSTR
pFixDestination (
IN PCTSTR Source,
IN PCTSTR Destination
)
{
PTSTR result = (PTSTR)Source;
PTSTR tempPtr;
PTSTR sKey;
PTSTR sSubKey;
PTSTR sValueName;
PTSTR dKey;
PTSTR dSubKey;
PTSTR dValueName;
UINT size;
BOOL sTree = FALSE;
sKey = DuplicatePathString (Source, 0);
sValueName = _tcschr (sKey, TEXT('['));
if (sValueName) {
tempPtr = _tcschr (sValueName, TEXT(']'));
if (tempPtr) {
*tempPtr = 0;
}
tempPtr = sValueName;
sValueName = _tcsinc (sValueName);
*tempPtr = 0;
tempPtr = _tcsdec2 (sKey, tempPtr);
if (tempPtr) {
if (_tcsnextc (tempPtr) == TEXT('\\')) {
*tempPtr = 0;
}
if (_tcsnextc (tempPtr) == TEXT(' ')) {
*tempPtr = 0;
}
}
}
sSubKey = _tcsrchr (sKey, TEXT('\\'));
if (sSubKey) {
tempPtr = _tcsinc (sSubKey);
if (_tcsnextc (tempPtr) == TEXT('*')) {
*sSubKey = 0;
sTree = TRUE;
}
}
sSubKey = _tcsrchr (sKey, TEXT('\\'));
if (sSubKey) {
tempPtr = sSubKey;
sSubKey = _tcsinc (sSubKey);
*tempPtr = 0;
}
dKey = DuplicatePathString (Destination, 0);
dValueName = _tcschr (dKey, TEXT('['));
if (dValueName) {
tempPtr = _tcschr (dValueName, TEXT(']'));
if (tempPtr) {
*tempPtr = 0;
}
tempPtr = dValueName;
dValueName = _tcsinc (dValueName);
*tempPtr = 0;
tempPtr = _tcsdec2 (dKey, tempPtr);
if (tempPtr) {
if (_tcsnextc (tempPtr) == TEXT('\\')) {
*tempPtr = 0;
}
if (_tcsnextc (tempPtr) == TEXT(' ')) {
*tempPtr = 0;
}
}
}
dSubKey = _tcsrchr (dKey, TEXT('\\'));
if (dSubKey) {
tempPtr = _tcsinc (dSubKey);
if (_tcsnextc (tempPtr) == TEXT('*')) {
*dSubKey = 0;
}
}
dSubKey = _tcsrchr (dKey, TEXT('\\'));
if (dSubKey) {
tempPtr = dSubKey;
dSubKey = _tcsinc (dSubKey);
*tempPtr = 0;
}
if (!dSubKey) {
dSubKey = dKey;
dKey = NULL;
}
size = 0;
if (dKey && *dKey) {
size += TcharCount (dKey) + 1;
} else if (sKey && *sKey) {
size += TcharCount (sKey) + 1;
}
if (dSubKey && *dSubKey) {
size += TcharCount (dSubKey) + 1;
} else if (sSubKey && *sSubKey) {
size += TcharCount (sSubKey) + 1;
}
if (dValueName && *dValueName) {
size += TcharCount (dValueName) + ARRAYSIZE(TEXT(" []")) - 1;
} else if (sValueName && *sValueName) {
size += TcharCount (sValueName) + ARRAYSIZE(TEXT(" []")) - 1;
}
if (sTree) {
size += ARRAYSIZE(TEXT("\\*")) - 1;
}
size += 1;
result = AllocPathString (size);
*result = 0;
if (dKey && *dKey) {
StringCat (result, dKey);
} else if (sKey && *sKey) {
StringCat (result, sKey);
}
if (dSubKey && *dSubKey) {
StringCat (result, TEXT("\\"));
StringCat (result, dSubKey);
} else if (sSubKey && *sSubKey) {
StringCat (result, TEXT("\\"));
StringCat (result, sSubKey);
}
if (sTree) {
StringCat (result, TEXT("\\*"));
}
if (dValueName && *dValueName) {
StringCat (result, TEXT(" ["));
StringCat (result, dValueName);
StringCat (result, TEXT("]"));
} else if (sValueName && *sValueName) {
StringCat (result, TEXT(" ["));
StringCat (result, sValueName);
StringCat (result, TEXT("]"));
}
if (sKey) {
FreePathString (sKey);
}
if (dKey) {
FreePathString (dKey);
} else if (dSubKey) {
FreePathString (dSubKey);
}
return result;
}
BOOL
pParseRegEx1 (
IN HINF Inf,
IN PCTSTR Section,
IN ACTIONGROUP ActionGroup,
IN DWORD ActionFlags,
IN PCTSTR Application OPTIONAL
)
{
// This function handles RenregEx and RegFileEx rules only
INFSTRUCT is = INITINFSTRUCT_PMHANDLE;
PTSTR srcNode;
PTSTR srcLeaf;
PTSTR destNode;
PTSTR destLeaf;
BOOL result = FALSE;
MIG_OBJECTSTRINGHANDLE srcPattern = NULL;
MIG_OBJECTSTRINGHANDLE destPattern = NULL;
MIG_OBJECTSTRINGHANDLE objectBase = NULL;
ACTION_STRUCT actionStruct;
PCTSTR filesDest;
PCTSTR newDest = NULL;
if (InfFindFirstLine (Inf, Section, NULL, &is)) {
do {
if (IsmCheckCancel()) {
break;
}
__try {
ZeroMemory (&actionStruct, sizeof (ACTION_STRUCT));
srcNode = InfGetStringField (&is, 1);
srcLeaf = InfGetStringField (&is, 2);
if (!srcNode && !srcLeaf) {
LOG ((LOG_WARNING, (PCSTR) MSG_EMPTY_RENREGEX));
__leave;
}
srcPattern = CreatePatternFromNodeLeaf (srcNode, srcLeaf);
if (!srcPattern) {
__leave;
}
actionStruct.ObjectBase = srcPattern;
objectBase = MakeRegExBase (srcNode, srcLeaf);
destNode = InfGetStringField (&is, 3);
destLeaf = InfGetStringField (&is, 4);
destPattern = CreatePatternFromNodeLeaf (destNode, destLeaf);
if (destPattern) {
actionStruct.ObjectDest = destPattern;
} else {
LOG ((
LOG_ERROR,
(PCSTR) MSG_REG_SPEC_BAD_DEST,
srcNode ? srcNode : TEXT(""),
srcLeaf ? srcLeaf : TEXT(""),
destNode ? destNode : TEXT(""),
destLeaf ? destLeaf : TEXT("")
));
__leave;
}
if (ActionGroup == ACTIONGROUP_REGFILEEX &&
ActionFlags & ACTION_PERSIST_PATH_IN_DATA) {
filesDest = InfGetStringField (&is, 5);
if (filesDest && *filesDest) {
newDest = SanitizePath (filesDest);
if (newDest) {
actionStruct.AddnlDest = TurnFileStringIntoHandle (
newDest,
PFF_COMPUTE_BASE|
PFF_NO_SUBDIR_PATTERN|
PFF_NO_PATTERNS_ALLOWED|
PFF_NO_LEAF_AT_ALL
);
FreePathString (newDest);
newDest = NULL;
}
if (!actionStruct.AddnlDest) {
LOG ((LOG_ERROR, (PCSTR) MSG_FILE_SPEC_BAD_DEST, filesDest));
}
}
actionStruct.ObjectHint = InfGetStringField (&is, 6);
if (actionStruct.ObjectHint && !(*actionStruct.ObjectHint)) {
actionStruct.ObjectHint = NULL;
}
}
if (!AddRule (
g_RegType,
objectBase,
srcPattern,
ACTIONGROUP_RENAMEEX,
ActionFlags,
&actionStruct
)) {
DEBUGMSG ((DBG_ERROR, "Error processing registry rules"));
__leave;
}
AddRuleEx (
g_RegType,
objectBase,
srcPattern,
ACTIONGROUP_DEFAULTPRIORITY,
ACTION_PRIORITYSRC,
NULL,
RULEGROUP_PRIORITY
);
IsmHookEnumeration (
g_RegType,
srcPattern,
ObjectPriority,
0,
NULL
);
if (IsmIsObjectHandleLeafOnly (srcPattern)) {
pQueueAllReg();
IsmHookEnumeration (
g_RegType,
srcPattern,
g_VcmMode ? GatherVirtualComputer : PrepareActions,
0,
NULL
);
} else {
if (actionStruct.ObjectBase) {
IsmQueueEnumeration (
g_RegType,
actionStruct.ObjectBase,
g_VcmMode ? GatherVirtualComputer : PrepareActions,
0,
NULL
);
}
IsmQueueEnumeration (
g_RegType,
srcPattern,
g_VcmMode ? GatherVirtualComputer : PrepareActions,
0,
NULL
);
}
}
__finally {
if (objectBase) {
IsmDestroyObjectHandle (objectBase);
objectBase = NULL;
}
if (srcPattern) {
IsmDestroyObjectHandle (srcPattern);
srcPattern = NULL;
}
if (destPattern) {
IsmDestroyObjectHandle (destPattern);
destPattern = NULL;
}
}
} while (InfFindNextLine (&is));
result = !IsmCheckCancel();
} else {
LOG ((LOG_ERROR, (PCSTR) MSG_EMPTY_OR_MISSING_SECTION, Section));
}
InfCleanUpInfStruct (&is);
return result;
}
BOOL
pParseRegEx (
IN HINF Inf,
IN PCTSTR Section,
IN ACTIONGROUP ActionGroup,
IN DWORD ActionFlags,
IN PCTSTR Application OPTIONAL
)
{
INFSTRUCT is = INITINFSTRUCT_PMHANDLE;
PCTSTR srcNode;
PCTSTR srcLeaf;
MIG_OBJECTSTRINGHANDLE srcHandle = NULL;
PCTSTR destNode;
PCTSTR destLeaf;
PCTSTR filesDest;
PCTSTR newDest = NULL;
ACTION_STRUCT actionStruct;
BOOL result = FALSE;
if (InfFindFirstLine (Inf, Section, NULL, &is)) {
do {
if (IsmCheckCancel()) {
break;
}
__try {
ZeroMemory (&actionStruct, sizeof (ACTION_STRUCT));
srcNode = InfGetStringField (&is, 1);
srcLeaf = InfGetStringField (&is, 2);
if (!srcNode && !srcLeaf) {
LOG ((LOG_ERROR, (PCSTR) MSG_EMPTY_RENREGEX));
__leave;
}
// Validate rule
if (!StringIMatchTcharCount (srcNode, S_HKLM, ARRAYSIZE(S_HKLM) - 1) &&
!StringIMatchTcharCount (srcNode, S_HKR, ARRAYSIZE(S_HKR) - 1) &&
!StringIMatchTcharCount (srcNode, S_HKCC, ARRAYSIZE(S_HKCC) - 1)
) {
LOG ((LOG_ERROR, (PCSTR) MSG_INVALID_REGROOT, srcNode));
__leave;
}
srcHandle = CreatePatternFromNodeLeaf (srcNode, srcLeaf);
if (!srcHandle) {
LOG ((LOG_ERROR, (PCSTR) MSG_REG_SPEC_BAD, srcNode));
__leave;
}
actionStruct.ObjectBase = MakeRegExBase (srcNode, srcLeaf);
if (!actionStruct.ObjectBase) {
LOG ((LOG_ERROR, (PCSTR) MSG_REG_SPEC_BAD, srcNode));
__leave;
}
if (ActionGroup == ACTIONGROUP_RENAMEEX) {
destNode = InfGetStringField (&is, 3);
destLeaf = InfGetStringField (&is, 4);
if (!destNode && !destLeaf) {
LOG ((LOG_ERROR, (PCSTR) MSG_REG_SPEC_MISSING_DEST, srcNode));
__leave;
}
actionStruct.ObjectDest = CreatePatternFromNodeLeaf (destNode, destLeaf);
if (!actionStruct.ObjectDest) {
LOG ((LOG_ERROR, (PCSTR) MSG_REG_SPEC_BAD_DEST, destNode));
__leave;
}
}
if (ActionGroup == ACTIONGROUP_REGFILEEX ||
ActionGroup == ACTIONGROUP_REGFOLDEREX ||
ActionGroup == ACTIONGROUP_REGICONEX
) {
destNode = InfGetStringField (&is, 3);
destLeaf = InfGetStringField (&is, 4);
if (destNode && destLeaf &&
*destNode && *destLeaf) {
actionStruct.ObjectDest = CreatePatternFromNodeLeaf (destNode, destLeaf);
if (!actionStruct.ObjectDest) {
LOG ((LOG_ERROR, (PCSTR) MSG_REG_SPEC_BAD_DEST, destNode));
__leave;
}
}
}
if ((ActionGroup == ACTIONGROUP_REGFILEEX ||
ActionGroup == ACTIONGROUP_REGFOLDEREX ||
ActionGroup == ACTIONGROUP_REGICONEX
) &&
((ActionFlags & ACTION_PERSIST_PATH_IN_DATA) ||
(ActionFlags & ACTION_PERSIST_ICON_IN_DATA)
)
) {
filesDest = InfGetStringField (&is, 5);
if (filesDest && *filesDest) {
newDest = SanitizePath (filesDest);
if (newDest) {
actionStruct.AddnlDest = TurnFileStringIntoHandle (
newDest,
PFF_COMPUTE_BASE|
PFF_NO_SUBDIR_PATTERN|
PFF_NO_PATTERNS_ALLOWED|
PFF_NO_LEAF_AT_ALL
);
FreePathString (newDest);
newDest = NULL;
}
if (!actionStruct.AddnlDest) {
LOG ((LOG_ERROR, (PCSTR) MSG_FILE_SPEC_BAD_DEST, filesDest));
}
}
actionStruct.ObjectHint = InfGetStringField (&is, 6);
if (actionStruct.ObjectHint && !(*actionStruct.ObjectHint)) {
actionStruct.ObjectHint = NULL;
}
}
//
// Add this rule
//
if (!AddRule (
g_RegType,
actionStruct.ObjectBase,
srcHandle,
ActionGroup,
ActionFlags,
&actionStruct
)) {
DEBUGMSG ((DBG_ERROR, "Error processing registry rules for %s", srcNode));
}
AddRuleEx (
g_RegType,
actionStruct.ObjectBase,
srcHandle,
ACTIONGROUP_DEFAULTPRIORITY,
ACTION_PRIORITYSRC,
NULL,
RULEGROUP_PRIORITY
);
IsmHookEnumeration (
g_RegType,
srcHandle,
ObjectPriority,
0,
NULL
);
//
// Queue enumeration for include patterns
//
if ((ActionGroup == ACTIONGROUP_INCLUDEEX) ||
(ActionGroup == ACTIONGROUP_RENAMEEX) ||
(ActionGroup == ACTIONGROUP_REGFILEEX) ||
(ActionGroup == ACTIONGROUP_REGFOLDEREX) ||
(ActionGroup == ACTIONGROUP_REGICONEX)
) {
if (IsmIsObjectHandleLeafOnly (srcHandle)) {
pQueueAllReg();
IsmHookEnumeration (
g_RegType,
srcHandle,
g_VcmMode ? GatherVirtualComputer : PrepareActions,
0,
NULL
);
} else {
IsmQueueEnumeration (
g_RegType,
srcHandle,
g_VcmMode ? GatherVirtualComputer : PrepareActions,
0,
NULL
);
}
}
if (ActionGroup == ACTIONGROUP_DELREGKEY) {
IsmHookEnumeration (g_RegType, srcHandle, ExcludeKeyIfValueExists, 0, NULL);
IsmRegisterTypePostEnumerationCallback (g_RegType, PostDelregKeyCallback, NULL);
}
}
__finally {
IsmDestroyObjectHandle (srcHandle);
srcHandle = NULL;
IsmDestroyObjectHandle (actionStruct.ObjectBase);
actionStruct.ObjectBase = NULL;
IsmDestroyObjectHandle (actionStruct.ObjectDest);
actionStruct.ObjectDest = NULL;
IsmDestroyObjectHandle (actionStruct.AddnlDest);
actionStruct.AddnlDest = NULL;
}
} while (InfFindNextLine (&is));
result = !IsmCheckCancel();
} else {
LOG ((LOG_ERROR, (PCSTR) MSG_EMPTY_OR_MISSING_SECTION, Section));
}
InfCleanUpInfStruct (&is);
return result;
}
BOOL
pParseReg (
IN HINF Inf,
IN PCTSTR Section,
IN ACTIONGROUP ActionGroup,
IN DWORD ActionFlags,
IN BOOL FixDestination,
IN PCTSTR Application OPTIONAL
)
{
INFSTRUCT is = INITINFSTRUCT_PMHANDLE;
PCTSTR pattern;
MIG_OBJECTSTRINGHANDLE srcHandle = NULL;
PCTSTR destination;
PCTSTR newDestination;
PCTSTR filesDest;
PCTSTR newDest = NULL;
ACTION_STRUCT actionStruct;
BOOL hadLeaf = FALSE;
BOOL result = FALSE;
if (InfFindFirstLine (Inf, Section, NULL, &is)) {
do {
if (IsmCheckCancel()) {
break;
}
__try {
ZeroMemory (&actionStruct, sizeof (ACTION_STRUCT));
srcHandle = NULL;
pattern = InfGetStringField (&is, 0);
if (!pattern) {
pattern = InfGetStringField (&is, 1);
if (!pattern) {
LOG ((LOG_WARNING, (PCSTR) MSG_EMPTY_RENREG));
__leave;
}
}
// Validate rule
if (!StringIMatchTcharCount (pattern, S_HKLM, ARRAYSIZE(S_HKLM) - 1) &&
!StringIMatchTcharCount (pattern, S_HKR, ARRAYSIZE(S_HKR) - 1) &&
!StringIMatchTcharCount (pattern, S_HKCC, ARRAYSIZE(S_HKCC) - 1)
) {
LOG ((LOG_ERROR, (PCSTR) MSG_INVALID_REGROOT, pattern));
__leave;
}
srcHandle = TurnRegStringIntoHandle (pattern, TRUE, &hadLeaf);
if (!srcHandle) {
LOG ((LOG_ERROR, (PCSTR) MSG_REG_SPEC_BAD, pattern));
__leave;
}
actionStruct.ObjectBase = TurnRegStringIntoHandle (pattern, FALSE, NULL);
if (!actionStruct.ObjectBase) {
LOG ((LOG_ERROR, (PCSTR) MSG_REG_SPEC_BAD, pattern));
__leave;
}
if (ActionGroup == ACTIONGROUP_RENAME) {
destination = InfGetStringField (&is, 1);
if (destination && *destination) {
if (FixDestination) {
newDestination = pFixDestination (pattern, destination);
} else {
newDestination = destination;
}
actionStruct.ObjectDest = TurnRegStringIntoHandle (newDestination, FALSE, NULL);
if (newDestination != destination) {
FreePathString (newDestination);
}
if (!actionStruct.ObjectDest) {
LOG ((LOG_ERROR, (PCSTR) MSG_REG_SPEC_BAD_DEST, destination));
__leave;
}
} else {
LOG ((LOG_ERROR, (PCSTR) MSG_REG_SPEC_MISSING_DEST, pattern));
__leave;
}
}
if (ActionGroup == ACTIONGROUP_REGFILE ||
ActionGroup == ACTIONGROUP_REGFOLDER ||
ActionGroup == ACTIONGROUP_REGICON
) {
destination = InfGetStringField (&is, 1);
if (destination && *destination) {
if (FixDestination) {
newDestination = pFixDestination (pattern, destination);
} else {
newDestination = destination;
}
actionStruct.ObjectDest = TurnRegStringIntoHandle (newDestination, FALSE, NULL);
if (newDestination != destination) {
FreePathString (newDestination);
}
if (!actionStruct.ObjectDest) {
LOG ((LOG_ERROR, (PCSTR) MSG_REG_SPEC_BAD_DEST, destination));
__leave;
}
}
}
if ((ActionGroup == ACTIONGROUP_REGFILE ||
ActionGroup == ACTIONGROUP_REGFOLDER ||
ActionGroup == ACTIONGROUP_REGICON
) &&
((ActionFlags & ACTION_PERSIST_PATH_IN_DATA) ||
(ActionFlags & ACTION_PERSIST_ICON_IN_DATA)
)
) {
filesDest = InfGetStringField (&is, 2);
if (filesDest && *filesDest) {
newDest = SanitizePath (filesDest);
if (newDest) {
actionStruct.AddnlDest = TurnFileStringIntoHandle (
newDest,
PFF_COMPUTE_BASE|
PFF_NO_SUBDIR_PATTERN|
PFF_NO_PATTERNS_ALLOWED|
PFF_NO_LEAF_AT_ALL
);
FreePathString (newDest);
newDest = NULL;
}
if (!actionStruct.AddnlDest) {
LOG ((LOG_ERROR, (PCSTR) MSG_FILE_SPEC_BAD_DEST, filesDest));
}
}
actionStruct.ObjectHint = InfGetStringField (&is, 3);
if (actionStruct.ObjectHint && !(*actionStruct.ObjectHint)) {
actionStruct.ObjectHint = NULL;
}
}
//
// Add this rule
//
if (!AddRule (
g_RegType,
actionStruct.ObjectBase,
srcHandle,
ActionGroup,
ActionFlags,
&actionStruct
)) {
DEBUGMSG ((DBG_ERROR, "Error processing registry rules for %s", pattern));
}
AddRuleEx (
g_RegType,
actionStruct.ObjectBase,
srcHandle,
ACTIONGROUP_DEFAULTPRIORITY,
ACTION_PRIORITYSRC,
NULL,
RULEGROUP_PRIORITY
);
IsmHookEnumeration (
g_RegType,
srcHandle,
ObjectPriority,
0,
NULL
);
//
// Queue enumeration for include patterns
//
if ((ActionGroup == ACTIONGROUP_INCLUDE) ||
(ActionGroup == ACTIONGROUP_RENAME) ||
(ActionGroup == ACTIONGROUP_REGFILE) ||
(ActionGroup == ACTIONGROUP_REGFOLDER) ||
(ActionGroup == ACTIONGROUP_REGICON)
) {
if (IsmIsObjectHandleLeafOnly (srcHandle)) {
pQueueAllReg();
IsmHookEnumeration (
g_RegType,
srcHandle,
g_VcmMode ? GatherVirtualComputer : PrepareActions,
0,
NULL
);
} else {
if ((!hadLeaf) && actionStruct.ObjectBase) {
IsmQueueEnumeration (
g_RegType,
actionStruct.ObjectBase,
g_VcmMode ? GatherVirtualComputer : PrepareActions,
0,
NULL
);
}
IsmQueueEnumeration (
g_RegType,
srcHandle,
g_VcmMode ? GatherVirtualComputer : PrepareActions,
0,
NULL
);
}
}
if (ActionGroup == ACTIONGROUP_DELREGKEY) {
IsmHookEnumeration (g_RegType, srcHandle, ExcludeKeyIfValueExists, 0, NULL);
IsmRegisterTypePostEnumerationCallback (g_RegType, PostDelregKeyCallback, NULL);
}
}
__finally {
IsmDestroyObjectHandle (srcHandle);
srcHandle = NULL;
IsmDestroyObjectHandle (actionStruct.ObjectBase);
actionStruct.ObjectBase = NULL;
IsmDestroyObjectHandle (actionStruct.ObjectDest);
actionStruct.ObjectDest = NULL;
IsmDestroyObjectHandle (actionStruct.AddnlDest);
actionStruct.AddnlDest = NULL;
}
} while (InfFindNextLine (&is));
result = !IsmCheckCancel();
} else {
LOG ((LOG_ERROR, (PCSTR) MSG_EMPTY_OR_MISSING_SECTION, Section));
}
InfCleanUpInfStruct (&is);
return result;
}
BOOL
pParseFiles (
IN HINF Inf,
IN PCTSTR Section,
IN ACTIONGROUP ActionGroup,
IN DWORD ActionFlags,
IN PCTSTR Application OPTIONAL
)
{
INFSTRUCT is = INITINFSTRUCT_PMHANDLE;
PCTSTR pattern;
PCTSTR newPattern = NULL;
PCTSTR dirText;
BOOL tree;
MIG_OBJECTSTRINGHANDLE srcHandle = NULL;
PCTSTR destination;
PCTSTR leafDest;
TCHAR buffer1[MAX_TCHAR_PATH * 2];
ACTION_STRUCT actionStruct;
BOOL result = FALSE;
PCTSTR msgNode;
PCTSTR msgLeaf;
PCTSTR newDest = NULL;
BOOL expandResult = TRUE;
if (InfFindFirstLine (Inf, Section, NULL, &is)) {
do {
if (IsmCheckCancel()) {
break;
}
ZeroMemory (&actionStruct, sizeof (ACTION_STRUCT));
dirText = InfGetStringField (&is, 0);
pattern = InfGetStringField (&is, 1);
if (!pattern) {
continue;
}
//
// Expand environment variables in pattern (the left-side file spec)
//
expandResult = AppSearchAndReplace (
PLATFORM_SOURCE,
Application,
pattern,
buffer1,
ARRAYSIZE(buffer1)
);
if (!expandResult) {
// the line contains at least one unexpandable env. variables
expandResult = AppCheckAndLogUndefVariables (
PLATFORM_SOURCE,
Application,
pattern
);
if (expandResult) {
// the line contains known but undefined env. variables
continue;
}
}
//
// Fix the pattern
//
newPattern = SanitizePath(buffer1);
if(!newPattern) {
continue;
}
//
// Test for dir specification
//
if (dirText && StringIMatch (dirText, TEXT("Dir")) && !StringIMatch (pattern, TEXT("Dir"))) {
tree = TRUE;
} else {
tree = FALSE;
}
// require full spec or leaf only
if (!IsValidFileSpec (newPattern) && _tcschr (newPattern, TEXT('\\'))) {
if (expandResult) {
LOG ((LOG_ERROR, (PCSTR) MSG_FILE_SPEC_BAD, pattern));
}
continue;
}
srcHandle = TurnFileStringIntoHandle (newPattern, tree ? PFF_PATTERN_IS_DIR : 0);
if (!srcHandle) {
LOG ((LOG_ERROR, (PCSTR) MSG_FILE_SPEC_BAD, pattern));
continue;
}
actionStruct.ObjectBase = TurnFileStringIntoHandle (
newPattern,
PFF_COMPUTE_BASE|
PFF_NO_SUBDIR_PATTERN|
(tree?PFF_NO_LEAF_AT_ALL:PFF_NO_LEAF_PATTERN)
);
if (actionStruct.ObjectBase && !StringIMatch (actionStruct.ObjectBase, srcHandle)) {
IsmCreateObjectStringsFromHandle (actionStruct.ObjectBase, &msgNode, &msgLeaf);
MYASSERT (!msgLeaf);
LOG ((LOG_INFORMATION, (PCSTR) MSG_FILE_MOVE_BASE_INFO, newPattern, msgNode));
IsmDestroyObjectString (msgNode);
IsmDestroyObjectString (msgLeaf);
}
if (ActionFlags & ACTION_PERSIST) {
if (ActionGroup == ACTIONGROUP_INCLUDE ||
ActionGroup == ACTIONGROUP_INCLUDEEX ||
ActionGroup == ACTIONGROUP_RENAME ||
ActionGroup == ACTIONGROUP_RENAMEEX ||
ActionGroup == ACTIONGROUP_INCLUDERELEVANT ||
ActionGroup == ACTIONGROUP_INCLUDERELEVANTEX ||
ActionGroup == ACTIONGROUP_RENAMERELEVANT ||
ActionGroup == ACTIONGROUP_RENAMERELEVANTEX
) {
//
// For the CopyFiles and CopyFilesFiltered sections, get the
// optional destination. If destination is specified, move
// all of the files into that destination.
//
destination = InfGetStringField (&is, 2);
if (destination && *destination) {
if (ActionGroup == ACTIONGROUP_INCLUDE) {
ActionGroup = ACTIONGROUP_RENAME;
}
if (ActionGroup == ACTIONGROUP_INCLUDEEX) {
ActionGroup = ACTIONGROUP_RENAMEEX;
}
if (ActionGroup == ACTIONGROUP_INCLUDERELEVANT) {
ActionGroup = ACTIONGROUP_RENAMERELEVANT;
}
if (ActionGroup == ACTIONGROUP_INCLUDERELEVANTEX) {
ActionGroup = ACTIONGROUP_RENAMERELEVANTEX;
}
newDest = SanitizePath (destination);
if (newDest) {
actionStruct.ObjectDest = TurnFileStringIntoHandle (
newDest,
PFF_COMPUTE_BASE|
PFF_NO_SUBDIR_PATTERN|
PFF_NO_PATTERNS_ALLOWED|
PFF_NO_LEAF_AT_ALL
);
FreePathString (newDest);
newDest = NULL;
}
if ((ActionGroup == ACTIONGROUP_RENAMEEX) ||
(ActionGroup == ACTIONGROUP_RENAMERELEVANTEX)
) {
// we might have an extra field for the leaf name
leafDest = InfGetStringField (&is, 3);
if (leafDest && *leafDest) {
// we have to rebuild actionStruct.ObjectDest
IsmCreateObjectStringsFromHandle (actionStruct.ObjectDest, &msgNode, &msgLeaf);
IsmDestroyObjectHandle (actionStruct.ObjectDest);
actionStruct.ObjectDest = IsmCreateObjectHandle (msgNode, leafDest);
IsmDestroyObjectString (msgNode);
IsmDestroyObjectString (msgLeaf);
}
}
if (!actionStruct.ObjectDest) {
LOG ((LOG_ERROR, (PCSTR) MSG_FILE_SPEC_BAD_DEST, destination));
IsmDestroyObjectHandle (srcHandle);
srcHandle = NULL;
continue;
}
}
}
}
//
// Add this rule
//
if (!AddRule (
g_FileType,
actionStruct.ObjectBase,
srcHandle,
ActionGroup,
ActionFlags,
&actionStruct
)) {
DEBUGMSG ((DBG_ERROR, "Error processing file rules"));
break;
}
//
// Queue enumeration for include patterns
//
if ((ActionGroup == ACTIONGROUP_INCLUDE) ||
(ActionGroup == ACTIONGROUP_INCLUDEEX) ||
(ActionGroup == ACTIONGROUP_RENAME) ||
(ActionGroup == ACTIONGROUP_RENAMEEX) ||
(ActionGroup == ACTIONGROUP_INCLUDERELEVANT) ||
(ActionGroup == ACTIONGROUP_INCLUDERELEVANTEX) ||
(ActionGroup == ACTIONGROUP_RENAMERELEVANT) ||
(ActionGroup == ACTIONGROUP_RENAMERELEVANTEX)
) {
//
// Queue the enumeration callback
//
if (IsmIsObjectHandleLeafOnly (srcHandle)) {
DEBUGMSG ((DBG_SCRIPT, "Pattern %s triggered enumeration of entire file system", pattern));
QueueAllFiles();
IsmHookEnumeration (
g_FileType,
srcHandle,
g_VcmMode ? GatherVirtualComputer : PrepareActions,
0,
NULL
);
} else {
if (tree && actionStruct.ObjectBase) {
IsmQueueEnumeration (
g_FileType,
actionStruct.ObjectBase,
g_VcmMode ? GatherVirtualComputer : PrepareActions,
0,
NULL
);
}
IsmQueueEnumeration (
g_FileType,
srcHandle,
g_VcmMode ? GatherVirtualComputer : PrepareActions,
0,
NULL
);
}
}
IsmDestroyObjectHandle (srcHandle);
srcHandle = NULL;
IsmDestroyObjectHandle (actionStruct.ObjectBase);
actionStruct.ObjectBase = NULL;
IsmDestroyObjectHandle (actionStruct.ObjectDest);
actionStruct.ObjectDest = NULL;
FreePathString(newPattern);
} while (InfFindNextLine (&is));
result = !IsmCheckCancel();
}
InfCleanUpInfStruct (&is);
return result;
}
BOOL
pParseLockPartition (
IN HINF Inf,
IN PCTSTR Section
)
{
INFSTRUCT is = INITINFSTRUCT_PMHANDLE;
PCTSTR pattern;
MIG_OBJECTSTRINGHANDLE srcHandle = NULL;
BOOL result = FALSE;
if (InfFindFirstLine (Inf, Section, NULL, &is)) {
do {
if (IsmCheckCancel()) {
break;
}
pattern = InfGetStringField (&is, 0);
if (!pattern) {
LOG ((LOG_WARNING, (PCSTR) MSG_EMPTY_FILE_SPEC));
IsmDestroyObjectHandle (srcHandle);
srcHandle = NULL;
continue;
}
srcHandle = TurnFileStringIntoHandle (pattern, 0);
if (!srcHandle) {
LOG ((LOG_ERROR, (PCSTR) MSG_FILE_SPEC_BAD, pattern));
IsmDestroyObjectHandle (srcHandle);
srcHandle = NULL;
continue;
}
IsmHookEnumeration (
g_FileType,
srcHandle,
LockPartition,
0,
NULL
);
IsmDestroyObjectHandle (srcHandle);
srcHandle = NULL;
} while (InfFindNextLine (&is));
result = !IsmCheckCancel();
}
InfCleanUpInfStruct (&is);
return result;
}
BOOL
pParseRegPriority (
IN HINF Inf,
IN PCTSTR Section,
IN DWORD ActionFlags,
IN PCTSTR Application, OPTIONAL
IN BOOL ExtendedPattern
)
{
INFSTRUCT is = INITINFSTRUCT_PMHANDLE;
PCTSTR pattern = NULL;
PCTSTR patternLeaf = NULL;
PCTSTR baseNode = NULL;
PCTSTR nodeCopy = NULL;
PTSTR ptr;
MIG_OBJECTSTRINGHANDLE srcHandle = NULL;
MIG_OBJECTSTRINGHANDLE baseHandle = NULL;
BOOL result = FALSE;
if (InfFindFirstLine (Inf, Section, NULL, &is)) {
do {
if (IsmCheckCancel()) {
break;
}
pattern = InfGetStringField (&is, 1);
if (!pattern) {
LOG ((LOG_WARNING, (PCSTR) MSG_EMPTY_RENREG));
IsmDestroyObjectHandle (srcHandle);
srcHandle = NULL;
continue;
}
if (ExtendedPattern) {
patternLeaf = InfGetStringField (&is, 2);
}
if (ExtendedPattern) {
srcHandle = CreatePatternFromNodeLeaf (pattern, patternLeaf?patternLeaf:TEXT("*"));
} else {
srcHandle = TurnRegStringIntoHandle (pattern, TRUE, NULL);
}
if (!srcHandle) {
LOG ((LOG_ERROR, (PCSTR) MSG_REG_SPEC_BAD, pattern));
IsmDestroyObjectHandle (srcHandle);
srcHandle = NULL;
continue;
}
if (ExtendedPattern) {
ptr = _tcschr (pattern, TEXT('\\'));
if (ptr) {
if (StringIPrefix (pattern, TEXT("HKR\\"))) {
nodeCopy = JoinText (TEXT("HKCU"), ptr);
} else {
nodeCopy = DuplicateText (pattern);
}
baseNode = GetPatternBase (nodeCopy);
if (baseNode) {
baseHandle = IsmCreateObjectHandle (baseNode, NULL);
FreePathString (baseNode);
}
FreeText (nodeCopy);
}
} else {
baseHandle = TurnRegStringIntoHandle (pattern, FALSE, NULL);
}
AddRuleEx (
g_RegType,
baseHandle,
srcHandle,
ACTIONGROUP_SPECIFICPRIORITY,
ActionFlags,
NULL,
RULEGROUP_PRIORITY
);
IsmHookEnumeration (
g_RegType,
srcHandle,
ObjectPriority,
0,
NULL
);
IsmDestroyObjectHandle (baseHandle);
IsmDestroyObjectHandle (srcHandle);
srcHandle = NULL;
} while (InfFindNextLine (&is));
result = !IsmCheckCancel();
}
InfCleanUpInfStruct (&is);
return result;
}
BOOL
pParseFilePriority (
IN HINF Inf,
IN PCTSTR Section,
IN DWORD ActionFlags,
IN PCTSTR Application OPTIONAL
)
{
INFSTRUCT is = INITINFSTRUCT_PMHANDLE;
PCTSTR newPattern = NULL;
PCTSTR pattern;
PCTSTR dirText;
BOOL tree;
MIG_OBJECTSTRINGHANDLE srcHandle = NULL;
MIG_OBJECTSTRINGHANDLE baseHandle = NULL;
TCHAR buffer1[MAX_TCHAR_PATH * 2];
BOOL result = FALSE;
BOOL expandResult = TRUE;
if (InfFindFirstLine (Inf, Section, NULL, &is)) {
do {
if (IsmCheckCancel()) {
break;
}
dirText = InfGetStringField (&is, 0);
pattern = InfGetStringField (&is, 1);
if (!pattern) {
continue;
}
//
// Expand environment variables in pattern (the left-side file spec)
//
expandResult = AppSearchAndReplace (
PLATFORM_SOURCE,
Application,
pattern,
buffer1,
ARRAYSIZE(buffer1)
);
if (!expandResult) {
// the line contains at least one unexpandable env. variables
expandResult = AppCheckAndLogUndefVariables (
PLATFORM_SOURCE,
Application,
pattern
);
if (expandResult) {
// the line contains known but undefined env. variables
continue;
}
}
//
// Fix the pattern
//
newPattern = SanitizePath(buffer1);
if(!newPattern) {
continue;
}
//
// Test for dir specification
//
if (dirText && StringIMatch (dirText, TEXT("Dir"))) {
tree = TRUE;
} else {
tree = FALSE;
}
// require full spec
if (!IsValidFileSpec (newPattern)) {
if (expandResult) {
LOG ((LOG_ERROR, (PCSTR) MSG_FILE_SPEC_BAD, pattern));
}
FreePathString (newPattern);
newPattern = NULL;
continue;
}
srcHandle = TurnFileStringIntoHandle (newPattern, tree ? PFF_PATTERN_IS_DIR : 0);
if (!srcHandle) {
LOG ((LOG_ERROR, (PCSTR) MSG_FILE_SPEC_BAD, pattern));
FreePathString (newPattern);
newPattern = NULL;
continue;
}
baseHandle = TurnFileStringIntoHandle (
newPattern,
PFF_COMPUTE_BASE|
PFF_NO_SUBDIR_PATTERN|
(tree?PFF_NO_LEAF_AT_ALL:PFF_NO_LEAF_PATTERN)
);
AddRuleEx (
g_FileType,
baseHandle,
srcHandle,
ACTIONGROUP_SPECIFICPRIORITY,
ActionFlags,
NULL,
RULEGROUP_PRIORITY
);
IsmHookEnumeration (
g_FileType,
srcHandle,
ObjectPriority,
0,
NULL
);
IsmDestroyObjectHandle (baseHandle);
IsmDestroyObjectHandle (srcHandle);
srcHandle = NULL;
FreePathString (newPattern);
newPattern = NULL;
} while (InfFindNextLine (&is));
result = !IsmCheckCancel();
}
InfCleanUpInfStruct (&is);
return result;
}
BOOL
pParseFileCollisionPattern (
IN HINF Inf,
IN PCTSTR Section,
IN PCTSTR Application OPTIONAL
)
{
INFSTRUCT is = INITINFSTRUCT_PMHANDLE;
PCTSTR pattern;
PCTSTR newPattern = NULL;
PCTSTR dirText;
BOOL tree;
MIG_OBJECTSTRINGHANDLE srcHandle = NULL;
PCTSTR collPattern;
TCHAR buffer1[MAX_TCHAR_PATH * 2];
ACTION_STRUCT actionStruct;
BOOL result = FALSE;
PCTSTR msgNode;
PCTSTR msgLeaf;
BOOL expandResult = TRUE;
if (InfFindFirstLine (Inf, Section, NULL, &is)) {
do {
if (IsmCheckCancel()) {
break;
}
ZeroMemory (&actionStruct, sizeof (ACTION_STRUCT));
dirText = InfGetStringField (&is, 0);
pattern = InfGetStringField (&is, 1);
if (!pattern) {
continue;
}
//
// Expand environment variables in pattern (the left-side file spec)
//
expandResult = AppSearchAndReplace (
PLATFORM_SOURCE,
Application,
pattern,
buffer1,
ARRAYSIZE(buffer1)
);
if (!expandResult) {
// the line contains at least one unexpandable env. variables
expandResult = AppCheckAndLogUndefVariables (
PLATFORM_SOURCE,
Application,
pattern
);
if (expandResult) {
// the line contains known but undefined env. variables
continue;
}
}
//
// Fix the pattern
//
newPattern = SanitizePath(buffer1);
if(!newPattern) {
continue;
}
//
// Test for dir specification
//
if (dirText && StringIMatch (dirText, TEXT("Dir")) && !StringIMatch (pattern, TEXT("Dir"))) {
tree = TRUE;
} else {
tree = FALSE;
}
// require full spec or leaf only
if (!IsValidFileSpec (newPattern) && _tcschr (newPattern, TEXT('\\'))) {
if (expandResult) {
LOG ((LOG_ERROR, (PCSTR) MSG_FILE_SPEC_BAD, pattern));
}
continue;
}
srcHandle = TurnFileStringIntoHandle (newPattern, tree ? PFF_PATTERN_IS_DIR : 0);
if (!srcHandle) {
LOG ((LOG_ERROR, (PCSTR) MSG_FILE_SPEC_BAD, pattern));
continue;
}
actionStruct.ObjectBase = TurnFileStringIntoHandle (
newPattern,
PFF_COMPUTE_BASE|
PFF_NO_SUBDIR_PATTERN|
(tree?PFF_NO_LEAF_AT_ALL:PFF_NO_LEAF_PATTERN)
);
collPattern = InfGetStringField (&is, 2);
if ((!collPattern) || (!(*collPattern))) {
// we have no collision pattern, let's get out
continue;
}
actionStruct.ObjectHint = IsmDuplicateString (collPattern);
//
// Add this rule
//
if (!AddRuleEx (
g_FileType,
actionStruct.ObjectBase,
srcHandle,
ACTIONGROUP_FILECOLLPATTERN,
0,
&actionStruct,
RULEGROUP_COLLPATTERN
)) {
DEBUGMSG ((DBG_ERROR, "Error processing file rules"));
break;
}
//
// Queue the enumeration callback
//
if (IsmIsObjectHandleLeafOnly (srcHandle)) {
DEBUGMSG ((DBG_SCRIPT, "Pattern %s triggered enumeration of entire file system", pattern));
IsmHookEnumeration (
g_FileType,
srcHandle,
FileCollPattern,
0,
NULL
);
} else {
if (tree && actionStruct.ObjectBase) {
IsmHookEnumeration (
g_FileType,
actionStruct.ObjectBase,
FileCollPattern,
0,
NULL
);
}
IsmHookEnumeration (
g_FileType,
srcHandle,
FileCollPattern,
0,
NULL
);
}
IsmDestroyObjectHandle (srcHandle);
srcHandle = NULL;
IsmDestroyObjectHandle (actionStruct.ObjectBase);
actionStruct.ObjectBase = NULL;
IsmReleaseMemory (actionStruct.ObjectHint);
actionStruct.ObjectHint = NULL;
FreePathString(newPattern);
} while (InfFindNextLine (&is));
result = !IsmCheckCancel();
}
InfCleanUpInfStruct (&is);
return result;
}
BOOL
pParseOneInstruction (
IN HINF InfHandle,
IN PCTSTR Type,
IN PCTSTR SectionMultiSz,
IN PINFSTRUCT InfStruct,
IN PCTSTR Application OPTIONAL
)
{
ACTIONGROUP actionGroup;
DWORD actionFlags;
MULTISZ_ENUM e;
BOOL result = TRUE;
MIG_PLATFORMTYPEID platform = IsmGetRealPlatform();
//
// First thing: look for nested sections
//
if (StringIMatch (Type, TEXT("ProcessSection"))) {
if (EnumFirstMultiSz (&e, SectionMultiSz)) {
do {
result = result & ParseOneApplication (
PLATFORM_SOURCE,
InfHandle,
Application,
FALSE,
0,
e.CurrentString,
NULL,
NULL,
NULL
);
} while (EnumNextMultiSz (&e));
}
return result;
}
//
// Parse registry sections
//
actionGroup = ACTIONGROUP_NONE;
actionFlags = 0;
if (StringIMatch (Type, TEXT("AddReg"))) {
actionGroup = ACTIONGROUP_INCLUDE;
actionFlags = ACTION_PERSIST;
} else if (StringIMatch (Type, TEXT("RenReg"))) {
actionGroup = ACTIONGROUP_RENAME;
actionFlags = ACTION_PERSIST;
} else if (StringIMatch (Type, TEXT("DelReg"))) {
actionGroup = ACTIONGROUP_EXCLUDE;
actionFlags = 0;
} else if (StringIMatch (Type, TEXT("RegFile"))) {
actionGroup = ACTIONGROUP_REGFILE;
actionFlags = ACTION_PERSIST_PATH_IN_DATA;
} else if (StringIMatch (Type, TEXT("RegFolder"))) {
actionGroup = ACTIONGROUP_REGFOLDER;
actionFlags = ACTION_PERSIST_PATH_IN_DATA;
} else if (StringIMatch (Type, TEXT("RegIcon"))) {
actionGroup = ACTIONGROUP_REGICON;
actionFlags = ACTION_PERSIST_ICON_IN_DATA;
} else if (StringIMatch (Type, TEXT("DelRegKey"))) {
actionGroup = ACTIONGROUP_DELREGKEY;
actionFlags = 0;
}
if (actionGroup != ACTIONGROUP_NONE) {
if (EnumFirstMultiSz (&e, SectionMultiSz)) {
do {
if (!pParseReg (
InfHandle,
e.CurrentString,
actionGroup,
actionFlags,
TRUE,
Application
)) {
result = FALSE;
if (InfStruct) {
InfLogContext (LOG_ERROR, InfHandle, InfStruct);
}
break;
}
} while (EnumNextMultiSz (&e));
}
return result;
}
//
// Parse file sections
//
if (StringIMatch (Type, TEXT("CopyFilesFiltered"))) {
actionGroup = ACTIONGROUP_INCLUDERELEVANT;
actionFlags = ACTION_PERSIST;
} else if (StringIMatch (Type, TEXT("CopyFilesFilteredEx"))) {
actionGroup = ACTIONGROUP_INCLUDERELEVANTEX;
actionFlags = ACTION_PERSIST;
} else if (StringIMatch (Type, TEXT("CopyFiles"))) {
actionGroup = ACTIONGROUP_INCLUDE;
actionFlags = ACTION_PERSIST;
} else if (StringIMatch (Type, TEXT("CopyFilesEx"))) {
actionGroup = ACTIONGROUP_INCLUDEEX;
actionFlags = ACTION_PERSIST;
} else if (StringIMatch (Type, TEXT("DelFiles"))) {
actionGroup = ACTIONGROUP_EXCLUDE;
actionFlags = 0;
}
if (actionGroup != ACTIONGROUP_NONE) {
if (EnumFirstMultiSz (&e, SectionMultiSz)) {
do {
if (IsmIsEnvironmentFlagSet (platform, NULL, S_ENV_ALL_FILES)) {
if (!pParseFiles (
InfHandle,
e.CurrentString,
actionGroup,
actionFlags,
Application
)) {
result = FALSE;
if (InfStruct) {
InfLogContext (LOG_ERROR, InfHandle, InfStruct);
}
break;
}
} else {
LOG ((
LOG_INFORMATION,
(PCSTR) MSG_IGNORING_FILE_SECTION,
e.CurrentString
));
}
} while (EnumNextMultiSz (&e));
}
return result;
}
//
// Parse registry priority
//
if (StringIMatch (Type, TEXT("ForceDestRegEx"))) {
if (EnumFirstMultiSz (&e, SectionMultiSz)) {
do {
if (!pParseRegPriority (InfHandle, e.CurrentString, ACTION_PRIORITYDEST, Application, TRUE)) {
result = FALSE;
if (InfStruct) {
InfLogContext (LOG_ERROR, InfHandle, InfStruct);
}
break;
}
} while (EnumNextMultiSz (&e));
}
return result;
}
if (StringIMatch (Type, TEXT("ForceDestReg"))) {
if (EnumFirstMultiSz (&e, SectionMultiSz)) {
do {
if (!pParseRegPriority (InfHandle, e.CurrentString, ACTION_PRIORITYDEST, Application, FALSE)) {
result = FALSE;
if (InfStruct) {
InfLogContext (LOG_ERROR, InfHandle, InfStruct);
}
break;
}
} while (EnumNextMultiSz (&e));
}
return result;
}
if (StringIMatch (Type, TEXT("ForceSrcRegEx"))) {
if (EnumFirstMultiSz (&e, SectionMultiSz)) {
do {
if (!pParseRegPriority (InfHandle, e.CurrentString, ACTION_PRIORITYSRC, Application, TRUE)) {
result = FALSE;
if (InfStruct) {
InfLogContext (LOG_ERROR, InfHandle, InfStruct);
}
break;
}
} while (EnumNextMultiSz (&e));
}
return result;
}
if (StringIMatch (Type, TEXT("ForceSrcReg"))) {
if (EnumFirstMultiSz (&e, SectionMultiSz)) {
do {
if (!pParseRegPriority (InfHandle, e.CurrentString, ACTION_PRIORITYSRC, Application, FALSE)) {
result = FALSE;
if (InfStruct) {
InfLogContext (LOG_ERROR, InfHandle, InfStruct);
}
break;
}
} while (EnumNextMultiSz (&e));
}
return result;
}
//
// Parse file collision rules (default is %s(%d).%s)
//
if (StringIMatch (Type, TEXT("FileCollisionPattern"))) {
if (EnumFirstMultiSz (&e, SectionMultiSz)) {
do {
if (!pParseFileCollisionPattern (InfHandle, e.CurrentString, Application)) {
result = FALSE;
if (InfStruct) {
InfLogContext (LOG_ERROR, InfHandle, InfStruct);
}
break;
}
} while (EnumNextMultiSz (&e));
}
return result;
}
//
// Parse restore callback rule
//
if (StringIMatch (Type, TEXT("RestoreCallback"))) {
if (!g_VcmMode) {
if (EnumFirstMultiSz (&e, SectionMultiSz)) {
do {
IsmAppendEnvironmentString (PLATFORM_SOURCE, NULL, S_ENV_DEST_RESTORE, e.CurrentString);
} while (EnumNextMultiSz (&e));
}
}
return result;
}
//
// Parse destination rule
//
if (StringIMatch (Type, TEXT("DestDelReg"))) {
if (!g_VcmMode) {
if (EnumFirstMultiSz (&e, SectionMultiSz)) {
do {
IsmAppendEnvironmentString (PLATFORM_SOURCE, NULL, S_ENV_DEST_DELREG, e.CurrentString);
} while (EnumNextMultiSz (&e));
}
}
return result;
}
if (StringIMatch (Type, TEXT("DestDelRegEx"))) {
if (!g_VcmMode) {
if (EnumFirstMultiSz (&e, SectionMultiSz)) {
do {
IsmAppendEnvironmentString (PLATFORM_SOURCE, NULL, S_ENV_DEST_DELREGEX, e.CurrentString);
} while (EnumNextMultiSz (&e));
}
}
return result;
}
//
// Parse destination detect rules
//
if (StringIMatch (Type, TEXT("DestCheckDetect"))) {
if (!g_VcmMode) {
if (EnumFirstMultiSz (&e, SectionMultiSz)) {
do {
IsmAppendEnvironmentString (PLATFORM_SOURCE, NULL, S_ENV_DEST_CHECKDETECT, e.CurrentString);
} while (EnumNextMultiSz (&e));
}
}
return result;
}
//
// Parse destination AddObject rule
//
if (StringIMatch (Type, TEXT("DestAddObject"))) {
if (!g_VcmMode) {
if (EnumFirstMultiSz (&e, SectionMultiSz)) {
do {
IsmAppendEnvironmentString (PLATFORM_SOURCE, NULL, S_ENV_DEST_ADDOBJECT, e.CurrentString);
} while (EnumNextMultiSz (&e));
}
}
return result;
}
//
// Parse execute rule
//
if (StringIMatch (Type, TEXT("Execute"))) {
if (!g_VcmMode) {
if (EnumFirstMultiSz (&e, SectionMultiSz)) {
do {
IsmAppendEnvironmentString (PLATFORM_SOURCE, NULL, S_ENV_SCRIPT_EXECUTE, e.CurrentString);
} while (EnumNextMultiSz (&e));
}
}
return result;
}
//
// Parse file priority
//
if (StringIMatch (Type, TEXT("ForceDestFile"))) {
if (EnumFirstMultiSz (&e, SectionMultiSz)) {
do {
if (IsmIsEnvironmentFlagSet (platform, NULL, S_ENV_ALL_FILES)) {
if (!pParseFilePriority (InfHandle, e.CurrentString, ACTION_PRIORITYDEST, Application)) {
result = FALSE;
if (InfStruct) {
InfLogContext (LOG_ERROR, InfHandle, InfStruct);
}
break;
}
} else {
LOG ((
LOG_INFORMATION,
(PCSTR) MSG_IGNORING_FILE_SECTION,
e.CurrentString
));
}
} while (EnumNextMultiSz (&e));
}
return result;
}
if (StringIMatch (Type, TEXT("ForceSrcFile"))) {
if (EnumFirstMultiSz (&e, SectionMultiSz)) {
do {
if (IsmIsEnvironmentFlagSet (platform, NULL, S_ENV_ALL_FILES)) {
if (!pParseFilePriority (InfHandle, e.CurrentString, ACTION_PRIORITYSRC, Application)) {
result = FALSE;
if (InfStruct) {
InfLogContext (LOG_ERROR, InfHandle, InfStruct);
}
break;
}
} else {
LOG ((
LOG_INFORMATION,
(PCSTR) MSG_IGNORING_FILE_SECTION,
e.CurrentString
));
}
} while (EnumNextMultiSz (&e));
}
return result;
}
//
// Parse special conversion
//
if (StringIMatch (Type, TEXT("Conversion"))) {
if (EnumFirstMultiSz (&e, SectionMultiSz)) {
do {
if (!DoRegistrySpecialConversion (InfHandle, e.CurrentString)) {
result = FALSE;
if (InfStruct) {
InfLogContext (LOG_ERROR, InfHandle, InfStruct);
}
break;
}
} while (EnumNextMultiSz (&e));
}
return result;
}
if (StringIMatch (Type, TEXT("RenRegFn"))) {
if (EnumFirstMultiSz (&e, SectionMultiSz)) {
do {
if (!DoRegistrySpecialRename (InfHandle, e.CurrentString)) {
result = FALSE;
if (InfStruct) {
InfLogContext (LOG_ERROR, InfHandle, InfStruct);
}
break;
}
} while (EnumNextMultiSz (&e));
}
return result;
}
//
// Parse enhanced renreg
//
actionGroup = ACTIONGROUP_NONE;
actionFlags = 0;
if (StringIMatch (Type, TEXT("AddRegEx"))) {
actionGroup = ACTIONGROUP_INCLUDEEX;
actionFlags = ACTION_PERSIST;
} else if (StringIMatch (Type, TEXT("RenRegEx"))) {
actionGroup = ACTIONGROUP_RENAMEEX;
actionFlags = ACTION_PERSIST;
} else if (StringIMatch (Type, TEXT("DelRegEx"))) {
actionGroup = ACTIONGROUP_EXCLUDEEX;
actionFlags = 0;
} else if (StringIMatch (Type, TEXT("RegFileEx"))) {
actionGroup = ACTIONGROUP_REGFILEEX;
actionFlags = ACTION_PERSIST_PATH_IN_DATA;
} else if (StringIMatch (Type, TEXT("RegFolderEx"))) {
actionGroup = ACTIONGROUP_REGFOLDEREX;
actionFlags = ACTION_PERSIST_PATH_IN_DATA;
} else if (StringIMatch (Type, TEXT("RegIconEx"))) {
actionGroup = ACTIONGROUP_REGICONEX;
actionFlags = ACTION_PERSIST_ICON_IN_DATA;
}
if (actionGroup != ACTIONGROUP_NONE) {
if (EnumFirstMultiSz (&e, SectionMultiSz)) {
do {
if (!pParseRegEx (InfHandle, e.CurrentString, actionGroup, actionFlags, Application)) {
result = FALSE;
if (InfStruct) {
InfLogContext (LOG_ERROR, InfHandle, InfStruct);
}
break;
}
} while (EnumNextMultiSz (&e));
}
return result;
}
if (StringIMatch (Type, TEXT("LockPartition"))) {
if (EnumFirstMultiSz (&e, SectionMultiSz)) {
do {
if (!pParseLockPartition (InfHandle, e.CurrentString)) {
result = FALSE;
if (InfStruct) {
InfLogContext (LOG_ERROR, InfHandle, InfStruct);
}
break;
}
} while (EnumNextMultiSz (&e));
}
return result;
}
//
// Unknown section type
//
LOG ((LOG_ERROR, (PCSTR) MSG_UNEXPECTED_SECTION_TYPE, Type));
if (InfStruct) {
InfLogContext (LOG_ERROR, InfHandle, InfStruct);
}
return FALSE;
}
BOOL
pParseInfInstructionsWorker (
IN PINFSTRUCT InfStruct,
IN HINF InfHandle,
IN PCTSTR Application, OPTIONAL
IN PCTSTR Section
)
{
PCTSTR type;
PCTSTR sections;
GROWBUFFER multiSz = INIT_GROWBUFFER;
BOOL result = TRUE;
if (InfFindFirstLine (InfHandle, Section, NULL, InfStruct)) {
do {
if (IsmCheckCancel()) {
result = FALSE;
break;
}
InfResetInfStruct (InfStruct);
type = InfGetStringField (InfStruct, 0);
sections = InfGetMultiSzField (InfStruct, 1);
if (!type || !sections) {
LOG ((LOG_WARNING, (PCSTR) MSG_BAD_INF_LINE, Section));
InfLogContext (LOG_WARNING, InfHandle, InfStruct);
continue;
}
result = pParseOneInstruction (InfHandle, type, sections, InfStruct, Application);
} while (result && InfFindNextLine (InfStruct));
}
InfCleanUpInfStruct (InfStruct);
GbFree (&multiSz);
return result;
}
BOOL
ParseInfInstructions (
IN HINF InfHandle,
IN PCTSTR Application, OPTIONAL
IN PCTSTR Section
)
{
PCTSTR osSpecificSection;
BOOL b;
INFSTRUCT is = INITINFSTRUCT_PMHANDLE;
PTSTR instrSection;
b = pParseInfInstructionsWorker (&is, InfHandle, Application, Section);
if (b) {
osSpecificSection = GetMostSpecificSection (&is, InfHandle, Section);
if (osSpecificSection) {
b = pParseInfInstructionsWorker (&is, InfHandle, Application, osSpecificSection);
FreeText (osSpecificSection);
}
}
InfCleanUpInfStruct (&is);
return b;
}
BOOL
pParseInf (
IN HINF InfHandle,
IN BOOL PreParse
)
{
BOOL result = TRUE;
if (InfHandle == INVALID_HANDLE_VALUE) {
return FALSE;
}
//
// Process the application sections
//
if (!ParseApplications (PLATFORM_SOURCE, InfHandle, TEXT("Applications"), PreParse, MASTERGROUP_APP)) {
LOG ((LOG_FATAL_ERROR, (PCSTR) MSG_APP_PARSE_FAILURE));
IsmSetCancel();
return FALSE;
}
//
// Process system settings
//
if (!ParseApplications (PLATFORM_SOURCE, InfHandle, TEXT("System Settings"), PreParse, MASTERGROUP_SYSTEM)) {
LOG ((LOG_FATAL_ERROR, (PCSTR) MSG_SYSTEM_PARSE_FAILURE));
IsmSetCancel();
return FALSE;
}
//
// Process user settings
//
if (!ParseApplications (PLATFORM_SOURCE, InfHandle, TEXT("User Settings"), PreParse, MASTERGROUP_USER)) {
LOG ((LOG_FATAL_ERROR, (PCSTR) MSG_USER_PARSE_FAILURE));
IsmSetCancel();
return FALSE;
}
//
// Process files and folders settings
//
if (!ProcessFilesAndFolders (InfHandle, TEXT("Files and Folders"), PreParse)) {
LOG ((LOG_FATAL_ERROR, (PCSTR) MSG_FNF_PARSE_FAILURE));
IsmSetCancel();
return FALSE;
}
//
// Process the administrator script sections
//
if (!ParseApplications (PLATFORM_SOURCE, InfHandle, TEXT("Administrator Scripts"), PreParse, MASTERGROUP_SCRIPT)) {
LOG ((LOG_FATAL_ERROR, (PCSTR) MSG_SCRIPT_PARSE_FAILURE));
IsmSetCancel();
return FALSE;
}
return TRUE;
}
BOOL
pAddFileSpec (
IN PCTSTR Node, OPTIONAL
IN PCTSTR Leaf, OPTIONAL
IN BOOL IncludeSubDirs,
IN BOOL LeafIsPattern,
IN ACTIONGROUP ActionGroup,
IN DWORD ActionFlags,
IN BOOL DefaultPriority,
IN BOOL SrcPriority
)
{
MIG_OBJECTSTRINGHANDLE srcHandle = NULL;
MIG_OBJECTSTRINGHANDLE srcBaseHandle = NULL;
BOOL result = FALSE;
ACTION_STRUCT actionStruct;
__try {
//
// Build object string
//
MYASSERT (Node || Leaf);
srcHandle = IsmCreateSimpleObjectPattern (Node, IncludeSubDirs, Leaf, LeafIsPattern);
if (!srcHandle) {
__leave;
}
if (Node) {
srcBaseHandle = IsmCreateObjectHandle (Node, NULL);
}
//
// Add this rule
//
ZeroMemory (&actionStruct, sizeof (ACTION_STRUCT));
actionStruct.ObjectBase = srcBaseHandle;
if (!AddRule (
g_FileType,
actionStruct.ObjectBase,
srcHandle,
ActionGroup,
ActionFlags,
&actionStruct
)) {
__leave;
}
if (!DefaultPriority) {
AddRuleEx (
g_FileType,
actionStruct.ObjectBase,
srcHandle,
ACTIONGROUP_SPECIFICPRIORITY,
SrcPriority?ACTION_PRIORITYSRC:ACTION_PRIORITYDEST,
NULL,
RULEGROUP_PRIORITY
);
IsmHookEnumeration (
g_RegType,
srcHandle,
ObjectPriority,
0,
NULL
);
}
//
// Queue enumeration for include patterns
//
if (ActionGroup == ACTIONGROUP_INCLUDE) {
if (IsmIsObjectHandleLeafOnly (srcHandle)) {
DEBUGMSG ((
DBG_SCRIPT,
"File node %s leaf %s triggered enumeration of entire file system",
Node,
Leaf
));
QueueAllFiles();
IsmHookEnumeration (
g_FileType,
srcHandle,
g_VcmMode ? GatherVirtualComputer : PrepareActions,
0,
NULL
);
} else {
IsmQueueEnumeration (
g_FileType,
srcHandle,
g_VcmMode ? GatherVirtualComputer : PrepareActions,
0,
NULL
);
}
}
result = TRUE;
}
__finally {
IsmDestroyObjectHandle (srcHandle);
INVALID_POINTER (srcHandle);
IsmDestroyObjectHandle (srcBaseHandle);
INVALID_POINTER (srcBaseHandle);
}
return result;
}
BOOL
pParseFilesAndFolders (
IN UINT Group,
IN ACTIONGROUP ActionGroup,
IN DWORD ActionFlags,
IN BOOL HasNode,
IN BOOL HasLeaf,
IN BOOL HasPriority
)
{
MIG_COMPONENT_ENUM e;
BOOL result = FALSE;
PCTSTR node;
PCTSTR leaf;
PTSTR copyOfData = NULL;
PTSTR p;
BOOL defaultPriority = TRUE;
BOOL srcPriority = FALSE;
__try {
//
// Enumerate all the components
//
if (IsmEnumFirstComponent (&e, COMPONENTENUM_ENABLED|COMPONENTENUM_ALIASES, Group)) {
do {
//
// Parse string into node/leaf format
//
if (e.MasterGroup != MASTERGROUP_FILES_AND_FOLDERS) {
continue;
}
copyOfData = DuplicateText (e.LocalizedAlias);
node = copyOfData;
leaf = NULL;
if (HasNode && HasLeaf) {
p = (PTSTR) FindLastWack (copyOfData);
if (p) {
leaf = _tcsinc (p);
*p = 0;
}
} else if (!HasNode) {
node = NULL;
leaf = JoinText (TEXT("*."), copyOfData);
}
//
// Add rule
//
if (!pAddFileSpec (
node,
leaf,
(HasNode && (!HasLeaf)),
(HasNode && (!HasLeaf)) || (!HasNode),
ActionGroup,
ActionFlags,
defaultPriority,
srcPriority
)) {
IsmAbortComponentEnum (&e);
__leave;
}
if (!HasNode) {
FreeText (leaf);
}
FreeText (copyOfData);
copyOfData = NULL;
} while (IsmEnumNextComponent (&e));
}
result = TRUE;
}
__finally {
FreeText (copyOfData);
if (!result) {
IsmAbortComponentEnum (&e);
}
}
return result;
}
BOOL
pSelectFilesAndFolders (
VOID
)
{
if (!pParseFilesAndFolders (
COMPONENT_EXTENSION,
ACTIONGROUP_INCLUDE,
ACTION_PERSIST,
FALSE,
TRUE,
TRUE
)) {
return FALSE;
}
if (!pParseFilesAndFolders (
COMPONENT_FOLDER,
ACTIONGROUP_INCLUDE,
ACTION_PERSIST,
TRUE,
FALSE,
TRUE
)) {
return FALSE;
}
if (!pParseFilesAndFolders (
COMPONENT_FILE,
ACTIONGROUP_INCLUDE,
ACTION_PERSIST,
TRUE,
TRUE,
TRUE
)) {
return FALSE;
}
return TRUE;
}
BOOL
pParseAllInfs (
IN BOOL PreParse
)
{
PTSTR multiSz = NULL;
MULTISZ_ENUM e;
UINT sizeNeeded;
HINF infHandle = INVALID_HANDLE_VALUE;
ENVENTRY_TYPE dataType;
BOOL result = FALSE;
if (IsmGetEnvironmentValue (
IsmGetRealPlatform (),
NULL,
S_GLOBAL_INF_HANDLE,
(PBYTE)(&infHandle),
sizeof (HINF),
&sizeNeeded,
&dataType
) &&
(sizeNeeded == sizeof (HINF)) &&
(dataType == ENVENTRY_BINARY)
) {
if (pParseInf (infHandle, PreParse)) {
result = TRUE;
}
InfNameHandle (infHandle, NULL, FALSE);
} else {
if (!IsmGetEnvironmentValue (IsmGetRealPlatform (), NULL, S_INF_FILE_MULTISZ, NULL, 0, &sizeNeeded, NULL)) {
return TRUE; // no INF files specified
}
__try {
multiSz = AllocText (sizeNeeded);
if (!multiSz) {
__leave;
}
if (!IsmGetEnvironmentValue (IsmGetRealPlatform (), NULL, S_INF_FILE_MULTISZ, (PBYTE) multiSz, sizeNeeded, NULL, NULL)) {
__leave;
}
if (EnumFirstMultiSz (&e, multiSz)) {
do {
infHandle = InfOpenInfFile (e.CurrentString);
if (infHandle != INVALID_HANDLE_VALUE) {
if (!pParseInf (infHandle, PreParse)) {
InfCloseInfFile (infHandle);
infHandle = INVALID_HANDLE_VALUE;
__leave;
}
} else {
LOG ((LOG_ERROR, (PCSTR) MSG_CANT_OPEN_INF, e.CurrentString));
}
InfCloseInfFile (infHandle);
infHandle = INVALID_HANDLE_VALUE;
} while (EnumNextMultiSz (&e));
}
result = TRUE;
}
__finally {
if (multiSz) {
FreeText (multiSz);
multiSz = NULL;
}
}
}
return result;
}