windows-nt/Source/XPSP1/NT/windows/winstate/cobra/modules/sysmod/entry.c
2020-09-26 16:20:57 +08:00

379 lines
8.3 KiB
C

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
entry.c
Abstract:
Implements the DLL entry point that provides all Cobra module entry points
to the engine.
Author:
Jim Schmidt (jimschm) 11-Aug-2000
Revision History:
<alias> <date> <comments>
--*/
#include "pch.h"
#include "sysmod.h"
#define NOPARSE NULL
#define NOQUEUE NULL
#define NOINIT NULL
#define NOTERMINATE NULL
#define NOHIGHPRIQUEUE NULL
#define NOEXECUTE NULL
#define NOPROGBAR NULL
#define NONOTIFY NULL
#define NO_SGM NOINIT,NOPARSE,NOQUEUE,NOHIGHPRIQUEUE,NOTERMINATE
#define NO_SAM NOINIT,NOEXECUTE,NOPROGBAR,NOTERMINATE
#define NO_DGM NOINIT,NOQUEUE,NOHIGHPRIQUEUE,NOTERMINATE
#define NO_DAM NOINIT,NOEXECUTE,NOPROGBAR,NOTERMINATE
#define NO_CSM NOINIT,NOEXECUTE,NOPROGBAR,NOTERMINATE
#define NO_OPM NOINIT,NOTERMINATE
typedef struct {
PCTSTR Name;
TYPE_ENTRYPOINTS EntryPoints;
} ETM_TABLE, *PETM_TABLE;
typedef struct {
PCTSTR Name;
VIRTUAL_COMPUTER_ENTRYPOINTS EntryPoints;
} VCM_TABLE, *PVCM_TABLE;
typedef struct {
PCTSTR Name;
SOURCE_ENTRYPOINTS EntryPoints;
} SOURCE_TABLE, *PSOURCE_TABLE;
typedef struct {
PCTSTR Name;
DESTINATION_ENTRYPOINTS EntryPoints;
} DESTINATION_TABLE, *PDESTINATION_TABLE;
//
// Add an entry for each ETM module in the DLL
//
ETM_TABLE g_EtmEntryPoints[] = {
{ TEXT("ACCESSIBILITY"), ISM_VERSION,
AccessibilityEtmInitialize, NOPARSE, NOTERMINATE, NONOTIFY
},
{ TEXT("COOKIES"), ISM_VERSION,
CookiesEtmInitialize, NOPARSE, NOTERMINATE, CookiesEtmNewUserCreated
},
{ TEXT("NETDRIVES"), ISM_VERSION,
NetDrivesEtmInitialize, NOPARSE, NOTERMINATE, NetDrivesEtmNewUserCreated
},
{ TEXT("NETSHARES"), ISM_VERSION,
NetSharesEtmInitialize, NOPARSE, NOTERMINATE, NONOTIFY
},
{ TEXT("PRINTERS"), ISM_VERSION,
PrintersEtmInitialize, NOPARSE, NOTERMINATE, PrintersEtmNewUserCreated
},
{ TEXT("RAS"), ISM_VERSION,
RasMigEtmInitialize, NOPARSE, NOTERMINATE, NONOTIFY
},
{NULL}
};
//
// Add an entry for each VCM module in the DLL
//
VCM_TABLE g_VcmEntryPoints[] = {
{ TEXT("ACCESSIBILITY"), ISM_VERSION,
AccessibilitySourceInitialize, NOPARSE, NOQUEUE, NOHIGHPRIQUEUE, NOTERMINATE
},
{ TEXT("COOKIES"), ISM_VERSION,
CookiesSourceInitialize, CookiesVcmParse, CookiesVcmQueueEnumeration, NOHIGHPRIQUEUE, NOTERMINATE
},
{ TEXT("LNKMIG"), ISM_VERSION,
LnkMigVcmInitialize, NOPARSE, LnkMigVcmQueueEnumeration, NOHIGHPRIQUEUE, NOTERMINATE
},
{ TEXT("NETDRIVES"), ISM_VERSION,
NetDrivesVcmInitialize, NetDrivesVcmParse, NetDrivesVcmQueueEnumeration, NOHIGHPRIQUEUE, NOTERMINATE
},
{ TEXT("NETSHARES"), ISM_VERSION,
NetSharesVcmInitialize, NetSharesVcmParse, NetSharesVcmQueueEnumeration, NOHIGHPRIQUEUE, NOTERMINATE
},
{ TEXT("OSFILES"), ISM_VERSION,
OsFilesVcmInitialize, NOPARSE, OsFilesVcmQueueEnumeration, OsFilesVcmQueueHighPriorityEnumeration, NOTERMINATE
},
{ TEXT("PRINTERS"), ISM_VERSION,
PrintersVcmInitialize, PrintersVcmParse, PrintersVcmQueueEnumeration, NOHIGHPRIQUEUE, NOTERMINATE
},
{ TEXT("RAS"), ISM_VERSION,
RasMigVcmInitialize, RasMigVcmParse, RasMigVcmQueueEnumeration, NOHIGHPRIQUEUE, NOTERMINATE
},
{NULL}
};
//
// Add an entry for each source module in the DLL
//
SOURCE_TABLE g_SourceEntryPoints[] = {
{ TEXT("ACCESSIBILITY"), ISM_VERSION,
(PSGMINITIALIZE) AccessibilitySourceInitialize, NOPARSE, NOQUEUE, NOHIGHPRIQUEUE, NOTERMINATE,
NO_SAM
},
{ TEXT("COOKIES"), ISM_VERSION,
(PSGMINITIALIZE) CookiesSourceInitialize, CookiesSgmParse, CookiesSgmQueueEnumeration, NOHIGHPRIQUEUE, NOTERMINATE,
NO_SAM
},
{ TEXT("LNKMIG"), ISM_VERSION,
LnkMigSgmInitialize, NOPARSE, LnkMigSgmQueueEnumeration, NOHIGHPRIQUEUE, NOTERMINATE,
NO_SAM
},
{ TEXT("NETDRIVES"), ISM_VERSION,
NetDrivesSgmInitialize, NetDrivesSgmParse, NetDrivesSgmQueueEnumeration, NOHIGHPRIQUEUE, NOTERMINATE,
NO_SAM
},
{ TEXT("NETSHARES"), ISM_VERSION,
NetSharesSgmInitialize, NetSharesSgmParse, NetSharesSgmQueueEnumeration, NOHIGHPRIQUEUE, NOTERMINATE,
NO_SAM
},
{ TEXT("OSFILES"), ISM_VERSION,
OsFilesSgmInitialize, NOPARSE, OsFilesSgmQueueEnumeration, OsFilesSgmQueueHighPriorityEnumeration, NOTERMINATE,
NO_SAM
},
{ TEXT("PRINTERS"), ISM_VERSION,
PrintersSgmInitialize, PrintersSgmParse, PrintersSgmQueueEnumeration, NOHIGHPRIQUEUE, NOTERMINATE,
NO_SAM
},
{ TEXT("RAS"), ISM_VERSION,
RasMigSgmInitialize, RasMigSgmParse, RasMigSgmQueueEnumeration, NOHIGHPRIQUEUE, NOTERMINATE,
NO_SAM
},
{NULL}
};
//
// Add an entry for each destination module in the DLL
//
DESTINATION_TABLE g_DestinationEntryPoints[] = {
{ TEXT("ACCESSIBILITY"), ISM_VERSION,
NO_DGM, NO_DAM, NO_CSM, NO_OPM
},
{ TEXT("LNKMIG"), ISM_VERSION,
NO_DGM, NO_DAM, NO_CSM,
LnkMigOpmInitialize, NOTERMINATE
},
{ TEXT("NETDRIVES"), ISM_VERSION,
NO_DGM, NO_DAM,
NetDrivesCsmInitialize, NetDrivesCsmExecute, NOPROGBAR, NOTERMINATE,
NetDrivesOpmInitialize, NOTERMINATE
},
{ TEXT("RAS"), ISM_VERSION,
NO_DGM, NO_DAM, NO_CSM,
RasMigOpmInitialize, NOTERMINATE
},
{NULL}
};
EXPORT
BOOL
WINAPI
DllMain (
IN HINSTANCE hInstance,
IN DWORD dwReason,
IN LPVOID lpReserved
)
{
if (dwReason == DLL_PROCESS_ATTACH) {
g_hInst = hInstance;
}
return TRUE;
}
EXPORT
BOOL
WINAPI
ModuleInitialize (
VOID
)
{
TCHAR memDbDir[MAX_PATH];
UtInitialize (NULL);
FileEnumInitialize ();
RegInitialize (); // for accessibility and ras
InfGlobalInit (FALSE); // for os files
IsmGetTempDirectory (memDbDir, ARRAYSIZE (memDbDir));
if (!MemDbInitializeEx (memDbDir)) {
DEBUGMSG ((DBG_ERROR, "Failing to initialize unc transports because MemDb failed to initialize"));
IsmSetCancel();
return FALSE;
}
#define DEFMAC(prefix) if (!prefix##Initialize()) return FALSE;
MODULE_LIST
#undef DEFMAC
return TRUE;
}
EXPORT
VOID
WINAPI
ModuleTerminate (
VOID
)
{
#define DEFMAC(prefix) prefix##Terminate();
MODULE_LIST
#undef DEFMAC
InfGlobalInit (TRUE);
RegTerminate ();
MemDbTerminateEx (TRUE);
FileEnumTerminate ();
UtTerminate ();
}
BOOL
WINAPI
pFindModule (
IN PCTSTR ModuleId,
OUT PVOID IsmBuffer,
IN PCTSTR *TableEntry,
IN UINT StructureSize
)
{
while (*TableEntry) {
if (StringIMatch (*TableEntry, ModuleId)) {
CopyMemory (
IsmBuffer,
(PBYTE) (TableEntry + 1),
StructureSize
);
return TRUE;
}
TableEntry = (PCTSTR *) ((PBYTE) (TableEntry + 1) + StructureSize);
}
return FALSE;
}
EXPORT
BOOL
WINAPI
TypeModule (
IN PCTSTR ModuleId,
IN OUT PTYPE_ENTRYPOINTS TypeEntryPoints
)
{
return pFindModule (
ModuleId,
(PVOID) TypeEntryPoints,
(PCTSTR *) g_EtmEntryPoints,
sizeof (TYPE_ENTRYPOINTS)
);
}
EXPORT
BOOL
WINAPI
VirtualComputerModule (
IN PCTSTR ModuleId,
IN OUT PVIRTUAL_COMPUTER_ENTRYPOINTS VirtualComputerEntryPoints
)
{
return pFindModule (
ModuleId,
(PVOID) VirtualComputerEntryPoints,
(PCTSTR *) g_VcmEntryPoints,
sizeof (VIRTUAL_COMPUTER_ENTRYPOINTS)
);
}
EXPORT
BOOL
WINAPI
SourceModule (
IN PCTSTR ModuleId,
IN OUT PSOURCE_ENTRYPOINTS SourceEntryPoints
)
{
return pFindModule (
ModuleId,
(PVOID) SourceEntryPoints,
(PCTSTR *) g_SourceEntryPoints,
sizeof (SOURCE_ENTRYPOINTS)
);
}
EXPORT
BOOL
WINAPI
DestinationModule (
IN PCTSTR ModuleId,
IN OUT PDESTINATION_ENTRYPOINTS DestinationEntryPoints
)
{
return pFindModule (
ModuleId,
(PVOID) DestinationEntryPoints,
(PCTSTR *) g_DestinationEntryPoints,
sizeof (DESTINATION_ENTRYPOINTS)
);
}