topgun19
驱动牛犊
驱动牛犊
  • 注册日期2002-10-25
  • 最后登录2002-12-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2125回复:17

菜鸟:非pnp的ISA卡带两中断如何编写驱动程序?

楼主#
更多 发布于:2002-11-22 10:28
ISA卡为输入型四字节端口,地址200~203H,中断5、7,均由硬件跳线设置;现欲在win98下用VTOOLsD开发一VxD驱动程序,请赐请!
若能提供类似的源程序则最好,不胜感谢!
Gong_XG
驱动太牛
驱动太牛
  • 注册日期2002-10-01
  • 最后登录2010-11-25
  • 粉丝0
  • 关注0
  • 积分313分
  • 威望46点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-22 20:40
我写过一个中断的vxd.
topgun19
驱动牛犊
驱动牛犊
  • 注册日期2002-10-25
  • 最后登录2002-12-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-22 22:42
Gong_XG兄,能给我一些有实质性的建议或说明吗?谢谢!
Gong_XG
驱动太牛
驱动太牛
  • 注册日期2002-10-01
  • 最后登录2010-11-25
  • 粉丝0
  • 关注0
  • 积分313分
  • 威望46点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-23 20:41
你的两个中断关系密切吗?
topgun19
驱动牛犊
驱动牛犊
  • 注册日期2002-10-25
  • 最后登录2002-12-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-24 09:07
是两个独立的中断。
topgun19
驱动牛犊
驱动牛犊
  • 注册日期2002-10-25
  • 最后登录2002-12-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-11-24 09:12
我的信箱是topgun19@sohu.com
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2002-11-24 17:42
没有写过,但是挂两个中断应该是可以解决的。
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-11-24 19:11
VToolsD里面有VHardwareInt类,直接子类化2个,分别对应不同的IRQ即可。
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
topgun19
驱动牛犊
驱动牛犊
  • 注册日期2002-10-25
  • 最后登录2002-12-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-11-24 22:35
就是说得有两个不同的派生VHardwareInt类吗?
topgun19
驱动牛犊
驱动牛犊
  • 注册日期2002-10-25
  • 最后登录2002-12-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-11-26 14:30
还有:我在W98下编驱动可以只编中断服务程序,而I/O服务程序就用直接I/O可以吗?
arethusa
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-11-26 15:17
还有:我在W98下编驱动可以只编中断服务程序,而I/O服务程序就用直接I/O可以吗?


我想应该可以吧。
Gong_XG
驱动太牛
驱动太牛
  • 注册日期2002-10-01
  • 最后登录2010-11-25
  • 粉丝0
  • 关注0
  • 积分313分
  • 威望46点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-11-26 23:05
终于找到了。

对,建立两个中断类。

在初始化时,建立两个实例,并用hook挂构虚拟;在中断程序中直接用_inp,_outp对端口操作。退出时,删除实例。ok
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
12楼#
发布于:2002-11-27 13:47
还有:我在W98下编驱动可以只编中断服务程序,而I/O服务程序就用直接I/O可以吗?

完全可以。
topgun19
驱动牛犊
驱动牛犊
  • 注册日期2002-10-25
  • 最后登录2002-12-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-12-02 16:13
Gong_XG兄:你找到什么了?是例程吗?能不能给我发一个,我的E――MAIL:topgun19@sohu.com。谢谢!


topgun19
驱动牛犊
驱动牛犊
  • 注册日期2002-10-25
  • 最后登录2002-12-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-12-02 16:14
我的VXD驱动程序(仅针对中断5)与INF文件源码如下,但在WIN98下利用INF安装后板卡仍为问号(在系统中),请各位DX帮忙看一下有何问题。不胜感谢!

// VXDDRV.h - include file for VxD VXDDRV

#include <vtoolscp.h>

#define DEVICE_CLASS VxdDrvDevice
#define VXDDRV_DeviceID UNDEFINED_DEVICE_ID
#define VXDDRV_Init_Order NDEFINED_INIT_ORDER
#define VXDDRV_Major 1                        // 主版本号
#define VXDDRV_Minor 0                        // 从版本号

//使用输入卡所设硬件中断5
#define TestIrq 5

class OurInt : public VSharedHardwareInt
{
  public:
    OurInt();  //中断类构造函数
  virtual  BOOL OnSharedHardwareInt(VMHANDLE hVM); // 重载中断服务程序函数
};

//以下定义虚拟设备类
class VxdDrvDevice : public VDevice
{
 private:
    OurInt *pOurInt;

 public:
virtual BOOL OnSysDynamicDeviceInit();    // 虚拟机动态加载事件
virtual BOOL OnSysDynamicDeviceExit();    // 虚拟机动态卸载事件
};

// VXDDRV.cpp - VxD 主程序

#define DEVICE_MAIN
#include \"vxdDrv.h\"
Declare_Virtual_Device(VXDDRV)
#undef DEVICE_MAIN

static bool bflag=0;

// 以下为中断服务程序
//使某输出端口根据所接收到的中断产生相应跳变的方波信号
BOOL OurInt::OnVSharedHardwareInt(VMHANDLE hVM)
{
if(bflag==0){
_outp(0xe800,0xff); //向某输出端口写FFH
bflag=1;
}
else if(bflag==1) {
_outp(0xe800,0x00); //向某输出端口写00H
bflag=0;
}

sendPhysicalEOI(); // 通知 VPICD 重新允许该中断
return true;
}

// 向中断类实例化构造函数传递中断号 TestIrq
OurInt::OurInt():VSharedHardwareInt(TestIrq,VPICD_OPT_CAN_SHARE,0,0)
{
}


BOOL VxdDrvDevice::OnSysDynamicDeviceInit()
{

pOurInt = new OurInt(); // 为测试中断建立实例
    
// 挂接中断
   if((pOurInt==NULL)||(!pOurInt->hook()))
return FALSE ;
pOurInt->physicalUnmask();
bflag=0;
return TRUE ;
}

BOOL VxdDrvDevice::OnSysDynamicDeviceExit()
{
    
    pOurInt->unhook() ;  //解挂中断

pOurInt->physicalMask();
delete pOurInt ;     //删除中断实例
return TRUE;
}

VXDDRV.inf源码:
[Version]
Signature=$CHICAGO$
Class=Unknown
Provider=%string0%

[ClassInstall]

[DestinationDirs]
DefaultDestDir=11                               ; C:\\WINDOWS\\SYSTEM

[Manufacturer]
%string1%=SECTION_0

[SECTION_0]
%string2%=VXDDRV.install,*VXDDRV ; HardwareID

[VXDDRV.install]
CopyFiles=CopyFiles_VXDDRV
AddReg=AddReg_VXDDRV
LogConfig=LogConfig_VXDDRV

[CopyFiles_VXDDRV]
VXDDRV.vxd

[AddReg_VXDDRV]
HKR,,DevLoader,0,VXDDRV.vxd

[LogConfig_VXDDRV]
ConfigPriority=NORMAL
IOConfig=4@200-203%fff0(3FF::)
IRQConfig=5,7

[ControlFlags]

[Strings]
string0=\"XXX\"
string1=\"XXX\"
string2=\"Data Acquisition Cards\"
topgun19
驱动牛犊
驱动牛犊
  • 注册日期2002-10-25
  • 最后登录2002-12-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-12-06 09:13
顶一下,请大侠们帮忙解决一下!
topgun19
驱动牛犊
驱动牛犊
  • 注册日期2002-10-25
  • 最后登录2002-12-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-12-09 16:25
再顶一下。
topgun19
驱动牛犊
驱动牛犊
  • 注册日期2002-10-25
  • 最后登录2002-12-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-12-11 16:30
继续放分,继续发问:
ISA卡中断可以用动态加载的方法进行编程控制,而可以不编写INF安装信息文件、不进行静态安装(在系统中也不可见)吗?
游客

返回顶部