413 lines
9.1 KiB
C
413 lines
9.1 KiB
C
/*++
|
|
|
|
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;
|
|
}
|
|
|