阅读:1863回复:12
紧急求救关于HalGetBusData的问题
在头文件中包含了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的配置空间?有知道的大侠请详细点告诉我好么? |
|
|
沙发#
发布于:2002-06-09 00:06
将ntddk,h改为如下就可以了
#ifdef __cplusplus extern \"C\"{ #endif #include \"ntddk.h\" // main NT include #ifdef __cplusplus }; #endif |
|
板凳#
发布于:2002-06-09 01:38
活着原文间用.c不用.cpp
|
|
|
地板#
发布于:2002-06-09 10:42
我本来的头文件就已经象FOOLISHMAN所说的那样写了的啊!
我再重新写.C文件来试试。还有哪位知道究竟的也多来帮帮忙啊!感谢上面两位,一解决完问题马上给分 。 |
|
|
地下室#
发布于:2002-06-09 11:19
我用了.C文件,还是一样的问题,连接报错,还是HalGetBusData函数。
|
|
|
5楼#
发布于:2002-06-09 16:40
你是NT的driver还是WDM的?
HalGetBusData is obsolete and is exported only to support existing drivers. |
|
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端口并不是一个很好的选择,有可能造成系统失败。 水平有限,大家将就啊! |
|
|
7楼#
发布于:2002-06-09 18:37
faint
没有分。。。 :D |
|
8楼#
发布于:2002-06-10 15:44
我昨天还在WDM中使用HalGetBusData读配置空间了,
无论是编译还是运行都没有问题,!!! 如果你连接有问题,把hal.lib加进去。 我用HalGetBusData得到所有的PCI卡的资源。 很管用的。 |
|
9楼#
发布于:2002-06-10 16:34
我昨天还在WDM中使用HalGetBusData读配置空间了, me too |
|
|
10楼#
发布于:2002-06-10 22:25
楼上两位所说的把Hal.Lib加在哪里?能不能详细说明一下?
我用专栏里一篇文章所说的方法已经能够访问配置信息了,很爽,了解了很多WDM的机制。 不过还是想了解一下如何连接这Hal.lib。 |
|
|
11楼#
发布于:2002-06-11 08:27
楼上两位所说的把Hal.Lib加在哪里?能不能详细说明一下? 你用的是不是build程序?站上有一个VC6的项目模版补丁,用他很方便,而且程序名最好是.c的,比.cpp省去很多不必要的麻烦。 |
|
|
12楼#
发布于:2002-06-11 11:31
已经找到加入.lib的方法了,就是在sources文件里加入TARGETLIBS宏,感谢几层楼上的几位又帮我学到了很多东西。
caosuricheng你好,用项目模板是很方便,不过如果所有的东西从无到有都自己建立的话,会学得非常快的。刚开始照CHRIS CANT的书上说的那样(其实也是DDK中来的)建立自己的MAKEFILE项目,就学到了很多,都是触类旁通的。今天又在DDK里发现关于BUILD的很多内容,又是一个提高,爽啊! 开始的时候做的很郁闷,现在算是有点看见前面的路了,心也定了不少。 |
|
|