|
|
/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
hwwiz.c
Abstract:
Implements a upgwiz wizard for obtaining various application information.
Author:
Calin Negreanu (calinn) 10-Oct-1998
Revision History:
<alias> <date> <comments>
--*/
#include "pch.h"
#include "..\inc\dgdll.h"
#include <cpl.h>
DATATYPE g_DataTypes[] = { {UPGWIZ_VERSION, "Incompatible - requires app installation", "You must install the application that has incompatible modules, CPLs or SCRs).", 0, DTF_REQUIRE_DESCRIPTION|DTF_NO_DATA_OBJECT, 1024, "&Application name:" },
{UPGWIZ_VERSION, "Compatible Application - requires app installation", "You specify the application that migrates fine on NT5.", 0, DTF_REQUIRE_DESCRIPTION|DTF_NO_DATA_OBJECT, 1024, "&Application name:" },
{UPGWIZ_VERSION, "Incompatible Application", "You specify the application that is incompatible with Windows NT5.", 0, DTF_REQUIRE_DESCRIPTION, 1024, "&Application name:" },
{UPGWIZ_VERSION, "Incompatible DOS Application", "You specify the DOS application that is incompatible with Windows NT5.", 0, DTF_REQUIRE_DESCRIPTION, 1024, "&Application name:" },
{UPGWIZ_VERSION, "Application that needs to be reinstalled", "You specify an application that needs to be reinstalled after migration.", 0, DTF_REQUIRE_DESCRIPTION, 1024, "&Application name:" },
{UPGWIZ_VERSION, "Application with minor problems", "You specify an application that has minor problems running on NT5.", 0, DTF_REQUIRE_DESCRIPTION|DTF_REQUIRE_TEXT, 1024, "&Application name:", "&Problem Description:" },
{UPGWIZ_VERSION, "DOS Application with minor problems", "You specify an DOS application that has minor problems running on NT5.", 0, DTF_REQUIRE_DESCRIPTION|DTF_REQUIRE_TEXT, 1024, "&Application name:", "&Problem Description:" },
{UPGWIZ_VERSION, "Incompatible CPLs", "You specify Control Panel Applets that are incompatible with NT5.", 0, DTF_REQUIRE_DESCRIPTION|DTF_ONE_SELECTION, 1024, "&CPL name:" },
{UPGWIZ_VERSION, "CPLs with minor problems", "You specify Control Panel Applets that have minor problems running on NT5.", 0, DTF_REQUIRE_DESCRIPTION|DTF_REQUIRE_TEXT|DTF_ONE_SELECTION, 1024, "&CPL name:" },
{UPGWIZ_VERSION, "Incompatible screen savers", "You specify screen savers that are incompatible with NT5.", 0, },
{UPGWIZ_VERSION, "Screen savers with minor problems", "You specify screen savers that have minor problems while running on NT5.", 0, DTF_REQUIRE_TEXT|DTF_ONE_SELECTION, 1024, NULL, "&Problem description:" },
{UPGWIZ_VERSION, "Compatible RunKey entries", "You specify RunKey entries that can be left after migration.", 0, },
};
GROWBUFFER g_DataObjects = GROWBUF_INIT; POOLHANDLE g_DataObjectPool;
HINSTANCE g_OurInst;
BOOL Init ( VOID ) { #ifndef UPGWIZ4FLOPPY
return InitToolMode (g_OurInst); #else
return TRUE; #endif
}
VOID Terminate ( VOID ) { //
// Local cleanup
//
FreeGrowBuffer (&g_DataObjects);
if (g_DataObjectPool) { PoolMemDestroyPool (g_DataObjectPool); }
#ifndef UPGWIZ4FLOPPY
TerminateToolMode (g_OurInst); #endif
}
BOOL WINAPI DllMain ( IN HINSTANCE hInstance, IN DWORD dwReason, IN LPVOID lpReserved ) { if (dwReason == DLL_PROCESS_DETACH) { MYASSERT (g_OurInst == hInstance); Terminate(); }
g_OurInst = hInstance;
return TRUE; }
UINT GiveVersion ( VOID ) { Init();
return UPGWIZ_VERSION; }
PDATATYPE GiveDataTypeList ( OUT PUINT Count ) { UINT u;
*Count = sizeof (g_DataTypes) / sizeof (g_DataTypes[0]);
for (u = 0 ; u < *Count ; u++) { g_DataTypes[u].DataTypeId = u; }
return g_DataTypes; }
VOID pGatherScreenSavers ( VOID ) { CHAR winDir [MAX_PATH]; PCSTR scrDir = NULL; TREE_ENUM e; PDATAOBJECT Data;
if (GetWindowsDirectory (winDir, MAX_PATH) == 0) { return; }
if (ISNT()) { scrDir = JoinPaths (winDir, "SYSTEM32"); } else { scrDir = JoinPaths (winDir, "SYSTEM"); } if (EnumFirstFileInTreeEx (&e, scrDir, "*.scr", FALSE, FALSE, FILE_ENUM_THIS_LEVEL)) { do { if (!e.Directory) { Data = (PDATAOBJECT) GrowBuffer (&g_DataObjects, sizeof (DATAOBJECT)); Data->NameOrPath = PoolMemDuplicateString (g_DataObjectPool, e.Name); Data->Version = UPGWIZ_VERSION; Data->Flags = 0; Data->DllParam = PoolMemDuplicateString (g_DataObjectPool, e.FullPath); } } while (EnumNextFileInTree (&e)); } FreePathString (scrDir); }
typedef struct _CPL_STRUCT { PSTR FriendlyName; PSTR FullPathName; } CPL_STRUCT, *PCPL_STRUCT;
PCPL_STRUCT pAllocCPLStruct ( IN PCSTR FriendlyName, IN PCSTR FullPathName ) { PCPL_STRUCT cplStruct;
cplStruct = (PCPL_STRUCT) PoolMemGetMemory (g_DataObjectPool, sizeof (CPL_STRUCT)); ZeroMemory (cplStruct, sizeof (CPL_STRUCT)); if (FriendlyName) { cplStruct->FriendlyName = PoolMemDuplicateString (g_DataObjectPool, FriendlyName); } if (FullPathName) { cplStruct->FullPathName = PoolMemDuplicateString (g_DataObjectPool, FullPathName); } return cplStruct; }
typedef LONG (CPL_PROTOTYPE) (HWND hwndCPl, UINT uMsg, LONG lParam1, LONG lParam2); typedef CPL_PROTOTYPE * PCPL_PROTOTYPE;
VOID pGetCPLFriendlyName ( IN PCSTR FileName ) { HANDLE cplInstance; PCPL_PROTOTYPE cplMain; TCHAR localName[MEMDB_MAX]; UINT oldErrorMode; BOOL gathered; PDATAOBJECT Data; LONG numEntries,i; PCSTR uName; PCSTR displayName;
LPCPLINFO info; LPNEWCPLINFO newInfo;
oldErrorMode = SetErrorMode (SEM_FAILCRITICALERRORS);
cplInstance = LoadLibrary (FileName); if (!cplInstance) { LOG ((LOG_ERROR, "Cannot load %s. Error:%ld", FileName, GetLastError()));
Data = (PDATAOBJECT) GrowBuffer (&g_DataObjects, sizeof (DATAOBJECT)); Data->NameOrPath = PoolMemDuplicateString (g_DataObjectPool, GetFileNameFromPath (FileName)); Data->Version = UPGWIZ_VERSION; Data->Flags = 0; Data->DllParam = pAllocCPLStruct (NULL, FileName);
SetErrorMode (oldErrorMode); return; }
cplMain = (PCPL_PROTOTYPE)GetProcAddress (cplInstance, TEXT("CPlApplet")); if (!cplMain) { LOG ((LOG_ERROR, "Cannot get main entry point for %s. Error:%ld", FileName, GetLastError()));
Data = (PDATAOBJECT) GrowBuffer (&g_DataObjects, sizeof (DATAOBJECT)); Data->NameOrPath = PoolMemDuplicateString (g_DataObjectPool, GetFileNameFromPath (FileName)); Data->Version = UPGWIZ_VERSION; Data->Flags = 0; Data->DllParam = pAllocCPLStruct (NULL, FileName);
SetErrorMode (oldErrorMode); return; } if ((*cplMain) (NULL, CPL_INIT, 0, 0) == 0) { (*cplMain) (NULL, CPL_EXIT, 0, 0); LOG ((LOG_ERROR, "%s failed unexpectedly. Error:%ld", FileName, GetLastError()));
Data = (PDATAOBJECT) GrowBuffer (&g_DataObjects, sizeof (DATAOBJECT)); Data->NameOrPath = PoolMemDuplicateString (g_DataObjectPool, GetFileNameFromPath (FileName)); Data->Version = UPGWIZ_VERSION; Data->Flags = 0; Data->DllParam = pAllocCPLStruct (NULL, FileName);
FreeLibrary (cplInstance); SetErrorMode (oldErrorMode); return; }
numEntries = (*cplMain) (NULL, CPL_GETCOUNT, 0, 0); if (numEntries == 0) { (*cplMain) (NULL, CPL_EXIT, 0, 0);
Data = (PDATAOBJECT) GrowBuffer (&g_DataObjects, sizeof (DATAOBJECT)); Data->NameOrPath = PoolMemDuplicateString (g_DataObjectPool, GetFileNameFromPath (FileName)); Data->Version = UPGWIZ_VERSION; Data->Flags = 0; Data->DllParam = pAllocCPLStruct (NULL, FileName);
FreeLibrary (cplInstance); SetErrorMode (oldErrorMode); DEBUGMSG ((DBG_WARNING, "CPL: No display info available for %s.", FileName)); return; }
info = MemAlloc (g_hHeap, HEAP_ZERO_MEMORY, sizeof (CPLINFO) * numEntries); newInfo = MemAlloc (g_hHeap, HEAP_ZERO_MEMORY, sizeof (NEWCPLINFO) * numEntries);
gathered = FALSE; for (i=0;i<numEntries;i++) { (*cplMain) (NULL, CPL_INQUIRE, i, (LONG)&info[i]); (*cplMain) (NULL, CPL_NEWINQUIRE, i, (LONG)&newInfo[i]);
if (newInfo[i].szName[0]) { uName = NULL; if (newInfo[i].szName[1]==0) { // let's try the unicode name
uName = ConvertWtoA ((PWSTR)newInfo[i].szName); } displayName = JoinTextEx (NULL, uName?uName:newInfo[i].szName, GetFileNameFromPath (FileName), " - ", 0, NULL); Data = (PDATAOBJECT) GrowBuffer (&g_DataObjects, sizeof (DATAOBJECT)); Data->NameOrPath = PoolMemDuplicateString (g_DataObjectPool, displayName); Data->Version = UPGWIZ_VERSION; Data->Flags = 0; Data->DllParam = pAllocCPLStruct (uName?uName:newInfo[i].szName, FileName); FreeText (displayName); if (uName) { FreeConvertedStr (uName); } gathered = TRUE;
} else if (LoadString (cplInstance, info[i].idName, localName, MEMDB_MAX)) {
displayName = JoinTextEx (NULL, localName, GetFileNameFromPath (FileName), " - ", 0, NULL); Data = (PDATAOBJECT) GrowBuffer (&g_DataObjects, sizeof (DATAOBJECT)); Data->NameOrPath = PoolMemDuplicateString (g_DataObjectPool, displayName); Data->Version = UPGWIZ_VERSION; Data->Flags = 0; Data->DllParam = pAllocCPLStruct (localName, FileName); FreeText (displayName); gathered = TRUE;
} ELSE_DEBUGMSG ((DBG_ERROR, "CPL: Can't get string id %u", info[i].idName)); }
for (i=0;i<numEntries;i++) { (*cplMain) (NULL, CPL_STOP, i, info[i].lData?info[i].lData:newInfo[i].lData); }
if (!gathered) { Data = (PDATAOBJECT) GrowBuffer (&g_DataObjects, sizeof (DATAOBJECT)); Data->NameOrPath = PoolMemDuplicateString (g_DataObjectPool, GetFileNameFromPath (FileName)); Data->Version = UPGWIZ_VERSION; Data->Flags = 0; Data->DllParam = PoolMemDuplicateString (g_DataObjectPool, FileName); }
(*cplMain) (NULL, CPL_EXIT, 0, 0);
FreeLibrary (cplInstance);
MemFree (g_hHeap, 0, newInfo); MemFree (g_hHeap, 0, info);
SetErrorMode (oldErrorMode);
return; }
VOID pGatherCPLs ( VOID ) { CHAR winDir [MAX_PATH]; PCSTR scrDir = NULL; TREE_ENUM e;
if (GetWindowsDirectory (winDir, MAX_PATH) == 0) { return; }
if (ISNT()) { scrDir = JoinPaths (winDir, "SYSTEM32"); } else { scrDir = JoinPaths (winDir, "SYSTEM"); } if (EnumFirstFileInTreeEx (&e, scrDir, "*.cpl", FALSE, FALSE, FILE_ENUM_THIS_LEVEL)) { do { if (!e.Directory) { pGetCPLFriendlyName (e.FullPath); } } while (EnumNextFileInTree (&e)); } FreePathString (scrDir); }
typedef struct _RUNKEY_STRUCT { PSTR ValueName; PSTR Value; } RUNKEY_STRUCT, *PRUNKEY_STRUCT;
PRUNKEY_STRUCT pAllocRunKeyStruct ( IN PCSTR ValueName, IN PCSTR Value ) { PRUNKEY_STRUCT runKeyStruct;
runKeyStruct = (PRUNKEY_STRUCT) PoolMemGetMemory (g_DataObjectPool, sizeof (RUNKEY_STRUCT)); ZeroMemory (runKeyStruct, sizeof (RUNKEY_STRUCT)); runKeyStruct->ValueName = PoolMemDuplicateString (g_DataObjectPool, ValueName); runKeyStruct->Value = PoolMemDuplicateString (g_DataObjectPool, Value); return runKeyStruct; }
VOID pGatherRunKeys ( VOID ) { HKEY runKey; PCTSTR entryStr; REGVALUE_ENUM runKeyEnum; PDATAOBJECT Data; PCSTR displayName;
runKey = OpenRegKeyStr (S_RUNKEY); if (runKey != NULL) { if (EnumFirstRegValue (&runKeyEnum, runKey)) { do { entryStr = GetRegValueString (runKey, runKeyEnum.ValueName); if (entryStr != NULL) {
displayName = JoinTextEx (NULL, runKeyEnum.ValueName, entryStr, " - ", 0, NULL); Data = (PDATAOBJECT) GrowBuffer (&g_DataObjects, sizeof (DATAOBJECT)); Data->NameOrPath = PoolMemDuplicateString (g_DataObjectPool, displayName); Data->Version = UPGWIZ_VERSION; Data->Flags = DOF_NO_SPLIT_ON_WACK; FreeText (displayName); Data->DllParam = pAllocRunKeyStruct (runKeyEnum.ValueName, entryStr);
MemFree (g_hHeap, 0, entryStr); } } while (EnumNextRegValue (&runKeyEnum)); } CloseRegKey (runKey); } runKey = OpenRegKeyStr (S_RUNKEY_USER); if (runKey != NULL) { if (EnumFirstRegValue (&runKeyEnum, runKey)) { do { entryStr = GetRegValueString (runKey, runKeyEnum.ValueName); if (entryStr != NULL) {
displayName = JoinTextEx (NULL, runKeyEnum.ValueName, entryStr, " - ", 0, NULL); Data = (PDATAOBJECT) GrowBuffer (&g_DataObjects, sizeof (DATAOBJECT)); Data->NameOrPath = PoolMemDuplicateString (g_DataObjectPool, displayName); Data->Version = UPGWIZ_VERSION; Data->Flags = 0; FreeText (displayName); Data->DllParam = pAllocRunKeyStruct (runKeyEnum.ValueName, entryStr);
MemFree (g_hHeap, 0, entryStr); } } while (EnumNextRegValue (&runKeyEnum)); } CloseRegKey (runKey); } }
VOID pGatherStartMenuItems ( HKEY Key, PCSTR ValueName, BOOL DosApps ) { PCSTR entryStr; PCSTR expandedEntry; TREE_ENUM e; PDATAOBJECT Data;
entryStr = GetRegValueString (Key, ValueName); if (entryStr) { expandedEntry = ExpandEnvironmentText (entryStr);
if (EnumFirstFileInTreeEx (&e, expandedEntry, DosApps?"*.pif":"*.lnk", FALSE, FALSE, FILE_ENUM_ALL_LEVELS)) { do { if (!e.Directory) { Data = (PDATAOBJECT) GrowBuffer (&g_DataObjects, sizeof (DATAOBJECT)); Data->NameOrPath = PoolMemDuplicateString (g_DataObjectPool, e.SubPath); Data->Version = UPGWIZ_VERSION; Data->Flags = 0; Data->DllParam = PoolMemDuplicateString (g_DataObjectPool, e.FullPath); } } while (EnumNextFileInTree (&e)); }
if (expandedEntry != entryStr) { FreeText (expandedEntry); } MemFree (g_hHeap, 0, entryStr); } }
VOID pGatherStartMenu ( BOOL DosApps ) { HKEY startMenuKey;
startMenuKey = OpenRegKeyStr ("HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"); if (startMenuKey) { pGatherStartMenuItems (startMenuKey, "Common Start Menu", DosApps); pGatherStartMenuItems (startMenuKey, "Common Desktop", DosApps); CloseRegKey (startMenuKey); }
startMenuKey = OpenRegKeyStr ("HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"); if (startMenuKey) { pGatherStartMenuItems (startMenuKey, "Start Menu", DosApps); pGatherStartMenuItems (startMenuKey, "Desktop", DosApps); CloseRegKey (startMenuKey); }
startMenuKey = OpenRegKeyStr ("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"); if (startMenuKey) { pGatherStartMenuItems (startMenuKey, "Common Start Menu", DosApps); pGatherStartMenuItems (startMenuKey, "Common Desktop", DosApps); CloseRegKey (startMenuKey); }
startMenuKey = OpenRegKeyStr ("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"); if (startMenuKey) { pGatherStartMenuItems (startMenuKey, "Start Menu", DosApps); pGatherStartMenuItems (startMenuKey, "Desktop", DosApps); CloseRegKey (startMenuKey); }
}
PDATAOBJECT GiveDataObjectList ( IN UINT DataTypeId, OUT PUINT Count ) { g_DataObjectPool = PoolMemInitNamedPool ("Data Objects");
switch (DataTypeId) {
case 0: // compatible Apps
MessageBox (NULL, "Internal App DLL error:00004. Please contact calinn.", "Error", MB_OK); break;
case 1: // compatible Apps
MessageBox (NULL, "Internal App DLL error:00002. Please contact calinn.", "Error", MB_OK); break;
case 2: // incompatible Apps
pGatherStartMenu (FALSE); break;
case 3: // incompatible DOS Apps
pGatherStartMenu (TRUE); break;
case 4: // Apps to be reinstalled
pGatherStartMenu (FALSE); break;
case 5: // Apps with minor problems
pGatherStartMenu (FALSE); break;
case 6: // DOS Apps with minor problems
pGatherStartMenu (TRUE); break;
case 7: // incompatible CPLs
pGatherCPLs (); break;
case 8: // CPLs with minor problems
pGatherCPLs (); break;
case 9: // incompatible SCRs
pGatherScreenSavers (); break;
case 10: // SCRs with minor problems
pGatherScreenSavers (); break;
case 11: // compatible RunKey entries
pGatherRunKeys (); break;
default: MessageBox (NULL, "Internal App DLL error:00001. Please contact calinn.", "Error", MB_OK); break; }
*Count = g_DataObjects.End / sizeof (DATAOBJECT);
return (PDATAOBJECT) g_DataObjects.Buf; }
BOOL pIncompatibleSCROutput ( IN HANDLE File ) { BOOL b = FALSE; CHAR dataStr[MAX_PATH]; PDATAOBJECT Data = (PDATAOBJECT) g_DataObjects.Buf;
if (!WizardWriteRealString (File, "[Screen Savers - Incompatible]\r\n")) { return FALSE; }
while ((DWORD)Data < (DWORD)g_DataObjects.Buf + g_DataObjects.End) { if (Data->Flags & DOF_SELECTED) {
if (GetFileAttributesLine ((PSTR)Data->DllParam, dataStr, MAX_PATH)) { b = WizardWriteString (File, dataStr); b = b && WizardWriteRealString (File, "\r\n"); if (!b) break; } } Data++; } b = b && WizardWriteRealString (File, "\r\n"); return b; }
BOOL pMinorProblemsSCROutput ( IN HANDLE File, IN POUTPUTARGS Args ) { BOOL b = FALSE; CHAR dataStr[MAX_PATH]; PDATAOBJECT Data = (PDATAOBJECT) g_DataObjects.Buf;
if (!WizardWriteRealString (File, "[MinorProblems]\r\n")) { return FALSE; }
while ((DWORD)Data < (DWORD)g_DataObjects.Buf + g_DataObjects.End) { if (Data->Flags & DOF_SELECTED) {
MYASSERT (GetFileExtensionFromPath ((PSTR)Data->DllParam));
StringCopyAB (dataStr, GetFileNameFromPath ((PSTR)Data->DllParam), _mbsdec(GetFileNameFromPath ((PSTR)Data->DllParam), GetFileExtensionFromPath ((PSTR)Data->DllParam))); b = WizardWriteColumn (File, dataStr, 30); b = b && WizardWriteRealString (File, ", %"); b = b && WizardWriteInfString (File, dataStr, FALSE, FALSE, TRUE, '_', 0); b = b && WizardWriteRealString (File, "%, "); b = b && GetFileAttributesLine ((PSTR)Data->DllParam, dataStr, MAX_PATH); b = b && WizardWriteString (File, dataStr); b = b && WizardWriteString (File, "\r\n"); b = b && WizardWriteString (File, "[Strings]\r\n"); StringCopyAB (dataStr, GetFileNameFromPath ((PSTR)Data->DllParam), _mbsdec(GetFileNameFromPath ((PSTR)Data->DllParam), GetFileExtensionFromPath ((PSTR)Data->DllParam))); b = b && WizardWriteInfString (File, dataStr, FALSE, FALSE, TRUE, '_', 0); b = b && WizardWriteColumn (File, "=", 1); b = b && WizardWriteInfString (File, Args->OptionalText, TRUE, TRUE, FALSE, 0, 0); b = b && WizardWriteRealString (File, "\r\n"); if (!b) break; } Data++; } b = b && WizardWriteRealString (File, "\r\n"); return b; }
BOOL pIncompatibleCPLOutput ( IN HANDLE File, IN POUTPUTARGS Args ) { BOOL b = FALSE; CHAR dataStr[MAX_PATH]; PDATAOBJECT Data = (PDATAOBJECT) g_DataObjects.Buf; PCPL_STRUCT cplStruct;
if (!WizardWriteRealString (File, "[ControlPanelApplets]\r\n")) { return FALSE; }
while ((DWORD)Data < (DWORD)g_DataObjects.Buf + g_DataObjects.End) { if (Data->Flags & DOF_SELECTED) {
cplStruct = (PCPL_STRUCT)Data->DllParam;
if (GetFileAttributesLine ((PSTR)cplStruct->FullPathName, dataStr, MAX_PATH)) { b = WizardWriteQuotedColumn (File, cplStruct->FriendlyName?cplStruct->FriendlyName:Args->OptionalDescription, 30); b = b && WizardWriteRealString (File, ",, "); b = b && WizardWriteString (File, dataStr); b = b && WizardWriteRealString (File, "\r\n"); if (!b) break; } } Data++; } b = b && WizardWriteRealString (File, "\r\n"); return b; }
BOOL pMinorCPLOutput ( IN HANDLE File, IN POUTPUTARGS Args ) { BOOL b = FALSE; CHAR dataStr[MAX_PATH]; PDATAOBJECT Data = (PDATAOBJECT) g_DataObjects.Buf; PCPL_STRUCT cplStruct = NULL;
if (!WizardWriteRealString (File, "[ControlPanelApplets]\r\n")) { return FALSE; }
while ((DWORD)Data < (DWORD)g_DataObjects.Buf + g_DataObjects.End) { if (Data->Flags & DOF_SELECTED) {
cplStruct = (PCPL_STRUCT)Data->DllParam;
if (GetFileAttributesLine ((PSTR)cplStruct->FullPathName, dataStr, MAX_PATH)) { b = WizardWriteQuotedColumn (File, cplStruct->FriendlyName?cplStruct->FriendlyName:Args->OptionalDescription, 30); b = b && WizardWriteRealString (File, ", %"); b = b && WizardWriteInfString (File, cplStruct->FriendlyName?cplStruct->FriendlyName:Args->OptionalDescription, FALSE, FALSE, TRUE, '_', 0); b = b && WizardWriteRealString (File, "%, "); b = b && WizardWriteString (File, dataStr); b = b && WizardWriteRealString (File, "\r\n"); if (!b) break; } } Data++; } b = b && WizardWriteRealString (File, "\r\n"); b = b && WizardWriteRealString (File, "[Strings]\r\n"); b = b && WizardWriteInfString (File, cplStruct->FriendlyName?cplStruct->FriendlyName:Args->OptionalDescription, FALSE, FALSE, TRUE, '_', 0); b = b && WizardWriteRealString (File, "="); b = b && WizardWriteInfString (File, Args->OptionalText, TRUE, TRUE, FALSE, 0, 0); b = b && WizardWriteRealString (File, "\r\n"); return b; }
PCTSTR pSearchModule ( IN PCTSTR CommandLine ) { PTSTR nextChar; TCHAR module [MAX_TCHAR_PATH] = TEXT(""); TCHAR moduleLong [MAX_TCHAR_PATH] = TEXT(""); PATH_ENUM pathEnum; PTSTR candidate;
ExtractArgZero (CommandLine, module); nextChar = _tcsinc (module); if ((nextChar != NULL) && (_tcsnextc (nextChar) == ':') ){ if (!OurGetLongPathName (module, moduleLong, MAX_TCHAR_PATH)) { _tcsncpy (moduleLong, module, MAX_TCHAR_PATH); } return DuplicatePathString (moduleLong, 0); } else { if (EnumFirstPath (&pathEnum, NULL, g_WinDir, g_SystemDir)) { do { candidate = JoinPaths (pathEnum.PtrCurrPath, module); if (DoesFileExist (candidate)) { return candidate; } FreePathString (candidate); } while (EnumNextPath (&pathEnum)); } EnumPathAbort (&pathEnum); } return NULL; }
BOOL pCompatibleRunKeyOutput ( IN HANDLE File ) { BOOL b = FALSE; CHAR dataStr[MAX_PATH]; PDATAOBJECT Data = (PDATAOBJECT) g_DataObjects.Buf; PRUNKEY_STRUCT runKeyStruct; PCSTR fullFileName;
if (!WizardWriteRealString (File, "[CompatibleRunKeyModules]\r\n")) { return FALSE; }
while ((DWORD)Data < (DWORD)g_DataObjects.Buf + g_DataObjects.End) { if (Data->Flags & DOF_SELECTED) {
runKeyStruct = (PRUNKEY_STRUCT)Data->DllParam;
fullFileName = pSearchModule (runKeyStruct->Value);
if (fullFileName) {
if (GetFileAttributesLine ((PSTR)fullFileName, dataStr, MAX_PATH)) { b = WizardWriteQuotedColumn (File, runKeyStruct->ValueName, 30); b = b && WizardWriteRealString (File, ",, "); b = b && WizardWriteString (File, dataStr); b = b && WizardWriteRealString (File, "\r\n"); if (!b) break; } } } Data++; } b = b && WizardWriteRealString (File, "\r\n"); return b; }
BOOL pIncompatibleAppOutput ( IN HANDLE File, IN POUTPUTARGS Args, IN BOOL DosApp ) { BOOL b = TRUE; CHAR dataStr[MAX_PATH]; PDATAOBJECT Data = (PDATAOBJECT) g_DataObjects.Buf; IShellLink *ShellLink; IPersistFile *PersistFile;
CHAR sTarget [MAX_PATH]; CHAR sParams [MAX_PATH]; CHAR sWorkDir [MAX_PATH]; CHAR sIconPath [MAX_PATH]; INT sIconNr; WORD sHotKey; BOOL sDosApp; BOOL sMsDosMode;
DWORD fileCount = 0; PCSTR fileName=NULL;
if (!InitCOMLink (&ShellLink, &PersistFile)) { return FALSE; }
fileCount = 0; fileName = NULL;
while ((DWORD)Data < (DWORD)g_DataObjects.Buf + g_DataObjects.End) { if (Data->Flags & DOF_SELECTED) {
b = b && ExtractShortcutInfo ( sTarget, sParams, sWorkDir, sIconPath, &sIconNr, &sHotKey, &sDosApp, &sMsDosMode, NULL, NULL, (PSTR)Data->DllParam, ShellLink, PersistFile); if (!b) { break; }
fileCount ++; switch (fileCount) {
case 1: fileName = DuplicatePathString (sTarget, 0); b = b && WizardWriteRealString (File, DosApp?"[DosApps]\r\n":"[Incompatible]\r\n"); break;
case 2: b = b && WizardWriteRealString (File, Args->OptionalDescription); b = b && WizardWriteRealString (File, "\r\n\r\n"); b = b && WizardWriteRealString (File, "["); b = b && WizardWriteRealString (File, Args->OptionalDescription); b = b && WizardWriteRealString (File, "]\r\n"); b = b && GetFileAttributesLine (fileName, dataStr, MAX_PATH); b = b && WizardWriteRealString (File, dataStr); b = b && WizardWriteRealString (File, "\r\n");
default:b = b && GetFileAttributesLine (sTarget, dataStr, MAX_PATH); b = b && WizardWriteRealString (File, dataStr); b = b && WizardWriteRealString (File, "\r\n"); }
} Data++; }
if (fileCount == 1) { b = b && WizardWriteRealString (File, Args->OptionalDescription); b = b && WizardWriteRealString (File, ",, "); b = b && GetFileAttributesLine (fileName, dataStr, MAX_PATH); b = b && WizardWriteRealString (File, dataStr); b = b && WizardWriteRealString (File, "\r\n"); }
if (fileCount) { b = b && WizardWriteRealString (File, "\r\n"); }
FreeCOMLink (&ShellLink, &PersistFile);
return b; }
BOOL pReinstallAppOutput ( IN HANDLE File, IN POUTPUTARGS Args ) { BOOL b = TRUE; CHAR dataStr[MAX_PATH]; PDATAOBJECT Data = (PDATAOBJECT) g_DataObjects.Buf; IShellLink *ShellLink; IPersistFile *PersistFile;
CHAR sTarget [MAX_PATH]; CHAR sParams [MAX_PATH]; CHAR sWorkDir [MAX_PATH]; CHAR sIconPath [MAX_PATH]; INT sIconNr; WORD sHotKey; BOOL sDosApp; BOOL sMsDosMode;
DWORD fileCount = 0; PCSTR fileName=NULL;
if (!InitCOMLink (&ShellLink, &PersistFile)) { return FALSE; }
fileCount = 0; fileName = NULL;
while ((DWORD)Data < (DWORD)g_DataObjects.Buf + g_DataObjects.End) { if (Data->Flags & DOF_SELECTED) {
b = b && ExtractShortcutInfo ( sTarget, sParams, sWorkDir, sIconPath, &sIconNr, &sHotKey, &sDosApp, &sMsDosMode, NULL, NULL, (PSTR)Data->DllParam, ShellLink, PersistFile);
if (!b) { break; }
fileCount ++; switch (fileCount) {
case 1: fileName = DuplicatePathString (sTarget, 0); b = b && WizardWriteRealString (File, "[Reinstall]\r\n"); break;
case 2: b = b && WizardWriteRealString (File, Args->OptionalDescription); b = b && WizardWriteRealString (File, "\r\n\r\n"); b = b && WizardWriteRealString (File, "["); b = b && WizardWriteRealString (File, Args->OptionalDescription); b = b && WizardWriteRealString (File, "]\r\n"); b = b && GetFileAttributesLine (fileName, dataStr, MAX_PATH); b = b && WizardWriteRealString (File, dataStr); b = b && WizardWriteRealString (File, "\r\n");
default:b = b && GetFileAttributesLine (sTarget, dataStr, MAX_PATH); b = b && WizardWriteRealString (File, dataStr); b = b && WizardWriteRealString (File, "\r\n"); } } Data++; }
if (fileCount == 1) { b = b && WizardWriteRealString (File, Args->OptionalDescription); b = b && WizardWriteRealString (File, ",, "); b = b && GetFileAttributesLine (fileName, dataStr, MAX_PATH); b = b && WizardWriteRealString (File, dataStr); b = b && WizardWriteRealString (File, "\r\n"); }
if (fileCount) { b = b && WizardWriteRealString (File, "\r\n"); }
FreeCOMLink (&ShellLink, &PersistFile);
return b; }
BOOL pMinorProblemsAppOutput ( IN HANDLE File, IN POUTPUTARGS Args, IN BOOL DosApp ) { BOOL b = TRUE; CHAR dataStr[MAX_PATH]; PDATAOBJECT Data = (PDATAOBJECT) g_DataObjects.Buf; IShellLink *ShellLink; IPersistFile *PersistFile;
CHAR sTarget [MAX_PATH]; CHAR sParams [MAX_PATH]; CHAR sWorkDir [MAX_PATH]; CHAR sIconPath [MAX_PATH]; INT sIconNr; WORD sHotKey; BOOL sDosApp; BOOL sMsDosMode;
DWORD fileCount = 0; PCSTR fileName=NULL;
if (!InitCOMLink (&ShellLink, &PersistFile)) { return FALSE; }
fileCount = 0; fileName = NULL;
while ((DWORD)Data < (DWORD)g_DataObjects.Buf + g_DataObjects.End) { if (Data->Flags & DOF_SELECTED) {
b = b && ExtractShortcutInfo ( sTarget, sParams, sWorkDir, sIconPath, &sIconNr, &sHotKey, &sDosApp, &sMsDosMode, NULL, NULL, (PSTR)Data->DllParam, ShellLink, PersistFile);
if (!b) { break; }
fileCount ++; switch (fileCount) {
case 1: fileName = DuplicatePathString (sTarget, 0); b = b && WizardWriteRealString (File, DosApp?"[DosApps]\r\n":"[MinorProblems]\r\n"); break;
case 2: b = b && WizardWriteRealString (File, Args->OptionalDescription); b = b && WizardWriteRealString (File, ", %"); b = b && WizardWriteInfString (File, Args->OptionalDescription, FALSE, FALSE, TRUE, '_', 0); b = b && WizardWriteRealString (File, "%"); b = b && WizardWriteRealString (File, "\r\n\r\n"); b = b && WizardWriteRealString (File, "["); b = b && WizardWriteRealString (File, Args->OptionalDescription); b = b && WizardWriteRealString (File, "]\r\n"); b = b && GetFileAttributesLine (fileName, dataStr, MAX_PATH); b = b && WizardWriteRealString (File, dataStr); b = b && WizardWriteRealString (File, "\r\n");
default:b = b && GetFileAttributesLine (sTarget, dataStr, MAX_PATH); b = b && WizardWriteRealString (File, dataStr); b = b && WizardWriteRealString (File, "\r\n"); } } Data++; }
if (fileCount == 1) { b = b && WizardWriteRealString (File, Args->OptionalDescription); b = b && WizardWriteRealString (File, ", %"); b = b && WizardWriteInfString (File, Args->OptionalDescription, FALSE, FALSE, TRUE, '_', 0); b = b && WizardWriteRealString (File, "%, "); b = b && GetFileAttributesLine (fileName, dataStr, MAX_PATH); b = b && WizardWriteRealString (File, dataStr); b = b && WizardWriteRealString (File, "\r\n"); }
if (fileCount) { b = b && WizardWriteRealString (File, "\r\n"); b = b && WizardWriteRealString (File, "[Strings]\r\n"); b = b && WizardWriteInfString (File, Args->OptionalDescription, FALSE, FALSE, TRUE, '_', 0); b = b && WizardWriteRealString (File, "="); b = b && WizardWriteInfString (File, Args->OptionalText, TRUE, TRUE, FALSE, 0, 0); b = b && WizardWriteRealString (File, "\r\n"); }
FreeCOMLink (&ShellLink, &PersistFile);
return b; }
BOOL pCompatibleAppOutput ( IN HANDLE File, IN POUTPUTARGS Args ) { BOOL b = TRUE; CHAR dataStr[MAX_PATH]; PDATAOBJECT Data = (PDATAOBJECT) g_DataObjects.Buf; SNAP_FILE_ENUMA e; DWORD fileCount = 0; PCSTR fileName=NULL;
fileCount = 0; fileName = NULL;
if (EnumFirstSnapFile (&e, "*.EXE", SNAP_RESULT_CHANGED|SNAP_RESULT_ADDED)) { do { fileCount ++; switch (fileCount) {
case 1: fileName = DuplicatePathString (e.FileName, 0); b = b && WizardWriteRealString (File, "[CompatibleFiles]\r\n"); break;
case 2: b = b && WizardWriteRealString (File, Args->OptionalDescription); b = b && WizardWriteRealString (File, "\r\n\r\n"); b = b && WizardWriteRealString (File, "["); b = b && WizardWriteRealString (File, Args->OptionalDescription); b = b && WizardWriteRealString (File, "]\r\n"); b = b && GetFileAttributesLine (fileName, dataStr, MAX_PATH); b = b && WizardWriteRealString (File, dataStr); b = b && WizardWriteRealString (File, "\r\n");
default:b = b && GetFileAttributesLine (e.FileName, dataStr, MAX_PATH); b = b && WizardWriteRealString (File, dataStr); b = b && WizardWriteRealString (File, "\r\n"); } } while (EnumNextSnapFile (&e)); }
if (fileCount == 1) { b = b && WizardWriteRealString (File, Args->OptionalDescription); b = b && WizardWriteRealString (File, ",, "); b = b && GetFileAttributesLine (fileName, dataStr, MAX_PATH); b = b && WizardWriteRealString (File, dataStr); b = b && WizardWriteRealString (File, "\r\n"); }
if (fileCount) { b = b && WizardWriteRealString (File, "\r\n"); }
return b; }
BOOL pIncompatibleAllOutput ( IN HANDLE File, IN POUTPUTARGS Args ) { BOOL b = TRUE; CHAR dataStr[MAX_PATH]; PDATAOBJECT Data = (PDATAOBJECT) g_DataObjects.Buf; SNAP_FILE_ENUMA e; DWORD fileCount = 0; PCSTR fileName=NULL;
fileCount = 0; fileName = NULL;
if (EnumFirstSnapFile (&e, "*.EXE", SNAP_RESULT_CHANGED|SNAP_RESULT_ADDED)) { do { fileCount ++; switch (fileCount) {
case 1: fileName = DuplicatePathString (e.FileName, 0); b = b && WizardWriteRealString (File, "[Incompatible]\r\n"); break;
case 2: b = b && WizardWriteRealString (File, Args->OptionalDescription); b = b && WizardWriteRealString (File, "\r\n\r\n"); b = b && WizardWriteRealString (File, "["); b = b && WizardWriteRealString (File, Args->OptionalDescription); b = b && WizardWriteRealString (File, "]\r\n"); b = b && GetFileAttributesLine (fileName, dataStr, MAX_PATH); b = b && WizardWriteRealString (File, dataStr); b = b && WizardWriteRealString (File, "\r\n");
default:b = b && GetFileAttributesLine (e.FileName, dataStr, MAX_PATH); b = b && WizardWriteRealString (File, dataStr); b = b && WizardWriteRealString (File, "\r\n"); } } while (EnumNextSnapFile (&e)); }
if (EnumFirstSnapFile (&e, "*.SCR", SNAP_RESULT_CHANGED|SNAP_RESULT_ADDED)) { do { fileCount ++; switch (fileCount) {
case 1: fileName = DuplicatePathString (e.FileName, 0); b = b && WizardWriteRealString (File, "[Incompatible]\r\n"); break;
case 2: b = b && WizardWriteRealString (File, Args->OptionalDescription); b = b && WizardWriteRealString (File, "\r\n\r\n"); b = b && WizardWriteRealString (File, "["); b = b && WizardWriteRealString (File, Args->OptionalDescription); b = b && WizardWriteRealString (File, "]\r\n"); b = b && GetFileAttributesLine (fileName, dataStr, MAX_PATH); b = b && WizardWriteRealString (File, dataStr); b = b && WizardWriteRealString (File, "\r\n");
default:b = b && GetFileAttributesLine (e.FileName, dataStr, MAX_PATH); b = b && WizardWriteRealString (File, dataStr); b = b && WizardWriteRealString (File, "\r\n"); } } while (EnumNextSnapFile (&e)); }
if (fileCount == 1) { b = b && WizardWriteRealString (File, Args->OptionalDescription); b = b && WizardWriteRealString (File, ",, "); b = b && GetFileAttributesLine (fileName, dataStr, MAX_PATH); b = b && WizardWriteRealString (File, dataStr); b = b && WizardWriteRealString (File, "\r\n"); }
if (fileCount) { b = b && WizardWriteRealString (File, "\r\n"); }
fileCount = 0; fileName = NULL;
if (EnumFirstSnapFile (&e, "*.CPL", SNAP_RESULT_CHANGED|SNAP_RESULT_ADDED)) { do { fileCount ++; switch (fileCount) {
case 1: fileName = DuplicatePathString (e.FileName, 0); b = b && WizardWriteRealString (File, "[ControlPanelApplets]\r\n"); break;
case 2: b = b && WizardWriteRealString (File, Args->OptionalDescription); b = b && WizardWriteRealString (File, "\r\n\r\n"); b = b && WizardWriteRealString (File, "["); b = b && WizardWriteRealString (File, Args->OptionalDescription); b = b && WizardWriteRealString (File, "-CPLs]\r\n"); b = b && GetFileAttributesLine (fileName, dataStr, MAX_PATH); b = b && WizardWriteRealString (File, dataStr); b = b && WizardWriteRealString (File, "\r\n");
default:b = b && GetFileAttributesLine (e.FileName, dataStr, MAX_PATH); b = b && WizardWriteRealString (File, dataStr); b = b && WizardWriteRealString (File, "\r\n"); } } while (EnumNextSnapFile (&e)); }
if (fileCount == 1) { b = b && WizardWriteRealString (File, Args->OptionalDescription); b = b && WizardWriteRealString (File, "-CPLs,, "); b = b && GetFileAttributesLine (fileName, dataStr, MAX_PATH); b = b && WizardWriteRealString (File, dataStr); b = b && WizardWriteRealString (File, "\r\n"); }
if (fileCount) { b = b && WizardWriteRealString (File, "\r\n"); } return b; }
BOOL GenerateOutput ( IN POUTPUTARGS Args ) { BOOL b = FALSE; HANDLE File; CHAR Path[MAX_MBCHAR_PATH];
switch (Args->DataTypeId) {
case 0: // incompatible - snapshot
wsprintf (Path, "%s\\IncAll.txt", Args->OutboundDir); break;
case 1: // compatible Apps
wsprintf (Path, "%s\\CompatA.txt", Args->OutboundDir); break;
case 2: // incompatible Apps
wsprintf (Path, "%s\\IncompA.txt", Args->OutboundDir); break;
case 3: // incompatible DOS Apps
wsprintf (Path, "%s\\IncompDA.txt", Args->OutboundDir); break;
case 4: // Apps to be reinstalled
wsprintf (Path, "%s\\ReinstA.txt", Args->OutboundDir); break;
case 5: // Apps with minor problems
wsprintf (Path, "%s\\MinorA.txt", Args->OutboundDir); break;
case 6: // DOS Apps with minor problems
wsprintf (Path, "%s\\MinorDA.txt", Args->OutboundDir); break;
case 7: // incompatible CPLs
wsprintf (Path, "%s\\IncCPL.txt", Args->OutboundDir); break;
case 8: // incompatible CPLs
wsprintf (Path, "%s\\MinorCPL.txt", Args->OutboundDir); break;
case 9: // incompatible SCRs
wsprintf (Path, "%s\\IncSCR.txt", Args->OutboundDir); break;
case 10: // SCRs with minor problems
wsprintf (Path, "%s\\MinorSCR.txt", Args->OutboundDir); break;
case 11: // compatible RunKey entries
wsprintf (Path, "%s\\CompatRK.txt", Args->OutboundDir); break;
default: break; }
printf ("Saving data to %s\n\n", Path);
File = CreateFile ( Path, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
if (File == INVALID_HANDLE_VALUE) { printf ("Can't open file for output.\n"); return FALSE; }
__try { SetFilePointer (File, 0, NULL, FILE_END);
//
// Write [Identification] for all .inx files
//
if (!WizardWriteRealString (File, "[Identification]\r\n")) { __leave; }
//
// Write user name and date/time
//
if (!WriteHeader (File)) { __leave; }
switch (Args->DataTypeId) {
case 0: // incompatible - snapshot
b = pIncompatibleAllOutput (File, Args); break;
case 1: // compatible Apps
b = pCompatibleAppOutput (File, Args); break;
case 2: // incompatible Apps
b = pIncompatibleAppOutput (File, Args, FALSE); break;
case 3: // incompatible DOS Apps
b = pIncompatibleAppOutput (File, Args, TRUE); break;
case 4: // Apps to be reinstalled
b = pReinstallAppOutput (File, Args); break;
case 5: // Apps with minor problems
b = pMinorProblemsAppOutput (File, Args, FALSE); break;
case 6: // DOS Apps with minor problems
b = pMinorProblemsAppOutput (File, Args, TRUE); break;
case 7: // incompatible CPLs
b = pIncompatibleCPLOutput (File, Args); break;
case 8: // CPLs with minor problems
b = pMinorCPLOutput (File, Args); break;
case 9: // incompatible SCRs
b = pIncompatibleSCROutput (File); break;
case 10: // SCRs with minor problems
b = pMinorProblemsSCROutput (File, Args); break;
case 11: // compatible RunKey entries
b = pCompatibleRunKeyOutput (File); break;
default: MessageBox (NULL, "Internal App DLL error:00003. Please contact calinn.", "Error", MB_OK); }
//
// Write a final blank line
//
b = b && WizardWriteRealString (File, "\r\n"); } __finally { CloseHandle (File); }
return b; }
BOOL DisplayOptionalUI ( IN POUTPUTARGS Args ) { PDATAOBJECT Data = (PDATAOBJECT) g_DataObjects.Buf; PCPL_STRUCT cplStruct;
switch (Args->DataTypeId) {
case 0: case 1: printf ("Taking a snapshot of your system. Please wait..."); TakeSnapShotEx (SNAP_FILES); printf ("Done\n"); MessageBox (NULL, "Please install your application and then press the OK button", "Install APP", MB_OK); printf ("Generating a diff. Please wait..."); GenerateDiffOutputEx (NULL, NULL, FALSE, SNAP_FILES); printf ("Done\n"); break;
case 7: case 8: // incompatible CPLs
while ((DWORD)Data < (DWORD)g_DataObjects.Buf + g_DataObjects.End) { if (Data->Flags & DOF_SELECTED) {
cplStruct = (PCPL_STRUCT)Data->DllParam;
if (cplStruct->FriendlyName) { g_DataTypes[Args->DataTypeId].Flags &= (~DTF_REQUIRE_DESCRIPTION); } } Data ++; } break; }
return TRUE; }
|