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

📄 charsample_ddk.h

📁 该源码是用DDK编写的WDM驱动程序
💻 H
📖 第 1 页 / 共 2 页
字号:
// CharSample_DDK.h
//
// Generated by C DriverWizard 3.1.0 (Build 1722)
// Requires DDK Only
// File created on 7/11/2007
//
#ifndef __CHARSAMPLE_DDK_H__
#define __CHARSAMPLE_DDK_H__

// Memory allocation pool tag
#define CHARSAMPLE_DDK_POOL_TAG 'rahC'

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

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

// irp queue type definition
typedef struct _CHARSAMPLE_DDK_QUEUE
{
    PCHARSAMPLE_DDK_QUEUE_STARTIO StartIoRoutine;
    PDEVICE_OBJECT  DeviceObject;
    LIST_ENTRY      IrpQueue;
    KSPIN_LOCK      QueueLock;
    PIRP            CurrentIrp;
    KEVENT          StopEvent;
    LONG            StallCount; 
    NTSTATUS        ErrorStatus;
    KDPC            CharSample_DDKStartIoDpc;
    BOOLEAN         bUseCharSample_DDKStartIoDpc;
} CHARSAMPLE_DDK_QUEUE, *PCHARSAMPLE_DDK_QUEUE;

// cancel-safe irp list type definition
typedef struct _CHARSAMPLE_DDK_LIST
{
    PDEVICE_OBJECT  DeviceObject;
    LIST_ENTRY      IrpList;
    KSPIN_LOCK      ListLock;
    NTSTATUS        ErrorStatus;
} CHARSAMPLE_DDK_LIST, *PCHARSAMPLE_DDK_LIST;

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

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

extern CHARSAMPLE_DDK_DATA g_Data;

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


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

    CHARSAMPLE_DDK_IO_LOCK IoLock;                 // misc io lock

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

    UNICODE_STRING          InterfaceName;          // name returned from IoRegisterDeviceInterface
    LONG                    OpenHandleCount;
} CHARSAMPLE_DDK_DEVICE_EXTENSION, *PCHARSAMPLE_DDK_DEVICE_EXTENSION;

#ifdef __cplusplus
extern "C" 
{
#endif

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

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

VOID __stdcall CharSample_DDKUnload(
    IN  PDRIVER_OBJECT  DriverObject
    );

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

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

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

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

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

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

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

VOID CharSample_DDKInitializeQueue(
    IN  PCHARSAMPLE_DDK_QUEUE    QueueExtension,
    IN  PCHARSAMPLE_DDK_QUEUE_STARTIO     StartIoRoutine,
    IN  PDEVICE_OBJECT      DeviceObject,
    IN  BOOLEAN             bUseCharSample_DDKStartIoDpc
    );

NTSTATUS CharSample_DDKQueueIrp(
    IN  PCHARSAMPLE_DDK_QUEUE    QueueExtension,
    IN  PIRP                Irp
    );

VOID CharSample_DDKStartNext(
    IN  PCHARSAMPLE_DDK_QUEUE    QueueExtension
    );

VOID CharSample_DDKFlushQueue(
    IN  PCHARSAMPLE_DDK_QUEUE    QueueExtension,
    IN  PFILE_OBJECT        FileObject
    );

VOID CharSample_DDKInvalidateQueue(
    IN  PCHARSAMPLE_DDK_QUEUE    Queue,
    IN  NTSTATUS                  ErrorStatus
    );

VOID CharSample_DDKPauseQueue(
    IN  PCHARSAMPLE_DDK_QUEUE    QueueExtension
    );
    
VOID CharSample_DDKRestartQueue(
    IN  PCHARSAMPLE_DDK_QUEUE    QueueExtension
    );

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

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

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

VOID CharSample_DDKInitializeList(
    IN  PCHARSAMPLE_DDK_LIST   List,
    IN  PDEVICE_OBJECT          DeviceObject
    );

NTSTATUS CharSample_DDKInsertHead(
    IN  PCHARSAMPLE_DDK_LIST   List, 
    IN  PIRP                Irp
    );

NTSTATUS CharSample_DDKInsertTail(
    IN  PCHARSAMPLE_DDK_LIST   List, 
    IN  PIRP                Irp
    );

PIRP CharSample_DDKRemoveHead(
    IN  PCHARSAMPLE_DDK_LIST   List
    );

PIRP CharSample_DDKRemoveTail(
    IN  PCHARSAMPLE_DDK_LIST   List
    );

VOID CharSample_DDKFlushList(
    IN  PCHARSAMPLE_DDK_LIST   List,
    IN  PFILE_OBJECT        FileObject
    );

VOID CharSample_DDKInvalidateList(
    IN  PCHARSAMPLE_DDK_LIST   List,
    IN  NTSTATUS                ErrorStatus
    );

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

///////////////////////////////////////////////////////////////////////////////////////////////////
// CHARSAMPLE_DDK_IO_LOCK
///////////////////////////////////////////////////////////////////////////////////////////////////

VOID CharSample_DDKInitializeIoLock(
    IN  PCHARSAMPLE_DDK_IO_LOCK    IoLock, 
    IN  PDEVICE_OBJECT              DeviceObject
    );

NTSTATUS CharSample_DDKCheckIoLock(
    IN  PCHARSAMPLE_DDK_IO_LOCK    IoLock, 
    IN  PIRP                        Irp
    );

⌨️ 快捷键说明

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