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

紧急求救关于HalGetBusData的问题

楼主#
更多 发布于:2002-06-08 15:55
在头文件中包含了ntddk.h
在程序文件中调用HalGetBusData,编译没问题,但是连接时报错如下:
init.obj() : error LNK2001: unresolved external symbol __imp__HalGetBusData@20
objchk\\i386\\irqtest.sys() : error LNK1120: 1 unresolved externals
不知是什么缘故,请各路大侠多帮忙啊!

另外如果不用Hal..BusData这些函数的话,在WDM里面怎么样得到PCI的配置空间?有知道的大侠请详细点告诉我好么?
所有心情在零下30度冻结……
FoolishMan
驱动牛犊
驱动牛犊
  • 注册日期2002-05-10
  • 最后登录2002-10-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-06-09 00:06
将ntddk,h改为如下就可以了
#ifdef __cplusplus
extern \"C\"{
#endif

#include \"ntddk.h\"                      // main NT include


#ifdef __cplusplus
};
#endif
leonqinyahoo
驱动牛犊
驱动牛犊
  • 注册日期2002-06-08
  • 最后登录2002-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-06-09 01:38
活着原文间用.c不用.cpp
窝,三英二云
shushishu
驱动牛犊
驱动牛犊
  • 注册日期2002-05-28
  • 最后登录2002-06-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-06-09 10:42
我本来的头文件就已经象FOOLISHMAN所说的那样写了的啊!
我再重新写.C文件来试试。还有哪位知道究竟的也多来帮帮忙啊!感谢上面两位,一解决完问题马上给分 。
所有心情在零下30度冻结……
shushishu
驱动牛犊
驱动牛犊
  • 注册日期2002-05-28
  • 最后登录2002-06-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-06-09 11:19
我用了.C文件,还是一样的问题,连接报错,还是HalGetBusData函数。
所有心情在零下30度冻结……
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2002-06-09 16:40
你是NT的driver还是WDM的?
HalGetBusData is obsolete and is exported only to support existing drivers.
shushishu
驱动牛犊
驱动牛犊
  • 注册日期2002-05-28
  • 最后登录2002-06-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-06-09 17:51
好象知道了,在WIN2K里面是不能用HalGetBusData等函数的,WDM.H里面没有定义。即使把NTDDK.H加进去,编译能通过,连接时还是出毛病的。
只是觉得很奇怪,看DDK文档的语气,好象是说这些函数过时了,但没有明确说在WDM中就不能用(似乎写WIN2K下的NT式驱动程序还能用的)。而且看见一些文章和一些大侠的意思也是这样的。
对这个问题同样有兴趣的同志可以在论坛里面搜索HalGetBusData的相关文章,有很多很好的;如果开发WDM(跟我一样)的话,可以搜索PCI配置空间的相关文章,其中有几篇很经典的。当然专栏里面有一篇最重要的,我把它略微翻译了一下,希望也能帮到有需要的同志。而楼上的几位对不起啊,我的分数也不多了,所以这个问题就没办法给分了:=)

翻译:(原文见专栏里,搜索Get Configuration and Location Information of PCI Device)
如何得到PCI设备的配置和分配信息?
(应用于WIN2000DDK)

概述:
本文讲述如何在驱动程序中得到PCI设备的配置和分配信息(总线号、设备号和功能号),该驱动程序是目标设备驱动程序栈的一部分,或者是功能驱动程序,或者是过滤驱动程序。

更多信息:
在WIN NT 4.0下,驱动程序通过扫描总线和调用HalGetBusData和HalGetBusDataByOffset等API来得到这些信息;在WIN2000下,硬件总线由其相应的总线驱动程序控制而不是由HAL。因此所有的HAL API函数都已经废弃不用了。
在WIN2000下,驱动程序不需要去查询设备来得到相应的资源,而是在它的IRP_MN_START_DEVICE处理中由PNP管理器得到。很典型的情况下,一个写得很好的驱动程序可以正确工作而不需要任何这些信息。假如因为某些原因,驱动程序需要这些信息,以下的范例代码演示了如何得到这些代码。该驱动程序必须是设备驱动程序栈的一部分,因为它需要底层的PDO来发送PNP请求。

ReadWriteConfigSpace代码:
(略)

由于只能在PASSIVE_LEVEL下发送PNP IRP,因此不能在DISPATCH_LEVEL下依靠该函数得到配置空间信息。
可以用以下方法在DISPATCH_LEVEL下得到配置空间信息。
在PASSIVE_LEVEL下发送IRP_MN_QUERY_INTERFACE,从PCI总线驱动程序得到可直接调用的接口结构体BUS_INTERFACE_STANDARD,把它存储在不可分页内存块中(通常是在设备扩展中)。
调用SetBusData和GetBusData在DISPATCH_LEVEL下来访问配置空间信息。
PCI总线驱动程序在返回IRP处理前在INTERFACE里保持一个引用计数,因此当不需要该接口时要调用dereference来减少引用计数。
使用以下的函数在PASSIVE_LEVEL下得到BUS_INTERFACE_STANDARD。

代码:(略)


如下使用IoGetDeviceProperty函数和PDO得到总线号,功能号和设备号
DevicePropertyBusNumber得到总线号;
DevicePropertyAddress得到高16位字为设备号,低16位字为功能号。
重要提示:PCI总线号可以是动态的,任何时刻都有可能改变。因此,依靠总线号和这些信息来直接访问PCI端口并不是一个很好的选择,有可能造成系统失败。

水平有限,大家将就啊!


所有心情在零下30度冻结……
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2002-06-09 18:37
faint
没有分。。。 :D
panxi
驱动牛犊
驱动牛犊
  • 注册日期2001-06-09
  • 最后登录2018-05-30
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望101点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-06-10 15:44
我昨天还在WDM中使用HalGetBusData读配置空间了,
无论是编译还是运行都没有问题,!!!

如果你连接有问题,把hal.lib加进去。

我用HalGetBusData得到所有的PCI卡的资源。
很管用的。

caosuricheng
驱动中牛
驱动中牛
  • 注册日期2002-04-16
  • 最后登录2004-09-04
  • 粉丝0
  • 关注0
  • 积分-10分
  • 威望-1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-06-10 16:34
我昨天还在WDM中使用HalGetBusData读配置空间了,
无论是编译还是运行都没有问题,!!!

如果你连接有问题,把hal.lib加进去。

我用HalGetBusData得到所有的PCI卡的资源。
很管用的。

 

me too
我是草肃日成 有人认识我吗?
shushishu
驱动牛犊
驱动牛犊
  • 注册日期2002-05-28
  • 最后登录2002-06-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-06-10 22:25
楼上两位所说的把Hal.Lib加在哪里?能不能详细说明一下?

我用专栏里一篇文章所说的方法已经能够访问配置信息了,很爽,了解了很多WDM的机制。
不过还是想了解一下如何连接这Hal.lib。
所有心情在零下30度冻结……
caosuricheng
驱动中牛
驱动中牛
  • 注册日期2002-04-16
  • 最后登录2004-09-04
  • 粉丝0
  • 关注0
  • 积分-10分
  • 威望-1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-06-11 08:27
楼上两位所说的把Hal.Lib加在哪里?能不能详细说明一下?

我用专栏里一篇文章所说的方法已经能够访问配置信息了,很爽,了解了很多WDM的机制。
不过还是想了解一下如何连接这Hal.lib。

你用的是不是build程序?站上有一个VC6的项目模版补丁,用他很方便,而且程序名最好是.c的,比.cpp省去很多不必要的麻烦。
我是草肃日成 有人认识我吗?
shushishu
驱动牛犊
驱动牛犊
  • 注册日期2002-05-28
  • 最后登录2002-06-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-06-11 11:31
已经找到加入.lib的方法了,就是在sources文件里加入TARGETLIBS宏,感谢几层楼上的几位又帮我学到了很多东西。

caosuricheng你好,用项目模板是很方便,不过如果所有的东西从无到有都自己建立的话,会学得非常快的。刚开始照CHRIS CANT的书上说的那样(其实也是DDK中来的)建立自己的MAKEFILE项目,就学到了很多,都是触类旁通的。今天又在DDK里发现关于BUILD的很多内容,又是一个提高,爽啊!
开始的时候做的很郁闷,现在算是有点看见前面的路了,心也定了不少。
所有心情在零下30度冻结……
游客

返回顶部