/*++ Copyright (c) 1992 Microsoft Corporation Module Name: iml.h Abstract: Header for for creating, accessing and manipulating Installation Modification Log files (.IML extension) created by INSTALER.EXE Author: Steve Wood (stevewo) 23-Jan-1996 --*/ typedef ULONG POFFSET; #define MP(t,b,o) ((t)((o) ? (PVOID)((ULONG)(b) + (o)) : NULL)) typedef struct _INSTALLATION_MODIFICATION_LOGFILE { ULONG Signature; USHORT HeaderSize; USHORT Flags; HANDLE FileHandle; ULONG FileOffset; ULONG NumberOfFileRecords; POFFSET FileRecords; // IML_FILE_RECORD ULONG NumberOfKeyRecords; POFFSET KeyRecords; // IML_KEY_RECORD ULONG NumberOfIniRecords; POFFSET IniRecords; // IML_INI_RECORD } INSTALLATION_MODIFICATION_LOGFILE, *PINSTALLATION_MODIFICATION_LOGFILE; #define IML_SIGNATURE 0xFF0AA0FF #define IML_FLAG_CONTAINS_NEWFILECONTENTS 0x0001 #define IML_FLAG_ACTIONS_UNDONE 0x0002 PWSTR FormatImlPath( PWSTR DirectoryPath, PWSTR InstallationName ); PINSTALLATION_MODIFICATION_LOGFILE CreateIml( PWSTR ImlPath, BOOLEAN IncludeCreateFileContents ); PINSTALLATION_MODIFICATION_LOGFILE LoadIml( PWSTR ImlPath ); BOOLEAN CloseIml( PINSTALLATION_MODIFICATION_LOGFILE pIml ); typedef enum _IML_FILE_ACTION { CreateNewFile, ModifyOldFile, DeleteOldFile, ModifyFileDateTime, ModifyFileAttributes } IML_FILE_ACTION; typedef struct _IML_FILE_RECORD_CONTENTS { FILETIME LastWriteTime; DWORD FileAttributes; DWORD FileSize; POFFSET Contents; // VOID } IML_FILE_RECORD_CONTENTS, *PIML_FILE_RECORD_CONTENTS; typedef struct _IML_FILE_RECORD { POFFSET Next; // IML_FILE_RECORD IML_FILE_ACTION Action; POFFSET Name; // WCHAR POFFSET OldFile; // IML_FILE_RECORD_CONTENTS POFFSET NewFile; // IML_FILE_RECORD_CONTENTS } IML_FILE_RECORD, *PIML_FILE_RECORD; BOOLEAN ImlAddFileRecord( PINSTALLATION_MODIFICATION_LOGFILE pIml, IML_FILE_ACTION Action, PWSTR Name, PWSTR BackupFileName, PFILETIME BackupLastWriteTime, DWORD BackupFileAttributes ); typedef enum _IML_VALUE_ACTION { CreateNewValue, DeleteOldValue, ModifyOldValue } IML_VALUE_ACTION; typedef struct _IML_VALUE_RECORD_CONTENTS { DWORD Type; DWORD Length; POFFSET Data; // VOID } IML_VALUE_RECORD_CONTENTS, *PIML_VALUE_RECORD_CONTENTS; typedef struct _IML_VALUE_RECORD { POFFSET Next; // IML_VALUE_RECORD IML_VALUE_ACTION Action; POFFSET Name; // WCHAR POFFSET OldValue; // IML_VALUE_RECORD_CONTENTS POFFSET NewValue; // IML_VALUE_RECORD_CONTENTS } IML_VALUE_RECORD, *PIML_VALUE_RECORD; BOOLEAN ImlAddValueRecord( PINSTALLATION_MODIFICATION_LOGFILE pIml, IML_VALUE_ACTION Action, PWSTR Name, DWORD ValueType, ULONG ValueLength, PVOID ValueData, DWORD BackupValueType, ULONG BackupValueLength, PVOID BackupValueData, POFFSET *Values // IML_VALUE_RECORD ); typedef enum _IML_KEY_ACTION { CreateNewKey, DeleteOldKey, ModifyKeyValues } IML_KEY_ACTION; typedef struct _IML_KEY_RECORD { POFFSET Next; // IML_KEY_RECORD IML_KEY_ACTION Action; POFFSET Name; // WCHAR POFFSET Values; // IML_VALUE_RECORD } IML_KEY_RECORD, *PIML_KEY_RECORD; BOOLEAN ImlAddKeyRecord( PINSTALLATION_MODIFICATION_LOGFILE pIml, IML_KEY_ACTION Action, PWSTR Name, POFFSET Values // IML_VALUE_RECORD ); typedef enum _IML_INIVARIABLE_ACTION { CreateNewVariable, DeleteOldVariable, ModifyOldVariable } IML_INIVARIABLE_ACTION; typedef struct _IML_INIVARIABLE_RECORD { POFFSET Next; // IML_INIVARIABLE_RECORD IML_INIVARIABLE_ACTION Action; POFFSET Name; // WCHAR POFFSET OldValue; // WCHAR POFFSET NewValue; // WCHAR } IML_INIVARIABLE_RECORD, *PIML_INIVARIABLE_RECORD; BOOLEAN ImlAddIniVariableRecord( PINSTALLATION_MODIFICATION_LOGFILE pIml, IML_INIVARIABLE_ACTION Action, PWSTR Name, PWSTR OldValue, PWSTR NewValue, POFFSET *Variables // IML_INIVARIABLE_RECORD ); typedef enum _IML_INISECTION_ACTION { CreateNewSection, DeleteOldSection, ModifySectionVariables } IML_INISECTION_ACTION; typedef struct _IML_INISECTION_RECORD { POFFSET Next; // IML_INISECTION_RECORD IML_INISECTION_ACTION Action; POFFSET Name; // WCHAR POFFSET Variables; // IML_INIVARIABLE_RECORD } IML_INISECTION_RECORD, *PIML_INISECTION_RECORD; BOOLEAN ImlAddIniSectionRecord( PINSTALLATION_MODIFICATION_LOGFILE pIml, IML_INISECTION_ACTION Action, PWSTR Name, POFFSET Variables, // IML_INIVARIABLE_RECORD POFFSET *Sections // IML_INISECTION_RECORD ); typedef enum _IML_INI_ACTION { CreateNewIniFile, ModifyOldIniFile } IML_INI_ACTION; typedef struct _IML_INI_RECORD { POFFSET Next; // IML_INI_RECORD IML_INI_ACTION Action; POFFSET Name; // WCHAR POFFSET Sections; // IML_INISECTION_RECORD FILETIME LastWriteTime; } IML_INI_RECORD, *PIML_INI_RECORD; BOOLEAN ImlAddIniRecord( PINSTALLATION_MODIFICATION_LOGFILE pIml, IML_INI_ACTION Action, PWSTR Name, PFILETIME BackupLastWriteTime, POFFSET Sections // IML_INISECTION_RECORD );