mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
452 lines
7.4 KiB
452 lines
7.4 KiB
/*++
|
|
|
|
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>
|
|
#else
|
|
|
|
#include <windows.h>
|
|
#include <windowsx.h>
|
|
#include <imagehlp.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <dialogs.h>
|
|
|
|
// Doubly-linked list manipulation routines. Implemented as macros
|
|
// but logically these are procedures.
|
|
//
|
|
|
|
//
|
|
// VOID
|
|
// InitializeListHead(
|
|
// PLIST_ENTRY ListHead
|
|
// );
|
|
//
|
|
|
|
#define InitializeListHead(ListHead) (\
|
|
(ListHead)->Flink = (ListHead)->Blink = (ListHead))
|
|
|
|
//
|
|
// BOOL
|
|
// IsListEmpty(
|
|
// PLIST_ENTRY ListHead
|
|
// );
|
|
//
|
|
|
|
#define IsListEmpty(ListHead) \
|
|
((ListHead)->Flink == (ListHead))
|
|
|
|
//
|
|
// PLIST_ENTRY
|
|
// RemoveHeadList(
|
|
// PLIST_ENTRY ListHead
|
|
// );
|
|
//
|
|
|
|
#define RemoveHeadList(ListHead) \
|
|
(ListHead)->Flink;\
|
|
{RemoveEntryList((ListHead)->Flink)}
|
|
|
|
//
|
|
// PLIST_ENTRY
|
|
// RemoveTailList(
|
|
// PLIST_ENTRY ListHead
|
|
// );
|
|
//
|
|
|
|
#define RemoveTailList(ListHead) \
|
|
(ListHead)->Blink;\
|
|
{RemoveEntryList((ListHead)->Blink)}
|
|
|
|
//
|
|
// VOID
|
|
// RemoveEntryList(
|
|
// PLIST_ENTRY Entry
|
|
// );
|
|
//
|
|
|
|
#define RemoveEntryList(Entry) {\
|
|
PLIST_ENTRY _EX_Blink;\
|
|
PLIST_ENTRY _EX_Flink;\
|
|
_EX_Flink = (Entry)->Flink;\
|
|
_EX_Blink = (Entry)->Blink;\
|
|
_EX_Blink->Flink = _EX_Flink;\
|
|
_EX_Flink->Blink = _EX_Blink;\
|
|
}
|
|
|
|
//
|
|
// VOID
|
|
// InsertTailList(
|
|
// PLIST_ENTRY ListHead,
|
|
// PLIST_ENTRY Entry
|
|
// );
|
|
//
|
|
|
|
#define InsertTailList(ListHead,Entry) {\
|
|
PLIST_ENTRY _EX_Blink;\
|
|
PLIST_ENTRY _EX_ListHead;\
|
|
_EX_ListHead = (ListHead);\
|
|
_EX_Blink = _EX_ListHead->Blink;\
|
|
(Entry)->Flink = _EX_ListHead;\
|
|
(Entry)->Blink = _EX_Blink;\
|
|
_EX_Blink->Flink = (Entry);\
|
|
_EX_ListHead->Blink = (Entry);\
|
|
}
|
|
|
|
//
|
|
// VOID
|
|
// InsertHeadList(
|
|
// PLIST_ENTRY ListHead,
|
|
// PLIST_ENTRY Entry
|
|
// );
|
|
//
|
|
|
|
#define InsertHeadList(ListHead,Entry) {\
|
|
PLIST_ENTRY _EX_Flink;\
|
|
PLIST_ENTRY _EX_ListHead;\
|
|
_EX_ListHead = (ListHead);\
|
|
_EX_Flink = _EX_ListHead->Flink;\
|
|
(Entry)->Flink = _EX_Flink;\
|
|
(Entry)->Blink = _EX_ListHead;\
|
|
_EX_Flink->Blink = (Entry);\
|
|
_EX_ListHead->Flink = (Entry);\
|
|
}
|
|
|
|
//
|
|
// Data structures and entry points in init.c
|
|
//
|
|
|
|
|
|
VOID
|
|
ProcessCallmonData(
|
|
VOID
|
|
);
|
|
|
|
//
|
|
// Data structures and entry points in init.c
|
|
//
|
|
|
|
BOOL fVerbose;
|
|
FILE *LogFile;
|
|
BOOL fBreakPointsInitialized;
|
|
BOOL NewCallmonData;
|
|
BOOL fNtDllValid;
|
|
BOOL fKernel32Valid;
|
|
BOOL fWsock32Valid;
|
|
BOOL fUser32Valid;
|
|
BOOL fGdi32Valid;
|
|
BOOL fOle32Valid;
|
|
BOOL fNtDll;
|
|
BOOL fWsock32;
|
|
BOOL fKernel32;
|
|
BOOL fUser32;
|
|
BOOL fGdi32;
|
|
BOOL fOle32;
|
|
BOOL fExiting;
|
|
BOOL fBreakPointsValid;
|
|
|
|
DWORD BaseTime, StartingTick, EndingTick;
|
|
DWORD RunningBreakPoints;
|
|
DWORD TotalBreakPoints;
|
|
HWND hwndOutput;
|
|
HWND hwndDlg;
|
|
LPSTR RestOfCommandLine;
|
|
HANDLE ReleaseDebugeeEvent;
|
|
BOOL DebugeeActive;
|
|
UINT Timer;
|
|
|
|
CRITICAL_SECTION BreakTable;
|
|
|
|
VOID
|
|
SetValidModuleFlags(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
InitializeCallmon(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
LoadApplicationForDebug(
|
|
LPSTR CommandLine
|
|
);
|
|
|
|
HANDLE hProcess;
|
|
|
|
//
|
|
// Data structures and entry points in DEBUG.C
|
|
//
|
|
|
|
VOID
|
|
DebugEventLoop( VOID );
|
|
|
|
//
|
|
// Data structures and entry points in process.c
|
|
//
|
|
|
|
typedef struct _BREAKPOINT_INFO {
|
|
LIST_ENTRY Entry;
|
|
PVOID Address;
|
|
LPSTR ApiName;
|
|
BOOLEAN SavedInstructionValid;
|
|
DWORD TotalApiCount;
|
|
DWORD ApiCount;
|
|
union {
|
|
UCHAR Byte;
|
|
USHORT Short;
|
|
ULONG Long;
|
|
} SavedInstruction;
|
|
} BREAKPOINT_INFO, *PBREAKPOINT_INFO;
|
|
|
|
|
|
typedef struct _PROCESS_INFO {
|
|
LIST_ENTRY Entry;
|
|
LIST_ENTRY ThreadListHead;
|
|
DWORD Id;
|
|
HANDLE Handle;
|
|
} PROCESS_INFO, *PPROCESS_INFO;
|
|
|
|
PPROCESS_INFO TheProcess;
|
|
|
|
typedef struct _THREAD_INFO {
|
|
LIST_ENTRY Entry;
|
|
DWORD Id;
|
|
HANDLE Handle;
|
|
PVOID StartAddress;
|
|
PBREAKPOINT_INFO BreakpointToStepOver;
|
|
} THREAD_INFO, *PTHREAD_INFO;
|
|
|
|
LIST_ENTRY ProcessListHead;
|
|
|
|
BOOL
|
|
AddProcess(
|
|
LPDEBUG_EVENT DebugEvent,
|
|
PPROCESS_INFO *ReturnedProcess
|
|
);
|
|
|
|
BOOL
|
|
DeleteProcess(
|
|
PPROCESS_INFO Process
|
|
);
|
|
|
|
BOOL
|
|
AddThread(
|
|
LPDEBUG_EVENT DebugEvent,
|
|
PPROCESS_INFO Process,
|
|
PTHREAD_INFO *ReturnedThread
|
|
);
|
|
|
|
BOOL
|
|
DeleteThread(
|
|
PPROCESS_INFO Process,
|
|
PTHREAD_INFO Thread
|
|
);
|
|
|
|
PPROCESS_INFO
|
|
FindProcessById(
|
|
ULONG Id
|
|
);
|
|
|
|
BOOL
|
|
FindProcessAndThreadForEvent(
|
|
LPDEBUG_EVENT DebugEvent,
|
|
PPROCESS_INFO *ReturnedProcess,
|
|
PTHREAD_INFO *ReturnedThread
|
|
);
|
|
//
|
|
// Data structures and entry points in module.c
|
|
//
|
|
|
|
typedef struct _MODULE_INFO {
|
|
LIST_ENTRY Entry;
|
|
LPVOID BaseAddress;
|
|
DWORD VirtualSize;
|
|
HANDLE Handle;
|
|
LPSTR ModuleName;
|
|
PUCHAR MappedAddress;
|
|
PIMAGE_SECTION_HEADER LastRvaSection;
|
|
PIMAGE_NT_HEADERS FileHeader;
|
|
DWORD NumberOfFunctionEntries;
|
|
PIMAGE_RUNTIME_FUNCTION_ENTRY FunctionEntry;
|
|
} MODULE_INFO, *PMODULE_INFO;
|
|
|
|
LPSTR SymbolSearchPath;
|
|
LIST_ENTRY ModuleListHead;
|
|
|
|
BOOL
|
|
AddModule(
|
|
LPDEBUG_EVENT DebugEvent
|
|
);
|
|
|
|
BOOL
|
|
DeleteModule(
|
|
PMODULE_INFO Module
|
|
);
|
|
|
|
PMODULE_INFO
|
|
FindModuleContainingAddress(
|
|
LPVOID Address
|
|
);
|
|
|
|
PIMAGE_RUNTIME_FUNCTION_ENTRY
|
|
LookupFunctionEntry (
|
|
ULONG Address,
|
|
PMODULE_INFO ModInfo
|
|
);
|
|
|
|
VOID
|
|
SetSymbolSearchPath( );
|
|
|
|
VOID
|
|
InitializeBreakPoints(
|
|
PPROCESS_INFO Process
|
|
);
|
|
|
|
VOID
|
|
AddBreakpointsForModule (
|
|
PPROCESS_INFO Process,
|
|
PMODULE_INFO ModInfo
|
|
);
|
|
|
|
#ifdef _ALPHA_
|
|
#define CONTEXT_TO_PROGRAM_COUNTER(Context) ((Context)->Fir)
|
|
#define BPSKIP 4
|
|
#endif // _ALPHA_
|
|
|
|
#ifdef _MIPS_
|
|
#define CONTEXT_TO_PROGRAM_COUNTER(Context) ((Context)->Fir)
|
|
#define BPSKIP 4
|
|
#endif // _MIPS_
|
|
|
|
#ifdef _PPC_
|
|
#define CONTEXT_TO_PROGRAM_COUNTER(Context) ((Context)->Iar)
|
|
#define BPSKIP 4
|
|
#endif // _PPC_
|
|
|
|
#ifdef _X86_
|
|
#define CONTEXT_TO_PROGRAM_COUNTER(Context) ((Context)->Eip)
|
|
#define BPSKIP 1
|
|
#endif // _X86_
|
|
|
|
PVOID BreakpointInstruction;
|
|
ULONG SizeofBreakpointInstruction;
|
|
|
|
BOOLEAN
|
|
SkipOverHardcodedBreakpoint(
|
|
PPROCESS_INFO Process,
|
|
PTHREAD_INFO Thread,
|
|
PVOID BreakpointAddress
|
|
);
|
|
|
|
BOOLEAN
|
|
InstallBreakpoint(
|
|
PPROCESS_INFO Process,
|
|
PBREAKPOINT_INFO Breakpoint
|
|
);
|
|
|
|
BOOLEAN
|
|
RemoveBreakpoint(
|
|
PPROCESS_INFO Process,
|
|
PBREAKPOINT_INFO Breakpoint
|
|
);
|
|
|
|
PBREAKPOINT_INFO
|
|
FindBreakpoint(
|
|
LPVOID Address,
|
|
PPROCESS_INFO Process
|
|
);
|
|
|
|
PBREAKPOINT_INFO
|
|
CreateBreakpoint(
|
|
LPVOID Address,
|
|
PPROCESS_INFO Process,
|
|
PSZ FunctionName,
|
|
PMODULE_INFO ModInfo
|
|
);
|
|
|
|
BOOLEAN
|
|
HandleThreadsForSingleStep(
|
|
PPROCESS_INFO Process,
|
|
PTHREAD_INFO ThreadToSingleStep,
|
|
BOOLEAN SuspendThreads
|
|
);
|
|
|
|
#define HASH_TABLE_SIZE 256
|
|
#define HASH_MASK (HASH_TABLE_SIZE-1)
|
|
#define COMPUTE_HASH_INDEX(Addr) ( ((ULONG)(Addr) >> 2) & HASH_MASK )
|
|
LIST_ENTRY HashTable[HASH_TABLE_SIZE];
|
|
|
|
|
|
PBREAKPOINT_INFO *RegisteredBreakpoints;
|
|
int NumberOfBreakpoints;
|
|
|
|
BOOL DoQuit;
|
|
|
|
|
|
BOOLEAN
|
|
EndSingleStepBreakpoint(
|
|
PPROCESS_INFO Process,
|
|
PTHREAD_INFO Thread
|
|
);
|
|
|
|
BOOLEAN
|
|
BeginSingleStepBreakpoint(
|
|
PPROCESS_INFO Process,
|
|
PTHREAD_INFO Thread
|
|
);
|
|
|
|
BOOL
|
|
CALLBACK
|
|
CallmonDlgProc(
|
|
HWND hDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
);
|
|
|
|
BOOL
|
|
CallmonDlgInit(
|
|
HWND hwnd,
|
|
HWND hwndFocus,
|
|
LPARAM lParam
|
|
);
|
|
|
|
void
|
|
CallmonDlgCommand (
|
|
HWND hwnd,
|
|
int id,
|
|
HWND hwndCtl,
|
|
UINT codeNotify
|
|
);
|
|
|
|
void
|
|
CallmonDlgTimer (
|
|
HWND hwnd,
|
|
UINT wParam
|
|
);
|
|
|
|
VOID
|
|
DebuggerThread(
|
|
LPVOID ThreadParameter
|
|
);
|
|
|
|
#endif // defined( RC_INVOKED )
|