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.
 
 
 
 
 
 

412 lines
9.1 KiB

/*++
Copyright (c) 1997-1999 Microsoft Corporation
Module Name:
dbaction.c
Abstract:
This source implements action functions used by MigDb. There are two types
of action functions here as the third parameter of the macro list is TRUE
or FALSE.
First type of action function is called whenever an action is triggered
during file scanning. The second type of action function is called at the
end of file scanning if the associated action was not triggered during
file scanning phase.
Author:
Calin Negreanu (calinn) 07-Jan-1998
Revision History:
marcw 31-Aug-1999 Added BlockingHardware
ovidiut 20-Jul-1999 Added Ignore
ovidiut 28-May-1999 Added IniFileMappings
marcw 23-Sep-1998 Added BlockingVirusScanner
jimschm 13-Aug-1998 Added CompatibleFiles
jimschm 19-May-1998 Added MinorProblems_NoLinkRequired
jimschm 27-Feb-1998 Added UninstallSections
calinn 18-Jan-1998 Added CompatibleModules action
--*/
#include "pch.h"
#include "logmsg.h"
#include "osfiles.h"
/*++
Macro Expansion List Description:
GATHER_DATA_FUNCTIONS and ACTION_FUNCTIONS lists all valid actions to be performed
by migdb when a context is met. Meeting a context means that all the sections
associated with the context are satisfied (usually there is only one section).
The difference is that GATHER_DATA_FUNCTIONS are called even if some function already
handles a file.
Line Syntax:
DEFMAC(ActionFn, ActionName, CallWhenTriggered, CanHandleVirtualFiles)
Arguments:
ActionFn - This is a boolean function that returnes TRUE if the specified action
could be performed. It should return FALSE only if a serious error
occures. You must implement a function with this name and required
parameters.
ActionName - This is the string that identifies the action function. It should
have the same value as listed in migdb.inf. This arg is declared
as both a macro and the migdb.inf section name string.
PatternFormat - The format in the INF for this section is the pattern format. The non
pattern format is the file name followed by the attributes. The pattern
format is the leaf pattern, node pattern and then the attributes.
CallWhenTriggered - If the MigDbContext this action is associated with is triggered
the action will be called if this field is TRUE, otherwise we will call
the action at the end of file scan if the context was not triggered.
CanHandleVirtualFiles - This is for treating files that are supposed to be in a fixed place
but are not there (not installed or deleted). We need this in order to fix
registry or links that point to this kind of files. A good example is backup.exe
which is located in %ProgramFiles%\Accessories. The rules say that we should
use ntbackup.exe instead but since this file is not existent we don't normalle fix
registry settings pointing to this file. We do now, with this new variable
Variables Generated From List:
g_ActionFunctions - do not touch!
For accessing the array there are the following functions:
MigDb_GetActionAddr
MigDb_GetActionIdx
MigDb_GetActionName
--*/
/*
Declare the macro list of action functions. If you need to add a new action just
add a line in this list and implement the function.
*/
#define ACTION_FUNCTIONS \
DEFMAC(OsFiles, TEXT("OsFiles"), FALSE, TRUE, TRUE) \
DEFMAC(OsFiles, TEXT("OsFilesPattern"), TRUE, TRUE, TRUE) \
DEFMAC(NonCritical, TEXT("NonCriticalFiles"), TRUE, TRUE, TRUE) \
DEFMAC(OsFilesExcluded, TEXT("OsFilesExcluded"), TRUE, TRUE, TRUE) \
/*
Declare the action functions
*/
#define DEFMAC(fn,id,pat,trig,call) ACTION_PROTOTYPE fn;
ACTION_FUNCTIONS
#undef DEFMAC
/*
This is the structure used for handling action functions
*/
typedef struct {
PCTSTR ActionName;
PACTION_PROTOTYPE ActionFunction;
BOOL PatternFormat;
BOOL CallWhenTriggered;
BOOL CallAlways;
} ACTION_STRUCT, *PACTION_STRUCT;
/*
Declare a global array of functions and name identifiers for action functions
*/
#define DEFMAC(fn,id,pat,trig,call) {id,fn,pat,trig,call},
static ACTION_STRUCT g_ActionFunctions[] = {
ACTION_FUNCTIONS
{NULL, NULL, FALSE, FALSE, FALSE}
};
#undef DEFMAC
PACTION_PROTOTYPE
MigDb_GetActionAddr (
IN INT ActionIdx
)
/*++
Routine Description:
MigDb_GetActionAddr returns the address of the action function based on the action index
Arguments:
ActionIdx - Action index.
Return value:
Action function address. Note that no checking is made so the address returned could be invalid.
This is not a problem since the parsing code did the right job.
--*/
{
return g_ActionFunctions[ActionIdx].ActionFunction;
}
INT
MigDb_GetActionIdx (
IN PCTSTR ActionName
)
/*++
Routine Description:
MigDb_GetActionIdx returns the action index based on the action name
Arguments:
ActionName - Action name.
Return value:
Action index. If the name is not found, the index returned is -1.
--*/
{
PACTION_STRUCT p = g_ActionFunctions;
INT i = 0;
while (p->ActionName != NULL) {
if (StringIMatch (p->ActionName, ActionName)) {
return i;
}
p++;
i++;
}
return -1;
}
PCTSTR
MigDb_GetActionName (
IN INT ActionIdx
)
/*++
Routine Description:
MigDb_GetActionName returns the name of an action based on the action index
Arguments:
ActionIdx - Action index.
Return value:
Action name. Note that no checking is made so the returned pointer could be invalid.
This is not a problem since the parsing code did the right job.
--*/
{
return g_ActionFunctions[ActionIdx].ActionName;
}
BOOL
MigDb_IsPatternFormat (
IN INT ActionIdx
)
/*++
Routine Description:
MigDb_IsPatternFormat is called when we try to find what is the section format.
Arguments:
ActionIdx - Action index.
Return value:
TRUE if the format is pattern like, FALSE otherwise.
--*/
{
return g_ActionFunctions[ActionIdx].PatternFormat;
}
BOOL
MigDb_CallWhenTriggered (
IN INT ActionIdx
)
/*++
Routine Description:
MigDb_CallWhenTriggered is called every time when an action is triggered. Will return
TRUE is the associated action function needs to be called, FALSE otherwise.
Arguments:
ActionIdx - Action index.
Return value:
TRUE if the associated action function needs to be called, FALSE otherwise.
--*/
{
return g_ActionFunctions[ActionIdx].CallWhenTriggered;
}
BOOL
MigDb_CallAlways (
IN INT ActionIdx
)
/*++
Routine Description:
MigDb_CallAlways returnes if an action should be called regardless of handled state.
Arguments:
ActionIdx - Action index.
Return value:
TRUE if the associated action should be called every time.
--*/
{
return g_ActionFunctions[ActionIdx].CallAlways;
}
BOOL
OsFiles (
IN PMIGDB_CONTEXT Context
)
/*++
Routine Description:
This is the action taken when an OS file is found. Basically the file gets deleted to
make room for NT version.
Arguments:
Context - See definition.
Return value:
TRUE - if operation was successful
FALSE - otherwise
--*/
{
MULTISZ_ENUM fileEnum;
if (EnumFirstMultiSz (&fileEnum, (PCTSTR) Context->FileList.Buf)) {
do {
IsmSetAttributeOnObject (
MIG_FILE_TYPE,
fileEnum.CurrentString,
g_OsFileAttribute
);
}
while (EnumNextMultiSz (&fileEnum));
}
return TRUE;
}
BOOL
NonCritical (
IN PMIGDB_CONTEXT Context
)
/*++
Routine Description:
This is the action taken when an non critical file is found.
We are calling ISM to mark this file as NonCritical
Arguments:
Context - See definition.
Return value:
TRUE - if operation was successful
FALSE - otherwise
--*/
{
MULTISZ_ENUM fileEnum;
if (EnumFirstMultiSz (&fileEnum, (PCTSTR) Context->FileList.Buf)) {
do {
IsmMakeNonCriticalObject (
MIG_FILE_TYPE,
fileEnum.CurrentString
);
}
while (EnumNextMultiSz (&fileEnum));
}
return TRUE;
}
BOOL
OsFilesExcluded (
IN PMIGDB_CONTEXT Context
)
/*++
Routine Description:
This is the action taken when an file that is not an OS file is found.
Since this file might have the OS file attribute (due to patterns in os files)
we are calling ISM to remove the OsFile attribute from this file
Arguments:
Context - See definition.
Return value:
TRUE - if operation was successful
FALSE - otherwise
--*/
{
MULTISZ_ENUM fileEnum;
if (EnumFirstMultiSz (&fileEnum, (PCTSTR) Context->FileList.Buf)) {
do {
IsmClearAttributeOnObject (
MIG_FILE_TYPE,
fileEnum.CurrentString,
g_OsFileAttribute
);
}
while (EnumNextMultiSz (&fileEnum));
}
return TRUE;
}