drivera.h

来自「基于DDK的驱动间同步调用测试示例程序,DriverA是目标驱动,DriverB」· C头文件 代码 · 共 657 行 · 第 1/2 页

H
657
字号
// DriverA.h
//
// Generated by C DriverWizard 3.2.0 (Build 2485)
// Requires DDK Only
// File created on 3/11/2009
//
#ifndef __DRIVERA_H__
#define __DRIVERA_H__

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

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

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

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

// irp queue type definition
typedef struct _DRIVERA_QUEUE
{
    PDRIVERA_QUEUE_STARTIO StartIoRoutine;
    PDEVICE_OBJECT  DeviceObject;
    LIST_ENTRY      IrpQueue;
    KSPIN_LOCK      QueueLock;
    PIRP            CurrentIrp;
    KEVENT          StopEvent;
    LONG            StallCount; 
    NTSTATUS        ErrorStatus;
    KDPC            DriverAStartIoDpc;
    BOOLEAN         bUseDriverAStartIoDpc;
} DRIVERA_QUEUE, *PDRIVERA_QUEUE;

// cancel-safe irp list type definition
typedef struct _DRIVERA_LIST
{
    PDEVICE_OBJECT  DeviceObject;
    LIST_ENTRY      IrpList;
    KSPIN_LOCK      ListLock;
    NTSTATUS        ErrorStatus;
} DRIVERA_LIST, *PDRIVERA_LIST;

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

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

extern DRIVERA_DATA g_Data;

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


// The device extension for the device object
typedef struct _DRIVERA_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

    DRIVERA_IO_LOCK IoLock;                 // misc io lock

    DRIVERA_PNP_STATE    PnpState;               // PnP state variable
    DRIVERA_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;

	KDPC					PollingDPC;				//存储DPC对象
	KTIMER					PollingTimer;			//存储定时器对象

	PIRP					CurrentPendingIrp;		//当前挂起的IRP
} DRIVERA_DEVICE_EXTENSION, *PDRIVERA_DEVICE_EXTENSION;

#ifdef __cplusplus
extern "C" 
{
#endif

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

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

VOID __stdcall DriverAUnload(
    IN  PDRIVER_OBJECT  DriverObject
    );

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

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

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

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

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

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

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

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

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

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

VOID DriverAInitializeQueue(
    IN  PDRIVERA_QUEUE    QueueExtension,
    IN  PDRIVERA_QUEUE_STARTIO     StartIoRoutine,
    IN  PDEVICE_OBJECT      DeviceObject,
    IN  BOOLEAN             bUseDriverAStartIoDpc
    );

NTSTATUS DriverAQueueIrp(
    IN  PDRIVERA_QUEUE    QueueExtension,
    IN  PIRP                Irp
    );

VOID DriverAStartNext(
    IN  PDRIVERA_QUEUE    QueueExtension
    );

VOID DriverAFlushQueue(
    IN  PDRIVERA_QUEUE    QueueExtension,
    IN  PFILE_OBJECT        FileObject
    );

VOID DriverAInvalidateQueue(
    IN  PDRIVERA_QUEUE    Queue,
    IN  NTSTATUS                  ErrorStatus
    );

VOID DriverAPauseQueue(
    IN  PDRIVERA_QUEUE    QueueExtension
    );
    
VOID DriverARestartQueue(
    IN  PDRIVERA_QUEUE    QueueExtension
    );

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

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

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

VOID DriverAInitializeList(
    IN  PDRIVERA_LIST   List,
    IN  PDEVICE_OBJECT          DeviceObject
    );

NTSTATUS DriverAInsertHead(
    IN  PDRIVERA_LIST   List, 
    IN  PIRP                Irp
    );

NTSTATUS DriverAInsertTail(
    IN  PDRIVERA_LIST   List, 
    IN  PIRP                Irp
    );

PIRP DriverARemoveHead(
    IN  PDRIVERA_LIST   List
    );

PIRP DriverARemoveTail(
    IN  PDRIVERA_LIST   List
    );

VOID DriverAFlushList(
    IN  PDRIVERA_LIST   List,
    IN  PFILE_OBJECT        FileObject
    );

VOID DriverAInvalidateList(
    IN  PDRIVERA_LIST   List,
    IN  NTSTATUS                ErrorStatus
    );

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

///////////////////////////////////////////////////////////////////////////////////////////////////
// DRIVERA_IO_LOCK
///////////////////////////////////////////////////////////////////////////////////////////////////

VOID DriverAInitializeIoLock(
    IN  PDRIVERA_IO_LOCK    IoLock, 
    IN  PDEVICE_OBJECT              DeviceObject
    );

NTSTATUS DriverACheckIoLock(
    IN  PDRIVERA_IO_LOCK    IoLock, 
    IN  PIRP                        Irp
    );

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

NTSTATUS DriverAIncrementIoCount(
    IN  PDRIVERA_IO_LOCK    IoLock
    );

VOID DriverADecrementIoCount(
    IN  PDRIVERA_IO_LOCK    IoLock
    );

VOID DriverALockIo(
    IN  PDRIVERA_IO_LOCK    IoLock
    );

VOID DriverAWaitForStopIo(
    IN  PDRIVERA_IO_LOCK    IoLock
    );

VOID DriverAUnlockIo(
    IN  PDRIVERA_IO_LOCK    IoLock
    );

VOID DriverAFlushPendingIo(
    IN  PDRIVERA_IO_LOCK    IoLock,
    IN  PFILE_OBJECT                FileObject
    );

VOID DriverAInvalidateIo(
    IN  PDRIVERA_IO_LOCK    IoLock,
    IN  NTSTATUS                    ErrorStatus
    );
#ifdef __cplusplus
}
#endif

BOOLEAN DriverAIsStoppable(
    IN  PDRIVERA_DEVICE_EXTENSION    DeviceExtension
    );

⌨️ 快捷键说明

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