/*++ Copyright (c) 1992 Microsoft Corporation Module Name: showinst.c Abstract: This program displays the contents of an Installation Modification Log file created by the INSTALER program Author: Steve Wood (stevewo) 15-Jan-1996 Revision History: --*/ #include "instutil.h" #include "iml.h" BOOLEAN DisplayContentsOfTextFiles; int ProcessShowIml( PINSTALLATION_MODIFICATION_LOGFILE pIml ); int __cdecl main( int argc, char *argv[] ) { int Result; char *s; PWSTR pw; PINSTALLATION_MODIFICATION_LOGFILE pIml; InitCommonCode( "SHOWINST", "[-c]", "-c specifies to display the contents of text files\n" ); DisplayContentsOfTextFiles = FALSE; while (--argc) { s = *++argv; if (*s == '-' || *s == '/') { while (*++s) { switch( tolower( *s ) ) { case 'c': DisplayContentsOfTextFiles = TRUE; break; default: CommonSwitchProcessing( &argc, &argv, *s ); break; } } } else if (!CommonArgProcessing( &argc, &argv )) { Usage( "Arguments not supported - '%s'", (ULONG)s ); } } if (ImlPath == NULL) { Usage( "Must specify an installation name as first argument", 0 ); } if (!SetCurrentDirectory( InstalerDirectory )) { FatalError( "Unable to change to '%ws' directory (%u)", (ULONG)InstalerDirectory, GetLastError() ); } pIml = LoadIml( ImlPath ); if (pIml == NULL) { FatalError( "Unable to open '%ws' (%u)", (ULONG)ImlPath, GetLastError() ); } Result = ProcessShowIml( pIml ); CloseIml( pIml ); exit( Result ); return Result; } int ProcessShowIml( PINSTALLATION_MODIFICATION_LOGFILE pIml ) { PIML_FILE_RECORD pFile; PIML_FILE_RECORD_CONTENTS pOldFile; PIML_FILE_RECORD_CONTENTS pNewFile; PIML_KEY_RECORD pKey; PIML_VALUE_RECORD pValue; PIML_VALUE_RECORD_CONTENTS pOldValue; PIML_VALUE_RECORD_CONTENTS pNewValue; PIML_INI_RECORD pIni; PIML_INISECTION_RECORD pSection; PIML_INIVARIABLE_RECORD pVariable; BOOLEAN FileNameShown; BOOLEAN SectionNameShown; if (pIml->NumberOfFileRecords > 0) { printf( "File Modifications:\n" ); pFile = MP( PIML_FILE_RECORD, pIml, pIml->FileRecords ); while (pFile != NULL) { pOldFile = MP( PIML_FILE_RECORD_CONTENTS, pIml, pFile->OldFile ); pNewFile = MP( PIML_FILE_RECORD_CONTENTS, pIml, pFile->NewFile ); printf( " %ws - ", MP( PWSTR, pIml, pFile->Name ) ); switch( pFile->Action ) { case CreateNewFile: printf( "created\n" ); break; case ModifyOldFile: printf( "overwritten\n" ); if (pOldFile != NULL) { printf( " Old size is %u bytes\n", pOldFile->FileSize ); } break; case DeleteOldFile: printf( "deleted\n" ); if (pOldFile != NULL) { printf( " Old size is %u bytes\n", pOldFile->FileSize ); } break; case ModifyFileDateTime: printf( "date/time modified\n" ); break; case ModifyFileAttributes: printf( "attributes modified\n" ); break; } pFile = MP( PIML_FILE_RECORD, pIml, pFile->Next ); } printf( "\n" ); } if (pIml->NumberOfKeyRecords > 0) { printf( "Registry Modifications:\n" ); pKey = MP( PIML_KEY_RECORD, pIml, pIml->KeyRecords ); while (pKey != NULL) { printf( " %ws - ", MP( PWSTR, pIml, pKey->Name ) ); switch( pKey->Action ) { case CreateNewKey: printf( "created\n" ); break; case DeleteOldKey: printf( "deleted\n" ); break; case ModifyKeyValues: printf( "modified\n" ); break; } pValue = MP( PIML_VALUE_RECORD, pIml, pKey->Values ); while (pValue != NULL) { pOldValue = MP( PIML_VALUE_RECORD_CONTENTS, pIml, pValue->OldValue ); pNewValue = MP( PIML_VALUE_RECORD_CONTENTS, pIml, pValue->NewValue ); printf( " %ws - ", MP( PWSTR, pIml, pValue->Name ) ); if (pValue->Action != DeleteOldValue) { printf( "%s [%x]", FormatEnumType( 0, ValueDataTypeNames, pNewValue->Type, FALSE ), pNewValue->Length ); if (pNewValue->Type == REG_SZ || pNewValue->Type == REG_EXPAND_SZ ) { printf( " '%ws'", MP( PWSTR, pIml, pNewValue->Data ) ); } else if (pNewValue->Type == REG_DWORD) { printf( " 0x%x", *MP( PULONG, pIml, pNewValue->Data ) ); } } if (pValue->Action == CreateNewValue) { printf( " (created)\n" ); } else { if (pValue->Action == DeleteOldValue) { printf( " (deleted" ); } else { printf( " (modified" ); } printf( " - was %s [%x]", FormatEnumType( 0, ValueDataTypeNames, pOldValue->Type, FALSE ), pOldValue->Length ); if (pOldValue->Type == REG_SZ || pOldValue->Type == REG_EXPAND_SZ ) { printf( " '%ws'", MP( PWSTR, pIml, pOldValue->Data ) ); } else if (pOldValue->Type == REG_DWORD) { printf( " 0x%x", *MP( PULONG, pIml, pOldValue->Data ) ); } printf( " )\n" ); } pValue = MP( PIML_VALUE_RECORD, pIml, pValue->Next ); } pKey = MP( PIML_KEY_RECORD, pIml, pKey->Next ); } printf( "\n" ); } if (pIml->NumberOfIniRecords > 0) { printf( ".INI File modifications:\n" ); pIni = MP( PIML_INI_RECORD, pIml, pIml->IniRecords ); while (pIni != NULL) { FileNameShown = FALSE; pSection = MP( PIML_INISECTION_RECORD, pIml, pIni->Sections ); while (pSection != NULL) { SectionNameShown = FALSE; pVariable = MP( PIML_INIVARIABLE_RECORD, pIml, pSection->Variables ); while (pVariable != NULL) { if (!FileNameShown) { printf( "%ws", MP( PWSTR, pIml, pIni->Name ) ); if (pIni->Action == CreateNewIniFile) { printf( " (created)" ); } printf( "\n" ); FileNameShown = TRUE; } if (!SectionNameShown) { printf( " [%ws]", MP( PWSTR, pIml, pSection->Name ) ); if (pSection->Action == CreateNewSection) { printf( " (created)" ); } else if (pSection->Action == DeleteOldSection) { printf( " (deleted)" ); } printf( "\n" ); SectionNameShown = TRUE; } printf( " %ws = ", MP( PWSTR, pIml, pVariable->Name ) ); if (pVariable->Action == CreateNewVariable) { printf( "'%ws' (created)\n", MP( PWSTR, pIml, pVariable->NewValue ) ); } else if (pVariable->Action == DeleteOldVariable) { printf( " (deleted - was '%ws')\n", MP( PWSTR, pIml, pVariable->OldValue ) ); } else { printf( "'%ws' (modified - was '%ws')\n", MP( PWSTR, pIml, pVariable->NewValue ), MP( PWSTR, pIml, pVariable->OldValue ) ); } pVariable = MP( PIML_INIVARIABLE_RECORD, pIml, pVariable->Next ); } pSection = MP( PIML_INISECTION_RECORD, pIml, pSection->Next ); } if (FileNameShown) { printf( "\n" ); } pIni = MP( PIML_INI_RECORD, pIml, pIni->Next ); } } return 0; }