⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 callmsgring0.h

📁 在Ring0层中调用Ring3层的功能 需要安装DDK
💻 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 + -