/*++ Copyright (c) 1992-2001 Microsoft Corporation Module Name: extfns.h Abstract: This header file must be included after "windows.h", "dbgeng.h", and "wdbgexts.h". This file contains headers for various known extension functions defined in different extension dlls. To use these functions, the appropropriate extension dll must be loaded in the debugger. IDebugSymbols->GetExtension (declared in dbgeng.h) methood could be used to retrive these functions. Please see the Debugger documentation for specific information about how to write your own debugger extension DLL. Environment: Win32 only. Revision History: --*/ #ifndef _EXTFNS_H #define _EXTFNS_H #ifndef _KDEXTSFN_H #define _KDEXTSFN_H /* * Extension functions defined in kdexts.dll */ // // device.c // typedef struct _DEBUG_DEVICE_OBJECT_INFO { ULONG SizeOfStruct; // must be == sizeof(DEBUG_DEVICE_OBJECT_INFO) ULONG64 DevObjAddress; ULONG ReferenceCount; BOOL QBusy; ULONG64 DriverObject; ULONG64 CurrentIrp; ULONG64 DevExtension; ULONG64 DevObjExtension; } DEBUG_DEVICE_OBJECT_INFO, *PDEBUG_DEVICE_OBJECT_INFO; // GetDevObjInfo typedef HRESULT (WINAPI *PGET_DEVICE_OBJECT_INFO)( IN PDEBUG_CLIENT Client, IN ULONG64 DeviceObject, OUT PDEBUG_DEVICE_OBJECT_INFO pDevObjInfo); // // driver.c // typedef struct _DEBUG_DRIVER_OBJECT_INFO { ULONG SizeOfStruct; // must be == sizef(DEBUG_DRIVER_OBJECT_INFO) ULONG DriverSize; ULONG64 DriverObjAddress; ULONG64 DriverStart; ULONG64 DriverExtension; ULONG64 DeviceObject; struct { USHORT Length; USHORT MaximumLength; ULONG64 Buffer; } DriverName; } DEBUG_DRIVER_OBJECT_INFO, *PDEBUG_DRIVER_OBJECT_INFO; // GetDrvObjInfo typedef HRESULT (WINAPI *PGET_DRIVER_OBJECT_INFO)( IN PDEBUG_CLIENT Client, IN ULONG64 DriverObject, OUT PDEBUG_DRIVER_OBJECT_INFO pDrvObjInfo); // // irp.c // typedef struct _DEBUG_IRP_STACK_INFO { UCHAR Major; UCHAR Minor; ULONG64 DeviceObject; ULONG64 FileObject; ULONG64 CompletionRoutine; ULONG64 StackAddress; } DEBUG_IRP_STACK_INFO, *PDEBUG_IRP_STACK_INFO; typedef struct _DEBUG_IRP_INFO { ULONG SizeOfStruct; // Must be == sizeof(DEBUG_IRP_INFO) ULONG64 IrpAddress; ULONG StackCount; ULONG CurrentLocation; ULONG64 MdlAddress; ULONG64 Thread; ULONG64 CancelRoutine; DEBUG_IRP_STACK_INFO CurrentStack; } DEBUG_IRP_INFO, *PDEBUG_IRP_INFO; // GetIrpInfo typedef HRESULT (WINAPI * PGET_IRP_INFO)( IN PDEBUG_CLIENT Client, IN ULONG64 Irp, OUT PDEBUG_IRP_INFO IrpInfo ); // // pool.c // typedef struct _DEBUG_POOL_DATA { ULONG SizeofStruct; ULONG64 PoolBlock; ULONG64 Pool; ULONG PreviousSize; ULONG Size; ULONG PoolTag; ULONG64 ProcessBilled; union { struct { ULONG Free:1; ULONG LargePool:1; ULONG SpecialPool:1; ULONG Pageable:1; ULONG Protected:1; ULONG Allocated:1; ULONG Reserved:26; }; ULONG AsUlong; }; ULONG64 Reserved2[4]; CHAR PoolTagDescription[64]; } DEBUG_POOL_DATA, *PDEBUG_POOL_DATA; // GetPoolData typedef HRESULT (WINAPI *PGET_POOL_DATA)( PDEBUG_CLIENT Client, ULONG64 Pool, PDEBUG_POOL_DATA PoolData ); typedef enum _DEBUG_POOL_REGION { DbgPoolRegionUnknown, DbgPoolRegionSpecial, DbgPoolRegionPaged, DbgPoolRegionNonPaged, DbgPoolRegionCode, DbgPoolRegionNonPagedExpansion, DbgPoolRegionMax, } DEBUG_POOL_REGION; // GetPoolRegion typedef HRESULT (WINAPI *PGET_POOL_REGION)( PDEBUG_CLIENT Client, ULONG64 Pool, DEBUG_POOL_REGION *PoolRegion ); #endif // _KDEXTSFN_H #ifndef _KEXTFN_H #define _KEXTFN_H /* * Extension functions defined in kext.dll */ /***************************************************************************** PoolTag definitions *****************************************************************************/ typedef struct _DEBUG_POOLTAG_DESCRIPTION { ULONG SizeOfStruct; // must be == sizeof(DEBUG_POOLTAG_DESCRIPTION) ULONG PoolTag; CHAR Description[MAX_PATH]; CHAR Binary[32]; CHAR Owner[32]; } DEBUG_POOLTAG_DESCRIPTION, *PDEBUG_POOLTAG_DESCRIPTION; // GetPoolTagDescription typedef HRESULT (WINAPI *PGET_POOL_TAG_DESCRIPTION)( ULONG PoolTag, PDEBUG_POOLTAG_DESCRIPTION pDescription ); #endif // _KEXTFN_H #ifndef _EXTAPIS_H #define _EXTAPIS_H /* * Extension functions defined in ext.dll */ /***************************************************************************** Failure analysis definitions *****************************************************************************/ typedef enum _DEBUG_FAILURE_TYPE { DEBUG_FLR_UNKNOWN, DEBUG_FLR_KERNEL, DEBUG_FLR_USER_CRASH, DEBUG_FLR_IE_CRASH, } DEBUG_FAILURE_TYPE; /* Each analysis entry can have associated data with it. The analyzer knows how to handle each of these entries. For example it could do a !driver on a DEBUG_FLR_DRIVER_OBJECT or it could do a .cxr and k on a DEBUG_FLR_CONTEXT. */ typedef enum _DEBUG_FLR_PARAM_TYPE { DEBUG_FLR_INVALID = 0, DEBUG_FLR_RESERVED, DEBUG_FLR_DRIVER_OBJECT, DEBUG_FLR_DEVICE_OBJECT, DEBUG_FLR_INVALID_PFN, DEBUG_FLR_WORKER_ROUTINE, DEBUG_FLR_WORK_ITEM, DEBUG_FLR_INVALID_DPC_FOUND, DEBUG_FLR_PROCESS_OBJECT, // Address for which an instruction could not be executed, // such as invalid instructions or attempts to execute // non-instruction memory. DEBUG_FLR_FAILED_INSTRUCTION_ADDRESS, DEBUG_FLR_LAST_CONTROL_TRANSFER, DEBUG_FLR_ACPI_EXTENSION, DEBUG_FLR_ACPI_OBJECT, DEBUG_FLR_PROCESS_NAME, DEBUG_FLR_READ_ADDRESS, DEBUG_FLR_WRITE_ADDRESS, DEBUG_FLR_CRITICAL_SECTION, DEBUG_FLR_BAD_HANDLE, DEBUG_FLR_INVALID_HEAP_ADDRESS, DEBUG_FLR_IRP_ADDRESS = 0x100, DEBUG_FLR_IRP_MAJOR_FN, DEBUG_FLR_IRP_MINOR_FN, DEBUG_FLR_IRP_CANCEL_ROUTINE, DEBUG_FLR_IOSB_ADDRESS, DEBUG_FLR_INVALID_USEREVENT, // Previous mode 0 == KernelMode , 1 == UserMode DEBUG_FLR_PREVIOUS_MODE, // Irql DEBUG_FLR_CURRENT_IRQL = 0x200, DEBUG_FLR_PREVIOUS_IRQL, DEBUG_FLR_REQUESTED_IRQL, // Exceptions DEBUG_FLR_ASSERT_DATA = 0x300, DEBUG_FLR_ASSERT_FILE, DEBUG_FLR_EXCEPTION_PARAMETER1, DEBUG_FLR_EXCEPTION_PARAMETER2, DEBUG_FLR_EXCEPTION_PARAMETER3, DEBUG_FLR_EXCEPTION_PARAMETER4, DEBUG_FLR_EXCEPTION_RECORD, // Pool DEBUG_FLR_POOL_ADDRESS = 0x400, DEBUG_FLR_SPECIAL_POOL_CORRUPTION_TYPE, DEBUG_FLR_CORRUPTING_POOL_ADDRESS, DEBUG_FLR_CORRUPTING_POOL_TAG, DEBUG_FLR_FREED_POOL_TAG, // Filesystem DEBUG_FLR_FILE_ID = 0x500, DEBUG_FLR_FILE_LINE, // bugcheck data DEBUG_FLR_BUGCHECK_STR = 0x600, DEBUG_FLR_BUGCHECK_SPECIFIER, // Constant values / exception code / bugcheck subtypes etc DEBUG_FLR_DRIVER_VERIFIER_IO_VIOLATION_TYPE = 0x1000, DEBUG_FLR_EXCEPTION_CODE, DEBUG_FLR_SPARE2, DEBUG_FLR_IOCONTROL_CODE, DEBUG_FLR_MM_INTERNAL_CODE, DEBUG_FLR_DRVPOWERSTATE_SUBCODE, DEBUG_FLR_STATUS_CODE, // Notification IDs, values under it doesn't have significance DEBUG_FLR_CORRUPT_MODULE_LIST = 0x2000, DEBUG_FLR_BAD_STACK, DEBUG_FLR_ZEROED_STACK, DEBUG_FLR_WRONG_SYMBOLS, DEBUG_FLR_FOLLOWUP_DRIVER_ONLY, //bugcheckEA indicates a general driver failure DEBUG_FLR_UNUSED001, //bucket include timestamp, so each drive is tracked DEBUG_FLR_CPU_OVERCLOCKED, DEBUG_FLR_POSSIBLE_INVALID_CONTROL_TRANSFER, DEBUG_FLR_POISONED_TB, DEBUG_FLR_UNKNOWN_MODULE, DEBUG_FLR_ANALYZAABLE_POOL_CORRUPTION, DEBUG_FLR_SINGLE_BIT_ERROR, DEBUG_FLR_TWO_BIT_ERROR, DEBUG_FLR_INVALID_KERNEL_CONTEXT, DEBUG_FLR_DISK_HARDWARE_ERROR, DEBUG_FLR_SHOW_ERRORLOG, DEBUG_FLR_MANUAL_BREAKIN, // Known analyzed failure cause or problem that bucketing could be // applied against. DEBUG_FLR_POOL_CORRUPTOR = 0x3000, DEBUG_FLR_MEMORY_CORRUPTOR, DEBUG_FLR_UNALIGNED_STACK_POINTER, DEBUG_FLR_OLD_OS_VERSION, DEBUG_FLR_BUGCHECKING_DRIVER, DEBUG_FLR_SOLUTION_ID, DEBUG_FLR_DEFAULT_SOLUTION_ID, DEBUG_FLR_SOLUTION_TYPE, // Strings. DEBUG_FLR_BUCKET_ID = 0x10000, DEBUG_FLR_IMAGE_NAME, DEBUG_FLR_SYMBOL_NAME, DEBUG_FLR_FOLLOWUP_NAME, DEBUG_FLR_STACK_COMMAND, DEBUG_FLR_STACK_TEXT, DEBUG_FLR_INTERNAL_SOLUTION_TEXT, DEBUG_FLR_MODULE_NAME, DEBUG_FLR_INTERNAL_RAID_BUG, DEBUG_FLR_FIXED_IN_OSVERSION, DEBUG_FLR_DEFAULT_BUCKET_ID, // User-mode specific stuff DEBUG_FLR_USERMODE_DATA = 0x100000, // Culprit module DEBUG_FLR_FAULTING_IP = 0x80000000, // Instruction where failure occurred DEBUG_FLR_FAULTING_MODULE, DEBUG_FLR_IMAGE_TIMESTAMP, DEBUG_FLR_FOLLOWUP_IP, // To get faulting stack DEBUG_FLR_FAULTING_THREAD = 0xc0000000, DEBUG_FLR_CONTEXT, DEBUG_FLR_TRAP_FRAME, DEBUG_FLR_TSS, DEBUG_FLR_MASK_ALL = 0xFFFFFFFF } DEBUG_FLR_PARAM_TYPE; //---------------------------------------------------------------------------- // // A failure analysis is a dynamic buffer of tagged blobs. Values // are accessed through the Get/Set methods. // // Entries are always fully aligned. // // Set methods throw E_OUTOFMEMORY exceptions when the data // buffer cannot be extended. // //---------------------------------------------------------------------------- typedef DEBUG_FLR_PARAM_TYPE FA_TAG; typedef struct _FA_ENTRY { FA_TAG Tag; USHORT FullSize; USHORT DataSize; } FA_ENTRY, *PFA_ENTRY; #define FA_ENTRY_DATA(Type, Entry) ((Type)((Entry) + 1)) /* ed0de363-451f-4943-820c-62dccdfa7e6d */ DEFINE_GUID(IID_IDebugFailureAnalysis, 0xed0de363, 0x451f, 0x4943, 0x82, 0x0c, 0x62, 0xdc, 0xcd, 0xfa, 0x7e, 0x6d); typedef interface DECLSPEC_UUID("ed0de363-451f-4943-820c-62dccdfa7e6d") IDebugFailureAnalysis* PDEBUG_FAILURE_ANALYSIS; #undef INTERFACE #define INTERFACE IDebugFailureAnalysis DECLARE_INTERFACE_(IDebugFailureAnalysis, IUnknown) { // IUnknown. STDMETHOD(QueryInterface)( THIS_ IN REFIID InterfaceId, OUT PVOID* Interface ) PURE; STDMETHOD_(ULONG, AddRef)( THIS ) PURE; STDMETHOD_(ULONG, Release)( THIS ) PURE; // IDebugFailureAnalysis. STDMETHOD_(ULONG, GetFailureClass)( THIS ) PURE; STDMETHOD_(DEBUG_FAILURE_TYPE, GetFailureType)( THIS ) PURE; STDMETHOD_(ULONG, GetFailureCode)( THIS ) PURE; STDMETHOD_(PFA_ENTRY, Get)( THIS_ FA_TAG Tag ) PURE; STDMETHOD_(PFA_ENTRY, GetNext)( THIS_ PFA_ENTRY Entry, FA_TAG Tag, FA_TAG TagMask ) PURE; STDMETHOD_(PFA_ENTRY, GetString)( THIS_ FA_TAG Tag, PSTR Str, ULONG MaxSize ) PURE; STDMETHOD_(PFA_ENTRY, GetBuffer)( THIS_ FA_TAG Tag, PVOID Buf, ULONG Size ) PURE; STDMETHOD_(PFA_ENTRY, GetUlong)( THIS_ FA_TAG Tag, PULONG Value ) PURE; STDMETHOD_(PFA_ENTRY, GetUlong64)( THIS_ FA_TAG Tag, PULONG64 Value ) PURE; STDMETHOD_(PFA_ENTRY, NextEntry)( THIS_ PFA_ENTRY Entry ) PURE; }; #define FAILURE_ANALYSIS_NO_DB_LOOKUP 0x0001 #define FAILURE_ANALYSIS_VERBOSE 0x0002 typedef HRESULT (WINAPI* EXT_GET_FAILURE_ANALYSIS)( IN PDEBUG_CLIENT Client, IN ULONG Flags, OUT PDEBUG_FAILURE_ANALYSIS* Analysis ); /***************************************************************************** Target info *****************************************************************************/ typedef enum _TARGET_MODE { NoTarget = DEBUG_CLASS_UNINITIALIZED, KernelModeTarget = DEBUG_CLASS_KERNEL, UserModeTarget = DEBUG_CLASS_USER_WINDOWS, NumModes, } TARGET_MODE; typedef enum _OS_TYPE { WIN_95, WIN_98, WIN_ME, WIN_NT4, WIN_NT5, WIN_NT5_1, NUM_WIN, } OS_TYPE; // // Info about OS installed // typedef struct _OS_INFO { OS_TYPE Type; // OS type such as NT4, NT5 etc. union { struct { ULONG Major; ULONG Minor; } Version; // 64 bit OS version number ULONG64 Ver64; }; ULONG ProductType; // NT, LanMan or Server ULONG Suite; // OS flavour - per, SmallBuisness etc. struct { ULONG Checked:1; // If its a checked build ULONG Pae:1; // True for Pae systems ULONG MultiProc:1; // True for multiproc enabled OS ULONG Reserved:29; } s; ULONG SrvPackNumber; // Service pack number of OS TCHAR Language[30]; // OS language TCHAR OsString[64]; // Build string TCHAR ServicePackString[64]; // Service pack string } OS_INFO, *POS_INFO; typedef struct _CPU_INFO { ULONG Type; // Processor type as in IMAGE_FILE_MACHINE types ULONG NumCPUs; // Actual number of Processors ULONG CurrentProc; // Current processor DEBUG_PROCESSOR_IDENTIFICATION_ALL ProcInfo[32]; } CPU_INFO, *PCPU_INFO; typedef enum _DATA_SOURCE { Debugger, Stress, } DATA_SOURCE; #define MAX_STACK_IN_BYTES 4096 typedef struct _TARGET_DEBUG_INFO { ULONG SizeOfStruct; ULONG64 Id; // ID unique to this debug info DATA_SOURCE Source; // Source where this came from ULONG64 EntryDate; // Date created ULONG64 SysUpTime; // System Up time ULONG64 AppUpTime; // Application up time ULONG64 CrashTime; // Time system / app crashed TARGET_MODE Mode; // Kernel / User mode OS_INFO OsInfo; // OS details CPU_INFO Cpu; // Processor details TCHAR DumpFile[MAX_PATH]; // Dump file name if its a dump PVOID FailureData; // Failure data collected by debugger CHAR StackTr[MAX_STACK_IN_BYTES]; // Contains stacks, with frames separated by newline } TARGET_DEBUG_INFO, *PTARGET_DEBUG_INFO; // GetTargetInfo typedef HRESULT (WINAPI* EXT_TARGET_INFO)( PDEBUG_CLIENT Client, PTARGET_DEBUG_INFO pTargetInfo ); typedef struct _DEBUG_DECODE_ERROR { ULONG SizeOfStruct; // Must be == sizeof(DEBUG_DECODE_ERROR) ULONG Code; // Error code to be decoded BOOL TreatAsStatus; // True if code is to be treated as Status CHAR Source[64]; // Source from where we got decoded message CHAR Message[MAX_PATH]; // Message string for error code } DEBUG_DECODE_ERROR, *PDEBUG_DECODE_ERROR; /* Decodes and prints the given error code - DecodeError */ typedef VOID (WINAPI *EXT_DECODE_ERROR)( PDEBUG_DECODE_ERROR pDecodeError ); // // ext.dll: GetTriageFollowupFromSymbol // // This returns owner info from a given symbol name // typedef struct _DEBUG_TRIAGE_FOLLOWUP_INFO { ULONG SizeOfStruct; // Must be == sizeof (DEBUG_TRIAGE_FOLLOWUP_INFO) ULONG OwnerNameSize; // Size of allocated buffer PCHAR OwnerName; // Followup owner name returned in this // Caller should initialize the name buffer } DEBUG_TRIAGE_FOLLOWUP_INFO, *PDEBUG_TRIAGE_FOLLOWUP_INFO; #define TRIAGE_FOLLOWUP_FAIL 0 #define TRIAGE_FOLLOWUP_IGNORE 1 #define TRIAGE_FOLLOWUP_DEFAULT 2 #define TRIAGE_FOLLOWUP_SUCCESS 3 typedef DWORD (WINAPI *EXT_TRIAGE_FOLLOWUP)( IN PDEBUG_CLIENT Client, IN PSTR SymbolName, OUT PDEBUG_TRIAGE_FOLLOWUP_INFO OwnerInfo ); #endif // _EXTAPIS_H // // Function exported fron ntsdexts.dll // typedef HRESULT (WINAPI *EXT_GET_HANDLE_TRACE)( PDEBUG_CLIENT Client, ULONG TraceType, ULONG StartIndex, PULONG64 HandleValue, PULONG64 StackFunctions, ULONG StackTraceSize ); #endif // _EXTFNS_H