Windows驱动中的队列

来源:互联网 发布:mac如何下载美服lol 编辑:程序博客网 时间:2024/05/17 05:57
                  

                今天还好!可以很早下班,而且主要是不太忙了,所以以后要加紧更新了!希望今年可以对windows驱动做个很好的总结。

                今天想介绍下,跟IRP也非常相关的队列。这里只简单介绍下,后续还会修改。我们知道在WDM驱动模型中,我们的IRP,需要排队,因为一下无法处理那么多的IRP,怎么办了,那就需要队列。队列的对象一般放在我们的设备扩展中。这里一般我们还会用到两个函数IoStartPacketIoStartNextPacket,还有一个驱动对象的域DriverObject->DriverStartIo,一般来说,我们会在majorfunction的函数指针指向的函数,首先处理IRP,在后面我们调用IoStartPacket,再然后,我们直接调用XxxStartIo例程,或者直接把IRP排进队列中。一般来说,我们会在创建设备对象时,初始化队列,调用KeInitializeDeviceQueue ,KeInsertDeviceQueue or KeInsertByKeyDeviceQueue 来插入队列。我们来看MSDN中的图:

              

 

                    我们再来看WDF中的队列对象的操作。一般在WDF中,我们调用WdfIoQueueCreate来创建和配置队列。函数如下:

                    当然,我们要看一下,这个WDF_IO_QUEUE_CONFIG参数,按照老路子,肯定是通过宏来初始化其参数,再对参数赋值,再用这些配置的队列参数来创建队列。

        NTSTATUS          WdfIoQueueCreate(               IN WDFDEVICE  Device,               IN PWDF_IO_QUEUE_CONFIG  Config,               IN OPTIONAL PWDF_OBJECT_ATTRIBUTES  QueueAttributes,               OUT WDFQUEUE*  Queue             );                  
           typedef struct _WDF_IO_QUEUE_CONFIG {              ULONG  Size;              WDF_IO_QUEUE_DISPATCH_TYPE  DispatchType;              WDF_TRI_STATE  PowerManaged;              BOOLEAN  AllowZeroLengthRequests;              BOOLEAN  DefaultQueue;              PFN_WDF_IO_QUEUE_IO_START  EvtIoDefault;              PFN_WDF_IO_QUEUE_IO_READ  EvtIoRead;              PFN_WDF_IO_QUEUE_IO_WRITE  EvtIoWrite;              PFN_WDF_IO_QUEUE_IO_DEVICE_CONTROL  EvtIoDeviceControl;              PFN_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL  EvtIoInternalDeviceControl;              PFN_WDF_IO_QUEUE_IO_STOP  EvtIoStop;              PFN_WDF_IO_QUEUE_IO_RESUME  EvtIoResume;              PFN_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE  EvtIoCanceledOnQueue;         } WDF_IO_QUEUE_CONFIG, *PWDF_IO_QUEUE_CONFIG;

                       看到这个我们会会心的一笑,原来在这里,所有的IRP的函数指针都在这里。这里我们用WDF_IO_QUEUE_CONFIG_INIT 或者WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE,来初始化这个队列属性,之所以有两个宏,那是因为,WDF认为电源处理队列是默认的队列,如果我们需要自己处理电源管理事件,我们就需要用WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE,其它的时间,我们使用WDF_IO_QUEUE_CONFIG_INIT.

原创粉丝点击