驱动设计流程

    MiniDriver上层还有一个叫做ClassDriver的驱动。MiniDrive通过DriverEntity向ClassDriver注册它自己。这个过程是通过向ClassDriver传递HW_INITIALIZATION_DATA结构实现的。MiniDriver中的DriverEntity例程就是填写这个结构体,然后通过StreamClassRegisterAdapter这个函数将结构体传递给ClassDriver. HW_INITIALIZATION_DATA中有四个参数HwInterrupt, HwReceivePacket, HwCancelPacket,HwTimeOutPacket分别指向一个回调函数,以后ClassDrive通过这几个参数所指定的回调函数向MiniDriver发送消息,控制MiniDriver工作。
    其中HwInterrupt, HwCancelPacket,HwTimeOutPacket分别针对硬件中断,取消包操作,包操作超时所做的特殊处理。而HwReceivePacket则是ClassDriver向MiniDriver发送操作指令的主要通道。ClassDriver会将一个结构体_HW_STREAM_REQUEST_BLOCK(SRB)做为参数发给MiniDriver.这个结构中的Command成员定义了具体的操作类型。如SRB_INITIALIZE_DEVICE,SRB_GET_STREAM_INFO等。HwReceivePacket所指定的回调函数通过判断Command成员的类型再去实现具体的操作。操作完成后,MiniDriver先设置当前SRB中表示请求状态的状态域,再通过StreamClassDeviceNotification告诉ClassDriver已经完成了这个操作,可以发送下一个SRB了。所有在HwReceivePacket中的操作都属于设备操作。
    驱动的第一步操作就是初始化,即ClassDriver通过HwReceivePacket所指定的回调函数发送的第一个命令是SRB_INITIALIZE_DEVICE。驱动程序在响应这个消息时,先通过ExAllocatePool分配必要的内存空间,然后由UsbBuildGetDescriptorRequest来创建一个新的URB。另一方面由IoBuildDeviceIoControlRequest 创建一个IPR中,然后再通过IoGetNextIrpStackLocation处理这个IRP。然后将这个URB封装到这个IRP的Parameters.Others.Argument1参数中。最后通过IoCallDriver将这个IRP发送到下一级的驱动中。在响应SRB_INITIALIZE_DEVICE的过程中,总共创建了三个URB,对应的也发送了三个IPR到下一层驱动。在响应这个消息时,还可以对硬件配置做一些初始化。
完成上一个消息响应后,ClassDriver发送包含有SRB_GET_STREAM_INFO的SRB。MiniDriver将所支持的流的信息及它的每个流的回调函数提供给ClassDriver。(这里的回调函数属于数据操作,要用StreamClassStreamNotification来通知ClassDriver已经完成了这个操作。)
    然后ClassDriver再发送SRB_INITIALIZATION_COMPLETE请求,MiniDriver处理完这个请求后,初始化才算真正的完成。
初始化完成后,ClassDriver会发送SRB_OPEN_STREAM消息,MiniDriver据此执行必要的硬件动做,打开相应的流。主要是用已知流的信息初始化当前SRB中的StreamObject结构。然后返回给ClassDriver。
    不再使用这个流时,ClassDriver发送SRB_CLOSE_STREAM给MiniDriver,MiniDriver调用VideoQueueCancelAllSRBs来取消所有的SRB包,并调用ExFreePool释放空间,最后将当前流指针设为空,即完成关闭流的操作。
    ClassDriver发送SRB_GET_DEVICE_PROPERTY与SRB_SET_DEVICE_PROPERTY来实时的设置与得到当前设备的属性。在这一部分,MiniDriver先调用IsEqualGUID来判断是否是所要修改或得到的参数,然后再做具体的设置操作。
另外还有一个命令SRB_GET_DATA_INTERSECTION,还不很清楚
以上所述的都是在HwReceivePacket所指定的回调函数中实现的。它们都要通过StreamClassDeviceNotification来回馈给ClassDriver。另外还有两个回调函数是与数据流操作相关的,这两个函数并不在DriverEntity中声名,而是在响应SRB_OPEN_STREAM消息时向ClassDriver作出定义。这两个函数分别是由HW_STREAM_OBJECT中的参数所指定的成员:VideoReceiveDataPacket
VideoReceiveCtrlPacket
VideoReceiveDataPacket先判断SRB中的Command指令,如果是SRB_READ_DATA,就将SRB送入PHW_DEVICE_EXTENSION-> pStrmEx-> DataList中,并且计数器加一。
VideoReceiveCtrlPacket则接收SRB中的其它一些消息:
SRB_SET_STREAM_STATE
这个消息决定打开视频流还是关闭视频流。这取决于Srb->CommandData.StreamState
SRB_GET_STREAM_STATE
将当前流的状态送入SRB中的相关参数中。如下:
    pSrb->CommandData.StreamState = pStrmEx->KSState;
    pSrb->ActualBytesTransferred  = sizeof(KSSTATE);
SRB_PROPOSE_DATA_FORMAT
SRB_SET_DATA_FORMAT
SRB_GET_STREAM_PROPERTY
以上这些消息都由ClassDriver调用VideoReceiveCtrlPacket发送给MiniDriver。最后再通过StreamClassStreamNotification回复给ClassDriver.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值