198 lines
7.9 KiB
C
198 lines
7.9 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1996 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
debug.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This file contains definitions related to debugging.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Forrest Foltz (forrestf)
|
||
|
Ervin P.
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
|
||
|
#define BAD_POINTER ((PVOID) (ULONG_PTR)-0x50)
|
||
|
#define ISPTR(ptr) ((ptr) && ((ptr) != BAD_POINTER))
|
||
|
|
||
|
#if DBG
|
||
|
|
||
|
#if WIN95_BUILD
|
||
|
#define DBG_LEADCHAR ' '
|
||
|
#else
|
||
|
#define DBG_LEADCHAR '\'' // required for kd debugger routing on NT
|
||
|
#endif
|
||
|
|
||
|
#define TRAP \
|
||
|
{ \
|
||
|
DbgPrint("%cHIDCLASS> Code coverage trap: file %s, line %d \n", DBG_LEADCHAR, __FILE__, __LINE__ ); \
|
||
|
DbgBreakPoint(); \
|
||
|
}
|
||
|
|
||
|
#define SS_TRAP \
|
||
|
{ \
|
||
|
if (dbgTrapOnSS) { \
|
||
|
DbgPrint("%cHIDCLASS> Selective suspend trap: file %s, line %d \n", DBG_LEADCHAR, __FILE__, __LINE__ ); \
|
||
|
DbgBreakPoint(); \
|
||
|
}\
|
||
|
}
|
||
|
extern BOOLEAN dbgTrapOnWarn;
|
||
|
extern BOOLEAN dbgTrapOnSS;
|
||
|
extern BOOLEAN dbgInfo;
|
||
|
extern BOOLEAN dbgVerbose;
|
||
|
extern BOOLEAN dbgSkipSecurity;
|
||
|
extern BOOLEAN dbgTrapOnHiccup;
|
||
|
|
||
|
#define DBGWARN(args_in_parens) \
|
||
|
{ \
|
||
|
DbgPrint("%cHIDCLASS> *** WARNING *** (file %s, line %d)\n", DBG_LEADCHAR, __FILE__, __LINE__ ); \
|
||
|
DbgPrint("%c > ", DBG_LEADCHAR); \
|
||
|
DbgPrint args_in_parens; \
|
||
|
DbgPrint("\n"); \
|
||
|
if (dbgTrapOnWarn){ \
|
||
|
DbgBreakPoint(); \
|
||
|
} \
|
||
|
}
|
||
|
#define DBGERR(args_in_parens) \
|
||
|
{ \
|
||
|
DbgPrint("%cHIDCLASS> *** ERROR *** (file %s, line %d)\n", DBG_LEADCHAR, __FILE__, __LINE__ ); \
|
||
|
DbgPrint("%c > ", DBG_LEADCHAR); \
|
||
|
DbgPrint args_in_parens; \
|
||
|
DbgPrint("\n"); \
|
||
|
DbgBreakPoint(); \
|
||
|
}
|
||
|
#define DBGASSERT(check, args_in_parens, trap) \
|
||
|
{ \
|
||
|
if (!(check)) { \
|
||
|
if (trap) { \
|
||
|
DBGERR(args_in_parens); \
|
||
|
} else { \
|
||
|
DBGWARN(args_in_parens); \
|
||
|
} \
|
||
|
} \
|
||
|
}
|
||
|
|
||
|
#define DBGSTATE(current, expected, trap) \
|
||
|
DBGASSERT(current == expected, \
|
||
|
("Expected state %d, got state %d", expected, current), \
|
||
|
trap)
|
||
|
|
||
|
#define DBGSUCCESS(status, trap) \
|
||
|
DBGASSERT(NT_SUCCESS(status), \
|
||
|
("Not STATUS_SUCCESS, actual status = %x", status), \
|
||
|
trap)
|
||
|
#define DBGOUT(args_in_parens) \
|
||
|
{ \
|
||
|
DbgPrint("%cHIDCLASS> ", DBG_LEADCHAR); \
|
||
|
DbgPrint args_in_parens; \
|
||
|
DbgPrint("\n"); \
|
||
|
}
|
||
|
#define DBGVERBOSE(args_in_parens) if (dbgVerbose){ DBGOUT(args_in_parens); }
|
||
|
#define DBGINFO(args_in_parens) if (dbgInfo){ DBGOUT(args_in_parens); }
|
||
|
|
||
|
typedef struct {
|
||
|
// exactly 16 bytes long for easy debugger viewing
|
||
|
PDEVICE_OBJECT devObj;
|
||
|
|
||
|
#define dbgDevObjRecord_STRINGSIZE 12
|
||
|
CHAR str[dbgDevObjRecord_STRINGSIZE];
|
||
|
} dbgDevObjRecord;
|
||
|
|
||
|
typedef struct {
|
||
|
// exactly 16 bytes long for easy debugger viewing
|
||
|
ULONG marker;
|
||
|
ULONG reportId;
|
||
|
ULONG type;
|
||
|
ULONG completed;
|
||
|
} dbgFeatureRecord;
|
||
|
|
||
|
typedef struct {
|
||
|
// exactly 16 bytes long for easy debugger viewing
|
||
|
ULONG_PTR irpPtr;
|
||
|
ULONG length;
|
||
|
ULONG reportId;
|
||
|
ULONG completed;
|
||
|
} dbgReadRecord;
|
||
|
|
||
|
typedef struct {
|
||
|
// exactly 16 bytes long for easy debugger viewing
|
||
|
ULONG_PTR irpPtr;
|
||
|
ULONG func;
|
||
|
ULONG isForCollectionPdo;
|
||
|
ULONG status;
|
||
|
} dbgPnPIrpRecord;
|
||
|
|
||
|
typedef struct {
|
||
|
// exactly 16 bytes long for easy debugger viewing
|
||
|
UCHAR collectionNumber;
|
||
|
UCHAR numRecipients;
|
||
|
UCHAR reportBytes[14];
|
||
|
} dbgReportRecord;
|
||
|
|
||
|
extern ULONG dbgLastEntry;
|
||
|
VOID DbgCommonEntryExit(BOOLEAN isEntering);
|
||
|
VOID DbgRecordDevObj(PDEVICE_OBJECT devObj, PCHAR str);
|
||
|
VOID DbgRecordReport(ULONG reportId, ULONG controlCode, BOOLEAN isComplete);
|
||
|
VOID DbgRecordRead(PIRP irp, ULONG length, ULONG reportId, ULONG completed);
|
||
|
VOID DbgLogIrpMajor(ULONG_PTR irpPtr, ULONG majorFunc, ULONG isForCollectionPdo, ULONG isComplete, ULONG status);
|
||
|
VOID DbgLogPnpIrp(ULONG_PTR irpPtr, ULONG minorFunc, ULONG isForCollectionPdo, ULONG isComplete, ULONG status);
|
||
|
VOID DbgLogPowerIrp(PVOID devExt, UCHAR minorFunc, ULONG isClientPdo, ULONG isComplete, PCHAR type, ULONG powerState, ULONG status);
|
||
|
VOID DbgLogReport(ULONG collectionNumber, ULONG numRecipients, ULONG numPending, ULONG numFailed, PUCHAR report, ULONG reportLength);
|
||
|
VOID DbgLogIoctl(ULONG_PTR fdo, ULONG ioControlCode, ULONG status);
|
||
|
|
||
|
#define DBG_COMMON_ENTRY() DbgCommonEntryExit(TRUE);
|
||
|
#define DBG_COMMON_EXIT() DbgCommonEntryExit(FALSE);
|
||
|
#define DBG_RECORD_DEVOBJ(devObj, str) DbgRecordDevObj(devObj, str);
|
||
|
#define DBG_RECORD_REPORT(reportId, controlCode, isComplete) \
|
||
|
DbgRecordReport(reportId, controlCode, isComplete);
|
||
|
#define DBG_RECORD_READ(irp, length, reportId, completed) \
|
||
|
DbgRecordRead(irp, length, reportId, completed);
|
||
|
#define DBG_LOG_IRP_MAJOR(irp, majorFunc, isForCollectionPdo, isComplete, status) \
|
||
|
DbgLogIrpMajor((ULONG_PTR)(irp), (ULONG)(majorFunc), (ULONG)(isForCollectionPdo), (ULONG)(isComplete), (ULONG)(status));
|
||
|
#define DBG_LOG_PNP_IRP(irp, minorFunc, isForCollectionPdo, isComplete, status) \
|
||
|
DbgLogPnpIrp((ULONG_PTR)(irp), (ULONG)(minorFunc), (ULONG)(isForCollectionPdo), (ULONG)(isComplete), (ULONG)(status));
|
||
|
#define DBG_LOG_POWER_IRP(devExt, minorFunc, isClientPdo, isComplete, type, powerState, status) \
|
||
|
DbgLogPowerIrp(devExt, minorFunc, isClientPdo, isComplete, type, powerState, status);
|
||
|
#define DBG_LOG_REPORT(collectionNumber, numRecipients, numPending, numFailed, report, reportLength) \
|
||
|
DbgLogReport(collectionNumber, numRecipients, numPending, numFailed, report, reportLength);
|
||
|
#define DBG_LOG_IOCTL(fdo, ioControlCode, status) \
|
||
|
DbgLogIoctl((ULONG_PTR)fdo, ioControlCode, status);
|
||
|
#define RUNNING_DISPATCH() \
|
||
|
if (KeGetCurrentIrql() != DISPATCH_LEVEL) { \
|
||
|
KdPrint(( "EX: Pageable code called at IRQL %d\n", KeGetCurrentIrql() )); \
|
||
|
ASSERT(FALSE); \
|
||
|
}
|
||
|
#else
|
||
|
#define DBGSTATE(current, expected, trap)
|
||
|
#define DBGSUCCESS(status, trap)
|
||
|
#define DBGASSERT(check, args_in_parens, trap)
|
||
|
#define DBGWARN(args_in_parens)
|
||
|
#define DBGERR(args_in_parens)
|
||
|
#define DBGOUT(args_in_parens)
|
||
|
#define DBGVERBOSE(args_in_parens)
|
||
|
#define DBGINFO(args_in_parens)
|
||
|
#define TRAP
|
||
|
#define SS_TRAP
|
||
|
#define DBG_COMMON_ENTRY()
|
||
|
#define DBG_COMMON_EXIT()
|
||
|
#define DBG_RECORD_DEVOBJ(devObj, str)
|
||
|
#define DBG_RECORD_REPORT(reportId, controlCode, isComplete)
|
||
|
#define DBG_RECORD_READ(irp, length, reportId, completed)
|
||
|
#define DBG_LOG_IRP_MAJOR(irp, majorFunc, isForCollectionPdo, isComplete, status)
|
||
|
#define DBG_LOG_PNP_IRP(irp, minorFunc, isForCollectionPdo, isComplete, status)
|
||
|
#define DBG_LOG_POWER_IRP(devExt, minorFunc, isClientPdo, isComplete, type, powerState, status)
|
||
|
#define DBG_LOG_REPORT(collectionNumber, numRecipients, numPending, numFailed, report, reportLength)
|
||
|
#define DBG_LOG_IOCTL(fdo, ioControlCode, status)
|
||
|
#define RUNNING_DISPATCH()
|
||
|
#endif
|
||
|
|
||
|
|