📄 charsample.h
字号:
// CharSample.h
//
// Generated by C DriverWizard 3.1.0 (Build 1722)
// Requires DDK Only
// File created on 10/23/2004
//
#ifndef __CHARSAMPLE_H__
#define __CHARSAMPLE_H__
// Memory allocation pool tag
#define CHARSAMPLE_POOL_TAG 'rahC'
// Make all pool allocations tagged
#undef ExAllocatePool
#define ExAllocatePool(type, size) \
ExAllocatePoolWithTag(type, size, CHARSAMPLE_POOL_TAG);
// queue start io callback
typedef VOID (*PCHARSAMPLE_QUEUE_STARTIO)(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
// irp queue type definition
typedef struct _CHARSAMPLE_QUEUE
{
PCHARSAMPLE_QUEUE_STARTIO StartIoRoutine;
PDEVICE_OBJECT DeviceObject;
LIST_ENTRY IrpQueue;
KSPIN_LOCK QueueLock;
PIRP CurrentIrp;
KEVENT StopEvent;
LONG StallCount;
NTSTATUS ErrorStatus;
KDPC CharSampleStartIoDpc;
BOOLEAN bUseCharSampleStartIoDpc;
} CHARSAMPLE_QUEUE, *PCHARSAMPLE_QUEUE;
// cancel-safe irp list type definition
typedef struct _CHARSAMPLE_LIST
{
PDEVICE_OBJECT DeviceObject;
LIST_ENTRY IrpList;
KSPIN_LOCK ListLock;
NTSTATUS ErrorStatus;
} CHARSAMPLE_LIST, *PCHARSAMPLE_LIST;
// stall IRP list to syncronize Pnp, Power with
// the rest of IO
typedef struct _CHARSAMPLE_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_IO_LOCK, *PCHARSAMPLE_IO_LOCK;
// global (per driver) data block
typedef struct _CHARSAMPLE_DATA
{
UNICODE_STRING RegistryPath; // saved registry path
ULONG InstanceCount; // FDO instance count
USHORT WdmVersion; // os version
} CHARSAMPLE_DATA, *PCHARSAMPLE_DATA;
extern CHARSAMPLE_DATA g_Data;
// PnP states
typedef enum _CHARSAMPLE_PNP_STATE
{
PnpStateNotStarted = 0,
PnpStateStarted,
PnpStateStopPending,
PnpStateStopped,
PnpStateRemovePending,
PnpStateRemoved,
PnpStateSurpriseRemoved
} CHARSAMPLE_PNP_STATE;
// The device extension for the device object
typedef struct _CHARSAMPLE_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_IO_LOCK IoLock; // misc io lock
CHARSAMPLE_PNP_STATE PnpState; // PnP state variable
CHARSAMPLE_PNP_STATE PreviousPnpState; // Previous PnP state variable
UNICODE_STRING InterfaceName; // name returned from IoRegisterDeviceInterface
LONG OpenHandleCount;
} CHARSAMPLE_DEVICE_EXTENSION, *PCHARSAMPLE_DEVICE_EXTENSION;
#ifdef __cplusplus
extern "C"
{
#endif
NTSTATUS __stdcall DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
);
NTSTATUS __stdcall CharSampleAddDevice(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PhysicalDeviceObject
);
VOID __stdcall CharSampleUnload(
IN PDRIVER_OBJECT DriverObject
);
NTSTATUS __stdcall CharSamplePnpDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS __stdcall CharSamplePowerDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS __stdcall CharSampleDeviceIoControlDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS __stdcall CharSampleCreateDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS __stdcall CharSampleCloseDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS __stdcall CharSampleSystemControlDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
///////////////////////////////////////////////////////////////////////////////////////////////////
// Queue Functions
///////////////////////////////////////////////////////////////////////////////////////////////////
VOID CharSampleInitializeQueue(
IN PCHARSAMPLE_QUEUE QueueExtension,
IN PCHARSAMPLE_QUEUE_STARTIO StartIoRoutine,
IN PDEVICE_OBJECT DeviceObject,
IN BOOLEAN bUseCharSampleStartIoDpc
);
NTSTATUS CharSampleQueueIrp(
IN PCHARSAMPLE_QUEUE QueueExtension,
IN PIRP Irp
);
VOID CharSampleStartNext(
IN PCHARSAMPLE_QUEUE QueueExtension
);
VOID CharSampleFlushQueue(
IN PCHARSAMPLE_QUEUE QueueExtension,
IN PFILE_OBJECT FileObject
);
VOID CharSampleInvalidateQueue(
IN PCHARSAMPLE_QUEUE Queue,
IN NTSTATUS ErrorStatus
);
VOID CharSamplePauseQueue(
IN PCHARSAMPLE_QUEUE QueueExtension
);
VOID CharSampleRestartQueue(
IN PCHARSAMPLE_QUEUE QueueExtension
);
VOID CharSampleStartIoDpc(
IN PKDPC Dpc,
IN PVOID Context,
IN PVOID Unused1,
IN PVOID Unused2
);
VOID CharSampleQueueCancelRoutine(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
///////////////////////////////////////////////////////////////////////////////////////////////////
// List functions
///////////////////////////////////////////////////////////////////////////////////////////////////
VOID CharSampleInitializeList(
IN PCHARSAMPLE_LIST List,
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS CharSampleInsertHead(
IN PCHARSAMPLE_LIST List,
IN PIRP Irp
);
NTSTATUS CharSampleInsertTail(
IN PCHARSAMPLE_LIST List,
IN PIRP Irp
);
PIRP CharSampleRemoveHead(
IN PCHARSAMPLE_LIST List
);
PIRP CharSampleRemoveTail(
IN PCHARSAMPLE_LIST List
);
VOID CharSampleFlushList(
IN PCHARSAMPLE_LIST List,
IN PFILE_OBJECT FileObject
);
VOID CharSampleInvalidateList(
IN PCHARSAMPLE_LIST List,
IN NTSTATUS ErrorStatus
);
VOID CharSampleListCancelRoutine(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
///////////////////////////////////////////////////////////////////////////////////////////////////
// CHARSAMPLE_IO_LOCK
///////////////////////////////////////////////////////////////////////////////////////////////////
VOID CharSampleInitializeIoLock(
IN PCHARSAMPLE_IO_LOCK IoLock,
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS CharSampleCheckIoLock(
IN PCHARSAMPLE_IO_LOCK IoLock,
IN PIRP Irp
);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -