📄 callmsgring0.h
字号:
// CallMsgRing0.h
//
// Generated by C DriverWizard 3.2.0 (Build 2485)
// Requires DDK Only
// File created on 3/12/2005
//
#ifndef __CALLMSGRING0_H__
#define __CALLMSGRING0_H__
// Memory allocation pool tag
#define CALLMSGRING0_POOL_TAG 'llaC'
// Make all pool allocations tagged
#undef ExAllocatePool
#define ExAllocatePool(type, size) \
ExAllocatePoolWithTag(type, size, CALLMSGRING0_POOL_TAG);
// queue start io callback
typedef VOID (*PCALLMSGRING0_QUEUE_STARTIO)(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
// irp queue type definition
typedef struct _CALLMSGRING0_QUEUE
{
PCALLMSGRING0_QUEUE_STARTIO StartIoRoutine;
PDEVICE_OBJECT DeviceObject;
LIST_ENTRY IrpQueue;
KSPIN_LOCK QueueLock;
PIRP CurrentIrp;
KEVENT StopEvent;
LONG StallCount;
NTSTATUS ErrorStatus;
KDPC CallMsgRing0StartIoDpc;
BOOLEAN bUseCallMsgRing0StartIoDpc;
} CALLMSGRING0_QUEUE, *PCALLMSGRING0_QUEUE;
// cancel-safe irp list type definition
typedef struct _CALLMSGRING0_LIST
{
PDEVICE_OBJECT DeviceObject;
LIST_ENTRY IrpList;
KSPIN_LOCK ListLock;
NTSTATUS ErrorStatus;
} CALLMSGRING0_LIST, *PCALLMSGRING0_LIST;
// stall IRP list to syncronize Pnp, Power with
// the rest of IO
typedef struct _CALLMSGRING0_IO_LOCK
{
PDEVICE_OBJECT DeviceObject; // our device object
KEVENT StallCompleteEvent; // io stalled event
LIST_ENTRY StallIrpList; // stalled irps
KSPIN_LOCK IoLock; // spin lock to syncronize io with stall/unstall
LONG StallCount; // number of times stall was requested
LONG ActiveIrpCount; // number of oustanding, not-stalled IRPs
NTSTATUS ErrorStatus;
PIRP CurrentIrp; // used by unstall code
} CALLMSGRING0_IO_LOCK, *PCALLMSGRING0_IO_LOCK;
// global (per driver) data block
typedef struct _CALLMSGRING0_DATA
{
UNICODE_STRING RegistryPath;
} CALLMSGRING0_DATA, *PCALLMSGRING0_DATA;
extern CALLMSGRING0_DATA g_Data;
// The device extension for the device object
typedef struct _CALLMSGRING0_DEVICE_EXTENSION
{
PDEVICE_OBJECT DeviceObject;
LONG OpenHandleCount;
} CALLMSGRING0_DEVICE_EXTENSION, *PCALLMSGRING0_DEVICE_EXTENSION;
#ifdef __cplusplus
extern "C" {
#endif
// prototype for DriverEntry function
NTSTATUS __stdcall DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
);
VOID __stdcall CallMsgRing0Unload(
IN PDRIVER_OBJECT DriverObject
);
NTSTATUS __stdcall CallMsgRing0DeviceIoControlDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS __stdcall CallMsgRing0CreateDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS __stdcall CallMsgRing0CloseDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS __stdcall CallMsgRing0CleanupDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS __stdcall CallMsgRing0ShutdownDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
#ifdef __cplusplus
}
#endif
VOID CallMsgRing0FlushQueues(
IN PCALLMSGRING0_DEVICE_EXTENSION DeviceExtension,
IN PFILE_OBJECT FileObject
);
///////////////////////////////////////////////////////////////////////////////////////////////////
// Registry
///////////////////////////////////////////////////////////////////////////////////////////////////
PVOID CallMsgRing0RegQueryValueKey(
IN HANDLE RegKeyHandle,
IN PWSTR SubKeyName,
IN PWSTR ValueName,
OUT PULONG Length
);
VOID CallMsgRing0RegEnumerateKeys(
IN HANDLE RegKeyHandle
);
VOID CallMsgRing0RegEnumerateValueKeys(
IN HANDLE RegKeyHandle
);
///////////////////////////////////////////////////////////////////////////////////////////////////
// Debug
///////////////////////////////////////////////////////////////////////////////////////////////////
// definition of debug levels
#define DBG_NONE 0
#define DBG_ERR 1
#define DBG_WARN 2
#define DBG_TRACE 3
#define DBG_INFO 4
#define DBG_VERB 5
#ifdef CALLMSGRING0_WMI_TRACE
/*
tracepdb -f objchk_wxp_x86\i386\CallMsgRing0.pdb -p C:\CallMsgRing0
SET TRACE_FORMAT_SEARCH_PATH=C:\CallMsgRing0
tracelog -start CallMsgRing0 -guid CallMsgRing0.ctl -f CallMsgRing0.log -flags 0x7FFFFFFF -level 5
tracelog -stop CallMsgRing0
tracefmt -o CallMsgRing0.txt -f CallMsgRing0.log
*/
#define WPP_AREA_LEVEL_LOGGER(Area,Lvl) WPP_LEVEL_LOGGER(Area)
#define WPP_AREA_LEVEL_ENABLED(Area,Lvl) (WPP_LEVEL_ENABLED(Area) && WPP_CONTROL(WPP_BIT_##Area).Level >= Lvl)
#define WPP_CONTROL_GUIDS \
WPP_DEFINE_CONTROL_GUID(CallMsgRing0,(D755A505,579B,46E2,B596,D3791A6E06FA), \
WPP_DEFINE_BIT(DBG_GENERAL) /* bit 0 = 0x00000001 */ \
WPP_DEFINE_BIT(DBG_PNP) /* bit 1 = 0x00000002 */ \
WPP_DEFINE_BIT(DBG_POWER) /* bit 2 = 0x00000004 */ \
WPP_DEFINE_BIT(DBG_COUNT) /* bit 3 = 0x00000008 */ \
WPP_DEFINE_BIT(DBG_CREATECLOSE) /* bit 4 = 0x00000010 */ \
WPP_DEFINE_BIT(DBG_WMI) /* bit 5 = 0x00000020 */ \
WPP_DEFINE_BIT(DBG_UNLOAD) /* bit 6 = 0x00000040 */ \
WPP_DEFINE_BIT(DBG_IO) /* bit 7 = 0x00000080 */ \
WPP_DEFINE_BIT(DBG_INIT) /* bit 8 = 0x00000100 */ \
WPP_DEFINE_BIT(DBG_09) /* bit 9 = 0x00000200 */ \
WPP_DEFINE_BIT(DBG_10) /* bit 10 = 0x00000400 */ \
WPP_DEFINE_BIT(DBG_11) /* bit 11 = 0x00000800 */ \
WPP_DEFINE_BIT(DBG_12) /* bit 12 = 0x00001000 */ \
WPP_DEFINE_BIT(DBG_13) /* bit 13 = 0x00002000 */ \
WPP_DEFINE_BIT(DBG_14) /* bit 14 = 0x00004000 */ \
WPP_DEFINE_BIT(DBG_15) /* bit 15 = 0x00008000 */ \
WPP_DEFINE_BIT(DBG_16) /* bit 16 = 0x00010000 */ \
WPP_DEFINE_BIT(DBG_17) /* bit 17 = 0x00020000 */ \
WPP_DEFINE_BIT(DBG_18) /* bit 18 = 0x00040000 */ \
WPP_DEFINE_BIT(DBG_19) /* bit 19 = 0x00080000 */ \
WPP_DEFINE_BIT(DBG_20) /* bit 20 = 0x00100000 */ \
WPP_DEFINE_BIT(DBG_21) /* bit 21 = 0x00200000 */ \
WPP_DEFINE_BIT(DBG_22) /* bit 22 = 0x00400000 */ \
WPP_DEFINE_BIT(DBG_23) /* bit 23 = 0x00800000 */ \
WPP_DEFINE_BIT(DBG_24) /* bit 24 = 0x01000000 */ \
WPP_DEFINE_BIT(DBG_25) /* bit 25 = 0x02000000 */ \
WPP_DEFINE_BIT(DBG_26) /* bit 26 = 0x04000000 */ \
WPP_DEFINE_BIT(DBG_27) /* bit 27 = 0x08000000 */ \
WPP_DEFINE_BIT(DBG_28) /* bit 28 = 0x10000000 */ \
WPP_DEFINE_BIT(DBG_29) /* bit 29 = 0x20000000 */ \
WPP_DEFINE_BIT(DBG_30) /* bit 30 = 0x40000000 */ \
WPP_DEFINE_BIT(DBG_31) /* bit 31 = 0x80000000 */ \
)
__inline VOID CallMsgRing0DumpIrp(
IN PIRP Irp
)
{
}
__inline PCHAR SystemPowerStateString(
IN SYSTEM_POWER_STATE SystemState
)
{
return "";
}
__inline PCHAR DevicePowerStateString(
IN DEVICE_POWER_STATE DeviceState
)
{
return "";
}
#else
// definition of debug areas
#define DBG_GENERAL (1 << 0)
#define DBG_PNP (1 << 1)
#define DBG_POWER (1 << 2)
#define DBG_COUNT (1 << 3)
#define DBG_CREATECLOSE (1 << 4)
#define DBG_WMI (1 << 5)
#define DBG_UNLOAD (1 << 6)
#define DBG_IO (1 << 7)
#define DBG_INIT (1 << 8)
#define DBG_ALL 0xFFFFFFFF
#if DBG
VOID CallMsgRing0DebugPrint(
IN ULONG Area,
IN ULONG Level,
IN PCCHAR Format,
IN ...
);
VOID CallMsgRing0DumpIrp(
IN PIRP Irp
);
PCHAR IrpMajorFunctionString(
IN UCHAR MajorFunction
);
PCHAR PnPMinorFunctionString(
IN UCHAR MinorFunction
);
PCHAR PowerMinorFunctionString(
IN UCHAR MinorFunction
);
PCHAR SystemPowerStateString(
IN SYSTEM_POWER_STATE SystemState
);
PCHAR DevicePowerStateString(
IN DEVICE_POWER_STATE DeviceState
);
PCHAR WMIMinorFunctionString (
IN UCHAR MinorFunction
);
#else // !DBG
__inline VOID CallMsgRing0DebugPrint(
IN ULONG Area,
IN ULONG Level,
IN PCCHAR Format,
IN ...
)
{
}
#define CallMsgRing0DumpIrp(Irp)
#define IrpMajorFunctionString(MajorFunction)
#define PnPMinorFunctionString(MinorFunction)
#define PowerMinorFunctionString(MinorFunction)
#define SystemPowerStateString(SystemState) 0
#define DevicePowerStateString(DeviceState) 0
#define WMIMinorFunctionString(MinorFunction)
#define CallMsgRing0TdiDumpAddress(Address)
#endif // DBG
#endif // CALLMSGRING0_WMI_TRACE
///////////////////////////////////////////////////////////////////////////////////////////////////
// Queue Functions
///////////////////////////////////////////////////////////////////////////////////////////////////
VOID CallMsgRing0InitializeQueue(
IN PCALLMSGRING0_QUEUE QueueExtension,
IN PCALLMSGRING0_QUEUE_STARTIO StartIoRoutine,
IN PDEVICE_OBJECT DeviceObject,
IN BOOLEAN bUseCallMsgRing0StartIoDpc
);
NTSTATUS CallMsgRing0QueueIrp(
IN PCALLMSGRING0_QUEUE QueueExtension,
IN PIRP Irp
);
VOID CallMsgRing0StartNext(
IN PCALLMSGRING0_QUEUE QueueExtension
);
VOID CallMsgRing0FlushQueue(
IN PCALLMSGRING0_QUEUE QueueExtension,
IN PFILE_OBJECT FileObject
);
VOID CallMsgRing0InvalidateQueue(
IN PCALLMSGRING0_QUEUE Queue,
IN NTSTATUS ErrorStatus
);
VOID CallMsgRing0PauseQueue(
IN PCALLMSGRING0_QUEUE QueueExtension
);
VOID CallMsgRing0RestartQueue(
IN PCALLMSGRING0_QUEUE QueueExtension
);
VOID CallMsgRing0StartIoDpc(
IN PKDPC Dpc,
IN PVOID Context,
IN PVOID Unused1,
IN PVOID Unused2
);
VOID CallMsgRing0QueueCancelRoutine(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
///////////////////////////////////////////////////////////////////////////////////////////////////
// List functions
///////////////////////////////////////////////////////////////////////////////////////////////////
VOID CallMsgRing0InitializeList(
IN PCALLMSGRING0_LIST List,
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS CallMsgRing0InsertHead(
IN PCALLMSGRING0_LIST List,
IN PIRP Irp
);
NTSTATUS CallMsgRing0InsertTail(
IN PCALLMSGRING0_LIST List,
IN PIRP Irp
);
PIRP CallMsgRing0RemoveHead(
IN PCALLMSGRING0_LIST List
);
PIRP CallMsgRing0RemoveTail(
IN PCALLMSGRING0_LIST List
);
VOID CallMsgRing0FlushList(
IN PCALLMSGRING0_LIST List,
IN PFILE_OBJECT FileObject
);
VOID CallMsgRing0InvalidateList(
IN PCALLMSGRING0_LIST List,
IN NTSTATUS ErrorStatus
);
VOID CallMsgRing0ListCancelRoutine(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
#pragma pack(1)
/* sidt instruction stores the base and limit of IDTR in this format */
typedef struct idtr {
short Limit;
unsigned int Base;
} Idtr_t, *PIdtr_t;
/* Decriptor Entry corresponding to interrupt gate */
typedef struct _IdtEntry {
unsigned short OffsetLow;
unsigned short Selector;
unsigned char Reserved;
unsigned char Type:4;
unsigned char Always0:1;
unsigned char Dpl:2;
unsigned char Present:1;
unsigned short OffsetHigh;
} IdtEntry, *PIdtEntry;
#pragma pack()
#endif // __CALLMSGRING0_H__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -