阅读:2916回复:8
关于DriverEntry()、HalGetInterruptVector()、IoConnectInterrupt()的问题,望大师们不吝赐教!
本人是一个WDM的初学者,有几个问题想问一下:
1.DriverEntry()函数是在什么时候被调用的?是在安装驱动程序时么?还是在用户态程序调用CreateFile()时调用的? 2.如何将一个非PnP硬件的IRQ(中断请求)与一个中断服务程序连接起来?我始终没搞明白HalGetInterruptVector()函数和IoConnectInterrupt()这两个函数是如何调用的,比如,我预为PC机自带的实时钟中断(即实模式的INT8中断,IRQ=0)编一个中断服务程序,使其定时的向一个端口发一个数据,该如何确定中断向量呢? 希望知道的大师们能给我详细指教一下,最好详细的介绍一下以上两个函数参数的意义,我虽然看过DDK文档,但是还是看不明白,弄得我晕头转向,如能得到指点一定加分,在此先谢了! [编辑 - 4/9/05 by zhenlongyang] |
|
沙发#
发布于:2005-04-09 22:39
拜托,怎么没人理呀?大侠们都上哪儿去了?好歹也指点个一二呀。
|
|
板凳#
发布于:2005-04-11 09:45
本人是一个WDM的初学者,有几个问题想问一下: .DriverEntry()函数是在什么时候被调用的?不是在安装驱动程序时,是在驱动初始化时。用户态程序调用CreateFile()产生 是IRP_MJ_CREATE |
|
|
地板#
发布于:2005-04-11 11:20
我的理解是ventor是系统分配的!
一般是先用HalGetInterruptVector()获得vettor及irql等值,再执行IoConnectInterrupt()将中断服务程序和vector联系起来! 我现在也让中断愁着了,一连接IoConnectInterrupt就死机! 祝你早日解决问题! |
|
地下室#
发布于:2005-04-11 23:14
2楼的大侠,如你所说,但是驱动程序到底是在哪一时刻被初始化的呢?书上说DriverEntry()例程只执行一次,那么是每次开机都执行一次么?还望能详细指点一下,多谢了!
|
|
5楼#
发布于:2005-04-11 23:24
3楼的大侠,如果Vector是系统分配的,那么我怎样知道某个IRQ所对应的Windows2000下的Vector是多少呢?能直接把一个IRQ号传给内核函数HalGetInterruptVector()来获得其Vector么?我对这个函数的使用似懂非懂,还望给个函数调用的例子,拜托了!
|
|
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 |
|
7楼#
发布于:2005-04-13 11:14
驱动程序在DriverEntry被初始化的书上说DriverEntry()例程只执行一次,当然是每次开机都执行一次
|
|
|
8楼#
发布于:2005-04-13 11:17
可以用KD中的dt看中断对象的数据结构,相信会更明白
|
|
|