/*++ Copyright (c) 1997 Microsoft Corporation Module Name: hwwiz.c Abstract: Implements a upgwiz wizard for obtaining dos configuration information. Author: Jim Schmidt (jimschm) 12-Oct-1998 Revision History: --*/ #include "pch.h" #include "..\inc\dgdll.h" DATATYPE g_DataTypes[] = { {UPGWIZ_VERSION, "DOS Device or TSR should be compatible", "You specify the DOS configuration line that was incorrectly marked as incompatible.", 0, DTF_REQUIRE_TEXT|DTF_REQUIRE_DESCRIPTION|DTF_ONE_SELECTION, 1024, "&Name of Device or TSR Program:" }, {UPGWIZ_VERSION, "DOS Device or TSR should be incompatible", "You specify the DOS configuration lines that need to be reported as incompatible.", 0, DTF_REQUIRE_TEXT|DTF_REQUIRE_DESCRIPTION|DTF_ONE_SELECTION, 1024, "&Name of Device or TSR Program:", "&Describe the Problem:" } }; 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; } PDATAOBJECT GiveDataObjectList ( IN UINT DataTypeId, OUT PUINT Count ) { PDATAOBJECT data; MEMDB_ENUM e; TCHAR line[MEMDB_MAX]; TCHAR key[MEMDB_MAX]; TCHAR file[MEMDB_MAX]; DWORD offset; DWORD value; DWORD curOffset; PTSTR name; g_DataObjectPool = PoolMemInitNamedPool ("Data Objects"); // // Parse the dos files. // ParseDosFiles (); curOffset = 0; // // Send the list back. // if (MemDbEnumItems (&e, MEMDB_CATEGORY_DM_LINES)) { do { // // Get the actual line contents. // if (MemDbGetEndpointValueEx (MEMDB_CATEGORY_DM_LINES, e.szName, NULL, line)) { // // Get the value and flags from this endpoint. // MemDbBuildKey (key, MEMDB_CATEGORY_DM_LINES, e.szName, NULL, line); MemDbGetValueAndFlags( key, &offset, &value); if (curOffset != offset) { MemDbBuildKeyFromOffset (offset, file, 1, NULL); curOffset = offset; ReplaceWacks (file); } ReplaceWacks (line); name = JoinPaths(file,line); // // create dataobject with this data. // data = (PDATAOBJECT) GrowBuffer (&g_DataObjects, sizeof (DATAOBJECT)); data -> Version = UPGWIZ_VERSION; data -> NameOrPath = PoolMemDuplicateString (g_DataObjectPool, name); data -> Flags = DOF_NO_SORT; data -> DllParam = PoolMemDuplicateString (g_DataObjectPool, key); FreePathString (name); } } while (MemDbEnumNextValue (&e)); } *Count = g_DataObjects.End / sizeof (DATAOBJECT); return (PDATAOBJECT) g_DataObjects.Buf; } BOOL GenerateOutput ( IN POUTPUTARGS Args ) { BOOL rSuccess = FALSE; TCHAR path[MAX_TCHAR_PATH]; HANDLE file; PDATAOBJECT data = (PDATAOBJECT) g_DataObjects.Buf; UINT count = g_DataObjects.End / sizeof (DATAOBJECT); UINT i; LINESTRUCT ls; PTSTR p; // // Create path to outbond file // wsprintf ( path, TEXT("%s\\%s"), Args -> OutboundDir, Args -> DataTypeId ? "incmpdos.txt" : "cmpdos.txt" ); 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) { // // Write the full line. // p = _mbschr (data -> NameOrPath, '\\'); MYASSERT (p); *p = 0; RestoreWacks ((PTSTR) data -> NameOrPath); rSuccess &= WizardWriteString (file, "file: "); rSuccess &= WizardWriteString (file, data -> NameOrPath); rSuccess &= WizardWriteString (file, "\r\n"); p = _mbsinc (p); RestoreWacks (p); rSuccess &= WizardWriteString (file, "line: "); rSuccess &= WizardWriteString (file, p); rSuccess &= WizardWriteString (file, "\r\n"); StringCopy (path, p); do { InitLineStruct (&ls, path); if (DoesFileExist (ls.FullPath)) { // // Write File Attributes // rSuccess &= WriteFileAttributes (Args, NULL, file, ls.FullPath, NULL); } p = ls.Arguments; if (*p == '=') { p = _mbsinc (p); } p = (PTSTR) SkipSpace (p); if (p) { if (*p == '=') { p = (PTSTR) SkipSpace(_mbsinc (p)); } if (p) { StringCopy (path, p); } } if (!p) { *path = 0; } } while (*ls.Arguments && StringCompare (ls.FullLine,ls.Arguments)); } data++; } // // write a final blank line. // WizardWriteRealString (file, "\r\n\r\n"); } __finally { CloseHandle (file); } return rSuccess; }