StartIO例程学习

StartIO例程用于将设备操作串行化,确保并行的IRP(I/O请求包)按顺序执行。通过队列实现「先来先服务」原则,以避免函数执行交织。在驱动程序中,StartIO例程通常在DISPATCH_LEVEL级别运行,不会被线程中断。当使用StartIO时,IRP的派遣函数需返回挂起状态。
摘要由CSDN通过智能技术生成

能够保证各个并行的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
    );


StartIO例程  运行再DISPATCH_LEVEL级别,因此不能使用分页内存,否则会引起页故障,从而导致系统崩溃

下面示例:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值