terrace
驱动牛犊
驱动牛犊
  • 注册日期2004-02-11
  • 最后登录2005-12-04
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2221回复: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”文件起始部分,但现在还是那样!

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


arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2004-08-05 12:24
在ntddk.h的,添加#include <ntddk.h>就可以用
而且同时inlcude ntddk.h和wdm.h应该冲突才对
可能是哪没有设置好,没有找到ntddk.h

索性在哪个地方自己声明算了

NTKERNELAPI
PHYSICAL_ADDRESS
MmGetPhysicalAddress (
    IN PVOID BaseAddress
    );
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-08-05 12:55
代码能不能传上来看一看
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地板#
发布于:2004-08-05 14:12
参考我以前的帖子,自己来实现OS的查表转换。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
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)和函数不识别。
为什么会是这样呢?如何解决这中冲突?各位大虾有没有遇到过这种头痛的问题?
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-08-05 19:02
给你发各邮件收一收
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
terrace
驱动牛犊
驱动牛犊
  • 注册日期2004-02-11
  • 最后登录2005-12-04
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于: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),你要是要,我再随便发帖,你回复,我就给!
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-08-05 20:33

哥们,那我就不客气了,哈哈
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
8楼#
发布于:2004-08-06 08:52
就NTDDK。H和WDM。H冲突的问题有什么更好的解决方案????
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
游客

返回顶部