terrace
驱动牛犊
驱动牛犊
  • 注册日期2004-02-11
  • 最后登录2005-12-04
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2227回复:8

为什么单单不能使用MmGetPhysicalAddress?

楼主#
更多 发布于:2004-08-05 10:13
我在win2k下用DriverWorks 开发一个小驱动程序,其中我调用了2000ddk中的库函数MmGetPhysicalAddress( ),编译时却发现MmGetPhysicalAddress是一个"undeclared identifier"!
我在“SetDDKGo"中已经设置好编译环境了,而且在VC下编译成功DS的库函数,我把我整个开发环境建立过程说说,请大虾看看有没有漏洞:
1. 安装VC6.0
2. 安装Win2K DDK,安装完后运行Checked Build Enviroment。
3. 安装DriverStudio3.1。安装完后,运行DDK Setting Buildings(SetDDKGo),设置
BASEDIR(其它设置采用默认设置)。
4. 编译DriverWorks库函数。在VC6 IDE中打开vdwlibs.dsw,然后运行batch building。编译成功。
5.新建一个DriverWorks Project,写好驱动后,编译。驱动中要用的DDK中的函数,但编译时却出错。

以上设置中没说明的都没做。是不是哪有漏的?

我又发现更奇怪的,好像DDK中其他的函数都能使用,但就是不能使用MmGetPhysicalAddress,而其它如MmGetMdlByteCount等都能用!

有热心大虾指点,说要加
#include "ntddk.h "
#pragma comment(lib,"ntoskrnl.lib")
我把它们加在“XxxDevice.cpp”文件起始部分,但现在还是那样!

就这么个小问题,困惑我好几天了,现在还没搞定,真是愁死人!所以冒昧再来发帖,希望大虾理解。恳请哪位遇到过类似的问题得大虾救我于水火之中!多少分都给!


terrace
驱动牛犊
驱动牛犊
  • 注册日期2004-02-11
  • 最后登录2005-12-04
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-08-05 18:16
我在用DriverWorks向导生成驱动时,若选用NT4.0 Style,经过以上同样的过程,却没有任何问题,而选WDM模式时,就出现这个问题。
也就是编译环境中WDM模式 NTVERSION='WDM',而NT4.0 Style  NTVERSION=400(这个在project/settings/c++/preprocessor/predefined macros
中可以看到,但若我将WDM模式下的NTVERSION改为400,编译结果却出现更多错,主要是WDM中的类(如KPnpDevice)和函数不识别。
为什么会是这样呢?如何解决这中冲突?各位大虾有没有遇到过这种头痛的问题?
terrace
驱动牛犊
驱动牛犊
  • 注册日期2004-02-11
  • 最后登录2005-12-04
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-08-05 19:28
非常感谢snowstarth大虾和其他大虾的帮助!
在snowstarth大虾的指点下,终于成功解决了这个问题。
前车之鉴,我将他的方法帖出来以供后来者解决类似问题。


自己新建一个头文件mydef.h,在该文件中将MmGetPhysicalAddress的定义帖进去:
NTKERNELAPI
PHYSICAL_ADDRESS
MmGetPhysicalAddress (
    IN PVOID BaseAddress
    );
然后:
1、在调用MmGetPhysicalAddress函数的文件(如.XxxDevice.cpp)中包含mydef.h
2、在setting->link里加入ntoskrnl.lib
3、把ntoskrnl.lib拷贝到驱动的sys目录

呵呵,真是太高兴了,这个小问题愁了我两三天,现在终于搞定!再次感谢!
呵呵,snowstarth大虾,要多少分,你说吧(呵呵,我只有400分),目前只能给20分(也不知怎么搞得,最多只能给20),你要是要,我再随便发帖,你回复,我就给!
游客

返回顶部