windows-nt/Source/XPSP1/NT/base/tools/instaler/instaler.h
2020-09-26 16:20:57 +08:00

1194 lines
24 KiB
C

/*++
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 <windows.h>
#define FILEBMP 500
#define DIRBMP 501
#else
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <vdmdbg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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 )