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.
1359 lines
31 KiB
1359 lines
31 KiB
/*++
|
|
|
|
Copyright (c) 1997 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
w9xtool.c
|
|
|
|
Abstract:
|
|
|
|
Implements a stub tool that is designed to run with Win9x-side
|
|
upgrade code.
|
|
|
|
Author:
|
|
|
|
<full name> (<alias>) <date>
|
|
|
|
Revision History:
|
|
|
|
<alias> <date> <comments>
|
|
|
|
--*/
|
|
|
|
#include "pch.h"
|
|
#include "shellapi.h"
|
|
|
|
typedef enum {
|
|
HW_INCOMPATIBLE,
|
|
HW_REINSTALL,
|
|
HW_UNSUPPORTED
|
|
} HWTYPES;
|
|
|
|
#define REPORTLEVEL_NONE 0
|
|
#define REPORTLEVEL_BLOCKING 1
|
|
#define REPORTLEVEL_ERROR 2
|
|
#define REPORTLEVEL_WARNING 3
|
|
#define REPORTLEVEL_INFORMATION 4
|
|
#define REPORTLEVEL_VERBOSE 5
|
|
|
|
BOOL
|
|
SaveReport (
|
|
IN HWND Parent, OPTIONAL
|
|
IN PCTSTR Path OPTIONAL
|
|
);
|
|
BOOL
|
|
InitCompatTable (
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
pExcludeDrive (
|
|
IN PTSTR Drive,
|
|
IN DWORD MsgId OPTIONAL
|
|
);
|
|
|
|
VOID
|
|
pAddIncompatibilityAlert (
|
|
DWORD MessageId,
|
|
PCTSTR Share,
|
|
PCTSTR Path
|
|
);
|
|
|
|
VOID
|
|
MsgSettingsIncomplete (
|
|
IN PCTSTR UserDatPath,
|
|
IN PCTSTR UserName, OPTIONAL
|
|
IN BOOL CompletelyBusted
|
|
);
|
|
|
|
BOOL
|
|
Init (
|
|
VOID
|
|
)
|
|
{
|
|
HINSTANCE hInstance;
|
|
|
|
hInstance = GetModuleHandle (NULL);
|
|
|
|
return InitToolMode (hInstance);
|
|
}
|
|
|
|
VOID
|
|
Terminate (
|
|
VOID
|
|
)
|
|
{
|
|
HINSTANCE hInstance;
|
|
|
|
hInstance = GetModuleHandle (NULL);
|
|
|
|
TerminateToolMode (hInstance);
|
|
}
|
|
|
|
VOID RegisterTextViewer (VOID);
|
|
|
|
WNDPROC g_Proc;
|
|
|
|
LRESULT
|
|
pWrapperProc (
|
|
IN HWND Hwnd,
|
|
IN UINT Msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
)
|
|
{
|
|
|
|
if (Msg == WM_CLOSE) {
|
|
PostQuitMessage (0);
|
|
}
|
|
|
|
return g_Proc (Hwnd, Msg, wParam, lParam);
|
|
}
|
|
|
|
|
|
VOID
|
|
pAddChangedUserName (
|
|
PCTSTR DisplayGroupName,
|
|
PCTSTR OriginalName,
|
|
PCTSTR NewName
|
|
)
|
|
{
|
|
PCTSTR argArray[3];
|
|
PCTSTR blank;
|
|
PCTSTR rootGroup;
|
|
PCTSTR nameSubGroup;
|
|
PCTSTR baseGroup;
|
|
PCTSTR fullGroupName;
|
|
TCHAR encodedName[256];
|
|
|
|
argArray[0] = DisplayGroupName;
|
|
argArray[1] = OriginalName;
|
|
argArray[2] = NewName;
|
|
|
|
blank = GetStringResource (MSG_BLANK_NAME);
|
|
|
|
if (argArray[1][0] == 0) {
|
|
argArray[1] = blank;
|
|
}
|
|
|
|
if (argArray[2][0] == 0) {
|
|
argArray[2] = blank;
|
|
}
|
|
|
|
rootGroup = GetStringResource (MSG_INSTALL_NOTES_ROOT);
|
|
nameSubGroup = ParseMessageID (MSG_NAMECHANGE_WARNING_GROUP, argArray);
|
|
baseGroup = JoinPaths (rootGroup, nameSubGroup);
|
|
|
|
FreeStringResource (rootGroup);
|
|
FreeStringResource (nameSubGroup);
|
|
|
|
nameSubGroup = ParseMessageID (MSG_NAMECHANGE_WARNING_SUBCOMPONENT, argArray);
|
|
fullGroupName = JoinPaths (baseGroup, nameSubGroup);
|
|
FreePathString (baseGroup);
|
|
FreeStringResource (nameSubGroup);
|
|
|
|
encodedName[0] = TEXT('|');
|
|
StringCopy (encodedName + 1, OriginalName);
|
|
|
|
MsgMgr_ObjectMsg_Add(
|
|
encodedName, // Object name, prefixed with a pipe symbol
|
|
fullGroupName, // Message title
|
|
S_EMPTY // Message text
|
|
);
|
|
|
|
FreePathString (fullGroupName);
|
|
FreeStringResource (blank);
|
|
}
|
|
|
|
|
|
VOID
|
|
pAddDevice (
|
|
PCTSTR RegistryKey,
|
|
HWTYPES SupportedType,
|
|
PCTSTR DeviceDesc,
|
|
BOOL Online,
|
|
PCTSTR Class,
|
|
PCTSTR Mfg,
|
|
PCTSTR HardwareID,
|
|
PCTSTR FriendlyClass
|
|
)
|
|
{
|
|
PCTSTR argArray[6];
|
|
PCTSTR classAndName;
|
|
PCTSTR group;
|
|
UINT subGroup;
|
|
PCTSTR message;
|
|
BOOL unknownClass = FALSE;
|
|
PCTSTR modifiedDescription = NULL;
|
|
|
|
if (!Class) {
|
|
Class = GetStringResource (MSG_UNKNOWN_DEVICE_CLASS);
|
|
unknownClass = TRUE;
|
|
}
|
|
|
|
if (!Online) {
|
|
argArray[0] = DeviceDesc;
|
|
modifiedDescription = ParseMessageID (MSG_OFFLINE_DEVICE, argArray);
|
|
}
|
|
|
|
if (SupportedType == HW_INCOMPATIBLE) {
|
|
subGroup = MSG_INCOMPATIBLE_HARDWARE_PNP_SUBGROUP;
|
|
} else if (SupportedType == HW_REINSTALL) {
|
|
subGroup = MSG_REINSTALL_HARDWARE_PNP_SUBGROUP;
|
|
} else {
|
|
subGroup = MSG_UNSUPPORTED_HARDWARE_PNP_SUBGROUP;
|
|
}
|
|
|
|
argArray[0] = modifiedDescription ? modifiedDescription : DeviceDesc;
|
|
argArray[1] = S_EMPTY; // formerly Enumerator Text
|
|
argArray[2] = Class;
|
|
argArray[3] = Mfg;
|
|
argArray[4] = HardwareID;
|
|
argArray[5] = FriendlyClass;
|
|
|
|
classAndName = JoinPaths (argArray[5], argArray[0]);
|
|
|
|
group = BuildMessageGroup (
|
|
MSG_INCOMPATIBLE_HARDWARE_ROOT,
|
|
subGroup,
|
|
classAndName
|
|
);
|
|
|
|
FreePathString (classAndName);
|
|
|
|
message = ParseMessageID (MSG_HARDWARE_MESSAGE, argArray);
|
|
|
|
MsgMgr_ObjectMsg_Add (RegistryKey, group, message);
|
|
|
|
FreeStringResource (modifiedDescription);
|
|
FreeText (group);
|
|
FreeStringResource (message);
|
|
|
|
if (unknownClass) {
|
|
FreeStringResource (Class);
|
|
}
|
|
}
|
|
|
|
|
|
VOID
|
|
pBadOsVersion (
|
|
VOID
|
|
)
|
|
{
|
|
PCTSTR group = NULL;
|
|
PCTSTR message = NULL;
|
|
|
|
//
|
|
// Add a message to the Incompatibility Report.
|
|
//
|
|
|
|
group = BuildMessageGroup (MSG_BLOCKING_ITEMS_ROOT, MSG_UNKNOWN_OS_WARNING_SUBGROUP, NULL);
|
|
message = GetStringResource (MSG_UNKNOWN_OS);
|
|
|
|
MsgMgr_ObjectMsg_Add (TEXT("*UnknownOs"), group, message);
|
|
|
|
FreeText (group);
|
|
FreeStringResource (message);
|
|
}
|
|
|
|
|
|
VOID
|
|
pBlockingFile (
|
|
PCTSTR FileName,
|
|
PCTSTR SectNameForDisplay,
|
|
PCTSTR Message
|
|
)
|
|
{
|
|
|
|
PCTSTR group;
|
|
|
|
group = BuildMessageGroup (MSG_BLOCKING_ITEMS_ROOT, MSG_MUST_UNINSTALL_ROOT, SectNameForDisplay);
|
|
MsgMgr_ObjectMsg_Add (FileName, group, Message);
|
|
FreeText (group);
|
|
}
|
|
|
|
VOID
|
|
pBlockingHardware (
|
|
PCTSTR FileName,
|
|
PCTSTR SectNameForDisplay,
|
|
PCTSTR Message
|
|
)
|
|
{
|
|
PCTSTR group;
|
|
|
|
group = BuildMessageGroup (MSG_BLOCKING_ITEMS_ROOT, MSG_BLOCKING_HARDWARE_SUBGROUP, SectNameForDisplay);
|
|
MsgMgr_ObjectMsg_Add (FileName, group, Message);
|
|
FreeText (group);
|
|
}
|
|
|
|
|
|
VOID
|
|
pBackupDirs (
|
|
PCTSTR DirPath
|
|
)
|
|
{
|
|
PCTSTR backupDirsGroup;
|
|
|
|
backupDirsGroup = BuildMessageGroup (
|
|
MSG_INSTALL_NOTES_ROOT,
|
|
MSG_BACKUP_DETECTED_LIST_SUBGROUP,
|
|
DirPath
|
|
);
|
|
MsgMgr_ObjectMsg_Add(
|
|
DirPath,
|
|
backupDirsGroup,
|
|
S_EMPTY
|
|
);
|
|
|
|
FreeText (backupDirsGroup);
|
|
}
|
|
|
|
|
|
VOID
|
|
pManyBackupDirs (
|
|
UINT DirCount
|
|
)
|
|
{
|
|
PCTSTR backupDirsGroup;
|
|
PCTSTR argArray[2];
|
|
TCHAR buffer[32];
|
|
PCTSTR msg;
|
|
|
|
backupDirsGroup = BuildMessageGroup (
|
|
MSG_INSTALL_NOTES_ROOT,
|
|
MSG_BACKUP_DETECTED_SUBGROUP,
|
|
NULL
|
|
);
|
|
argArray[0] = "Windows 9X";
|
|
wsprintf (buffer, "%lu", DirCount);
|
|
argArray[1] = buffer;
|
|
msg = ParseMessageID (MSG_BACKUP_DETECTED, argArray);
|
|
|
|
MsgMgr_ObjectMsg_Add (
|
|
TEXT("*BackupDetected"),
|
|
backupDirsGroup,
|
|
msg
|
|
);
|
|
|
|
FreeStringResource (msg);
|
|
}
|
|
|
|
|
|
VOID
|
|
pHlpFile (
|
|
PCTSTR ModuleName,
|
|
PCTSTR HlpName,
|
|
PCTSTR FriendlyName,
|
|
PCTSTR Text
|
|
)
|
|
{
|
|
PCTSTR argList[3];
|
|
PCTSTR comp;
|
|
|
|
argList[0] = ModuleName;
|
|
argList[1] = HlpName;
|
|
argList[2] = FriendlyName;
|
|
|
|
comp = BuildMessageGroup (MSG_MINOR_PROBLEM_ROOT, MSG_HELPFILES_SUBGROUP, argList[2]);
|
|
|
|
MsgMgr_ObjectMsg_Add (HlpName, comp, Text);
|
|
FreeText (comp);
|
|
}
|
|
|
|
|
|
VOID
|
|
pProfileDir (
|
|
PCTSTR DirPath,
|
|
PCTSTR NewName
|
|
)
|
|
{
|
|
PCTSTR argArray[3];
|
|
PCTSTR message;
|
|
PCTSTR group;
|
|
|
|
argArray[0] = DirPath;
|
|
argArray[1] = NewName;
|
|
message = ParseMessageID (MSG_DIRECTORY_COLLISION_SUBCOMPONENT, argArray);
|
|
|
|
group = BuildMessageGroup (
|
|
MSG_INSTALL_NOTES_ROOT,
|
|
MSG_DIRECTORY_COLLISION_SUBGROUP,
|
|
message
|
|
);
|
|
|
|
MsgMgr_ObjectMsg_Add (TEXT("*RenameFolders"), group, S_EMPTY);
|
|
|
|
FreeText (group);
|
|
FreeStringResource (message);
|
|
}
|
|
|
|
|
|
VOID
|
|
pBadShell (
|
|
VOID
|
|
)
|
|
{
|
|
PCTSTR object;
|
|
PCTSTR message;
|
|
|
|
object = BuildMessageGroup (MSG_INSTALL_NOTES_ROOT, MSG_REPORT_SHELL_SUBGROUP, NULL);
|
|
message = GetStringResource (MSG_REPORT_SHELL_INCOMPATIBLE);
|
|
|
|
MsgMgr_ObjectMsg_Add (TEXT("*BadShell"), object, message);
|
|
|
|
FreeText (object);
|
|
FreeStringResource (message);
|
|
}
|
|
|
|
|
|
VOID
|
|
pBadScr (
|
|
PCTSTR FilePath,
|
|
PCTSTR SectLocalizedName, OPTIONAL
|
|
WORD ActType,
|
|
PCTSTR Message OPTIONAL
|
|
)
|
|
{
|
|
PTSTR friendlyName = NULL;
|
|
PTSTR extPtr = NULL;
|
|
PTSTR displayName = NULL;
|
|
PCTSTR reportEntry = NULL;
|
|
PTSTR component = NULL;
|
|
PCTSTR temp1, temp2;
|
|
BOOL reportEntryIsResource = TRUE;
|
|
|
|
if (SectLocalizedName) {
|
|
friendlyName = DuplicatePathString (SectLocalizedName, 0);
|
|
} else {
|
|
friendlyName = DuplicatePathString (GetFileNameFromPath (FilePath), 0);
|
|
extPtr = (PTSTR) GetFileExtensionFromPath (friendlyName);
|
|
if (extPtr != NULL) {
|
|
extPtr = _tcsdec (friendlyName, extPtr);
|
|
if (extPtr != NULL) {
|
|
*extPtr = 0;
|
|
}
|
|
}
|
|
|
|
displayName = (PTSTR)ParseMessageID (MSG_NICE_PATH_SCREEN_SAVER, &friendlyName);
|
|
|
|
FreePathString (friendlyName);
|
|
friendlyName = NULL;
|
|
}
|
|
|
|
switch (ActType) {
|
|
|
|
case ACT_REINSTALL:
|
|
temp1 = GetStringResource (MSG_REINSTALL_ROOT);
|
|
temp2 = GetStringResource (Message ? MSG_REINSTALL_DETAIL_SUBGROUP : MSG_REINSTALL_LIST_SUBGROUP);
|
|
|
|
reportEntry = JoinPaths (temp1, temp2);
|
|
reportEntryIsResource = FALSE;
|
|
|
|
FreeStringResource (temp1);
|
|
FreeStringResource (temp2);
|
|
break;
|
|
|
|
case ACT_REINSTALL_BLOCK:
|
|
temp1 = GetStringResource (MSG_BLOCKING_ITEMS_ROOT);
|
|
temp2 = GetStringResource (MSG_REINSTALL_BLOCK_ROOT);
|
|
|
|
reportEntry = JoinPaths (temp1, temp2);
|
|
reportEntryIsResource = FALSE;
|
|
|
|
FreeStringResource (temp1);
|
|
FreeStringResource (temp2);
|
|
break;
|
|
|
|
case ACT_MINORPROBLEMS:
|
|
reportEntry = GetStringResource (MSG_MINOR_PROBLEM_ROOT);
|
|
break;
|
|
|
|
case ACT_INCOMPATIBLE:
|
|
case ACT_INC_NOBADAPPS:
|
|
|
|
temp1 = GetStringResource (MSG_INCOMPATIBLE_ROOT);
|
|
temp2 = GetStringResource (Message ? MSG_INCOMPATIBLE_DETAIL_SUBGROUP : MSG_TOTALLY_INCOMPATIBLE_SUBGROUP);
|
|
reportEntry = JoinPaths (temp1, temp2);
|
|
reportEntryIsResource = FALSE;
|
|
|
|
FreeStringResource (temp1);
|
|
FreeStringResource (temp2);
|
|
|
|
break;
|
|
}
|
|
|
|
component = JoinPaths (reportEntry, displayName?displayName:friendlyName);
|
|
|
|
MsgMgr_ObjectMsg_Add (FilePath, component, Message);
|
|
|
|
FreePathString (component);
|
|
|
|
if (reportEntryIsResource) {
|
|
FreeStringResource (reportEntry);
|
|
} else {
|
|
FreePathString (reportEntry);
|
|
}
|
|
|
|
if (displayName) {
|
|
FreeStringResourcePtrA (&displayName);
|
|
}
|
|
|
|
FreePathString (friendlyName);
|
|
}
|
|
|
|
|
|
VOID
|
|
pBadCpl (
|
|
PCTSTR FilePath,
|
|
PCTSTR FriendlyNameMultiSz,
|
|
PCTSTR SectLocalizedName, OPTIONAL
|
|
WORD ActType,
|
|
PCTSTR Message OPTIONAL
|
|
)
|
|
{
|
|
GROWBUFFER friendlyName = GROWBUF_INIT;
|
|
MULTISZ_ENUM namesEnum;
|
|
PTSTR displayName = NULL;
|
|
PCTSTR reportEntry = NULL;
|
|
PTSTR component = NULL;
|
|
BOOL reportEntryIsResource = TRUE;
|
|
BOOL padName = FALSE;
|
|
PCTSTR temp1, temp2;
|
|
|
|
if (SectLocalizedName) {
|
|
MultiSzAppend (&friendlyName, SectLocalizedName);
|
|
}
|
|
|
|
if (friendlyName.Buf == NULL) {
|
|
while (*FriendlyNameMultiSz) {
|
|
MultiSzAppend (&friendlyName, FriendlyNameMultiSz);
|
|
FriendlyNameMultiSz = GetEndOfString (FriendlyNameMultiSz) + 1;
|
|
}
|
|
|
|
padName = TRUE;
|
|
}
|
|
|
|
if (EnumFirstMultiSz (&namesEnum, friendlyName.Buf)) {
|
|
do {
|
|
if (padName) {
|
|
displayName = (PTSTR)ParseMessageID (MSG_NICE_PATH_CONTROL_PANEL, &namesEnum.CurrentString);
|
|
} else {
|
|
displayName = DuplicatePathString (namesEnum.CurrentString, 0);
|
|
}
|
|
|
|
switch (ActType) {
|
|
|
|
case ACT_MINORPROBLEMS:
|
|
reportEntry = GetStringResource (MSG_MINOR_PROBLEM_ROOT);
|
|
break;
|
|
|
|
case ACT_INCOMPATIBLE:
|
|
case ACT_INC_NOBADAPPS:
|
|
case ACT_INC_IHVUTIL:
|
|
case ACT_INC_PREINSTUTIL:
|
|
case ACT_INC_SIMILAROSFUNC:
|
|
|
|
temp1 = GetStringResource (MSG_INCOMPATIBLE_ROOT);
|
|
if (!temp1) {
|
|
break;
|
|
}
|
|
|
|
switch (ActType) {
|
|
|
|
case ACT_INC_SIMILAROSFUNC:
|
|
temp2 = GetStringResource (MSG_INCOMPATIBLE_UTIL_SIMILAR_FEATURE_SUBGROUP);
|
|
break;
|
|
|
|
case ACT_INC_PREINSTUTIL:
|
|
temp2 = GetStringResource (MSG_INCOMPATIBLE_PREINSTALLED_UTIL_SUBGROUP);
|
|
break;
|
|
|
|
case ACT_INC_IHVUTIL:
|
|
temp2 = GetStringResource (MSG_INCOMPATIBLE_HW_UTIL_SUBGROUP);
|
|
break;
|
|
|
|
default:
|
|
temp2 = GetStringResource (Message ? MSG_INCOMPATIBLE_DETAIL_SUBGROUP : MSG_TOTALLY_INCOMPATIBLE_SUBGROUP);
|
|
break;
|
|
}
|
|
|
|
if (!temp2) {
|
|
break;
|
|
}
|
|
|
|
reportEntry = JoinPaths (temp1, temp2);
|
|
reportEntryIsResource = FALSE;
|
|
|
|
FreeStringResource (temp1);
|
|
FreeStringResource (temp2);
|
|
break;
|
|
|
|
case ACT_INC_SAFETY:
|
|
temp1 = GetStringResource (MSG_INCOMPATIBLE_ROOT);
|
|
if (!temp1) {
|
|
break;
|
|
}
|
|
temp2 = GetStringResource (MSG_REMOVED_FOR_SAFETY_SUBGROUP);
|
|
if (!temp2) {
|
|
break;
|
|
}
|
|
|
|
reportEntry = JoinPaths (temp1, temp2);
|
|
reportEntryIsResource = FALSE;
|
|
|
|
FreeStringResource (temp1);
|
|
FreeStringResource (temp2);
|
|
break;
|
|
|
|
case ACT_REINSTALL:
|
|
temp1 = GetStringResource (MSG_REINSTALL_ROOT);
|
|
if (!temp1) {
|
|
break;
|
|
}
|
|
temp2 = GetStringResource (Message ? MSG_REINSTALL_DETAIL_SUBGROUP : MSG_REINSTALL_LIST_SUBGROUP);
|
|
if (!temp2) {
|
|
break;
|
|
}
|
|
|
|
reportEntry = JoinPaths (temp1, temp2);
|
|
reportEntryIsResource = FALSE;
|
|
|
|
FreeStringResource (temp1);
|
|
FreeStringResource (temp2);
|
|
break;
|
|
|
|
case ACT_REINSTALL_BLOCK:
|
|
temp1 = GetStringResource (MSG_BLOCKING_ITEMS_ROOT);
|
|
if (!temp1) {
|
|
break;
|
|
}
|
|
temp2 = GetStringResource (MSG_REINSTALL_BLOCK_ROOT);
|
|
if (!temp2) {
|
|
break;
|
|
}
|
|
|
|
reportEntry = JoinPaths (temp1, temp2);
|
|
reportEntryIsResource = FALSE;
|
|
|
|
FreeStringResource (temp1);
|
|
FreeStringResource (temp2);
|
|
break;
|
|
}
|
|
|
|
component = JoinPaths (reportEntry, displayName);
|
|
|
|
MsgMgr_ObjectMsg_Add (FilePath, component, Message);
|
|
|
|
FreePathString (component);
|
|
|
|
if (reportEntryIsResource) {
|
|
FreeStringResource (reportEntry);
|
|
} else {
|
|
FreePathString (reportEntry);
|
|
reportEntryIsResource = TRUE;
|
|
}
|
|
|
|
if (padName) {
|
|
FreeStringResourcePtrA (&displayName);
|
|
} else {
|
|
FreePathString (displayName);
|
|
}
|
|
|
|
} while (EnumNextMultiSz (&namesEnum));
|
|
}
|
|
FreeGrowBuffer (&friendlyName);
|
|
}
|
|
|
|
VOID
|
|
pShowPacks (
|
|
PCTSTR UpgradePackName
|
|
)
|
|
{
|
|
PCTSTR group;
|
|
|
|
group = BuildMessageGroup (
|
|
MSG_INSTALL_NOTES_ROOT,
|
|
MSG_RUNNING_MIGRATION_DLLS_SUBGROUP,
|
|
UpgradePackName
|
|
);
|
|
|
|
MsgMgr_ObjectMsg_Add (
|
|
UpgradePackName,
|
|
group,
|
|
S_EMPTY
|
|
);
|
|
}
|
|
|
|
|
|
VOID
|
|
pOutOfDiskSpace (
|
|
VOID
|
|
)
|
|
{
|
|
PCTSTR group;
|
|
PCTSTR args[5];
|
|
PCTSTR msg;
|
|
|
|
args[0] = TEXT("C:\\");
|
|
args[1] = TEXT("300");
|
|
args[2] = TEXT("220");
|
|
args[3] = TEXT("120");
|
|
args[4] = TEXT("250");
|
|
|
|
msg = ParseMessageID (MSG_NOT_ENOUGH_DISK_SPACE_WITH_LOCALSOURCE_AND_BACKUP, args);
|
|
|
|
group = BuildMessageGroup (MSG_BLOCKING_ITEMS_ROOT, MSG_NOT_ENOUGH_DISKSPACE_SUBGROUP, NULL);
|
|
MsgMgr_ObjectMsg_Add (TEXT("*DiskSpace"), group, msg);
|
|
FreeText (group);
|
|
|
|
FreeStringResource (msg);
|
|
}
|
|
|
|
|
|
VOID
|
|
pOutOfRam (
|
|
VOID
|
|
)
|
|
{
|
|
PCTSTR args[3];
|
|
PCTSTR group;
|
|
PCTSTR message;
|
|
|
|
args[0] = TEXT("64");
|
|
args[1] = TEXT("48");
|
|
args[2] = TEXT("16");
|
|
|
|
group = BuildMessageGroup (MSG_BLOCKING_ITEMS_ROOT, MSG_NOT_ENOUGH_RAM_SUBGROUP, NULL);
|
|
message = ParseMessageID (MSG_NOT_ENOUGH_RAM, args);
|
|
|
|
MsgMgr_ObjectMsg_Add (TEXT("*Ram"), group, message);
|
|
|
|
FreeText (group);
|
|
FreeStringResource (message);
|
|
}
|
|
|
|
VOID
|
|
pMapi (
|
|
VOID
|
|
)
|
|
{
|
|
PCTSTR group;
|
|
PCTSTR message;
|
|
|
|
group = BuildMessageGroup (MSG_INSTALL_NOTES_ROOT, MSG_MAPI_NOT_HANDLED_SUBGROUP, NULL);
|
|
message = GetStringResource (MSG_MAPI_NOT_HANDLED);
|
|
|
|
MsgMgr_ObjectMsg_Add (TEXT("*MapiNotHandled"), group, message);
|
|
|
|
FreeText (group);
|
|
FreeStringResource (message);
|
|
}
|
|
|
|
VOID
|
|
pDarwin (
|
|
VOID
|
|
)
|
|
{
|
|
PCTSTR group;
|
|
PCTSTR message;
|
|
|
|
group = BuildMessageGroup (MSG_INSTALL_NOTES_ROOT, MSG_DARWIN_NOT_HANDLED_SUBGROUP, NULL);
|
|
message = GetStringResource (MSG_DARWIN_NOT_HANDLED);
|
|
|
|
MsgMgr_ObjectMsg_Add (TEXT("*DarwinNotHandled"), group, message);
|
|
|
|
FreeText (group);
|
|
FreeStringResource (message);
|
|
}
|
|
|
|
VOID
|
|
pRas (
|
|
PCTSTR EntryName
|
|
)
|
|
{
|
|
PCTSTR group;
|
|
|
|
group = BuildMessageGroup (
|
|
MSG_INSTALL_NOTES_ROOT,
|
|
MSG_CONNECTION_PASSWORD_SUBGROUP,
|
|
EntryName
|
|
);
|
|
MsgMgr_ObjectMsg_Add ( EntryName, group, S_EMPTY);
|
|
FreeText (group);
|
|
|
|
group = BuildMessageGroup (
|
|
MSG_LOSTSETTINGS_ROOT,
|
|
MSG_CONNECTION_BADPROTOCOL_SUBGROUP,
|
|
EntryName
|
|
);
|
|
|
|
MsgMgr_ObjectMsg_Add (
|
|
EntryName,
|
|
group,
|
|
S_EMPTY
|
|
);
|
|
|
|
FreeText (group);
|
|
}
|
|
|
|
|
|
VOID
|
|
pMultiMon (
|
|
BOOL Per
|
|
)
|
|
{
|
|
PCTSTR group;
|
|
PCTSTR message;
|
|
|
|
group = BuildMessageGroup (MSG_INSTALL_NOTES_ROOT, MSG_MULTI_MONITOR_UNSUPPORTED_SUBGROUP, NULL);
|
|
message = GetStringResource (Per?
|
|
MSG_MULTI_MONITOR_UNSUPPORTED_PER:
|
|
MSG_MULTI_MONITOR_UNSUPPORTED);
|
|
|
|
MsgMgr_ObjectMsg_Add (TEXT("*MultiMonitor"), group, message);
|
|
|
|
FreeText (group);
|
|
FreeStringResource (message);
|
|
}
|
|
|
|
|
|
VOID
|
|
pJoysticks (
|
|
PCTSTR FullPath,
|
|
PCTSTR JoystickName
|
|
)
|
|
{
|
|
PCTSTR group;
|
|
|
|
group = BuildMessageGroup (
|
|
MSG_INCOMPATIBLE_HARDWARE_ROOT,
|
|
MSG_JOYSTICK_SUBGROUP,
|
|
JoystickName
|
|
);
|
|
|
|
MsgMgr_ObjectMsg_Add (
|
|
FullPath,
|
|
group,
|
|
NULL
|
|
);
|
|
|
|
FreeText (group);
|
|
}
|
|
|
|
|
|
VOID
|
|
pTwain (
|
|
PCTSTR DataSourceModule,
|
|
PCTSTR DisplayName
|
|
)
|
|
{
|
|
PCTSTR group;
|
|
|
|
group = BuildMessageGroup (
|
|
MSG_INCOMPATIBLE_HARDWARE_ROOT,
|
|
MSG_TWAIN_SUBGROUP,
|
|
DisplayName
|
|
);
|
|
|
|
MsgMgr_ObjectMsg_Add (
|
|
DataSourceModule,
|
|
group,
|
|
NULL
|
|
);
|
|
|
|
FreeText (group);
|
|
}
|
|
|
|
VOID
|
|
pRecycleBin (
|
|
PCTSTR Recycled
|
|
)
|
|
{
|
|
PCTSTR args[1];
|
|
PCTSTR group;
|
|
PCTSTR message;
|
|
|
|
args[0] = Recycled;
|
|
|
|
group = BuildMessageGroup (MSG_INSTALL_NOTES_ROOT, MSG_RECYCLE_BIN_SUBGROUP, NULL);
|
|
message = ParseMessageID (MSG_RECYCLED_FILES_WILL_BE_DELETED, args);
|
|
|
|
MsgMgr_ObjectMsg_Add (TEXT("*RECYCLEBIN"), group, message);
|
|
|
|
FreeText (group);
|
|
FreeStringResource (message);
|
|
}
|
|
|
|
|
|
VOID
|
|
pTimeZone (
|
|
PCTSTR CurTimeZone // can be empty string
|
|
)
|
|
{
|
|
PCTSTR args[1];
|
|
PCTSTR component;
|
|
PCTSTR warning;
|
|
|
|
args[0] = CurTimeZone;
|
|
|
|
component = GetStringResource (MSG_TIMEZONE_COMPONENT);
|
|
|
|
if (*CurTimeZone) {
|
|
warning = ParseMessageID (MSG_TIMEZONE_WARNING, args);
|
|
}
|
|
else {
|
|
warning = GetStringResource (MSG_TIMEZONE_WARNING_UNKNOWN);
|
|
}
|
|
|
|
MYASSERT (component);
|
|
MYASSERT (warning);
|
|
|
|
MsgMgr_ObjectMsg_Add (TEXT("*TIMEZONE"), component, warning);
|
|
FreeStringResource (component);
|
|
FreeStringResource (warning);
|
|
}
|
|
|
|
|
|
VOID
|
|
pLostRasPassword (
|
|
PCTSTR EntryName
|
|
)
|
|
{
|
|
PCTSTR group;
|
|
|
|
group = BuildMessageGroup (
|
|
MSG_MISC_WARNINGS_ROOT,
|
|
MSG_CONNECTION_PASSWORD_SUBGROUP,
|
|
EntryName
|
|
);
|
|
|
|
MsgMgr_ObjectMsg_Add (EntryName, group, S_EMPTY);
|
|
FreeText (group);
|
|
}
|
|
|
|
|
|
VOID
|
|
pGenReport (
|
|
VOID
|
|
)
|
|
{
|
|
|
|
//
|
|
// Changed names
|
|
//
|
|
|
|
pAddChangedUserName ("User Name", "Guest", "Guest-1");
|
|
pAddChangedUserName ("Computer Name", "My Bad Computer Name", "MyBadComputerNa");
|
|
|
|
//
|
|
// Hardware
|
|
//
|
|
|
|
pAddDevice (
|
|
"HKLM\\Enum\\Key1",
|
|
HW_INCOMPATIBLE,
|
|
"PCMCIA Interrupt Sequencer",
|
|
TRUE,
|
|
"SysDevs",
|
|
"Texas Instruments",
|
|
"PCMCIA\\TI004000&DEV_1234",
|
|
"System Devices"
|
|
);
|
|
|
|
pAddDevice (
|
|
"HKLM\\Enum\\Key2",
|
|
HW_INCOMPATIBLE,
|
|
"PCMCIA Mass Storage Device",
|
|
FALSE,
|
|
"DiskDrives",
|
|
"Texas Instruments",
|
|
"PCMCIA\\TI005000&DEV_2000",
|
|
"Hard Disk Drives"
|
|
);
|
|
|
|
pAddDevice (
|
|
"HKLM\\Enum\\Key1A",
|
|
HW_INCOMPATIBLE,
|
|
"Matrox Century 1",
|
|
TRUE,
|
|
"Video",
|
|
"Matrox Inc.",
|
|
"PCI\\VEN_0010&DEV_0020",
|
|
"Display Devices"
|
|
);
|
|
|
|
pAddDevice (
|
|
"HKLM\\Enum\\Key2B",
|
|
HW_INCOMPATIBLE,
|
|
"Microsoft Enhanced Keyboard",
|
|
TRUE,
|
|
"Input",
|
|
"Microsoft Corporation",
|
|
"*PNP091C",
|
|
"Input Devices"
|
|
);
|
|
|
|
pAddDevice (
|
|
"HKLM\\Enum\\Key3",
|
|
HW_REINSTALL,
|
|
"Cannon Digital Camera",
|
|
FALSE,
|
|
"MF",
|
|
"Cannon",
|
|
"USB\\CANNON_DC_VID_0100&PID_0105&RID_6500",
|
|
"Multi Function Devices"
|
|
);
|
|
|
|
pAddDevice (
|
|
"HKLM\\Enum\\Key4",
|
|
HW_REINSTALL,
|
|
"Cannon Digital Camera Docking Station",
|
|
TRUE,
|
|
"MF",
|
|
"Cannon",
|
|
"USB\\CANNON_DC_VID_0100&PID_0105&RID_6501",
|
|
"Multi Function Devices"
|
|
);
|
|
|
|
pAddDevice (
|
|
"HKLM\\Enum\\Key5",
|
|
HW_UNSUPPORTED,
|
|
"Adaptec XX00",
|
|
FALSE,
|
|
"SCSI",
|
|
"Texas Instruments",
|
|
"PCMCIA\\TI004000&DEV_1234",
|
|
"SCSI Controllers"
|
|
);
|
|
|
|
//
|
|
// Bad OS version (Win95?)
|
|
//
|
|
|
|
pBadOsVersion();
|
|
|
|
//
|
|
// Blocking file
|
|
//
|
|
|
|
pBlockingFile (
|
|
"c:\\program files\\nueo\\DLAPP.EXE",
|
|
"Norton Your Eyes Only",
|
|
"Norton Your Eyes Only can cause serious problems during the upgrade to "
|
|
"Windows XP. Because of these incompatibilities, "
|
|
"you must uninstall this program from your system before continuing."
|
|
);
|
|
|
|
pBlockingFile (
|
|
"c:\\program files\\Sysmon32.exe",
|
|
"V3Pro 98",
|
|
"This virus scanner can cause serious problems during the upgrade to Windows XP. You must "
|
|
"uninstall V3 Professional 98 before continuing."
|
|
);
|
|
|
|
//
|
|
// Blocking hardware
|
|
//
|
|
|
|
pBlockingHardware (
|
|
"c:\\windows\\system\\NVARCH32.DLL",
|
|
"ALi AGP Controller",
|
|
"Setup has detected an incompatibility between your video card & computer's mainboard. "
|
|
"Because of this, your computer may not start up after the upgrade. Contact the "
|
|
"manufacturer of your hardware for technical assistance."
|
|
);
|
|
|
|
//
|
|
// Backup dirs
|
|
//
|
|
|
|
pBackupDirs ("c:\\myfiles");
|
|
pManyBackupDirs (55);
|
|
|
|
//
|
|
// HLP files
|
|
//
|
|
|
|
pHlpFile ("c:\\my app\\foo.hlp", "foo.hlp", "Foo Help File", NULL);
|
|
pHlpFile ("c:\\my app\\foo.hlp2", "foo.hlp2", "Foo Help File 2", "Test text");
|
|
|
|
//
|
|
// Dir collisions
|
|
//
|
|
|
|
pProfileDir ("c:\\Documents and Settings", "c:\\Documents and Settings.001");
|
|
|
|
//
|
|
// Replacement shell
|
|
//
|
|
|
|
pBadShell();
|
|
|
|
//
|
|
// Bad SCR
|
|
//
|
|
|
|
pBadScr ("c:\\windows\\system\\disney.scr", NULL, ACT_REINSTALL, NULL);
|
|
pBadScr ("c:\\windows\\system\\Clifford.scr", NULL, ACT_REINSTALL_BLOCK, NULL);
|
|
pBadScr ("c:\\windows\\system\\Stars and Stripes.scr", NULL, ACT_MINORPROBLEMS, "The animation mode will not work on Windows XP");
|
|
pBadScr ("c:\\windows\\system\\Light Tracer.scr", NULL, ACT_INCOMPATIBLE, NULL);
|
|
pBadScr ("c:\\windows\\system\\Big Fish.scr", NULL, ACT_INC_NOBADAPPS, NULL);
|
|
pBadScr ("c:\\windows\\system\\disney gfy.scr", "Disney's Goofy", ACT_REINSTALL, NULL);
|
|
|
|
|
|
//
|
|
// Bad CPL
|
|
//
|
|
|
|
pBadCpl (
|
|
"c:\\windows\\system\\chipcontrol.cpl",
|
|
"Chip Control\0Cache\0",
|
|
NULL,
|
|
ACT_REINSTALL,
|
|
NULL
|
|
);
|
|
|
|
pBadCpl (
|
|
"c:\\windows\\system\\antivirus.cpl",
|
|
"AntiVirus",
|
|
NULL,
|
|
ACT_REINSTALL_BLOCK,
|
|
NULL
|
|
);
|
|
|
|
pBadCpl (
|
|
"c:\\windows\\system\\antivirus2.cpl",
|
|
"Symantec AntiVirus",
|
|
NULL,
|
|
ACT_REINSTALL_BLOCK,
|
|
NULL
|
|
);
|
|
|
|
pBadCpl (
|
|
"c:\\windows\\system\\crash.cpl",
|
|
"Crash Applet",
|
|
NULL,
|
|
ACT_INC_SAFETY,
|
|
NULL
|
|
);
|
|
|
|
pBadCpl (
|
|
"c:\\windows\\system\\findfast.cpl",
|
|
"FindFast",
|
|
NULL,
|
|
ACT_INC_SIMILAROSFUNC,
|
|
NULL
|
|
);
|
|
|
|
pBadCpl (
|
|
"c:\\windows\\system\\easyaccess.cpl",
|
|
"Compaq EasyAccess",
|
|
NULL,
|
|
ACT_INC_PREINSTUTIL,
|
|
NULL
|
|
);
|
|
|
|
pBadCpl (
|
|
"c:\\windows\\system\\vdesk.cpl",
|
|
"Matrox Virtual Desktop",
|
|
NULL,
|
|
ACT_INC_IHVUTIL,
|
|
NULL
|
|
);
|
|
|
|
pBadCpl (
|
|
"c:\\windows\\system\\quicktime.cpl",
|
|
"Apple QuickTime 1.0",
|
|
NULL,
|
|
ACT_INC_NOBADAPPS,
|
|
NULL
|
|
);
|
|
|
|
pBadCpl (
|
|
"c:\\windows\\system\\celldialer.cpl",
|
|
"Motorola Cell Phone Dialer",
|
|
NULL,
|
|
ACT_MINORPROBLEMS,
|
|
"After upgrading, the Motorola Cell Phone Dialer won't redial if a busy signal is detected"
|
|
);
|
|
|
|
//
|
|
// Mig Dll IDs
|
|
//
|
|
|
|
pShowPacks ("Microsoft Upgrade Pack 2");
|
|
pShowPacks ("Front Page Server Extensions");
|
|
|
|
//
|
|
// Excluded drives
|
|
//
|
|
|
|
pExcludeDrive (TEXT("C:\\"), MSG_DRIVE_EXCLUDED_SUBGROUP);
|
|
pExcludeDrive (TEXT("D:\\"), MSG_DRIVE_INACCESSIBLE_SUBGROUP);
|
|
pExcludeDrive (TEXT("E:\\"), MSG_DRIVE_RAM_SUBGROUP);
|
|
pExcludeDrive (TEXT("F:\\"), MSG_DRIVE_NETWORK_SUBGROUP);
|
|
pExcludeDrive (TEXT("G:\\"), MSG_DRIVE_SUBST_SUBGROUP);
|
|
|
|
//
|
|
// Out of disk space or RAM
|
|
//
|
|
|
|
pOutOfDiskSpace();
|
|
pOutOfRam();
|
|
|
|
//
|
|
// MAPI and Darwin
|
|
//
|
|
|
|
pMapi();
|
|
pDarwin ();
|
|
|
|
//
|
|
// RAS
|
|
//
|
|
|
|
pRas(TEXT("My ISP"));
|
|
|
|
//
|
|
// Shares
|
|
//
|
|
|
|
pAddIncompatibilityAlert (MSG_INVALID_ACL_LIST, TEXT("MyShare"), TEXT("c:\\my share"));
|
|
pAddIncompatibilityAlert (MSG_LOST_SHARE_PASSWORDS, TEXT("MyShare2"), TEXT("c:\\my share2"));
|
|
pAddIncompatibilityAlert (MSG_LOST_ACCESS_FLAGS, TEXT("MyShare3"), TEXT("c:\\my share3"));
|
|
|
|
//
|
|
// Multiple monitors
|
|
//
|
|
|
|
pMultiMon (TRUE); // per
|
|
pMultiMon (FALSE); // pro
|
|
|
|
//
|
|
// Joysticks
|
|
//
|
|
|
|
pJoysticks ("c:\\windows\\system\\joy.vxd", "Microsoft Sidewinder");
|
|
|
|
//
|
|
// TWAIN
|
|
//
|
|
|
|
pTwain ("c:\\windows\\twain_32\\xeotec.ds", "Xeotec Digital Camera");
|
|
|
|
//
|
|
// Recycle Bin
|
|
//
|
|
|
|
pRecycleBin ("30");
|
|
|
|
//
|
|
// Bad user accounts
|
|
//
|
|
|
|
MsgSettingsIncomplete ("c:\\windows\\profiles\\joeuser", "joeuser", FALSE);
|
|
MsgSettingsIncomplete ("c:\\windows\\profiles\\maryuser", "maryuser", TRUE);
|
|
MsgSettingsIncomplete ("c:\\windows\\profiles\\a?b", NULL, TRUE);
|
|
|
|
//
|
|
// Time zone
|
|
//
|
|
|
|
pTimeZone ("");
|
|
pTimeZone ("Pacific Time (GMT -08:00)");
|
|
|
|
//
|
|
// Lost RAS password
|
|
//
|
|
|
|
pLostRasPassword ("AOL");
|
|
|
|
}
|
|
|
|
|
|
BOOL
|
|
pFillListControl (
|
|
IN HWND ListHandle
|
|
);
|
|
|
|
INT
|
|
__cdecl
|
|
main (
|
|
INT argc,
|
|
CHAR *argv[]
|
|
)
|
|
{
|
|
|
|
HWND hwnd;
|
|
UINT rc;
|
|
|
|
SuppressAllLogPopups (TRUE);
|
|
if (!Init()) {
|
|
printf ("Unable to initialize!\n");
|
|
return 255;
|
|
}
|
|
|
|
//
|
|
// TODO: Put your code here
|
|
//
|
|
|
|
RegisterTextViewer();
|
|
|
|
|
|
|
|
{
|
|
MSG msg;
|
|
PCTSTR text;
|
|
HANDLE file;
|
|
HANDLE map;
|
|
UINT size;
|
|
PTSTR textBuf;
|
|
|
|
MsgMgr_Init();
|
|
InitCompatTable();
|
|
pGenReport();
|
|
MsgMgr_Resolve();
|
|
|
|
SaveReport (NULL, TEXT("C:\\test.htm"));
|
|
SaveReport (NULL, TEXT("C:\\test.txt"));
|
|
|
|
pFillListControl (NULL);
|
|
|
|
text = (PCTSTR) MapFileIntoMemory (TEXT("C:\\test.htm"), &file, &map);
|
|
size = GetFileSize (file, NULL);
|
|
textBuf = AllocText (size + 1);
|
|
CopyMemory (textBuf, text, size);
|
|
textBuf[size] = 0;
|
|
|
|
hwnd = CreateWindowEx (
|
|
WS_EX_APPWINDOW|WS_EX_PALETTEWINDOW,
|
|
S_TEXTVIEW_CLASS,
|
|
textBuf,
|
|
WS_OVERLAPPED|WS_BORDER|WS_SYSMENU|WS_VISIBLE|WS_VSCROLL,
|
|
100, 100,
|
|
418, 215,
|
|
NULL,
|
|
NULL,
|
|
GetModuleHandle (NULL),
|
|
NULL
|
|
);
|
|
|
|
g_Proc = (WNDPROC) GetWindowLong (hwnd, GWL_WNDPROC);
|
|
SetWindowLong (hwnd, GWL_WNDPROC, (LONG) pWrapperProc);
|
|
|
|
while (GetMessage (&msg, NULL, 0, 0)) {
|
|
|
|
TranslateMessage (&msg);
|
|
DispatchMessage (&msg);
|
|
}
|
|
}
|
|
|
|
|
|
Terminate();
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|