能够保证各个并行的IRP顺序执行,即串行化。
很多时候,对设备的操作必须是串行化,驱动程序有必要将并行的请求变成串行的请求,需要用到队列。
并行运行(函数执行交织在一起)
如果想一次处理每个IRP,必须采用队列将处理串行化。采用“先来先服务”原则
typedef struct _KDEVICE_QUEUE { //IRP队列来实现串行
CSHORT Type;
CSHORT Size;
LIST_ENTRY devicelisthead;
KSPIN_LOCK Lock;
BOOLEAN Busy;
} KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE;
这个StartIO例程声明在DriverEntry中:
pDriverObject->DriverStartIo = HelloDDKStartIO;
运行再 DISPATCH_LEVEL 级别,不会被线程所打断。 这个例程 参数类似派遣函数,不敢没有返回值
在声明时 加上
#pragma LOCKEDCODE
示例:
在使用StartIO例程时,需要IRP的派遣函数返回挂起状态。调用
VOID
IoStartPacket(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PULONG Key OPTIONAL, //If this is zero, the packet is inserted at the tail of the device queue.
IN PDRIVER_CANCEL CancelFunction OPTIONAL //Specifies the entry point for a driver-supplied Cancel routine.
);
VOID
IoStartNextPacket(
IN PDEVICE_OBJECT DeviceObject,
IN BOOLEAN Cancelable
);
BOOLEAN
KeRemoveEntryDeviceQueue( //从设备队列中将该IRP抽取出来
IN PKDEVICE_QUEUE DeviceQueue,
IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
);
下面示例: