/*++ Copyright (c) 1997 Microsoft Corporation Module Name: hwwiz.c Abstract: Implements an upgrade wizard for gathering virus scanner information. Author: Marc Whitten (marcw) 16-Oct-1998 Revision History: --*/ #include "pch.h" #include "..\inc\dgdll.h" #include "..\..\w95upg\migapp\migdbp.h" DATATYPE g_DataTypes[] = { {UPGWIZ_VERSION, "Virus Scanner should be detected", "You identify running executables that correspond with installed virus scanners on your system.", 0, DTF_REQUIRE_DESCRIPTION|DTF_ONE_SELECTION, 1024, "&Name of Virus Scanner ( )" } }; GROWBUFFER g_DataObjects = GROWBUF_INIT; POOLHANDLE g_DataObjectPool; HINSTANCE g_OurInst; BOOL g_GoodVersion = FALSE; 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; } BOOL ParseDosFiles (VOID); PDATAOBJECT GiveDataObjectList ( IN UINT DataTypeId, OUT PUINT Count ) { PDATAOBJECT data; HANDLE snapShot; PROCESSENTRY32 process; CHAR name[MEMDB_MAX]; CHAR fixedPath[MAX_MBCHAR_PATH]; PSTR company; PSTR product; PSTR version; g_DataObjectPool = PoolMemInitNamedPool ("Data Objects"); g_GoodVersion = FALSE; // // Get list of currently running applications. // snapShot = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0); if (snapShot != INVALID_HANDLE_VALUE) { // // Enumerate all the processes running and retrieve their executables. // process.dwSize = sizeof (PROCESSENTRY32); if (Process32First (snapShot, &process)) { do { // // Get version information if it exists. // company = QueryVersionEntry (process.szExeFile, "COMPANYNAME"); product = QueryVersionEntry (process.szExeFile, "PRODUCTNAME"); version = QueryVersionEntry (process.szExeFile, "PRODUCTVERSION"); StringCopy (fixedPath, process.szExeFile); ReplaceWacks (fixedPath); wsprintf ( name, "%s\\%s %s\\%s", company ? company : "", product ? product : "", version ? version : "", fixedPath ); // // Create data object for this executable. // data = (PDATAOBJECT) GrowBuffer (&g_DataObjects, sizeof(DATAOBJECT)); data -> Version = UPGWIZ_VERSION; data -> NameOrPath = PoolMemDuplicateString (g_DataObjectPool, name); data -> Flags = 0; data -> DllParam = PoolMemDuplicateString (g_DataObjectPool, process.szExeFile); // // Clean up version resources. // FreePathString (company); FreePathString (product); FreePathString (version); } while (Process32Next (snapShot, &process)); } } *Count = g_DataObjects.End / sizeof (DATAOBJECT); return (PDATAOBJECT) g_DataObjects.Buf; } BOOL DisplayOptionalUI ( IN POUTPUTARGS Args ) { PDATAOBJECT data = (PDATAOBJECT) g_DataObjects.Buf; UINT count = g_DataObjects.End / sizeof (DATAOBJECT); UINT i; for (i = 0; i < count; i++) { if (data -> Flags & DOF_SELECTED) { // // If we got good version info, don't worry about the text. We'll use // what we have. // if (!IsPatternMatch("\\ *",data->NameOrPath)) { g_DataTypes[0].Flags &= ~DTF_REQUIRE_DESCRIPTION; g_GoodVersion = TRUE; } break; } data++; } return TRUE; } BOOL GenerateOutput ( IN POUTPUTARGS Args ) { BOOL rSuccess = FALSE; HANDLE file; CHAR path[MAX_MBCHAR_PATH]; PSTR p; PDATAOBJECT data = (PDATAOBJECT) g_DataObjects.Buf; UINT count = g_DataObjects.End / sizeof (DATAOBJECT); UINT i; // // create outbound file path. // wsprintf ( path, "%s\\vscan.txt", Args -> OutboundDir ); // // open file. // 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); // // log user name and date/time // if (!WriteHeader (file)) { __leave; } // // write data. // rSuccess = TRUE; for (i = 0; i < count; i++) { if (data -> Flags & DOF_SELECTED) { if (g_GoodVersion) { // // Use the data that we have. // p = _mbsrchr (data -> NameOrPath, '\\'); MYASSERT (p); *p = 0; } // // Ask for info if we didn't get any version info, otherwise, // we'll use what we got. // rSuccess &= WriteFileAttributes ( Args, g_GoodVersion ? data -> NameOrPath : NULL, file, data -> DllParam, NULL ); } data++; } // // write a final blank line. // WizardWriteRealString (file, "\r\n\r\n"); } __finally { // // Don't forget to cleanup resources. // CloseHandle (file); } return rSuccess; }