229 lines
5.9 KiB
C
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;
|
|
}
|
|
|