Hideman
驱动中牛
驱动中牛
  • 注册日期2001-09-11
  • 最后登录2007-04-16
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
阅读:1956回复:15

WDM驱动程序中添加汇编模块

楼主#
更多 发布于:2002-02-26 16:14
我用98DDK 编制一个win98/2k的驱动程序
我已经有了大块的汇编模块,请哪位不吝赐教,怎样进行编译。
谢谢了。 :)

最新喜欢:

idbeeidbee
Hideman
驱动中牛
驱动中牛
  • 注册日期2001-09-11
  • 最后登录2007-04-16
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-02-26 17:01
再详细一点
汇编程序编译出的OBJ文件,怎样Link到 .sys文件中?
archim
驱动牛犊
驱动牛犊
  • 注册日期2001-08-18
  • 最后登录2006-03-17
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-02-27 10:51
在Project setting->Link->Object/Library module里加上obj文件的文件名应该以了。
archim
Hideman
驱动中牛
驱动中牛
  • 注册日期2001-09-11
  • 最后登录2007-04-16
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-02-27 11:35
谢谢archim!

我编译的是设备驱动程序(wdm)。

98DDK 中的build
怎样用才能将obj文件编译到sys文件中。
Snare
驱动小牛
驱动小牛
  • 注册日期2002-01-31
  • 最后登录2002-08-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-02-27 12:33
修改source文件
我就是我,没什么可说的。
Hideman
驱动中牛
驱动中牛
  • 注册日期2001-09-11
  • 最后登录2007-04-16
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-02-27 12:43
能告知怎样修改吗?
dazzy
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-08-12
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值1点
  • 好评度10点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-02-27 16:04
能告知怎样修改吗?


在sources文件里加入如下:
  i386_SOURCES= yourasm1.asm \\
                yourasm2.asm
                .............

然后,在当前目录下建立一个文件夹,其名为:i386,将所有的asm文件放入此文件夹下(这些文件应该是加入到sources里面的i386_SOURCES后的一些文件)。
Hideman
驱动中牛
驱动中牛
  • 注册日期2001-09-11
  • 最后登录2007-04-16
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-02-27 17:50
我按你所述,好象myfile.asm根本未编译成myfile.obj

在编译中出现
error LNK2001: unresolved external symbol _InitProcArg@0
(InitProcArg是汇编程序中的功能调用)
该怎么办?
dazzy
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-08-12
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值1点
  • 好评度10点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-02-28 10:13
我这么做已经用在好几个driver里了,从没有出现你所说的编译问题,生成的.obj文件在objchk(objfre)\\i386目录下,你能给出你的sources文件吗?如果.obj文件没被生成,你就能看到一条错误信息:NMAKE :  U1073: don\'t know how to make \'objchk\\i386\\addproc.obj\'(addproc.obj 是我的asm文件遍译的.obj文件)。根据你的出错信息,你的.obj已经遍译成功(如果obj文件编译不成功,不会继续给你提示),出错在你的asm文件与调用的c文件。
   根据我的经验,错在你的调用规则,如果你的asm定义为stdcall调用,那么你的在调用此asm的function时,你的调用规则应为stdcall,wdm的调用规则为stdcall.

.386
.model flat,stdcall
.code
initProc proc a:dword,b:dword
............
ret 8
initProc endp  
   end
这是我的asm文件的一个proc的头尾
Hideman
驱动中牛
驱动中牛
  • 注册日期2001-09-11
  • 最后登录2007-04-16
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-02-28 11:51
感谢Dazzy!

我的source文件:

TARGETNAME=Test
TARGETTYPE=DRIVER
DRIVERTYPE=WDM
TARGETPATH=OBJ

INCLUDES=$(BASEDIR)\\inc;
SOURCES=init.cpp \\
dispatch.cpp \\
pnp.cpp \\
Test.rc
i386_SOURCE=hdtest.asm
NTTARGETFILES=PostBuildSteps

hdtest.asm内容
.586p
.387
.model flat, stdcall
option casemap :none
.data
InitProcArgRetnFlag dd 0
.code
InitProcArg proc near
......
InitProcArg endp
END

dispatch.cpp中调用该函数
...
InitProcArg();
...

执行build后,我查遍了整个路径,未发现hetest.obj
编译过程未出现错误信息,但一调用就出现
error LNK2001: unresolved external symbol _InitProcArg@0

顺便问一下,用masm编译出的obj文件,能直接使用吗?
麻烦再帮我看看吧
dazzy
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-08-12
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值1点
  • 好评度10点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-02-28 12:34
感谢Dazzy!

我的source文件:

TARGETNAME=Test
TARGETTYPE=DRIVER
DRIVERTYPE=WDM
TARGETPATH=OBJ

INCLUDES=$(BASEDIR)\\inc;
SOURCES=init.cpp \\
dispatch.cpp \\
pnp.cpp \\
Test.rc
i386_SOURCE=hdtest.asm
NTTARGETFILES=PostBuildSteps

hdtest.asm内容
.586p
.387
.model flat, stdcall
option casemap :none
.data
InitProcArgRetnFlag dd 0
.code
InitProcArg proc near
......
InitProcArg endp
END

dispatch.cpp中调用该函数
...
InitProcArg();
...

执行build后,我查遍了整个路径,未发现hetest.obj
编译过程未出现错误信息,但一调用就出现
error LNK2001: unresolved external symbol _InitProcArg@0

顺便问一下,用masm编译出的obj文件,能直接使用吗?
麻烦再帮我看看吧
 


兄弟,看清楚点,是i386_SOURCES=hdtest.asm,而不是i386_SOURCE=hdtest.asm
Hideman
驱动中牛
驱动中牛
  • 注册日期2001-09-11
  • 最后登录2007-04-16
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-02-28 13:03
确实是看错了!
我已解决问题!
感谢!感谢!
Hideman
驱动中牛
驱动中牛
  • 注册日期2001-09-11
  • 最后登录2007-04-16
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-02-28 13:06
Dazzy 怎么给分?
dazzy
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-08-12
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值1点
  • 好评度10点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-02-28 13:22
Dazzy 怎么给分?

你启的第一个贴子下面的给分按钮即是!
Hideman
驱动中牛
驱动中牛
  • 注册日期2001-09-11
  • 最后登录2007-04-16
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-02-28 13:39
新问题
我在wdm的汇编程序中申请了一块内存
1.该内存在pageble memory or non-pageble memory,若在pageble memory,有无办法使其位于non-pageble memory?
2.该内存怎样能被app读写?
3.我试过了论坛的关于共享内存的例子,我在使用MmGetPhysicalAddress函数时,老出现Link错误(我已将MmGetPhysicalAddress的声明从ntddk.h搬到自己的头文件中,我用的是论坛提供的例程),请指点迷津。
dazzy
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-08-12
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值1点
  • 好评度10点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-02-28 15:26
新问题
我在wdm的汇编程序中申请了一块内存
1.该内存在pageble memory or non-pageble memory,若在pageble memory,有无办法使其位于non-pageble memory?
2.该内存怎样能被app读写?
3.我试过了论坛的关于共享内存的例子,我在使用MmGetPhysicalAddress函数时,老出现Link错误(我已将MmGetPhysicalAddress的声明从ntddk.h搬到自己的头文件中,我用的是论坛提供的例程),请指点迷津。


1.没试过,不知道!
2.论坛有大量的代码。
3.MmGetPhysicalAddress在link时lib为ntoskrnl.lib
  你的sources文件加入一行:
  TARGETLIBS=$(BASEDIR)\\libchk\\$(CPU)\\ntoskrnl.lib
游客

返回顶部