windows-nt/Source/XPSP1/NT/base/ntsetup/win95upg/migdlls/setup/plus95.c
2020-09-26 16:20:57 +08:00

229 lines
5.9 KiB
C

/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
plus95.c
Abstract:
This source file implements the operations needed to properly migrate Plus!95 from
Windows 9x to Windows NT. This is part of the Setup Migration DLL.
Author:
Calin Negreanu (calinn) 15-Mar-1999
Revision History:
--*/
#include "pch.h"
#define S_MIGRATION_PATHS "Migration Paths"
#define S_PLUS95_FILE "JPEGIM32.FLT"
#define MEMDB_CATEGORY_PLUS95A "Plus95"
#define MEMDB_CATEGORY_PLUS95W L"Plus95"
#define S_COMPANYNAME "CompanyName"
#define S_PRODUCTVER "ProductVersion"
#define S_PLUS95_COMPANYNAME1 "Microsoft*"
#define S_PLUS95_PRODUCTVER1 "6.*"
#define S_PLUS95_FILEW L"JPEGIM32.FLT"
static GROWBUFFER g_FilesBuff = GROWBUF_INIT;
BOOL
Plus95_Attach (
IN HINSTANCE DllInstance
)
{
return TRUE;
}
BOOL
Plus95_Detach (
IN HINSTANCE DllInstance
)
{
FreeGrowBuffer (&g_FilesBuff);
return TRUE;
}
LONG
Plus95_QueryVersion (
IN PCSTR *ExeNamesBuf
)
{
HKEY key = NULL;
PCTSTR fullFileName = NULL;
PCTSTR fileName = NULL;
DWORD result = ERROR_SUCCESS;
MultiSzAppendA (&g_FilesBuff, S_PLUS95_FILE);
*ExeNamesBuf = g_FilesBuff.Buf;
return result;
}
LONG
Plus95_Initialize9x (
IN PCSTR WorkingDirectory,
IN PCSTR SourceDirectories
)
{
INFSTRUCT context = INITINFSTRUCT_GROWBUFFER;
PCSTR fullFileName = NULL;
PCSTR fileName = NULL;
PCSTR companyName = NULL;
PCSTR productVer = NULL;
LONG result = ERROR_NOT_INSTALLED;
//
// Let's find out where are our files located
//
if (g_MigrateInf != INVALID_HANDLE_VALUE) {
if (InfFindFirstLineA (g_MigrateInf, S_MIGRATION_PATHS, NULL, &context)) {
do {
fullFileName = InfGetStringFieldA (&context, 1);
if (fullFileName) {
__try {
fileName = GetFileNameFromPathA (fullFileName);
if (StringIMatchA (fileName, S_PLUS95_FILE)) {
companyName = QueryVersionEntry (fullFileName, S_COMPANYNAME);
if ((!companyName) ||
(!IsPatternMatchA (S_PLUS95_COMPANYNAME1, companyName))
) {
continue;
}
productVer = QueryVersionEntry (fullFileName, S_PRODUCTVER);
if ((!productVer) ||
(!IsPatternMatchA (S_PLUS95_PRODUCTVER1, productVer))
) {
continue;
}
result = ERROR_SUCCESS;
MemDbSetValueExA (MEMDB_CATEGORY_PLUS95A, fullFileName, NULL, NULL, 0, NULL);
FreePathStringA (productVer);
productVer = NULL;
FreePathStringA (companyName);
companyName = NULL;
}
}
__finally {
if (productVer) {
FreePathStringA (productVer);
productVer = NULL;
}
if (companyName) {
FreePathStringA (companyName);
companyName = NULL;
}
}
}
} while (InfFindNextLine (&context));
InfCleanUpInfStruct (&context);
}
if (result == ERROR_NOT_INSTALLED) {
DEBUGMSGA ((DBG_VERBOSE, "Plus!95 migration DLL: Could not find needed files."));
}
} else {
DEBUGMSGA ((DBG_ERROR, "Plus!95 migration DLL: Could not open MIGRATE.INF."));
}
return result;
}
LONG
Plus95_MigrateUser9x (
IN HWND ParentWnd,
IN PCSTR UnattendFile,
IN HKEY UserRegKey,
IN PCSTR UserName
)
{
return ERROR_NOT_INSTALLED;
}
LONG
Plus95_MigrateSystem9x (
IN HWND ParentWnd,
IN PCSTR UnattendFile
)
{
MEMDB_ENUMA e;
CHAR pattern[MEMDB_MAX];
// Handle all files from MEMDB_CATEGORY_PLUS95
MemDbBuildKeyA (pattern, MEMDB_CATEGORY_PLUS95A, "*", NULL, NULL);
if (MemDbEnumFirstValueA (&e, pattern, MEMDB_ALL_SUBLEVELS, MEMDB_ENDPOINTS_ONLY)) {
do {
// write this file to Handled
if (!WritePrivateProfileStringA (S_HANDLED, e.szName, "FILE", g_MigrateInfPath)) {
DEBUGMSGA ((DBG_ERROR, "Plus!95 migration DLL: Could not write one or more handled files."));
}
} while (MemDbEnumNextValueA (&e));
}
return ERROR_SUCCESS;
}
LONG
Plus95_InitializeNT (
IN PCWSTR WorkingDirectory,
IN PCWSTR SourceDirectories
)
{
PWSTR DllLocation;
MEMDB_ENUMW e;
WCHAR pattern[MEMDB_MAX];
DllLocation = JoinPathsW (WorkingDirectory, S_PLUS95_FILEW);
if (!DoesFileExistW (DllLocation)) {
FreePathStringW (DllLocation);
DEBUGMSG ((DBG_ERROR, "Plus!95 migration DLL: Could not find required file."));
return ERROR_SUCCESS;
}
// replace all files from MEMDB_CATEGORY_PLUS95
MemDbBuildKeyW (pattern, MEMDB_CATEGORY_PLUS95W, L"*", NULL, NULL);
if (MemDbEnumFirstValueW (&e, pattern, MEMDB_ALL_SUBLEVELS, MEMDB_ENDPOINTS_ONLY)) {
do {
if (!CopyFileW (DllLocation, e.szName, FALSE)) {
DEBUGMSGW ((DBG_ERROR, "Plus!95 migration DLL: Could not replace one or more handled files."));
}
} while (MemDbEnumNextValueW (&e));
}
return ERROR_SUCCESS;
}
LONG
Plus95_MigrateUserNT (
IN HINF UnattendFile,
IN HKEY UserRegKey,
IN PCWSTR UserName
)
{
return ERROR_SUCCESS;
}
LONG
Plus95_MigrateSystemNT (
IN HINF UnattendFile
)
{
return ERROR_SUCCESS;
}