zhenlongyang
驱动小牛
驱动小牛
  • 注册日期2004-10-28
  • 最后登录2010-07-26
  • 粉丝1
  • 关注0
  • 积分729分
  • 威望100点
  • 贡献值0点
  • 好评度66点
  • 原创分0分
  • 专家分0分
阅读:2916回复:8

关于DriverEntry()、HalGetInterruptVector()、IoConnectInterrupt()的问题,望大师们不吝赐教!

楼主#
更多 发布于:2005-04-09 16:35
本人是一个WDM的初学者,有几个问题想问一下:
1.DriverEntry()函数是在什么时候被调用的?是在安装驱动程序时么?还是在用户态程序调用CreateFile()时调用的?
2.如何将一个非PnP硬件的IRQ(中断请求)与一个中断服务程序连接起来?我始终没搞明白HalGetInterruptVector()函数和IoConnectInterrupt()这两个函数是如何调用的,比如,我预为PC机自带的实时钟中断(即实模式的INT8中断,IRQ=0)编一个中断服务程序,使其定时的向一个端口发一个数据,该如何确定中断向量呢?
希望知道的大师们能给我详细指教一下,最好详细的介绍一下以上两个函数参数的意义,我虽然看过DDK文档,但是还是看不明白,弄得我晕头转向,如能得到指点一定加分,在此先谢了!

[编辑 -  4/9/05 by  zhenlongyang]
zhenlongyang
驱动小牛
驱动小牛
  • 注册日期2004-10-28
  • 最后登录2010-07-26
  • 粉丝1
  • 关注0
  • 积分729分
  • 威望100点
  • 贡献值0点
  • 好评度66点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-04-09 22:39
拜托,怎么没人理呀?大侠们都上哪儿去了?好歹也指点个一二呀。
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-04-11 09:45
本人是一个WDM的初学者,有几个问题想问一下:
1.DriverEntry()函数是在什么时候被调用的?是在安装驱动程序时么?还是在用户态程序调用CreateFile()时调用的?
2.如何将一个非PnP硬件的IRQ(中断请求)与一个中断服务程序连接起来?我始终没搞明白HalGetInterruptVector()函数和IoConnectInterrupt()这两个函数是如何调用的,比如,我预为PC机自带的实时钟中断(即实模式的INT8中断,IRQ=0)编一个中断服务程序,使其定时的向一个端口发一个数据,该如何确定中断向量呢?
希望知道的大师们能给我详细指教一下,最好详细的介绍一下以上两个函数参数的意义,我虽然看过DDK文档,但是还是看不明白,弄得我晕头转向,如能得到指点一定加分,在此先谢了!

[编辑 -  4/9/05 by  zhenlongyang]

.DriverEntry()函数是在什么时候被调用的?不是在安装驱动程序时,是在驱动初始化时。用户态程序调用CreateFile()产生
是IRP_MJ_CREATE
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
worldcup
驱动小牛
驱动小牛
  • 注册日期2004-08-19
  • 最后登录2006-10-19
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-04-11 11:20
我的理解是ventor是系统分配的!
一般是先用HalGetInterruptVector()获得vettor及irql等值,再执行IoConnectInterrupt()将中断服务程序和vector联系起来!

我现在也让中断愁着了,一连接IoConnectInterrupt就死机!
祝你早日解决问题!
zhenlongyang
驱动小牛
驱动小牛
  • 注册日期2004-10-28
  • 最后登录2010-07-26
  • 粉丝1
  • 关注0
  • 积分729分
  • 威望100点
  • 贡献值0点
  • 好评度66点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-04-11 23:14
2楼的大侠,如你所说,但是驱动程序到底是在哪一时刻被初始化的呢?书上说DriverEntry()例程只执行一次,那么是每次开机都执行一次么?还望能详细指点一下,多谢了!
zhenlongyang
驱动小牛
驱动小牛
  • 注册日期2004-10-28
  • 最后登录2010-07-26
  • 粉丝1
  • 关注0
  • 积分729分
  • 威望100点
  • 贡献值0点
  • 好评度66点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-04-11 23:24
3楼的大侠,如果Vector是系统分配的,那么我怎样知道某个IRQ所对应的Windows2000下的Vector是多少呢?能直接把一个IRQ号传给内核函数HalGetInterruptVector()来获得其Vector么?我对这个函数的使用似懂非懂,还望给个函数调用的例子,拜托了!
worldcup
驱动小牛
驱动小牛
  • 注册日期2004-08-19
  • 最后登录2006-10-19
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-04-12 10:14
(1)是否在开机时运行,这是可以设置的,但我也说不好

(2)能
MappedVector = HalGetInterruptVector(PCIBus,
                                           0,
                                           DeviceExtension->Level,
                                           DeviceExtension->Vector,
                                           &Irql,
                                           &DeviceExtension->Affinity);

   status = IoConnectInterrupt(
&DeviceExtension->InterruptObject, // InterruptObject
      (PKSERVICE_ROUTINE)Isr,   // ServiceRoutine
      (PVOID)DeviceObject,   // ServiceContext
     NULL,   // SpinLock
   MappedVector,   // Vector
      Irql,   // Irql
   Irql,   // SynchronizeIrql
   LevelSensitive,   // InterruptMode
      TRUE,   // ShareVector
   DeviceExtension->Affinity,   // ProcessorEnableMask
   FALSE);   // FloatingSave
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-04-13 11:14
驱动程序在DriverEntry被初始化的书上说DriverEntry()例程只执行一次,当然是每次开机都执行一次
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-04-13 11:17
可以用KD中的dt看中断对象的数据结构,相信会更明白
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
游客

返回顶部