/*++ Copyright (c) 1992 Microsoft Corporation Module Name: instaler.h Abstract: Main include file for the INSTALER application. Author: Steve Wood (stevewo) 09-Aug-1994 Revision History: --*/ #ifdef RC_INVOKED #include #define FILEBMP 500 #define DIRBMP 501 #else #include #include #include #include #include #include #include #include #include "errormsg.h" // // Data structures and entry points in ERROR.C // #define TRACE_ENABLED 1 #if TRACE_ENABLED extern ULONG EnabledTraceEvents; #define DBG_MASK_DBGEVENT 0x00000001 #define DBG_MASK_INTERNALERROR 0x00000002 #define DBG_MASK_MEMORYERROR 0x00000004 #define DBG_MASK_CREATEEVENT 0x00000008 VOID TraceDisplay( const char *FormatString, ... ); #define DbgEvent( m, x ) if (EnabledTraceEvents & (DBG_MASK_##m)) TraceDisplay x #define TestDbgEvent( m ) (EnabledTraceEvents & (DBG_MASK_##m)) #else #define DbgEvent( m, x ) #define TestDbgEvent( m ) (FALSE) #endif VOID CDECL DeclareError( UINT ErrorCode, UINT SupplementalErrorCode, ... ); UINT CDECL AskUser( UINT MessageBoxFlags, UINT MessageId, UINT NumberOfArguments, ... ); // // Data structures and entry points in EVENT.C // VOID CDECL LogEvent( UINT MessageId, UINT NumberOfArguments, ... ); // // Data structures and entry points in PROCESS.C // #define HANDLE_TYPE_FILE 0 #define HANDLE_TYPE_KEY 1 #define HANDLE_TYPE_NONE 2 typedef struct _OPENHANDLE_INFO { LIST_ENTRY Entry; HANDLE Handle; BOOLEAN Inherit; BOOLEAN RootDirectory; USHORT Type; USHORT LengthOfName; PWSTR Name; // // Union for handlers that need to store state in a handle during // use. // union { PWSTR QueryName; }; } OPENHANDLE_INFO, *POPENHANDLE_INFO; typedef struct _PROCESS_INFO { LIST_ENTRY Entry; LIST_ENTRY ThreadListHead; LIST_ENTRY BreakpointListHead; LIST_ENTRY OpenHandleListHead; DWORD Id; HANDLE Handle; PROCESS_BASIC_INFORMATION ProcessInformation; WCHAR ImageFileName[ 32 ]; } PROCESS_INFO, *PPROCESS_INFO; typedef struct _THREAD_INFO { LIST_ENTRY Entry; LIST_ENTRY BreakpointListHead; DWORD Id; HANDLE Handle; PVOID StartAddress; ULONG ModuleIndexCurrentlyIn; BOOLEAN SingleStepExpected; struct _BREAKPOINT_INFO *BreakpointToStepOver; } THREAD_INFO, *PTHREAD_INFO; LIST_ENTRY ProcessListHead; BOOLEAN AddProcess( LPDEBUG_EVENT DebugEvent, PPROCESS_INFO *ReturnedProcess ); BOOLEAN DeleteProcess( PPROCESS_INFO Process ); BOOLEAN AddThread( LPDEBUG_EVENT DebugEvent, PPROCESS_INFO Process, PTHREAD_INFO *ReturnedThread ); BOOLEAN DeleteThread( PPROCESS_INFO Process, PTHREAD_INFO Thread ); PPROCESS_INFO FindProcessById( ULONG Id ); BOOLEAN FindProcessAndThreadForEvent( LPDEBUG_EVENT DebugEvent, PPROCESS_INFO *ReturnedProcess, PTHREAD_INFO *ReturnedThread ); BOOLEAN HandleThreadsForSingleStep( PPROCESS_INFO Process, PTHREAD_INFO ThreadToSingleStep, BOOLEAN SuspendThreads ); BOOLEAN ReadMemory( PPROCESS_INFO Process, PVOID Address, PVOID DataRead, ULONG BytesToRead, PCHAR Reason ); BOOLEAN WriteMemory( PPROCESS_INFO Process, PVOID Address, PVOID DataToWrite, ULONG BytesToWrite, PCHAR Reason ); PVOID AllocMem( ULONG Size ); VOID FreeMem( PVOID *p ); // // Data structures and entry points in MACHINE.C // PVOID BreakpointInstruction; ULONG SizeofBreakpointInstruction; PVOID GetAddressForEntryPointBreakpoint( PVOID EntryPointAddress, DWORD NumberOfFunctionTableEntries OPTIONAL, PIMAGE_RUNTIME_FUNCTION_ENTRY FunctionTableEntries OPTIONAL ); BOOLEAN SkipOverHardcodedBreakpoint( PPROCESS_INFO Process, PTHREAD_INFO Thread, PVOID BreakpointAddress ); BOOLEAN ExtractProcedureParameters( PPROCESS_INFO Process, PTHREAD_INFO Thread, PULONG ReturnAddress, ULONG SizeOfParameters, PULONG Parameters ); BOOLEAN ExtractProcedureReturnValue( PPROCESS_INFO Process, PTHREAD_INFO Thread, PVOID ReturnValue, ULONG SizeOfReturnValue ); BOOLEAN SetProcedureReturnValue( PPROCESS_INFO Process, PTHREAD_INFO Thread, PVOID ReturnValue, ULONG SizeOfReturnValue ); BOOLEAN ForceReturnToCaller( PPROCESS_INFO Process, PTHREAD_INFO Thread, ULONG SizeOfParameters, PVOID ReturnAddress, PVOID ReturnValue, ULONG SizeOfReturnValue ); BOOLEAN UndoReturnAddressBreakpoint( PPROCESS_INFO Process, PTHREAD_INFO Thread ); BOOLEAN BeginSingleStepBreakpoint( PPROCESS_INFO Process, PTHREAD_INFO Thread ); BOOLEAN EndSingleStepBreakpoint( PPROCESS_INFO Process, PTHREAD_INFO Thread ); typedef enum _API_ACTION { QueryPath, OpenPath, RenamePath, DeletePath, SetValue, DeleteValue, WriteIniValue, WriteIniSection } API_ACTION; typedef struct _API_SAVED_CALL_STATE { LIST_ENTRY Entry; API_ACTION Action; ULONG Type; PWSTR FullName; PVOID Reference; union { struct { BOOLEAN InheritHandle; BOOLEAN WriteAccessRequested; PHANDLE ResultHandleAddress; } PathOpen; struct { PWSTR NewName; BOOLEAN ReplaceIfExists; } PathRename; struct { PWSTR SectionName; PWSTR VariableName; PWSTR VariableValue; } SetIniValue; struct { PWSTR SectionName; PWSTR SectionValue; } SetIniSection; }; } API_SAVED_CALL_STATE, *PAPI_SAVED_CALL_STATE; BOOLEAN CreateSavedCallState( PPROCESS_INFO Process, PAPI_SAVED_CALL_STATE SavedCallState, API_ACTION Action, ULONG Type, PWSTR FullName, ... ); VOID FreeSavedCallState( PAPI_SAVED_CALL_STATE CallState ); // // Data structures and entry points in HANDLER.C // typedef struct _CREATEFILE_PARAMETERS { PHANDLE FileHandle; ACCESS_MASK DesiredAccess; POBJECT_ATTRIBUTES ObjectAttributes; PIO_STATUS_BLOCK IoStatusBlock; PLARGE_INTEGER AllocationSize; ULONG FileAttributes; ULONG ShareAccess; ULONG CreateDisposition; ULONG CreateOptions; } CREATEFILE_PARAMETERS, *PCREATEFILE_PARAMETERS; typedef struct _OPENFILE_PARAMETERS { PHANDLE FileHandle; ACCESS_MASK DesiredAccess; POBJECT_ATTRIBUTES ObjectAttributes; PIO_STATUS_BLOCK IoStatusBlock; ULONG ShareAccess; ULONG OpenOptions; } OPENFILE_PARAMETERS, *POPENFILE_PARAMETERS; typedef struct _DELETEFILE_PARAMETERS { POBJECT_ATTRIBUTES ObjectAttributes; } DELETEFILE_PARAMETERS, *PDELETEFILE_PARAMETERS; typedef struct _SETINFORMATIONFILE_PARAMETERS { HANDLE FileHandle; PIO_STATUS_BLOCK IoStatusBlock; PVOID FileInformation; ULONG Length; FILE_INFORMATION_CLASS FileInformationClass; } SETINFORMATIONFILE_PARAMETERS, *PSETINFORMATIONFILE_PARAMETERS; typedef struct _QUERYATTRIBUTESFILE_PARAMETERS { POBJECT_ATTRIBUTES ObjectAttributes; PFILE_BASIC_INFORMATION FileInformation; } QUERYATTRIBUTESFILE_PARAMETERS, *PQUERYATTRIBUTESFILE_PARAMETERS; typedef struct _QUERYDIRECTORYFILE_PARAMETERS { HANDLE FileHandle; HANDLE Event; PIO_APC_ROUTINE ApcRoutine; PVOID ApcContext; PIO_STATUS_BLOCK IoStatusBlock; PVOID FileInformation; ULONG Length; FILE_INFORMATION_CLASS FileInformationClass; BOOLEAN ReturnSingleEntry; PUNICODE_STRING FileName; BOOLEAN RestartScan; } QUERYDIRECTORYFILE_PARAMETERS, *PQUERYDIRECTORYFILE_PARAMETERS; typedef struct _CREATEKEY_PARAMETERS { PHANDLE KeyHandle; ACCESS_MASK DesiredAccess; POBJECT_ATTRIBUTES ObjectAttributes; ULONG TitleIndex; PUNICODE_STRING Class; ULONG CreateOptions; PULONG Disposition; } CREATEKEY_PARAMETERS, *PCREATEKEY_PARAMETERS; typedef struct _OPENKEY_PARAMETERS { PHANDLE KeyHandle; ACCESS_MASK DesiredAccess; POBJECT_ATTRIBUTES ObjectAttributes; } OPENKEY_PARAMETERS, *POPENKEY_PARAMETERS; typedef struct _DELETEKEY_PARAMETERS { HANDLE KeyHandle; } DELETEKEY_PARAMETERS, *PDELETEKEY_PARAMETERS; typedef struct _SETVALUEKEY_PARAMETERS { HANDLE KeyHandle; PUNICODE_STRING ValueName; ULONG TitleIndex; ULONG Type; PVOID Data; ULONG DataLength; } SETVALUEKEY_PARAMETERS, *PSETVALUEKEY_PARAMETERS; typedef struct _DELETEVALUEKEY_PARAMETERS { HANDLE KeyHandle; PUNICODE_STRING ValueName; } DELETEVALUEKEY_PARAMETERS, *PDELETEVALUEKEY_PARAMETERS; typedef struct _CLOSEHANDLE_PARAMETERS { HANDLE Handle; } CLOSEHANDLE_PARAMETERS, *PCLOSEHANDLE_PARAMETERS; typedef struct _GETVERSIONEXW_PARAMETERS { LPOSVERSIONINFOA lpVersionInformation; } GETVERSIONEXW_PARAMETERS, *PGETVERSIONEXW_PARAMETERS; typedef struct _SETCURRENTDIRECTORYA_PARAMETERS { LPSTR lpPathName; } SETCURRENTDIRECTORYA_PARAMETERS, *PSETCURRENTDIRECTORYA_PARAMETERS; typedef struct _SETCURRENTDIRECTORYW_PARAMETERS { PWSTR lpPathName; } SETCURRENTDIRECTORYW_PARAMETERS, *PSETCURRENTDIRECTORYW_PARAMETERS; typedef struct _WRITEPRIVATEPROFILESTRINGA_PARAMETERS { LPCSTR lpAppName; LPCSTR lpKeyName; LPCSTR lpString; LPCSTR lpFileName; } WRITEPRIVATEPROFILESTRINGA_PARAMETERS, *PWRITEPRIVATEPROFILESTRINGA_PARAMETERS; typedef struct _WRITEPRIVATEPROFILESTRINGW_PARAMETERS { LPCWSTR lpAppName; LPCWSTR lpKeyName; LPCWSTR lpString; LPCWSTR lpFileName; } WRITEPRIVATEPROFILESTRINGW_PARAMETERS, *PWRITEPRIVATEPROFILESTRINGW_PARAMETERS; typedef struct _WRITEPRIVATEPROFILESECTIONA_PARAMETERS { LPCSTR lpAppName; LPCSTR lpString; LPCSTR lpFileName; } WRITEPRIVATEPROFILESECTIONA_PARAMETERS, *PWRITEPRIVATEPROFILESECTIONA_PARAMETERS; typedef struct _WRITEPRIVATEPROFILESECTIONW_PARAMETERS { LPCWSTR lpAppName; LPCWSTR lpString; LPCWSTR lpFileName; } WRITEPRIVATEPROFILESECTIONW_PARAMETERS, *PWRITEPRIVATEPROFILESECTIONW_PARAMETERS; typedef struct _REGCONNECTREGISTRYW_PARAMETERS { LPWSTR lpMachineName; HKEY hKey; PHKEY phkResult; } REGCONNECTREGISTRYW_PARAMETERS, *PREGCONNECTREGISTRYW_PARAMETERS; typedef struct _EXITWINDOWSEX_PARAMETERS { DWORD uFlags; DWORD dwReserved; } EXITWINDOWSEX_PARAMETERS, *PEXITWINDOWSEX_PARAMETERS; typedef struct _API_SAVED_PARAMETERS { API_SAVED_CALL_STATE SavedCallState; union { CREATEFILE_PARAMETERS CreateFile; OPENFILE_PARAMETERS OpenFile; DELETEFILE_PARAMETERS DeleteFile; SETINFORMATIONFILE_PARAMETERS SetInformationFile; QUERYATTRIBUTESFILE_PARAMETERS QueryAttributesFile; QUERYDIRECTORYFILE_PARAMETERS QueryDirectoryFile; CREATEKEY_PARAMETERS CreateKey; OPENKEY_PARAMETERS OpenKey; DELETEKEY_PARAMETERS DeleteKey; SETVALUEKEY_PARAMETERS SetValueKey; DELETEVALUEKEY_PARAMETERS DeleteValueKey; CLOSEHANDLE_PARAMETERS CloseHandle; GETVERSIONEXW_PARAMETERS GetVersionExW; SETCURRENTDIRECTORYA_PARAMETERS SetCurrentDirectoryA; SETCURRENTDIRECTORYW_PARAMETERS SetCurrentDirectoryW; WRITEPRIVATEPROFILESTRINGA_PARAMETERS WritePrivateProfileStringA; WRITEPRIVATEPROFILESTRINGW_PARAMETERS WritePrivateProfileStringW; WRITEPRIVATEPROFILESECTIONA_PARAMETERS WritePrivateProfileSectionA; WRITEPRIVATEPROFILESECTIONW_PARAMETERS WritePrivateProfileSectionW; REGCONNECTREGISTRYW_PARAMETERS RegConnectRegistryW; EXITWINDOWSEX_PARAMETERS ExitWindowsEx; } InputParameters; PVOID ReturnAddress; union { UCHAR ReturnedByte; USHORT ReturnedShort; ULONG ReturnedLong; ULONGLONG ReturnedQuad; BOOL ReturnedBool; } ReturnValue; BOOLEAN ReturnValueValid; // // Union for handlers that need to store state between entry and // exit, without the overhead of allocating an API_SAVED_CALL_STATE // union { BOOLEAN AbortCall; PWSTR CurrentDirectory; }; } API_SAVED_PARAMETERS, *PAPI_SAVED_PARAMETERS; BOOLEAN NtCreateFileHandler( PPROCESS_INFO Process, PTHREAD_INFO Thread, PAPI_SAVED_PARAMETERS Parameters ); BOOLEAN NtOpenFileHandler( PPROCESS_INFO Process, PTHREAD_INFO Thread, PAPI_SAVED_PARAMETERS Parameters ); BOOLEAN NtDeleteFileHandler( PPROCESS_INFO Process, PTHREAD_INFO Thread, PAPI_SAVED_PARAMETERS Parameters ); BOOLEAN NtSetInformationFileHandler( PPROCESS_INFO Process, PTHREAD_INFO Thread, PAPI_SAVED_PARAMETERS Parameters ); BOOLEAN NtQueryAttributesFileHandler( PPROCESS_INFO Process, PTHREAD_INFO Thread, PAPI_SAVED_PARAMETERS Parameters ); BOOLEAN NtQueryDirectoryFileHandler( PPROCESS_INFO Process, PTHREAD_INFO Thread, PAPI_SAVED_PARAMETERS Parameters ); BOOLEAN NtCreateKeyHandler( PPROCESS_INFO Process, PTHREAD_INFO Thread, PAPI_SAVED_PARAMETERS Parameters ); BOOLEAN NtOpenKeyHandler( PPROCESS_INFO Process, PTHREAD_INFO Thread, PAPI_SAVED_PARAMETERS Parameters ); BOOLEAN NtDeleteKeyHandler( PPROCESS_INFO Process, PTHREAD_INFO Thread, PAPI_SAVED_PARAMETERS Parameters ); BOOLEAN NtSetValueKeyHandler( PPROCESS_INFO Process, PTHREAD_INFO Thread, PAPI_SAVED_PARAMETERS Parameters ); BOOLEAN NtDeleteValueKeyHandler( PPROCESS_INFO Process, PTHREAD_INFO Thread, PAPI_SAVED_PARAMETERS Parameters ); BOOLEAN NtCloseHandleHandler( PPROCESS_INFO Process, PTHREAD_INFO Thread, PAPI_SAVED_PARAMETERS Parameters ); BOOLEAN GetVersionHandler( PPROCESS_INFO Process, PTHREAD_INFO Thread, PAPI_SAVED_PARAMETERS Parameters ); BOOLEAN GetVersionExWHandler( PPROCESS_INFO Process, PTHREAD_INFO Thread, PAPI_SAVED_PARAMETERS Parameters ); BOOLEAN SetCurrentDirectoryAHandler( PPROCESS_INFO Process, PTHREAD_INFO Thread, PAPI_SAVED_PARAMETERS Parameters ); BOOLEAN SetCurrentDirectoryWHandler( PPROCESS_INFO Process, PTHREAD_INFO Thread, PAPI_SAVED_PARAMETERS Parameters ); BOOLEAN WritePrivateProfileStringAHandler( PPROCESS_INFO Process, PTHREAD_INFO Thread, PAPI_SAVED_PARAMETERS Parameters ); BOOLEAN WritePrivateProfileStringWHandler( PPROCESS_INFO Process, PTHREAD_INFO Thread, PAPI_SAVED_PARAMETERS Parameters ); BOOLEAN WritePrivateProfileSectionAHandler( PPROCESS_INFO Process, PTHREAD_INFO Thread, PAPI_SAVED_PARAMETERS Parameters ); BOOLEAN WritePrivateProfileSectionWHandler( PPROCESS_INFO Process, PTHREAD_INFO Thread, PAPI_SAVED_PARAMETERS Parameters ); BOOLEAN RegConnectRegistryWHandler( PPROCESS_INFO Process, PTHREAD_INFO Thread, PAPI_SAVED_PARAMETERS Parameters ); BOOLEAN ExitWindowsExHandler( PPROCESS_INFO Process, PTHREAD_INFO Thread, PAPI_SAVED_PARAMETERS Parameters ); // // Data structures and entry points in DEBUG.C // CRITICAL_SECTION BreakTable; typedef struct _BREAKPOINT_INFO { LIST_ENTRY Entry; PVOID Address; UCHAR ApiIndex; PWSTR ModuleName; LPSTR ProcedureName; BOOLEAN SavedInstructionValid; BOOLEAN SavedParametersValid; union { UCHAR Byte; USHORT Short; ULONG Long; ULONGLONG LongLong; } SavedInstruction; API_SAVED_PARAMETERS SavedParameters; } BREAKPOINT_INFO, *PBREAKPOINT_INFO; VOID DebugEventLoop( VOID ); BOOLEAN InstallBreakpoint( PPROCESS_INFO Process, PBREAKPOINT_INFO Breakpoint ); BOOLEAN RemoveBreakpoint( PPROCESS_INFO Process, PBREAKPOINT_INFO Breakpoint ); BOOLEAN HandleBreakpoint( PPROCESS_INFO Process, PTHREAD_INFO Thread, PBREAKPOINT_INFO Breakpoint ); BOOLEAN CreateBreakpoint( PVOID Address, PPROCESS_INFO Process, PTHREAD_INFO Thread, UCHAR ApiIndex, PVOID SavedParameters, PBREAKPOINT_INFO *Breakpoint ); BOOLEAN DestroyBreakpoint( PVOID Address, PPROCESS_INFO Process, PTHREAD_INFO Thread ); PBREAKPOINT_INFO FindBreakpoint( PVOID Address, PPROCESS_INFO Process, PTHREAD_INFO Thread ); VOID SuspendAllButThisThread( PPROCESS_INFO Process, PTHREAD_INFO Thread ); VOID ResumeAllButThisThread( PPROCESS_INFO Process, PTHREAD_INFO Thread ); // // Data structures and entry points in HANDLEDB.C // POPENHANDLE_INFO FindOpenHandle( PPROCESS_INFO Process, HANDLE Handle, ULONG Type ); BOOLEAN AddOpenHandle( PPROCESS_INFO Process, HANDLE Handle, ULONG Type, PWSTR Name, BOOLEAN InheritHandle ); BOOLEAN DeleteOpenHandle( PPROCESS_INFO Process, HANDLE Handle, ULONG Type ); VOID InheritHandles( PPROCESS_INFO Process ); // // Data structures and entry points in FILE.C // typedef struct _FILE_REFERENCE { LIST_ENTRY Entry; PWSTR Name; ULONG PrefixLength; BOOLEAN WriteAccess; BOOLEAN Deleted; BOOLEAN Created; BOOLEAN AttributesModified; BOOLEAN DateModified; BOOLEAN ContentsModified; BOOLEAN DirectoryFile; USHORT BackupFileUniqueId; DWORD BackupFileAttributes; FILETIME BackupLastWriteTime; ULARGE_INTEGER BackupFileSize; } FILE_REFERENCE, *PFILE_REFERENCE; BOOLEAN CreateFileReference( PWSTR Name, BOOLEAN WriteAccess, PFILE_REFERENCE *ReturnedReference ); BOOLEAN CompleteFileReference( PFILE_REFERENCE p, BOOLEAN CallSuccessful, BOOLEAN Delete, PFILE_REFERENCE RenameReference ); BOOLEAN DestroyFileReference( PFILE_REFERENCE p ); BOOLEAN IsNewFileSameAsBackup( PFILE_REFERENCE p ); PFILE_REFERENCE FindFileReference( PWSTR Name ); VOID DumpFileReferenceList( FILE *LogFile ); // // Data structures and entry points in KEY.C // typedef struct _KEY_REFERENCE { LIST_ENTRY Entry; PWSTR Name; ULONG PrefixLength; BOOLEAN WriteAccess; BOOLEAN Deleted; BOOLEAN Created; PKEY_FULL_INFORMATION BackupKeyInfo; LIST_ENTRY ValueReferencesListHead; } KEY_REFERENCE, *PKEY_REFERENCE; typedef struct _VALUE_REFERENCE { LIST_ENTRY Entry; PWSTR Name; BOOLEAN Modified; BOOLEAN Deleted; BOOLEAN Created; PKEY_VALUE_PARTIAL_INFORMATION Value; KEY_VALUE_PARTIAL_INFORMATION OriginalValue; } VALUE_REFERENCE, *PVALUE_REFERENCE; BOOLEAN CreateKeyReference( PWSTR Name, BOOLEAN WriteAccess, PKEY_REFERENCE *ReturnedReference ); BOOLEAN CompleteKeyReference( PKEY_REFERENCE p, BOOLEAN CallSuccessful, BOOLEAN Delete ); BOOLEAN DestroyKeyReference( PKEY_REFERENCE p ); PKEY_REFERENCE FindKeyReference( PWSTR Name ); VOID MarkKeyDeleted( PKEY_REFERENCE KeyReference ); BOOLEAN CreateValueReference( PPROCESS_INFO Process, PKEY_REFERENCE KeyReference, PWSTR Name, ULONG TitleIndex, ULONG Type, PVOID Data, ULONG DataLength, PVALUE_REFERENCE *ReturnedValueReference ); PVALUE_REFERENCE FindValueReference( PKEY_REFERENCE KeyReference, PWSTR Name ); BOOLEAN DestroyValueReference( PVALUE_REFERENCE p ); VOID DumpKeyReferenceList( FILE *LogFile ); // // Data structures and entry points in INI.C // typedef struct _INI_FILE_REFERENCE { LIST_ENTRY Entry; PWSTR Name; ULONG PrefixLength; BOOLEAN Created; FILETIME BackupLastWriteTime; LIST_ENTRY SectionReferencesListHead; } INI_FILE_REFERENCE, *PINI_FILE_REFERENCE; typedef struct _INI_SECTION_REFERENCE { LIST_ENTRY Entry; PWSTR Name; BOOLEAN Deleted; BOOLEAN Created; LIST_ENTRY VariableReferencesListHead; } INI_SECTION_REFERENCE, *PINI_SECTION_REFERENCE; typedef struct _INI_VARIABLE_REFERENCE { LIST_ENTRY Entry; PWSTR Name; BOOLEAN Modified; BOOLEAN Deleted; BOOLEAN Created; PWSTR OriginalValue; PWSTR Value; } INI_VARIABLE_REFERENCE, *PINI_VARIABLE_REFERENCE; BOOLEAN CreateIniFileReference( PWSTR Name, PINI_FILE_REFERENCE *ReturnedReference ); BOOLEAN DestroyIniFileReference( PINI_FILE_REFERENCE p ); BOOLEAN DestroyIniSectionReference( PINI_SECTION_REFERENCE p1 ); BOOLEAN DestroyIniVariableReference( PINI_VARIABLE_REFERENCE p2 ); PINI_FILE_REFERENCE FindIniFileReference( PWSTR Name ); PINI_SECTION_REFERENCE FindIniSectionReference( PINI_FILE_REFERENCE p, PWSTR Name, BOOLEAN CreateOkay ); PINI_VARIABLE_REFERENCE FindIniVariableReference( PINI_SECTION_REFERENCE p1, PWSTR Name, BOOLEAN CreateOkay ); VOID DumpIniFileReferenceList( FILE *LogFile ); // // Data structures and entry points in NAMEDB.C // PWSTR AddName( PUNICODE_STRING Name ); VOID DumpNameDataBase( FILE *LogFile ); BOOLEAN IncrementOpenCount( PWSTR Name, BOOLEAN CallSuccessful ); ULONG QueryOpenCount( PWSTR Name, BOOLEAN CallSuccessful ); // // Data structures and entry points in INIT.C // HMODULE InstalerModuleHandle; HANDLE AppHeap; UNICODE_STRING WindowsDirectory; ULONG StartProcessTickCount; FILE *InstalerLogFile; BOOLEAN AskUserOnce; BOOLEAN DefaultGetVersionToWin95; BOOLEAN FailAllScansOfRootDirectories; LIST_ENTRY FileReferenceListHead; ULONG NumberOfFileReferences; LIST_ENTRY KeyReferenceListHead; ULONG NumberOfKeyReferences; LIST_ENTRY IniReferenceListHead; ULONG NumberOfIniReferences; #define NTDLL_MODULE_INDEX 0 #define KERNEL32_MODULE_INDEX 1 #define ADVAPI32_MODULE_INDEX 2 #define USER32_MODULE_INDEX 3 #define MAXIMUM_MODULE_INDEX 4 typedef struct _MODULE_INFO { PWSTR ModuleName; HMODULE ModuleHandle; } MODULE_INFO, *PMODULE_INFO; MODULE_INFO ModuleInfo[ MAXIMUM_MODULE_INDEX ]; typedef BOOLEAN (*PAPI_HANDLER)( PPROCESS_INFO Process, PTHREAD_INFO Thread, PAPI_SAVED_PARAMETERS Parameters ); typedef struct _API_INFO { ULONG ModuleIndex; LPSTR EntryPointName; // Exported names are ANSI only PVOID EntryPointAddress; PAPI_HANDLER EntryPointHandler; ULONG SizeOfParameters; ULONG SizeOfReturnValue; } API_INFO, *PAPI_INFO; #define NTCREATEFILE_INDEX 0 #define NTOPENFILE_INDEX 1 #define NTDELETEFILE_INDEX 2 #define NTSETINFORMATIONFILE_INDEX 3 #define NTQUERYATTRIBUTESFILE_INDEX 4 #define NTQUERYDIRECTORYFILE_INDEX 5 #define NTCREATEKEY_INDEX 6 #define NTOPENKEY_INDEX 7 #define NTDELETEKEY_INDEX 8 #define NTSETVALUEKEY_INDEX 9 #define NTDELETEVALUEKEY_INDEX 10 #define NTCLOSEHANDLE_INDEX 11 #define GETVERSION_INDEX 12 #define GETVERSIONEXW_INDEX 13 #define SETCURRENTDIRECTORYA_INDEX 14 #define SETCURRENTDIRECTORYW_INDEX 15 #define WRITEPRIVATEPROFILESTRINGA_INDEX 16 #define WRITEPRIVATEPROFILESTRINGW_INDEX 17 #define WRITEPRIVATEPROFILESECTIONA_INDEX 18 #define WRITEPRIVATEPROFILESECTIONW_INDEX 19 #define GETPRIVATEPROFILESTRINGA_INDEX 20 #define GETPRIVATEPROFILESTRINGW_INDEX 21 #define GETPRIVATEPROFILESECTIONA_INDEX 22 #define GETPRIVATEPROFILESECTIONW_INDEX 23 #define REGCONNECTREGISTRYW_INDEX 24 #define EXITWINDOWSEX_INDEX 25 #define MAXIMUM_API_INDEX 26 API_INFO ApiInfo[ MAXIMUM_API_INDEX ]; typedef struct _DRIVE_LETTER_INFO { WCHAR DriveLetter; BOOLEAN DriveLetterValid; UNICODE_STRING NtLinkTarget; } DRIVE_LETTER_INFO, *PDRIVE_LETTER_INFO; UNICODE_STRING UNCPrefix; UNICODE_STRING DriveLetterPrefix; UNICODE_STRING AltDriveLetterPrefix; DRIVE_LETTER_INFO DriveLetters[ 32 ]; BOOLEAN InitializeInstaler( int argc, char *argv[] ); PVOID LookupEntryPointInIAT( HMODULE ModuleHandle, PCHAR EntryPointName ); BOOLEAN IsDriveLetterPath( PUNICODE_STRING Path ); PVOID TemporaryBuffer; ULONG TemporaryBufferLength; ULONG TemporaryBufferLengthGrowth; ULONG TemporaryBufferMaximumLength; VOID TrimTemporaryBuffer( VOID ); BOOLEAN GrowTemporaryBuffer( ULONG NeededSize ); ULONG FillTemporaryBuffer( PPROCESS_INFO Process, PVOID Address, BOOLEAN Unicode, BOOLEAN DoubleNullTermination ); #include "instutil.h" #include "iml.h" PINSTALLATION_MODIFICATION_LOGFILE pImlNew; #endif // defined( RC_INVOKED )