首页 > 其他 > 详细

IoConnectInterrupt

时间:2020-11-05 21:31:04      阅读:50      评论:0      收藏:0      [点我收藏+]
网卡驱动注册中断处理
通过NdisMRegisterInterruptEx注册中断处理函数,内部从处理代码如下
      ...
      INITIALIZE_DPC( &Interrupt->InterruptDpc,                                                    // 初始化一个dpc
                      MINIPORT_TEST_FLAG(Miniport, fMINIPORT_DESERIALIZE) ? ndisMDpcX : ndisMDpc,  // DPC Routine, nids*系统提供的框架
                      Interrupt);

      Interrupt->MiniportIsr = Miniport->DriverHandle->MiniportCharacteristics.ISRHandler; // 真正的驱动中断处理isr
      Interrupt->MiniportDpc = Miniport->HandleInterruptHandler;                           // 真正的驱动中断处理dpc
      ...
      Status = ndisTranslateResources(Miniport,
                                      CmResourceTypeInterrupt,                             // CmResourceTypeInterrupt,从resource中取出指定类型
                                      NonTranslatedInterrupt,
                                      &TranslatedIrql,
                                      &pResourceDescriptor);                              // 系统会给硬件生成resource,在驱动安装时,提供给驱动
                                                                                          // 包含port,dma,interrupt,memory等
                                                                                          // https://blog.csdn.net/xiangbaohui/article/details/105134068

      Vector = pResourceDescriptor->u.Interrupt.Vector;                                   // 中断资源里,包含中断vector
      ...
      IoConnectInterrupt(&Interrupt->InterruptObject,         // 此函数完成 中断号 和 中断处理函数 的对应
                         (PKSERVICE_ROUTINE)ndisMIsr,         // 中断处理函数, nids*系统提供的框架
                         Interrupt,                           // 做为ndisMIsr的参数 context
                         NULL,
                         Vector,                              // 中断号
                         Irql,
                         Irql,
                         (KINTERRUPT_MODE)InterruptMode,
                         SharedInterrupt,
                         InterruptAffinity,
                         FALSE);
系统把网卡的中断处理函数设置为了ndisMIsr, 内部处理代码如下
      ndisMIsr(  // 框架
          IN PKINTERRUPT                  KInterrupt,
          IN PVOID                        Context
          )
      {    
            PNDIS_MINIPORT_INTERRUPT Interrupt = (PNDIS_MINIPORT_INTERRUPT)Context;  // IoConnectInterrupt的第三个参数
            ...
            Interrupt->MiniportIsr(&InterruptRecognized,      // 这里调用了, 真正的驱动中断处理isr
                                   &QueueDpc,
                                   Interrupt->Reserved);
            ...
      
            if (QUEUE_DPC(&Interrupt->InterruptDpc)) //  此处把前面初始化的DPC_Routine插入dpc队列
      }

      
看看这个DPC Routine的内部
      DPC_Routine() // 框架
      {
            W_HANDLE_INTERRUPT_HANDLER MiniportDpc = Interrupt->MiniportDpc; // 真正的驱动中断处理dpc
            
            (*MiniportDpc)(Interrupt->Reserved);      // 调用 真正的中断处理dpc
            ...
      }
由此我们发现,系统注册网卡中断处理时,用了两个nids*函数作为一个框架,然后在内部再去调用驱动程序真正的isr和dpc

中断处理函数为ndisMIsr

ndisMIsr ---> MiniportIsr + ndisMDpc
ndisMDpc ---> MiniportDpc

参考:
https://blog.csdn.net/u011471873/article/details/51535086
https://blog.csdn.net/xiangbaohui/article/details/105134068

IoConnectInterrupt

原文:https://www.cnblogs.com/asmalleyu/p/13933673.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!