ghorse
驱动牛犊
驱动牛犊
  • 注册日期2001-09-11
  • 最后登录2002-06-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1628回复:6

用ds的kpciconfiguration读配置空间

楼主#
更多 发布于:2002-06-15 20:27
用driverworks写了个驱动读pci的配置空间,使用
KPciConfiguration类的headread函数,
具体情况是这样:
先在设备类中定义了一个KPciConfiguration类型的
成员,在设备类的构造函数中初始化;
在DeviceIoControl添加了一个cfg_read的控制码,
有一个函数来处理这个代码。测试程序是用的ds自己
生成的测试程序,结果应用程序一运行系统就重启了,
不知是怎么回事。我的卡已经插在机器上了,驱动程序
也已经正确安装。我没有用过ds,这个程序的目的只是
为了看看自己写的东西是不是有效,结果一上来就是
一个下马威。
我在水木的bbs上也看到有人碰到这个问题,但是没有
解决,不知道这里的牛人能否解答一下。

最新喜欢:

Ice_BinIce_Bi...
bighawk
驱动牛犊
驱动牛犊
  • 注册日期2002-04-24
  • 最后登录2006-01-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-06-16 11:26
KPciConfiguration::;ReadHeader函数要求运行在PASS_LEVL中断级,
你的DeviceIoControl控制代码调用发生在DISPATCH_LEVL中断级。当然不行了。你可在初始化例程中调用此函数。
ghorse
驱动牛犊
驱动牛犊
  • 注册日期2001-09-11
  • 最后登录2002-06-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-06-16 12:44
我昨天晚上刚刚想到了这个问题,就是不敢确定,
现在松了一口气了。
但是如果在初始化中调用readheader,那么怎么
把配置内容传递给上层的应用程序呢?
如果把配置传递给应用程序,是不是要使用自旋锁?
我刚入门,对于一些问题只有模糊的概念,呵呵
zzfd97
驱动小牛
驱动小牛
  • 注册日期2002-02-01
  • 最后登录2005-07-31
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-06-16 18:15
你可以去看看有关驱动方面的书!这样子你久可以明白许多!然后再到网上来.
ghorse
驱动牛犊
驱动牛犊
  • 注册日期2001-09-11
  • 最后登录2002-06-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-06-16 20:30
我正在看,只是有些东西不明白。
如果我打扰了你,我道歉。
如果你知道又愿意告诉我,我会感谢你。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2002-06-17 11:09
你可以先保存你得到的配置呀。
然后在deviceiocontrol返回给app不就可以?
brucezh
驱动老牛
驱动老牛
  • 注册日期2002-01-30
  • 最后登录2007-02-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-06-18 10:55
在类定义中声明:
class MyDevice : public KPnpDevice{
public:
      KPciConfiguration m_cfg;
      ……
protected:
      ULONG baseaddress0;
      ……
}
在构造函数中加上:
MyDevice::MyDevice(PDEVICE_OBJECT Pdo, ULONG Unit) :
KPnpDevice(Pdo, &MyDevice_Guid),
m_cfg(NULL){
       ……
       m_Lower.Initialize(this, Pdo);
//下面是得到配置空间的代码
       m_cfg.Initialize(m_Lower.DeviceObject());
       if ( !m_cfg.IsValid() ){

// constructor succeeded
t<<\"the pci configration area isn\'t valid.\\n\";
        }
        else{
t<<\"the pci configration area is valid.\\n\";
baseaddress0=m_cfg.ReadBaseAddress(0);
      //如果映射在内存空间:
     if(!(baseaddress0&0x00000001)){
            baseaddress0&=0xFFFFFFF0;
     }
      //如果映射在io空间:
     else{
baseaddress0&=0x0000FFFC;
     }
        }
//上面得到了配置空间基址
        SetLowerDevice(&m_Lower);
        SetPnpPolicy();
}
这样,baseaddress0中就是配置空间基址,程序的其他地方可以随便调用了。

打一枪……换个地方……再打一枪……
游客

返回顶部