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

📄 driverb_syn.h

📁 基于DDK的驱动间同步调用测试示例程序,DriverA是目标驱动,DriverB是主驱动,test是MFC测试示例
💻 H
📖 第 1 页 / 共 2 页
字号:
// DriverB_Syn.h
//
// Generated by C DriverWizard 3.2.0 (Build 2485)
// Requires DDK Only
// File created on 3/12/2009
//
#ifndef __DRIVERB_SYN_H__
#define __DRIVERB_SYN_H__

#ifndef RTL_CONSTANT_STRING
#define RTL_CONSTANT_STRING(s) { sizeof( s ) - sizeof( (s)[0] ), sizeof( s ), s }
#endif

// Memory allocation pool tag
#define DRIVERB_SYN_POOL_TAG 'virD'

// Make all pool allocations tagged
#undef ExAllocatePool
#define ExAllocatePool(type, size) \
    ExAllocatePoolWithTag(type, size, DRIVERB_SYN_POOL_TAG);

// queue start io callback
typedef VOID (*PDRIVERB_SYN_QUEUE_STARTIO)(
    IN PDEVICE_OBJECT   DeviceObject,
    IN PIRP             Irp 
    );

// irp queue type definition
typedef struct _DRIVERB_SYN_QUEUE
{
    PDRIVERB_SYN_QUEUE_STARTIO StartIoRoutine;
    PDEVICE_OBJECT  DeviceObject;
    LIST_ENTRY      IrpQueue;
    KSPIN_LOCK      QueueLock;
    PIRP            CurrentIrp;
    KEVENT          StopEvent;
    LONG            StallCount; 
    NTSTATUS        ErrorStatus;
    KDPC            DriverB_SynStartIoDpc;
    BOOLEAN         bUseDriverB_SynStartIoDpc;
} DRIVERB_SYN_QUEUE, *PDRIVERB_SYN_QUEUE;

// cancel-safe irp list type definition
typedef struct _DRIVERB_SYN_LIST
{
    PDEVICE_OBJECT  DeviceObject;
    LIST_ENTRY      IrpList;
    KSPIN_LOCK      ListLock;
    NTSTATUS        ErrorStatus;
} DRIVERB_SYN_LIST, *PDRIVERB_SYN_LIST;

// stall IRP list to syncronize Pnp, Power with
// the rest of IO
typedef struct _DRIVERB_SYN_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
} DRIVERB_SYN_IO_LOCK, *PDRIVERB_SYN_IO_LOCK;

// global (per driver) data block
typedef struct _DRIVERB_SYN_DATA
{
    UNICODE_STRING      RegistryPath;           // saved registry path
    ULONG               InstanceCount;          // FDO instance count
    USHORT              WdmVersion;             // os version
} DRIVERB_SYN_DATA, *PDRIVERB_SYN_DATA;

extern DRIVERB_SYN_DATA g_Data;

// PnP states
typedef enum _DRIVERB_SYN_PNP_STATE 
{
    PnpStateNotStarted = 0,
    PnpStateStarted,
    PnpStateStopPending,
    PnpStateStopped,
    PnpStateRemovePending,
    PnpStateRemoved,
    PnpStateSurpriseRemoved
} DRIVERB_SYN_PNP_STATE;


// The device extension for the device object
typedef struct _DRIVERB_SYN_DEVICE_EXTENSION
{
    PDEVICE_OBJECT          DeviceObject;           // pointer to the DeviceObject
    PDEVICE_OBJECT          PhysicalDeviceObject;   // underlying PDO
    PDEVICE_OBJECT          LowerDeviceObject;      // top of the device stack

    LONG                    RemoveCount;            // 1-based reference count
    KEVENT                  RemoveEvent;            // event to sync device removal

    DRIVERB_SYN_IO_LOCK IoLock;                 // misc io lock

    DRIVERB_SYN_PNP_STATE    PnpState;               // PnP state variable
    DRIVERB_SYN_PNP_STATE    PreviousPnpState;       // Previous PnP state variable

    SYSTEM_POWER_STATE      SystemPowerState;       // current system power state
    DEVICE_POWER_STATE      DevicePowerState;       // current device power state
    DEVICE_CAPABILITIES     DeviceCaps;             // device capabilities used to get S to D mappings
    PIRP                    SystemPowerIrp;         // Storage for system IRP during power transitions
    PIRP                    DevicePowerIrp;         // Storage for device IRP during power transitions
    PIO_WORKITEM            PowerWorkItem;          // Work item used for power transitions
    LONG                    bPowerStop;             // Flag to signal that power code stopped io
    LONG                    OpenHandleCount;
} DRIVERB_SYN_DEVICE_EXTENSION, *PDRIVERB_SYN_DEVICE_EXTENSION;

#ifdef __cplusplus
extern "C" 
{
#endif

NTSTATUS __stdcall DriverEntry(
    IN  PDRIVER_OBJECT  DriverObject,
    IN  PUNICODE_STRING RegistryPath
    );

NTSTATUS __stdcall DriverB_SynAddDevice(
    IN  PDRIVER_OBJECT  DriverObject,
    IN  PDEVICE_OBJECT  PhysicalDeviceObject
    );

VOID __stdcall DriverB_SynUnload(
    IN  PDRIVER_OBJECT  DriverObject
    );

NTSTATUS __stdcall DriverB_SynPnpDispatch(
    IN  PDEVICE_OBJECT  DeviceObject,
    IN  PIRP            Irp
    );

NTSTATUS __stdcall DriverB_SynPowerDispatch(
    IN  PDEVICE_OBJECT  DeviceObject,
    IN  PIRP            Irp
    );

NTSTATUS __stdcall DriverB_SynDeviceIoControlDispatch(
    IN  PDEVICE_OBJECT  DeviceObject,
    IN  PIRP            Irp
    );

NTSTATUS __stdcall DriverB_SynCreateDispatch(
    IN  PDEVICE_OBJECT  DeviceObject,
    IN  PIRP            Irp
    );

NTSTATUS __stdcall DriverB_SynCloseDispatch(
    IN  PDEVICE_OBJECT  DeviceObject,
    IN  PIRP            Irp
    );

NTSTATUS __stdcall DriverB_SynReadDispatch(
    IN  PDEVICE_OBJECT  DeviceObject,
    IN  PIRP            Irp
    );

NTSTATUS __stdcall DriverB_SynWriteDispatch(
    IN  PDEVICE_OBJECT  DeviceObject,
    IN  PIRP            Irp
    );

NTSTATUS __stdcall DriverB_SynCleanupDispatch(
    IN  PDEVICE_OBJECT  DeviceObject,
    IN  PIRP            Irp
    );

NTSTATUS __stdcall DriverB_SynSystemControlDispatch(
    IN  PDEVICE_OBJECT  DeviceObject,
    IN  PIRP            Irp
    );

///////////////////////////////////////////////////////////////////////////////////////////////////
// Queue Functions
///////////////////////////////////////////////////////////////////////////////////////////////////

VOID DriverB_SynInitializeQueue(
    IN  PDRIVERB_SYN_QUEUE    QueueExtension,
    IN  PDRIVERB_SYN_QUEUE_STARTIO     StartIoRoutine,
    IN  PDEVICE_OBJECT      DeviceObject,
    IN  BOOLEAN             bUseDriverB_SynStartIoDpc
    );

NTSTATUS DriverB_SynQueueIrp(
    IN  PDRIVERB_SYN_QUEUE    QueueExtension,
    IN  PIRP                Irp
    );

VOID DriverB_SynStartNext(
    IN  PDRIVERB_SYN_QUEUE    QueueExtension
    );

VOID DriverB_SynFlushQueue(
    IN  PDRIVERB_SYN_QUEUE    QueueExtension,
    IN  PFILE_OBJECT        FileObject
    );

VOID DriverB_SynInvalidateQueue(
    IN  PDRIVERB_SYN_QUEUE    Queue,
    IN  NTSTATUS                  ErrorStatus
    );

VOID DriverB_SynPauseQueue(
    IN  PDRIVERB_SYN_QUEUE    QueueExtension
    );
    
VOID DriverB_SynRestartQueue(
    IN  PDRIVERB_SYN_QUEUE    QueueExtension
    );

VOID DriverB_SynStartIoDpc(
    IN  PKDPC       Dpc,
    IN  PVOID       Context,
    IN  PVOID       Unused1,
    IN  PVOID       Unused2
    );

VOID DriverB_SynQueueCancelRoutine(
    IN  PDEVICE_OBJECT  DeviceObject,
    IN  PIRP            Irp
    );

///////////////////////////////////////////////////////////////////////////////////////////////////
// List functions
///////////////////////////////////////////////////////////////////////////////////////////////////

VOID DriverB_SynInitializeList(
    IN  PDRIVERB_SYN_LIST   List,
    IN  PDEVICE_OBJECT          DeviceObject
    );

NTSTATUS DriverB_SynInsertHead(
    IN  PDRIVERB_SYN_LIST   List, 
    IN  PIRP                Irp
    );

NTSTATUS DriverB_SynInsertTail(
    IN  PDRIVERB_SYN_LIST   List, 
    IN  PIRP                Irp
    );

PIRP DriverB_SynRemoveHead(
    IN  PDRIVERB_SYN_LIST   List
    );

PIRP DriverB_SynRemoveTail(
    IN  PDRIVERB_SYN_LIST   List
    );

VOID DriverB_SynFlushList(
    IN  PDRIVERB_SYN_LIST   List,
    IN  PFILE_OBJECT        FileObject
    );

VOID DriverB_SynInvalidateList(
    IN  PDRIVERB_SYN_LIST   List,
    IN  NTSTATUS                ErrorStatus
    );

VOID DriverB_SynListCancelRoutine(
    IN  PDEVICE_OBJECT  DeviceObject,
    IN  PIRP            Irp
    );

///////////////////////////////////////////////////////////////////////////////////////////////////
// DRIVERB_SYN_IO_LOCK
///////////////////////////////////////////////////////////////////////////////////////////////////

VOID DriverB_SynInitializeIoLock(
    IN  PDRIVERB_SYN_IO_LOCK    IoLock, 
    IN  PDEVICE_OBJECT              DeviceObject
    );

NTSTATUS DriverB_SynCheckIoLock(
    IN  PDRIVERB_SYN_IO_LOCK    IoLock, 
    IN  PIRP                        Irp
    );

VOID DriverB_SynPendingIoCancelRoutine(
    IN  PDEVICE_OBJECT  DeviceObject,
    IN  PIRP            Irp
    );

NTSTATUS DriverB_SynIncrementIoCount(
    IN  PDRIVERB_SYN_IO_LOCK    IoLock
    );

VOID DriverB_SynDecrementIoCount(
    IN  PDRIVERB_SYN_IO_LOCK    IoLock
    );

VOID DriverB_SynLockIo(
    IN  PDRIVERB_SYN_IO_LOCK    IoLock
    );

VOID DriverB_SynWaitForStopIo(
    IN  PDRIVERB_SYN_IO_LOCK    IoLock
    );

VOID DriverB_SynUnlockIo(
    IN  PDRIVERB_SYN_IO_LOCK    IoLock
    );

VOID DriverB_SynFlushPendingIo(
    IN  PDRIVERB_SYN_IO_LOCK    IoLock,
    IN  PFILE_OBJECT                FileObject
    );

VOID DriverB_SynInvalidateIo(
    IN  PDRIVERB_SYN_IO_LOCK    IoLock,
    IN  NTSTATUS                    ErrorStatus
    );
#ifdef __cplusplus
}
#endif

BOOLEAN DriverB_SynIsStoppable(
    IN  PDRIVERB_SYN_DEVICE_EXTENSION    DeviceExtension
    );

BOOLEAN DriverB_SynIsRemovable(

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -