windows-nt/Source/XPSP1/NT/public/sdk/inc/extsfns.h
2020-09-26 16:20:57 +08:00

453 lines
12 KiB
C

/*++
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;
UNICODE_STRING64 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 kdext.dll
*/
/*********************************************************************************
BugCheck definitions
**********************************************************************************/
typedef enum _DEBUG_FAILURE_TYPE {
DEBUG_FLR_UNKNOWN,
DEBUG_FLR_BUGCHECK,
} DEBUG_FAILURE_TYPE;
/*
Each bugchek parameter has its own type, bugcheck analyzer knows how
to handle each of these types, for examle it could do a !driver on
a DEBUG_FLR_DRIVER_OBJECT or it coould do a .cxr and k on a DEBUG_FLR_CONTEXT.
*/
typedef enum _DEBUG_FLR_PARAM_TYPE {
DEBUG_FLR_READ_ADDRESS = 0,
DEBUG_FLR_WRITE_ADDRESS,
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_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,
DEBUG_FLR_IOCONTROL_CODE,
DEBUG_FLR_MM_INTERNAL_CODE,
// 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_TRAP_EXCEPTION = 0x300,
DEBUG_FLR_EXCEPTION_CODE,
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,
// FIlesystem
DEBUG_FLR_FILE_ID = 0x500,
DEBUG_FLR_FILE_LINE,
DEBUG_FLR_DRIVER_VERIFIER_IOMANAGER_VIOLATION_TYPE = 0x1000,
// Culprit module
DEBUG_FLR_IP = 0x80000000, // Instruction where failure occurred
DEBUG_FLR_FAULTING_MODULE,
DEBUG_FLR_FAULTING_MODULE_OFFSET,
DEBUG_FLR_POSSIBLE_FAULTING_MODULE,
DEBUG_FLR_POSSIBLE_FAULTING_MODULE_OFFSET,
// Routine to followup on for triaging, if not
// present, consider DEBUG_FLR_IP as followup address
DEBUG_FLR_FOLLOWUP_IP,
// To get faulting stack
DEBUG_FLR_THREAD = 0xc0000000,
DEBUG_FLR_CONTEXT,
DEBUG_FLR_TRAP,
DEBUG_FLR_TSS,
} DEBUG_FLR_PARAM_TYPE;
typedef struct _DEBUG_FLR_PARAM_VALUES {
DEBUG_FLR_PARAM_TYPE ParamType;
ULONG64 Value;
} DEBUG_FLR_PARAM_VALUES, *PDEBUG_FLR_PARAM_VALUES;
typedef struct _DEBUG_FAILURE_ANALYSIS {
ULONG SizeOfHeader; // must be sizeof(DEBUG_FAILURE_ANALYSIS)
ULONG Size; // Actual size of struct
DEBUG_FAILURE_TYPE FailureType;// Is this bugcheck / AV or something else
ULONG BugCode;
ULONG64 Reserved[4];
ULONG SymNameOffset; // Offset of KeySymName from start of struct
ULONG StackOffset; // Offset of KeyStack from start of struct
ULONG DriverNameOffset;// Offset of KeyDriverName from start of struct
ULONG ParamCount;
DEBUG_FLR_PARAM_VALUES Params[1];
// Varying fields in struct, corresponding Offset values in struct are used to
// access these.
// If corresponding offset is 0, the field is not present
CHAR KeySymName[1]; // Most commonly this would be the symbol at
// faulting address of format <mod>!<routine>
// Null terminated dword aligned string.
CHAR KeyStack[1]; // Stack relevant to this particular crash, it isn't always
// the current stack.
// The individual frames are separated by newline.
// Whole stack is null terminated dword aligned string.
WCHAR KeyDriverName[1];// If present this will have the name most driver
// most likely to be the cause of the crash.
} DEBUG_FAILURE_ANALYSIS, *PDEBUG_FAILURE_ANALYSIS;
typedef HRESULT
(WINAPI *PGET_DEBUG_FAILURE_ANALYZER)(
IN PDEBUG_CLIENT Client,
OUT PDEBUG_FAILURE_ANALYSIS* pAnalysis
);
/*********************************************************************************
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
*/
/***********************************************************************************
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;
};
NT_PRODUCT_TYPE ProductType; // NT, LanMan or Server
SUITE_TYPE 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)
STRING OwnerName; // Followup owner name returned in this
// Caller should initialize the name buffer
} DEBUG_TRIAGE_FOLLOWUP_INFO, *PDEBUG_TRIAGE_FOLLOWUP_INFO;
typedef BOOL
(WINAPI *EXT_TRIAGE_FOLLOWP)(
IN PSTR SymbolName,
OUT PDEBUG_TRIAGE_FOLLOWUP_INFO OwnerInfo
);
#endif // _EXTAPIS_H
#endif // _EXTFNS_H