twain2/pub/ddk/rxlog.h

142 lines
2.9 KiB
C

/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
RxLog.h
Abstract:
This module declares the prototypes and global data used by the RDBSS debug logging facilities.
Author:
Notes:
The log records are stored in a circular buffer. Each record is bounded on either side by
a record descriptor. This record descriptor is four bytes long.
--*/
#ifndef _RDBSSLOG_INCLUDED_
#define _RDBSSLOG_INCLUDED_
typedef enum {
RX_LOG_UNINITIALIZED,
RX_LOG_ENABLED,
RX_LOG_DISABLED,
RX_LOG_ERROR
} RX_LOGGING_STATE;
typedef struct RX_LOG_ENTRY_HEADER {
PCHAR Buffer;
} RX_LOG_ENTRY_HEADER, *PRX_LOG_ENTRY_HEADER;
typedef struct RX_LOG {
RX_SPIN_LOCK SpinLock;
RX_LOGGING_STATE State;
PRX_LOG_ENTRY_HEADER CurrentEntry;
PRX_LOG_ENTRY_HEADER BaseEntry;
PRX_LOG_ENTRY_HEADER EntryLimit;
ULONG LogBufferSizeInEntries;
ULONG NumberOfEntriesIgnored;
ULONG NumberOfLogWriteAttempts;
ULONG NumberOfLogWraps;
} RX_LOG, *PRX_LOG;
//the logging facilities are always present. what RDBSSLOG does is to enable generation
//of the calls! on checked builds, you even get the calls unless NO_RDBSSLOG is set.
//extern
//VOID
//RxLogInterlockedAddUlong(
// PULONG Result,
// PULONG Counter,
// ULONG Addend);
extern
VOID
RxDebugControlCommand (
__in PSTR ControlString
);
extern
NTSTATUS
RxInitializeLog(void);
extern
VOID
RxUninitializeLog(void);
extern
VOID
_RxPrintLog(IN ULONG EntriesToPrint OPTIONAL);
extern
VOID
_RxPauseLog(void);
extern
VOID
_RxResumeLog (void);
extern
VOID
_RxLog(PCSTR format, ...);
#define MAX_RX_LOG_ENTRY_SIZE (48)
#define RDBSSLOG_ASYNC_NAME_PREFIX "[nowait]"
#define RXCONTX_OPERATION_NAME(MajorFunction,Wait) \
(RxContxOperationNames[(MajorFunction)]+((Wait)?(sizeof(RDBSSLOG_ASYNC_NAME_PREFIX)-1):0))
extern PUCHAR RxContxOperationNames[];
#ifdef RDBSSLOG
//
// The arguments to RxLog must be enclosed with an additional pair of parenthesis to enable
// transalation into a null call when logging should be turned off.
// e.g. RxLog(("%s %d", FILE, LINE))
#if DBG
#define RxLog(Args) _RxLog##Args
#define RxLogRetail(Args) _RxLog##Args
#else
#define RxLogRetail(Args) _RxLog##Args
#define RxLog(Args) {NOTHING;}
#endif
#define RxPauseLog() _RxPauseLog()
#define RxResumeLog() _RxResumeLog()
#else //if notdef RDBSSLOG
#define RxLog(Args) {NOTHING;}
#define RxLogRetail(Args) {NOTHING;}
#define RxPauseLog() {NOTHING;}
#define RxResumeLog() {NOTHING;}
#endif
#if DBG
#define RxDbgPrint(Args) DbgPrint##Args
#else
#define RxDbgPrint(Args) NOTHING
#endif
extern LIST_ENTRY RxIrpsList;
extern KSPIN_LOCK RxIrpsListSpinLock;
typedef struct _RX_IRP_LIST_ITEM {
LIST_ENTRY IrpsList;
PIRP pIrp;
PMDL CopyDataBuffer;
ULONG Completed;
} RX_IRP_LIST_ITEM, *PRX_IRP_LIST_ITEM;
#endif // _RDBSSLOG_INCLUDED_